{"version":3,"file":"transunion-ui-tablejs.mjs","sources":["../../../projects/tablejs/src/lib/components/horiz-resize-grip/horiz-resize-grip.component.ts","../../../projects/tablejs/src/lib/components/horiz-resize-grip/horiz-resize-grip.component.html","../../../projects/tablejs/src/lib/components/reorder-grip/reorder-grip.component.ts","../../../projects/tablejs/src/lib/components/reorder-grip/reorder-grip.component.html","../../../projects/tablejs/src/lib/components/drag-and-drop-ghost/drag-and-drop-ghost.component.ts","../../../projects/tablejs/src/lib/components/drag-and-drop-ghost/drag-and-drop-ghost.component.html","../../../projects/tablejs/src/lib/shared/classes/tablejs-grid-proxy.ts","../../../projects/tablejs/src/lib/shared/classes/events/column-reorder-event.ts","../../../projects/tablejs/src/lib/shared/classes/events/column-resize-event.ts","../../../projects/tablejs/src/lib/shared/classes/events/grid-event.ts","../../../projects/tablejs/src/lib/services/grid/grid.service.ts","../../../projects/tablejs/src/lib/services/directive-registration/directive-registration.service.ts","../../../projects/tablejs/src/lib/directives/virtual-for/virtual-for.directive.ts","../../../projects/tablejs/src/lib/components/scroll-prev-spacer/scroll-prev-spacer.component.ts","../../../projects/tablejs/src/lib/components/scroll-prev-spacer/scroll-prev-spacer.component.html","../../../projects/tablejs/src/lib/shared/classes/events/scroll-viewport-event.ts","../../../projects/tablejs/src/lib/services/scroll-dispatcher/scroll-dispatcher.service.ts","../../../projects/tablejs/src/lib/services/operating-system/operating-system.service.ts","../../../projects/tablejs/src/lib/directives/scroll-viewport/scroll-viewport.directive.ts","../../../projects/tablejs/src/lib/directives/grid/grid.directive.ts","../../../projects/tablejs/src/lib/directives/grid-row/grid-row.directive.ts","../../../projects/tablejs/src/lib/directives/resizable-grip/resizable-grip.directive.ts","../../../projects/tablejs/src/lib/directives/infinite-scroll/infinite-scroll.directive.ts","../../../projects/tablejs/src/lib/components/grid/grid.component.ts","../../../projects/tablejs/src/lib/components/grid/grid.component.html","../../../projects/tablejs/src/lib/directives/editable-cell/editable-cell.directive.ts","../../../projects/tablejs/src/lib/directives/reorder-grip/reorder-grip.directive.ts","../../../projects/tablejs/src/lib/directives/reorder-col/reorder-col.directive.ts","../../../projects/tablejs/src/lib/directives/data-col-classes/data-col-classes.directive.ts","../../../projects/tablejs/src/lib/directives/data-col-class/data-col-class.directive.ts","../../../projects/tablejs/src/lib/directives/hide-column-if/hide-column-if.directive.ts","../../../projects/tablejs/src/lib/tablejs.module.ts","../../../projects/tablejs/src/lib/filterAndSort/comparators/comparator.ts","../../../projects/tablejs/src/lib/filterAndSort/options/sort-direction.ts","../../../projects/tablejs/src/lib/filterAndSort/services/filter-sort.service.ts","../../../projects/tablejs/src/lib/filterAndSort/options/sort-options.ts","../../../projects/tablejs/src/lib/filterAndSort/comparators/match-type.ts","../../../projects/tablejs/src/lib/filterAndSort/options/filter-options.ts","../../../projects/tablejs/src/lib/filterAndSort/comparators/sort-comparator.ts","../../../projects/tablejs/src/lib/filterAndSort/comparators/filter-comparator.ts","../../../projects/tablejs/src/lib/filterAndSort/filter-and-sort.module.ts","../../../projects/tablejs/src/lib/shared/classes/scrolling/range.ts","../../../projects/tablejs/src/public-api.ts","../../../projects/tablejs/src/transunion-ui-tablejs.ts"],"sourcesContent":["import { Component, OnInit, ViewEncapsulation } from '@angular/core';\n\n@Component({\n  selector: 'tablejs-horiz-resize-grip',\n  templateUrl: './horiz-resize-grip.component.html',\n  styleUrls: ['./horiz-resize-grip.component.scss'],\n  host: { class: 'resize-grip' },\n  encapsulation: ViewEncapsulation.None\n})\nexport class HorizResizeGripComponent {\n\n  constructor() { }\n\n}\n","<i class=\"fas fa-angle-left fa-xs\"></i><i class=\"fas fa-angle-right fa-xs\"></i>","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\n\n@Component({\n  selector: 'tablejs-reorder-grip',\n  templateUrl: './reorder-grip.component.html',\n  styleUrls: ['./reorder-grip.component.scss'],\n  host: { class: 'col-dots-container' },\n  encapsulation: ViewEncapsulation.None\n})\nexport class ReorderGripComponent {\n\n  constructor() { }\n\n}\n","<span class=\"dots-3\"></span>\n<span class=\"dots-3\"></span>\n<span class=\"dots-3\"></span>\n<span class=\"dots-3\"></span>","import { AfterViewInit, ChangeDetectorRef, Component, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core';\n\n@Component({\n  selector: 'tablejs-drag-and-drop-ghost',\n  templateUrl: './drag-and-drop-ghost.component.html',\n  styleUrls: ['./drag-and-drop-ghost.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  host: { class: 'drag-and-drop-ghost' }\n})\nexport class DragAndDropGhostComponent implements AfterViewInit {\n\n  @ViewChild('ref', {read: ViewContainerRef}) public ref: any;\n  public left: number = 0;\n  public top: number = 0;\n  private _templateToLoad: TemplateRef<any>;\n  private _contextToLoad: object | null = null;\n\n  constructor(public viewContainerRef: ViewContainerRef, public cdr: ChangeDetectorRef) { }\n\n  ngAfterViewInit(): void {\n    this.ref.clear();\n    if (this._templateToLoad) {\n      this.ref.createEmbeddedView(this._templateToLoad, this._contextToLoad);\n      this.cdr.detectChanges();\n    }\n  }\n\n  public updateView(template: TemplateRef<any>, context: object | null = null): void {\n    this._templateToLoad = template;\n    this._contextToLoad = context;\n  }\n\n  getTransform(): string {\n    return 'translate(' + this.left + 'px, ' + this.top + 'px';\n  }\n\n}\n","<div class=\"drag-and-drop-ghost\" [ngStyle]=\"{ 'transform': getTransform() }\">\n    <div #ref style=\"display: none;\"></div>\n</div>\n","export class TablejsGridProxy {\n  static GRID_COUNT = 0;\n  constructor() {\n  }\n}\n","import { IColumnReorderEvent } from './../../interfaces/events/i-column-reorder-event';\n\nexport class ColumnReorderEvent implements IColumnReorderEvent {\n\n  public static readonly ON_REORDER: string = 'onReorder';\n  public static readonly ON_REORDER_START: string = 'onReorderStart';\n  public static readonly ON_REORDER_END: string = 'onReorderEnd';\n\n  public pointerEvent: any;\n  public columnDragged: Element;\n  public columnHovered: Element;\n  public type: string;\n\n  constructor() {}\n}\n","import { IColumnResizeEvent } from './../../interfaces/events/i-column-resize-event';\n\nexport class ColumnResizeEvent implements IColumnResizeEvent {\n\n  public static readonly ON_RESIZE: string = 'onResize';\n  public static readonly ON_RESIZE_START: string = 'onResizeStart';\n  public static readonly ON_RESIZE_END: string = 'onResizeEnd';\n\n  public pointerEvent: any;\n  public columnWidth: number;\n  public columnMinWidth: number;\n  public classesBeingResized: string[];\n  public type?: string;\n}\n","import { IGridEvent } from './../../interfaces/events/i-grid-event';\n\nexport class GridEvent implements IGridEvent {\n\n  public static readonly ON_INITIALIZED: string = 'onInitialized';\n\n  public gridComponent: any;\n  public gridElement: HTMLElement;\n  public type: string;\n}\n","import { Injectable } from '@angular/core';\nimport { IColumnData } from './../../shared/interfaces/i-column-data';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class GridService {\n\n  public linkedDirectiveObjs: any = {};\n  public containsInitialWidthSettings: BehaviorSubject<boolean | undefined> = new BehaviorSubject<boolean | undefined>(undefined);\n\n  constructor() { }\n\n  getParentTablejsGridDirective(el: HTMLElement | null): HTMLElement | null {\n    while (el !== null && el.getAttribute('tablejsGrid') === null) {\n      el = el.parentElement;\n    }\n    return el;\n  }\n\n  triggerHasInitialWidths(hasWidths: boolean): void {\n    this.containsInitialWidthSettings.next(hasWidths);\n  }\n}\n\ninterface ILinkedGrid {\n  classWidths: number[];\n  stylesByClass: any[];\n  widthStyle: HTMLStyleElement;\n  widthStyleFragment: DocumentFragment;\n  reorderHighlightStyle: HTMLStyleElement;\n  reorderHighlightStyleFragment: DocumentFragment;\n  subGroupStyles: HTMLStyleElement[];\n  subGroupFragments: DocumentFragment[];\n  subGroupStyleObjs: any;\n  gridOrder: number[];\n  gridOrderStyles: HTMLStyleElement[];\n  gridOrderFragments: DocumentFragment[];\n  colDataGroups: IColumnData[][];\n}\n","import { Injectable } from '@angular/core';\nimport { GridService } from './../grid/grid.service';\nimport { ScrollViewportDirective } from './../../directives/scroll-viewport/scroll-viewport.directive';\nimport { VirtualForDirective } from './../../directives/virtual-for/virtual-for.directive';\nimport { IVirtualNexus } from './../../shared/interfaces/i-virtual-nexus';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class DirectiveRegistrationService {\n\n  constructor(public gridService: GridService) { }\n\n  private nexuses: IVirtualNexus[] = [];\n\n  public setVirtualNexus(virtualForDirective: VirtualForDirective<any, any>, scrollViewportDirective: ScrollViewportDirective): IVirtualNexus {\n    const nexus: IVirtualNexus = {\n      scrollViewportDirective,\n      virtualForDirective\n    };\n    this.nexuses.push(nexus);\n    return nexus;\n  }\n\n  public clearVirtualNexus(nexus: IVirtualNexus): void {\n    if (!nexus) {\n      return;\n    }\n    nexus.scrollViewportDirective = null;\n    nexus.virtualForDirective = null;\n    const index: number = this.nexuses.indexOf(nexus);\n    if (index === -1) {\n      return;\n    }\n    this.nexuses.splice(index, 1);\n    \n  }\n\n  public getVirtualNexusFromViewport(scrollViewportDirective: ScrollViewportDirective): IVirtualNexus {\n    return this.nexuses.filter((nexus: IVirtualNexus) => nexus.scrollViewportDirective === scrollViewportDirective)[0];\n  }\n\n  public registerNodeAttributes(node: any) {\n    if (node.getAttribute) {\n      if (node.getAttribute('reordergrip') !== null) {\n        this.registerReorderGripOnGridDirective(node, true);\n      }\n      if (node.getAttribute('resizablegrip') !== null) {\n        this.registerResizableGripOnGridDirective(node, true);\n      }\n      if (node.getAttribute('tablejsDataColClasses') !== null) {\n        this.registerDataColClassesOnGridDirective(node, true);\n      }\n      if (node.getAttribute('tablejsDataColClass') !== null) {\n        this.registerDataColClassOnGridDirective(node, true);\n      }\n      if (node.getAttribute('tablejsGridRow') !== null) {\n        this.registerRowsOnGridDirective(node, true);\n      }\n    }\n  }\n\n  public registerReorderGripOnGridDirective(node: HTMLElement, fromMutation: boolean = false) {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(node);\n    if (el !== null) {\n      el['gridDirective'].addReorderGrip(node, fromMutation);\n    }\n  }\n\n  public registerResizableGripOnGridDirective(node: HTMLElement, fromMutation: boolean = false) {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(node);\n    if (el !== null) {\n      el['gridDirective'].addResizableGrip(node, fromMutation);\n    }\n  }\n\n  public registerDataColClassesOnGridDirective(node: HTMLElement, fromMutation: boolean = false) {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(node);\n    (node as any).dataClasses = node.getAttribute('tablejsdatacolclasses')!.replace(new RegExp(' ', 'g'), '').split(',');\n    el['gridDirective'].addColumnsWithDataClasses(node, fromMutation);\n  }\n\n  public registerDataColClassOnGridDirective(node: HTMLElement, fromMutation: boolean = false) {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(node);\n    if (!el) {\n      return;\n    }\n    const cls: string | any | null = node.getAttribute('tablejsDataColClass');\n    if (cls) {\n      node.classList.add(cls);\n    }\n    const initialWidth = node.getAttribute('initialWidth');\n    this.gridService.triggerHasInitialWidths(initialWidth ? true : false);\n    el['gridDirective'].initialWidths[cls] = initialWidth;\n  }\n\n  public registerRowsOnGridDirective(node: HTMLElement, fromMutation: boolean = false) {\n    node.classList.add('reorderable-table-row');\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(node);\n    if (el !== null) {\n      el['gridDirective'].addRow(node, fromMutation);\n    }\n  }\n\n  public registerViewportOnGridDirective(node: HTMLElement): void {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(node);\n    if (el !== null) {\n      el['gridDirective'].infiniteScrollViewports = [node];\n    }\n  }\n}\n","\nimport { Directive, DoCheck, ElementRef, Input, IterableChanges, IterableDiffer, IterableDiffers, NgIterable, OnDestroy, TemplateRef, TrackByFunction, ViewContainerRef} from '@angular/core';\nimport { DirectiveRegistrationService } from './../../services/directive-registration/directive-registration.service';\nimport { IVirtualNexus } from './../../shared/interfaces/i-virtual-nexus';\nimport { Subject, Subscription } from 'rxjs';\nimport { ScrollViewportDirective } from './../scroll-viewport/scroll-viewport.directive';\nimport { Range } from './../../shared/classes/scrolling/range';\n\nexport class TablejsForOfContext<T, U extends NgIterable<T> = NgIterable<T>> {\n  constructor(public $implicit: T, public tablejsVirtualForOf: U, public index: number, public count: number) {}\n\n  get first(): boolean {\n    return this.index === 0;\n  }\n\n  get last(): boolean {\n    return this.index === this.count - 1;\n  }\n\n  get even(): boolean {\n    return this.index % 2 === 0;\n  }\n\n  get odd(): boolean {\n    return !this.even;\n  }\n}\n\n@Directive({selector: '[tablejsVirtualFor][tablejsVirtualForOf]'})\nexport class VirtualForDirective<T, U extends NgIterable<T> = NgIterable<T>> implements DoCheck, OnDestroy {\n\n  public virtualNexus: IVirtualNexus | null;\n  public changes: Subject<any> = new Subject<any>();\n  public rangeUpdatedSubscription$: Subscription;\n\n  @Input()\n  set tablejsVirtualForOf(tablejsVirtualForOf: U|undefined|null) {\n    this._tablejsForOf = tablejsVirtualForOf;\n    this._onRenderedDataChange();\n  }\n\n  public _tablejsForOf: U|undefined|null = null;\n  private _lastTablejsForOf: U|undefined|null;\n  private _differ: IterableDiffer<T>|null = null;\n  private _tablejsVirtualForTrackBy: TrackByFunction<T> | undefined | null;\n  private _scrollViewportDirective: ScrollViewportDirective | undefined | null;\n  private _lastRange: Range;\n  private _renderedItems: any[];\n  private _parent: HTMLElement | undefined | null;\n  /**\n   * Asserts the correct type of the context for the template that `TablejsForOf` will render.\n   *\n   * The presence of this method is a signal to the Ivy template type-check compiler that the\n   * `TablejsForOf` structural directive renders its template with a specific context type.\n   */\n  static ngTemplateContextGuard<T, U extends NgIterable<T>>(dir: VirtualForDirective<T, U>, ctx: any):\n      ctx is TablejsForOfContext<T, U> {\n    return true;\n  }\n\n  /**\n   * A reference to the template that is stamped out for each item in the iterable.\n   * @see [template reference variable](guide/template-reference-variables)\n   */\n  @Input()\n  set tablejsVirtualForTemplate(value: TemplateRef<TablejsForOfContext<T, U>>) {\n    if (value) {\n      this._template = value;\n    }\n  }\n\n  public get template(): TemplateRef<TablejsForOfContext<T, U>> {\n    return this._template as TemplateRef<TablejsForOfContext<T, U>>;\n  }\n\n  @Input()\n  get tablejsVirtualForTrackBy(): TrackByFunction<T> | undefined | null {\n    return this._tablejsVirtualForTrackBy;\n  }\n  set tablejsVirtualForTrackBy(fn: TrackByFunction<T> | undefined | null) {\n    this._tablejsVirtualForTrackBy = fn ?\n        (index, item) => fn(index + (this._lastRange ? this._lastRange.extendedStartIndex! : 0), item) :\n        undefined;\n\n    this._onRenderedDataChange();\n  }\n\n  constructor(\n      public _viewContainer: ViewContainerRef,\n      public _template: TemplateRef<TablejsForOfContext<T, U>> | null,\n      private _differs: IterableDiffers,\n      private elementRef: ElementRef,\n      private directiveRegistrationService: DirectiveRegistrationService) {\n        \n        this._parent = this._viewContainer.element.nativeElement.parentElement;\n\n        while (this._parent !== null && this._parent !== undefined && (this._parent as any).scrollViewportDirective === undefined) {\n          this._parent = this._parent.parentElement;\n        }\n        if (this._parent === null || this._parent === undefined) {\n          throw Error('No scrollViewportDirective found for tablejsForOf.  Declare a scrollViewport using the scrollViewportDirective.');\n        } else {\n          \n          this._scrollViewportDirective = (this._parent as any).scrollViewportDirective;\n          this.directiveRegistrationService.setVirtualNexus(this, this._scrollViewportDirective!);\n          \n          this._lastRange = this._scrollViewportDirective!.range;\n\n          this.rangeUpdatedSubscription$ = this._scrollViewportDirective!.rangeUpdated.subscribe(rangeObj => {\n            if (this.rangeIsDifferent(this._lastRange, rangeObj.range)) {\n              this._lastRange = rangeObj.range;\n              this._renderedItems = Array.from(this._tablejsForOf as Iterable<any>).slice(this._lastRange.extendedStartIndex!, this._lastRange.extendedEndIndex!);\n              this._onRenderedDataChange(false);\n            }\n          });\n        }\n      }\n\n  rangeIsDifferent(range1: Range, range2: Range): boolean {\n    return range1.endIndex === range2.endIndex && range1.extendedEndIndex === range2.extendedEndIndex && range1.startIndex === range2.startIndex && range1.extendedStartIndex === range2.extendedStartIndex;\n  }\n\n  renderedItemsNeedUpdate(): boolean {\n    return this._renderedItems.length !== this._lastRange.extendedEndIndex! - this._lastRange.extendedStartIndex!;\n  }\n\n  private _onRenderedDataChange(updateRenderedItems: boolean = true) {\n    if (!this._renderedItems) {\n      return;\n    }\n    if (updateRenderedItems) {\n      this._renderedItems = Array.from(this._tablejsForOf as Iterable<any>).slice(this._lastRange.extendedStartIndex!, this._lastRange.extendedEndIndex!);\n    }\n    if (!this._differ) {\n      this._differ = this._differs.find(this._renderedItems).create((index, item) => {\n        return this.tablejsVirtualForTrackBy ? this.tablejsVirtualForTrackBy(index, item) : item;\n      });\n    }\n  }\n\n  ngDoCheck() {\n   this.updateItems();\n  }\n\n  updateItems(): void {\n    if (this._differ) {\n      const scrollToOrigin = this._tablejsForOf !== this._lastTablejsForOf;\n      let diffChanges: IterableChanges<any> | null = null;\n\n      if (this.renderedItemsNeedUpdate()) {\n        this._onRenderedDataChange();\n      }\n\n      try {\n        diffChanges = this._differ.diff(this._renderedItems);\n      } catch {\n        this._differ = this._differs.find(this._renderedItems).create((index, item) => {\n          return this.tablejsVirtualForTrackBy ? this.tablejsVirtualForTrackBy(index, item) : item;\n        });\n      }\n\n      if (scrollToOrigin) {\n        this._lastTablejsForOf = this._tablejsForOf;\n      }\n      if (diffChanges || scrollToOrigin) {\n        this.changes.next({ tablejsForOf: this._tablejsForOf, scrollToOrigin });\n      }\n    }\n  }\n\n  ngOnDestroy(): void {\n    this._lastTablejsForOf = null;\n    this._tablejsForOf = null;\n    this._differ = null;\n    this._scrollViewportDirective = null;\n    this._renderedItems = [];\n    this._template = null;\n    this._tablejsVirtualForTrackBy = null;\n    if (this._parent) {\n      (this._parent as any).scrollViewportDirective = null;\n      this._parent = null;\n    }   \n\n    if (this.rangeUpdatedSubscription$) {\n      this.rangeUpdatedSubscription$.unsubscribe();\n    }\n    \n  }\n}\n","import { Component, ElementRef, OnDestroy, ViewChild } from '@angular/core';\n\n@Component({\n  selector: 'tablejs-scroll-prev-spacer',\n  templateUrl: './scroll-prev-spacer.component.html',\n  styleUrls: ['./scroll-prev-spacer.component.scss']\n})\nexport class ScrollPrevSpacerComponent implements OnDestroy {\n\n  @ViewChild('template', {static: true}) public template: any;\n  constructor(public elementRef: ElementRef) { }\n\n  ngOnDestroy(): void {\n    this.template = null;\n  }\n\n}\n","\n<ng-template #template>\n    <tr tablejsPrevSpacer style=\"display: block; position: relative;\"></tr>\n</ng-template>\n","export class ScrollViewportEvent {\n  public static readonly ON_ITEM_ADDED: string = 'onItemAdded';\n  public static readonly ON_ITEM_REMOVED: string = 'onItemRemoved';\n  public static readonly ON_ITEM_UPDATED: string = 'onItemUpdated';\n  public static readonly ON_RANGE_UPDATED: string = 'onRangeUpdated';\n  public static readonly ON_VIEWPORT_SCROLLED: string = 'onViewportScrolled';\n  public static readonly ON_VIEWPORT_READY: string = 'onViewportReady';\n  public static readonly ON_VIEWPORT_INITIALIZED: string = 'onViewportInitialized';\n}\n","import { EventEmitter, Injectable } from '@angular/core';\nimport { ScrollViewportEvent } from './../../shared/classes/events/scroll-viewport-event';\nimport { Range } from './../../shared/classes/scrolling/range';\nimport { ScrollViewportDirective } from './../../directives/scroll-viewport/scroll-viewport.directive';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ScrollDispatcherService {\n\n  constructor() { }\n\n  public dispatchAddItemEvents(eventEmitter: EventEmitter<any>, element: Node, i: number, viewport: ScrollViewportDirective, viewportElement: HTMLElement): void {\n    eventEmitter.emit({\n      element,\n      index: i,\n      viewport,\n      viewportElement\n    });\n    const itemAddedEvent = new CustomEvent(ScrollViewportEvent.ON_ITEM_ADDED, {\n      detail: {\n        element,\n        index: i,\n        viewport,\n        viewportElement\n      }\n    });\n    viewportElement.dispatchEvent(itemAddedEvent);\n  }\n\n  public dispatchUpdateItemEvents(eventEmitter: EventEmitter<any>, element: Node, index: number, viewport: ScrollViewportDirective, viewportElement: HTMLElement): void {\n    eventEmitter.emit({\n      element,\n      index,\n      viewport,\n      viewportElement\n    });\n    const itemUpdatedEvent = new CustomEvent(ScrollViewportEvent.ON_ITEM_UPDATED, {\n      detail: {\n        element,\n        index,\n        viewport,\n        viewportElement\n      }\n    });\n    viewportElement.dispatchEvent(itemUpdatedEvent);\n  }\n\n  public dispatchRemoveItemEvents(eventEmitter: EventEmitter<any>, element: Node, i: number, viewport: ScrollViewportDirective, viewportElement: HTMLElement): void {\n    eventEmitter.emit({\n      element,\n      index: i,\n      viewport,\n      viewportElement\n    });\n    const itemRemovedEvent = new CustomEvent(ScrollViewportEvent.ON_ITEM_REMOVED, {\n      detail: {\n        element,\n        index: i,\n        viewport,\n        viewportElement\n      }\n    });\n    viewportElement.dispatchEvent(itemRemovedEvent);\n  }\n\n  public dispatchViewportReadyEvents(eventEmitter: EventEmitter<any>, viewport: ScrollViewportDirective, viewportElement: HTMLElement) {\n    eventEmitter.emit({\n      viewport,\n      viewportElement\n    });\n    const viewportReadyEvent = new CustomEvent(ScrollViewportEvent.ON_VIEWPORT_READY, {\n      detail: {\n        viewport,\n        viewportElement\n      }\n    });\n    viewportElement.dispatchEvent(viewportReadyEvent);\n  }\n\n  public dispatchViewportInitializedEvents(eventEmitter: EventEmitter<any>, viewport: ScrollViewportDirective, viewportElement: HTMLElement) {\n    eventEmitter.emit({\n      viewport,\n      viewportElement\n    });\n    const viewportInitializedEvent = new CustomEvent(ScrollViewportEvent.ON_VIEWPORT_INITIALIZED, {\n      detail: {\n        viewport,\n        viewportElement\n      }\n    });\n    viewportElement.dispatchEvent(viewportInitializedEvent);\n  }\n\n  public dispatchRangeUpdateEvents(eventEmitter: EventEmitter<any>, range: Range, viewport: ScrollViewportDirective, viewportElement: HTMLElement) {\n    eventEmitter.emit({\n      range,\n      viewport,\n      viewportElement\n    });\n    const rangeUpdatedEvent = new CustomEvent(ScrollViewportEvent.ON_ITEM_ADDED, {\n      detail: {\n        range,\n        viewport,\n        viewportElement\n      }\n    });\n    viewportElement.dispatchEvent(rangeUpdatedEvent);\n  }\n\n  public dispatchViewportScrolledEvents(eventEmitter: EventEmitter<any>, scrollTop: number, overflow: number, viewport: ScrollViewportDirective, viewportElement: HTMLElement) {\n    eventEmitter.emit({\n      scrollTop,\n      firstItemOverflow: overflow,\n      viewport,\n      viewportElement\n    });\n    const viewportScrolledEvent = new CustomEvent(ScrollViewportEvent.ON_ITEM_ADDED, {\n      detail: {\n        scrollTop,\n        firstItemOverflow: overflow,\n        viewport,\n        viewportElement\n      }\n    });\n    viewportElement.dispatchEvent(viewportScrolledEvent);\n  }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class OperatingSystemService {\n\n  constructor() { }\n\n  getOS() {\n    const userAgent = window.navigator.userAgent;\n    const platform = window.navigator.platform;\n    const macosPlatforms: any[] = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n    const windowsPlatforms: any[] = ['Win32', 'Win64', 'Windows', 'WinCE'];\n    const iosPlatforms: any[] = ['iPhone', 'iPad', 'iPod'];\n    let os: string | null = null;\n\n    if (macosPlatforms.indexOf(platform) !== -1) {\n      os = 'Mac OS';\n    } else if (iosPlatforms.indexOf(platform) !== -1) {\n      os = 'iOS';\n    } else if (windowsPlatforms.indexOf(platform) !== -1) {\n      os = 'Windows';\n    } else if (/Android/.test(userAgent)) {\n      os = 'Android';\n    } else if (!os && /Linux/.test(platform)) {\n      os = 'Linux';\n    }\n\n    return os;\n  }\n\n  isMac(): boolean {\n    return this.getOS() === 'Mac OS' || this.getOS() === 'iOS';\n  }\n  isPC(): boolean {\n    return this.getOS() === 'Windows';\n  }\n}\n","import { AfterViewInit, Directive, ChangeDetectorRef, ContentChild,\n  ElementRef, EmbeddedViewRef, EventEmitter, Inject, Input, OnInit, Output, TemplateRef, ViewRef, OnDestroy, Renderer2, RendererFactory2} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { GridService } from './../../services/grid/grid.service';\nimport { DirectiveRegistrationService } from './../../services/directive-registration/directive-registration.service';\nimport { Range } from './../../shared/classes/scrolling/range';\nimport { IScrollOptions } from './../../shared/interfaces/scrolling/i-scroll-options';\nimport { ScrollDispatcherService } from './../../services/scroll-dispatcher/scroll-dispatcher.service';\nimport { GridDirective } from './../../directives/grid/grid.directive';\nimport { TablejsForOfContext } from './../../directives/virtual-for/virtual-for.directive';\nimport { IVirtualNexus } from './../../shared/interfaces/i-virtual-nexus';\nimport { OperatingSystemService } from './../../services/operating-system/operating-system.service';\nimport { ScrollPrevSpacerComponent } from '../../components/scroll-prev-spacer/scroll-prev-spacer.component';\nimport { Subscription, take } from 'rxjs';\n\n@Directive({\n  selector: '[tablejsScrollViewport], [tablejsscrollviewport], [tablejs-scroll-viewport]',\n  host: { style: 'contain: content;'}\n})\nexport class ScrollViewportDirective implements AfterViewInit, OnDestroy, OnInit {\n\n  @ContentChild('templateRef', { static: true }) public templateRef: TemplateRef<any> | null = null;\n\n  @Input() templateID: string | null = '';\n  @Input() generateCloneMethod: ((template: HTMLElement, items: any[], index: number) => Node) | null = null;\n  private _arrowUpSpeed: string | number = 1;\n  get arrowUpSpeed(): string | number {\n      return Number(this._arrowUpSpeed);\n  }\n  @Input() set arrowUpSpeed(value: string | number) {\n      this._arrowUpSpeed = Number(value);\n  }\n\n  private _arrowDownSpeed: string | number = 1;\n  get arrowDownSpeed(): string | number {\n      return Number(this._arrowDownSpeed);\n  }\n  @Input() set arrowDownSpeed(value: string | number) {\n      this._arrowDownSpeed = Number(value);\n  }\n\n  private _preItemOverflow: string | number = 1;\n  get preItemOverflow(): string | number {\n      return Number(this._preItemOverflow);\n  }\n  @Input() set preItemOverflow(value: string | number) {\n      this._preItemOverflow = Number(value);\n  }\n\n  private _postItemOverflow: string | number = 1;\n  get postItemOverflow(): string | number {\n      return Number(this._postItemOverflow);\n  }\n  @Input() set postItemOverflow(value: string | number) {\n      this._postItemOverflow = Number(value);\n  }\n\n  private _itemLoadLimit: string | number = Infinity;\n  get itemLoadLimit(): string | number {\n      return Number(this._itemLoadLimit);\n  }\n  @Input() set itemLoadLimit(value: string | number) {\n      this._itemLoadLimit = Number(value);\n  }\n\n  public timeoutID: any;\n\n  items: any[] | null = null;\n\n  // Custom Elements Inputs\n  @Input() templateid: string | null = null;\n  @Input() preitemoverflow: number = 1;\n  @Input() postitemoverflow: number = 1;\n  @Input() arrowupspeed: number = 1;\n  @Input() arrowdownspeed: number = 1;\n  @Input() itemloadlimit: number = Infinity;\n  @Input() fillViewportScrolling: any;\n\n  @Output() itemAdded: EventEmitter<any> = new EventEmitter<any>();\n  @Output() itemRemoved: EventEmitter<any> = new EventEmitter<any>();\n  @Output() itemUpdated: EventEmitter<any> = new EventEmitter<any>();\n  @Output() rangeUpdated: EventEmitter<any> = new EventEmitter<any>();\n  @Output() viewportScrolled: EventEmitter<any> = new EventEmitter<any>();\n  @Output() viewportReady: EventEmitter<any> = new EventEmitter<any>();\n  @Output() viewportInitialized: EventEmitter<any> = new EventEmitter<any>();\n\n  private containerHeight: number | null = null;\n  private heightLookup: any = {};\n  private itemVisibilityLookup: any = {};\n  public listElm: HTMLElement | null = null;\n  public listContent: HTMLElement | null = null;\n  public prevSpacer: HTMLElement | null = null;\n  public postSpacer: HTMLElement | null = null;\n  public gridDirective: GridDirective | null = null;\n  public virtualForChangesSubscription$: Subscription;\n  public preGridInitializeSubscription$: Subscription;\n  public pauseViewportRenderUpdates: boolean = false;\n\n  public range: Range = { startIndex: 0, endIndex: 1, extendedStartIndex: 0, extendedEndIndex: 1 };\n  public lastRange: Range = { startIndex: this.range.startIndex, endIndex: this.range.endIndex, extendedStartIndex: this.range.extendedStartIndex, extendedEndIndex: this.range.extendedEndIndex };\n  public lastScrollTop: number = 0;\n  public currentScrollTop: number = 0;\n  public currentScrollChange: number = 0;\n  public template: HTMLElement | null = null;\n  private estimatedFullContentHeight: number = 0;\n  private estimatedPreListHeight: number = 0;\n  private estimatedPostListHeight: number = 0;\n  private totalItemsCounted: number = 0;\n  private totalHeightCount: number = 0;\n  private itemName: string = '';\n  private avgItemHeight: number | undefined;\n  private overflowHeightCount: number = 0;\n  public scrollChangeByFirstIndexedItem: number = 0;\n  private lastVisibleItemHeight: number = Infinity;\n  private adjustedStartIndex: number | null = null;\n  private forcedEndIndex: number | undefined = undefined;\n  private placeholderObject: any = {};\n\n  private postItemOverflowCount: number = -1;\n  private preItemOverflowCount: number = -1;\n  private lastVisibleItemOverflow: number = 0;\n  private preOverflowHeight: number = 0;\n  private mouseIsOverViewport: boolean = false;\n  private lastHeight: number = 0;\n\n  private observer: MutationObserver | null = null;\n  private handleMouseOver: Function | null = null;\n  private handleMouseOut: Function | null = null;\n  private handleKeyDown: ((e: KeyboardEvent) => void) | null = null;\n  private handleListContentScroll: ((this: HTMLElement, e: Event) => void) | undefined | null;\n  private cloneFromTemplateRef: boolean = false;\n  private viewportHasScrolled: boolean = false;\n  private templateContext: TablejsForOfContext<any, any> | null = null;\n\n  public virtualNexus: IVirtualNexus | null = null;\n\n  private _cloneMethod: ((template: HTMLElement, items: any[], index: number) => Node) | null = null;\n  private renderer: Renderer2;\n\n  constructor(\n    public elementRef: ElementRef,\n    public gridService: GridService,\n    @Inject(DOCUMENT) private document: any,\n    private directiveRegistrationService: DirectiveRegistrationService,\n    private scrollDispatcherService: ScrollDispatcherService,\n    private operatingSystem: OperatingSystemService,\n    private cdr: ChangeDetectorRef | null,\n    private rendererFactory: RendererFactory2\n  ) {\n    this.renderer = this.rendererFactory.createRenderer(null, null);\n    this.elementRef.nativeElement.scrollViewportDirective = this;\n  }\n\n  public handleScroll(e: Event) {\n\n    e.preventDefault();\n\n    this.currentScrollTop = this.listContent!.scrollTop;\n    this.currentScrollChange = this.currentScrollTop - this.lastScrollTop;\n    this.scrollChangeByFirstIndexedItem += this.currentScrollChange;\n    this.lastVisibleItemOverflow -= this.currentScrollChange;\n\n    const newRange = this.getRangeChange(this.scrollChangeByFirstIndexedItem);\n    this.updateScrollFromRange(newRange);\n\n    this.scrollDispatcherService.dispatchViewportScrolledEvents(this.viewportScrolled, this.lastScrollTop, this.scrollChangeByFirstIndexedItem, this, this.elementRef.nativeElement);\n\n  }\n\n  private registerViewportToElement() {\n    this.elementRef.nativeElement.scrollViewport = this;\n  }\n\n  private attachMutationObserver(): void {\n    const ths: any = this;\n    this.observer = new MutationObserver((mutations: MutationRecord[]) => {\n      mutations.forEach((mutation: MutationRecord) => {\n        ths.updateMutations(mutation);\n      });\n    });\n\n    this.observer.observe(this.listContent!, {\n      // configure it to listen to attribute changes\n      attributes: true,\n      subtree: true,\n      childList: true\n    });\n  }\n\n  private updateMutations(mutation: MutationRecord): void {\n    if (mutation.type === 'childList') {\n      const addedNodes = Array.from(mutation.addedNodes);\n      addedNodes.forEach(node => {\n        this.directiveRegistrationService.registerNodeAttributes(node);\n        this.getChildNodes(node);\n      });\n    }\n  }\n\n  private getChildNodes(node: Node) {\n    node.childNodes.forEach(childNode => {\n      this.directiveRegistrationService.registerNodeAttributes(childNode);\n      if (childNode.childNodes) {\n        this.getChildNodes(childNode);\n      }\n    });\n  }\n\n  public registerCustomElementsInputs(viewport: HTMLElement) {\n    this.templateID = viewport.getAttribute('templateID');\n    this.preItemOverflow = Number(viewport.getAttribute('preItemOverflow'));\n    this.postItemOverflow = Number(viewport.getAttribute('postItemOverflow'));\n    this.itemLoadLimit = Number(viewport.getAttribute('itemLoadLimit'));\n    this.arrowUpSpeed = Number(viewport.getAttribute('arrowUpSpeed'));\n    this.arrowDownSpeed = Number(viewport.getAttribute('arrowDownSpeed'));\n    this.fillViewportScrolling = viewport.getAttribute('fillViewportScrolling');\n  }\n\n  private convertCustomElementsVariables() {\n    if (this.templateid) {\n      this.templateID = this.templateid;\n    }\n    if (this.preitemoverflow) {\n      this.preItemOverflow = Number(this.preitemoverflow);\n    }\n    if (this.postitemoverflow) {\n      this.postItemOverflow = Number(this.postitemoverflow);\n    }\n    if (this.arrowdownspeed) {\n      this.arrowDownSpeed = Number(this.arrowdownspeed);\n    }\n    if (this.arrowupspeed) {\n      this.arrowUpSpeed = Number(this.arrowupspeed);\n    }\n    if (this.itemloadlimit !== null) {\n      this.itemLoadLimit = Number(this.itemloadlimit);\n    }\n  }\n\n  private createTBodies() {\n    this.listElm = this.elementRef.nativeElement;\n    let body: HTMLElement | null = this.listElm!.getElementsByTagName('tbody')[0];\n    if (body) {\n      body = body.getAttribute('tablejsViewport') !== null ? body : null;\n    }\n\n    this.listContent = body ? body : document.createElement('tbody');\n    this.listContent.setAttribute('tablejsListContent', '');\n    this.listContent.setAttribute('tablejsViewport', '');\n    this.listContent.style.display = 'block';\n    this.listContent.style.position = 'relative';\n    this.listContent.style.height = '350px';\n    this.listContent.style.overflowY = 'auto';\n    this.listElm!.appendChild(this.listContent);\n\n    if (this.fillViewportScrolling !== undefined && this.fillViewportScrolling !== null) {\n      const coverBody = document.createElement('tbody');\n      coverBody.style.display = 'block';\n      coverBody.style.position = 'absolute';\n      coverBody.style.width = '100%';\n      coverBody.style.height = '100%';\n      coverBody.style.overflow = 'auto';\n      coverBody.style.pointerEvents = 'none';\n      coverBody.style.visibility = 'false';\n      this.listElm!.appendChild(coverBody);\n    }\n\n    this.directiveRegistrationService.registerViewportOnGridDirective(this.listContent);\n\n    const componentRef = this.virtualNexus!.virtualForDirective!._viewContainer.createComponent<ScrollPrevSpacerComponent>(ScrollPrevSpacerComponent);\n    this.virtualNexus!.virtualForDirective!._viewContainer.detach(0);\n    const ref: EmbeddedViewRef<any> = this.virtualNexus!.virtualForDirective!._viewContainer.createEmbeddedView(componentRef.instance.template, undefined, 0);\n    componentRef.destroy();\n    this.prevSpacer = ref.rootNodes[0];\n\n    this.postSpacer = document.createElement('tr');\n    this.postSpacer.setAttribute('tablejsPostSpacer', '');\n    this.postSpacer.style.display = 'block';\n    this.postSpacer.style.position = 'relative';\n    this.listContent.appendChild(this.postSpacer);\n  }\n\n  private addScrollHandler(): void {\n    this.listContent!.addEventListener('scroll', this.handleListContentScroll = (e: any) => {\n      this.handleScroll(e);\n    });\n  }\n\n  public rerenderRowAt(index: number, updateScrollPosition: boolean = false): void {\n    if (!this.viewportHasScrolled) {\n      return;\n    }\n    const ind = index - this.adjustedStartIndex!;\n    const itemName: string = 'item' + index;\n\n    if (ind > this.items!.length - 1 || this.itemVisibilityLookup[this.itemName] !== true) {\n      return;\n    }\n\n    const indexMap: any = {};\n    for (let i = 1; i < this.virtualNexus!.virtualForDirective!._viewContainer.length; i++) {\n      indexMap[(this.virtualNexus!.virtualForDirective!._viewContainer.get(i) as EmbeddedViewRef<any>).rootNodes[0].index] = i;\n    };\n    const detachedRef: ViewRef | null = this.virtualNexus!.virtualForDirective!._viewContainer.detach(indexMap[index]);\n    const child: HTMLElement = (detachedRef as EmbeddedViewRef<any>).rootNodes[0];\n    detachedRef!.destroy();\n    \n    this.templateContext = new TablejsForOfContext<any, any>(this.items![index], this.virtualNexus!.virtualForDirective!._tablejsForOf, index, this.items!.length);\n    const ref: EmbeddedViewRef<any> = this.virtualNexus!.virtualForDirective!._viewContainer.createEmbeddedView(this.virtualNexus!.virtualForDirective!._template!, this.templateContext, indexMap[index]);\n    this.virtualNexus!.virtualForDirective!._viewContainer.move(ref, indexMap[index]);\n    let clone: any = ref.rootNodes[0];\n    clone.index = index;\n    this.cdr!.detectChanges();\n\n    this.scrollDispatcherService.dispatchRemoveItemEvents(this.itemRemoved, child, index, this, this.elementRef.nativeElement);\n\n    const lookupHeight: number = clone.offsetHeight;\n    const oldHeight: number = this.heightLookup[itemName];\n    this.heightLookup[itemName] = lookupHeight;\n\n    clone.lastHeight = lookupHeight;\n\n    this.addResizeSensor(clone, index);\n\n    if (oldHeight) {\n      this.updateEstimatedHeightFromResize(oldHeight, lookupHeight);\n    } else {\n      this.updateEstimatedHeight(lookupHeight);\n    }\n\n    if (updateScrollPosition) {\n      this.refreshViewport();\n    }\n\n    this.scrollDispatcherService.dispatchUpdateItemEvents(this.itemUpdated, clone, index, this, this.elementRef.nativeElement);\n    this.scrollDispatcherService.dispatchAddItemEvents(this.itemAdded, clone, index, this, this.elementRef.nativeElement);\n  }\n\n  private viewportRendered() {\n    this.virtualNexus = this.directiveRegistrationService.getVirtualNexusFromViewport(this);\n\n    if (this.virtualNexus && this.virtualNexus.virtualForDirective) {\n      this.items = this.virtualNexus.virtualForDirective._tablejsForOf;\n\n      this.virtualForChangesSubscription$ = this.virtualNexus.virtualForDirective.changes.subscribe(item => {\n        const isTheSameArray = this.items === item.tablejsForOf;\n        this.items = item.tablejsForOf;\n\n        const scrollToOptions = { index: 0, scrollAfterIndexedItem: 0 };\n        if (isTheSameArray) {\n          scrollToOptions.index = this.range.startIndex as number;\n          scrollToOptions.scrollAfterIndexedItem = this.scrollChangeByFirstIndexedItem;\n\n          // array has changed...rerender current elements\n          const listChildren = Array.from(this.listContent!.childNodes);\n        } else {\n          this.updateItems(item.tablejsForOf, scrollToOptions);\n        }\n      });\n    }\n\n    this.createTBodies();\n    this.addScrollHandler();\n\n    if (this.items && (this.generateCloneMethod || this.virtualNexus.virtualForDirective!._template)) {\n      this.initScroll({\n        items: this.items,\n        generateCloneMethod: this._cloneMethod!\n      });\n    }\n    this.scrollDispatcherService.dispatchViewportReadyEvents(this.viewportReady, this, this.elementRef.nativeElement);\n  }\n\n  public scrollToBottom(): void {\n    this.range.startIndex = this.items!.length;\n    this.scrollToExact(this.range.startIndex, 0);\n  }\n\n  public scrollToTop(): void {\n    this.scrollToExact(0, 0);\n  }\n\n  public pageUp(): void {\n    let heightCount: number = this.scrollChangeByFirstIndexedItem;\n    if (this.range.startIndex === 0) {\n      this.scrollToExact(0, 0);\n      return;\n    }\n    for (let i = this.range.startIndex! - 1; i >= 0; i--) {\n      const lookupHeight: number = this.heightLookup['item' + i] ? this.heightLookup['item' + i] : this.avgItemHeight;\n      heightCount += lookupHeight;\n      if (heightCount >= this.containerHeight! || i === 0) {\n        const overflowDifference: number = heightCount >= this.containerHeight! ? heightCount - this.containerHeight! : 0;\n        this.scrollToExact(i, overflowDifference);\n        break;\n      }\n    }\n  }\n\n  public pageDown(): void {\n    this.range.startIndex = this.range.endIndex! - 1;\n    const overflowDifference: number = this.heightLookup['item' + (this.range.endIndex! - 1).toString()] - this.lastVisibleItemOverflow;\n    this.scrollToExact(this.range.startIndex, overflowDifference);\n  }\n\n  private addArrowListeners() {\n    this.elementRef.nativeElement.addEventListener('mouseenter', this.handleMouseOver = (e: MouseEvent) => {\n      this.mouseIsOverViewport = true;\n    });\n    \n    this.elementRef.nativeElement.addEventListener('mouseleave', this.handleMouseOut = (e: MouseEvent) => {\n      this.mouseIsOverViewport = false;\n    });\n\n    document.addEventListener('keydown', this.handleKeyDown = (e: KeyboardEvent) => {\n\n      if (this.mouseIsOverViewport) {\n\n        const isMac = this.operatingSystem.isMac();\n\n        switch (e.code) {\n          case 'ArrowDown':\n            if (isMac && e.metaKey) {\n              e.preventDefault();\n              this.scrollToBottom();\n            } else {\n              e.preventDefault();\n              this.range.startIndex! += Number(this.arrowDownSpeed);\n              this.scrollToExact(this.range.startIndex!, 0);\n            }\n            break;\n          case 'ArrowUp':\n            if (isMac && e.metaKey) {\n              e.preventDefault();\n              this.scrollToTop();\n            } else {\n              if (this.scrollChangeByFirstIndexedItem === 0) {\n                e.preventDefault();\n                this.range.startIndex! -= Number(this.arrowUpSpeed);\n                this.scrollToExact(this.range.startIndex!, 0);\n              } else {\n                e.preventDefault();\n                this.scrollChangeByFirstIndexedItem = 0;\n                this.scrollToExact(this.range.startIndex!, 0);\n              }\n            }\n            break;\n          case 'PageDown':\n            e.preventDefault();\n            this.pageDown();\n            break;\n          case 'PageUp':\n            e.preventDefault();\n            this.pageUp();\n            break;\n          case 'End':\n            e.preventDefault();\n            this.scrollToBottom();\n            break;\n          case 'Home':\n            e.preventDefault();\n            this.scrollToTop();\n            break;\n        }\n\n      }\n    });\n  }\n\n\n  public ngAfterViewInit() {\n    this.gridDirective = (this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement)! as any)['gridDirective'];\n    this.gridDirective!.scrollViewportDirective = this;\n\n    this.preGridInitializeSubscription$ = this.gridDirective!.preGridInitialize.pipe(take(1)).subscribe(res => {\n      this.cdr!.detectChanges();\n      this.refreshContainerHeight();\n\n      this.refreshViewport();\n      // placeholder object is used only to initialize first grid render\n      if (this.items![0] === this.placeholderObject) {\n        this.items!.shift();\n      }\n    });\n\n    this.viewportRendered();\n    this.addArrowListeners();\n  }\n\n  public ngOnInit() {\n    this.registerViewportToElement();\n    this._cloneMethod = this.generateCloneMethod;\n  }\n\n  public ngOnDestroy() {\n    this.listElm = null;\n    if (this.virtualNexus && this.virtualNexus.virtualForDirective) {\n      this.virtualNexus!.virtualForDirective!._viewContainer.detach(0);\n      this.virtualNexus!.virtualForDirective!._viewContainer.clear();\n    }\n    this.items = [];\n    this.elementRef.nativeElement.scrollViewport = null;\n    this.templateRef = null;\n    this._cloneMethod = null;\n    this.generateCloneMethod = null;\n    if (this.virtualNexus) {\n      this.directiveRegistrationService.clearVirtualNexus(this.virtualNexus);\n      this.virtualNexus.virtualForDirective = null;\n      this.virtualNexus.scrollViewportDirective = null;\n      this.virtualNexus = null;\n    }\n    \n    clearTimeout(this.timeoutID);\n    this.elementRef.nativeElement.removeEventListener('mouseenter', this.handleMouseOver);\n    this.elementRef.nativeElement.removeEventListener('mouseleave', this.handleMouseOut);\n    \n    if (this.listContent) {\n      this.listContent.removeEventListener('scroll', this.handleListContentScroll!);\n    }\n    this.handleListContentScroll = null;\n    document.removeEventListener('keydown', this.handleKeyDown!);\n    if (this.virtualForChangesSubscription$) {\n      this.virtualForChangesSubscription$.unsubscribe();\n    }\n    if (this.preGridInitializeSubscription$) {\n      this.preGridInitializeSubscription$.unsubscribe();\n    }\n    this.elementRef.nativeElement.scrollViewportDirective = null;\n  }\n\n  private setScrollSpacers(): void {\n\n    const numItemsAfterShownList = this.items!.length - this.range.extendedEndIndex!;\n    const numItemsBeforeShownList = this.adjustedStartIndex;\n\n    const totalUnshownItems = numItemsBeforeShownList! + numItemsAfterShownList;\n\n    const beforeItemHeightPercent = totalUnshownItems !== 0 ? numItemsBeforeShownList! / totalUnshownItems : 0;\n    const afterItemHeightPercent = totalUnshownItems !== 0 ? numItemsAfterShownList / totalUnshownItems : 0;\n    const remainingHeight = this.estimatedFullContentHeight - this.lastHeight;\n\n    this.estimatedPreListHeight = Math.round(beforeItemHeightPercent * remainingHeight);\n    this.estimatedPostListHeight = Math.round(afterItemHeightPercent * remainingHeight);\n\n    // account for rounding both up\n    this.estimatedPostListHeight = this.estimatedPostListHeight - (afterItemHeightPercent * remainingHeight) === 0.5 ? this.estimatedPostListHeight - 1 : this.estimatedPostListHeight;\n\n    if (this.forcedEndIndex) {\n      this.estimatedPreListHeight = 0;\n      this.estimatedPostListHeight = 0;\n    }\n\n    this.prevSpacer!.style.height = this.estimatedPreListHeight.toString() + 'px';\n    this.postSpacer!.style.height = this.estimatedPostListHeight.toString() + 'px';\n\n  }\n\n  private setHeightByListHeightDifference(liHeight: number, listHeight: number) {\n    return liHeight - listHeight;\n  }\n\n  private removePreScrollItems(lastIndex: number, index: number) {\n    if (lastIndex < index) {\n      for (let i = lastIndex; i < index; i++) {\n        const firstRef: ViewRef | null = this.virtualNexus!.virtualForDirective!._viewContainer.get(1);\n        if (firstRef) {\n          const firstChild = (firstRef as EmbeddedViewRef<any>).rootNodes[0];\n          const itemName = 'item' + i;\n          this.itemVisibilityLookup[itemName] = false;\n  \n          const detachedRef: ViewRef | null = this.virtualNexus!.virtualForDirective!._viewContainer.detach(1);\n          detachedRef!.destroy();\n          this.cdr!.detectChanges();\n\n          this.removeResizeSensor(firstChild, i);\n          this.lastHeight -= this.heightLookup[itemName];\n          this.scrollDispatcherService.dispatchRemoveItemEvents(this.itemRemoved, firstChild, i, this, this.elementRef.nativeElement);\n        }\n      }\n    }\n  }\n  private removePostScrollItems(lastEndIndex: number, endIndex: number) {\n    if (lastEndIndex >= this.items!.length) {\n      lastEndIndex = this.items!.length - 1;\n    }\n\n    for (let i = lastEndIndex; i >= endIndex; i--) {\n      const lastChild = this.getPreviousSibling(this.listContent!.lastElementChild);\n      if (lastChild) {\n        const itemName = 'item' + i;\n        this.itemVisibilityLookup[itemName] = false;\n\n        const detachedRef: ViewRef | null = this.virtualNexus!.virtualForDirective!._viewContainer.detach(this.virtualNexus!.virtualForDirective!._viewContainer.length - 1);\n        detachedRef!.destroy();\n        this.cdr!.detectChanges();\n\n        this.removeResizeSensor(lastChild, i);\n        this.lastHeight -= this.heightLookup[itemName];\n        this.scrollDispatcherService.dispatchRemoveItemEvents(this.itemRemoved, (detachedRef as EmbeddedViewRef<any>).rootNodes[0], i, this, this.elementRef.nativeElement);\n      }\n    }\n  }\n\n  public updateItems(items: any[], scrollToOptions: any = {index: -1, scrollAfterIndexedItem: 0 }): void {\n    if (this.pauseViewportRenderUpdates) {\n      return;\n    }\n    for (let i = this.virtualNexus!.virtualForDirective!._viewContainer.length - 1; i > 0; i--) {\n      const detachedRef: ViewRef | null = this.virtualNexus!.virtualForDirective!._viewContainer.detach(i);\n      detachedRef!.destroy();\n    }\n    this.cdr!.detectChanges();\n\n    this.resetToInitialValues();\n    this.items = items;\n    if (this.virtualNexus) {\n      this.virtualNexus.virtualForDirective!._tablejsForOf = items;\n    }\n\n    if (scrollToOptions.index !== -1) {\n      this.scrollToExact(scrollToOptions.index, scrollToOptions.scrollAfterIndexedItem);\n    }\n  }\n\n  public resetToInitialValues(): void {\n    this.lastScrollTop = 0;\n    this.currentScrollTop = 0;\n    this.currentScrollChange = 0;\n    this.estimatedFullContentHeight = 0;\n    this.estimatedPreListHeight = 0;\n    this.estimatedPostListHeight = 0;\n    this.totalItemsCounted = 0;\n    this.totalHeightCount = 0;\n    this.avgItemHeight = undefined;\n    this.heightLookup = {};\n    this.itemVisibilityLookup = {};\n    this.overflowHeightCount = 0;\n    this.scrollChangeByFirstIndexedItem = 0;\n    this.lastVisibleItemHeight = Infinity;\n    this.preOverflowHeight = 0;\n    this.lastHeight = 0;\n    this.range.startIndex = 0;\n    this.range.endIndex = 0;\n    this.range.extendedStartIndex = 0;\n    this.range.extendedEndIndex = 0;\n    this.lastRange.startIndex = this.range.startIndex;\n    this.lastRange.endIndex = this.range.endIndex;\n    this.lastRange.extendedStartIndex = this.range.extendedStartIndex;\n    this.lastRange.extendedEndIndex = this.range.extendedEndIndex;\n    this.forcedEndIndex = undefined;\n  }\n\n  public recalculateRowHeight(index: number): void {\n    const itemName: string = 'item' + index;\n    const indexMap: any = {};\n    for (let i = 1; i < this.virtualNexus!.virtualForDirective!._viewContainer.length; i++) {\n      indexMap[(this.virtualNexus!.virtualForDirective!._viewContainer.get(i) as EmbeddedViewRef<any>).rootNodes[0].index] = i;\n    };\n    const rowRef: EmbeddedViewRef<any> = this.virtualNexus!.virtualForDirective!._viewContainer.get(indexMap[index]) as EmbeddedViewRef<any>;\n    const rowEl: HTMLElement | any = rowRef.rootNodes[0];\n\n    const lookupHeight: number = rowEl.offsetHeight;\n    const heightDifference: number = lookupHeight - this.heightLookup[itemName];\n    this.updateEstimatedHeightFromResize(this.heightLookup[itemName], lookupHeight);\n    this.heightLookup[itemName] = lookupHeight;\n\n    rowEl.lastHeight = lookupHeight;\n    this.lastHeight += heightDifference;\n  }\n\n  private updateEstimatedHeightFromResize(oldHeight: number, newHeight: number): void {\n    this.totalHeightCount += (newHeight - oldHeight);\n    this.avgItemHeight = (this.totalHeightCount / this.totalItemsCounted);\n    this.estimatedFullContentHeight = this.avgItemHeight * this.items!.length;\n  }\n  private updateEstimatedHeight(height: number) {\n    this.totalHeightCount += height;\n    this.totalItemsCounted++;\n\n    this.avgItemHeight = (this.totalHeightCount / this.totalItemsCounted);\n    this.estimatedFullContentHeight = this.avgItemHeight * this.items!.length;\n  }\n\n  public getPreviousSibling(el: Node | Element | null): any {\n    if (!el) {\n      return null;\n    }\n    let prev = el.previousSibling;\n    while (prev !== null && prev !== undefined && prev.nodeType !== 1) {\n      prev = prev.previousSibling;\n    }\n    return prev;\n  }\n  public getNextSibling(el: Element | null): any {\n    if (!el) {\n      return null;\n    }\n    let next = el.nextSibling;\n    while (next !== null && next !== undefined && next.nodeType !== 1) {\n      next = next.nextSibling;\n    }\n    return next;\n  }\n\n  private getEstimatedChildInsertions(remainingHeight: number): number {\n    return Math.ceil(remainingHeight / this.avgItemHeight!);\n  }\n\n  private setLastRangeToCurrentRange() {\n    this.lastRange.startIndex = this.range.startIndex;\n    this.lastRange.endIndex = this.range.endIndex;\n    this.lastRange.extendedStartIndex = this.range.extendedStartIndex;\n    this.lastRange.extendedEndIndex = this.range.extendedEndIndex;\n  }\n\n  private resetLastHeight() {\n    if (!this.lastHeight) {\n      this.lastHeight = 0;\n    }\n  }\n\n  private maintainIndexInBounds(index: number) {\n    if (index > this.items!.length - 1) {\n      index = this.items!.length - 1;\n    } else if (index < 0) {\n      index = 0;\n    }\n    return index;\n  }\n\n  private maintainEndIndexInBounds(index: number) {\n    if (index > this.items!.length) {\n      index = this.items!.length;\n    } else if (index < 0) {\n      index = 0;\n    }\n    return index;\n  }\n\n  public showRange(startIndex: number, endIndex: number, overflow: number = 0): void {\n    this.updateItems(this.items!, {index: startIndex, scrollAfterIndexedItem: endIndex });\n    startIndex = this.maintainIndexInBounds(startIndex);\n    endIndex = this.maintainEndIndexInBounds(endIndex);\n    if (endIndex <= startIndex) {\n      endIndex = startIndex + 1;\n    }\n\n    const oldContainerHeight: number = this.containerHeight!;\n    const oldPreItemOverflow: number = Number(this.preItemOverflow);\n    const oldPostItemOverflow: number = Number(this.postItemOverflow);\n\n    this.preItemOverflow = 0;\n    this.postItemOverflow = 0;\n    this.containerHeight = 100000;\n    this.forcedEndIndex = endIndex;\n\n    this.scrollToExact(startIndex, overflow);\n\n    const rangeToKeep: Range = { ...this.range};\n    const lastRangeToKeep: Range = { ...this.lastRange };\n\n    this.preItemOverflow = oldPreItemOverflow;\n    this.postItemOverflow = oldPostItemOverflow;\n    this.containerHeight = oldContainerHeight;\n    this.forcedEndIndex = undefined;\n\n    this.range = rangeToKeep;\n    this.lastRange = lastRangeToKeep;\n\n  }\n\n  public getDisplayedContentsHeight(): number {\n    return this.lastHeight;\n  }\n\n  public refreshContainerHeight(): void {\n    this.containerHeight = this.listContent!.clientHeight;\n  }\n\n  public allItemsFitViewport(recalculateContainerHeight: boolean = false, refreshViewport: boolean = false): boolean {\n    if (recalculateContainerHeight) {\n      this.cdr!.detectChanges();\n      this.refreshContainerHeight();\n    }\n    if (refreshViewport) {\n      this.refreshViewport(true);\n    }\n    return this.range.startIndex === this.range.extendedStartIndex &&\n            this.range.endIndex === this.range.extendedEndIndex && \n            this.lastHeight <= this.containerHeight!;\n  }\n\n  public getCurrentScrollPosition(): any {\n    return {\n      index: this.range.startIndex,\n      overflow: this.scrollChangeByFirstIndexedItem,\n      lastItemOverflow: this.lastVisibleItemOverflow > 0 ? 0 : this.lastVisibleItemOverflow\n    }\n  }\n\n  private setHeightsForOverflowCalculations(itemIndex: number, scrollToIndex: number, itemHeight: number) {\n    this.lastHeight += itemHeight;\n\n    if (itemIndex < scrollToIndex) {\n      this.preOverflowHeight += itemHeight;\n    }\n\n    if (itemIndex >= scrollToIndex) {\n      this.overflowHeightCount += itemHeight;\n      if (this.overflowHeightCount >= this.containerHeight!) {\n        this.postItemOverflowCount++;\n\n        if (this.postItemOverflowCount === 0) {\n          this.lastVisibleItemHeight = this.heightLookup['item' + itemIndex];\n        }\n      }\n    }\n  }\n\n  private addResizeSensor(el: any, index: number): void {\n  }\n  private removeResizeSensor(el: any, index: number): void {\n  }\n\n  public onTransitionEnd: (_e: any) => void = (e) => {\n  }\n  public onTransitionRun: (_e: any) => void = (e) => {\n  }\n  public onTransitionStart: (_e: any) => void = (e) => {\n  }\n  public onTransitionCancel: (_e: any) => void = (e) => {\n  }\n\n  public getCloneFromTemplateRef(index: number): HTMLElement {\n    let clone: HTMLElement;\n\n    this.templateContext = new TablejsForOfContext<any, any>(this.items![index], this.virtualNexus!.virtualForDirective!._tablejsForOf, index, this.items!.length);\n    const viewRef = this.virtualNexus!.virtualForDirective!._template!.createEmbeddedView(this.templateContext);\n    viewRef.detectChanges();\n    clone = viewRef.rootNodes[0];\n\n    return clone;\n  }\n\n  private addScrollItems(index: number, overflow: number): void {\n    const scrollingUp = index < this.lastRange.startIndex!;\n\n    this.range.extendedStartIndex = this.adjustedStartIndex;\n    this.range.startIndex = index;\n    this.overflowHeightCount = -overflow;\n    this.preOverflowHeight = 0;\n    const firstEl = this.getNextSibling(this.listContent!.firstElementChild);\n    this.lastHeight = 0;\n    let batchSize: number = this.avgItemHeight !== undefined && isNaN(this.avgItemHeight) === false ? this.getEstimatedChildInsertions(this.containerHeight! - this.lastHeight) + Number(this.preItemOverflow) + Number(this.postItemOverflow) : 1;\n    let itemsToBatch: any[] = [];\n    let itemBefore: Node;\n    let indexBefore: number;\n    const firstRef: ViewRef | null = this.virtualNexus!.virtualForDirective!._viewContainer.get(1);\n    const appendToEnd: boolean = firstRef === null;\n    for (let i = this.adjustedStartIndex!; i < this.adjustedStartIndex! + Number(this.itemLoadLimit); i++) {\n      if (i < 0) {\n        continue;\n      }\n      if (i > this.items!.length - 1) {\n        break;\n      }\n\n      this.itemName = 'item' + i;\n      // only insert item if it is not already visible\n      const itemIsInvisible: boolean = this.itemVisibilityLookup[this.itemName] !== true;\n\n      if (itemIsInvisible) {\n        itemBefore = !scrollingUp ? this.postSpacer : firstEl;\n\n        indexBefore = !scrollingUp || appendToEnd ? this.virtualNexus!.virtualForDirective!._viewContainer.length : this.virtualNexus!.virtualForDirective!._viewContainer.indexOf(firstRef!);\n\n        this.itemVisibilityLookup[this.itemName] = true;\n\n        this.templateContext = new TablejsForOfContext<any, any>(this.items![i], this.virtualNexus!.virtualForDirective!._tablejsForOf, i, this.items!.length);\n        const ref: EmbeddedViewRef<any> = this.virtualNexus!.virtualForDirective!._viewContainer.createEmbeddedView(this.virtualNexus!.virtualForDirective!._template!, this.templateContext, indexBefore);\n        this.virtualNexus!.virtualForDirective!._viewContainer.move(ref, indexBefore);\n\n        const prev: any = ref.rootNodes[0];\n        prev.index = i;\n        \n        itemsToBatch.push({ index: i, name: this.itemName, item: prev, before: itemBefore });\n\n        this.scrollDispatcherService.dispatchAddItemEvents(this.itemAdded, prev, i, this, this.elementRef.nativeElement);\n      } else {\n        itemsToBatch.push({ index: i, name: this.itemName, item: null, before: null });\n        this.setHeightsForOverflowCalculations(i, index, this.heightLookup[this.itemName]);\n      }\n\n      if (itemsToBatch.length === batchSize || i === this.items!.length - 1 || this.postItemOverflowCount >= Number(this.postItemOverflow)) {\n        for (let j = 0; j < itemsToBatch.length; j++) {\n          const batchObj: any = itemsToBatch[j];\n          const name: string = batchObj.name;\n          const ind: number = batchObj.index;\n          const oldHeight: number = this.heightLookup[name];\n\n          if (batchObj.item === null) {\n            continue;\n          }\n\n          this.cdr!.detectChanges();\n          const lookupHeight: number = batchObj.item.offsetHeight;\n\n          this.heightLookup[name] = lookupHeight;\n\n          batchObj.item.lastHeight = lookupHeight;\n          this.addResizeSensor(batchObj.item, batchObj.index);\n\n          if (oldHeight) {\n            this.updateEstimatedHeightFromResize(oldHeight, lookupHeight);\n          } else {\n            this.updateEstimatedHeight(lookupHeight);\n          }\n          this.setHeightsForOverflowCalculations(ind, index, lookupHeight);\n        }\n        batchSize = this.getEstimatedChildInsertions(this.containerHeight! - this.lastHeight) + Number(this.preItemOverflow) + Number(this.postItemOverflow);\n        if (batchSize <= 0) {\n          batchSize = Number(this.postItemOverflow);\n        }\n        itemsToBatch = [];\n      }\n      \n      if (this.postItemOverflowCount <= 0) {\n        this.range.endIndex = i + 1;\n      }\n      this.range.extendedEndIndex = i + 1;\n      // if item height is lower than the bottom of the container area, stop adding items\n      if (this.forcedEndIndex === undefined) {\n        if (this.postItemOverflowCount >= Number(this.postItemOverflow)) {\n          break;\n        }\n      } else {\n        if (i === this.forcedEndIndex - 1) {\n          break;\n        }\n      }\n    }\n    let itemName: string;\n    let endIndexFound: boolean = false;\n    let heightCount: number = -overflow;\n    for (let i = this.range.startIndex; i < this.range.extendedEndIndex!; i++) {\n      itemName = 'item' + i;\n      heightCount += this.heightLookup[itemName];\n\n      if (this.forcedEndIndex !== undefined) {\n        if (i === this.forcedEndIndex - 1) {\n          this.range.endIndex = i + 1;\n          this.lastVisibleItemOverflow = heightCount - this.containerHeight!;\n\n          endIndexFound = true;\n          break;\n        }\n      } else {\n        if (heightCount >= this.containerHeight! && !endIndexFound) {\n          this.range.endIndex = i + 1;\n          this.lastVisibleItemOverflow = heightCount - this.containerHeight!;\n\n          endIndexFound = true;\n          break;\n        }\n      }\n    }\n  }\n\n  private addMissingPostScrollItemsAndUpdateOverflow(index: number, overflow: number): number {\n\n    let firstEl;\n    let itemsToBatch: any[] = [];\n    let batchSize: number;\n\n    if (this.overflowHeightCount <= this.containerHeight!) {\n      batchSize = this.getEstimatedChildInsertions(this.containerHeight!) + Number(this.preItemOverflow);\n      this.preItemOverflowCount = -1;\n      this.preOverflowHeight = 0;\n\n      firstEl = this.getNextSibling(this.listContent!.firstElementChild);\n\n      let heightCount = 0;\n      let count = 0;\n\n      for (let i = this.range.endIndex! - 1; i >= 0; i--) {\n        this.itemName = 'item' + i;\n\n        count++;\n        if (i <= this.range.extendedStartIndex! && this.itemVisibilityLookup[this.itemName] !== true) {\n\n          this.itemVisibilityLookup[this.itemName] = true;\n\n          this.templateContext = new TablejsForOfContext<any, any>(this.items![i], this.virtualNexus!.virtualForDirective!._tablejsForOf, i, this.items!.length);\n          const ref: EmbeddedViewRef<any> = this.virtualNexus!.virtualForDirective!._viewContainer.createEmbeddedView(this.virtualNexus!.virtualForDirective!._template!, this.templateContext, 1);\n          this.virtualNexus!.virtualForDirective!._viewContainer.move(ref, 1);\n          const prev: any = ref.rootNodes[0];\n          prev.index = i;\n          this.cdr!.detectChanges();\n\n          itemsToBatch.push({ index: i, name: this.itemName, item: prev, before: firstEl });\n          this.scrollDispatcherService.dispatchAddItemEvents(this.itemAdded, prev, i, this, this.elementRef.nativeElement);\n          firstEl = prev;\n\n          this.range.extendedStartIndex = i;\n          this.adjustedStartIndex = i;\n        } else {\n          itemsToBatch.push({ index: i, name: this.itemName, item: null, before: null });\n\n          heightCount += this.heightLookup[this.itemName];\n          if (heightCount > this.containerHeight!) {\n            this.preItemOverflowCount++;\n            if (this.preItemOverflowCount === 0) {\n              overflow = heightCount - this.containerHeight!;\n              this.range.startIndex = i;\n              index = i;\n            } else {\n              this.preOverflowHeight += this.heightLookup[this.itemName];\n            }\n            this.range.extendedStartIndex = i;\n            this.adjustedStartIndex = i;\n          }\n        }\n\n        if (itemsToBatch.length === batchSize || i === 0) {\n          for (let j = 0; j < itemsToBatch.length; j++) {\n            const batchObj: any = itemsToBatch[j];\n            if (batchObj.item === null) {\n              continue;\n            }\n            const name: string = batchObj.name;\n            const ind: number = batchObj.index;\n            const lookupHeight: number = batchObj.item.offsetHeight;\n            const oldHeight: number = this.heightLookup[name];\n            this.heightLookup[name] = lookupHeight;\n\n            batchObj.item.lastHeight = lookupHeight;\n            this.addResizeSensor(batchObj.item, batchObj.index);\n            if (oldHeight) {\n              this.updateEstimatedHeightFromResize(oldHeight, lookupHeight);\n            } else {\n              this.updateEstimatedHeight(lookupHeight);\n            }\n\n            heightCount += lookupHeight;\n\n            if (heightCount > this.containerHeight!) {\n              this.preItemOverflowCount++;\n              if (this.preItemOverflowCount === 0) {\n                overflow = heightCount - this.containerHeight!;\n                this.range.startIndex = batchObj.index;\n                index = batchObj.index;\n              } else {\n                this.preOverflowHeight += lookupHeight;\n              }\n              this.range.extendedStartIndex = batchObj.index;\n              this.adjustedStartIndex = batchObj.index;\n            }\n\n          }\n          batchSize = this.getEstimatedChildInsertions(this.containerHeight! - this.lastHeight) + Number(this.preItemOverflow);\n          if (batchSize <= 0) {\n            batchSize = Number(this.preItemOverflow);\n          }\n          itemsToBatch = [];\n        }\n\n        if (this.preItemOverflowCount >= Number(this.preItemOverflow)) {\n          break;\n        }\n      }\n    }\n\n    return overflow;\n  }\n\n  public scrollToExact(index: number, overflow: number = 0): void {\n    if (!this.items || this.items.length === 0) {\n      return;\n    }\n\n    this.resetLastHeight();\n    index = this.maintainIndexInBounds(index);\n    overflow = index === 0 && overflow < 0 ? 0 : overflow;\n\n    this.adjustedStartIndex = index - Number(this.preItemOverflow) <= 0 ? 0 : index - Number(this.preItemOverflow);\n\n    this.preItemOverflowCount = -1;\n    this.postItemOverflowCount = -1;\n    this.lastVisibleItemOverflow = 0;\n\n    this.range.endIndex = 0;\n    this.range.extendedEndIndex = 0;\n\n    this.removePreScrollItems(this.lastRange.extendedStartIndex!, Math.min(this.adjustedStartIndex, this.lastRange.extendedEndIndex!));\n\n    this.addScrollItems(index, overflow);\n\n    this.removePostScrollItems(this.lastRange.extendedEndIndex! - 1, Math.max(this.lastRange.extendedStartIndex!, this.range.extendedEndIndex));\n\n    if (!this.forcedEndIndex) {\n      overflow = this.addMissingPostScrollItemsAndUpdateOverflow(index, overflow);\n    }\n\n    this.setLastRangeToCurrentRange();\n\n    this.setScrollSpacers();\n\n    this.lastScrollTop = this.preOverflowHeight + overflow + this.estimatedPreListHeight;\n    this.listContent!.scrollTop = this.lastScrollTop;\n    this.currentScrollTop = this.lastScrollTop;\n\n    this.scrollChangeByFirstIndexedItem = overflow;\n    this.scrollDispatcherService.dispatchRangeUpdateEvents(this.rangeUpdated, this.range, this, this.elementRef.nativeElement);\n\n    this.viewportHasScrolled = true;\n\n  }\n\n  private getRangeChange(scrollChange: number) {\n    let heightCount = 0;\n    let rangeStartCount = 0;\n    let overflow = 0;\n    const newRange: Range = { startIndex: null, endIndex: null, extendedStartIndex: null, extendedEndIndex: null };\n    let itemName;\n\n    if (scrollChange > 0) {\n      for (let i = this.range.startIndex; i! <= this.range.endIndex! + Number(this.itemLoadLimit); i!++) {\n        overflow = scrollChange - heightCount;\n        itemName = 'item' + i;\n        if (this.heightLookup[itemName]) {\n          heightCount += this.heightLookup[itemName];\n        } else {\n          heightCount += this.avgItemHeight!;\n        }\n\n        if (heightCount >= scrollChange) {\n          break;\n        }\n\n        rangeStartCount++;\n      }\n\n      newRange.startIndex = this.range.startIndex! + rangeStartCount;\n      newRange.endIndex = rangeStartCount < this.range.endIndex! - this.range.startIndex! ? this.range.endIndex : newRange.startIndex + 1;\n    }\n\n    if (scrollChange < 0) {\n      rangeStartCount = -1;\n      overflow = scrollChange;\n      for (let i = this.range.startIndex! - 1; i >= 0; i--) {\n        itemName = 'item' + i;\n        if (this.heightLookup[itemName]) {\n          overflow += this.heightLookup[itemName];\n          heightCount += this.heightLookup[itemName];\n        } else {\n          overflow += this.avgItemHeight!;\n          heightCount += this.avgItemHeight!;\n        }\n\n        if (overflow >= 0) {\n          break;\n        }\n\n        rangeStartCount--;\n      }\n\n      newRange.startIndex = this.range.startIndex! + rangeStartCount >= 0 ? this.range.startIndex! + rangeStartCount : 0;\n      newRange.endIndex = rangeStartCount < this.range.endIndex! - this.range.startIndex! ? this.range.endIndex : newRange.startIndex + 1;\n    }\n\n    this.scrollChangeByFirstIndexedItem = overflow;\n\n    return newRange;\n  }\n\n  public refreshViewport(recalculateRows: boolean = false): void {\n    if (recalculateRows) {\n      for (let i = this.range.extendedStartIndex!; i < this.range.extendedEndIndex!; i++) {\n        this.recalculateRowHeight(i);\n      }\n    }\n    this.scrollToExact(this.range.startIndex!, this.scrollChangeByFirstIndexedItem);\n  }\n\n  public updateScrollFromRange(newRange: Range): void {\n    if (newRange.startIndex !== null) {\n      if (this.range.startIndex !== newRange.startIndex || this.lastVisibleItemOverflow < 0) {\n        this.range.startIndex = newRange.startIndex;\n        this.range.endIndex = newRange.endIndex;\n\n        this.refreshViewport();\n      } else {\n        this.lastScrollTop = this.currentScrollTop;\n      }\n    }\n    this.lastScrollTop = this.currentScrollTop;\n  }\n\n  private initScroll(options: IScrollOptions) {\n    this.items = options.items;\n    this._cloneMethod = options.generateCloneMethod;\n    const itemsAreEmpty: boolean = this.items.length === 0;\n    let index = options.initialIndex ? options.initialIndex : 0;\n\n    if (this.virtualNexus && this.virtualNexus.virtualForDirective!._template) {\n      clearTimeout(this.timeoutID);\n      this.timeoutID = setTimeout(() => {\n        this.cloneFromTemplateRef = true;\n        this.verifyViewportIsReady();\n        this.initFirstScroll(index);\n      });\n    } else {\n      this.template = document.getElementById(this.templateID!);\n      this.verifyViewportIsReady();\n      this.initFirstScroll(index);\n    }\n  }\n\n  private verifyViewportIsReady() {\n    if (this.templateID === '' && !this.templateIsSet()) {\n      throw Error('Scroll viewport template ID is not set.');\n    }\n    if (!this.itemsAreSet()) {\n      throw new Error('Scroll viewport requires an array of items.  Please supply an items array.');\n    }\n    if (!this.cloneMethodIsSet() && !this.templateIsSet()) {\n      throw new Error('Scroll viewport requires a cloning method or a template.  Please supply a method as follows:\\n\\n (template: HTMLElement, items: any[], index: number) => Node\\n\\n or supply a tablejsVirtualFor');\n    }\n  }\n\n  private initFirstScroll(index: number): void {\n    const itemsAreEmpty: boolean = this.items!.length === 0;\n    this.refreshContainerHeight();\n    if (itemsAreEmpty) {\n      this.items!.push(this.placeholderObject);\n      this.scrollToExact(index, 0);\n      const node: HTMLElement = (this.virtualNexus!.virtualForDirective!._viewContainer.get(1) as EmbeddedViewRef<any>).rootNodes[0];\n      this.renderer!.setStyle(node, 'height', '0px');\n      this.renderer!.setStyle(node, 'minHeight', '0px');\n      this.renderer!.setStyle(node, 'overflow', 'hidden');\n    } else {\n      this.scrollToExact(index, 0);\n    }\n    this.scrollDispatcherService.dispatchViewportInitializedEvents(this.viewportInitialized, this, this.elementRef.nativeElement);\n  }\n\n  private itemsAreSet(): boolean {\n    return !!this.items;\n  }\n  private cloneMethodIsSet(): boolean {\n    return !!this._cloneMethod;\n  }\n  private templateIsSet(): boolean {\n    return this.virtualNexus!.virtualForDirective!._template !== undefined && this.virtualNexus!.virtualForDirective!._template !== null;\n  }\n\n}\n","import { AfterViewInit, ComponentRef, ComponentFactory, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, OnDestroy, Inject, InjectionToken, Injector, Input, Output, ViewContainerRef, RendererFactory2 } from '@angular/core';\nimport { DragAndDropGhostComponent } from './../../components/drag-and-drop-ghost/drag-and-drop-ghost.component';\nimport { DOCUMENT } from '@angular/common';\nimport { TablejsGridProxy } from './../../shared/classes/tablejs-grid-proxy';\nimport { GridService } from './../../services/grid/grid.service';\nimport { DirectiveRegistrationService } from './../../services/directive-registration/directive-registration.service';\nimport { IColumnData } from './../../shared/interfaces/i-column-data';\nimport { ColumnReorderEvent } from './../../shared/classes/events/column-reorder-event';\nimport { ColumnResizeEvent } from './../../shared/classes/events/column-resize-event';\nimport { GridEvent } from './../../shared/classes/events/grid-event';\nimport { ScrollViewportDirective } from './../../directives/scroll-viewport/scroll-viewport.directive';\nimport { ScrollDispatcherService } from './../../services/scroll-dispatcher/scroll-dispatcher.service';\nimport { OperatingSystemService } from './../../services/operating-system/operating-system.service';\nimport { ResizeSensor } from 'css-element-queries';\nimport { Subject, Subscription } from 'rxjs';\nimport { Overlay, OverlayConfig, OverlayRef, PositionStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal';\nimport { IColumnHierarchy } from '../../shared/interfaces/i-column-hierarchy';\nimport { IColumnHideChange } from '../../shared/interfaces/events/i-column-hide-change';\nimport { HideColumnIfDirective } from '../hide-column-if/hide-column-if.directive';\n\n@Directive({\n  selector: '[tablejsGrid],[tablejsgrid]',\n  host: { class: 'tablejs-table-container tablejs-table-width' }\n})\nexport class GridDirective extends TablejsGridProxy implements AfterViewInit, OnDestroy {\n\n  dragging: boolean = false;\n  reordering: boolean = false;\n  startX: number = 0;\n  startY: number = 0;\n  stylesByClass: any[] = [];\n  id: string | null = null;\n  viewport: HTMLElement | null | undefined = null;\n  viewportID: string | null = null;\n  currentClassesToResize: string[] = [];\n  startingWidths: number[] = [];\n  minWidths: number[] = [];\n  totalComputedMinWidth: number = 0;\n  totalComputedWidth: number = 0;\n  defaultTableMinWidth: number = 25;\n  gridTemplateClasses: string[] = [];\n  gridOrder: number[] = [];\n  classWidths: any[] = [];\n  gridTemplateTypes: any[] = [];\n  draggingColumn: HTMLElement | null = null;\n  colRangeGroups: number[][][] = [];\n  lastDraggedOverElement: any = null;\n  lastDraggedGroupIndex: number = -1;\n  lastDraggedOverRect: ClientRect | null = null;\n  lastDraggedGroupBoundingRects: ClientRect[] | null = null;\n  lastMoveDirection: number = -1;\n  resizableColumns: HTMLElement[] = [];\n  resizableGrips: HTMLElement[] = [];\n  reorderGrips: HTMLElement[] = [];\n  reorderableColumns: HTMLElement[] = [];\n  columnsWithDataClasses: HTMLElement[] = [];\n  rows: HTMLElement[] = [];\n  infiniteScrollViewports: HTMLElement[] = [];\n  mutationResizableColumns: HTMLElement[] = [];\n  mutationResizableGrips: HTMLElement[] = [];\n  mutationReorderGrips: HTMLElement[] = [];\n  mutationReorderableColumns: HTMLElement[] = [];\n  mutationColumnsWithDataClasses: HTMLElement[] = [];\n  mutationRows: HTMLElement[] = [];\n  mutationInfiniteScrollViewports: HTMLElement[] = [];\n  headTag: HTMLHeadElement = this.document.getElementsByTagName('head')[0];\n  styleContent: string = '';\n  headStyle: HTMLStyleElement | null = null;\n  styleList: HTMLStyleElement[] = [];\n  initialWidths: any[] = [];\n  initialWidthsAreSet: boolean | undefined = undefined;\n  lastColumns: any[] = [];\n  contentResizeSensor: ResizeSensor | null = null;\n  observer: MutationObserver | null = null;\n  isCustomElement: boolean = false;\n  pointerListenerFunc: any;\n\n  parentGroups: Element[][] = [];\n\n  colData: IColumnData | null = null;\n  colDataGroups: IColumnData[][] = [];\n  elementsWithHighlight: any[] = [];\n\n  dragAndDropGhostComponent: DragAndDropGhostComponent | null = null;\n  dragOffsetX: number = 0;\n  dragOffsetY: number = 0;\n  reorderHandleColOffset: number = 0;\n  scrollbarWidth: number = 0;\n\n  initialWidthSettingsSubscription$: Subscription;\n\n  // class used for setting order\n  reorderableClass: string = 'reorderable-table-row';\n\n  // fragments\n  widthStyle: HTMLStyleElement | null = null;\n  widthStyleFragment: DocumentFragment | null = null;\n  reorderHighlightStyle: HTMLStyleElement | null = null;\n  reorderHighlightStyleFragment: DocumentFragment | null = null;\n  subGroupStyles: (HTMLStyleElement | null)[] = [];\n  subGroupFragments: (DocumentFragment | null)[] = [];\n  gridOrderStyles: (HTMLStyleElement | null)[] = [];\n  gridOrderFragments: (DocumentFragment | null)[] = [];\n  subGroupStyleObjs: any = {};\n  scrollbarAdjustmentFragment: DocumentFragment | null = null;\n  scrollbarAdjustmentStyle: HTMLStyleElement | null = null;\n  resizeMakeUpPercent: number = 0;\n  resizeMakeUpPerColPercent: number = 0;\n\n  scrollViewportDirective: ScrollViewportDirective | null = null;\n  overlayRef: OverlayRef;\n  hiddenColumnIndices: number[] = [];\n  public hiddenColumnChanges: Subject<IColumnHideChange | null> = new Subject<IColumnHideChange | null>();\n  private hiddenColumnChangesSubscription$: Subscription;\n  public HIDDEN_COLUMN_CLASS: string = 'column-is-hidden';\n\n  private injector: Injector;\n  private DRAG_AND_DROP_GHOST_OVERLAY_DATA = new InjectionToken<any>('DRAG_AND_DROP_GHOST_OVERLAY_DATA');\n\n  private animationFrameIDs: number[] = [];\n\n  @Input() linkClass: string | undefined = undefined;\n  @Input() resizeColumnWidthByPercent: boolean = false;\n\n  @Output() columnResizeStart: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnResize: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnResizeEnd: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnReorder: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnReorderStart: EventEmitter<any> = new EventEmitter<any>();\n  @Output() dragOver: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnReorderEnd: EventEmitter<any> = new EventEmitter<any>();\n  @Output() preGridInitialize: EventEmitter<any> = new EventEmitter<any>(true);\n  @Output() gridInitialize: EventEmitter<any> = new EventEmitter<any>(true);\n\n  constructor(\n    private elementRef: ElementRef,\n    private resolver: ComponentFactoryResolver,\n    private gridService: GridService,\n    private directiveRegistrationService: DirectiveRegistrationService,\n    @Inject(DOCUMENT) private document: any,\n    private overlay: Overlay,\n    private scrollDispatcherService: ScrollDispatcherService,\n    private operatingSystem: OperatingSystemService,\n    private rendererFactory: RendererFactory2) {\n    super();\n    console.log('TableJS has been moved!  Please install the newest versions from https://www.npmjs.com/package/@tablejs/community (npm install @tablejs/community).');\n    this.registerDirectiveToElement();\n    this.attachMutationObserver();\n  }\n\n  private registerDirectiveToElement() {\n    this.elementRef.nativeElement.gridDirective = this;\n    this.elementRef.nativeElement.parentElement.gridDirective = this;\n  }\n\n  private attachMutationObserver(): void {\n    if (!this.observer) {\n      const ths: any = this;\n      this.observer = new MutationObserver((mutations: MutationRecord[]) => {\n        mutations.forEach((mutation: MutationRecord) => {\n          ths.updateMutations(mutation);\n        });\n      });\n\n      this.observer.observe(this.elementRef.nativeElement, {\n        // configure it to listen to attribute changes\n        attributes: true,\n        subtree: true,\n        childList: true,\n        characterData: false\n      });\n    }\n  }\n\n  private updateMutations(mutation: MutationRecord): void {\n    if (mutation.type === 'childList') {\n      const addedNodes = Array.from(mutation.addedNodes);\n      addedNodes.forEach(node => {\n\n        this.directiveRegistrationService.registerNodeAttributes(node);\n        this.getChildNodes(node);\n      });\n    }\n  }\n\n  private getChildNodes(node: any) {\n    node.childNodes.forEach((childNode: any) => {\n      this.directiveRegistrationService.registerNodeAttributes(childNode);\n      if (childNode.getAttribute) {\n        this.getChildNodes(childNode);\n      }\n    });\n  }\n\n  public ngAfterViewInit() {\n    \n\n    const viewport = this.elementRef.nativeElement.querySelector('*[tablejsScrollViewport]');\n    if (viewport !== null && (viewport.scrollViewportDirective === null || viewport.scrollViewportDirective === undefined)) {\n      // attach directive\n      const viewportRef: ElementRef = new ElementRef(viewport);\n      \n      this.scrollViewportDirective = new ScrollViewportDirective(\n        viewportRef,\n        this.gridService,\n        this.document,\n        this.directiveRegistrationService,\n        this.scrollDispatcherService,\n        this.operatingSystem,\n        null,\n        this.rendererFactory\n      );\n\n      this.scrollViewportDirective.registerCustomElementsInputs(viewport);\n\n      this.scrollViewportDirective.ngOnInit();\n      this.scrollViewportDirective.ngAfterViewInit();\n\n    }\n    \n\n    // Close observer if directives are registering\n\n    this.elementRef.nativeElement.directive = this;\n    if (!this.document['hasPointerDownListener']) {\n      this.pointerListenerFunc = (e: Event) => {\n        let el: HTMLElement | any | null = e.target as HTMLElement;\n        if (el) {\n          while (el !== null && el.getAttribute('tablejsGrid') === null) {\n            el = el.parentElement;\n          }\n          if (el) {\n            el['directive'].onPointerDown(e);\n          }\n        }\n      }\n      this.document.addEventListener('pointerdown', this.pointerListenerFunc);\n      this.document['hasPointerDownListener'] = true;\n    }\n    const animationFrameID: number = window.requestAnimationFrame((timestamp) => {\n      this.onEnterFrame(this, timestamp);\n    });\n    this.animationFrameIDs.push(animationFrameID);\n  }\n\n  private onEnterFrame(ths: any, timestamp: any) {\n\n    if (this.columnsWithDataClasses.length > 0) {\n      this.observer?.disconnect();\n    }\n\n    if (this.columnsWithDataClasses.length === 0 && this.mutationColumnsWithDataClasses.length === 0) {\n      const animationFrameID: number = window.requestAnimationFrame((tmstamp) => {\n        ths.onEnterFrame(ths, tmstamp);\n      });\n      this.animationFrameIDs.push(animationFrameID);\n      return;\n    }\n    \n    if (this.columnsWithDataClasses.length === 0 && this.mutationColumnsWithDataClasses.length !== 0) {\n      this.isCustomElement = true;\n\n      this.resizableColumns = this.mutationResizableColumns.concat();\n      this.resizableGrips = this.mutationResizableGrips.concat();\n      this.reorderGrips = this.mutationReorderGrips.concat();\n      this.reorderableColumns = this.mutationReorderableColumns.concat();\n      this.columnsWithDataClasses = this.mutationColumnsWithDataClasses.concat();\n      this.rows = this.mutationRows.concat();\n      this.infiniteScrollViewports = this.mutationInfiniteScrollViewports.concat();\n\n      this.mutationResizableColumns = [];\n      this.mutationResizableGrips = [];\n      this.mutationReorderGrips = [];\n      this.mutationReorderableColumns = [];\n      this.mutationColumnsWithDataClasses = [];\n      this.mutationRows = [];\n      this.mutationInfiniteScrollViewports = [];\n    }\n\n    const allElementsWithDataResizable: any = this.columnsWithDataClasses;\n    const el = allElementsWithDataResizable[0];\n    const resizeClasses: string[] = this.getResizableClasses(el);\n    const resizeCls = resizeClasses[0];\n    const firstEl: HTMLElement = this.elementRef.nativeElement.getElementsByClassName(resizeCls)[0];\n\n    \n    if (!this.initialWidthSettingsSubscription$) {\n      this.initialWidthSettingsSubscription$ = this.gridService.containsInitialWidthSettings.subscribe(hasWidths => {\n        this.initialWidthsAreSet = hasWidths;\n      });\n    }\n   \n    if (!this.hiddenColumnChangesSubscription$) {\n      this.hiddenColumnChangesSubscription$ = this.hiddenColumnChanges.subscribe(\n        (change: IColumnHideChange | null) => {\n\n          if (change) {\n            const relatedHeader: Element | any = this.getRelatedHeader(change.hierarchyColumn.element);\n            relatedHeader.hideColumn = change.hidden;\n            \n\n            if (change.wasTriggeredByThisColumn) {\n              this.updateHiddenColumnIndices();\n              const hideColumnIf: HideColumnIfDirective = (change.hierarchyColumn.element as any).hideColumnIf;\n              hideColumnIf.updateHeadersThatCanHide();\n              \n            }\n\n            if (!change.hidden) {\n              if (change.wasTriggeredByThisColumn) {\n                this.currentClassesToResize = this.getResizableClasses(relatedHeader);\n                const avgWidthPerColumn: number = this.getAverageColumnWidth();\n                this.setMinimumWidths();\n                const totalTableWidth: number = this.viewport!.clientWidth;\n                let newWidth: number = avgWidthPerColumn * this.currentClassesToResize.length;\n                this.currentClassesToResize.forEach(className => {\n                  const classIndex: number = this.gridTemplateClasses.indexOf(className);\n                  if (this.resizeColumnWidthByPercent) {\n                    this.classWidths[classIndex] = (avgWidthPerColumn / totalTableWidth * 100).toString() + '%';\n                    // average all percentages\n                  } else {\n                    this.classWidths[classIndex] = Math.max(avgWidthPerColumn, this.minWidths[classIndex]);\n                  }\n                })\n                \n                if (this.resizeColumnWidthByPercent) {\n                  this.fitWidthsToOneHundredPercent();\n                }\n                \n                this.updateWidths(newWidth);\n              }\n            }        \n            this.setGridOrder(); \n          }   \n      });\n    }\n    if (this.parentGroups.length === 0) {\n      this.setParentGroups(allElementsWithDataResizable);\n    }\n    const maxColumnsPerRow: number = this.parentGroups[this.parentGroups.length - 1].length;\n\n    if (firstEl === undefined || firstEl === null) {\n      const animationFrameID: number = window.requestAnimationFrame((tmstamp) => {\n        ths.onEnterFrame(ths, tmstamp);\n      });\n      this.animationFrameIDs.push(animationFrameID);\n    } else {\n      const keys: any[] = Object.keys(this.initialWidths);\n      if (this.initialWidthsAreSet === true && keys.length < maxColumnsPerRow) {\n        const animationFrameID: number = window.requestAnimationFrame((tmstamp) => {\n          ths.awaitWidths(ths, tmstamp);\n        });\n        this.animationFrameIDs.push(animationFrameID);\n      } else {\n        this.checkForGridInitReady();\n      }\n    }\n  }\n\n  public canHideColumn(column: Element): boolean {\n    return (column as any).hideColumnIf.canHide;\n  }\n\n  public getFlattenedHierarchy(): IColumnHierarchy[] {\n    const hierarchy: any = this.getColumnHierarchy();\n    return hierarchy.columnGroups.reduce((prev: any, curr: any) => {\n      let arr: any[] = [curr];\n      if (curr.subColumns) {\n        arr = arr.concat(this.getSubColumns(curr));\n      }\n      return prev.concat(arr);\n    }, []);\n  }\n\n  private getSubColumns(item: any): any[] {\n    if (item.subColumns.length === 0) {\n      return [];\n    }\n    let arr: any[] = [];\n    for (let i = 0; i < item.subColumns.length; i++) {\n      const subItem: any = item.subColumns[i];\n      arr = arr.concat(subItem);\n      if (subItem.subColumns.length > 0) {\n        arr = arr.concat(this.getSubColumns(subItem));\n      }\n    }\n    \n    return arr;\n  }\n\n  public getColumnHierarchy(): any {\n    const hierarchy: any = {\n      columnGroups: []\n    };\n    const highestLevelGroup: IColumnData[] = this.colDataGroups[0];\n    const hierarchyGroup: IColumnHierarchy[] = highestLevelGroup.map((item: IColumnData) => {\n      let levelCount: number = 0;\n      return {\n        level: levelCount,\n        element: item.child,\n        parent: item.parent,\n        parentColumn: null,\n        subColumns: this.getHierarchySubColumns(item, levelCount)\n      };\n    });\n    hierarchy.columnGroups = hierarchyGroup;\n    return hierarchy;\n  }\n\n  getHierarchySubColumns(item: IColumnData, levelCount: number): IColumnHierarchy[] {\n    levelCount++;\n    if (!item.subGroups || item.subGroups.length === 0) {\n      return [];\n    }\n    const subColumns: IColumnHierarchy[] = item.subGroups.map((subItem: IColumnData) => {\n      return {\n        level: levelCount,\n        element: subItem.child,\n        parent: subItem.parent,\n        parentColumn: item.child,\n        subColumns: this.getHierarchySubColumns(subItem, levelCount)\n      }\n    });\n\n    return subColumns;\n\n  }\n\n  public checkForGridInitReady(): void {\n    const allElementsWithDataResizable: any = this.columnsWithDataClasses;\n    const el = allElementsWithDataResizable[0];\n    const resizeClasses: string[] = this.getResizableClasses(el);\n    const resizeCls: any = resizeClasses[0];\n    const keys: any[] = Object.keys(this.initialWidths);\n    const maxColumnsPerRow: number = this.parentGroups[this.parentGroups.length - 1].length;\n\n    if (this.initialWidthsAreSet === true && (keys.length < maxColumnsPerRow || !this.initialWidths[resizeCls])) {\n      const animationFrameID: number = window.requestAnimationFrame((tmstamp) => {\n        this.awaitWidths(this, tmstamp);\n      });\n      this.animationFrameIDs.push(animationFrameID);\n    } else if (this.initialWidthsAreSet === undefined) {\n      const animationFrameID: number = window.requestAnimationFrame((tmstamp) => {\n        this.awaitWidths(this, tmstamp);\n      });\n      this.animationFrameIDs.push(animationFrameID);\n    } else {\n      if (!this.linkClass) {\n        this.initGrid();\n      } else {\n        const animationFrameID: number = window.requestAnimationFrame((tmstamp) => {\n          this.awaitSingleFrame(this, tmstamp);\n        });\n        this.animationFrameIDs.push(animationFrameID);\n      }\n    }\n  }\n\n  private awaitWidths(ths: any, timestamp: any) {\n    this.checkForGridInitReady();\n  }\n\n  private awaitSingleFrame(ths: any, timestamp: any) {\n    this.initGrid();\n  }\n\n  private onPointerDown(event: any) {\n    \n    this.addPointerListeners();\n\n    if (!this.getResizeGripUnderPoint(event)) {\n      return;\n    }\n    // only drag on left mouse button\n    if (event.button !== 0) { return; }\n    \n    // disables unwanted drag and drop functionality for selected text in browsers\n    this.clearSelection();\n\n    const el: HTMLElement = this.elementRef.nativeElement;\n    let resizeHandles: HTMLElement[];\n\n    if (this.elementRef.nativeElement.reordering) {\n      return;\n    }\n\n    const reorderHandlesUnderPoint: Element[] = this.getReorderHandlesUnderPoint(event);\n    const colsUnderPoint: Element[] = this.getReorderColsUnderPoint(event);\n\n    if (reorderHandlesUnderPoint.length > 0 && colsUnderPoint.length > 0) {\n      this.elementRef.nativeElement.reordering = true;\n      this.draggingColumn = colsUnderPoint[0] as HTMLElement;\n\n      this.columnReorderStart.emit({\n        pointerEvent: event,\n        columnDragged: this.draggingColumn,\n        columnHovered: this.draggingColumn\n      });\n      const customReorderStartEvent = new CustomEvent(ColumnReorderEvent.ON_REORDER_START, {\n        detail: {\n          pointerEvent: event,\n          columnDragged: this.draggingColumn,\n          columnHovered: this.draggingColumn\n        }\n      });\n      this.elementRef.nativeElement.parentElement.dispatchEvent(customReorderStartEvent);\n      const elRect: any = this.draggingColumn.getBoundingClientRect();\n      this.dragOffsetX = (event.pageX - elRect.left) - window.scrollX;\n      this.dragOffsetY = (event.pageY - elRect.top) - window.scrollY;\n\n      this.removeDragAndDropComponent();\n      this.createDragAndDropComponent();\n\n      const dragNDropX = event.pageX - this.dragOffsetX;\n      const dragNDropY = event.pageY - this.dragOffsetY;\n      this.setDragAndDropPosition(dragNDropX, dragNDropY);\n\n      this.attachReorderGhost(this.draggingColumn);\n      this.setReorderHighlightHeight(this.draggingColumn);\n\n      this.lastDraggedOverElement = this.draggingColumn;\n\n      this.parentGroups.forEach((arr, index) => {\n        if (arr.indexOf(this.lastDraggedOverElement) !== -1) {\n          this.lastDraggedGroupIndex = index;\n        }\n      });\n      this.reorderHandleColOffset = (reorderHandlesUnderPoint[0] as HTMLElement).getBoundingClientRect().left - this.draggingColumn.getBoundingClientRect().left;\n      this.lastDraggedGroupBoundingRects = this.parentGroups[this.lastDraggedGroupIndex].map(item => {\n        const boundingRect = item.getBoundingClientRect();\n        const rect: any = {\n          left: (item as HTMLElement).getBoundingClientRect().left + this.getContainerScrollCount(item as HTMLElement),\n          right: boundingRect.right + window.scrollX,\n          top: boundingRect.top,\n          bottom: boundingRect.bottom,\n          width: boundingRect.width,\n          height: boundingRect.height\n        };\n        rect.x = rect.left;\n        rect.y = rect.top;\n        rect.toJSON = {};\n        return rect;\n      });\n    }\n\n    resizeHandles = this.resizableGrips;\n\n    if (resizeHandles.length === 0) {\n      return;\n    }\n\n    // if no handle exists, allow whole row to be resizable\n    if (resizeHandles.length > 0) {\n      const resizableElements: Element[] = document.elementsFromPoint(event.clientX, event.clientY);\n\n      const els: Element[] = resizableElements.filter(item => {\n        let handleItem: Element | null = null;\n        resizeHandles.forEach(resizeHandle => {\n          if (item === resizeHandle) {\n            handleItem = resizeHandle;\n          }\n        });\n        return handleItem !== null;\n      });\n      if (els.length === 0) {\n        return;\n      }\n    }\n\n    this.dragging = true;\n    const elements: Element[] = this.getResizableElements(event);\n    if (elements.length === 0) {\n      return;\n    }\n\n    this.totalComputedMinWidth = 0;\n    this.totalComputedWidth = 0;\n    this.minWidths = [];\n    this.startingWidths = [];\n    this.currentClassesToResize = this.getResizableClasses(elements[0]);\n\n    // disallow resizing the rightmost column with percent sizing\n    if (this.resizeColumnWidthByPercent) {\n      const lastColumnClass: string = this.getLastVisibleColumnClass();\n      if (this.currentClassesToResize.indexOf(lastColumnClass) !== -1) {\n        this.dragging = false;\n      }\n    }    \n\n    this.currentClassesToResize.forEach((className: string) => {\n      const wdth: number = this.getClassWidthInPixels(className);\n      if (!this.columnIsHiddenWithClass(className)) {\n        this.totalComputedWidth += wdth;\n      }\n      this.startingWidths.push(wdth);\n    });\n\n    this.setMinimumWidths();\n\n    this.startX = event.clientX;\n    this.startY = event.clientY;\n\n    this.columnResizeStart.emit({\n      pointerEvent: event,\n      columnWidth: this.totalComputedWidth,\n      columnMinWidth: this.totalComputedMinWidth,\n      classesBeingResized: this.currentClassesToResize\n    });\n    const customResizeStartEvent = new CustomEvent(ColumnResizeEvent.ON_RESIZE_START, {\n      detail: {\n        pointerEvent: event,\n        columnWidth: this.totalComputedWidth,\n        columnMinWidth: this.totalComputedMinWidth,\n        classesBeingResized: this.currentClassesToResize\n      }\n    });\n    this.elementRef.nativeElement.parentElement.dispatchEvent(customResizeStartEvent);\n    // stop interference with reordering columns\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }\n\n  private getClassWidthInPixels(className: string): number {\n    const classIndex: number = this.gridTemplateClasses.indexOf(className);\n    let wdth: string = this.classWidths[classIndex];\n    if (this.resizeColumnWidthByPercent) {\n      wdth = wdth.replace('%', ''); // remove px\n      let totalTableWidth: number = this.viewport!.clientWidth;\n      wdth = (Number(wdth) / 100 * totalTableWidth).toString();\n    }\n    return Number(wdth);\n  }\n\n  private setMinimumWidths(): void {\n    this.gridTemplateClasses.forEach(className => {\n      const firstEl: Element = this.elementRef.nativeElement.querySelector('.' + className);\n      const minWidth: string = window.getComputedStyle(firstEl).getPropertyValue('min-width');\n      let wdth: number = Number(minWidth.substring(0, minWidth.length - 2)); // remove px\n      wdth = Number(wdth) < this.defaultTableMinWidth ? this.defaultTableMinWidth : wdth; // account for minimum TD size in tables\n      if (this.currentClassesToResize.indexOf(className) !== -1 && !this.columnIsHiddenWithClass(className)) {\n        this.totalComputedMinWidth += wdth;\n      }\n      this.minWidths.push(wdth);\n    });\n  }\n\n  private attachReorderGhost(column: HTMLElement): void {\n    this.dragAndDropGhostComponent?.updateView((column as any).reorderGhost, (column as any).reorderGhostContext)\n  }\n\n  private getContainerScrollCount(el: HTMLElement | null): number {\n\n    if (!el) {\n      return 0;\n    }\n    let scrollXCount: number = el.scrollLeft;\n    while (el !== document.body) {\n      el = el!.parentElement;\n      scrollXCount += el!.scrollLeft;\n    }\n\n    // include scrolling on tablejs-grid component\n    scrollXCount += el!.parentElement!.scrollLeft;\n\n    return scrollXCount;\n  }\n\n  private onPointerMove(event: any) {\n    const ths: GridDirective = document['currentGridDirective'];\n\n    if (ths.elementRef.nativeElement.reordering) {\n\n      ths.clearSelection();\n      const dragNDropX = event.pageX - ths.dragOffsetX;\n      const dragNDropY = event.pageY - ths.dragOffsetY;\n      ths.setDragAndDropPosition(dragNDropX, dragNDropY);\n\n      const trueMouseX: number = event.pageX - ths.reorderHandleColOffset + ths.getContainerScrollCount(ths.draggingColumn);\n\n      if (!ths.lastDraggedOverElement) {\n        return;\n      }\n      ths.columnReorder.emit({\n        pointerEvent: event,\n        columnDragged: ths.draggingColumn,\n        columnHovered: ths.lastDraggedOverElement\n      });\n      const customReorderEvent = new CustomEvent(ColumnReorderEvent.ON_REORDER, {\n        detail: {\n          pointerEvent: event,\n          columnDragged: ths.draggingColumn,\n          columnHovered: ths.lastDraggedOverElement\n        }\n      });\n      ths.elementRef.nativeElement.parentElement.dispatchEvent(customReorderEvent);\n\n      let moveDirection: number = 0;\n      let currentRect: ClientRect;\n      let currentColIndex: number | undefined;\n\n      for (const rect of ths.lastDraggedGroupBoundingRects!) {\n\n        if (trueMouseX > rect.left && trueMouseX < rect.left + rect.width) {\n          const elX: number = rect.left;\n          const elW: number = rect.width;\n\n          if ((trueMouseX - elX) >= elW / 2) {\n            moveDirection = 1;\n          } else {\n            moveDirection = 0;\n          }\n          currentRect = rect;\n          currentColIndex = ths.lastDraggedGroupBoundingRects!.indexOf(rect);\n          break;\n        }\n      }\n\n      if (currentColIndex === undefined) {\n        return;\n      }\n      if (ths.lastDraggedOverRect === currentRect! && ths.lastMoveDirection === moveDirection) {\n        return;\n      }\n      ths.lastMoveDirection = moveDirection;\n      ths.lastDraggedOverRect = currentRect!;\n\n      ths.removeElementHighlight(ths.lastDraggedOverElement);\n      ths.removeHighlights(ths.lastDraggedOverElement, moveDirection);\n\n      const draggableInColumn: Element = ths.parentGroups[ths.lastDraggedGroupIndex][currentColIndex];\n\n      ths.lastDraggedOverElement = draggableInColumn;\n\n      let colRangeDraggedParentInd: number = -1;\n      let colRangeDraggedChildInd: number = -1;\n      let colRangeDroppedParentInd: number = -1;\n      let colRangeDroppedChildInd: number = -1;\n      let draggedInd: number = -1;\n      let droppedInd: number = -1;\n      let draggedGroup: IColumnData[] | Element[] | null = null;\n\n      const pGroup: any = ths.colDataGroups.forEach((group: IColumnData[], groupInd: number) =>\n        group.forEach((columnData: IColumnData, index: number) => {\n            const item: Element | null = columnData.child;\n            if (item === ths.getRelatedHeader(ths.draggingColumn as HTMLElement)) {\n              colRangeDraggedParentInd = groupInd;\n              colRangeDraggedChildInd = ths.getRangePosition(columnData); // index;\n              draggedInd = index;\n              draggedGroup = group;\n            }\n            if (item === ths.getRelatedHeader(ths.lastDraggedOverElement as HTMLElement)) {\n              colRangeDroppedParentInd = groupInd;\n              colRangeDroppedChildInd = ths.getRangePosition(columnData); // index;\n              droppedInd = index;\n            }\n        })\n      );\n\n      if (ths.draggingColumn === ths.lastDraggedOverElement) {\n        return;\n      }\n      let parentRanges: number[][] | null = null;\n      const tempRanges: number[][][] = ths.colRangeGroups.concat();\n      let parentRangeIndex: number = -1;\n      tempRanges.sort((a, b) => b.length - a.length);\n      tempRanges.forEach((item, index) => {\n        if (!parentRanges && item.length < draggedGroup!.length) {\n          parentRanges = item;\n          parentRangeIndex = ths.colRangeGroups.indexOf(item);\n        }\n      });\n      const fromOrder: number = (colRangeDraggedChildInd + 1);\n      const toOrder: number = (colRangeDroppedChildInd + 1);\n\n      // if has to stay within ranges, get ranges and swap\n      if (parentRanges !== null) {\n        ths.colRangeGroups[parentRangeIndex].forEach(\n          range => {\n            const lowRange: number = range[0];\n            const highRange: number = range[1];\n            if (fromOrder >= lowRange && fromOrder < highRange && toOrder >= lowRange && toOrder < highRange) {\n              if (colRangeDraggedParentInd === colRangeDroppedParentInd) {\n                if (moveDirection === 1) {\n                  ths.lastDraggedOverElement.classList.add('highlight-right');\n                } else {\n                  ths.lastDraggedOverElement.classList.add('highlight-left');\n                }\n                ths.elementsWithHighlight.push({ el: ths.lastDraggedOverElement, moveDirection });\n              }\n            }\n          }\n        );\n      } else {\n        if (colRangeDraggedParentInd === colRangeDroppedParentInd) {\n          if (moveDirection === 1) {\n            ths.lastDraggedOverElement.classList.add('highlight-right');\n          } else {\n            ths.lastDraggedOverElement.classList.add('highlight-left');\n          }\n          ths.elementsWithHighlight.push({ el: ths.lastDraggedOverElement, moveDirection });\n        }\n      }\n    }\n    \n    if (!ths.dragging) {\n      return;\n    }\n    let mouseOffset: number = Math.round(event.clientX) - Math.round(ths.startX);\n    const widthsNeedUpdating: boolean = Math.round(event.clientX) !== ths.startX;\n    ths.startX = Math.round(event.clientX); // reset starting X\n    let newWidth: number = ths.totalComputedWidth + mouseOffset;\n    const allowableWidthChange: number = newWidth - ths.totalComputedMinWidth;\n\n    if (allowableWidthChange <= 0) {\n      return;\n    }\n\n    if (widthsNeedUpdating) {\n      ths.updateWidths(newWidth);\n    }\n    ths.columnResize.emit({\n      pointerEvent: event,\n      columnWidth: ths.totalComputedWidth,\n      columnMinWidth: ths.totalComputedMinWidth\n    });\n    const customResizeEvent = new CustomEvent(ColumnResizeEvent.ON_RESIZE, {\n      detail: {\n        pointerEvent: event,\n        columnWidth: ths.totalComputedWidth,\n        columnMinWidth: ths.totalComputedMinWidth\n      }\n    });\n    ths.elementRef.nativeElement.parentElement.dispatchEvent(customResizeEvent);\n  }\n\n  private getLastVisibleColumnClass(): string {\n    let highestOrderIndex: number = 0;\n    let lastVisibleColumnClass: string = '';\n\n    this.gridTemplateClasses.forEach(className => {\n      const classNameIndex: number = this.gridTemplateClasses.indexOf(className);\n      const gridOrderIndex: number = this.gridOrder.indexOf(classNameIndex + 1);\n      if (this.hiddenColumnIndices.indexOf(gridOrderIndex + 1) === -1) {\n        if (gridOrderIndex > highestOrderIndex) {\n          highestOrderIndex = gridOrderIndex;\n          lastVisibleColumnClass = className;\n        }\n      }\n    });\n    return lastVisibleColumnClass;\n  }\n\n  private getRangePosition(columnData: IColumnData): number {\n    let subGroups: IColumnData[] = columnData.subGroups;\n    let child: IColumnData = columnData;\n    while (subGroups.length > 0) {\n      child = subGroups[0];\n      subGroups = child.subGroups;\n    }\n    return child.nthChild - 1;\n  }\n\n  private columnIsHiddenWithClass(className: string): boolean {\n    const classNameIndex: number = this.gridTemplateClasses.indexOf(className);\n    const gridOrderIndex: number = this.gridOrder.indexOf(classNameIndex + 1);\n    return this.hiddenColumnIndices.indexOf(gridOrderIndex + 1) !== -1;\n  }\n\n  private getTotalGroupedColumnsVisible(sortableWidths: ISortableWidthItem[]): number {\n    const len: number = sortableWidths.length;\n    let totalGroupedColumnsVisible: number = 0;\n    for (let i = 0; i < len; i++) {\n      const item: any = sortableWidths[i];\n      if (!this.columnIsHiddenWithClass(item.className)) {\n        totalGroupedColumnsVisible++;\n      }\n    }\n    return totalGroupedColumnsVisible;\n  }\n\n  private getFirstGridOrderIndexAfterColumnGroup(sortableWidthGroup: ISortableWidthItem[]): number {\n    let maxIndex: number = -1;\n    sortableWidthGroup.forEach(classItem => {\n      const columnIndx = this.gridTemplateClasses.indexOf(classItem.className);\n      const gridOrderIndex = this.gridOrder.indexOf(columnIndx + 1);\n      if (maxIndex < gridOrderIndex) {\n        maxIndex = gridOrderIndex;\n      }\n    });\n    return maxIndex + 1;\n  }\n\n  // returns a number in percent moved two decimal places over (10.245 is equal to 10.245%)\n  private getPostColumnWidthTotal(startingIndex: number): number {\n    let count: number = 0;\n    for (let i = startingIndex; i < this.gridOrder.length; i++) {\n      const clsIndex = this.gridOrder[i] - 1;\n      let perc: number = Number(this.classWidths[clsIndex].toString().replace('%', ''));\n      if (this.hiddenColumnIndices.indexOf(i + 1) === -1) {\n        count += perc;\n      }\n    }\n    return count;\n  }\n\n  // returns a number in percent moved two decimal places over (10.245 is equal to 10.245%)\n  private getPostColumnMinimumWidthTotal(startingIndex: number): number {\n    let count: number = 0;\n    for (let i = startingIndex; i < this.gridOrder.length; i++) {\n      const clsIndex = this.gridOrder[i] - 1;\n      let perc: number = Number(this.minWidths[clsIndex].toString().replace('%', ''));\n      if (this.hiddenColumnIndices.indexOf(i + 1) === -1) {\n        count += perc;\n      }\n    }\n    return count;\n  }\n\n  // returns a number in percent moved two decimal places over (10.245 is equal to 10.245%)\n  private getPreviousColumnWidthTotal(sortableWidthGroup: ISortableWidthItem[]): number {\n    let count: number = 0;\n    let minIndex = Infinity;\n    sortableWidthGroup.forEach(classItem => {\n      const columnIndx = this.gridTemplateClasses.indexOf(classItem.className);\n      const gridOrderIndex = this.gridOrder.indexOf(columnIndx + 1);\n      if (minIndex > gridOrderIndex) {\n        minIndex = gridOrderIndex;\n      }\n    });\n    for (let i = 0; i < minIndex; i++) {\n      const classIndx: number = this.gridOrder[i] - 1;\n      const wdth: number = Number(this.classWidths[classIndx].toString().replace('%', ''));\n      count += wdth;\n    }\n    return count;\n  }\n\n  private updateWidthsInPercent(newWidth: number, sortableWidths: ISortableWidthItem[], totalGroupedColumnsVisible: number, sortableWidthGroup: ISortableWidthItem[]): void {\n\n    let totalTableWidth: number = this.viewport!.clientWidth;\n    let newWidthInPercent: number = newWidth / totalTableWidth * 100;\n    \n    const classMinWidths: number[] = sortableWidths.map((item: ISortableWidthItem) => item.minWidth);\n    const groupMinWidthCalc: number = classMinWidths.reduce((prev: number, curr: number) => prev + curr);\n    \n    const firstGridOrderIndexAfterColumnGroup: number = this.getFirstGridOrderIndexAfterColumnGroup(sortableWidthGroup);\n    const colsPastMinWidthCalc: number = this.getPostColumnMinimumWidthTotal(firstGridOrderIndexAfterColumnGroup);\n    const colsPastMinWidthInPercent: number = colsPastMinWidthCalc / totalTableWidth * 100;\n    const colsPastWidthPerc: number = this.getPostColumnWidthTotal(firstGridOrderIndexAfterColumnGroup);\n\n    let prevColPercentTotal: number = 0;\n    prevColPercentTotal = this.getPreviousColumnWidthTotal(sortableWidthGroup);\n    const percentMoved: number = (prevColPercentTotal + newWidthInPercent + colsPastWidthPerc) - 100;\n\n    if (prevColPercentTotal + newWidthInPercent + colsPastMinWidthInPercent > 100) {\n      const actualPerCanMove: number = 100 - (prevColPercentTotal + colsPastMinWidthInPercent);\n      newWidthInPercent = actualPerCanMove;\n    }\n    if (newWidth < groupMinWidthCalc) {\n      newWidthInPercent = groupMinWidthCalc / totalTableWidth * 100;\n    }\n\n    sortableWidths.sort((item1: any, item2: any) => {\n      const wdth1: number = item1.width;\n      const wdth2: number = item2.width;\n      if (wdth1 === wdth2) {\n        return 0;\n      }\n      return wdth1 < wdth2 ? -1 : 1;\n    });\n    \n    const mappedGroupWidthsInPixels: number[] = sortableWidths.map(item => item.width);\n    const totalPrevGroupWidths: number = mappedGroupWidthsInPixels.reduce((prev: number, curr: number) => prev + curr);\n    const dispersedPercs: number[] = sortableWidths.map(item => item.width / totalPrevGroupWidths);\n    const totalPercMoved: number = newWidthInPercent - (totalPrevGroupWidths / totalTableWidth * 100);\n\n\n    let additionalPercentFromColumnsToSmall: number = 0;\n    const sortableWidthsLen: number = sortableWidths.length;\n    sortableWidths.forEach((item: ISortableWidthItem, index: number) => {\n      const classIndex: number = this.gridTemplateClasses.indexOf(item.className);\n      const minWidthInPercent: number = this.minWidths[classIndex] / totalTableWidth * 100;\n    \n      let calculatedPercent: number = dispersedPercs[index] * newWidthInPercent;\n      if (calculatedPercent < minWidthInPercent) {\n        additionalPercentFromColumnsToSmall += minWidthInPercent - calculatedPercent;\n        calculatedPercent = minWidthInPercent;\n      } else {\n        const itemsRemaining: number = sortableWidthsLen - index - 1;\n        if (itemsRemaining !== 0) {\n          const extraAmtToRemove: number = additionalPercentFromColumnsToSmall / itemsRemaining;\n          calculatedPercent -= extraAmtToRemove;\n          additionalPercentFromColumnsToSmall -= extraAmtToRemove;\n        }\n      }\n      const colWidthInPercent: string = calculatedPercent.toString() + '%';\n      this.classWidths[classIndex] = colWidthInPercent;\n    });\n\n    let remainingPercToDisperse: number = totalPercMoved + additionalPercentFromColumnsToSmall;\n    const maxPercsCanMovePerCol: any[] = [];\n    for (let i = firstGridOrderIndexAfterColumnGroup; i < this.gridOrder.length; i++) {\n      const clsIndex = this.gridOrder[i] - 1;\n      let perc: number = Number(this.classWidths[clsIndex].toString().replace('%', ''));\n      let minWidthPerc: number =  (this.minWidths[clsIndex] / totalTableWidth * 100);\n      if (this.hiddenColumnIndices.indexOf(i + 1) === -1) {\n        maxPercsCanMovePerCol.push({ \n          moveAmt: percentMoved > 0 ? perc - minWidthPerc : perc,\n          classIndex: clsIndex\n        });\n      }\n    }\n\n    const totalPercsCanMove: number = maxPercsCanMovePerCol.reduce((prev: number, curr: any) => prev + curr.moveAmt, 0.0000001);\n    maxPercsCanMovePerCol.forEach((item: any) => {\n      const percOfTotalMovementAllowed: number = item.moveAmt / totalPercsCanMove;\n      const percOfRemainingDispersement: number = percOfTotalMovementAllowed * remainingPercToDisperse;\n      const perc: number = Number(this.classWidths[item.classIndex].toString().replace('%', ''));\n      const dispersedWidth: number = perc - percOfRemainingDispersement;\n      this.classWidths[item.classIndex] = dispersedWidth + '%';\n    });\n\n    newWidth = newWidthInPercent / 100 * totalTableWidth;\n    let amountMoved: number = newWidth - totalPrevGroupWidths;\n    amountMoved = Math.round(amountMoved * 100) / 100; // round to 2 decimal points\n    this.totalComputedWidth += amountMoved;\n\n    const gridTemplateColumns: string = this.constructGridTemplateColumns();\n    this.gridTemplateTypes.forEach(styleObj => {      \n      styleObj.style.innerHTML = this.id + ' .' + this.reorderableClass + ' { display: grid; grid-template-columns:' + gridTemplateColumns + '; }';\n      this.setStyleContent();\n    });\n   \n  }\n\n  private updateWidthsInPixels(newWidth: number, sortableWidths: ISortableWidthItem[], totalGroupedColumnsVisible: number): void {\n\n    let remainingWidth: number = this.totalComputedWidth - newWidth;\n    \n    sortableWidths.forEach((item: ISortableWidthItem) => {\n      const maxPercOfRemaining: number = 1 / totalGroupedColumnsVisible;\n      let amountMoved: number = 0;\n      const resizeID: string = this.id + ' .' + item.className;\n\n      if (item.width - item.minWidth < maxPercOfRemaining * remainingWidth) {\n        amountMoved = item.width - item.minWidth;\n      } else {\n        amountMoved = maxPercOfRemaining * remainingWidth;\n      }\n      \n      amountMoved = Math.round(amountMoved * 100) / 100; // round to 2 decimal points\n\n      const classIndex: number = this.gridTemplateClasses.indexOf(item.className);\n      this.classWidths[classIndex] = (item.width - amountMoved);\n      \n      const markupItem: any = this.stylesByClass.filter(style => style.id === resizeID)[0];\n      let markup = resizeID + ' { width: ' + (item.width - amountMoved) + 'px }';\n      markupItem.markup = markup;\n      markupItem.width = (item.width - amountMoved).toString();\n\n      this.totalComputedWidth -= amountMoved;\n    });\n\n    const gridTemplateColumns: string = this.constructGridTemplateColumns();\n\n    this.gridTemplateTypes.forEach(styleObj => {\n      styleObj.style.innerHTML = this.id + ' .' + this.reorderableClass + ' { display: grid; grid-template-columns:' + gridTemplateColumns + '; }';\n      this.setStyleContent();\n    });\n  }\n\n  private fitWidthsToOneHundredPercent(): void {\n    const numericalWidths: number[] = this.classWidths.map((wdth: string, index: number) => Number(wdth.replace('%', '')));\n    const widthTotal: number = numericalWidths.reduce((prev: number, wdth: number) => {\n      return prev + wdth;\n    }, 0);\n\n    const scaledWidths: { width: number, index: number }[] = numericalWidths.map((wdth: number, index: number) => {\n      return {\n        width: wdth / widthTotal * 100,\n        index: index\n      }\n    });\n\n    scaledWidths.forEach((item: { width: number, index: number }, index: number) => {\n      this.classWidths[item.index] = scaledWidths[item.index].width.toString() + '%';\n    })\n  }\n\n  private updateWidths(newWidth: number) {\n    const currentWidths: number[] = this.currentClassesToResize.map((resizeClass: string) => {\n      return this.getClassWidthInPixels(resizeClass);\n    });\n\n    const sortableWidths: ISortableWidthItem[] = currentWidths.map((w, index) => {\n      return {\n        minWidth: this.minWidths[index],\n        width: w,\n        className: this.currentClassesToResize[index]\n      }\n    });\n\n    const visibleSortableWidths: ISortableWidthItem[] = sortableWidths.filter(item => {\n      return !this.columnIsHiddenWithClass(item.className);\n    })\n\n    const totalGroupedColumnsVisible: number = this.getTotalGroupedColumnsVisible(visibleSortableWidths);\n\n    if (this.resizeColumnWidthByPercent) {\n      this.updateWidthsInPercent(newWidth, visibleSortableWidths, totalGroupedColumnsVisible, sortableWidths);\n    } else {\n      this.updateWidthsInPixels(newWidth, visibleSortableWidths, totalGroupedColumnsVisible);\n    }\n\n    this.generateWidthStyle();\n  }\n\n  private generateWidthStyle() {\n    let innerHTML = '';\n    this.stylesByClass.forEach(item => {\n      innerHTML += item.markup;\n    });\n    this.widthStyle!.innerHTML = innerHTML;\n    this.setStyleContent();\n  }\n\n  private getResizableClasses(el: Element | any): string[] {\n    return el ? el['dataClasses'] : null;\n  }\n\n  private setResizableStyles() {\n\n    const allElementsWithDataResizable: any = this.columnsWithDataClasses;\n    let el: Element;\n    const classesUsed: string[] = [];\n\n    let fragment: DocumentFragment;\n    let style: HTMLStyleElement;\n    let styleText = '';\n\n    if (this.linkClass === undefined || this.gridService.linkedDirectiveObjs[this.linkClass] === undefined) {\n      fragment = document.createDocumentFragment();\n      style = document.createElement('style');\n      style.type = 'text/css';\n    } else {\n      fragment = this.gridService.linkedDirectiveObjs[this.linkClass].widthStyleFragment;\n      style = this.gridService.linkedDirectiveObjs[this.linkClass].widthStyle;\n    }\n    let markup: string;\n\n    if (this.linkClass === undefined || this.gridService.linkedDirectiveObjs[this.linkClass] === undefined) {\n      for (let i = 0; i < allElementsWithDataResizable.length; i++) {\n        el = allElementsWithDataResizable[i];\n        const resizeClasses: string[] = this.getResizableClasses(el);\n\n        resizeClasses.forEach((resizeCls: any) => {\n          if (classesUsed.indexOf(resizeCls) === -1) {\n            const firstEl: HTMLElement = this.elementRef.nativeElement.getElementsByClassName(resizeCls)[0];\n            const startingWidth = !!this.initialWidths[resizeCls] ? this.initialWidths[resizeCls] : firstEl.offsetWidth;\n            // Override percentage if we have widthPercent enabled\n            const startingWidthPercent = this.initialWidths[resizeCls];\n            const resizeID: string = this.id + ' .' + resizeCls;\n            if (this.resizeColumnWidthByPercent || startingWidth.toString().includes('%')) {\n              markup = resizeID + ' { width: ' + 100 + '%}';\n              this.resizeColumnWidthByPercent = true;\n              this.attachContentResizeSensor();\n            } else {\n              markup = resizeID + ' { width: ' + startingWidth + 'px }';\n            }\n            styleText += markup;\n            this.stylesByClass.push({ style, id: resizeID, resizeClass: resizeCls, markup, width: startingWidth });\n            classesUsed.push(resizeCls);\n          }\n        });\n      }\n    } else {\n      this.stylesByClass = this.gridService.linkedDirectiveObjs[this.linkClass].stylesByClass;\n    }\n\n    if (this.linkClass === undefined || this.gridService.linkedDirectiveObjs[this.linkClass] === undefined) {\n      style.innerHTML = styleText;\n    }\n    fragment.appendChild(style);\n    this.widthStyle = style;\n    this.widthStyleFragment = fragment;\n\n    this.addStyle(style, false);\n\n    if (this.linkClass) {\n      if (this.gridService.linkedDirectiveObjs[this.linkClass] === undefined) {\n        this.gridService.linkedDirectiveObjs[this.linkClass] = {};\n        this.gridService.linkedDirectiveObjs[this.linkClass].gridDirective = this;\n        this.gridService.linkedDirectiveObjs[this.linkClass].stylesByClass = this.stylesByClass;\n      }\n      this.gridService.linkedDirectiveObjs[this.linkClass].widthStyleFragment = fragment;\n      this.gridService.linkedDirectiveObjs[this.linkClass].widthStyle = style;\n    }\n  }\n\n  private addStyle(style: HTMLStyleElement, addToContent: boolean = true): void {\n    if (this.styleList.indexOf(style) === -1) {\n      this.styleList.push(style);\n    }\n\n    if (addToContent) {\n      this.setStyleContent();\n    }\n  }\n\n  private setStyleContent(): void {\n    this.styleContent = '';\n    this.styleList.forEach(style => {\n      this.styleContent += style.innerHTML;\n    });\n    this.headStyle!.innerHTML = this.styleContent;\n  }\n\n  public moveStyleContentToProminent(): void {\n    this.headTag.appendChild(this.headStyle!);\n  }\n\n  private setReorderStyles() {\n    if (this.linkClass === undefined || (this.gridService.linkedDirectiveObjs[this.linkClass] && this.gridService.linkedDirectiveObjs[this.linkClass].reorderHighlightStyle === undefined)) {\n      const fragment: DocumentFragment = document.createDocumentFragment();\n      const style = document.createElement('style');\n      style.type = 'text/css';\n      style.innerHTML = this.id + ' .highlight-left div:after, ' + this.id + ' .highlight-right div:after { height: 200px !important }';\n      fragment.appendChild(style);\n      this.reorderHighlightStyle = style;\n      this.reorderHighlightStyleFragment = fragment;\n\n      this.addStyle(style, false);\n\n      if (this.linkClass) {\n        this.gridService.linkedDirectiveObjs[this.linkClass].reorderHighlightStyle = this.reorderHighlightStyle;\n        this.gridService.linkedDirectiveObjs[this.linkClass].reorderHighlightStyleFragment = this.reorderHighlightStyleFragment;\n      }\n    } else {\n      this.reorderHighlightStyle = this.gridService.linkedDirectiveObjs[this.linkClass].reorderHighlightStyle;\n      this.reorderHighlightStyleFragment = this.gridService.linkedDirectiveObjs[this.linkClass].reorderHighlightStyleFragment;\n    }\n  }\n\n  private getColSpan(element: Element): number {\n    const colSpan: string | null = element.getAttribute('colspan');\n    return colSpan === null ? 1 : Number(colSpan);\n  }\n\n  private validateColumnSpansAreTheSame(colSpans: number[]) {\n\n    if (colSpans.length === 0) {\n      throw Error('No columns appear to exist.');\n    }\n    const colLength: number = colSpans[0];\n    const invalidColLengths: number[] = colSpans.filter(item => item !== colLength);\n    if (invalidColLengths.length > 0) {\n      throw Error('Grid column lengths do not match.  Please check your colspans.');\n    }\n  }\n\n  private onPointerUp(event: any) {\n\n    const ths: GridDirective = document['currentGridDirective'];\n    ths.removePointerListeners();\n    if (ths.elementRef.nativeElement.reordering) {\n\n      ths.elementRef.nativeElement.reordering = false;\n      ths.removeDragAndDropComponent();\n      if (!ths.lastDraggedOverElement) {\n        return;\n      }\n      ths.removeElementHighlight(ths.lastDraggedOverElement);\n      ths.removeHighlights();\n\n      if (ths.reorderGrips.length !== 0) {\n        ths.reorderColumns(event);\n      }\n\n      ths.columnReorderEnd.emit({\n        pointerEvent: event,\n        columnDragged: ths.draggingColumn,\n        columnHovered: ths.lastDraggedOverElement\n      });\n      const customReorderEndEvent = new CustomEvent(ColumnReorderEvent.ON_REORDER_END, {\n        detail: {\n          pointerEvent: event,\n          columnDragged: ths.draggingColumn,\n          columnHovered: ths.lastDraggedOverElement\n        }\n      });\n      ths.elementRef.nativeElement.parentElement.dispatchEvent(customReorderEndEvent);\n      ths.lastDraggedOverElement = null;\n      ths.lastMoveDirection = -1;\n      ths.draggingColumn!.classList.remove('dragging');\n      ths.draggingColumn = null;\n    }\n    if (!ths.dragging) {\n      return;\n    }\n    ths.columnResizeEnd.emit({\n      pointerEvent: event,\n      columnWidth: ths.totalComputedWidth,\n      columnMinWidth: ths.totalComputedMinWidth,\n      classesBeingResized: ths.currentClassesToResize\n    });\n    const customResizeEndEvent = new CustomEvent(ColumnResizeEvent.ON_RESIZE_END, {\n      detail: {\n        pointerEvent: event,\n        columnWidth: ths.totalComputedWidth,\n        columnMinWidth: ths.totalComputedMinWidth,\n        classesBeingResized: ths.currentClassesToResize\n      }\n    });\n    ths.elementRef.nativeElement.parentElement.dispatchEvent(customResizeEndEvent);\n    ths.endDrag(event);\n  }\n\n  private addPointerListeners() {\n    this.document['currentGridDirective'] = this;\n    this.document.addEventListener('pointermove', this.onPointerMove);\n    this.document.addEventListener('pointerup', this.onPointerUp);\n  }\n  private removePointerListeners() {\n    this.document['currentGridDirective'] = null;\n    this.document.removeEventListener('pointermove', this.onPointerMove);\n    this.document.removeEventListener('pointerup', this.onPointerUp);\n  }\n\n  private endDrag(event: any): void {\n    if (!this.dragging) {\n      return;\n    }\n    event.stopPropagation();\n    event.preventDefault();\n    event.stopImmediatePropagation();\n\n    this.totalComputedMinWidth = 0;\n    this.totalComputedWidth = 0;\n    this.currentClassesToResize = [];\n    this.minWidths = [];\n    this.startingWidths = [];\n    this.dragging = false;\n  }\n\n  private initGrid() {\n    if (this.linkClass === undefined || this.gridService.linkedDirectiveObjs[this.linkClass] === undefined) {\n      this.headStyle = document.createElement('style');\n      this.headStyle.type = 'text/css';\n      this.headTag.appendChild(this.headStyle);\n    } else {\n      this.headStyle = this.gridService.linkedDirectiveObjs[this.linkClass].headStyle;\n    }\n\n    this.generateContainerID();\n    this.generateViewportID();\n    this.attachContentResizeSensor();\n    this.setResizableStyles();\n    this.setReorderStyles();\n    this.generateColumnGroups();\n\n    this.setGridTemplateClasses();\n    \n\n    if (this.linkClass !== undefined && this.gridService.linkedDirectiveObjs[this.linkClass].stylesByClass) {\n      this.stylesByClass = this.gridService.linkedDirectiveObjs[this.linkClass].stylesByClass;\n      this.classWidths = this.gridService.linkedDirectiveObjs[this.linkClass].classWidths;\n    }\n    if (this.linkClass !== undefined && this.gridService.linkedDirectiveObjs[this.linkClass].classWidths) {\n      this.classWidths = this.gridService.linkedDirectiveObjs[this.linkClass].classWidths;\n    } else {\n      this.classWidths = this.calculateWidthsFromStyles();\n      if (this.linkClass) {\n        this.gridService.linkedDirectiveObjs[this.linkClass].classWidths = this.classWidths;\n      }\n    }\n\n    this.setGridOrder();\n    this.emitGridInitialization();\n  }\n\n  private setGridTemplateClasses(): void {\n    let ind: number = -1;\n    let highestLen: number = 0;\n    \n    let group: any;\n\n    for (let index = 0; index < this.parentGroups.length; index++) {\n      group = this.parentGroups[index];\n      if (group.length > highestLen) {\n        highestLen = group.length;\n        ind = index;\n      }\n    }\n    \n\n    if (this.parentGroups.length !== 0) {\n      this.parentGroups[ind].forEach((item2, index) => {\n        this.gridTemplateClasses.push(this.getResizableClasses(item2)[0]);\n      });\n    }\n    \n    if (this.linkClass) {\n      if (!this.gridService.linkedDirectiveObjs[this.linkClass].gridTemplateClasses) {\n        this.gridService.linkedDirectiveObjs[this.linkClass].gridTemplateClasses = this.gridTemplateClasses;\n      } else {\n        \n        this.verifyLinkedTemplateClassesMatch();\n      }\n      \n    }\n  }\n\n  private verifyLinkedTemplateClassesMatch(): void {\n    let columnsAreTheSame: boolean = true;\n    this.gridService.linkedDirectiveObjs[this.linkClass!].gridTemplateClasses.forEach((item: any, index: any) => {\n      if (item !== this.gridTemplateClasses[index]) {\n        columnsAreTheSame = false;\n      }\n    });\n    if (!columnsAreTheSame) {\n      throw Error(`Column classes must match for linked tables:\\n\\n ${this.gridService.linkedDirectiveObjs[this.linkClass!].gridTemplateClasses}\\n   does not match\\n ${this.gridTemplateClasses}\\n`);\n    }\n  }\n\n  private calculateWidthsFromStyles(): any[] {\n    if (!this.stylesByClass[0].width.toString().includes('%') && this.classWidths.length === 0 && this.resizeColumnWidthByPercent) {\n      return this.stylesByClass.map((styleObj, index) => {\n        return (Math.round((1 / this.stylesByClass.length) * 10000) / 100).toString() + '%';\n      });\n    } else {\n      return this.stylesByClass.map((styleObj, index) => {\n        if (styleObj.width.toString().includes('%')) {\n          return styleObj.width;\n        } else {\n          return Number(styleObj.width);\n        }\n      });\n    }\n    return [];\n  }\n\n  private emitGridInitialization() {\n    const emitterObj = {\n      gridComponent: this,\n      gridElement: this.elementRef.nativeElement\n    };\n    this.preGridInitialize.emit(emitterObj);\n    this.gridInitialize.emit(emitterObj);\n\n    const customGridInitializedEvent = new CustomEvent(GridEvent.ON_INITIALIZED, {\n      detail: {\n        gridComponent: emitterObj.gridComponent,\n        gridElement: emitterObj.gridComponent,\n        type: GridEvent.ON_INITIALIZED\n      }\n    });\n    this.elementRef.nativeElement.parentElement.dispatchEvent(customGridInitializedEvent);\n  }\n\n  private createDragAndDropComponent() {\n    const componentRef: ComponentRef<any> = this.openModal(DragAndDropGhostComponent, this.DRAG_AND_DROP_GHOST_OVERLAY_DATA, {});\n    this.dragAndDropGhostComponent = componentRef.instance;\n  }\n\n  openModal(\n    componentType: ComponentType<unknown>,\n    token: InjectionToken<any>,\n    data: any, positionStrategy: PositionStrategy | null = null,\n    overlayConfig: OverlayConfig | null = null\n  ): ComponentRef<unknown> {\n\n    if (!positionStrategy) {\n      positionStrategy = this.overlay\n      .position()\n      .global()\n      .centerHorizontally()\n      .centerVertically();\n    }\n   \n    if (!overlayConfig) {\n      overlayConfig = new OverlayConfig({\n        hasBackdrop: true,\n        backdropClass: 'modal-bg',\n        panelClass: 'modal-container',\n        scrollStrategy: this.overlay.scrollStrategies.block(),\n        positionStrategy\n      });\n    }\n\n    this.overlayRef = this.overlay.create(overlayConfig);\n\n    this.injector = this.createInjector(data, token);\n\n    const containerPortal: ComponentPortal<unknown> = new ComponentPortal(componentType, null, this.injector);\n    const containerRef: ComponentRef<unknown> = this.overlayRef.attach(containerPortal);\n\n    return containerRef;\n  }\n\n  private createInjector(dataToPass: any, token: any): Injector {\n    return Injector.create({\n      parent: this.injector,\n      providers: [\n        { provide: token, useValue: dataToPass }\n      ]\n    })\n  }\n\n  private setDragAndDropPosition(x: number, y: number) {\n    this.dragAndDropGhostComponent!.left = x;\n    this.dragAndDropGhostComponent!.top = y;\n  }\n\n  private removeDragAndDropComponent() {\n    if (this.overlayRef) {\n      this.overlayRef.detach();\n    }\n  }\n\n  private setParentGroups(allElementsWithDataResizable: any[]): void {\n    const colSpans: number[] = [];\n    let currSpanCount: number = 0;\n    let lastParent: Element | null = null;\n    let children!: Element[];\n    let columnStart: number = 1;\n    let colRanges: number[][] = [];\n\n    this.colRangeGroups.push(colRanges);\n\n    let item: any;\n    for (let index = 0; index < allElementsWithDataResizable.length; index++) {\n      const item: Element = allElementsWithDataResizable[index];\n      const span: number = this.getColSpan(item);\n      \n      if (item.parentElement !== lastParent) {\n        if (index !== 0) {\n          colSpans.push(currSpanCount);\n          columnStart = 1;\n          colRanges = [];\n          this.colRangeGroups.push(colRanges);\n        }\n        currSpanCount = 0;\n        lastParent = item.parentElement;\n        children = [];\n        this.parentGroups.push(children);\n      }\n      colRanges.push([columnStart, (span + columnStart)]);\n      currSpanCount += span;\n      columnStart += span;\n      children.push(item);\n    }\n\n    colSpans.push(currSpanCount);\n\n    this.validateColumnSpansAreTheSame(colSpans);\n  }\n\n  private generateColumnGroups() {\n    const allElementsWithDataResizable: any = this.columnsWithDataClasses;\n    const arr: Element[] = allElementsWithDataResizable;\n    let colOrder: number = 1;\n    let lastParent: Element | null = null;\n    let lastGroup: IColumnData[] | null = null;\n    let lastOrder: number = 0;\n    let lastIndex: number = 0;\n    let spanCount: number = 0;\n    let colDataGroup: any[] = [];\n\n    this.colDataGroups.push(colDataGroup);\n\n    for (let index = 0; index < arr.length; index++) {\n      const item: Element | null = arr[index];\n\n      if (item.parentElement !== lastParent) {\n        if (index !== 0) {\n          colOrder = 1;\n          lastGroup = colDataGroup;\n          lastOrder = index;\n          lastIndex = 0;\n          colDataGroup = [];\n          this.colDataGroups.push(colDataGroup);\n        }\n        lastParent = item.parentElement;\n      }\n      colOrder = index + 1 - lastOrder;\n\n      if (lastGroup !== null) {\n        if (lastGroup[lastIndex].span < (colOrder - spanCount)) {\n          spanCount += lastGroup[lastIndex].span;\n          lastIndex++;\n        }\n\n      }\n      \n      this.colData = {\n        order: colOrder,\n        lastDataSpan: (colOrder - spanCount),\n        nthChild: colOrder,\n        span: this.getColSpan(item),\n        subGroups: [],\n        parent: item.parentElement as Element,\n        child: item,\n        linkedChildren: [],\n        subColumnLength: 0\n      };\n      colDataGroup.push(this.colData);\n    }\n    \n    let groupsWereSet: boolean = false;\n    if (this.linkClass && this.gridService.linkedDirectiveObjs[this.linkClass].colDataGroups) {\n      this.verifyLinkedGroupStructuresMatch(this.colDataGroups, this.gridService.linkedDirectiveObjs[this.linkClass].colDataGroups);\n      groupsWereSet = true;\n      this.colDataGroups = this.gridService.linkedDirectiveObjs[this.linkClass].colDataGroups;\n      this.colDataGroups = this.gridService.linkedDirectiveObjs[this.linkClass].colDataGroups;\n    }\n\n    \n\n    if (this.linkClass) {\n      this.gridService.linkedDirectiveObjs[this.linkClass].colDataGroups = this.colDataGroups;\n    }\n\n    if (!groupsWereSet) {\n      let columnGroup: any;\n      for (let index = 0, len = this.colDataGroups.length; index < len; index++) {\n        columnGroup = this.colDataGroups[index];\n        if (index < this.colDataGroups.length - 1) {\n          this.generateSubGroup(columnGroup, this.colDataGroups[index + 1]);\n        }\n        if (index === len - 1) {\n          this.orderSubGroups(columnGroup);\n        }\n      }\n    } else {\n      \n      this.setLinkedHeaderContainerClasses();\n      this.setLinkedChildren();\n\n      if (this.gridService.linkedDirectiveObjs[this.linkClass!].subGroupStyleObjs) {\n        this.gridTemplateTypes = this.gridService.linkedDirectiveObjs[this.linkClass!].gridTemplateTypes;\n        this.styleList =  this.gridService.linkedDirectiveObjs[this.linkClass!].styleList;\n        this.subGroupStyleObjs = this.gridService.linkedDirectiveObjs[this.linkClass!].subGroupStyleObjs;\n        this.subGroupStyles = this.gridService.linkedDirectiveObjs[this.linkClass!].subGroupStyles;\n        this.subGroupFragments = this.gridService.linkedDirectiveObjs[this.linkClass!].subGroupFragments;\n        this.gridOrder = this.gridService.linkedDirectiveObjs[this.linkClass!].gridOrder;\n      }\n    }\n  }\n\n  private verifyLinkedGroupStructuresMatch(colDataGroups1: IColumnData[][], colDataGroups2: IColumnData[][]): void {\n    let columnGroupsAreTheSame: boolean = true;\n    if (colDataGroups1.length !== colDataGroups2.length) {\n      columnGroupsAreTheSame = false;\n    }\n    for (let i = 0; i < colDataGroups1.length; i++) {\n      const colDataGroup1: IColumnData[] = colDataGroups1[i];\n      const colDataGroup2: IColumnData[] = colDataGroups2[i];\n      if (colDataGroup1.length !== colDataGroup2.length) {\n        columnGroupsAreTheSame = false;\n      }\n    }\n    if (!columnGroupsAreTheSame) {\n      throw Error(`The header structure for linked tables does not match.\\nPlease check your column spans.`);\n    }\n  }\n\n  private setHiddenClassForAllLinkedParentHeaders(): HTMLElement[] {\n\n    const flattenedHierarchy: IColumnHierarchy[] = this.getFlattenedHierarchy();\n    const flattenedHeirarchyLenMin1: number = flattenedHierarchy.length - 1;\n\n    // start at the end to get the deepest child possible\n    for (let i = flattenedHeirarchyLenMin1; i >= 0; i--) {\n      const columnHierarchy: IColumnHierarchy = flattenedHierarchy[i];\n    }\n\n    const elementsReshown: HTMLElement[] = [];\n    const startIndex: number = this.colDataGroups.length - 2;\n    for (let i = startIndex; i >= 0; i--) {\n      const colDataGroup: IColumnData[] = this.colDataGroups[i];\n      for (let j = 0; j < colDataGroup.length; j++) {\n        const columnData: IColumnData = colDataGroup[j];\n        const parentElement: any = columnData.child as any;\n        const parentWasHidden: boolean = parentElement.hideColumn;\n        let hiddenChildCount: number = 0;\n        for (let k = 0; k < columnData.subGroups.length; k++) {\n          const subGroup: IColumnData = columnData.subGroups[k];\n          if ((subGroup.child as any).hideColumn) {\n            hiddenChildCount++;\n          }\n        }\n        if (columnData.subGroups.length !== 0) {\n          if (!parentWasHidden && hiddenChildCount === columnData.subGroups.length) {\n            parentElement.hideColumn = true;\n            this.setHiddenClassForColumnGroup(columnData.child, colDataGroup[j]);\n          } else if (parentWasHidden && hiddenChildCount < columnData.subGroups.length) {\n            parentElement.hideColumn = false;\n            elementsReshown.push(parentElement);\n          }\n        }\n      }\n    }\n    return elementsReshown;\n  }\n\n  private setHiddenClassForAllLinkedHeaders(element: HTMLElement | any): void {\n    for (let i = 0; i < this.colDataGroups.length; i++) {\n      const colDataGroup: IColumnData[] = this.colDataGroups[i];\n      for (let j = 0; j < colDataGroup.length; j++) {\n        this.setHiddenClassForColumnGroup(element, colDataGroup[j]);\n        \n      }\n    }\n  }\n\n  private setHiddenClassForColumnGroup(element: Element | any, columnGroup: IColumnData): void {\n    const columnData: IColumnData = columnGroup;\n    if (columnData.child === element) {\n      element.classList.remove(this.HIDDEN_COLUMN_CLASS);\n      const hideColumn: boolean = element.hideColumn;\n      if (hideColumn) {\n        element.classList.add(this.HIDDEN_COLUMN_CLASS);\n      }\n      columnData.linkedChildren.forEach((header: Element | any) => {\n        header.hideColumn = hideColumn;\n        header.classList.remove(this.HIDDEN_COLUMN_CLASS);\n        if (hideColumn) {\n          header.classList.add(this.HIDDEN_COLUMN_CLASS);\n        }\n      });\n\n      for (let i = 0; i < columnData.subGroups.length ; i++) {\n        const subGroup: IColumnData = columnData.subGroups[i];\n        (subGroup.child as any).hideColumn = hideColumn;\n        this.setHiddenClassForColumnGroup(subGroup.child, subGroup);\n      }\n    }\n  }\n\n  public getRelatedHeaders(element: Element): (Element | any)[] {\n    if ((element as any).relatedElements) {\n      return (element as any).relatedElements;\n    }\n    let relatedElements: (HTMLElement | any)[] = [];\n    for (let i = 0; i < this.colDataGroups.length; i++) {\n      const colDataGroup: IColumnData[] = this.colDataGroups[i];\n      for (let j = 0; j < colDataGroup.length; j++) {\n        const columnData: IColumnData = colDataGroup[j];\n        if (element === columnData.child || this.getRelatedHeader(element) === columnData.child) {\n          relatedElements.push(columnData.child);\n          columnData.linkedChildren.forEach(child => {\n            relatedElements.push(child);\n          });\n        }      \n      }\n    }\n    return relatedElements;\n  }\n\n  public getRelatedHeader(element: Element):Element | any {\n    if ((element as any).relatedElement) {\n      return (element as any).relatedElement;\n    }\n    let relatedElement: HTMLElement | any = null;\n    for (let i = 0; i < this.colDataGroups.length; i++) {\n      const colDataGroup: IColumnData[] = this.colDataGroups[i];\n      for (let j = 0; j < colDataGroup.length; j++) {\n        const columnData: IColumnData = colDataGroup[j];\n        const filteredChildren: Element[] = columnData.linkedChildren.filter(child => child === element);\n        if (filteredChildren.length > 0) {\n          relatedElement = columnData.child;\n        }\n      }\n    }\n    (element as any).relatedElement = relatedElement ? relatedElement : element;\n    return (element as any).relatedElement;\n  }\n\n  private setLinkedChildren(): void {\n    let dataIndex: number = 0;\n    for (let i = 0; i < this.colDataGroups.length; i++) {\n      const colDataGroup: IColumnData[] = this.colDataGroups[i];\n      for (let j = 0; j < colDataGroup.length; j++) {\n        const columnData: IColumnData = colDataGroup[j];\n        const column: HTMLElement = this.columnsWithDataClasses[dataIndex + j];\n        columnData.linkedChildren.push(column);\n      }\n      dataIndex += colDataGroup.length;\n    }\n  }\n  private setLinkedHeaderContainerClasses(): void {\n    let dataIndex: number = 0;\n    for (let i = 0; i < this.colDataGroups.length; i++) {\n      const colDataGroup: IColumnData[] = this.colDataGroups[i];\n      const column: HTMLElement = this.columnsWithDataClasses[dataIndex];\n      dataIndex += colDataGroup.length;\n      const containerClass = 'column-container-' + i;\n      this.addClassToLinkedHeader(column.parentElement!, containerClass);\n    }\n  }\n\n  private addClassToLinkedHeader(element: Element, cls: string): void {\n    if (!element.classList.contains(cls)) {\n      element.classList.add(cls);\n    }\n  }\n\n  private generateSubGroup(currentGroup: any, subGroup: any): void {\n\n    let indexCount: number = 0;\n    currentGroup.forEach(\n      (group: IColumnData, index: number) => {\n        const classLen: number = (group.child as any).dataClasses.length;\n        let subClassCount: number = 0;\n        let numOfSubColumns: number = 0;\n        while (subClassCount < classLen) {\n          subClassCount += (subGroup[indexCount].child as any).dataClasses.length;\n          group.subGroups.push(subGroup[indexCount]);\n          indexCount++;\n          numOfSubColumns++;\n        }\n        currentGroup[index].subColumnLength = numOfSubColumns;\n      }\n    );\n  }\n\n  private orderSubGroups(columnGroup: IColumnData[], columnPlacement: number = 1, placementStart: number = 0, order: number = 1) {\n    let style: HTMLStyleElement;\n    let containerID: string;\n    let fragment: DocumentFragment;\n    let selector: string;\n\n    if (this.linkClass) {\n      if (this.gridService.linkedDirectiveObjs[this.linkClass].subGroupStyleObjs) {\n        this.headStyle = this.gridService.linkedDirectiveObjs[this.linkClass].headStyle;\n        this.gridTemplateTypes = this.gridService.linkedDirectiveObjs[this.linkClass!].gridTemplateTypes;\n        this.styleList =  this.gridService.linkedDirectiveObjs[this.linkClass].styleList;\n        this.subGroupStyleObjs = this.gridService.linkedDirectiveObjs[this.linkClass].subGroupStyleObjs;\n        this.subGroupStyles = this.gridService.linkedDirectiveObjs[this.linkClass].subGroupStyles;\n        this.subGroupFragments = this.gridService.linkedDirectiveObjs[this.linkClass].subGroupFragments;\n        this.gridOrder = this.gridService.linkedDirectiveObjs[this.linkClass].gridOrder;\n      } else {\n        this.gridService.linkedDirectiveObjs[this.linkClass].headStyle = this.headStyle;\n        this.gridService.linkedDirectiveObjs[this.linkClass!].gridTemplateTypes = this.gridTemplateTypes;\n        this.gridService.linkedDirectiveObjs[this.linkClass].styleList = this.styleList;\n        this.gridService.linkedDirectiveObjs[this.linkClass].subGroupStyleObjs = this.subGroupStyleObjs;\n        this.gridService.linkedDirectiveObjs[this.linkClass].subGroupStyles = this.subGroupStyles;\n        this.gridService.linkedDirectiveObjs[this.linkClass].subGroupFragments = this.subGroupFragments;\n        this.gridService.linkedDirectiveObjs[this.linkClass].gridOrder = this.gridOrder;\n      }\n    }\n\n    placementStart = columnPlacement - 1;\n    columnGroup.sort((columnData1: IColumnData, columnData2: IColumnData) => {\n      return columnData1.order - columnData2.order;\n    });\n\n    columnGroup.forEach((columnData: IColumnData) => {\n      columnData.order = columnPlacement;\n\n      const tagName: string = columnData.child.tagName.toLowerCase();\n\n      containerID = 'column-container-' + Array.from(columnData!.parent!.parentElement!.children).indexOf(columnData.parent);\n      const parentIndex = Array.from(columnData!.parent!.parentElement!.children).indexOf(columnData.parent);\n      \n      this.addClassToLinkedHeader(columnData.parent, containerID);\n      \n      selector = this.id + ' .' + containerID + ' ' + tagName + ':nth-child(' + (columnData.nthChild).toString() + ')';\n      fragment = document.createDocumentFragment();\n\n      if (this.subGroupStyleObjs[selector]) {\n        style = this.subGroupStyleObjs[selector];\n      } else {\n        style = document.createElement('style');\n        style.type = 'text/css';\n        this.subGroupStyles.push(style);\n        this.subGroupFragments.push(fragment);\n      }\n\n      this.setColumnStyle(style, fragment, selector, columnPlacement, columnPlacement + columnData.span, columnData.order);\n      \n      if (this.parentGroups[parentIndex]) {\n        if ((this.parentGroups[parentIndex].length) === (columnData.order)) {\n          this.lastColumns[parentIndex] = columnData;\n        }\n      }\n\n      if (columnData.subGroups.length > 0) {\n        this.orderSubGroups(columnData.subGroups, columnPlacement, placementStart, order++);\n      } else {\n        selector = this.id + ' ' + tagName + ':nth-child(' + (columnData.nthChild).toString() + ')';\n        fragment = document.createDocumentFragment();\n        if (this.subGroupStyleObjs[selector]) {\n          style = this.subGroupStyleObjs[selector];\n        } else {\n          style = document.createElement('style');\n          style.type = 'text/css';\n          this.subGroupStyles.push(style);\n          this.subGroupFragments.push(fragment);\n        }\n\n        this.setColumnStyle(style, fragment, selector, columnPlacement, columnPlacement + columnData.span, columnData.order);\n        \n        this.gridOrder[columnPlacement - 1] = columnData.nthChild;\n\n        const hasSisterTag: boolean = tagName === 'th' || tagName === 'td';\n        let sisterTag: string | null = null;\n        if (hasSisterTag) {\n          sisterTag = tagName === 'th' ? 'td' : 'th';\n\n          selector = this.id + ' ' + sisterTag + ':nth-child(' + (columnData.nthChild).toString() + ')';\n          fragment = document.createDocumentFragment();\n          if (this.subGroupStyleObjs[selector]) {\n            style = this.subGroupStyleObjs[selector];\n          } else {\n            style = document.createElement('style');\n            style.type = 'text/css';\n            this.subGroupStyles.push(style);\n            this.subGroupFragments.push(fragment);\n          }\n          this.setColumnStyle(style, fragment, selector, columnPlacement, columnPlacement + columnData.span, columnData.order);\n        }\n      }\n      columnPlacement += columnData.span;\n    });\n  }\n\n  private setColumnStyle(style: HTMLStyleElement, fragment: DocumentFragment, selector: string, gridStart: number, gridEnd: number, order: number): void {\n    style.innerHTML = selector + ' { grid-column-start: ' + (gridStart).toString() + '; grid-column-end: ' + (gridEnd).toString() + '; order: ' + (order).toString() + '; }';\n    fragment.appendChild(style);\n    this.addStyle(style);\n    this.subGroupStyleObjs[selector] = style;\n  }\n\n  private setGridOrder(): void {\n    const gridTemplateColumns: string = this.constructGridTemplateColumns();\n\n    if (this.colDataGroups[0].length === 0) {\n      return;\n    }\n\n    const reqiresNewStyleObjects: boolean = this.linkClass === undefined || this.gridService.linkedDirectiveObjs[this.linkClass].gridOrderStyles === undefined;\n\n    this.colDataGroups.forEach((columnGroup: IColumnData[], index) => {\n      let style: HTMLStyleElement;\n      let fragment: DocumentFragment;\n\n      const selector: string = this.id + ' .' + this.reorderableClass;\n      let styleAlreadyExisted: boolean = false;      \n\n      if (this.subGroupStyleObjs[selector]) {\n        style = this.subGroupStyleObjs[selector];\n        styleAlreadyExisted = true;\n      } else if (reqiresNewStyleObjects) {\n        fragment = document.createDocumentFragment();\n        style = document.createElement('style');\n        style.type = 'text/css';\n        fragment.appendChild(style);\n      } else {\n        fragment = this.gridService.linkedDirectiveObjs[this.linkClass!].gridOrderFragments[index];\n        style = this.gridService.linkedDirectiveObjs[this.linkClass!].gridOrderStyles[index];\n        fragment.appendChild(style);\n      }\n      style.innerHTML = selector + ' { display: grid; grid-template-columns: ' + gridTemplateColumns + '; }';\n\n      \n      if (!this.subGroupStyleObjs[selector] && reqiresNewStyleObjects) {\n        this.gridOrderStyles.push(style);\n        this.gridOrderFragments.push(fragment!);\n      }\n\n      this.subGroupStyleObjs[selector] = style;\n      \n      this.addStyle(style);\n      if (!styleAlreadyExisted) {\n        this.moveStyleContentToProminent();\n        this.gridTemplateTypes.push({ style });\n      }\n\n      if (index === 0) {\n        this.orderSubGroups(columnGroup);\n      }\n    });\n\n    if (this.linkClass && this.gridService.linkedDirectiveObjs[this.linkClass].gridOrderStyles === undefined) {\n      this.gridService.linkedDirectiveObjs[this.linkClass].gridOrderFragments = this.gridOrderFragments;\n      this.gridService.linkedDirectiveObjs[this.linkClass].gridOrderStyles = this.gridOrderStyles;\n    }\n  }\n\n  private getOffset(el: HTMLElement) {\n    const rect = el.getBoundingClientRect();\n    return {\n      left: rect.left + window.scrollX,\n      top: rect.top + window.scrollY\n    };\n  }\n\n  private getParentTablejsGridDirective(el: HTMLElement | null): HTMLElement | null {\n    while (el !== null && el.getAttribute('tablejsGrid') === null) {\n      el = el.parentElement;\n    }\n    return el;\n  }\n\n  private elementRefUnderPoint(event: any): boolean {\n    const elements: Element[] = document.elementsFromPoint(event.clientX, event.clientY);\n    return elements.filter(item => item === this.elementRef.nativeElement).length > 0;\n  }\n\n  private getResizeGripUnderPoint(event: any): Element[] {\n    const resizableElements: Element[] = document.elementsFromPoint(event.clientX, event.clientY);\n    const elements: Element[] = resizableElements.filter(item => {\n      return item.getAttribute('resizableGrip') !== null;\n    });\n    return elements;\n  }\n\n  private getReorderColsUnderPoint(event: any): Element[] {\n    const reorderColElements: Element[] = document.elementsFromPoint(event.clientX, event.clientY);\n    const elements: Element[] = reorderColElements.filter(item => {\n      return item.getAttribute('reorderCol') !== null;\n    });\n    return elements;\n  }\n\n  private getReorderHandlesUnderPoint(event: any): Element[] {\n    const reorderGripElements: Element[] = document.elementsFromPoint(event.clientX, event.clientY);\n    const elements: Element[] = reorderGripElements.filter(item => {\n      return item.getAttribute('reorderGrip') !== null;\n    });\n    return elements;\n  }\n\n  private getResizableElements(event: any): Element[] {\n    const resizableElements = document.elementsFromPoint(event.clientX, event.clientY);\n    let elements: Element[] = resizableElements.filter(item => {\n      return item.getAttribute('tablejsDataColClasses') !== null;\n    });\n\n    const noElementsFound: boolean = elements.length === 0;\n    const iterationLen: number = noElementsFound ? 1 : elements.length;\n\n    for (let i: number = 0; i < iterationLen; i++) {\n      const item = resizableElements[0];\n      let parentElement: Element | null = item.parentElement;\n      while(parentElement !== null) {\n        const foundGripParent: boolean = !noElementsFound && parentElement === elements[i];\n        const foundParentWithColClasses: boolean = noElementsFound && parentElement.getAttribute('tablejsDataColClasses') !== null;\n        if (foundGripParent || foundParentWithColClasses) {\n          elements = [parentElement];\n          parentElement = null;\n        } else {\n          parentElement = parentElement!.parentElement;\n        }\n      }\n    }\n    return elements;\n  }\n\n  public removeHighlights(elToExclude: HTMLElement | null = null, moveDirection: number = -2): void {\n    this.elementsWithHighlight.forEach(item => {\n      if (item.el !== elToExclude || item.moveDirection !== moveDirection) {\n        this.removeElementHighlight(item.el);\n      }\n    });\n  }\n\n  public removeElementHighlight(el: HTMLElement) {\n    el.classList.remove('highlight-left');\n    el.classList.remove('highlight-right');\n  }\n\n  private reorderColumns(event: any) {\n    const draggableElement: HTMLElement = this.lastDraggedOverElement;\n    const elRect: any = draggableElement.getBoundingClientRect();\n    const elX: number = elRect.left;\n    const elW: number = elRect.width;\n\n    this.removeElementHighlight(draggableElement);\n    if (this.draggingColumn === draggableElement) {\n      return;\n    }\n    let moveDirection: number = 0;\n    if ((event.clientX - elX) >= elW / 2) {\n      moveDirection = 1;\n    } else {\n      moveDirection = 0;\n    }\n\n    let colRangeDraggedParentInd: number = -1;\n    let colRangeDraggedChildInd: number = -1;\n    let colRangeDroppedParentInd: number = -1;\n    let colRangeDroppedChildInd: number = -1;\n    let draggedInd: number = -1;\n    let droppedInd: number = -1;\n    let draggedGroup: Element[] | null = null;\n\n    const pGroup: any = this.parentGroups.forEach((group, groupInd) =>\n      group.forEach(\n        (item, index) => {\n          if (item === this.draggingColumn) {\n            colRangeDraggedParentInd = groupInd;\n            colRangeDraggedChildInd = index;\n            draggedInd = index;\n            draggedGroup = group;\n          }\n          if (item === draggableElement) {\n            colRangeDroppedParentInd = groupInd;\n            colRangeDroppedChildInd = index;\n            droppedInd = index;\n          }\n        }\n      )\n    );\n\n    let parentRanges: number[][] | null = null;\n    const tempRanges: number[][][] = this.colRangeGroups.concat();\n    let parentRangeIndex: number = -1;\n    tempRanges.sort((a, b) => b.length - a.length);\n    tempRanges.forEach((item, index) => {\n      if (!parentRanges && item.length < draggedGroup!.length) {\n        parentRanges = item;\n        parentRangeIndex = this.colRangeGroups.indexOf(item);\n      }\n    });\n    const fromOrder: number = (colRangeDraggedChildInd + 1);\n    const toOrder: number = (colRangeDroppedChildInd + 1);\n\n    // if has to stay within ranges, get ranges and swap\n    if (parentRangeIndex === this.colRangeGroups.length - 1) {\n      this.colRangeGroups[parentRangeIndex].forEach(\n        range => {\n          const lowRange: number = range[0];\n          const highRange: number = range[1];\n          if (fromOrder >= lowRange && fromOrder < highRange && toOrder >= lowRange && toOrder < highRange) {\n            const data1: IColumnData = this.colDataGroups[colRangeDraggedParentInd].filter(item => item.nthChild === fromOrder)[0];\n            const data2: IColumnData = this.colDataGroups[colRangeDraggedParentInd].filter(item => item.nthChild === toOrder)[0];\n            const rangeGroup: IColumnData[] = this.colDataGroups[colRangeDraggedParentInd].slice(range[0] - 1, range[1] - 1);\n            rangeGroup.sort((item1: IColumnData, item2: IColumnData) => {\n              return item1.order - item2.order;\n            });\n            rangeGroup.splice(rangeGroup.indexOf(data1), 1);\n            rangeGroup.splice(rangeGroup.indexOf(data2) + moveDirection, 0, data1);\n            rangeGroup.forEach((item, index) => {\n              item.order = index + 1;\n            });\n          }\n        }\n      );\n    } else {\n      const data1: IColumnData = this.colDataGroups[colRangeDraggedParentInd].filter(item => item.nthChild === fromOrder)[0];\n      const data2: IColumnData = this.colDataGroups[colRangeDraggedParentInd].filter(item => item.nthChild === toOrder)[0];\n      const rangeGroup: IColumnData[] = this.colDataGroups[colRangeDraggedParentInd].concat();\n      rangeGroup.sort((item1: IColumnData, item2: IColumnData) => {\n        return item1.order - item2.order;\n      });\n      rangeGroup.splice(rangeGroup.indexOf(data1), 1);\n      rangeGroup.splice(rangeGroup.indexOf(data2) + moveDirection, 0, data1);\n      rangeGroup.forEach((item, index) => {\n        item.order = index + 1;\n      });\n    }\n    \n    this.setGridOrder();\n\n    // need to set a class to resize - default to first so column widths are updated\n    const firstItemWidth: number = this.getFirstVisibleItemWidth();\n    this.setMinimumWidths();\n\n    // update widths by first item\n    this.totalComputedWidth = firstItemWidth;\n    this.updateWidths(firstItemWidth);\n  }\n\n  private getAverageColumnWidth(): number {\n    let totalTableWidth: number = this.viewport!.clientWidth;\n    return totalTableWidth / this.classWidths.length;\n  }\n\n  private getFirstVisibleItemWidth(): number {\n    let firstVisibleItemIndex: number = 0;\n    for (let i = 0; i < this.gridOrder.length; i++) {\n      const classIndex = this.gridOrder[i] - 1;\n      if (!this.columnIsHiddenWithClass(this.gridTemplateClasses[classIndex])) {\n        firstVisibleItemIndex = i;\n        break;\n      }\n    }\n    this.currentClassesToResize = [this.stylesByClass[this.gridOrder[firstVisibleItemIndex] - 1].resizeClass];\n    return this.currentClassesToResize.map((resizeClass: string) => {\n      return this.getClassWidthInPixels(resizeClass);\n    })[0];\n  }\n\n  private setLinkedColumnIndicesFromMaster(): void {\n    if (this.linkClass) {\n      this.hiddenColumnIndices = this.gridService.linkedDirectiveObjs[this.linkClass].gridDirective.hiddenColumnIndices;\n    }\n  }\n\n  private updateMasterColumnIndices(): void {\n    if (this.linkClass) {\n      this.gridService.linkedDirectiveObjs[this.linkClass].gridDirective.hiddenColumnIndices = this.hiddenColumnIndices;\n    }\n  }\n\n  private updateHiddenColumnIndices(): void {\n    this.setLinkedColumnIndicesFromMaster();\n    this.hiddenColumnIndices = this.getHiddenColumnIndices();\n    this.updateMasterColumnIndices();\n  }\n\n  private constructGridTemplateColumns(): string {\n    this.updateHiddenColumnIndices();\n\n    this.resizeMakeUpPercent = 0;\n    this.resizeMakeUpPerColPercent = 0;\n    let remainingCols: number = this.gridOrder.length - this.hiddenColumnIndices.length;\n    this.hiddenColumnIndices.forEach((index) => {\n      const classWidthIndex: number = this.gridOrder[index - 1];\n      const amt: string = this.classWidths[classWidthIndex - 1].toString();\n      if (amt.includes('%')) {\n        this.resizeMakeUpPercent += Number(amt.replace('%', ''));\n      }\n      \n    });\n    if (this.resizeMakeUpPercent !== 0) {\n      this.resizeMakeUpPerColPercent =this.resizeMakeUpPercent / remainingCols;\n    }\n\n    let str: string = '';\n    this.gridOrder.forEach((order, index) => {\n      let wdth: number = Number(this.classWidths[order - 1].toString().replace('%', ''));\n      wdth = wdth < 0 ? 0 : wdth;\n      if (this.classWidths[order - 1].toString().includes('%')) {\n        if (this.hiddenColumnIndices.indexOf(index + 1) !== -1) {\n          str += ' 0%';\n          this.classWidths[order - 1] = '0%';\n        } else {\n          str += ' ' + (wdth + this.resizeMakeUpPerColPercent).toString() + '%';\n          this.classWidths[order - 1] = (wdth + this.resizeMakeUpPerColPercent).toString() + '%';\n        }    \n      } else {\n        if (this.hiddenColumnIndices.indexOf(index + 1) !== -1) {\n          str += ' 0px';\n        } else {\n          str += ' ' + wdth.toString() + 'px';\n        }\n      }\n\n    });\n    return str;\n\n  }\n\n  private getHiddenColumnIndices(): number[] {\n    const hiddenColumnIndices: number[] = [];\n    this.colDataGroups.forEach((columnGroup: IColumnData[], index) => {\n      if (index === 0) {\n        this.orderSubCols(hiddenColumnIndices, columnGroup);\n      }\n    });\n\n    return hiddenColumnIndices;\n  }\n\n  private orderSubCols(arr: number[], columnGroup: IColumnData[], columnPlacement: number = 1, placementStart: number = 0, parentIsHidden: boolean = false) {\n    placementStart = columnPlacement - 1;\n\n    columnGroup.sort((columnData1: IColumnData, columnData2: IColumnData) => {\n      return columnData1.order - columnData2.order;\n    });\n\n    columnGroup.forEach(columnData => {\n\n      const startIndex: number = columnPlacement;\n      const columnElement: Element | any = this.getRelatedHeader(columnData.child);\n      const hasSubGroups: boolean = columnData.subGroups.length > 0;\n\n      if ((columnElement.hideColumn || parentIsHidden) && !hasSubGroups && arr.indexOf(startIndex) === -1) {\n        arr.push(startIndex);\n      }\n\n      if (hasSubGroups) {\n        this.orderSubCols(arr, columnData.subGroups, columnPlacement, placementStart, columnElement.hideColumn);\n      }\n      columnPlacement += columnData.span;\n    });\n  }\n\n  private setReorderHighlightHeight(draggableElement: HTMLElement) {\n    const draggableTop: number = this.getOffset(draggableElement).top;\n    const containerTop: number = this.getOffset(this.elementRef.nativeElement).top;\n    const containerHeightStr: string = window.getComputedStyle(this.elementRef.nativeElement).getPropertyValue('height');\n    const containerHeight: number = Number(containerHeightStr.substr(0, containerHeightStr.length - 2));\n    const highlightHeight: number = containerHeight - (draggableTop - containerTop) - 1;\n\n    this.reorderHighlightStyle!.innerHTML = this.id + ' .highlight-left div:after, ' + this.id + ' .highlight-right div:after { height: ' + highlightHeight + 'px !important }';\n    this.setStyleContent();\n  }\n\n  private retrieveOrCreateElementID(el: HTMLElement, hasLinkClass: boolean = false): string {\n    let id: string | undefined | null = document.body.getAttribute('id');\n    if (id === undefined || id === null) {\n      id = 'tablejs-body-id';\n    }\n    document.body.setAttribute('id', id);\n    const someID: string = hasLinkClass ? '' : this.generateGridID(el);\n    return '#' + id + someID;\n  }\n\n  private generateGridID(el: HTMLElement) {\n      let gridID: string | null = el.getAttribute('id');\n      if (gridID === null) {\n        let i: number = 0;\n        while (document.getElementById('grid-id-' + i.toString()) !== null) {\n          i++;\n        }\n        gridID = 'grid-id-' + i.toString();\n        el.classList.add(gridID);\n        el.setAttribute('id', gridID);\n      }\n\n      return ' .' + gridID; // ' #' + gridID;\n  }\n\n  private generateContainerID() {\n    TablejsGridProxy.GRID_COUNT++;\n    const hasLinkClass: boolean = this.linkClass !== undefined;\n    if (!hasLinkClass) {\n      this.id = this.retrieveOrCreateElementID(this.elementRef.nativeElement);\n    } else {\n      this.id = '.' + this.linkClass;\n    }\n    const parentGridID: HTMLElement | null = this.getParentTablejsGridDirective(this.elementRef.nativeElement.parentElement);\n\n    if (parentGridID !== null) {\n      this.id = this.retrieveOrCreateElementID(parentGridID, hasLinkClass) + ' ' + this.id;\n    }\n  }\n\n  private generateViewportID() {\n    const viewports: HTMLElement[] = this.infiniteScrollViewports;\n    if (viewports.length > 0) {\n      this.viewport = viewports[0];\n      this.viewportID = this.viewport.getAttribute('id');\n      let i: number = 0;\n      while (document.getElementById('scroll-viewport-id-' + i.toString()) !== null) {\n        i++;\n      }\n      this.viewportID = 'scroll-viewport-id-' + i.toString();\n      this.viewport.setAttribute('id', this.viewportID);\n    }\n  }\n\n  private attachContentResizeSensor(): void {\n    if (this.resizeColumnWidthByPercent) {\n      if (this.viewport === undefined || this.viewport === null) {\n        throw Error('A viewport has not be declared.  Try adding the tablejsViewport directive to your tbody tag.');\n      }\n      if (!this.contentResizeSensor) {\n        this.contentResizeSensor = new ResizeSensor(this.viewport.firstElementChild!, () => {\n          this.setScrollbarAdjustmentStyle();\n        });\n        this.scrollbarAdjustmentFragment = document.createDocumentFragment();\n        this.scrollbarAdjustmentStyle = document.createElement('style');\n        this.setScrollbarAdjustmentStyle();\n        this.scrollbarAdjustmentFragment.appendChild(this.scrollbarAdjustmentStyle);\n  \n        this.addStyle(this.scrollbarAdjustmentStyle, false);\n      }\n\n    }\n  }\n  \n  private setScrollbarAdjustmentStyle(): void {\n    this.scrollbarWidth = this.viewport!.offsetWidth - this.viewport!.clientWidth;\n    this.scrollbarAdjustmentStyle!.innerHTML = '#' + this.viewportID + ' .reorderable-table-row { margin-right: -' + this.scrollbarWidth + 'px; }';\n    this.setStyleContent();\n  }\n\n  private clearSelection() {\n    if (window.getSelection) {\n      const selection: Selection | null = window.getSelection();\n      if (selection) {\n        selection.removeAllRanges();\n      }\n    } else if (this.document['selection']) {\n      this.document['selection'].empty();\n    }\n  }\n\n  private addResizableGrip(el: HTMLElement, fromMutation: boolean = false) {\n    if (fromMutation && !this.isCustomElement) {\n      this.mutationResizableGrips.push(el);\n    } else {\n      this.resizableGrips.push(el);\n    }\n  }\n\n  private addResizableColumn(el: HTMLElement, fromMutation: boolean = false) {\n    if (fromMutation && !this.isCustomElement) {\n      this.mutationResizableColumns.push(el);\n    } else {\n      this.resizableColumns.push(el);\n    }\n  }\n\n  private addReorderGrip(el: HTMLElement, fromMutation: boolean = false) {\n    if (fromMutation && !this.isCustomElement) {\n      this.mutationReorderGrips.push(el);\n    } else {\n      this.reorderGrips.push(el);\n    }\n  }\n\n  private addReorderableColumn(el: HTMLElement, fromMutation: boolean = false) {\n    if (fromMutation && !this.isCustomElement) {\n      this.mutationReorderableColumns.push(el);\n    } else {\n      this.reorderableColumns.push(el);\n    }\n  }\n\n  private addColumnsWithDataClasses(el: HTMLElement, fromMutation: boolean = false) {\n    if (fromMutation && !this.isCustomElement) {\n      this.mutationColumnsWithDataClasses.push(el);\n    } else {\n      this.columnsWithDataClasses.push(el);\n    }\n  }\n\n  private addRow(el: HTMLElement, fromMutation: boolean = false) {\n    if (fromMutation && !this.isCustomElement) {\n      this.mutationRows.push(el);\n    } else {\n      this.rows.push(el);\n    }\n  }\n\n  private addInfiniteScrollViewport(el: HTMLElement, fromMutation: boolean = false) {\n    if (fromMutation && !this.isCustomElement) {\n      this.mutationInfiniteScrollViewports.push(el);\n    } else {\n      this.infiniteScrollViewports.push(el);\n    }\n  }\n\n  private removeStylesFromHead() {\n    this.styleList = [];\n    if (this.headTag.contains(this.headStyle)) {\n      this.headTag.removeChild(this.headStyle!);\n      this.headStyle = null;\n    }\n    if (this.widthStyleFragment && this.widthStyleFragment.contains(this.widthStyle)) {\n      this.widthStyleFragment!.removeChild(this.widthStyle!);\n      this.widthStyleFragment = null;\n      this.widthStyle = null;\n    }\n    if (this.reorderHighlightStyleFragment && this.reorderHighlightStyleFragment.contains(this.reorderHighlightStyle)) {\n      this.reorderHighlightStyleFragment.removeChild(this.reorderHighlightStyle!);\n      this.reorderHighlightStyleFragment = null;\n      this.reorderHighlightStyle = null;\n    }\n    for (let i = 0, len = this.subGroupFragments.length; i < len; i++) {\n      if (this.subGroupFragments[i] && (this.subGroupFragments[i] as DocumentFragment).contains(this.subGroupStyles[i])) {\n        (this.subGroupFragments[i] as DocumentFragment).removeChild(this.subGroupStyles[i]!);\n        this.subGroupFragments[i] = null;\n        this.subGroupStyles[i] = null;\n      }\n    }\n    for (let i = 0, len = this.gridOrderFragments.length; i < len; i++) {\n      if (this.gridOrderFragments[i] && (this.gridOrderFragments[i] as DocumentFragment).contains(this.gridOrderStyles[i])) {\n        (this.gridOrderFragments[i] as DocumentFragment).removeChild(this.gridOrderStyles[i]!);\n        this.gridOrderFragments[i] = null;\n        this.gridOrderStyles[i] = null;\n      }\n    }\n  }\n\n  public ngOnDestroy() {\n\n    this.removePointerListeners();\n    if (this.observer) {\n      this.observer.disconnect();\n      this.observer = null;\n    }\n    \n    if (this.linkClass === undefined) {\n      this.removeStylesFromHead();\n    }\n    if (this.initialWidthSettingsSubscription$) {\n      this.initialWidthSettingsSubscription$.unsubscribe();\n    }\n    if (this.hiddenColumnChangesSubscription$) {\n      this.hiddenColumnChangesSubscription$.unsubscribe();\n    }\n\n    for (let i = 0; i < this.animationFrameIDs.length; i++) {\n      const id: number = this.animationFrameIDs[i];\n      window.cancelAnimationFrame(id);\n    }\n\n    if (this.document['selection']) {\n      this.document['selection'].empty();\n    }\n    if (document['currentGridDirective'] === this) {\n      document['currentGridDirective'] = null;\n    }\n    if (this.document['hasPointerDownListener']) {\n      this.document.removeEventListener('pointerdown', this.pointerListenerFunc);\n      this.document['hasPointerDownListener'] = false;\n    }\n    if (this.elementRef.nativeElement.gridDirective === this) {\n      this.elementRef.nativeElement.gridDirective = null;\n    }\n    if (this.elementRef.nativeElement.parentElement.gridDirective === this) {\n      this.elementRef.nativeElement.parentElement.gridDirective = null;\n    };\n    if (this.elementRef.nativeElement.directive === this) {\n      this.elementRef.nativeElement.directive = null;\n    }\n    if (this.contentResizeSensor) {\n      this.contentResizeSensor.detach();\n      this.contentResizeSensor = null;\n    }\n    if (this.linkClass) {\n      this.gridTemplateTypes = [];\n      this.styleList = [];\n      this.subGroupStyleObjs = null;\n      this.subGroupStyles = [];\n      this.subGroupFragments = [];\n      this.gridOrder = [];\n    }\n    this.widthStyle = null;\n    this.gridOrderStyles = [];\n    this.gridOrderFragments = [];\n    this.scrollbarAdjustmentFragment = null;\n    this.scrollbarAdjustmentStyle = null;\n\n    this.stylesByClass = [];\n    this.currentClassesToResize = [];\n    this.startingWidths = [];\n    this.minWidths = [];\n    this.resizableGrips = [];\n    this.resizableColumns = [];\n    this.reorderGrips = [];\n    this.reorderableColumns = [];\n    this.columnsWithDataClasses = [];\n    this.rows = [];\n    this.infiniteScrollViewports = [];\n\n\n    this.gridTemplateClasses = [];\n    this.gridOrder = [];\n    this.classWidths = [];\n    this.gridTemplateTypes = [];\n    this.draggingColumn = null;\n    this.colRangeGroups = [];\n    this.lastDraggedOverElement = null;\n    this.mutationResizableColumns = [];\n    this.mutationResizableGrips = [];\n    this.mutationReorderGrips = [];\n    this.mutationReorderableColumns = [];\n    this.mutationColumnsWithDataClasses = [];\n    this.mutationRows = [];\n    this.mutationInfiniteScrollViewports = [];\n\n    this.headStyle = null;\n    this.styleList = [];\n    this.initialWidths = [];\n    this.lastColumns = [];\n\n    this.pointerListenerFunc = null;\n\n    this.parentGroups = [];\n\n    this.colData = null;\n    this.colDataGroups = [];\n    this.elementsWithHighlight = [];\n  }\n\n}\n\nexport interface ISortableWidthItem {\n  minWidth: number;\n  width: number;\n  className: string;\n}\n","import { AfterViewInit, Directive, ElementRef } from '@angular/core';\nimport { GridService } from './../../services/grid/grid.service';\n\n@Directive({\n  selector: '[tablejsGridRow], [tablejsgridrow], [tablejs-grid-row]',\n  host: { class: 'reorderable-table-row' }\n})\n\nexport class GridRowDirective implements AfterViewInit {\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) {\n  }\n\n  ngAfterViewInit() {\n    this.registerRowsOnGridDirective();\n  }\n\n  registerRowsOnGridDirective() {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null && el['gridDirective']) {\n      el['gridDirective'].addRow(this.elementRef.nativeElement);\n    }\n  }\n\n}\n","import { AfterViewInit, Directive, ElementRef } from '@angular/core';\nimport { GridService } from './../../services/grid/grid.service';\n\n@Directive({\n  selector: '[tablejsResizableGrip], [resizableGrip], [resizablegrip]'\n})\nexport class ResizableGripDirective implements AfterViewInit {\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) {\n  }\n\n  ngAfterViewInit() {\n    this.registerGripOnGridDirective();\n  }\n\n  registerGripOnGridDirective() {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null && el['gridDirective']) {\n      el['gridDirective'].addResizableGrip(this.elementRef.nativeElement);\n    }\n  }\n\n}\n","import { AfterViewInit, Directive, ElementRef } from '@angular/core';\nimport { GridService } from './../../services/grid/grid.service';\n\n@Directive({\n  selector: `[tablejsInfiniteScroll], [tablejsinfinitescroll], [tablejs-infinite-scroll],\n  [tablejsViewport], [tablejsviewport], [tablejs-viewport]`,\n  host: { class: 'tablejs-infinite-scroll-viewport tablejs-table-width' }\n})\nexport class InfiniteScrollDirective implements AfterViewInit {\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) {\n  }\n\n  ngAfterViewInit() {\n    this.registerColumnOnGridDirective();\n  }\n\n  registerColumnOnGridDirective() {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null && el['gridDirective']) {\n      el['gridDirective'].addInfiniteScrollViewport(this.elementRef.nativeElement);\n    }\n  }\n\n}\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { GridDirective } from './../../directives/grid/grid.directive';\nimport { ColumnReorderEvent } from './../../shared/classes/events/column-reorder-event';\nimport { ColumnResizeEvent } from './../../shared/classes/events/column-resize-event';\nimport { GridEvent } from './../../shared/classes/events/grid-event';\n\n@Component({\n  selector: 'tablejs-grid',\n  templateUrl: './grid.component.html',\n  styleUrls: ['./grid.component.scss'],\n  encapsulation: ViewEncapsulation.None\n})\nexport class GridComponent implements OnInit {\n\n  @Input() linkClass: string | undefined = undefined;\n  @Input() resizeColumnWidthByPercent: boolean = false;\n\n  @Output() columnResizeStart: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnResize: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnResizeEnd: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnReorder: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnReorderStart: EventEmitter<any> = new EventEmitter<any>();\n  @Output() columnReorderEnd: EventEmitter<any> = new EventEmitter<any>();\n  @Output() gridInitialize: EventEmitter<any> = new EventEmitter<any>();\n\n  public get gridDirective(): GridDirective {\n    return this.elementRef.nativeElement.gridDirective;\n  }\n\n  constructor(public elementRef: ElementRef) { }\n\n  ngOnInit() {\n    if (this.linkClass !== undefined) {\n      this.elementRef.nativeElement.classList.add(this.linkClass);\n    }\n  }\n\n  columnResizeStarted(e: ColumnResizeEvent): void {\n    e.type = ColumnResizeEvent.ON_RESIZE_START;\n    this.columnResizeStart.emit(e);\n  }\n  columnResized(e: ColumnResizeEvent): void {\n    e.type = ColumnResizeEvent.ON_RESIZE;\n    this.columnResize.emit(e);\n  }\n  columnResizeEnded(e: ColumnResizeEvent): void {\n    e.type = ColumnResizeEvent.ON_RESIZE_END;\n    this.columnResizeEnd.emit(e);\n  }\n\n  columnReorderStarted(e: ColumnReorderEvent): void {\n    e.type = ColumnReorderEvent.ON_REORDER_START;\n    this.columnReorderStart.emit(e);\n  }\n  columnReordered(e: ColumnReorderEvent): void {\n    e.type = ColumnReorderEvent.ON_REORDER;\n    this.columnReorder.emit(e);\n  }\n  columnReorderEnded(e: ColumnReorderEvent): void {\n    e.type = ColumnReorderEvent.ON_REORDER_END;\n    this.columnReorderEnd.emit(e);\n  }\n\n  gridInitialized(e: GridEvent): void {\n    e.type = GridEvent.ON_INITIALIZED;\n    this.gridInitialize.emit(e);\n  }\n\n}\n","<div tablejsGrid class=\"grid-component\" [linkClass]=\"linkClass\" [resizeColumnWidthByPercent]=\"resizeColumnWidthByPercent\"\n(columnResizeStart)=\"columnResizeStarted($event)\"\n(columnResize)=\"columnResized($event)\"\n(columnResizeEnd)=\"columnResizeEnded($event)\"\n(columnReorderStart)=\"columnReorderStarted($event)\"\n(columnReorder)=\"columnReordered($event)\"\n(columnReorderEnd)=\"columnReorderEnded($event)\"\n(gridInitialize)=\"gridInitialized($event)\"\n>\n\n\t<ng-content></ng-content>\n</div>\n","import { AfterViewInit, Directive, ElementRef, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { AbstractControl, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';\n\n@Directive({\n  selector: '[tablejsEditableCell], [tablejseditablecell], [tablejs-editable-cell]',\n  host: { class: 'tablejs-editable-cell' }\n})\nexport class EditableCellDirective implements AfterViewInit, OnInit, OnDestroy {\n\n  @Input('tablejsEditableCell') initialData: any; // initial data is an object\n  @Input() validator: Function | null = null;\n  @Input() validatorParams: any[] = [];\n  @Input() regExp: string | null = null;\n  @Input() regExpFlags: string = 'gi';\n  @Input() list: string[] = [];\n  @Output() cellInput: EventEmitter<any> = new EventEmitter<any>();\n  @Output() cellFocusOut: EventEmitter<any> = new EventEmitter<any>();\n  @Output() cellValidation: EventEmitter<boolean> = new EventEmitter<boolean>();\n  containerDiv: HTMLDivElement;\n  input: HTMLInputElement;\n  dataList: HTMLDataListElement;\n  option: HTMLOptionElement | null = null;\n  lastText: string | null = null;\n  originalText: string | null = null;\n  lastValidInput: string | null = null;\n  onFocusOut: any;\n  inputListener: any;\n  hasInputListener: boolean = false;\n\n  constructor(private elementRef: ElementRef) {\n    this.containerDiv = document.createElement('div');\n    this.input = document.createElement('input'); // Create an <input> node\n    this.input.type = 'text';\n\n    this.dataList = document.createElement('datalist');\n  }\n\n  @HostListener('document:keydown.enter', ['$event']) onKeyDownHandler(event: KeyboardEvent) {\n    if (document.activeElement === this.input) {\n      this.input.blur();\n      this.input.removeEventListener('focusout', this.onFocusOut);\n    }\n  }\n\n  @HostListener('click', ['$event']) onClick(event: MouseEvent) {\n    let hasInput: boolean = false;\n    if (this.elementRef.nativeElement.children) {\n      for (let i = 0; i < this.elementRef.nativeElement.children.length; i++) {\n        if (this.elementRef.nativeElement.children[i] === this.containerDiv) {\n          hasInput = true;\n        }\n      }\n    }\n    if (!hasInput) {\n      this.input.value = this.elementRef.nativeElement.innerText;\n      this.lastText = this.input.value;\n      this.originalText = this.elementRef.nativeElement.innerText;\n      this.elementRef.nativeElement.appendChild(this.containerDiv);\n      this.containerDiv.appendChild(this.input);\n\n      if (this.list.length > 0) {\n        this.createDataList();\n      }\n\n      this.validateInput();\n      this.input.focus();\n      this.onFocusOut = () => {\n        if (this.elementRef.nativeElement.contains(this.containerDiv)) {\n          this.elementRef.nativeElement.removeChild(this.containerDiv);\n        }\n        this.cellInput.emit(this.getCellObject());\n        this.cellFocusOut.emit(this.getCellObject());\n        this.input.removeEventListener('focusout', this.onFocusOut);\n      };\n      this.input.addEventListener('focusout', this.onFocusOut);\n    }\n    this.cellInput.emit(this.getCellObject());\n  }\n\n  createDataList() {\n    let count: number = 0;\n    let id: string = 'data-list-' + count.toString();\n    while (document.getElementById(id) !== null && document.getElementById(id) !== undefined) {\n      count++;\n      id = 'data-list-' + count.toString();\n    }\n    this.dataList.setAttribute('id', id);\n    this.elementRef.nativeElement.appendChild(this.containerDiv);\n    this.containerDiv.appendChild(this.dataList);\n    this.list.forEach(value => {\n      const filteredDataList: any[] = Array.from(this.dataList.options).filter(option => option.value === value);\n      if (filteredDataList.length === 0) {\n        this.option = document.createElement('option');\n        this.dataList.appendChild(this.option);\n        this.option.value = value;\n      }\n    });\n    this.input.setAttribute('list', id);\n  }\n\n  ngOnInit() {\n    this.input.value = this.elementRef.nativeElement.innerText;\n  }\n\n  ngAfterViewInit() {\n    this.input.value = this.elementRef.nativeElement.innerText;\n    this.lastText = this.input.value;\n    this.inputListener = () => { \n      if (this.regExp) {\n        const regEx: RegExp = new RegExp(this.regExp, this.regExpFlags);\n        if (regEx.test(this.input.value)) {\n          this.validateInput();\n          this.lastText = this.input.value;\n          this.cellInput.emit(this.getCellObject());\n        } else {\n          this.input.value = this.lastText!;\n        }\n      } else {\n        this.validateInput();\n        this.cellInput.emit(this.getCellObject());\n      }\n    };\n    this.input.addEventListener('input', this.inputListener);\n    this.hasInputListener = true;\n  }\n\n  getCellObject(): any {\n    return {\n      currentValue: this.input.value,\n      lastValidInput: this.lastValidInput,\n      originalValue: this.originalText,\n      inputHasFocus: document.activeElement === this.input\n    };\n  }\n\n  validateInput() {\n    const validationOk: boolean = this.validator ? this.validator.apply(null, [this.input.value].concat(this.validatorParams)) : true;\n    if (validationOk) {\n      this.input.classList.remove('error');\n      this.lastValidInput = this.input.value;\n    } else {\n      this.input.classList.add('error');\n    }\n    this.cellValidation.emit(validationOk);\n  }\n\n  ngOnDestroy(): void {\n    if (this.hasInputListener) {\n      this.input.removeEventListener('input', this.inputListener);\n      this.hasInputListener = false;\n    }\n  }\n\n}\n","import { AfterViewInit, Directive, ElementRef } from '@angular/core';\nimport { GridService } from './../../services/grid/grid.service';\n\n@Directive({\n  selector: '[reorderGrip]'\n})\nexport class ReorderGripDirective implements AfterViewInit {\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) { }\n\n  ngAfterViewInit() {\n    this.registerGripOnGridDirective();\n  }\n\n  registerGripOnGridDirective() {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null && el['gridDirective']) {\n      el['gridDirective'].addReorderGrip(this.elementRef.nativeElement);\n    }\n  }\n\n}\n","import { AfterViewInit, Directive, ElementRef, Input, TemplateRef, OnDestroy } from '@angular/core';\nimport { GridService } from './../../services/grid/grid.service';\n\n@Directive({\n  selector: '[reorderCol], [reordercol]'\n})\nexport class ReorderColDirective implements AfterViewInit, OnDestroy {\n\n  @Input() public reorderGhost: TemplateRef<any> | null = null;\n  @Input() public reorderGhostContext: Object | null = null;\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) {\n  }\n\n  ngAfterViewInit() {\n    this.registerColumnOnGridDirective();\n  }\n\n  registerColumnOnGridDirective() {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null) {\n      this.elementRef.nativeElement.reorderGhost = this.reorderGhost;\n      this.elementRef.nativeElement.reorderGhostContext = this.reorderGhostContext;\n      el['gridDirective'].addReorderableColumn(this.elementRef.nativeElement);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.elementRef.nativeElement.reorderGhost = null;\n    this.elementRef.nativeElement.reorderGhostContext = null;\n    this.reorderGhost = null;\n    this.reorderGhostContext = null;\n  }\n\n}\n","import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core';\nimport { GridService } from './../../services/grid/grid.service';\n\n@Directive({\n  selector: '[tablejsDataColClasses], [tablejsdatacolclasses], [tablejs-data-col-classes]'\n})\nexport class DataColClassesDirective implements AfterViewInit {\n\n  @Input() tablejsDataColClasses: string = '';\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) { }\n\n  ngAfterViewInit() {\n    this.cacheClassesOnElement();\n    this.registerColumnsWithDataClassesOnGridDirective();\n  }\n\n  cacheClassesOnElement() {\n    if (this.tablejsDataColClasses) {\n      this.elementRef.nativeElement.setAttribute(\n        'tablejsDataColClasses',\n        this.tablejsDataColClasses\n      );\n    }\n    this.elementRef.nativeElement.dataClasses = this.elementRef.nativeElement.getAttribute('tablejsDataColClasses').replace(new RegExp(' ', 'g'), '').split(',');\n  }\n\n  registerColumnsWithDataClassesOnGridDirective() {\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null) {\n      el['gridDirective'].addColumnsWithDataClasses(this.elementRef.nativeElement);\n    }\n  }\n\n}\n","import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from '@angular/core';\nimport { GridService } from './../../services/grid/grid.service';\n\n@Directive({\n  selector: '[tablejsDataColClass], [tablejsdatacolclass], [tablejs-data-col-class]'\n})\nexport class DataColClassDirective implements AfterViewInit, OnDestroy {\n\n  @Input() tablejsDataColClass: string | undefined | null = '';\n  @Input() initialWidth: string | undefined | null;\n\n  public timeoutID: any;\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) { }\n\n  ngAfterViewInit() {\n    if (this.tablejsDataColClass !== '') {\n      this.elementRef.nativeElement.classList.add(this.tablejsDataColClass);\n      this.elementRef.nativeElement.setAttribute(\n        'tablejsDataColClass',\n        this.tablejsDataColClass\n      );\n      if (this.initialWidth) {\n        this.elementRef.nativeElement.setAttribute(\n          'initialWidth',\n          this.initialWidth\n        );\n      }\n    } else {\n      throw Error('A class name must be supplied to the tablejsDataColClass directive.');\n    }\n    clearTimeout(this.timeoutID);\n    this.timeoutID = setTimeout(() => {\n      this.registerInitialColumnWidthOnGridDirective();\n    }, 1);\n  }\n\n  registerInitialColumnWidthOnGridDirective() {\n    if (this.initialWidth === undefined) {\n      this.gridService.triggerHasInitialWidths(false);\n      console.log('[Performance Alert] Add an initialWidth value on the tablejsDataColClass directive for a significant performance boost.');\n      return;\n    }\n\n    this.gridService.triggerHasInitialWidths(true);\n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null && el['gridDirective']) {\n      el['gridDirective'].initialWidths[this.tablejsDataColClass!] = this.initialWidth;\n    }\n  }\n\n  ngOnDestroy(): void {\n    clearTimeout(this.timeoutID);\n  }\n}\n","import { Directive, ElementRef, Input, OnDestroy } from '@angular/core';\nimport { IColumnHierarchy } from '../../shared/interfaces/i-column-hierarchy';\nimport { GridService } from './../../services/grid/grid.service';\nimport { GridDirective } from './../grid/grid.directive';\n\n@Directive({\n  selector: '[tablejsHideColumnIf], [tablejshidecolumnif], [tablejs-hide-column-if]'\n})\nexport class HideColumnIfDirective implements OnDestroy {\n\n  private _hideColumn: boolean | undefined | null = false;\n  private gridDirective: GridDirective | undefined;\n  public HIDDEN_COLUMN_CLASS: string = 'column-is-hidden';\n  public showOffspringLimited: boolean = false;\n  public changeTriggeredBy: IColumnHierarchy | null = null;\n  public canHide: boolean = true;\n\n  @Input() public set tablejsHideColumnIf(hide: boolean | undefined | null) {\n    \n    const wasLimited: boolean = this.showOffspringLimited;\n    const wasTriggeredBy: IColumnHierarchy | null = this.changeTriggeredBy;\n\n    this.showOffspringLimited = false;\n    this.changeTriggeredBy = null;\n    \n    const el: HTMLElement | any | null = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement);\n    if (el !== null) {\n      this.gridDirective = el['gridDirective'];\n\n      const columnVisibilityChanged: boolean = this._hideColumn !== hide;\n      if (!columnVisibilityChanged) {\n        this.gridDirective!.hiddenColumnChanges.next(null);\n        return;\n      }\n\n      this._hideColumn = hide;\n\n      const flattenedColumnHierarchy = this.gridDirective!.getFlattenedHierarchy();\n      const currentColumnHierarchy: IColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n        return hierarchy.element === this.gridDirective!.getRelatedHeader(this.elementRef.nativeElement);\n      })[0];\n\n      if (!wasTriggeredBy) {\n        this.changeTriggeredBy = currentColumnHierarchy;\n      }\n\n      if (hide) {\n        \n        const lowestLevelColHierarchiesVisible: IColumnHierarchy[] = this.getLowestLevelColumnHierarchiesVisible(flattenedColumnHierarchy);\n\n        const allLowestLevelColumnsHidden: boolean = lowestLevelColHierarchiesVisible.length === 0;\n        if (allLowestLevelColumnsHidden || this.allColumnsShareTheSameAncestor(currentColumnHierarchy, lowestLevelColHierarchiesVisible, flattenedColumnHierarchy)) {\n          this._hideColumn = false;\n          this.gridDirective!.hiddenColumnChanges.next(null);\n          return;\n        }\n        \n        this.gridDirective!.getRelatedHeaders(this.elementRef.nativeElement).forEach((element: HTMLElement) => {\n          element.classList.add(this.HIDDEN_COLUMN_CLASS);\n        });\n        \n        this.hideAllOffspring(currentColumnHierarchy);\n        if (this.allSiblingsAreHidden(currentColumnHierarchy, flattenedColumnHierarchy)) {\n          this.setAllAncestors(currentColumnHierarchy, flattenedColumnHierarchy, true);\n        }\n      } else {\n        this.gridDirective!.getRelatedHeaders(this.elementRef.nativeElement).forEach((element: HTMLElement) => {\n          element.classList.remove(this.HIDDEN_COLUMN_CLASS);\n        });\n\n        this.setAllAncestors(currentColumnHierarchy, flattenedColumnHierarchy, false);\n        if (!wasLimited) {\n          this.showAllOffspring(currentColumnHierarchy);\n        }\n      }\n\n     \n      const triggerHierarchy: IColumnHierarchy | null = !wasTriggeredBy ? currentColumnHierarchy : null;\n      this.changeTriggeredBy = null;\n      this.gridDirective!.hiddenColumnChanges.next({ hierarchyColumn: currentColumnHierarchy, wasTriggeredByThisColumn: triggerHierarchy !== null, hidden: this._hideColumn === true });\n    }\n  }\n  public get tablejsHideColumnIf(): boolean | undefined | null {\n    return this._hideColumn;\n  }\n\n  getVisibleSiblingsByColumn(hierarchyList: IColumnHierarchy[], level: number): IColumnHierarchy[] {\n    const visibleSiblings: IColumnHierarchy[] = hierarchyList.filter((hierarchy: IColumnHierarchy) => {\n      return hierarchy.level === level && (hierarchy.element as any).hideColumnIf.tablejsHideColumnIf === false;\n    });\n    return visibleSiblings;\n  }\n\n  public updateHeadersThatCanHide(): void {\n    const flattenedColumnHierarchy: IColumnHierarchy[] = this.gridDirective!.getFlattenedHierarchy();\n    for (let i = 0; i < flattenedColumnHierarchy.length; i++) {\n      const columnHierarchy: IColumnHierarchy = flattenedColumnHierarchy[i];\n      const element: any = columnHierarchy.element as any;\n      const hideColumnIf: HideColumnIfDirective = element.hideColumnIf;\n      hideColumnIf.canHide = true;\n    }\n    let visibleSiblings: IColumnHierarchy[] = this.getVisibleSiblingsByColumn(flattenedColumnHierarchy, 0);\n\n    if (visibleSiblings.length === 1) {\n      let solitarySibling: IColumnHierarchy | null = visibleSiblings[0];\n      (solitarySibling.element as any).hideColumnIf.canHide = false;\n      let subColumns: IColumnHierarchy[] =  solitarySibling.subColumns;\n      let count: number = 0;\n      while (solitarySibling && subColumns.length !== 0) {\n          visibleSiblings = this.getVisibleSiblingsByColumn(subColumns, ++count);\n          solitarySibling = visibleSiblings.length === 1 ? visibleSiblings[0] : null;\n          if (solitarySibling) {\n            (solitarySibling.element as any).hideColumnIf.canHide = false;\n            subColumns = solitarySibling.subColumns;\n          }\n      }\n    }\n  }\n\n  public getLowestLevelColumnHierarchiesVisible(flattenedColumnHierarchy: IColumnHierarchy[]): IColumnHierarchy[] {\n\n    const lowestLevelColHierarchiesVisible: IColumnHierarchy[] = [];\n    const sortedByLevelColumnHierarchy: IColumnHierarchy[] = flattenedColumnHierarchy.concat().sort((colHier1: IColumnHierarchy, colHier2: IColumnHierarchy) => {\n      return colHier2.level - colHier1.level;\n    });\n\n    const baseLevel: number = sortedByLevelColumnHierarchy[0].level;\n    \n    for (let i = 0; i < sortedByLevelColumnHierarchy.length; i++) {\n      const hierarchy: IColumnHierarchy = sortedByLevelColumnHierarchy[i];\n      if (hierarchy.level !== baseLevel) {\n        break;\n      }\n      if (!(hierarchy.element as any).hideColumnIf.tablejsHideColumnIf) {\n        lowestLevelColHierarchiesVisible.push(hierarchy);\n      }\n    }\n\n    return lowestLevelColHierarchiesVisible;\n  }\n\n  public allColumnsShareTheSameAncestor(commonAncestor: IColumnHierarchy, columnHierarchies: IColumnHierarchy[], flattenedColumnHierarchy: IColumnHierarchy[]): boolean {\n\n    const hierarchiesWithCommonAncestor: IColumnHierarchy[] = [];\n    for (let i = 0; i < columnHierarchies.length; i++) {\n      const currentColumnHierarchy: IColumnHierarchy = columnHierarchies[i];\n      let parentColumnHierarchy: IColumnHierarchy | null = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n        return hierarchy.element === currentColumnHierarchy.parentColumn;\n      })[0];\n\n      while (parentColumnHierarchy) {\n        if (parentColumnHierarchy === commonAncestor) {\n          hierarchiesWithCommonAncestor.push(currentColumnHierarchy);\n          break;\n        }\n\n        const columnHierarchy: IColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n          return hierarchy.element === parentColumnHierarchy!.element;\n        })[0];\n        \n        parentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n          return hierarchy.element === columnHierarchy.parentColumn;\n        })[0];\n      }\n    }\n    return columnHierarchies.length === hierarchiesWithCommonAncestor.length;\n  }\n\n  public hideAllOffspring(columnHierarchy: IColumnHierarchy): void {\n    for (let i = 0; i < columnHierarchy.subColumns.length; i++) {\n      const child: any = this.gridDirective!.getRelatedHeader(columnHierarchy.subColumns[i].element);\n      child.hideColumnIf.changeTriggeredBy = columnHierarchy;\n      child.hideColumnIf.tablejsHideColumnIf = true;\n    }\n  }\n\n  public showAllOffspring(columnHierarchy: IColumnHierarchy): void {\n    for (let i = 0; i < columnHierarchy.subColumns.length; i++) {\n      const child: any = this.gridDirective!.getRelatedHeader(columnHierarchy.subColumns[i].element);\n      child.hideColumnIf.changeTriggeredBy = columnHierarchy;\n      child.hideColumnIf.tablejsHideColumnIf = false;\n      child.hideColumnIf.canHide = true;\n    }\n  }\n\n  public allSiblingsAreHidden(columnHierarchy: IColumnHierarchy, flattenedColumnHierarchy: IColumnHierarchy[]): boolean {\n    let parentColumnHierarchy: IColumnHierarchy | null = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n      return hierarchy.element === columnHierarchy.parentColumn;\n    })[0];\n\n    let hiddenSiblingCount: number = 0;\n    let totalSiblings: number;\n\n    if (parentColumnHierarchy) {\n      totalSiblings = parentColumnHierarchy.subColumns.length;\n      parentColumnHierarchy.subColumns.forEach((subColumn: IColumnHierarchy) => {\n        if (this.gridDirective!.getRelatedHeader(subColumn.element).hideColumnIf.tablejsHideColumnIf) {\n          hiddenSiblingCount++;\n        }\n      });\n    } else {\n      const topLevelSiblings: IColumnHierarchy[] = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n        return hierarchy.level === 0;\n      });\n      totalSiblings = topLevelSiblings.length;\n      for (let i = 0; i < topLevelSiblings.length; i++) {\n        const topLevelSibling: IColumnHierarchy = topLevelSiblings[i];\n        if (this.gridDirective!.getRelatedHeader(topLevelSibling.element).hideColumnIf.tablejsHideColumnIf) {\n          hiddenSiblingCount++;\n        }\n      }\n    }\n    return hiddenSiblingCount === totalSiblings;\n  }\n\n  public setAllAncestors(currentColumnHierarchy: IColumnHierarchy, flattenedColumnHierarchy: IColumnHierarchy[], hidden: boolean): void {\n    let parentColumnHierarchy: IColumnHierarchy | null = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n      return hierarchy.element === currentColumnHierarchy.parentColumn;\n    })[0];\n\n    const allSiblingsHidden: boolean = this.allSiblingsAreHidden(currentColumnHierarchy, flattenedColumnHierarchy);\n    let parentSiblingsAreAllHidden: boolean = hidden ? allSiblingsHidden : true;\n\n    while (parentColumnHierarchy && parentSiblingsAreAllHidden) {\n      const parentElement: any = parentColumnHierarchy.element as any;\n\n      parentElement.hideColumnIf.changeTriggeredBy = currentColumnHierarchy;\n      parentElement.hideColumnIf.showOffspringLimited = true;\n      parentElement.hideColumnIf.tablejsHideColumnIf = hidden;\n      parentElement.hideColumnIf.canHide = true;\n      \n\n      const columnHierarchy: IColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n        return hierarchy.element === parentColumnHierarchy!.element;\n      })[0];\n      \n      parentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy: IColumnHierarchy) => {\n        return hierarchy.element === columnHierarchy.parentColumn;\n      })[0];    \n    }\n  }\n\n  constructor(public elementRef: ElementRef, public gridService: GridService) { \n   this.elementRef.nativeElement.hideColumnIf = this;\n  }\n\n  ngOnDestroy(): void {\n    this.elementRef.nativeElement.hideColumnIf = null;\n  }\n\n}\n","import { ElementRef, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { HorizResizeGripComponent } from './components/horiz-resize-grip/horiz-resize-grip.component';\nimport { ReorderGripComponent } from './components/reorder-grip/reorder-grip.component';\nimport { GridDirective } from './directives/grid/grid.directive';\nimport { GridRowDirective } from './directives/grid-row/grid-row.directive';\nimport { ResizableGripDirective } from './directives/resizable-grip/resizable-grip.directive';\nimport { InfiniteScrollDirective } from './directives/infinite-scroll/infinite-scroll.directive';\nimport { GridComponent } from './components/grid/grid.component';\nimport { EditableCellDirective } from './directives/editable-cell/editable-cell.directive';\nimport { DragAndDropGhostComponent } from './components/drag-and-drop-ghost/drag-and-drop-ghost.component';\nimport { ScrollPrevSpacerComponent } from './components/scroll-prev-spacer/scroll-prev-spacer.component';\n\nimport { GridService } from './services/grid/grid.service';\nimport { OperatingSystemService } from './services/operating-system/operating-system.service';\nimport { DirectiveRegistrationService } from './services/directive-registration/directive-registration.service';\nimport { ScrollDispatcherService } from './services/scroll-dispatcher/scroll-dispatcher.service';\n\nimport { ReorderGripDirective } from './directives/reorder-grip/reorder-grip.directive';\nimport { ReorderColDirective } from './directives/reorder-col/reorder-col.directive';\nimport { DataColClassesDirective } from './directives/data-col-classes/data-col-classes.directive';\nimport { DataColClassDirective } from './directives/data-col-class/data-col-class.directive';\nimport { VirtualForDirective } from './directives/virtual-for/virtual-for.directive';\nimport { ScrollViewportDirective } from './directives/scroll-viewport/scroll-viewport.directive';\nimport { HideColumnIfDirective } from './directives/hide-column-if/hide-column-if.directive';\n\n@NgModule({\n  entryComponents: [\n    DragAndDropGhostComponent,\n    ScrollPrevSpacerComponent\n  ],\n  declarations: [\n    GridDirective,\n    GridRowDirective,\n    ResizableGripDirective,\n    InfiniteScrollDirective,\n    HorizResizeGripComponent,\n    ReorderGripComponent,\n    GridComponent,\n    EditableCellDirective,\n    DragAndDropGhostComponent,\n    ReorderGripDirective,\n    ReorderColDirective,\n    DataColClassesDirective,\n    DataColClassDirective,\n    VirtualForDirective,\n    ScrollViewportDirective,\n    ScrollPrevSpacerComponent,\n    HideColumnIfDirective\n  ],\n  imports: [\n    CommonModule\n  ],\n  providers: [\n    GridService,\n    OperatingSystemService,\n    DirectiveRegistrationService,\n    ScrollDispatcherService\n  ],\n  exports: [\n    GridDirective,\n    GridRowDirective,\n    ResizableGripDirective,\n    InfiniteScrollDirective,\n    HorizResizeGripComponent,\n    ReorderGripComponent,\n    GridComponent,\n    EditableCellDirective,\n    DragAndDropGhostComponent,\n    ReorderGripDirective,\n    ReorderColDirective,\n    DataColClassesDirective,\n    DataColClassDirective,\n    VirtualForDirective,\n    ScrollViewportDirective,\n    HideColumnIfDirective\n  ],\n  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\n})\nexport class TablejsModule { }\n","import { FilterSortService } from './../services/filter-sort.service';\nimport { IFilterOptions } from './../options/i-filter-options';\nimport { ISortOptions } from './../options/i-sort-options';\n\nexport class Comparator {\n  public static filterSortService: FilterSortService | null = null;\n\n  public static getCurrentSortOptions(): ISortOptions | null {\n    return Comparator.filterSortService!.currentSortOptions;\n  }\n\n  public static getCurrentFilterOptions(): IFilterOptions | null {\n    return Comparator.filterSortService!.currentFilterOptions;\n  }\n\n  public static isString(val: any): boolean {\n    return typeof val === 'string' || val instanceof String;\n  }\n}\n","export namespace SortDirection {\n  export type DESCENDING = -1;\n  export const DESCENDING: number | DESCENDING = -1;\n\n  export type NONE = 0;\n  export const NONE: number | NONE = 0;\n\n  export type ASCENDING = 1;\n  export const ASCENDING: number | ASCENDING = 1;\n}\n","import { Injectable } from '@angular/core';\nimport { ISortOptions } from './../options/i-sort-options';\nimport { SortOptions } from './../options/sort-options';\nimport { Comparator } from './../comparators/comparator';\nimport { IFilterOptions } from './../options/i-filter-options';\nimport { FilterOptions } from './../options/filter-options';\nimport { SortDirection } from '../options/sort-direction';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class FilterSortService {\n  public autoDefineUnsetProperties: boolean = false;\n  public filterSplits: any[];\n  private filterSplitsLen: number;\n  private splits: any[];\n  private splitsLen: number;\n  public sortDirection: number;\n  public ignoreCase: boolean;\n  private vName: string;\n  private varNames: string[];\n  private _items: any[];\n\n  private _currentFilterOptions: IFilterOptions | FilterOptions | null;\n  private _currentSortOptions: ISortOptions | SortOptions | null;\n\n  public get currentFilterOptions(): IFilterOptions | FilterOptions | null {\n    return this._currentFilterOptions;\n  }\n  public get currentSortOptions(): ISortOptions | SortOptions | null {\n    return this._currentSortOptions;\n  }\n  public get itemsBeingFilteredAndSorted(): any[] {\n    return this._items;\n  }\n\n  constructor() {\n    Comparator.filterSortService = this;\n  }\n\n  filterAndSortItems(\n    items: any[],\n    filterOptions:\n      | IFilterOptions\n      | (IFilterOptions | null)[]\n      | FilterOptions\n      | (FilterOptions | null)[]\n      | null,\n    sortOptions: ISortOptions | (ISortOptions | null)[] | SortOptions | (SortOptions | null)[] | null\n  ): any[] {\n    let filteredItems: any[];\n\n    this._items = items;\n    filteredItems = items;\n\n    if (filterOptions) {\n      if (Array.isArray(filterOptions)) {\n        const filterOptionsLen: number = filterOptions.length;\n        for (let i = 0; i < filterOptionsLen; i++) {\n          const options: IFilterOptions | FilterOptions | null = filterOptions[i];\n          this._currentFilterOptions = options;\n          filteredItems = this.filterItemsByVarNames(filteredItems, options);\n        }\n      } else {\n        filteredItems = this.filterItemsByVarNames(\n          filteredItems,\n          filterOptions\n        );\n      }\n    }\n\n    if (sortOptions) {\n      if (Array.isArray(sortOptions)) {\n        filteredItems = this.multiSortItemsByVarName(\n          filteredItems,\n          sortOptions\n        );\n      } else {\n        filteredItems = this.sortItemsByVarName(filteredItems, sortOptions);\n      }\n    }\n\n    return filteredItems;\n  }\n\n  isString(val: any): boolean {\n    return typeof val === 'string' || val instanceof String;\n  }\n\n  filterItemsByVarNames(items: any[], filterOptions: IFilterOptions | FilterOptions | null): any[] {\n    this._currentFilterOptions = filterOptions;\n    if (!filterOptions) {\n      throw Error(\n        'A FilterOptions object is not defined. Please supply filter options to sort items by.'\n      );\n    }\n    const varNames: string | (string | null | undefined)[] | undefined | null = this.isString(\n      filterOptions.variableIdentifiers\n    )\n      ? ([filterOptions.variableIdentifiers] as string[])\n      : filterOptions.variableIdentifiers;\n\n    this.ignoreCase = filterOptions.ignoreCase;\n\n    if (items === null || items === undefined) {\n      throw Error(\n        'Item array is not defined. Please supply a defined array to filter.'\n      );\n    }\n\n    if (items.length === 0) {\n      return items;\n    }\n\n    this.filterSplits = [];\n\n    const numOfVarNames: number = varNames && varNames.length > 0 ? varNames.length : 0;\n\n    for (let i = 0; i < numOfVarNames; i++) {\n      this.splitVariablesFromIdentifier(varNames![i]);\n      this.filterSplits.push(this.splits);\n    }\n\n    this.filterSplitsLen = this.filterSplits.length;\n\n    items = items.concat();\n\n    items = items.filter(filterOptions.comparator);\n\n    return items;\n  }\n\n  splitVariablesFromIdentifier(varName: string | null | undefined): void {\n    if (varName === null || varName === undefined || varName === '') {\n      this.splits = [];\n      this.splitsLen = this.splits.length;\n      return;\n    }\n    const containsBrackets: boolean = varName.includes('[');\n    this.splits = varName.split('.');\n    this.splitsLen = this.splits.length;\n\n    if (containsBrackets) {\n      const bracketSplits: string[] = [];\n      for (let i = 0; i < this.splitsLen; i++) {\n        let split: string = this.splits[i];\n        let startBracketIndex: number = split.indexOf('[');\n\n        if (startBracketIndex !== -1) {\n          while (split !== '') {\n            const endBracketIndex: number = split.indexOf(']') + 1;\n            const preBracketVar: string = split.substring(0, startBracketIndex);\n            const brackets: string = split.substring(\n              startBracketIndex + 1,\n              endBracketIndex - 1\n            );\n            const postBracketVar: string = split.substring(\n              endBracketIndex,\n              split.length\n            );\n            split = postBracketVar;\n            startBracketIndex = split.indexOf('[');\n\n            if (preBracketVar !== '') {\n              bracketSplits.push(preBracketVar);\n            }\n            bracketSplits.push(brackets);\n          }\n        } else {\n          bracketSplits.push(split);\n        }\n      }\n      this.splits = bracketSplits;\n    }\n\n    this.splitsLen = this.splits.length;\n    let varStr: string = '(array item)';\n    this.varNames = [varStr];\n\n    for (let i = 0; i < this.splitsLen; i++) {\n      this.vName = this.splits[i];\n      if (isNaN(Number(this.vName))) {\n        varStr += '.' + this.vName;\n      } else {\n        varStr += '[' + this.vName + ']';\n      }\n      this.varNames.push(varStr);\n    }\n  }\n\n  sortItemsByVarName(items: any[], sortOptions: ISortOptions | null): any[] {\n    this._currentSortOptions = sortOptions;\n\n    if (!sortOptions) {\n      throw Error(\n        'A SortOptions object is not defined. Please supply filter options to sort items by.'\n      );\n    }\n\n    const varName: string = sortOptions.variableIdentifier as string;\n    this.sortDirection = sortOptions.sortDirection;\n    this.ignoreCase = sortOptions.ignoreCase;\n\n    if (items === null || items === undefined) {\n      throw Error(\n        'Item array is not defined. Please supply a defined array to sort.'\n      );\n    }\n    if (items.length === 0) {\n      return items;\n    }\n\n    this.splitVariablesFromIdentifier(varName);\n\n    items = items.concat();\n\n    if (this.sortDirection !== SortDirection.NONE) {\n      items.sort(sortOptions.comparator);\n    }\n\n    return items;\n  }\n\n  multiSortItemsByVarName(\n    items: any[],\n    sortOptionsGroup: (ISortOptions | null)[] | (SortOptions | null)[]\n  ): any[] {\n    sortOptionsGroup.sort(\n      (sortOptionsA: ISortOptions | null, sortOptionsB: ISortOptions | null) => {\n        if (!sortOptionsA || !sortOptionsB) {\n          return 0;\n        }\n        const orderA = sortOptionsA.sortOrder;\n        const orderB = sortOptionsB.sortOrder;\n        if (orderA === orderB) {\n          return 0;\n        }\n        return orderA > orderB ? 1 : -1;\n      }\n    );\n\n    sortOptionsGroup.forEach((sortOptions) => {\n      items = this.sortItemsByVarName(items, sortOptions);\n    });\n    return items;\n  }\n\n  getFilterValuesFromPropertyIndentifiers(value: any): any[] {\n    this.filterSplitsLen = this.filterSplits.length;\n    const vals: any[] = this.filterSplitsLen === 0 ? [value] : [];\n\n    for (let j = 0; j < this.filterSplitsLen; j++) {\n      let varA = value;\n      const splits: any[] = this.filterSplits[j];\n      const splitsLen: number = splits.length;\n\n      for (let i = 0; i < splitsLen; i++) {\n        this.vName = splits[i];\n\n        if (!varA.hasOwnProperty(this.vName)) {\n          if (!this.autoDefineUnsetProperties) {\n            throw Error(\n              `Property ${this.vName} not found on ${this.varNames[i]}`\n            );\n          }\n          this.defineProperty(varA, this.vName);\n        } else {\n          varA = varA[this.vName];\n        }\n      }\n      vals.push(varA);\n    }\n\n    return vals;\n  }\n\n  private defineProperty(obj: any, propName: string, value: any = undefined, writable: boolean = true): void {\n    Object.defineProperty(obj, propName, {\n      value: value,\n      writable: writable\n    });\n  }\n\n  getSortValuesFromPropertyIdentifiers(valueA: any, valueB: any): any[] {\n    let varA = valueA;\n    let varB = valueB;\n\n    for (let i = 0; i < this.splitsLen; i++) {\n      this.vName = this.splits[i];\n      if (\n        !varA.hasOwnProperty(this.vName) ||\n        !varB.hasOwnProperty(this.vName)\n      ) {\n        throw Error(`Property ${this.vName} not found on ${this.varNames[i]}`);\n      }\n      varA = varA[this.vName];\n      varB = varB[this.vName];\n    }\n\n    return [varA, varB];\n  }\n}\n","import { ISortOptions } from './i-sort-options';\nimport { SortDirection } from './sort-direction';\n\nexport class SortOptions implements ISortOptions {\n  public id: string;\n  variableIdentifier: string | null | undefined;\n  initialSortDirection:\n    | number\n    | SortDirection.DESCENDING\n    | SortDirection.NONE\n    | SortDirection.ASCENDING;\n  ignoreCase: boolean;\n  ignoreTimeOfDay: boolean = true;\n  sortOrder: number;\n  comparator: (valueA: any, valueB: any) => number;\n  variableMapper?: Function | null;\n  useLocaleCompare: boolean;\n  localeCompareOptions: [string | string[]] | [string | string[], Intl.CollatorOptions] | null;\n  _directionOrder: (\n    | number\n    | SortDirection.ASCENDING\n    | SortDirection.DESCENDING\n    | SortDirection.NONE\n  )[] = [SortDirection.ASCENDING, SortDirection.DESCENDING, SortDirection.NONE];\n\n  get directionOrder(): (\n    | number\n    | SortDirection.ASCENDING\n    | SortDirection.DESCENDING\n    | SortDirection.NONE\n  )[] {\n    return this._directionOrder;\n  }\n\n  set directionOrder(\n    order: (\n      | number\n      | SortDirection.ASCENDING\n      | SortDirection.DESCENDING\n      | SortDirection.NONE\n    )[]\n  ) {\n    this._sortDirectionIndex = -1;\n    this._directionOrder = order;\n  }\n\n  private _sortDirectionIndex: number = -1;\n\n  get sortDirection(): number| SortDirection.ASCENDING | SortDirection.DESCENDING | SortDirection.NONE {\n    return this._sortDirectionIndex === -1\n      ? SortDirection.NONE\n      : this._directionOrder[this._sortDirectionIndex];\n  }\n\n  set sortDirection(\n    direction:\n      | number\n      | SortDirection.ASCENDING\n      | SortDirection.DESCENDING\n      | SortDirection.NONE\n  ) {\n    this._sortDirectionIndex = this._directionOrder.indexOf(direction);\n  }\n\n  constructor(\n    variableIdentifier: string,\n    comparator: (valueA: any, valueB: any) => number,\n    initialSortDirection:\n      | number\n      | SortDirection.DESCENDING\n      | SortDirection.NONE\n      | SortDirection.ASCENDING = SortDirection.NONE,\n    ignoreCase: boolean = true,\n    sortOrder: number = 0,\n    useLocalCompare: boolean = false,\n    localeCompareOptions: [string | string[]] | [string | string[], Intl.CollatorOptions] | null = null\n  ) {\n    this.variableIdentifier = variableIdentifier;\n    this.comparator = comparator;\n    this.initialSortDirection = initialSortDirection;\n    this.ignoreCase = ignoreCase;\n    this.sortOrder = sortOrder;\n    this.useLocaleCompare = useLocalCompare;\n    this.localeCompareOptions = localeCompareOptions;\n\n    this.sortDirection = this.initialSortDirection;\n  }\n\n  public nextSortDirection(): void {\n    this._sortDirectionIndex++;\n\n    if (this._sortDirectionIndex >= this._directionOrder.length) {\n      this._sortDirectionIndex = 0;\n    }\n  }\n}\n","export namespace MatchType {\n  export type ALL = 'all';\n  export const ALL: string | ALL = 'all';\n\n  export type ANY = 'any';\n  export const ANY: string | ANY = 'any';\n}\n","import { IFilterOptions } from './i-filter-options';\nimport { MatchType } from './../comparators/match-type';\n\nexport class FilterOptions implements IFilterOptions {\n  public id: string;\n  variableIdentifiers: string | (string | null | undefined)[] | null | undefined;\n  ignoreCase: boolean;\n  ignoreTimeOfDay: boolean = true;\n  comparator: (element: any, index: number, array: any[]) => boolean;\n  variableMappers?: Function | (Function | null)[] | null;\n  filterValue: any;\n  matchType: string | MatchType.ALL | MatchType.ANY;\n\n  constructor(\n    variableIdentifiers: string | string[],\n    comparator: (element: any, index: number, array: any[]) => boolean,\n    filterValue: any = null,\n    matchType: string | MatchType.ALL | MatchType.ANY = MatchType.ANY,\n    ignoreCase: boolean = true\n  ) {\n    this.variableIdentifiers = variableIdentifiers;\n    this.comparator = comparator;\n    this.ignoreCase = ignoreCase;\n    this.filterValue = filterValue;\n    this.matchType = matchType;\n  }\n}\n","import { Comparator } from './comparator';\nimport { ISortOptions } from './../filter-and-sort.module';\n\nexport class SortComparator extends Comparator {\n  static DATE(valueA: any, valueB: any): number {\n    const values: any[] =\n      Comparator.filterSortService!.getSortValuesFromPropertyIdentifiers(\n        valueA,\n        valueB\n      );\n    let varA = values[0];\n    let varB = values[1];\n\n    const currentSortOptions: ISortOptions | null = Comparator.getCurrentSortOptions();\n    if (!currentSortOptions) {\n      this.triggerNoSortOptionsError();\n    }\n\n    if (currentSortOptions!.ignoreTimeOfDay) {\n      varA = new Date(varA);\n      varB = new Date(varB);\n      varA.setHours(0, 0, 0, 0);\n      varB.setHours(0, 0, 0, 0);\n    }\n\n    const modifier: Function | null = currentSortOptions!.variableMapper!;\n    if (modifier !== null && modifier !== undefined) {\n      varA = modifier.apply(null, [varA]);\n      varB = modifier.apply(null, [varB]);\n    }\n\n    if (varA === varB) {\n      return 0;\n    }\n    return Comparator.filterSortService!.sortDirection === 1\n      ? varA - varB\n      : varB - varA;\n  }\n\n  static NUMERIC(valueA: any, valueB: any): number {\n    const values: any[] =\n      Comparator.filterSortService!.getSortValuesFromPropertyIdentifiers(\n        valueA,\n        valueB\n      );\n    let varA = values[0];\n    let varB = values[1];\n\n    const currentSortOptions: ISortOptions | null = Comparator.getCurrentSortOptions();\n    if (!currentSortOptions) {\n      this.triggerNoSortOptionsError();\n    }\n\n    const modifier: Function | null = currentSortOptions!.variableMapper!;\n    if (modifier !== null && modifier !== undefined) {\n      varA = modifier.apply(null, [varA]);\n      varB = modifier.apply(null, [varB]);\n    }\n\n    if (varA === varB) {\n      return 0;\n    }\n    return varA > varB\n      ? 1 * Comparator.filterSortService!.sortDirection\n      : -1 * Comparator.filterSortService!.sortDirection;\n  }\n\n  static BOOLEAN(valueA: any, valueB: any): number {\n    const values: any[] =\n      Comparator.filterSortService!.getSortValuesFromPropertyIdentifiers(\n        valueA,\n        valueB\n      );\n    let varA = values[0];\n    let varB = values[1];\n\n    const currentSortOptions: ISortOptions | null = Comparator.getCurrentSortOptions();\n    if (!currentSortOptions) {\n      this.triggerNoSortOptionsError();\n    }\n\n    const modifier: Function | null = currentSortOptions!.variableMapper!;\n    if (modifier !== null && modifier !== undefined) {\n      varA = modifier.apply(null, [varA]);\n      varB = modifier.apply(null, [varB]);\n    }\n\n    if (varA === varB) {\n      return 0;\n    }\n    return Comparator.filterSortService!.sortDirection === 1\n      ? varA - varB\n      : varB - varA;\n  }\n\n  static TRUTHY(valueA: any, valueB: any): number {\n    const values: any[] =\n      Comparator.filterSortService!.getSortValuesFromPropertyIdentifiers(\n        valueA,\n        valueB\n      );\n    let varA = values[0];\n    let varB = values[1];\n\n    const currentSortOptions: ISortOptions | null = Comparator.getCurrentSortOptions();\n    if (!currentSortOptions) {\n      this.triggerNoSortOptionsError();\n    }\n\n    const modifier: Function | null = currentSortOptions!.variableMapper!;\n    if (modifier !== null && modifier !== undefined) {\n      varA = modifier.apply(null, [varA]);\n      varB = modifier.apply(null, [varB]);\n    }\n\n    const varAIsFalsy: number = varA ? 1 : 0;\n    const varBIsFalsy: number = varB ? 1 : 0;\n\n    if (varAIsFalsy === varBIsFalsy) {\n      return 0;\n    }\n    return Comparator.filterSortService!.sortDirection === 1\n      ? varAIsFalsy - varBIsFalsy\n      : varBIsFalsy - varAIsFalsy;\n  }\n\n  static ALPHABETICAL(valueA: any, valueB: any): number {\n    const values: any[] =\n      Comparator.filterSortService!.getSortValuesFromPropertyIdentifiers(\n        valueA,\n        valueB\n      );\n    let varA = values[0];\n    let varB = values[1];\n\n    const currentSortOptions: ISortOptions | null = Comparator.getCurrentSortOptions();\n    if (!currentSortOptions) {\n      this.triggerNoSortOptionsError();\n    }\n\n    const modifier: Function | null = currentSortOptions!.variableMapper!;\n    if (modifier !== null && modifier !== undefined) {\n      varA = modifier.apply(null, [varA]);\n      varB = modifier.apply(null, [varB]);\n    }\n\n    if (Comparator.filterSortService!.ignoreCase) {\n      if (\n        (typeof varA === 'string' || varA instanceof String) &&\n        (typeof varB === 'string' || varB instanceof String)\n      ) {\n        varA = varA.toLowerCase();\n        varB = varB.toLowerCase();\n      }\n    }\n\n    varA = varA.toString();\n    varB = varB.toString();\n\n    if (varA == varB || !Comparator.filterSortService!.currentSortOptions) {\n      return 0;\n    }\n    if (Comparator.filterSortService!.currentSortOptions.useLocaleCompare) {\n      if (\n        Comparator.filterSortService!.currentSortOptions.localeCompareOptions\n      ) {\n        const locales: string | string[] =\n          Comparator.filterSortService!.currentSortOptions\n            .localeCompareOptions[0];\n        const options: Intl.CollatorOptions | null = Comparator.filterSortService!.currentSortOptions.localeCompareOptions.length > 1 ? Comparator.filterSortService!.currentSortOptions.localeCompareOptions[1] as Intl.CollatorOptions : null;\n        if (options) {\n          return (\n            varA.localeCompare(varB, locales, options) *\n            Comparator.filterSortService!.sortDirection\n          );\n        } else {\n          return varA.localeCompare(varB, locales) *\n            Comparator.filterSortService!.sortDirection;\n        }\n      } else {\n        return (\n          varA.localeCompare(varB) * Comparator.filterSortService!.sortDirection\n        );\n      }\n    } else {\n      return varA > varB\n        ? Comparator.filterSortService!.sortDirection * 1\n        : Comparator.filterSortService!.sortDirection * -1;\n    }\n  }\n\n  static triggerNoSortOptionsError() {\n    throw Error(`Please supply a SortOptions object to sort your array by.`);\n  }\n}\n","import { Comparator } from './comparator';\nimport { MatchType } from './match-type';\nimport { IFilterOptions } from './../filter-and-sort.module';\n\nexport class FilterComparator extends Comparator {\n  private static getRequiredMatches(numOfValues: number): number {\n    if (!Comparator.filterSortService!.currentFilterOptions) {\n      return 1;\n    } else {\n      return Comparator.filterSortService!.currentFilterOptions.matchType ===\n      MatchType.ANY\n      ? 1\n      : numOfValues;\n    }\n  }\n\n  private static escapeRegExp(str: string): string {\n    const regExp = /[.*+?^${}()|[\\]\\\\]/g;\n    return str.replace(regExp, '\\\\$&'); // $& means the whole matched string\n  }\n\n  public static getModifiedValue(\n    value: any,\n    variableMappers: Function | (Function | null)[] | null,\n    index: number\n  ): any {\n    if (Array.isArray(variableMappers)) {\n      if (index > variableMappers.length - 1) {\n        throw Error(`${value} does not have a variable mapper assigned to it.`);\n      }\n    }\n    let modifier: Function | null;\n    modifier = Array.isArray(variableMappers)\n      ? variableMappers[index]\n      : variableMappers;\n    if (modifier !== null && modifier !== undefined) {\n      return modifier.apply(null, [value]);\n    }\n    return value;\n  }\n\n  static CONTAINS_STRING(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let containsString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string =  currentFilterOptions!.filterValue;\n    const ignoreCase: boolean =  currentFilterOptions!.ignoreCase;\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n         currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = ignoreCase ? val.toString().toLowerCase() : val.toString();\n\n      if (val.includes(filterValue)) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          containsString = true;\n        }\n      }\n    }\n\n    return containsString;\n  }\n\n  static DOES_NOT_CONTAIN_STRING(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      ); \n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues); \n    let matchCount: number = 0;\n    let doesNotContainString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string =  currentFilterOptions!.filterValue;\n    const ignoreCase: boolean =  currentFilterOptions!.ignoreCase;\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n         currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = ignoreCase ? val.toString().toLowerCase() : val.toString();\n\n      if (!val.includes(filterValue)) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          doesNotContainString = true;\n        }\n      }\n    }\n\n    return doesNotContainString;\n  }\n\n  static CONTAINS_WORD(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let startsWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n    const regExFlags: string = currentFilterOptions!.ignoreCase\n      ? 'mi'\n      : 'm';\n\n    const punctuation: string = ',|:|;|\\\\[|\\\\]|\\\\{|\\\\}|\\\\(|\\\\)|\\'|\"|(\\\\.\\\\.\\\\.)|(\\\\.\\\\.\\\\.\\\\.)|(…)|(\\\\?)|!|\\\\.|-|—|@|#|\\\\$|%|\\\\^|&|\\\\*|_|\\\\+|=|/|>|<|`|~|('\n    + FilterComparator.escapeRegExp('\\\\') + ')|(' + FilterComparator.escapeRegExp('|') + ')';\n    const startsWithOrSpace: string = '(?:^|\\\\s|' + punctuation + ')';\n    const escapedValue: string = FilterComparator.escapeRegExp(filterValue);\n\n    const regex = new RegExp(\n      startsWithOrSpace +\n      '(' +\n      escapedValue +\n      '$|' +\n      escapedValue +\n      '(\\\\s|' +\n      punctuation +\n      '))',\n      regExFlags\n    );\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      const found = regex.test(val);\n\n      if (found) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          startsWithString = true;\n        }\n      }\n    }\n\n    return startsWithString;\n  }\n\n  static DOES_NOT_CONTAIN_WORD(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let doesNotContainWord: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n    const regExFlags: string = currentFilterOptions!.ignoreCase\n      ? 'mi'\n      : 'm';\n\n    const punctuation: string = ',|:|;|\\\\[|\\\\]|\\\\{|\\\\}|\\\\(|\\\\)|\\'|\"|(\\\\.\\\\.\\\\.)|(\\\\.\\\\.\\\\.\\\\.)|(…)|(\\\\?)|!|\\\\.|-|—|@|#|\\\\$|%|\\\\^|&|\\\\*|_|\\\\+|=|/|>|<|`|~|('\n    + FilterComparator.escapeRegExp('\\\\') + ')|(' + FilterComparator.escapeRegExp('|') + ')';\n    const startsWithOrSpace: string = '(?:^|\\\\s|' + punctuation + ')';\n    const escapedValue: string = FilterComparator.escapeRegExp(filterValue);\n\n    const regex = new RegExp(\n      startsWithOrSpace +\n      '(' +\n      escapedValue +\n      '$|' +\n      escapedValue +\n      '(\\\\s|' +\n      punctuation +\n      '))',\n      regExFlags\n    );\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      const found = regex.test(val);\n\n      if (!found) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          doesNotContainWord = true;\n        }\n      }\n    }\n\n    return doesNotContainWord;\n  }\n\n  static STARTS_WITH(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let startsWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = ignoreCase ? val.toLowerCase() : val;\n\n      if (val.toString().substring(0, filterValue.length) === filterValue) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          startsWithString = true;\n        }\n      }\n    }\n\n    return startsWithString;\n  }\n\n  static DOES_NOT_START_WITH(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let doesNotStartWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = ignoreCase ? val.toLowerCase() : val;\n\n      if (val.toString().substring(0, filterValue.length) !== filterValue) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          doesNotStartWithString = true;\n        }\n      }\n    }\n\n    return doesNotStartWithString;\n  }\n\n  static ENDS_WITH(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let endsWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = ignoreCase ? val.toLowerCase() : val;\n\n      if (\n        val\n          .toString()\n          .substr(val.length - filterValue.length, filterValue.length) ===\n        filterValue\n      ) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          endsWithString = true;\n        }\n      }\n    }\n\n    return endsWithString;\n  }\n\n  static DOES_NOT_END_WITH(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let doesNotEndWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = ignoreCase ? val.toLowerCase() : val;\n\n      if (\n        val\n          .toString()\n          .substr(val.length - filterValue.length, filterValue.length) !==\n        filterValue\n      ) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          doesNotEndWithString = true;\n        }\n      }\n    }\n\n    return doesNotEndWithString;\n  }\n\n  static WORD_STARTS_WITH(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let startsWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n    const regExFlags: string = currentFilterOptions!.ignoreCase\n      ? 'mi'\n      : 'm';\n    const escapedValue: string = FilterComparator.escapeRegExp(filterValue);\n    const punctuation: string = ',|:|;|\\\\[|\\\\]|\\\\{|\\\\}|\\\\(|\\\\)|\\'|\"|(\\\\.\\\\.\\\\.)|(\\\\.\\\\.\\\\.\\\\.)|(…)|(\\\\?)|!|\\\\.|-|—|@|#|\\\\$|%|\\\\^|&|\\\\*|_|\\\\+|=|/|>|<|`|~|('\n    + FilterComparator.escapeRegExp('\\\\') + ')|(' + FilterComparator.escapeRegExp('|') + ')';\n    const startsWithOrSpace: string = '(?:^|\\\\s|' + punctuation + ')';\n    const regex = new RegExp(startsWithOrSpace + escapedValue, regExFlags);\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      const found = regex.test(val);\n\n      if (found) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          startsWithString = true;\n        }\n      }\n    }\n\n    return startsWithString;\n  }\n\n  static WORD_DOES_NOT_START_WITH(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let doesNotStartsWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n    const regExFlags: string = currentFilterOptions!.ignoreCase\n      ? 'mi'\n      : 'm';\n    const escapedValue: string = FilterComparator.escapeRegExp(filterValue);\n    const punctuation: string = ',|:|;|\\\\[|\\\\]|\\\\{|\\\\}|\\\\(|\\\\)|\\'|\"|(\\\\.\\\\.\\\\.)|(\\\\.\\\\.\\\\.\\\\.)|(…)|(\\\\?)|!|\\\\.|-|—|@|#|\\\\$|%|\\\\^|&|\\\\*|_|\\\\+|=|/|>|<|`|~|('\n    + FilterComparator.escapeRegExp('\\\\') + ')|(' + FilterComparator.escapeRegExp('|') + ')';\n    const startsWithOrSpace: string = '(?:^|\\\\s|' + punctuation + ')';\n    const regex = new RegExp(startsWithOrSpace + escapedValue, regExFlags);\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      const found = regex.test(val);\n\n      if (!found) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          doesNotStartsWithString = true;\n        }\n      }\n    }\n\n    return doesNotStartsWithString;\n  }\n\n  static WORD_ENDS_WITH(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let endsWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n    const regExFlags: string = currentFilterOptions!.ignoreCase\n      ? 'mi'\n      : 'm';\n    const escapedValue: string = FilterComparator.escapeRegExp(filterValue);\n    const punctuation: string = ',|:|;|\\\\[|\\\\]|\\\\{|\\\\}|\\\\(|\\\\)|\\'|\"|(\\\\.\\\\.\\\\.)|(\\\\.\\\\.\\\\.\\\\.)|(…)|(\\\\?)|!|\\\\.|-|—|@|#|\\\\$|%|\\\\^|&|\\\\*|_|\\\\+|=|/|>|<|`|~|('\n    + FilterComparator.escapeRegExp('\\\\') + ')|(' + FilterComparator.escapeRegExp('|') + ')';\n    const regex = new RegExp(\n      '(' + escapedValue + '$)|(' + escapedValue + '(\\\\s|' + punctuation + '))',\n      regExFlags\n    );\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      const found = regex.test(val);\n\n      if (found) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          endsWithString = true;\n        }\n      }\n    }\n\n    return endsWithString;\n  }\n\n  static WORD_DOES_NOT_END_WITH(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let doesNotEndWithString: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n    const regExFlags: string = currentFilterOptions!.ignoreCase\n      ? 'mi'\n      : 'm';\n    const escapedValue: string = FilterComparator.escapeRegExp(filterValue);\n    const punctuation: string = ',|:|;|\\\\[|\\\\]|\\\\{|\\\\}|\\\\(|\\\\)|\\'|\"|(\\\\.\\\\.\\\\.)|(\\\\.\\\\.\\\\.\\\\.)|(…)|(\\\\?)|!|\\\\.|-|—|@|#|\\\\$|%|\\\\^|&|\\\\*|_|\\\\+|=|/|>|<|`|~|('\n    + FilterComparator.escapeRegExp('\\\\') + ')|(' + FilterComparator.escapeRegExp('|') + ')';\n    const regex = new RegExp(\n      '(' + escapedValue + '$)|(' + escapedValue + '(\\\\s|' + punctuation + '))',\n      regExFlags\n    );\n\n    filterValue = ignoreCase ? filterValue.toLowerCase() : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      const found = regex.test(val);\n\n      if (!found) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          doesNotEndWithString = true;\n        }\n      }\n    }\n\n    return doesNotEndWithString;\n  }\n\n  static EQUALS(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let equals: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue =\n      Comparator.isString(filterValue) && ignoreCase\n        ? filterValue.toLowerCase()\n        : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val =\n        Comparator.isString(val) && ignoreCase\n          ? val.toString().toLowerCase()\n          : val;\n\n      if (val == filterValue) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          equals = true;\n        }\n      }\n    }\n\n    return equals;\n  }\n\n  static NOT_EQUAL(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      ); \n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues); \n    let matchCount: number = 0;\n    let notEquals: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue =\n      Comparator.isString(filterValue) && ignoreCase \n        ? filterValue.toLowerCase() \n        : filterValue; \n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue( \n        val,\n        currentFilterOptions!.variableMappers!, \n        i\n      );\n\n      val =\n        Comparator.isString(val) && ignoreCase\n          ? val.toString().toLowerCase()\n          : val;\n\n        \n      if (val != filterValue) {\n        matchCount++;\n         if (matchCount === requiredMatches) {\n          notEquals = true;\n        }\n      }\n    }\n\n    return notEquals;\n  }\n\n  static STRICT_EQUALS(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let equals: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue =\n      Comparator.isString(filterValue) && ignoreCase\n        ? filterValue.toLowerCase()\n        : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val =\n        Comparator.isString(val) && ignoreCase\n          ? val.toString().toLowerCase()\n          : val;\n\n      if (val === filterValue) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          equals = true;\n        }\n      }\n    }\n\n    return equals;\n  }\n\n  static NOT_STRICT_EQUALS(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let notStrictEquals: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: string = currentFilterOptions!.filterValue;\n    const ignoreCase: boolean = currentFilterOptions!.ignoreCase;\n\n    filterValue =\n      Comparator.isString(filterValue) && ignoreCase\n        ? filterValue.toLowerCase()\n        : filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val =\n        Comparator.isString(val) && ignoreCase\n          ? val.toString().toLowerCase()\n          : val;\n\n      if (val !== filterValue) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          notStrictEquals = true;\n        }\n      }\n    }\n\n    return notStrictEquals;\n  }\n\n  static LESS_THAN(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let lessThan: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    const filterValue: string = currentFilterOptions!.filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string | number = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = Number(val);\n\n      if (val < Number(filterValue)) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          lessThan = true;\n        }\n      }\n    }\n\n    return lessThan;\n  }\n\n  static GREATER_THAN(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let greaterThan: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    const filterValue: string = currentFilterOptions!.filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string | number = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = Number(val);\n\n      if (val > Number(filterValue)) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          greaterThan = true;\n        }\n      }\n    }\n\n    return greaterThan;\n  }\n\n  static LESS_THAN_OR_EQUAL(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let lessThan: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    const filterValue: string = currentFilterOptions!.filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string | number = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = Number(val);\n\n      if (val <= Number(filterValue)) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          lessThan = true;\n        }\n      }\n    }\n\n    return lessThan;\n  }\n\n  static GREATER_THAN_OR_EQUAL(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let greaterThan: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    const filterValue: string = currentFilterOptions!.filterValue;\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: string | number = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      val = Number(val);\n\n      if (val >= Number(filterValue)) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          greaterThan = true;\n        }\n      }\n    }\n\n    return greaterThan;\n  }\n\n  static IS_AFTER_DATE(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let afterDate: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: Date = currentFilterOptions!.filterValue;\n\n    if (currentFilterOptions!.ignoreTimeOfDay) {\n      filterValue = new Date(filterValue);\n      filterValue.setHours(0, 0, 0, 0);\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: Date = new Date(vals[i]);\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (currentFilterOptions!.ignoreTimeOfDay) {\n        val = new Date(val);\n        val.setHours(0, 0, 0, 0);\n      }\n\n      if (val.getTime() > filterValue.getTime()) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          afterDate = true;\n        }\n      }\n    }\n\n    return afterDate;\n  }\n\n  static IS_BEFORE_DATE(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let beforeDate: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: Date = currentFilterOptions!.filterValue;\n\n    if (currentFilterOptions!.ignoreTimeOfDay) {\n      filterValue = new Date(filterValue);\n      filterValue.setHours(0, 0, 0, 0);\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: Date = new Date(vals[i]);\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (currentFilterOptions!.ignoreTimeOfDay) {\n        val = new Date(val);\n        val.setHours(0, 0, 0, 0);\n      }\n\n      if (val.getTime() < filterValue.getTime()) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          beforeDate = true;\n        }\n      }\n    }\n\n    return beforeDate;\n  }\n\n  static DATE_IS(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let beforeDate: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: Date = currentFilterOptions!.filterValue;\n\n    if (currentFilterOptions!.ignoreTimeOfDay) {\n      filterValue = new Date(filterValue);\n      filterValue.setHours(0, 0, 0, 0);\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: Date = new Date(vals[i]);\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (currentFilterOptions!.ignoreTimeOfDay) {\n        val = new Date(val);\n        val.setHours(0, 0, 0, 0);\n      }\n\n      if (val.getTime() === filterValue.getTime()) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          beforeDate = true;\n        }\n      }\n    }\n\n    return beforeDate;\n  }\n\n  static DATE_IS_NOT(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let isNotDate: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: Date = currentFilterOptions!.filterValue;\n\n    if (currentFilterOptions!.ignoreTimeOfDay) {\n      filterValue = new Date(filterValue);\n      filterValue.setHours(0, 0, 0, 0);\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: Date = new Date(vals[i]);\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (currentFilterOptions!.ignoreTimeOfDay) {\n        val = new Date(val);\n        val.setHours(0, 0, 0, 0);\n      }\n\n      if (val.getTime() !== filterValue.getTime()) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          isNotDate = true;\n        }\n      }\n    }\n\n    return isNotDate;\n  }\n\n  static IS_ON_OR_AFTER_DATE(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let afterDate: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: Date = currentFilterOptions!.filterValue;\n\n    if (currentFilterOptions!.ignoreTimeOfDay) {\n      filterValue = new Date(filterValue);\n      filterValue.setHours(0, 0, 0, 0);\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: Date = new Date(vals[i]);\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (currentFilterOptions!.ignoreTimeOfDay) {\n        val = new Date(val);\n        val.setHours(0, 0, 0, 0);\n      }\n\n      if (val.getTime() >= filterValue.getTime()) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          afterDate = true;\n        }\n      }\n    }\n\n    return afterDate;\n  }\n\n  static IS_ON_OR_BEFORE_DATE(\n    value: any,\n    index?: number,\n    array?: any[]\n  ): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let beforeDate: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n    let filterValue: Date = currentFilterOptions!.filterValue;\n\n    if (currentFilterOptions!.ignoreTimeOfDay) {\n      filterValue = new Date(filterValue);\n      filterValue.setHours(0, 0, 0, 0);\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: Date = new Date(vals[i]);\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (currentFilterOptions!.ignoreTimeOfDay) {\n        val = new Date(val);\n        val.setHours(0, 0, 0, 0);\n      }\n\n      if (val.getTime() <= filterValue.getTime()) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          beforeDate = true;\n        }\n      }\n    }\n\n    return beforeDate;\n  }\n\n  static IS_TRUE(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let isTrue: boolean = false;\n    \n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: boolean = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (val === true) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          isTrue = true;\n        }\n      }\n    }\n\n    return isTrue;\n  }\n\n  static IS_FALSE(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let isFalse: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: boolean = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (val === false) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          isFalse = true;\n        }\n      }\n    }\n\n    return isFalse;\n  }\n\n  static IS_TRUTHY(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let isTruthy: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: boolean = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (val) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          isTruthy = true;\n        }\n      }\n    }\n\n    return isTruthy;\n  }\n\n  static IS_FALSY(value: any, index?: number, array?: any[]): boolean {\n    const vals: any[] =\n      Comparator.filterSortService!.getFilterValuesFromPropertyIndentifiers(\n        value\n      );\n\n    const numOfValues: number = vals.length;\n    const requiredMatches: number =\n      FilterComparator.getRequiredMatches(numOfValues);\n    let matchCount: number = 0;\n    let isFalsy: boolean = false;\n\n    const currentFilterOptions: IFilterOptions | null = Comparator.getCurrentFilterOptions();\n    if (!currentFilterOptions) {\n      this.triggerNoFilterOptionsError();\n    }\n\n    for (let i = 0; i < numOfValues; i++) {\n      let val: boolean = vals[i];\n      val = FilterComparator.getModifiedValue(\n        val,\n        currentFilterOptions!.variableMappers!,\n        i\n      );\n\n      if (!val) {\n        matchCount++;\n        if (matchCount === requiredMatches) {\n          isFalsy = true;\n        }\n      }\n    }\n\n    return isFalsy;\n  }\n\n  static triggerNoFilterOptionsError() {\n    throw Error(`Please supply a FilterOptions object to filter your array by.`);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\n\nimport { FilterSortService } from './services/filter-sort.service';\n\n@NgModule({\n  imports: [BrowserModule],\n  declarations: [],\n  providers: [FilterSortService],\n  exports: [],\n  bootstrap: [],\n})\nexport class FilterAndSortModule {}\n\nexport * from './services/filter-sort.service';\nexport * from './options/sort-direction';\nexport * from './options/sort-options';\nexport * from './options/i-sort-options';\nexport * from './options/filter-options';\nexport * from './options/i-filter-options';\nexport * from './comparators/comparator';\nexport * from './comparators/sort-comparator';\nexport * from './comparators/filter-comparator';\nexport * from './comparators/match-type';\n","export class Range {\n  startIndex: number | null;\n  endIndex: number | null;\n  extendedStartIndex: number | null;\n  extendedEndIndex: number | null;\n}\n","/*\n * Public API Surface of tablejs\n */\nexport * from './lib/tablejs.module';\nexport * from './lib/filterAndSort/filter-and-sort.module';\n\nexport { IColumnData } from './lib/shared/interfaces/i-column-data';\nexport { IColumnHideChange } from './lib/shared/interfaces/events/i-column-hide-change';\nexport { IColumnHierarchy } from './lib/shared/interfaces/i-column-hierarchy';\n\nexport { ColumnReorderEvent } from './lib/shared/classes/events/column-reorder-event';\nexport { ColumnResizeEvent } from './lib/shared/classes/events/column-resize-event';\nexport { GridEvent } from './lib/shared/classes/events/grid-event';\nexport { ScrollViewportEvent } from './lib/shared/classes/events/scroll-viewport-event';\n\nexport { Range } from './lib/shared/classes/scrolling/range';\n\nexport { DragAndDropGhostComponent } from './lib/components/drag-and-drop-ghost/drag-and-drop-ghost.component';\nexport { GridComponent } from './lib/components/grid/grid.component';\nexport { HorizResizeGripComponent } from './lib/components/horiz-resize-grip/horiz-resize-grip.component';\nexport { ReorderGripComponent } from './lib/components/reorder-grip/reorder-grip.component';\nexport { ScrollPrevSpacerComponent } from './lib/components/scroll-prev-spacer/scroll-prev-spacer.component';\n\nexport { DataColClassDirective } from './lib/directives/data-col-class/data-col-class.directive';\nexport { DataColClassesDirective } from './lib/directives/data-col-classes/data-col-classes.directive';\nexport { EditableCellDirective } from './lib/directives/editable-cell/editable-cell.directive';\nexport { GridDirective } from './lib/directives/grid/grid.directive';\nexport { GridRowDirective } from './lib/directives/grid-row/grid-row.directive';\nexport { HideColumnIfDirective } from './lib/directives/hide-column-if/hide-column-if.directive';\nexport { InfiniteScrollDirective } from './lib/directives/infinite-scroll/infinite-scroll.directive';\nexport { ReorderColDirective } from './lib/directives/reorder-col/reorder-col.directive';\nexport { ReorderGripDirective } from './lib/directives/reorder-grip/reorder-grip.directive';\nexport { ResizableGripDirective } from './lib/directives/resizable-grip/resizable-grip.directive';\nexport { ScrollViewportDirective } from './lib/directives/scroll-viewport/scroll-viewport.directive';\nexport { VirtualForDirective, TablejsForOfContext } from './lib/directives/virtual-for/virtual-for.directive';\n\nexport { GridService } from './lib/services/grid/grid.service';\nexport { OperatingSystemService } from './lib/services/operating-system/operating-system.service';\nexport { DirectiveRegistrationService } from './lib/services/directive-registration/directive-registration.service';\nexport { ScrollDispatcherService } from './lib/services/scroll-dispatcher/scroll-dispatcher.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GridService","i1.DirectiveRegistrationService","i2.DirectiveRegistrationService","i3.ScrollDispatcherService","i4.OperatingSystemService","i4.ScrollDispatcherService","i5.OperatingSystemService","i1.GridDirective"],"mappings":";;;;;;;;;;;MASa,wBAAwB,CAAA;AAEnC,IAAA,WAAA,GAAA,GAAiB;;qHAFN,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,0GCTrC,qFAA+E,EAAA,MAAA,EAAA,CAAA,mNAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FDSlE,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;+BACE,2BAA2B,EAAA,IAAA,EAG/B,EAAE,KAAK,EAAE,aAAa,EAAE,EAAA,aAAA,EACf,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,qFAAA,EAAA,MAAA,EAAA,CAAA,mNAAA,CAAA,EAAA,CAAA;;;MEE1B,oBAAoB,CAAA;AAE/B,IAAA,WAAA,GAAA,GAAiB;;iHAFN,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,4GCTjC,gIAG4B,EAAA,MAAA,EAAA,CAAA,yZAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FDMf,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,sBAAsB,EAAA,IAAA,EAG1B,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAA,aAAA,EACtB,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,gIAAA,EAAA,MAAA,EAAA,CAAA,yZAAA,CAAA,EAAA,CAAA;;;MEE1B,yBAAyB,CAAA;IAQpC,WAAmB,CAAA,gBAAkC,EAAS,GAAsB,EAAA;QAAjE,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAAS,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QAL7E,IAAI,CAAA,IAAA,GAAW,CAAC,CAAC;QACjB,IAAG,CAAA,GAAA,GAAW,CAAC,CAAC;QAEf,IAAc,CAAA,cAAA,GAAkB,IAAI,CAAC;KAE4C;IAEzF,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACvE,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AAC1B,SAAA;KACF;AAEM,IAAA,UAAU,CAAC,QAA0B,EAAE,OAAA,GAAyB,IAAI,EAAA;AACzE,QAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;AAChC,QAAA,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;KAC/B;IAED,YAAY,GAAA;AACV,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;KAC5D;;sHAzBU,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;0GAAzB,yBAAyB,EAAA,QAAA,EAAA,6BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAEX,gBAAgB,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX3C,4IAGA,EAAA,MAAA,EAAA,CAAA,oWAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FDMa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,6BAA6B,EAAA,aAAA,EAGxB,iBAAiB,CAAC,IAAI,QAC/B,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAA,QAAA,EAAA,4IAAA,EAAA,MAAA,EAAA,CAAA,oWAAA,CAAA,EAAA,CAAA;uIAIa,GAAG,EAAA,CAAA;sBAArD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,KAAK,EAAE,EAAC,IAAI,EAAE,gBAAgB,EAAC,CAAA;;;MEX/B,gBAAgB,CAAA;AAE3B,IAAA,WAAA,GAAA;KACC;;AAFM,gBAAU,CAAA,UAAA,GAAG,CAAC;;MCCV,kBAAkB,CAAA;AAW7B,IAAA,WAAA,GAAA,GAAgB;;AATO,kBAAU,CAAA,UAAA,GAAW,WAAW,CAAC;AACjC,kBAAgB,CAAA,gBAAA,GAAW,gBAAgB,CAAC;AAC5C,kBAAc,CAAA,cAAA,GAAW,cAAc;;MCJnD,iBAAiB,CAAA;;AAEL,iBAAS,CAAA,SAAA,GAAW,UAAU,CAAC;AAC/B,iBAAe,CAAA,eAAA,GAAW,eAAe,CAAC;AAC1C,iBAAa,CAAA,aAAA,GAAW,aAAa;;MCJjD,SAAS,CAAA;;AAEG,SAAc,CAAA,cAAA,GAAW,eAAe;;MCGpD,WAAW,CAAA;AAKtB,IAAA,WAAA,GAAA;QAHO,IAAmB,CAAA,mBAAA,GAAQ,EAAE,CAAC;AAC9B,QAAA,IAAA,CAAA,4BAA4B,GAAyC,IAAI,eAAe,CAAsB,SAAS,CAAC,CAAC;KAE/G;AAEjB,IAAA,6BAA6B,CAAC,EAAsB,EAAA;AAClD,QAAA,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;AAC7D,YAAA,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;AACvB,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AAED,IAAA,uBAAuB,CAAC,SAAkB,EAAA;AACxC,QAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;KACnD;;wGAhBU,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,WAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCGY,4BAA4B,CAAA;AAEvC,IAAA,WAAA,CAAmB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QAEnC,IAAO,CAAA,OAAA,GAAoB,EAAE,CAAC;KAFU;IAIzC,eAAe,CAAC,mBAAkD,EAAE,uBAAgD,EAAA;AACzH,QAAA,MAAM,KAAK,GAAkB;YAC3B,uBAAuB;YACvB,mBAAmB;SACpB,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,QAAA,OAAO,KAAK,CAAC;KACd;AAEM,IAAA,iBAAiB,CAAC,KAAoB,EAAA;QAC3C,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;AACR,SAAA;AACD,QAAA,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACrC,QAAA,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACjC,MAAM,KAAK,GAAW,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAClD,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,OAAO;AACR,SAAA;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAE/B;AAEM,IAAA,2BAA2B,CAAC,uBAAgD,EAAA;QACjF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAoB,KAAK,KAAK,CAAC,uBAAuB,KAAK,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;KACpH;AAEM,IAAA,sBAAsB,CAAC,IAAS,EAAA;QACrC,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;AAC7C,gBAAA,IAAI,CAAC,kCAAkC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrD,aAAA;YACD,IAAI,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE;AAC/C,gBAAA,IAAI,CAAC,oCAAoC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACvD,aAAA;YACD,IAAI,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,KAAK,IAAI,EAAE;AACvD,gBAAA,IAAI,CAAC,qCAAqC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxD,aAAA;YACD,IAAI,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,KAAK,IAAI,EAAE;AACrD,gBAAA,IAAI,CAAC,mCAAmC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtD,aAAA;YACD,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE;AAChD,gBAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9C,aAAA;AACF,SAAA;KACF;AAEM,IAAA,kCAAkC,CAAC,IAAiB,EAAE,YAAA,GAAwB,KAAK,EAAA;QACxF,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAC1F,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,EAAE,CAAC,eAAe,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACxD,SAAA;KACF;AAEM,IAAA,oCAAoC,CAAC,IAAiB,EAAE,YAAA,GAAwB,KAAK,EAAA;QAC1F,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAC1F,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,EAAE,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC1D,SAAA;KACF;AAEM,IAAA,qCAAqC,CAAC,IAAiB,EAAE,YAAA,GAAwB,KAAK,EAAA;QAC3F,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QACzF,IAAY,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAE,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrH,EAAE,CAAC,eAAe,CAAC,CAAC,yBAAyB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;KACnE;AAEM,IAAA,mCAAmC,CAAC,IAAiB,EAAE,YAAA,GAAwB,KAAK,EAAA;QACzF,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAC1F,IAAI,CAAC,EAAE,EAAE;YACP,OAAO;AACR,SAAA;QACD,MAAM,GAAG,GAAwB,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAC1E,QAAA,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzB,SAAA;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,YAAY,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;QACtE,EAAE,CAAC,eAAe,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;KACvD;AAEM,IAAA,2BAA2B,CAAC,IAAiB,EAAE,YAAA,GAAwB,KAAK,EAAA;AACjF,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC5C,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAC1F,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,EAAE,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAChD,SAAA;KACF;AAEM,IAAA,+BAA+B,CAAC,IAAiB,EAAA;QACtD,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAC1F,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,EAAE,CAAC,eAAe,CAAC,CAAC,uBAAuB,GAAG,CAAC,IAAI,CAAC,CAAC;AACtD,SAAA;KACF;;yHApGU,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA5B,4BAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,cAF3B,MAAM,EAAA,CAAA,CAAA;2FAEP,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAHxC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCAY,mBAAmB,CAAA;AAC9B,IAAA,WAAA,CAAmB,SAAY,EAAS,mBAAsB,EAAS,KAAa,EAAS,KAAa,EAAA;QAAvF,IAAS,CAAA,SAAA,GAAT,SAAS,CAAG;QAAS,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAG;QAAS,IAAK,CAAA,KAAA,GAAL,KAAK,CAAQ;QAAS,IAAK,CAAA,KAAA,GAAL,KAAK,CAAQ;KAAI;AAE9G,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;KACtC;AAED,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;KAC7B;AAED,IAAA,IAAI,GAAG,GAAA;AACL,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACnB;AACF,CAAA;MAGY,mBAAmB,CAAA;IA0D9B,WACW,CAAA,cAAgC,EAChC,SAAwD,EACvD,QAAyB,EACzB,UAAsB,EACtB,4BAA0D,EAAA;QAJ3D,IAAc,CAAA,cAAA,GAAd,cAAc,CAAkB;QAChC,IAAS,CAAA,SAAA,GAAT,SAAS,CAA+C;QACvD,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAiB;QACzB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAA4B,CAAA,4BAAA,GAA5B,4BAA4B,CAA8B;AA5D/D,QAAA,IAAA,CAAA,OAAO,GAAiB,IAAI,OAAO,EAAO,CAAC;QAS3C,IAAa,CAAA,aAAA,GAAqB,IAAI,CAAC;QAEtC,IAAO,CAAA,OAAA,GAA2B,IAAI,CAAC;AAmDzC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC;AAEvE,QAAA,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAK,IAAI,CAAC,OAAe,CAAC,uBAAuB,KAAK,SAAS,EAAE;YACzH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;AAC3C,SAAA;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;AACvD,YAAA,MAAM,KAAK,CAAC,iHAAiH,CAAC,CAAC;AAChI,SAAA;AAAM,aAAA;YAEL,IAAI,CAAC,wBAAwB,GAAI,IAAI,CAAC,OAAe,CAAC,uBAAuB,CAAC;YAC9E,IAAI,CAAC,4BAA4B,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,wBAAyB,CAAC,CAAC;YAExF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,wBAAyB,CAAC,KAAK,CAAC;AAEvD,YAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,wBAAyB,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,IAAG;AAChG,gBAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC1D,oBAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;oBACjC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAA8B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAiB,CAAC,CAAC;AACpJ,oBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACnC,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;IAjFL,IACI,mBAAmB,CAAC,mBAAqC,EAAA;AAC3D,QAAA,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC;QACzC,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC9B;AAUD;;;;;AAKG;AACH,IAAA,OAAO,sBAAsB,CAA6B,GAA8B,EAAE,GAAQ,EAAA;AAEhG,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;AAGG;IACH,IACI,yBAAyB,CAAC,KAA6C,EAAA;AACzE,QAAA,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACxB,SAAA;KACF;AAED,IAAA,IAAW,QAAQ,GAAA;QACjB,OAAO,IAAI,CAAC,SAAmD,CAAC;KACjE;AAED,IAAA,IACI,wBAAwB,GAAA;QAC1B,OAAO,IAAI,CAAC,yBAAyB,CAAC;KACvC;IACD,IAAI,wBAAwB,CAAC,EAAyC,EAAA;AACpE,QAAA,IAAI,CAAC,yBAAyB,GAAG,EAAE;AAC/B,YAAA,CAAC,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAmB,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;AAC9F,YAAA,SAAS,CAAC;QAEd,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC9B;IAiCD,gBAAgB,CAAC,MAAa,EAAE,MAAa,EAAA;AAC3C,QAAA,OAAO,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,gBAAgB,KAAK,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,kBAAkB,KAAK,MAAM,CAAC,kBAAkB,CAAC;KACzM;IAED,uBAAuB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,gBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAmB,CAAC;KAC/G;IAEO,qBAAqB,CAAC,sBAA+B,IAAI,EAAA;AAC/D,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,OAAO;AACR,SAAA;AACD,QAAA,IAAI,mBAAmB,EAAE;YACvB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAA8B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAiB,CAAC,CAAC;AACrJ,SAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;AAC5E,gBAAA,OAAO,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3F,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;IAED,SAAS,GAAA;QACR,IAAI,CAAC,WAAW,EAAE,CAAC;KACnB;IAED,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,iBAAiB,CAAC;YACrE,IAAI,WAAW,GAAgC,IAAI,CAAC;AAEpD,YAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE,EAAE;gBAClC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC9B,aAAA;YAED,IAAI;gBACF,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACtD,aAAA;YAAC,MAAM;gBACN,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;AAC5E,oBAAA,OAAO,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3F,iBAAC,CAAC,CAAC;AACJ,aAAA;AAED,YAAA,IAAI,cAAc,EAAE;AAClB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC;AAC7C,aAAA;YACD,IAAI,WAAW,IAAI,cAAc,EAAE;AACjC,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;AACzE,aAAA;AACF,SAAA;KACF;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,EAAE;AACf,YAAA,IAAI,CAAC,OAAe,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACrD,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACrB,SAAA;QAED,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAClC,YAAA,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,CAAC;AAC9C,SAAA;KAEF;;gHA9JU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,4BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;oGAAnB,mBAAmB,EAAA,QAAA,EAAA,0CAAA,EAAA,MAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,SAAS;mBAAC,EAAC,QAAQ,EAAE,0CAA0C,EAAC,CAAA;gOAQ3D,mBAAmB,EAAA,CAAA;sBADtB,KAAK;gBA8BF,yBAAyB,EAAA,CAAA;sBAD5B,KAAK;gBAYF,wBAAwB,EAAA,CAAA;sBAD3B,KAAK;;;MCpEK,yBAAyB,CAAA;AAGpC,IAAA,WAAA,CAAmB,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;KAAK;IAE9C,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;KACtB;;sHAPU,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,yBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,sLCPtC,4HAIA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDGa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;+BACE,4BAA4B,EAAA,QAAA,EAAA,4HAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;iGAMQ,QAAQ,EAAA,CAAA;sBAArD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,CAAA;;;MET1B,mBAAmB,CAAA;;AACP,mBAAa,CAAA,aAAA,GAAW,aAAa,CAAC;AACtC,mBAAe,CAAA,eAAA,GAAW,eAAe,CAAC;AAC1C,mBAAe,CAAA,eAAA,GAAW,eAAe,CAAC;AAC1C,mBAAgB,CAAA,gBAAA,GAAW,gBAAgB,CAAC;AAC5C,mBAAoB,CAAA,oBAAA,GAAW,oBAAoB,CAAC;AACpD,mBAAiB,CAAA,iBAAA,GAAW,iBAAiB,CAAC;AAC9C,mBAAuB,CAAA,uBAAA,GAAW,uBAAuB;;MCCrE,uBAAuB,CAAA;AAElC,IAAA,WAAA,GAAA,GAAiB;IAEV,qBAAqB,CAAC,YAA+B,EAAE,OAAa,EAAE,CAAS,EAAE,QAAiC,EAAE,eAA4B,EAAA;QACrJ,YAAY,CAAC,IAAI,CAAC;YAChB,OAAO;AACP,YAAA,KAAK,EAAE,CAAC;YACR,QAAQ;YACR,eAAe;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,aAAa,EAAE;AACxE,YAAA,MAAM,EAAE;gBACN,OAAO;AACP,gBAAA,KAAK,EAAE,CAAC;gBACR,QAAQ;gBACR,eAAe;AAChB,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,eAAe,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;KAC/C;IAEM,wBAAwB,CAAC,YAA+B,EAAE,OAAa,EAAE,KAAa,EAAE,QAAiC,EAAE,eAA4B,EAAA;QAC5J,YAAY,CAAC,IAAI,CAAC;YAChB,OAAO;YACP,KAAK;YACL,QAAQ;YACR,eAAe;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,eAAe,EAAE;AAC5E,YAAA,MAAM,EAAE;gBACN,OAAO;gBACP,KAAK;gBACL,QAAQ;gBACR,eAAe;AAChB,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,eAAe,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;KACjD;IAEM,wBAAwB,CAAC,YAA+B,EAAE,OAAa,EAAE,CAAS,EAAE,QAAiC,EAAE,eAA4B,EAAA;QACxJ,YAAY,CAAC,IAAI,CAAC;YAChB,OAAO;AACP,YAAA,KAAK,EAAE,CAAC;YACR,QAAQ;YACR,eAAe;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,eAAe,EAAE;AAC5E,YAAA,MAAM,EAAE;gBACN,OAAO;AACP,gBAAA,KAAK,EAAE,CAAC;gBACR,QAAQ;gBACR,eAAe;AAChB,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,eAAe,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;KACjD;AAEM,IAAA,2BAA2B,CAAC,YAA+B,EAAE,QAAiC,EAAE,eAA4B,EAAA;QACjI,YAAY,CAAC,IAAI,CAAC;YAChB,QAAQ;YACR,eAAe;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,iBAAiB,EAAE;AAChF,YAAA,MAAM,EAAE;gBACN,QAAQ;gBACR,eAAe;AAChB,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;KACnD;AAEM,IAAA,iCAAiC,CAAC,YAA+B,EAAE,QAAiC,EAAE,eAA4B,EAAA;QACvI,YAAY,CAAC,IAAI,CAAC;YAChB,QAAQ;YACR,eAAe;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,wBAAwB,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,uBAAuB,EAAE;AAC5F,YAAA,MAAM,EAAE;gBACN,QAAQ;gBACR,eAAe;AAChB,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,eAAe,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;KACzD;AAEM,IAAA,yBAAyB,CAAC,YAA+B,EAAE,KAAY,EAAE,QAAiC,EAAE,eAA4B,EAAA;QAC7I,YAAY,CAAC,IAAI,CAAC;YAChB,KAAK;YACL,QAAQ;YACR,eAAe;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,aAAa,EAAE;AAC3E,YAAA,MAAM,EAAE;gBACN,KAAK;gBACL,QAAQ;gBACR,eAAe;AAChB,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,eAAe,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;KAClD;IAEM,8BAA8B,CAAC,YAA+B,EAAE,SAAiB,EAAE,QAAgB,EAAE,QAAiC,EAAE,eAA4B,EAAA;QACzK,YAAY,CAAC,IAAI,CAAC;YAChB,SAAS;AACT,YAAA,iBAAiB,EAAE,QAAQ;YAC3B,QAAQ;YACR,eAAe;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,qBAAqB,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,aAAa,EAAE;AAC/E,YAAA,MAAM,EAAE;gBACN,SAAS;AACT,gBAAA,iBAAiB,EAAE,QAAQ;gBAC3B,QAAQ;gBACR,eAAe;AAChB,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,eAAe,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;KACtD;;oHAtHU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCFY,sBAAsB,CAAA;AAEjC,IAAA,WAAA,GAAA,GAAiB;IAEjB,KAAK,GAAA;AACH,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;AAC7C,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC3C,MAAM,cAAc,GAAU,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5E,MAAM,gBAAgB,GAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,YAAY,GAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,EAAE,GAAkB,IAAI,CAAC;QAE7B,IAAI,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;YAC3C,EAAE,GAAG,QAAQ,CAAC;AACf,SAAA;aAAM,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;YAChD,EAAE,GAAG,KAAK,CAAC;AACZ,SAAA;aAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;YACpD,EAAE,GAAG,SAAS,CAAC;AAChB,SAAA;AAAM,aAAA,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACpC,EAAE,GAAG,SAAS,CAAC;AAChB,SAAA;aAAM,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxC,EAAE,GAAG,OAAO,CAAC;AACd,SAAA;AAED,QAAA,OAAO,EAAE,CAAC;KACX;IAED,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC;KAC5D;IACD,IAAI,GAAA;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,CAAC;KACnC;;mHAhCU,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;2FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCeY,uBAAuB,CAAA;AAwHlC,IAAA,WAAA,CACS,UAAsB,EACtB,WAAwB,EACL,QAAa,EAC/B,4BAA0D,EAC1D,uBAAgD,EAChD,eAAuC,EACvC,GAA6B,EAC7B,eAAiC,EAAA;QAPlC,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACL,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAK;QAC/B,IAA4B,CAAA,4BAAA,GAA5B,4BAA4B,CAA8B;QAC1D,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAyB;QAChD,IAAe,CAAA,eAAA,GAAf,eAAe,CAAwB;QACvC,IAAG,CAAA,GAAA,GAAH,GAAG,CAA0B;QAC7B,IAAe,CAAA,eAAA,GAAf,eAAe,CAAkB;QA9HW,IAAW,CAAA,WAAA,GAA4B,IAAI,CAAC;QAEzF,IAAU,CAAA,UAAA,GAAkB,EAAE,CAAC;QAC/B,IAAmB,CAAA,mBAAA,GAA0E,IAAI,CAAC;QACnG,IAAa,CAAA,aAAA,GAAoB,CAAC,CAAC;QAQnC,IAAe,CAAA,eAAA,GAAoB,CAAC,CAAC;QAQrC,IAAgB,CAAA,gBAAA,GAAoB,CAAC,CAAC;QAQtC,IAAiB,CAAA,iBAAA,GAAoB,CAAC,CAAC;QAQvC,IAAc,CAAA,cAAA,GAAoB,QAAQ,CAAC;QAUnD,IAAK,CAAA,KAAA,GAAiB,IAAI,CAAC;;QAGlB,IAAU,CAAA,UAAA,GAAkB,IAAI,CAAC;QACjC,IAAe,CAAA,eAAA,GAAW,CAAC,CAAC;QAC5B,IAAgB,CAAA,gBAAA,GAAW,CAAC,CAAC;QAC7B,IAAY,CAAA,YAAA,GAAW,CAAC,CAAC;QACzB,IAAc,CAAA,cAAA,GAAW,CAAC,CAAC;QAC3B,IAAa,CAAA,aAAA,GAAW,QAAQ,CAAC;AAGhC,QAAA,IAAA,CAAA,SAAS,GAAsB,IAAI,YAAY,EAAO,CAAC;AACvD,QAAA,IAAA,CAAA,WAAW,GAAsB,IAAI,YAAY,EAAO,CAAC;AACzD,QAAA,IAAA,CAAA,WAAW,GAAsB,IAAI,YAAY,EAAO,CAAC;AACzD,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC1D,QAAA,IAAA,CAAA,gBAAgB,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC9D,QAAA,IAAA,CAAA,aAAa,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC3D,QAAA,IAAA,CAAA,mBAAmB,GAAsB,IAAI,YAAY,EAAO,CAAC;QAEnE,IAAe,CAAA,eAAA,GAAkB,IAAI,CAAC;QACtC,IAAY,CAAA,YAAA,GAAQ,EAAE,CAAC;QACvB,IAAoB,CAAA,oBAAA,GAAQ,EAAE,CAAC;QAChC,IAAO,CAAA,OAAA,GAAuB,IAAI,CAAC;QACnC,IAAW,CAAA,WAAA,GAAuB,IAAI,CAAC;QACvC,IAAU,CAAA,UAAA,GAAuB,IAAI,CAAC;QACtC,IAAU,CAAA,UAAA,GAAuB,IAAI,CAAC;QACtC,IAAa,CAAA,aAAA,GAAyB,IAAI,CAAC;QAG3C,IAA0B,CAAA,0BAAA,GAAY,KAAK,CAAC;AAE5C,QAAA,IAAA,CAAA,KAAK,GAAU,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;AAC1F,QAAA,IAAA,CAAA,SAAS,GAAU,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC1L,IAAa,CAAA,aAAA,GAAW,CAAC,CAAC;QAC1B,IAAgB,CAAA,gBAAA,GAAW,CAAC,CAAC;QAC7B,IAAmB,CAAA,mBAAA,GAAW,CAAC,CAAC;QAChC,IAAQ,CAAA,QAAA,GAAuB,IAAI,CAAC;QACnC,IAA0B,CAAA,0BAAA,GAAW,CAAC,CAAC;QACvC,IAAsB,CAAA,sBAAA,GAAW,CAAC,CAAC;QACnC,IAAuB,CAAA,uBAAA,GAAW,CAAC,CAAC;QACpC,IAAiB,CAAA,iBAAA,GAAW,CAAC,CAAC;QAC9B,IAAgB,CAAA,gBAAA,GAAW,CAAC,CAAC;QAC7B,IAAQ,CAAA,QAAA,GAAW,EAAE,CAAC;QAEtB,IAAmB,CAAA,mBAAA,GAAW,CAAC,CAAC;QACjC,IAA8B,CAAA,8BAAA,GAAW,CAAC,CAAC;QAC1C,IAAqB,CAAA,qBAAA,GAAW,QAAQ,CAAC;QACzC,IAAkB,CAAA,kBAAA,GAAkB,IAAI,CAAC;QACzC,IAAc,CAAA,cAAA,GAAuB,SAAS,CAAC;QAC/C,IAAiB,CAAA,iBAAA,GAAQ,EAAE,CAAC;QAE5B,IAAqB,CAAA,qBAAA,GAAW,CAAC,CAAC,CAAC;QACnC,IAAoB,CAAA,oBAAA,GAAW,CAAC,CAAC,CAAC;QAClC,IAAuB,CAAA,uBAAA,GAAW,CAAC,CAAC;QACpC,IAAiB,CAAA,iBAAA,GAAW,CAAC,CAAC;QAC9B,IAAmB,CAAA,mBAAA,GAAY,KAAK,CAAC;QACrC,IAAU,CAAA,UAAA,GAAW,CAAC,CAAC;QAEvB,IAAQ,CAAA,QAAA,GAA4B,IAAI,CAAC;QACzC,IAAe,CAAA,eAAA,GAAoB,IAAI,CAAC;QACxC,IAAc,CAAA,cAAA,GAAoB,IAAI,CAAC;QACvC,IAAa,CAAA,aAAA,GAAwC,IAAI,CAAC;QAE1D,IAAoB,CAAA,oBAAA,GAAY,KAAK,CAAC;QACtC,IAAmB,CAAA,mBAAA,GAAY,KAAK,CAAC;QACrC,IAAe,CAAA,eAAA,GAAyC,IAAI,CAAC;QAE9D,IAAY,CAAA,YAAA,GAAyB,IAAI,CAAC;QAEzC,IAAY,CAAA,YAAA,GAA0E,IAAI,CAAC;AAgrB5F,QAAA,IAAA,CAAA,eAAe,GAAsB,CAAC,CAAC,KAAI;AAClD,SAAC,CAAA;AACM,QAAA,IAAA,CAAA,eAAe,GAAsB,CAAC,CAAC,KAAI;AAClD,SAAC,CAAA;AACM,QAAA,IAAA,CAAA,iBAAiB,GAAsB,CAAC,CAAC,KAAI;AACpD,SAAC,CAAA;AACM,QAAA,IAAA,CAAA,kBAAkB,GAAsB,CAAC,CAAC,KAAI;AACrD,SAAC,CAAA;AA1qBC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,uBAAuB,GAAG,IAAI,CAAC;KAC9D;AA7HD,IAAA,IAAI,YAAY,GAAA;AACZ,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KACrC;IACD,IAAa,YAAY,CAAC,KAAsB,EAAA;AAC5C,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;KACtC;AAGD,IAAA,IAAI,cAAc,GAAA;AACd,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;KACvC;IACD,IAAa,cAAc,CAAC,KAAsB,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;KACxC;AAGD,IAAA,IAAI,eAAe,GAAA;AACf,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACxC;IACD,IAAa,eAAe,CAAC,KAAsB,EAAA;AAC/C,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;KACzC;AAGD,IAAA,IAAI,gBAAgB,GAAA;AAChB,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;KACzC;IACD,IAAa,gBAAgB,CAAC,KAAsB,EAAA;AAChD,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1C;AAGD,IAAA,IAAI,aAAa,GAAA;AACb,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KACtC;IACD,IAAa,aAAa,CAAC,KAAsB,EAAA;AAC7C,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;KACvC;AA0FM,IAAA,YAAY,CAAC,CAAQ,EAAA;QAE1B,CAAC,CAAC,cAAc,EAAE,CAAC;QAEnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAY,CAAC,SAAS,CAAC;QACpD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;AACtE,QAAA,IAAI,CAAC,8BAA8B,IAAI,IAAI,CAAC,mBAAmB,CAAC;AAChE,QAAA,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,mBAAmB,CAAC;QAEzD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,CAAC,uBAAuB,CAAC,8BAA8B,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,8BAA8B,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;KAElL;IAEO,yBAAyB,GAAA;QAC/B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,GAAG,IAAI,CAAC;KACrD;IAEO,sBAAsB,GAAA;QAC5B,MAAM,GAAG,GAAQ,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAA2B,KAAI;AACnE,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAwB,KAAI;AAC7C,gBAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAChC,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAY,EAAE;;AAEvC,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,eAAe,CAAC,QAAwB,EAAA;AAC9C,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACnD,YAAA,UAAU,CAAC,OAAO,CAAC,IAAI,IAAG;AACxB,gBAAA,IAAI,CAAC,4BAA4B,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAC/D,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC3B,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;AAEO,IAAA,aAAa,CAAC,IAAU,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,IAAG;AAClC,YAAA,IAAI,CAAC,4BAA4B,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACpE,IAAI,SAAS,CAAC,UAAU,EAAE;AACxB,gBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC/B,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAEM,IAAA,4BAA4B,CAAC,QAAqB,EAAA;QACvD,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACxE,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;KAC7E;IAEO,8BAA8B,GAAA;QACpC,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;AACnC,SAAA;QACD,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACrD,SAAA;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACvD,SAAA;QACD,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACnD,SAAA;QACD,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC/C,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC/B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACjD,SAAA;KACF;IAEO,aAAa,GAAA;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC7C,QAAA,IAAI,IAAI,GAAuB,IAAI,CAAC,OAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,QAAA,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACpE,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;QAC1C,IAAI,CAAC,OAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE;YACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAClD,YAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAClC,YAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;AACtC,YAAA,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;AAC/B,YAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AAChC,YAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;AAClC,YAAA,SAAS,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;AACvC,YAAA,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC;AACrC,YAAA,IAAI,CAAC,OAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACtC,SAAA;QAED,IAAI,CAAC,4BAA4B,CAAC,+BAA+B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAEpF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,eAAe,CAA4B,yBAAyB,CAAC,CAAC;QAClJ,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,GAAG,GAAyB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC1J,YAAY,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEnC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAC/C;IAEO,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,WAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAM,KAAI;AACrF,YAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACvB,SAAC,CAAC,CAAC;KACJ;AAEM,IAAA,aAAa,CAAC,KAAa,EAAE,oBAAA,GAAgC,KAAK,EAAA;AACvE,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC7B,OAAO;AACR,SAAA;AACD,QAAA,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,kBAAmB,CAAC;AAC7C,QAAA,MAAM,QAAQ,GAAW,MAAM,GAAG,KAAK,CAAC;QAExC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YACrF,OAAO;AACR,SAAA;QAED,MAAM,QAAQ,GAAQ,EAAE,CAAC;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtF,QAAQ,CAAE,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAA0B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1H,SAAA;QAAA,CAAC;AACF,QAAA,MAAM,WAAW,GAAmB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnH,MAAM,KAAK,GAAiB,WAAoC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9E,WAAY,CAAC,OAAO,EAAE,CAAC;AAEvB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,mBAAmB,CAAW,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC;AAC/J,QAAA,MAAM,GAAG,GAAyB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,SAAU,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACvM,QAAA,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,IAAI,KAAK,GAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAClC,QAAA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;QAE1B,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAE3H,QAAA,MAAM,YAAY,GAAW,KAAK,CAAC,YAAY,CAAC;QAChD,MAAM,SAAS,GAAW,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;AAE3C,QAAA,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC;AAEhC,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAEnC,QAAA,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,+BAA+B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC/D,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;AAC1C,SAAA;AAED,QAAA,IAAI,oBAAoB,EAAE;YACxB,IAAI,CAAC,eAAe,EAAE,CAAC;AACxB,SAAA;QAED,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAC3H,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;KACvH;IAEO,gBAAgB,GAAA;QACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAExF,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE;YAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,aAAa,CAAC;AAEjE,YAAA,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAG;gBACnG,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC;AACxD,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;gBAE/B,MAAM,eAAe,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;AAChE,gBAAA,IAAI,cAAc,EAAE;oBAClB,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAoB,CAAC;AACxD,oBAAA,eAAe,CAAC,sBAAsB,GAAG,IAAI,CAAC,8BAA8B,CAAC;;AAG7E,oBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAY,CAAC,UAAU,CAAC,CAAC;AAC/D,iBAAA;AAAM,qBAAA;oBACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AACtD,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAExB,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAoB,CAAC,SAAS,CAAC,EAAE;YAChG,IAAI,CAAC,UAAU,CAAC;gBACd,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,mBAAmB,EAAE,IAAI,CAAC,YAAa;AACxC,aAAA,CAAC,CAAC;AACJ,SAAA;AACD,QAAA,IAAI,CAAC,uBAAuB,CAAC,2BAA2B,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;KACnH;IAEM,cAAc,GAAA;QACnB,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;KAC9C;IAEM,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC1B;IAEM,MAAM,GAAA;AACX,QAAA,IAAI,WAAW,GAAW,IAAI,CAAC,8BAA8B,CAAC;AAC9D,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE;AAC/B,YAAA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzB,OAAO;AACR,SAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACpD,MAAM,YAAY,GAAW,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;YAChH,WAAW,IAAI,YAAY,CAAC;YAC5B,IAAI,WAAW,IAAI,IAAI,CAAC,eAAgB,IAAI,CAAC,KAAK,CAAC,EAAE;AACnD,gBAAA,MAAM,kBAAkB,GAAW,WAAW,IAAI,IAAI,CAAC,eAAgB,GAAG,WAAW,GAAG,IAAI,CAAC,eAAgB,GAAG,CAAC,CAAC;AAClH,gBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;gBAC1C,MAAM;AACP,aAAA;AACF,SAAA;KACF;IAEM,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,GAAG,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAW,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAS,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC;QACpI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;KAC/D;IAEO,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAa,KAAI;AACpG,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAClC,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAa,KAAI;AACnG,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;AACnC,SAAC,CAAC,CAAC;AAEH,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAgB,KAAI;YAE7E,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAE3C,QAAQ,CAAC,CAAC,IAAI;AACZ,oBAAA,KAAK,WAAW;AACd,wBAAA,IAAI,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE;4BACtB,CAAC,CAAC,cAAc,EAAE,CAAC;4BACnB,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,yBAAA;AAAM,6BAAA;4BACL,CAAC,CAAC,cAAc,EAAE,CAAC;4BACnB,IAAI,CAAC,KAAK,CAAC,UAAW,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;4BACtD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAW,EAAE,CAAC,CAAC,CAAC;AAC/C,yBAAA;wBACD,MAAM;AACR,oBAAA,KAAK,SAAS;AACZ,wBAAA,IAAI,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE;4BACtB,CAAC,CAAC,cAAc,EAAE,CAAC;4BACnB,IAAI,CAAC,WAAW,EAAE,CAAC;AACpB,yBAAA;AAAM,6BAAA;AACL,4BAAA,IAAI,IAAI,CAAC,8BAA8B,KAAK,CAAC,EAAE;gCAC7C,CAAC,CAAC,cAAc,EAAE,CAAC;gCACnB,IAAI,CAAC,KAAK,CAAC,UAAW,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gCACpD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAW,EAAE,CAAC,CAAC,CAAC;AAC/C,6BAAA;AAAM,iCAAA;gCACL,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,gCAAA,IAAI,CAAC,8BAA8B,GAAG,CAAC,CAAC;gCACxC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAW,EAAE,CAAC,CAAC,CAAC;AAC/C,6BAAA;AACF,yBAAA;wBACD,MAAM;AACR,oBAAA,KAAK,UAAU;wBACb,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAChB,MAAM;AACR,oBAAA,KAAK,QAAQ;wBACX,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,IAAI,CAAC,MAAM,EAAE,CAAC;wBACd,MAAM;AACR,oBAAA,KAAK,KAAK;wBACR,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,IAAI,CAAC,cAAc,EAAE,CAAC;wBACtB,MAAM;AACR,oBAAA,KAAK,MAAM;wBACT,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,IAAI,CAAC,WAAW,EAAE,CAAC;wBACnB,MAAM;AACT,iBAAA;AAEF,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;IAGM,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,aAAa,GAAI,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAU,CAAC,eAAe,CAAC,CAAC;AAC9H,QAAA,IAAI,CAAC,aAAc,CAAC,uBAAuB,GAAG,IAAI,CAAC;QAEnD,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,aAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAG;AACxG,YAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;YAC1B,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAE9B,IAAI,CAAC,eAAe,EAAE,CAAC;;YAEvB,IAAI,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,iBAAiB,EAAE;AAC7C,gBAAA,IAAI,CAAC,KAAM,CAAC,KAAK,EAAE,CAAC;AACrB,aAAA;AACH,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;IAEM,QAAQ,GAAA;QACb,IAAI,CAAC,yBAAyB,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC;KAC9C;IAEM,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE;YAC9D,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;AAChE,SAAA;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,GAAG,IAAI,CAAC;AACpD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACvE,YAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAC7C,YAAA,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACjD,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC1B,SAAA;AAED,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AACtF,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAErF,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAwB,CAAC,CAAC;AAC/E,SAAA;AACD,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAc,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,8BAA8B,EAAE;AACvC,YAAA,IAAI,CAAC,8BAA8B,CAAC,WAAW,EAAE,CAAC;AACnD,SAAA;QACD,IAAI,IAAI,CAAC,8BAA8B,EAAE;AACvC,YAAA,IAAI,CAAC,8BAA8B,CAAC,WAAW,EAAE,CAAC;AACnD,SAAA;QACD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,uBAAuB,GAAG,IAAI,CAAC;KAC9D;IAEO,gBAAgB,GAAA;AAEtB,QAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAiB,CAAC;AACjF,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAExD,QAAA,MAAM,iBAAiB,GAAG,uBAAwB,GAAG,sBAAsB,CAAC;AAE5E,QAAA,MAAM,uBAAuB,GAAG,iBAAiB,KAAK,CAAC,GAAG,uBAAwB,GAAG,iBAAiB,GAAG,CAAC,CAAC;AAC3G,QAAA,MAAM,sBAAsB,GAAG,iBAAiB,KAAK,CAAC,GAAG,sBAAsB,GAAG,iBAAiB,GAAG,CAAC,CAAC;QACxG,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,UAAU,CAAC;QAE1E,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,GAAG,eAAe,CAAC,CAAC;QACpF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,GAAG,eAAe,CAAC,CAAC;;AAGpF,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,IAAI,sBAAsB,GAAG,eAAe,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,uBAAuB,GAAG,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC;QAEnL,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC;AAChC,YAAA,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;AAClC,SAAA;AAED,QAAA,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;AAC9E,QAAA,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;KAEhF;IAEO,+BAA+B,CAAC,QAAgB,EAAE,UAAkB,EAAA;QAC1E,OAAO,QAAQ,GAAG,UAAU,CAAC;KAC9B;IAEO,oBAAoB,CAAC,SAAiB,EAAE,KAAa,EAAA;QAC3D,IAAI,SAAS,GAAG,KAAK,EAAE;YACrB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AACtC,gBAAA,MAAM,QAAQ,GAAmB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/F,gBAAA,IAAI,QAAQ,EAAE;oBACZ,MAAM,UAAU,GAAI,QAAiC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACnE,oBAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;AAC5B,oBAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;AAE5C,oBAAA,MAAM,WAAW,GAAmB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACrG,WAAY,CAAC,OAAO,EAAE,CAAC;AACvB,oBAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;AAE1B,oBAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;oBACvC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;oBAC/C,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC7H,iBAAA;AACF,aAAA;AACF,SAAA;KACF;IACO,qBAAqB,CAAC,YAAoB,EAAE,QAAgB,EAAA;AAClE,QAAA,IAAI,YAAY,IAAI,IAAI,CAAC,KAAM,CAAC,MAAM,EAAE;YACtC,YAAY,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AACvC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE;AAC7C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAY,CAAC,gBAAgB,CAAC,CAAC;AAC9E,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;AAC5B,gBAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;gBAE5C,MAAM,WAAW,GAAmB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrK,WAAY,CAAC,OAAO,EAAE,CAAC;AACvB,gBAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;AAE1B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC/C,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAG,WAAoC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACrK,aAAA;AACF,SAAA;KACF;AAEM,IAAA,WAAW,CAAC,KAAY,EAAE,eAAA,GAAuB,EAAC,KAAK,EAAE,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC,EAAE,EAAA;QAC7F,IAAI,IAAI,CAAC,0BAA0B,EAAE;YACnC,OAAO;AACR,SAAA;QACD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1F,YAAA,MAAM,WAAW,GAAmB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrG,WAAY,CAAC,OAAO,EAAE,CAAC;AACxB,SAAA;AACD,QAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;QAE1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,mBAAoB,CAAC,aAAa,GAAG,KAAK,CAAC;AAC9D,SAAA;AAED,QAAA,IAAI,eAAe,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE;YAChC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;AACnF,SAAA;KACF;IAEM,oBAAoB,GAAA;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC;AACpC,QAAA,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,8BAA8B,GAAG,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;AAC9D,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;KACjC;AAEM,IAAA,oBAAoB,CAAC,KAAa,EAAA;AACvC,QAAA,MAAM,QAAQ,GAAW,MAAM,GAAG,KAAK,CAAC;QACxC,MAAM,QAAQ,GAAQ,EAAE,CAAC;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtF,QAAQ,CAAE,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAA0B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1H,SAAA;QAAA,CAAC;AACF,QAAA,MAAM,MAAM,GAAyB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAyB,CAAC;QACzI,MAAM,KAAK,GAAsB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAErD,QAAA,MAAM,YAAY,GAAW,KAAK,CAAC,YAAY,CAAC;QAChD,MAAM,gBAAgB,GAAW,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC5E,QAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;AAChF,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;AAE3C,QAAA,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC;AAChC,QAAA,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC;KACrC;IAEO,+BAA+B,CAAC,SAAiB,EAAE,SAAiB,EAAA;QAC1E,IAAI,CAAC,gBAAgB,KAAK,SAAS,GAAG,SAAS,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC;KAC3E;AACO,IAAA,qBAAqB,CAAC,MAAc,EAAA;AAC1C,QAAA,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC;QAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAEzB,QAAA,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC;KAC3E;AAEM,IAAA,kBAAkB,CAAC,EAAyB,EAAA;QACjD,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,IAAI,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC;AAC9B,QAAA,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE;AACjE,YAAA,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;AAC7B,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AACM,IAAA,cAAc,CAAC,EAAkB,EAAA;QACtC,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,IAAI,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC;AAC1B,QAAA,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE;AACjE,YAAA,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;AACzB,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAEO,IAAA,2BAA2B,CAAC,eAAuB,EAAA;QACzD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAc,CAAC,CAAC;KACzD;IAEO,0BAA0B,GAAA;QAChC,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;KAC/D;IAEO,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AACrB,SAAA;KACF;AAEO,IAAA,qBAAqB,CAAC,KAAa,EAAA;QACzC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAChC,SAAA;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE;YACpB,KAAK,GAAG,CAAC,CAAC;AACX,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAEO,IAAA,wBAAwB,CAAC,KAAa,EAAA;AAC5C,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,EAAE;AAC9B,YAAA,KAAK,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC;AAC5B,SAAA;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE;YACpB,KAAK,GAAG,CAAC,CAAC;AACX,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAEM,IAAA,SAAS,CAAC,UAAkB,EAAE,QAAgB,EAAE,WAAmB,CAAC,EAAA;AACzE,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAM,EAAE,EAAC,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,QAAQ,EAAE,CAAC,CAAC;AACtF,QAAA,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;AACpD,QAAA,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,QAAQ,IAAI,UAAU,EAAE;AAC1B,YAAA,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;AAC3B,SAAA;AAED,QAAA,MAAM,kBAAkB,GAAW,IAAI,CAAC,eAAgB,CAAC;QACzD,MAAM,kBAAkB,GAAW,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAW,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAElE,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;AAC9B,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;AAE/B,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAU,EAAE,GAAG,IAAI,CAAC,KAAK,EAAC,CAAC;QAC5C,MAAM,eAAe,GAAU,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;AAErD,QAAA,IAAI,CAAC,eAAe,GAAG,kBAAkB,CAAC;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAC;AAC5C,QAAA,IAAI,CAAC,eAAe,GAAG,kBAAkB,CAAC;AAC1C,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;AAEhC,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;KAElC;IAEM,0BAA0B,GAAA;QAC/B,OAAO,IAAI,CAAC,UAAU,CAAC;KACxB;IAEM,sBAAsB,GAAA;QAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAY,CAAC,YAAY,CAAC;KACvD;AAEM,IAAA,mBAAmB,CAAC,0BAAA,GAAsC,KAAK,EAAE,kBAA2B,KAAK,EAAA;AACtG,QAAA,IAAI,0BAA0B,EAAE;AAC9B,YAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;YAC1B,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC/B,SAAA;AACD,QAAA,IAAI,eAAe,EAAE;AACnB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,kBAAkB;YACtD,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,gBAAgB;AACnD,YAAA,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,eAAgB,CAAC;KAClD;IAEM,wBAAwB,GAAA;QAC7B,OAAO;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,IAAI,CAAC,8BAA8B;AAC7C,YAAA,gBAAgB,EAAE,IAAI,CAAC,uBAAuB,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,uBAAuB;SACtF,CAAA;KACF;AAEO,IAAA,iCAAiC,CAAC,SAAiB,EAAE,aAAqB,EAAE,UAAkB,EAAA;AACpG,QAAA,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC;QAE9B,IAAI,SAAS,GAAG,aAAa,EAAE;AAC7B,YAAA,IAAI,CAAC,iBAAiB,IAAI,UAAU,CAAC;AACtC,SAAA;QAED,IAAI,SAAS,IAAI,aAAa,EAAE;AAC9B,YAAA,IAAI,CAAC,mBAAmB,IAAI,UAAU,CAAC;AACvC,YAAA,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,eAAgB,EAAE;gBACrD,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAE7B,gBAAA,IAAI,IAAI,CAAC,qBAAqB,KAAK,CAAC,EAAE;oBACpC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AACpE,iBAAA;AACF,aAAA;AACF,SAAA;KACF;IAEO,eAAe,CAAC,EAAO,EAAE,KAAa,EAAA;KAC7C;IACO,kBAAkB,CAAC,EAAO,EAAE,KAAa,EAAA;KAChD;AAWM,IAAA,uBAAuB,CAAC,KAAa,EAAA;AAC1C,QAAA,IAAI,KAAkB,CAAC;AAEvB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,mBAAmB,CAAW,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC;AAC/J,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,SAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5G,OAAO,CAAC,aAAa,EAAE,CAAC;AACxB,QAAA,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAE7B,QAAA,OAAO,KAAK,CAAC;KACd;IAEO,cAAc,CAAC,KAAa,EAAE,QAAgB,EAAA;QACpD,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAW,CAAC;QAEvD,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;AACxD,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,QAAQ,CAAC;AACrC,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAY,CAAC,iBAAiB,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAW,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,eAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC/O,IAAI,YAAY,GAAU,EAAE,CAAC;AAC7B,QAAA,IAAI,UAAgB,CAAC;AACrB,QAAA,IAAI,WAAmB,CAAC;AACxB,QAAA,MAAM,QAAQ,GAAmB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/F,QAAA,MAAM,WAAW,GAAY,QAAQ,KAAK,IAAI,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,kBAAmB,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE;YACrG,IAAI,CAAC,GAAG,CAAC,EAAE;gBACT,SAAS;AACV,aAAA;YACD,IAAI,CAAC,GAAG,IAAI,CAAC,KAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9B,MAAM;AACP,aAAA;AAED,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;;AAE3B,YAAA,MAAM,eAAe,GAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AAEnF,YAAA,IAAI,eAAe,EAAE;AACnB,gBAAA,UAAU,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;AAEtD,gBAAA,WAAW,GAAG,CAAC,WAAW,IAAI,WAAW,GAAG,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC;gBAEtL,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AAEhD,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI,mBAAmB,CAAW,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC;gBACvJ,MAAM,GAAG,GAAyB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,SAAU,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AACnM,gBAAA,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAE9E,MAAM,IAAI,GAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACnC,gBAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBAEf,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBAErF,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClH,aAAA;AAAM,iBAAA;gBACL,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,gBAAA,IAAI,CAAC,iCAAiC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpF,aAAA;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,KAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,qBAAqB,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;AACpI,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,oBAAA,MAAM,QAAQ,GAAQ,YAAY,CAAC,CAAC,CAAC,CAAC;AACtC,oBAAA,MAAM,IAAI,GAAW,QAAQ,CAAC,IAAI,CAAC;AACnC,oBAAA,MAAM,GAAG,GAAW,QAAQ,CAAC,KAAK,CAAC;oBACnC,MAAM,SAAS,GAAW,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAElD,oBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE;wBAC1B,SAAS;AACV,qBAAA;AAED,oBAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;AAC1B,oBAAA,MAAM,YAAY,GAAW,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;AAExD,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;AAEvC,oBAAA,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC;oBACxC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEpD,oBAAA,IAAI,SAAS,EAAE;AACb,wBAAA,IAAI,CAAC,+BAA+B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC/D,qBAAA;AAAM,yBAAA;AACL,wBAAA,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;AAC1C,qBAAA;oBACD,IAAI,CAAC,iCAAiC,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAClE,iBAAA;gBACD,SAAS,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,eAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACrJ,IAAI,SAAS,IAAI,CAAC,EAAE;AAClB,oBAAA,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC3C,iBAAA;gBACD,YAAY,GAAG,EAAE,CAAC;AACnB,aAAA;AAED,YAAA,IAAI,IAAI,CAAC,qBAAqB,IAAI,CAAC,EAAE;gBACnC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7B,aAAA;YACD,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC;;AAEpC,YAAA,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;gBACrC,IAAI,IAAI,CAAC,qBAAqB,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;oBAC/D,MAAM;AACP,iBAAA;AACF,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE;oBACjC,MAAM;AACP,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,IAAI,QAAgB,CAAC;QACrB,IAAI,aAAa,GAAY,KAAK,CAAC;AACnC,QAAA,IAAI,WAAW,GAAW,CAAC,QAAQ,CAAC;AACpC,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAiB,EAAE,CAAC,EAAE,EAAE;AACzE,YAAA,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;AACtB,YAAA,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAE3C,YAAA,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;AACrC,gBAAA,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE;oBACjC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC5B,IAAI,CAAC,uBAAuB,GAAG,WAAW,GAAG,IAAI,CAAC,eAAgB,CAAC;oBAEnE,aAAa,GAAG,IAAI,CAAC;oBACrB,MAAM;AACP,iBAAA;AACF,aAAA;AAAM,iBAAA;gBACL,IAAI,WAAW,IAAI,IAAI,CAAC,eAAgB,IAAI,CAAC,aAAa,EAAE;oBAC1D,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC5B,IAAI,CAAC,uBAAuB,GAAG,WAAW,GAAG,IAAI,CAAC,eAAgB,CAAC;oBAEnE,aAAa,GAAG,IAAI,CAAC;oBACrB,MAAM;AACP,iBAAA;AACF,aAAA;AACF,SAAA;KACF;IAEO,0CAA0C,CAAC,KAAa,EAAE,QAAgB,EAAA;AAEhF,QAAA,IAAI,OAAO,CAAC;QACZ,IAAI,YAAY,GAAU,EAAE,CAAC;AAC7B,QAAA,IAAI,SAAiB,CAAC;AAEtB,QAAA,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,eAAgB,EAAE;AACrD,YAAA,SAAS,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,eAAgB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACnG,YAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC;AAC/B,YAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAE3B,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAY,CAAC,iBAAiB,CAAC,CAAC;YAEnE,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,YAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAClD,gBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;AAE3B,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAmB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;oBAE5F,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AAEhD,oBAAA,IAAI,CAAC,eAAe,GAAG,IAAI,mBAAmB,CAAW,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC;oBACvJ,MAAM,GAAG,GAAyB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,SAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AACzL,oBAAA,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACpE,MAAM,IAAI,GAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACnC,oBAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AACf,oBAAA,IAAI,CAAC,GAAI,CAAC,aAAa,EAAE,CAAC;oBAE1B,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;oBAClF,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;oBACjH,OAAO,GAAG,IAAI,CAAC;AAEf,oBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAClC,oBAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC7B,iBAAA;AAAM,qBAAA;oBACL,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAE/E,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,oBAAA,IAAI,WAAW,GAAG,IAAI,CAAC,eAAgB,EAAE;wBACvC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC5B,wBAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,CAAC,EAAE;AACnC,4BAAA,QAAQ,GAAG,WAAW,GAAG,IAAI,CAAC,eAAgB,CAAC;AAC/C,4BAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;4BAC1B,KAAK,GAAG,CAAC,CAAC;AACX,yBAAA;AAAM,6BAAA;4BACL,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5D,yBAAA;AACD,wBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAClC,wBAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC7B,qBAAA;AACF,iBAAA;gBAED,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE;AAChD,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,wBAAA,MAAM,QAAQ,GAAQ,YAAY,CAAC,CAAC,CAAC,CAAC;AACtC,wBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE;4BAC1B,SAAS;AACV,yBAAA;AACD,wBAAA,MAAM,IAAI,GAAW,QAAQ,CAAC,IAAI,CAAC;AACnC,wBAAA,MAAM,GAAG,GAAW,QAAQ,CAAC,KAAK,CAAC;AACnC,wBAAA,MAAM,YAAY,GAAW,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;wBACxD,MAAM,SAAS,GAAW,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAClD,wBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;AAEvC,wBAAA,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC;wBACxC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpD,wBAAA,IAAI,SAAS,EAAE;AACb,4BAAA,IAAI,CAAC,+BAA+B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC/D,yBAAA;AAAM,6BAAA;AACL,4BAAA,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;AAC1C,yBAAA;wBAED,WAAW,IAAI,YAAY,CAAC;AAE5B,wBAAA,IAAI,WAAW,GAAG,IAAI,CAAC,eAAgB,EAAE;4BACvC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC5B,4BAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,CAAC,EAAE;AACnC,gCAAA,QAAQ,GAAG,WAAW,GAAG,IAAI,CAAC,eAAgB,CAAC;gCAC/C,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;AACvC,gCAAA,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;AACxB,6BAAA;AAAM,iCAAA;AACL,gCAAA,IAAI,CAAC,iBAAiB,IAAI,YAAY,CAAC;AACxC,6BAAA;4BACD,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC/C,4BAAA,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC1C,yBAAA;AAEF,qBAAA;oBACD,SAAS,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,eAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBACrH,IAAI,SAAS,IAAI,CAAC,EAAE;AAClB,wBAAA,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC1C,qBAAA;oBACD,YAAY,GAAG,EAAE,CAAC;AACnB,iBAAA;gBAED,IAAI,IAAI,CAAC,oBAAoB,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;oBAC7D,MAAM;AACP,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AAEM,IAAA,aAAa,CAAC,KAAa,EAAE,QAAA,GAAmB,CAAC,EAAA;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1C,OAAO;AACR,SAAA;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;AACvB,QAAA,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;AAC1C,QAAA,QAAQ,GAAG,KAAK,KAAK,CAAC,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;AAEtD,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAE/G,QAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;AAEjC,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAiB,CAAC,CAAC,CAAC;AAEnI,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAErC,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAiB,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAE5I,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,QAAQ,GAAG,IAAI,CAAC,0CAA0C,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC7E,SAAA;QAED,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAElC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAExB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,GAAG,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACrF,IAAI,CAAC,WAAY,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;AACjD,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;AAE3C,QAAA,IAAI,CAAC,8BAA8B,GAAG,QAAQ,CAAC;QAC/C,IAAI,CAAC,uBAAuB,CAAC,yBAAyB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAE3H,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;KAEjC;AAEO,IAAA,cAAc,CAAC,YAAoB,EAAA;QACzC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,QAAA,MAAM,QAAQ,GAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAC/G,QAAA,IAAI,QAAQ,CAAC;QAEb,IAAI,YAAY,GAAG,CAAC,EAAE;YACpB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAE,IAAI,IAAI,CAAC,KAAK,CAAC,QAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAE,EAAE,EAAE;AACjG,gBAAA,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AACtC,gBAAA,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;AACtB,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;AAC/B,oBAAA,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC5C,iBAAA;AAAM,qBAAA;AACL,oBAAA,WAAW,IAAI,IAAI,CAAC,aAAc,CAAC;AACpC,iBAAA;gBAED,IAAI,WAAW,IAAI,YAAY,EAAE;oBAC/B,MAAM;AACP,iBAAA;AAED,gBAAA,eAAe,EAAE,CAAC;AACnB,aAAA;YAED,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAW,GAAG,eAAe,CAAC;AAC/D,YAAA,QAAQ,CAAC,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;AACrI,SAAA;QAED,IAAI,YAAY,GAAG,CAAC,EAAE;YACpB,eAAe,GAAG,CAAC,CAAC,CAAC;YACrB,QAAQ,GAAG,YAAY,CAAC;AACxB,YAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,gBAAA,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;AACtB,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;AAC/B,oBAAA,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACxC,oBAAA,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC5C,iBAAA;AAAM,qBAAA;AACL,oBAAA,QAAQ,IAAI,IAAI,CAAC,aAAc,CAAC;AAChC,oBAAA,WAAW,IAAI,IAAI,CAAC,aAAc,CAAC;AACpC,iBAAA;gBAED,IAAI,QAAQ,IAAI,CAAC,EAAE;oBACjB,MAAM;AACP,iBAAA;AAED,gBAAA,eAAe,EAAE,CAAC;AACnB,aAAA;YAED,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAW,GAAG,eAAe,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAW,GAAG,eAAe,GAAG,CAAC,CAAC;AACnH,YAAA,QAAQ,CAAC,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;AACrI,SAAA;AAED,QAAA,IAAI,CAAC,8BAA8B,GAAG,QAAQ,CAAC;AAE/C,QAAA,OAAO,QAAQ,CAAC;KACjB;IAEM,eAAe,CAAC,kBAA2B,KAAK,EAAA;AACrD,QAAA,IAAI,eAAe,EAAE;AACnB,YAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAmB,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAiB,EAAE,CAAC,EAAE,EAAE;AAClF,gBAAA,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAC9B,aAAA;AACF,SAAA;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAW,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;KACjF;AAEM,IAAA,qBAAqB,CAAC,QAAe,EAAA;AAC1C,QAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE;AAChC,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,uBAAuB,GAAG,CAAC,EAAE;gBACrF,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAC5C,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBAExC,IAAI,CAAC,eAAe,EAAE,CAAC;AACxB,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAC5C,aAAA;AACF,SAAA;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC;KAC5C;AAEO,IAAA,UAAU,CAAC,OAAuB,EAAA;AACxC,QAAA,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC;QAChD,MAAM,aAAa,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AACvD,QAAA,IAAI,KAAK,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;QAE5D,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAoB,CAAC,SAAS,EAAE;AACzE,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7B,YAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,gBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC7B,gBAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AAC9B,aAAC,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,UAAW,CAAC,CAAC;YAC1D,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC7B,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AAC7B,SAAA;KACF;IAEO,qBAAqB,GAAA;QAC3B,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;AACnD,YAAA,MAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC;AACxD,SAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;AAC/F,SAAA;QACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;AACrD,YAAA,MAAM,IAAI,KAAK,CAAC,iMAAiM,CAAC,CAAC;AACpN,SAAA;KACF;AAEO,IAAA,eAAe,CAAC,KAAa,EAAA;QACnC,MAAM,aAAa,GAAY,IAAI,CAAC,KAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC9B,QAAA,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,KAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC7B,YAAA,MAAM,IAAI,GAAiB,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAA0B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/H,IAAI,CAAC,QAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,QAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACrD,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC9B,SAAA;AACD,QAAA,IAAI,CAAC,uBAAuB,CAAC,iCAAiC,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;KAC/H;IAEO,WAAW,GAAA;AACjB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;KACrB;IACO,gBAAgB,GAAA;AACtB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;KAC5B;IACO,aAAa,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,YAAa,CAAC,mBAAoB,CAAC,SAAS,KAAK,IAAI,CAAC;KACtI;;AAntCU,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,oEA2HxB,QAAQ,EAAA,EAAA,EAAA,KAAA,EAAAC,4BAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;wGA3HP,uBAAuB,EAAA,QAAA,EAAA,6EAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,6EAA6E;AACvF,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAC;AACpC,iBAAA,CAAA;;0BA4HI,MAAM;2BAAC,QAAQ,CAAA;wNAzHoC,WAAW,EAAA,CAAA;sBAAhE,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAEpC,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,mBAAmB,EAAA,CAAA;sBAA3B,KAAK;gBAKO,YAAY,EAAA,CAAA;sBAAxB,KAAK;gBAQO,cAAc,EAAA,CAAA;sBAA1B,KAAK;gBAQO,eAAe,EAAA,CAAA;sBAA3B,KAAK;gBAQO,gBAAgB,EAAA,CAAA;sBAA5B,KAAK;gBAQO,aAAa,EAAA,CAAA;sBAAzB,KAAK;gBASG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBACG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBAEI,SAAS,EAAA,CAAA;sBAAlB,MAAM;gBACG,WAAW,EAAA,CAAA;sBAApB,MAAM;gBACG,WAAW,EAAA,CAAA;sBAApB,MAAM;gBACG,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;gBACG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBACG,mBAAmB,EAAA,CAAA;sBAA5B,MAAM;;;AC3DH,MAAO,aAAc,SAAQ,gBAAgB,CAAA;AA8GjD,IAAA,WAAA,CACU,UAAsB,EACtB,QAAkC,EAClC,WAAwB,EACxB,4BAA0D,EACxC,QAAa,EAC/B,OAAgB,EAChB,uBAAgD,EAChD,eAAuC,EACvC,eAAiC,EAAA;AACzC,QAAA,KAAK,EAAE,CAAC;QATA,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAA0B;QAClC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAA4B,CAAA,4BAAA,GAA5B,4BAA4B,CAA8B;QACxC,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAK;QAC/B,IAAO,CAAA,OAAA,GAAP,OAAO,CAAS;QAChB,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAyB;QAChD,IAAe,CAAA,eAAA,GAAf,eAAe,CAAwB;QACvC,IAAe,CAAA,eAAA,GAAf,eAAe,CAAkB;QArH3C,IAAQ,CAAA,QAAA,GAAY,KAAK,CAAC;QAC1B,IAAU,CAAA,UAAA,GAAY,KAAK,CAAC;QAC5B,IAAM,CAAA,MAAA,GAAW,CAAC,CAAC;QACnB,IAAM,CAAA,MAAA,GAAW,CAAC,CAAC;QACnB,IAAa,CAAA,aAAA,GAAU,EAAE,CAAC;QAC1B,IAAE,CAAA,EAAA,GAAkB,IAAI,CAAC;QACzB,IAAQ,CAAA,QAAA,GAAmC,IAAI,CAAC;QAChD,IAAU,CAAA,UAAA,GAAkB,IAAI,CAAC;QACjC,IAAsB,CAAA,sBAAA,GAAa,EAAE,CAAC;QACtC,IAAc,CAAA,cAAA,GAAa,EAAE,CAAC;QAC9B,IAAS,CAAA,SAAA,GAAa,EAAE,CAAC;QACzB,IAAqB,CAAA,qBAAA,GAAW,CAAC,CAAC;QAClC,IAAkB,CAAA,kBAAA,GAAW,CAAC,CAAC;QAC/B,IAAoB,CAAA,oBAAA,GAAW,EAAE,CAAC;QAClC,IAAmB,CAAA,mBAAA,GAAa,EAAE,CAAC;QACnC,IAAS,CAAA,SAAA,GAAa,EAAE,CAAC;QACzB,IAAW,CAAA,WAAA,GAAU,EAAE,CAAC;QACxB,IAAiB,CAAA,iBAAA,GAAU,EAAE,CAAC;QAC9B,IAAc,CAAA,cAAA,GAAuB,IAAI,CAAC;QAC1C,IAAc,CAAA,cAAA,GAAiB,EAAE,CAAC;QAClC,IAAsB,CAAA,sBAAA,GAAQ,IAAI,CAAC;QACnC,IAAqB,CAAA,qBAAA,GAAW,CAAC,CAAC,CAAC;QACnC,IAAmB,CAAA,mBAAA,GAAsB,IAAI,CAAC;QAC9C,IAA6B,CAAA,6BAAA,GAAwB,IAAI,CAAC;QAC1D,IAAiB,CAAA,iBAAA,GAAW,CAAC,CAAC,CAAC;QAC/B,IAAgB,CAAA,gBAAA,GAAkB,EAAE,CAAC;QACrC,IAAc,CAAA,cAAA,GAAkB,EAAE,CAAC;QACnC,IAAY,CAAA,YAAA,GAAkB,EAAE,CAAC;QACjC,IAAkB,CAAA,kBAAA,GAAkB,EAAE,CAAC;QACvC,IAAsB,CAAA,sBAAA,GAAkB,EAAE,CAAC;QAC3C,IAAI,CAAA,IAAA,GAAkB,EAAE,CAAC;QACzB,IAAuB,CAAA,uBAAA,GAAkB,EAAE,CAAC;QAC5C,IAAwB,CAAA,wBAAA,GAAkB,EAAE,CAAC;QAC7C,IAAsB,CAAA,sBAAA,GAAkB,EAAE,CAAC;QAC3C,IAAoB,CAAA,oBAAA,GAAkB,EAAE,CAAC;QACzC,IAA0B,CAAA,0BAAA,GAAkB,EAAE,CAAC;QAC/C,IAA8B,CAAA,8BAAA,GAAkB,EAAE,CAAC;QACnD,IAAY,CAAA,YAAA,GAAkB,EAAE,CAAC;QACjC,IAA+B,CAAA,+BAAA,GAAkB,EAAE,CAAC;AACpD,QAAA,IAAA,CAAA,OAAO,GAAoB,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;QAC1B,IAAS,CAAA,SAAA,GAA4B,IAAI,CAAC;QAC1C,IAAS,CAAA,SAAA,GAAuB,EAAE,CAAC;QACnC,IAAa,CAAA,aAAA,GAAU,EAAE,CAAC;QAC1B,IAAmB,CAAA,mBAAA,GAAwB,SAAS,CAAC;QACrD,IAAW,CAAA,WAAA,GAAU,EAAE,CAAC;QACxB,IAAmB,CAAA,mBAAA,GAAwB,IAAI,CAAC;QAChD,IAAQ,CAAA,QAAA,GAA4B,IAAI,CAAC;QACzC,IAAe,CAAA,eAAA,GAAY,KAAK,CAAC;QAGjC,IAAY,CAAA,YAAA,GAAgB,EAAE,CAAC;QAE/B,IAAO,CAAA,OAAA,GAAuB,IAAI,CAAC;QACnC,IAAa,CAAA,aAAA,GAAoB,EAAE,CAAC;QACpC,IAAqB,CAAA,qBAAA,GAAU,EAAE,CAAC;QAElC,IAAyB,CAAA,yBAAA,GAAqC,IAAI,CAAC;QACnE,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;QACxB,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;QACxB,IAAsB,CAAA,sBAAA,GAAW,CAAC,CAAC;QACnC,IAAc,CAAA,cAAA,GAAW,CAAC,CAAC;;QAK3B,IAAgB,CAAA,gBAAA,GAAW,uBAAuB,CAAC;;QAGnD,IAAU,CAAA,UAAA,GAA4B,IAAI,CAAC;QAC3C,IAAkB,CAAA,kBAAA,GAA4B,IAAI,CAAC;QACnD,IAAqB,CAAA,qBAAA,GAA4B,IAAI,CAAC;QACtD,IAA6B,CAAA,6BAAA,GAA4B,IAAI,CAAC;QAC9D,IAAc,CAAA,cAAA,GAAgC,EAAE,CAAC;QACjD,IAAiB,CAAA,iBAAA,GAAgC,EAAE,CAAC;QACpD,IAAe,CAAA,eAAA,GAAgC,EAAE,CAAC;QAClD,IAAkB,CAAA,kBAAA,GAAgC,EAAE,CAAC;QACrD,IAAiB,CAAA,iBAAA,GAAQ,EAAE,CAAC;QAC5B,IAA2B,CAAA,2BAAA,GAA4B,IAAI,CAAC;QAC5D,IAAwB,CAAA,wBAAA,GAA4B,IAAI,CAAC;QACzD,IAAmB,CAAA,mBAAA,GAAW,CAAC,CAAC;QAChC,IAAyB,CAAA,yBAAA,GAAW,CAAC,CAAC;QAEtC,IAAuB,CAAA,uBAAA,GAAmC,IAAI,CAAC;QAE/D,IAAmB,CAAA,mBAAA,GAAa,EAAE,CAAC;AAC5B,QAAA,IAAA,CAAA,mBAAmB,GAAsC,IAAI,OAAO,EAA4B,CAAC;QAEjG,IAAmB,CAAA,mBAAA,GAAW,kBAAkB,CAAC;AAGhD,QAAA,IAAA,CAAA,gCAAgC,GAAG,IAAI,cAAc,CAAM,kCAAkC,CAAC,CAAC;QAE/F,IAAiB,CAAA,iBAAA,GAAa,EAAE,CAAC;QAEhC,IAAS,CAAA,SAAA,GAAuB,SAAS,CAAC;QAC1C,IAA0B,CAAA,0BAAA,GAAY,KAAK,CAAC;AAE3C,QAAA,IAAA,CAAA,iBAAiB,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC/D,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC1D,QAAA,IAAA,CAAA,eAAe,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC7D,QAAA,IAAA,CAAA,aAAa,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC3D,QAAA,IAAA,CAAA,kBAAkB,GAAsB,IAAI,YAAY,EAAO,CAAC;AAChE,QAAA,IAAA,CAAA,QAAQ,GAAsB,IAAI,YAAY,EAAO,CAAC;AACtD,QAAA,IAAA,CAAA,gBAAgB,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC9D,QAAA,IAAA,CAAA,iBAAiB,GAAsB,IAAI,YAAY,CAAM,IAAI,CAAC,CAAC;AACnE,QAAA,IAAA,CAAA,cAAc,GAAsB,IAAI,YAAY,CAAM,IAAI,CAAC,CAAC;AAaxE,QAAA,OAAO,CAAC,GAAG,CAAC,qJAAqJ,CAAC,CAAC;QACnK,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,CAAC,sBAAsB,EAAE,CAAC;KAC/B;IAEO,0BAA0B,GAAA;QAChC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,GAAG,IAAI,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,GAAG,IAAI,CAAC;KAClE;IAEO,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,MAAM,GAAG,GAAQ,IAAI,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAA2B,KAAI;AACnE,gBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAwB,KAAI;AAC7C,oBAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAChC,iBAAC,CAAC,CAAC;AACL,aAAC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;;AAEnD,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,aAAa,EAAE,KAAK;AACrB,aAAA,CAAC,CAAC;AACJ,SAAA;KACF;AAEO,IAAA,eAAe,CAAC,QAAwB,EAAA;AAC9C,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACnD,YAAA,UAAU,CAAC,OAAO,CAAC,IAAI,IAAG;AAExB,gBAAA,IAAI,CAAC,4BAA4B,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAC/D,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC3B,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;AAEO,IAAA,aAAa,CAAC,IAAS,EAAA;QAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAc,KAAI;AACzC,YAAA,IAAI,CAAC,4BAA4B,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACpE,IAAI,SAAS,CAAC,YAAY,EAAE;AAC1B,gBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC/B,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;IAEM,eAAe,GAAA;AAGpB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;AACzF,QAAA,IAAI,QAAQ,KAAK,IAAI,KAAK,QAAQ,CAAC,uBAAuB,KAAK,IAAI,IAAI,QAAQ,CAAC,uBAAuB,KAAK,SAAS,CAAC,EAAE;;AAEtH,YAAA,MAAM,WAAW,GAAe,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;AAEzD,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,uBAAuB,CACxD,WAAW,EACX,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,4BAA4B,EACjC,IAAI,CAAC,uBAAuB,EAC5B,IAAI,CAAC,eAAe,EACpB,IAAI,EACJ,IAAI,CAAC,eAAe,CACrB,CAAC;AAEF,YAAA,IAAI,CAAC,uBAAuB,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;AAEpE,YAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC;AACxC,YAAA,IAAI,CAAC,uBAAuB,CAAC,eAAe,EAAE,CAAC;AAEhD,SAAA;;QAKD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE;AAC5C,YAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAQ,KAAI;AACtC,gBAAA,IAAI,EAAE,GAA6B,CAAC,CAAC,MAAqB,CAAC;AAC3D,gBAAA,IAAI,EAAE,EAAE;AACN,oBAAA,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;AAC7D,wBAAA,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;AACvB,qBAAA;AACD,oBAAA,IAAI,EAAE,EAAE;wBACN,EAAE,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAClC,qBAAA;AACF,iBAAA;AACH,aAAC,CAAA;YACD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;AACxE,YAAA,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;AAChD,SAAA;QACD,MAAM,gBAAgB,GAAW,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,KAAI;AAC1E,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACrC,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KAC/C;IAEO,YAAY,CAAC,GAAQ,EAAE,SAAc,EAAA;AAE3C,QAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;AAC7B,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,8BAA8B,CAAC,MAAM,KAAK,CAAC,EAAE;YAChG,MAAM,gBAAgB,GAAW,MAAM,CAAC,qBAAqB,CAAC,CAAC,OAAO,KAAI;AACxE,gBAAA,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjC,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9C,OAAO;AACR,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,8BAA8B,CAAC,MAAM,KAAK,CAAC,EAAE;AAChG,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAE5B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC;YAC/D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;YAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;YACvD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,CAAC;YACnE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,8BAA8B,CAAC,MAAM,EAAE,CAAC;YAC3E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,+BAA+B,CAAC,MAAM,EAAE,CAAC;AAE7E,YAAA,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;AACnC,YAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;AACjC,YAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,YAAA,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;AACrC,YAAA,IAAI,CAAC,8BAA8B,GAAG,EAAE,CAAC;AACzC,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,+BAA+B,GAAG,EAAE,CAAC;AAC3C,SAAA;AAED,QAAA,MAAM,4BAA4B,GAAQ,IAAI,CAAC,sBAAsB,CAAC;AACtE,QAAA,MAAM,EAAE,GAAG,4BAA4B,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAa,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AACnC,QAAA,MAAM,OAAO,GAAgB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAGhG,QAAA,IAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE;AAC3C,YAAA,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,SAAS,CAAC,SAAS,IAAG;AAC3G,gBAAA,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;AACvC,aAAC,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,gCAAgC,EAAE;AAC1C,YAAA,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CACxE,CAAC,MAAgC,KAAI;AAEnC,gBAAA,IAAI,MAAM,EAAE;AACV,oBAAA,MAAM,aAAa,GAAkB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AAC3F,oBAAA,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;oBAGzC,IAAI,MAAM,CAAC,wBAAwB,EAAE;wBACnC,IAAI,CAAC,yBAAyB,EAAE,CAAC;wBACjC,MAAM,YAAY,GAA2B,MAAM,CAAC,eAAe,CAAC,OAAe,CAAC,YAAY,CAAC;wBACjG,YAAY,CAAC,wBAAwB,EAAE,CAAC;AAEzC,qBAAA;AAED,oBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;wBAClB,IAAI,MAAM,CAAC,wBAAwB,EAAE;4BACnC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;AACtE,4BAAA,MAAM,iBAAiB,GAAW,IAAI,CAAC,qBAAqB,EAAE,CAAC;4BAC/D,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACxB,4BAAA,MAAM,eAAe,GAAW,IAAI,CAAC,QAAS,CAAC,WAAW,CAAC;4BAC3D,IAAI,QAAQ,GAAW,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;AAC9E,4BAAA,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,SAAS,IAAG;gCAC9C,MAAM,UAAU,GAAW,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gCACvE,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACnC,oCAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,GAAG,eAAe,GAAG,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;;AAE7F,iCAAA;AAAM,qCAAA;AACL,oCAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AACxF,iCAAA;AACH,6BAAC,CAAC,CAAA;4BAEF,IAAI,IAAI,CAAC,0BAA0B,EAAE;gCACnC,IAAI,CAAC,4BAA4B,EAAE,CAAC;AACrC,6BAAA;AAED,4BAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC7B,yBAAA;AACF,qBAAA;oBACD,IAAI,CAAC,YAAY,EAAE,CAAC;AACrB,iBAAA;AACL,aAAC,CAAC,CAAC;AACJ,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAC;AACpD,SAAA;AACD,QAAA,MAAM,gBAAgB,GAAW,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AAExF,QAAA,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE;YAC7C,MAAM,gBAAgB,GAAW,MAAM,CAAC,qBAAqB,CAAC,CAAC,OAAO,KAAI;AACxE,gBAAA,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjC,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA;YACL,MAAM,IAAI,GAAU,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,gBAAgB,EAAE;gBACvE,MAAM,gBAAgB,GAAW,MAAM,CAAC,qBAAqB,CAAC,CAAC,OAAO,KAAI;AACxE,oBAAA,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAChC,iBAAC,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/C,aAAA;AAAM,iBAAA;gBACL,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC9B,aAAA;AACF,SAAA;KACF;AAEM,IAAA,aAAa,CAAC,MAAe,EAAA;AAClC,QAAA,OAAQ,MAAc,CAAC,YAAY,CAAC,OAAO,CAAC;KAC7C;IAEM,qBAAqB,GAAA;AAC1B,QAAA,MAAM,SAAS,GAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,IAAS,KAAI;AAC5D,YAAA,IAAI,GAAG,GAAU,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,aAAA;AACD,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACzB,EAAE,EAAE,CAAC,CAAC;KACR;AAEO,IAAA,aAAa,CAAC,IAAS,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,IAAI,GAAG,GAAU,EAAE,CAAC;AACpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/C,MAAM,OAAO,GAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACxC,YAAA,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1B,YAAA,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,gBAAA,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,aAAA;AACF,SAAA;AAED,QAAA,OAAO,GAAG,CAAC;KACZ;IAEM,kBAAkB,GAAA;AACvB,QAAA,MAAM,SAAS,GAAQ;AACrB,YAAA,YAAY,EAAE,EAAE;SACjB,CAAC;QACF,MAAM,iBAAiB,GAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAuB,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAiB,KAAI;YACrF,IAAI,UAAU,GAAW,CAAC,CAAC;YAC3B,OAAO;AACL,gBAAA,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,IAAI,CAAC,KAAK;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,gBAAA,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC;aAC1D,CAAC;AACJ,SAAC,CAAC,CAAC;AACH,QAAA,SAAS,CAAC,YAAY,GAAG,cAAc,CAAC;AACxC,QAAA,OAAO,SAAS,CAAC;KAClB;IAED,sBAAsB,CAAC,IAAiB,EAAE,UAAkB,EAAA;AAC1D,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAClD,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,UAAU,GAAuB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAoB,KAAI;YACjF,OAAO;AACL,gBAAA,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,OAAO,CAAC,KAAK;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,YAAY,EAAE,IAAI,CAAC,KAAK;gBACxB,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC;aAC7D,CAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,UAAU,CAAC;KAEnB;IAEM,qBAAqB,GAAA;AAC1B,QAAA,MAAM,4BAA4B,GAAQ,IAAI,CAAC,sBAAsB,CAAC;AACtE,QAAA,MAAM,EAAE,GAAG,4BAA4B,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAa,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,MAAM,SAAS,GAAQ,aAAa,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAU,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACpD,QAAA,MAAM,gBAAgB,GAAW,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAExF,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,gBAAgB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE;YAC3G,MAAM,gBAAgB,GAAW,MAAM,CAAC,qBAAqB,CAAC,CAAC,OAAO,KAAI;AACxE,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAClC,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE;YACjD,MAAM,gBAAgB,GAAW,MAAM,CAAC,qBAAqB,CAAC,CAAC,OAAO,KAAI;AACxE,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAClC,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;AACjB,aAAA;AAAM,iBAAA;gBACL,MAAM,gBAAgB,GAAW,MAAM,CAAC,qBAAqB,CAAC,CAAC,OAAO,KAAI;AACxE,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,iBAAC,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/C,aAAA;AACF,SAAA;KACF;IAEO,WAAW,CAAC,GAAQ,EAAE,SAAc,EAAA;QAC1C,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC9B;IAEO,gBAAgB,CAAC,GAAQ,EAAE,SAAc,EAAA;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;KACjB;AAEO,IAAA,aAAa,CAAC,KAAU,EAAA;QAE9B,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAE3B,QAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE;YACxC,OAAO;AACR,SAAA;;AAED,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAAE,OAAO;AAAE,SAAA;;QAGnC,IAAI,CAAC,cAAc,EAAE,CAAC;AAEtB,QAAA,MAAM,EAAE,GAAgB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AACtD,QAAA,IAAI,aAA4B,CAAC;AAEjC,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,EAAE;YAC5C,OAAO;AACR,SAAA;QAED,MAAM,wBAAwB,GAAc,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QACpF,MAAM,cAAc,GAAc,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAEvE,IAAI,wBAAwB,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YACpE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC;AAChD,YAAA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC,CAAgB,CAAC;AAEvD,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAC3B,gBAAA,YAAY,EAAE,KAAK;gBACnB,aAAa,EAAE,IAAI,CAAC,cAAc;gBAClC,aAAa,EAAE,IAAI,CAAC,cAAc;AACnC,aAAA,CAAC,CAAC;YACH,MAAM,uBAAuB,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;AACnF,gBAAA,MAAM,EAAE;AACN,oBAAA,YAAY,EAAE,KAAK;oBACnB,aAAa,EAAE,IAAI,CAAC,cAAc;oBAClC,aAAa,EAAE,IAAI,CAAC,cAAc;AACnC,iBAAA;AACF,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;YACnF,MAAM,MAAM,GAAQ,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC;AAChE,YAAA,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC;AAChE,YAAA,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC;YAE/D,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAClC,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAElC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;YAClD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;AAClD,YAAA,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAEpD,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC7C,YAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAEpD,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC;YAElD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;gBACvC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE;AACnD,oBAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;AACpC,iBAAA;AACH,aAAC,CAAC,CAAC;YACH,IAAI,CAAC,sBAAsB,GAAI,wBAAwB,CAAC,CAAC,CAAiB,CAAC,qBAAqB,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC;AAC3J,YAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,IAAI,IAAG;AAC5F,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAClD,gBAAA,MAAM,IAAI,GAAQ;AAChB,oBAAA,IAAI,EAAG,IAAoB,CAAC,qBAAqB,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAmB,CAAC;AAC5G,oBAAA,KAAK,EAAE,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO;oBAC1C,GAAG,EAAE,YAAY,CAAC,GAAG;oBACrB,MAAM,EAAE,YAAY,CAAC,MAAM;oBAC3B,KAAK,EAAE,YAAY,CAAC,KAAK;oBACzB,MAAM,EAAE,YAAY,CAAC,MAAM;iBAC5B,CAAC;AACF,gBAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;AACnB,gBAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAClB,gBAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACjB,gBAAA,OAAO,IAAI,CAAC;AACd,aAAC,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;AAEpC,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO;AACR,SAAA;;AAGD,QAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,YAAA,MAAM,iBAAiB,GAAc,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAE9F,MAAM,GAAG,GAAc,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAG;gBACrD,IAAI,UAAU,GAAmB,IAAI,CAAC;AACtC,gBAAA,aAAa,CAAC,OAAO,CAAC,YAAY,IAAG;oBACnC,IAAI,IAAI,KAAK,YAAY,EAAE;wBACzB,UAAU,GAAG,YAAY,CAAC;AAC3B,qBAAA;AACH,iBAAC,CAAC,CAAC;gBACH,OAAO,UAAU,KAAK,IAAI,CAAC;AAC7B,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;gBACpB,OAAO;AACR,aAAA;AACF,SAAA;AAED,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,QAAQ,GAAc,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AAC7D,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;;QAGpE,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACnC,YAAA,MAAM,eAAe,GAAW,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjE,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE;AAC/D,gBAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACvB,aAAA;AACF,SAAA;QAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,SAAiB,KAAI;YACxD,MAAM,IAAI,GAAW,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE;AAC5C,gBAAA,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC;AACjC,aAAA;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAExB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;AAE5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,YAAA,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,cAAc,EAAE,IAAI,CAAC,qBAAqB;YAC1C,mBAAmB,EAAE,IAAI,CAAC,sBAAsB;AACjD,SAAA,CAAC,CAAC;QACH,MAAM,sBAAsB,GAAG,IAAI,WAAW,CAAC,iBAAiB,CAAC,eAAe,EAAE;AAChF,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,KAAK;gBACnB,WAAW,EAAE,IAAI,CAAC,kBAAkB;gBACpC,cAAc,EAAE,IAAI,CAAC,qBAAqB;gBAC1C,mBAAmB,EAAE,IAAI,CAAC,sBAAsB;AACjD,aAAA;AACF,SAAA,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;;QAElF,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;KAClC;AAEO,IAAA,qBAAqB,CAAC,SAAiB,EAAA;QAC7C,MAAM,UAAU,GAAW,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvE,IAAI,IAAI,GAAW,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,0BAA0B,EAAE;YACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC7B,YAAA,IAAI,eAAe,GAAW,IAAI,CAAC,QAAS,CAAC,WAAW,CAAC;AACzD,YAAA,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,eAAe,EAAE,QAAQ,EAAE,CAAC;AAC1D,SAAA;AACD,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;KACrB;IAEO,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,IAAG;AAC3C,YAAA,MAAM,OAAO,GAAY,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AACtF,YAAA,MAAM,QAAQ,GAAW,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;AACxF,YAAA,IAAI,IAAI,GAAW,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACtE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACnF,YAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE;AACrG,gBAAA,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC;AACpC,aAAA;AACD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,kBAAkB,CAAC,MAAmB,EAAA;AAC5C,QAAA,IAAI,CAAC,yBAAyB,EAAE,UAAU,CAAE,MAAc,CAAC,YAAY,EAAG,MAAc,CAAC,mBAAmB,CAAC,CAAA;KAC9G;AAEO,IAAA,uBAAuB,CAAC,EAAsB,EAAA;QAEpD,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,CAAC,CAAC;AACV,SAAA;AACD,QAAA,IAAI,YAAY,GAAW,EAAE,CAAC,UAAU,CAAC;AACzC,QAAA,OAAO,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE;AAC3B,YAAA,EAAE,GAAG,EAAG,CAAC,aAAa,CAAC;AACvB,YAAA,YAAY,IAAI,EAAG,CAAC,UAAU,CAAC;AAChC,SAAA;;AAGD,QAAA,YAAY,IAAI,EAAG,CAAC,aAAc,CAAC,UAAU,CAAC;AAE9C,QAAA,OAAO,YAAY,CAAC;KACrB;AAEO,IAAA,aAAa,CAAC,KAAU,EAAA;AAC9B,QAAA,MAAM,GAAG,GAAkB,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AAE5D,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,EAAE;YAE3C,GAAG,CAAC,cAAc,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC;YACjD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC;AACjD,YAAA,GAAG,CAAC,sBAAsB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAEnD,YAAA,MAAM,UAAU,GAAW,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,sBAAsB,GAAG,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEtH,YAAA,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE;gBAC/B,OAAO;AACR,aAAA;AACD,YAAA,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;AACrB,gBAAA,YAAY,EAAE,KAAK;gBACnB,aAAa,EAAE,GAAG,CAAC,cAAc;gBACjC,aAAa,EAAE,GAAG,CAAC,sBAAsB;AAC1C,aAAA,CAAC,CAAC;YACH,MAAM,kBAAkB,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE;AACxE,gBAAA,MAAM,EAAE;AACN,oBAAA,YAAY,EAAE,KAAK;oBACnB,aAAa,EAAE,GAAG,CAAC,cAAc;oBACjC,aAAa,EAAE,GAAG,CAAC,sBAAsB;AAC1C,iBAAA;AACF,aAAA,CAAC,CAAC;YACH,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YAE7E,IAAI,aAAa,GAAW,CAAC,CAAC;AAC9B,YAAA,IAAI,WAAuB,CAAC;AAC5B,YAAA,IAAI,eAAmC,CAAC;AAExC,YAAA,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,6BAA8B,EAAE;AAErD,gBAAA,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;AACjE,oBAAA,MAAM,GAAG,GAAW,IAAI,CAAC,IAAI,CAAC;AAC9B,oBAAA,MAAM,GAAG,GAAW,IAAI,CAAC,KAAK,CAAC;oBAE/B,IAAI,CAAC,UAAU,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,EAAE;wBACjC,aAAa,GAAG,CAAC,CAAC;AACnB,qBAAA;AAAM,yBAAA;wBACL,aAAa,GAAG,CAAC,CAAC;AACnB,qBAAA;oBACD,WAAW,GAAG,IAAI,CAAC;oBACnB,eAAe,GAAG,GAAG,CAAC,6BAA8B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACnE,MAAM;AACP,iBAAA;AACF,aAAA;YAED,IAAI,eAAe,KAAK,SAAS,EAAE;gBACjC,OAAO;AACR,aAAA;YACD,IAAI,GAAG,CAAC,mBAAmB,KAAK,WAAY,IAAI,GAAG,CAAC,iBAAiB,KAAK,aAAa,EAAE;gBACvF,OAAO;AACR,aAAA;AACD,YAAA,GAAG,CAAC,iBAAiB,GAAG,aAAa,CAAC;AACtC,YAAA,GAAG,CAAC,mBAAmB,GAAG,WAAY,CAAC;AAEvC,YAAA,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACvD,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,sBAAsB,EAAE,aAAa,CAAC,CAAC;AAEhE,YAAA,MAAM,iBAAiB,GAAY,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,eAAe,CAAC,CAAC;AAEhG,YAAA,GAAG,CAAC,sBAAsB,GAAG,iBAAiB,CAAC;AAE/C,YAAA,IAAI,wBAAwB,GAAW,CAAC,CAAC,CAAC;AAC1C,YAAA,IAAI,uBAAuB,GAAW,CAAC,CAAC,CAAC;AACzC,YAAA,IAAI,wBAAwB,GAAW,CAAC,CAAC,CAAC;AAC1C,YAAA,IAAI,uBAAuB,GAAW,CAAC,CAAC,CAAC;AACzC,YAAA,IAAI,UAAU,GAAW,CAAC,CAAC,CAAC;AAC5B,YAAA,IAAI,UAAU,GAAW,CAAC,CAAC,CAAC;YAC5B,IAAI,YAAY,GAAqC,IAAI,CAAC;YAE1D,MAAM,MAAM,GAAQ,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAoB,EAAE,QAAgB,KACnF,KAAK,CAAC,OAAO,CAAC,CAAC,UAAuB,EAAE,KAAa,KAAI;AACrD,gBAAA,MAAM,IAAI,GAAmB,UAAU,CAAC,KAAK,CAAC;gBAC9C,IAAI,IAAI,KAAK,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAA6B,CAAC,EAAE;oBACpE,wBAAwB,GAAG,QAAQ,CAAC;oBACpC,uBAAuB,GAAG,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAC3D,UAAU,GAAG,KAAK,CAAC;oBACnB,YAAY,GAAG,KAAK,CAAC;AACtB,iBAAA;gBACD,IAAI,IAAI,KAAK,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,sBAAqC,CAAC,EAAE;oBAC5E,wBAAwB,GAAG,QAAQ,CAAC;oBACpC,uBAAuB,GAAG,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAC3D,UAAU,GAAG,KAAK,CAAC;AACpB,iBAAA;aACJ,CAAC,CACH,CAAC;AAEF,YAAA,IAAI,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC,sBAAsB,EAAE;gBACrD,OAAO;AACR,aAAA;YACD,IAAI,YAAY,GAAsB,IAAI,CAAC;YAC3C,MAAM,UAAU,GAAiB,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;AAC7D,YAAA,IAAI,gBAAgB,GAAW,CAAC,CAAC,CAAC;AAClC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC/C,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;gBACjC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,YAAa,CAAC,MAAM,EAAE;oBACvD,YAAY,GAAG,IAAI,CAAC;oBACpB,gBAAgB,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACrD,iBAAA;AACH,aAAC,CAAC,CAAC;AACH,YAAA,MAAM,SAAS,IAAY,uBAAuB,GAAG,CAAC,CAAC,CAAC;AACxD,YAAA,MAAM,OAAO,IAAY,uBAAuB,GAAG,CAAC,CAAC,CAAC;;YAGtD,IAAI,YAAY,KAAK,IAAI,EAAE;gBACzB,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAC1C,KAAK,IAAG;AACN,oBAAA,MAAM,QAAQ,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,oBAAA,MAAM,SAAS,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,oBAAA,IAAI,SAAS,IAAI,QAAQ,IAAI,SAAS,GAAG,SAAS,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,EAAE;wBAChG,IAAI,wBAAwB,KAAK,wBAAwB,EAAE;4BACzD,IAAI,aAAa,KAAK,CAAC,EAAE;gCACvB,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC7D,6BAAA;AAAM,iCAAA;gCACL,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC5D,6BAAA;AACD,4BAAA,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,sBAAsB,EAAE,aAAa,EAAE,CAAC,CAAC;AACnF,yBAAA;AACF,qBAAA;AACH,iBAAC,CACF,CAAC;AACH,aAAA;AAAM,iBAAA;gBACL,IAAI,wBAAwB,KAAK,wBAAwB,EAAE;oBACzD,IAAI,aAAa,KAAK,CAAC,EAAE;wBACvB,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC7D,qBAAA;AAAM,yBAAA;wBACL,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC5D,qBAAA;AACD,oBAAA,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,sBAAsB,EAAE,aAAa,EAAE,CAAC,CAAC;AACnF,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;YACjB,OAAO;AACR,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7E,QAAA,MAAM,kBAAkB,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC;AAC7E,QAAA,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,IAAI,QAAQ,GAAW,GAAG,CAAC,kBAAkB,GAAG,WAAW,CAAC;AAC5D,QAAA,MAAM,oBAAoB,GAAW,QAAQ,GAAG,GAAG,CAAC,qBAAqB,CAAC;QAE1E,IAAI,oBAAoB,IAAI,CAAC,EAAE;YAC7B,OAAO;AACR,SAAA;AAED,QAAA,IAAI,kBAAkB,EAAE;AACtB,YAAA,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC5B,SAAA;AACD,QAAA,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC;AACpB,YAAA,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,GAAG,CAAC,kBAAkB;YACnC,cAAc,EAAE,GAAG,CAAC,qBAAqB;AAC1C,SAAA,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,IAAI,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE;AACrE,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,KAAK;gBACnB,WAAW,EAAE,GAAG,CAAC,kBAAkB;gBACnC,cAAc,EAAE,GAAG,CAAC,qBAAqB;AAC1C,aAAA;AACF,SAAA,CAAC,CAAC;QACH,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;KAC7E;IAEO,yBAAyB,GAAA;QAC/B,IAAI,iBAAiB,GAAW,CAAC,CAAC;QAClC,IAAI,sBAAsB,GAAW,EAAE,CAAC;AAExC,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,IAAG;YAC3C,MAAM,cAAc,GAAW,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAC3E,YAAA,MAAM,cAAc,GAAW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;AAC1E,YAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gBAC/D,IAAI,cAAc,GAAG,iBAAiB,EAAE;oBACtC,iBAAiB,GAAG,cAAc,CAAC;oBACnC,sBAAsB,GAAG,SAAS,CAAC;AACpC,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,sBAAsB,CAAC;KAC/B;AAEO,IAAA,gBAAgB,CAAC,UAAuB,EAAA;AAC9C,QAAA,IAAI,SAAS,GAAkB,UAAU,CAAC,SAAS,CAAC;QACpD,IAAI,KAAK,GAAgB,UAAU,CAAC;AACpC,QAAA,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,YAAA,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AACrB,YAAA,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;AAC7B,SAAA;AACD,QAAA,OAAO,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;KAC3B;AAEO,IAAA,uBAAuB,CAAC,SAAiB,EAAA;QAC/C,MAAM,cAAc,GAAW,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAC3E,QAAA,MAAM,cAAc,GAAW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;AAC1E,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KACpE;AAEO,IAAA,6BAA6B,CAAC,cAAoC,EAAA;AACxE,QAAA,MAAM,GAAG,GAAW,cAAc,CAAC,MAAM,CAAC;QAC1C,IAAI,0BAA0B,GAAW,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAC5B,YAAA,MAAM,IAAI,GAAQ,cAAc,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACjD,gBAAA,0BAA0B,EAAE,CAAC;AAC9B,aAAA;AACF,SAAA;AACD,QAAA,OAAO,0BAA0B,CAAC;KACnC;AAEO,IAAA,sCAAsC,CAAC,kBAAwC,EAAA;AACrF,QAAA,IAAI,QAAQ,GAAW,CAAC,CAAC,CAAC;AAC1B,QAAA,kBAAkB,CAAC,OAAO,CAAC,SAAS,IAAG;AACrC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACzE,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAC9D,IAAI,QAAQ,GAAG,cAAc,EAAE;gBAC7B,QAAQ,GAAG,cAAc,CAAC;AAC3B,aAAA;AACH,SAAC,CAAC,CAAC;QACH,OAAO,QAAQ,GAAG,CAAC,CAAC;KACrB;;AAGO,IAAA,uBAAuB,CAAC,aAAqB,EAAA;QACnD,IAAI,KAAK,GAAW,CAAC,CAAC;AACtB,QAAA,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,IAAI,GAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAClF,YAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gBAClD,KAAK,IAAI,IAAI,CAAC;AACf,aAAA;AACF,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;;AAGO,IAAA,8BAA8B,CAAC,aAAqB,EAAA;QAC1D,IAAI,KAAK,GAAW,CAAC,CAAC;AACtB,QAAA,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,IAAI,GAAW,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAChF,YAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gBAClD,KAAK,IAAI,IAAI,CAAC;AACf,aAAA;AACF,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;;AAGO,IAAA,2BAA2B,CAAC,kBAAwC,EAAA;QAC1E,IAAI,KAAK,GAAW,CAAC,CAAC;QACtB,IAAI,QAAQ,GAAG,QAAQ,CAAC;AACxB,QAAA,kBAAkB,CAAC,OAAO,CAAC,SAAS,IAAG;AACrC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACzE,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAC9D,IAAI,QAAQ,GAAG,cAAc,EAAE;gBAC7B,QAAQ,GAAG,cAAc,CAAC;AAC3B,aAAA;AACH,SAAC,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,SAAS,GAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,IAAI,GAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YACrF,KAAK,IAAI,IAAI,CAAC;AACf,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAEO,IAAA,qBAAqB,CAAC,QAAgB,EAAE,cAAoC,EAAE,0BAAkC,EAAE,kBAAwC,EAAA;AAEhK,QAAA,IAAI,eAAe,GAAW,IAAI,CAAC,QAAS,CAAC,WAAW,CAAC;AACzD,QAAA,IAAI,iBAAiB,GAAW,QAAQ,GAAG,eAAe,GAAG,GAAG,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAa,cAAc,CAAC,GAAG,CAAC,CAAC,IAAwB,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjG,QAAA,MAAM,iBAAiB,GAAW,cAAc,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,IAAY,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;QAErG,MAAM,mCAAmC,GAAW,IAAI,CAAC,sCAAsC,CAAC,kBAAkB,CAAC,CAAC;QACpH,MAAM,oBAAoB,GAAW,IAAI,CAAC,8BAA8B,CAAC,mCAAmC,CAAC,CAAC;AAC9G,QAAA,MAAM,yBAAyB,GAAW,oBAAoB,GAAG,eAAe,GAAG,GAAG,CAAC;QACvF,MAAM,iBAAiB,GAAW,IAAI,CAAC,uBAAuB,CAAC,mCAAmC,CAAC,CAAC;QAEpG,IAAI,mBAAmB,GAAW,CAAC,CAAC;AACpC,QAAA,mBAAmB,GAAG,IAAI,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAW,CAAC,mBAAmB,GAAG,iBAAiB,GAAG,iBAAiB,IAAI,GAAG,CAAC;AAEjG,QAAA,IAAI,mBAAmB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,GAAG,EAAE;YAC7E,MAAM,gBAAgB,GAAW,GAAG,IAAI,mBAAmB,GAAG,yBAAyB,CAAC,CAAC;YACzF,iBAAiB,GAAG,gBAAgB,CAAC;AACtC,SAAA;QACD,IAAI,QAAQ,GAAG,iBAAiB,EAAE;AAChC,YAAA,iBAAiB,GAAG,iBAAiB,GAAG,eAAe,GAAG,GAAG,CAAC;AAC/D,SAAA;QAED,cAAc,CAAC,IAAI,CAAC,CAAC,KAAU,EAAE,KAAU,KAAI;AAC7C,YAAA,MAAM,KAAK,GAAW,KAAK,CAAC,KAAK,CAAC;AAClC,YAAA,MAAM,KAAK,GAAW,KAAK,CAAC,KAAK,CAAC;YAClC,IAAI,KAAK,KAAK,KAAK,EAAE;AACnB,gBAAA,OAAO,CAAC,CAAC;AACV,aAAA;AACD,YAAA,OAAO,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAChC,SAAC,CAAC,CAAC;AAEH,QAAA,MAAM,yBAAyB,GAAa,cAAc,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACnF,QAAA,MAAM,oBAAoB,GAAW,yBAAyB,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,IAAY,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AACnH,QAAA,MAAM,cAAc,GAAa,cAAc,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC,CAAC;QAC/F,MAAM,cAAc,GAAW,iBAAiB,IAAI,oBAAoB,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC;QAGlG,IAAI,mCAAmC,GAAW,CAAC,CAAC;AACpD,QAAA,MAAM,iBAAiB,GAAW,cAAc,CAAC,MAAM,CAAC;QACxD,cAAc,CAAC,OAAO,CAAC,CAAC,IAAwB,EAAE,KAAa,KAAI;AACjE,YAAA,MAAM,UAAU,GAAW,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5E,YAAA,MAAM,iBAAiB,GAAW,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,GAAG,CAAC;YAErF,IAAI,iBAAiB,GAAW,cAAc,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC;YAC1E,IAAI,iBAAiB,GAAG,iBAAiB,EAAE;AACzC,gBAAA,mCAAmC,IAAI,iBAAiB,GAAG,iBAAiB,CAAC;gBAC7E,iBAAiB,GAAG,iBAAiB,CAAC;AACvC,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,cAAc,GAAW,iBAAiB,GAAG,KAAK,GAAG,CAAC,CAAC;gBAC7D,IAAI,cAAc,KAAK,CAAC,EAAE;AACxB,oBAAA,MAAM,gBAAgB,GAAW,mCAAmC,GAAG,cAAc,CAAC;oBACtF,iBAAiB,IAAI,gBAAgB,CAAC;oBACtC,mCAAmC,IAAI,gBAAgB,CAAC;AACzD,iBAAA;AACF,aAAA;YACD,MAAM,iBAAiB,GAAW,iBAAiB,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC;AACrE,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,iBAAiB,CAAC;AACnD,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,uBAAuB,GAAW,cAAc,GAAG,mCAAmC,CAAC;QAC3F,MAAM,qBAAqB,GAAU,EAAE,CAAC;AACxC,QAAA,KAAK,IAAI,CAAC,GAAG,mCAAmC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,IAAI,GAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAClF,YAAA,IAAI,YAAY,IAAa,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC;AAC/E,YAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gBAClD,qBAAqB,CAAC,IAAI,CAAC;AACzB,oBAAA,OAAO,EAAE,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI;AACtD,oBAAA,UAAU,EAAE,QAAQ;AACrB,iBAAA,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;QAED,MAAM,iBAAiB,GAAW,qBAAqB,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,IAAS,KAAK,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC5H,QAAA,qBAAqB,CAAC,OAAO,CAAC,CAAC,IAAS,KAAI;AAC1C,YAAA,MAAM,0BAA0B,GAAW,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;AAC5E,YAAA,MAAM,2BAA2B,GAAW,0BAA0B,GAAG,uBAAuB,CAAC;YACjG,MAAM,IAAI,GAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3F,YAAA,MAAM,cAAc,GAAW,IAAI,GAAG,2BAA2B,CAAC;YAClE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,cAAc,GAAG,GAAG,CAAC;AAC3D,SAAC,CAAC,CAAC;AAEH,QAAA,QAAQ,GAAG,iBAAiB,GAAG,GAAG,GAAG,eAAe,CAAC;AACrD,QAAA,IAAI,WAAW,GAAW,QAAQ,GAAG,oBAAoB,CAAC;AAC1D,QAAA,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAClD,QAAA,IAAI,CAAC,kBAAkB,IAAI,WAAW,CAAC;AAEvC,QAAA,MAAM,mBAAmB,GAAW,IAAI,CAAC,4BAA4B,EAAE,CAAC;AACxE,QAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAG;YACxC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,gBAAgB,GAAG,0CAA0C,GAAG,mBAAmB,GAAG,KAAK,CAAC;YAC7I,IAAI,CAAC,eAAe,EAAE,CAAC;AACzB,SAAC,CAAC,CAAC;KAEJ;AAEO,IAAA,oBAAoB,CAAC,QAAgB,EAAE,cAAoC,EAAE,0BAAkC,EAAA;AAErH,QAAA,IAAI,cAAc,GAAW,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;AAEhE,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,IAAwB,KAAI;AAClD,YAAA,MAAM,kBAAkB,GAAW,CAAC,GAAG,0BAA0B,CAAC;YAClE,IAAI,WAAW,GAAW,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAW,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAEzD,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,kBAAkB,GAAG,cAAc,EAAE;gBACpE,WAAW,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC1C,aAAA;AAAM,iBAAA;AACL,gBAAA,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC;AACnD,aAAA;AAED,YAAA,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAElD,YAAA,MAAM,UAAU,GAAW,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5E,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;YAE1D,MAAM,UAAU,GAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,YAAA,IAAI,MAAM,GAAG,QAAQ,GAAG,YAAY,IAAI,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC;AAC3E,YAAA,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;AAC3B,YAAA,UAAU,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEzD,YAAA,IAAI,CAAC,kBAAkB,IAAI,WAAW,CAAC;AACzC,SAAC,CAAC,CAAC;AAEH,QAAA,MAAM,mBAAmB,GAAW,IAAI,CAAC,4BAA4B,EAAE,CAAC;AAExE,QAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAG;YACxC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,gBAAgB,GAAG,0CAA0C,GAAG,mBAAmB,GAAG,KAAK,CAAC;YAC7I,IAAI,CAAC,eAAe,EAAE,CAAC;AACzB,SAAC,CAAC,CAAC;KACJ;IAEO,4BAA4B,GAAA;QAClC,MAAM,eAAe,GAAa,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,KAAa,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACvH,MAAM,UAAU,GAAW,eAAe,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,IAAY,KAAI;YAC/E,OAAO,IAAI,GAAG,IAAI,CAAC;SACpB,EAAE,CAAC,CAAC,CAAC;QAEN,MAAM,YAAY,GAAuC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,KAAa,KAAI;YAC3G,OAAO;AACL,gBAAA,KAAK,EAAE,IAAI,GAAG,UAAU,GAAG,GAAG;AAC9B,gBAAA,KAAK,EAAE,KAAK;aACb,CAAA;AACH,SAAC,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,CAAC,IAAsC,EAAE,KAAa,KAAI;YAC7E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC;AACjF,SAAC,CAAC,CAAA;KACH;AAEO,IAAA,YAAY,CAAC,QAAgB,EAAA;QACnC,MAAM,aAAa,GAAa,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,WAAmB,KAAI;AACtF,YAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACjD,SAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAyB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAI;YAC1E,OAAO;AACL,gBAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC/B,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,SAAS,EAAE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;aAC9C,CAAA;AACH,SAAC,CAAC,CAAC;QAEH,MAAM,qBAAqB,GAAyB,cAAc,CAAC,MAAM,CAAC,IAAI,IAAG;YAC/E,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvD,SAAC,CAAC,CAAA;QAEF,MAAM,0BAA0B,GAAW,IAAI,CAAC,6BAA6B,CAAC,qBAAqB,CAAC,CAAC;QAErG,IAAI,IAAI,CAAC,0BAA0B,EAAE;YACnC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,cAAc,CAAC,CAAC;AACzG,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,0BAA0B,CAAC,CAAC;AACxF,SAAA;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC3B;IAEO,kBAAkB,GAAA;QACxB,IAAI,SAAS,GAAG,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,IAAG;AAChC,YAAA,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;AAC3B,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,UAAW,CAAC,SAAS,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;AAEO,IAAA,mBAAmB,CAAC,EAAiB,EAAA;AAC3C,QAAA,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;KACtC;IAEO,kBAAkB,GAAA;AAExB,QAAA,MAAM,4BAA4B,GAAQ,IAAI,CAAC,sBAAsB,CAAC;AACtE,QAAA,IAAI,EAAW,CAAC;QAChB,MAAM,WAAW,GAAa,EAAE,CAAC;AAEjC,QAAA,IAAI,QAA0B,CAAC;AAC/B,QAAA,IAAI,KAAuB,CAAC;QAC5B,IAAI,SAAS,GAAG,EAAE,CAAC;AAEnB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;AACtG,YAAA,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;AAC7C,YAAA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACxC,YAAA,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AACzB,SAAA;AAAM,aAAA;AACL,YAAA,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC;AACnF,YAAA,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC;AACzE,SAAA;AACD,QAAA,IAAI,MAAc,CAAC;AAEnB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;AACtG,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,4BAA4B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5D,gBAAA,EAAE,GAAG,4BAA4B,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,aAAa,GAAa,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;AAE7D,gBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,SAAc,KAAI;oBACvC,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE;AACzC,wBAAA,MAAM,OAAO,GAAgB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;wBAChG,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;;wBAE5G,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;wBAC3D,MAAM,QAAQ,GAAW,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;AACpD,wBAAA,IAAI,IAAI,CAAC,0BAA0B,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;4BAC7E,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC;AAC9C,4BAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;4BACvC,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,yBAAA;AAAM,6BAAA;4BACL,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,CAAC;AAC3D,yBAAA;wBACD,SAAS,IAAI,MAAM,CAAC;wBACpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;AACvG,wBAAA,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7B,qBAAA;AACH,iBAAC,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;AACzF,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;AACtG,YAAA,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;AAC7B,SAAA;AACD,QAAA,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;AAEnC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;gBACtE,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;AAC1D,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1E,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;AACzF,aAAA;AACD,YAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,GAAG,QAAQ,CAAC;AACnF,YAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;AACzE,SAAA;KACF;AAEO,IAAA,QAAQ,CAAC,KAAuB,EAAE,YAAA,GAAwB,IAAI,EAAA;QACpE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5B,SAAA;AAED,QAAA,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,eAAe,EAAE,CAAC;AACxB,SAAA;KACF;IAEO,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAG;AAC7B,YAAA,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,CAAC;AACvC,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAU,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;KAC/C;IAEM,2BAA2B,GAAA;QAChC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;KAC3C;IAEO,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,qBAAqB,KAAK,SAAS,CAAC,EAAE;AACtL,YAAA,MAAM,QAAQ,GAAqB,QAAQ,CAAC,sBAAsB,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC9C,YAAA,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AACxB,YAAA,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,8BAA8B,GAAG,IAAI,CAAC,EAAE,GAAG,0DAA0D,CAAC;AAClI,YAAA,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,YAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;AACnC,YAAA,IAAI,CAAC,6BAA6B,GAAG,QAAQ,CAAC;AAE9C,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAE5B,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;AACxG,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,6BAA6B,GAAG,IAAI,CAAC,6BAA6B,CAAC;AACzH,aAAA;AACF,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC;AACxG,YAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,6BAA6B,CAAC;AACzH,SAAA;KACF;AAEO,IAAA,UAAU,CAAC,OAAgB,EAAA;QACjC,MAAM,OAAO,GAAkB,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC/D,QAAA,OAAO,OAAO,KAAK,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;KAC/C;AAEO,IAAA,6BAA6B,CAAC,QAAkB,EAAA;AAEtD,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,MAAM,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAC5C,SAAA;AACD,QAAA,MAAM,SAAS,GAAW,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtC,QAAA,MAAM,iBAAiB,GAAa,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;AAChF,QAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;AAChC,YAAA,MAAM,KAAK,CAAC,gEAAgE,CAAC,CAAC;AAC/E,SAAA;KACF;AAEO,IAAA,WAAW,CAAC,KAAU,EAAA;AAE5B,QAAA,MAAM,GAAG,GAAkB,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QAC5D,GAAG,CAAC,sBAAsB,EAAE,CAAC;AAC7B,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,EAAE;YAE3C,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,GAAG,KAAK,CAAC;YAChD,GAAG,CAAC,0BAA0B,EAAE,CAAC;AACjC,YAAA,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE;gBAC/B,OAAO;AACR,aAAA;AACD,YAAA,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACvD,GAAG,CAAC,gBAAgB,EAAE,CAAC;AAEvB,YAAA,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AACjC,gBAAA,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3B,aAAA;AAED,YAAA,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACxB,gBAAA,YAAY,EAAE,KAAK;gBACnB,aAAa,EAAE,GAAG,CAAC,cAAc;gBACjC,aAAa,EAAE,GAAG,CAAC,sBAAsB;AAC1C,aAAA,CAAC,CAAC;YACH,MAAM,qBAAqB,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE;AAC/E,gBAAA,MAAM,EAAE;AACN,oBAAA,YAAY,EAAE,KAAK;oBACnB,aAAa,EAAE,GAAG,CAAC,cAAc;oBACjC,aAAa,EAAE,GAAG,CAAC,sBAAsB;AAC1C,iBAAA;AACF,aAAA,CAAC,CAAC;YACH,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;AAChF,YAAA,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC;AAClC,YAAA,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;YAC3B,GAAG,CAAC,cAAe,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACjD,YAAA,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;AAC3B,SAAA;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;YACjB,OAAO;AACR,SAAA;AACD,QAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACvB,YAAA,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,GAAG,CAAC,kBAAkB;YACnC,cAAc,EAAE,GAAG,CAAC,qBAAqB;YACzC,mBAAmB,EAAE,GAAG,CAAC,sBAAsB;AAChD,SAAA,CAAC,CAAC;QACH,MAAM,oBAAoB,GAAG,IAAI,WAAW,CAAC,iBAAiB,CAAC,aAAa,EAAE;AAC5E,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,KAAK;gBACnB,WAAW,EAAE,GAAG,CAAC,kBAAkB;gBACnC,cAAc,EAAE,GAAG,CAAC,qBAAqB;gBACzC,mBAAmB,EAAE,GAAG,CAAC,sBAAsB;AAChD,aAAA;AACF,SAAA,CAAC,CAAC;QACH,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;AAC/E,QAAA,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KACpB;IAEO,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;KAC/D;IACO,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;KAClE;AAEO,IAAA,OAAO,CAAC,KAAU,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO;AACR,SAAA;QACD,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;AAEjC,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;KACvB;IAEO,QAAQ,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;YACtG,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACjD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC1C,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;AACjF,SAAA;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAG9B,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE;AACtG,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;AACxF,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC;AACrF,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;AACpG,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC;AACrF,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACpD,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;AACrF,aAAA;AACF,SAAA;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,sBAAsB,EAAE,CAAC;KAC/B;IAEO,sBAAsB,GAAA;AAC5B,QAAA,IAAI,GAAG,GAAW,CAAC,CAAC,CAAC;QACrB,IAAI,UAAU,GAAW,CAAC,CAAC;AAE3B,QAAA,IAAI,KAAU,CAAC;AAEf,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AAC7D,YAAA,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACjC,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE;AAC7B,gBAAA,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC1B,GAAG,GAAG,KAAK,CAAC;AACb,aAAA;AACF,SAAA;AAGD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC9C,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,aAAC,CAAC,CAAC;AACJ,SAAA;QAED,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,mBAAmB,EAAE;AAC7E,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;AACrG,aAAA;AAAM,iBAAA;gBAEL,IAAI,CAAC,gCAAgC,EAAE,CAAC;AACzC,aAAA;AAEF,SAAA;KACF;IAEO,gCAAgC,GAAA;QACtC,IAAI,iBAAiB,GAAY,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,KAAU,KAAI;YAC1G,IAAI,IAAI,KAAK,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBAC5C,iBAAiB,GAAG,KAAK,CAAC;AAC3B,aAAA;AACH,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,EAAE;YACtB,MAAM,KAAK,CAAC,CAAoD,iDAAA,EAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,mBAAmB,CAAA,sBAAA,EAAyB,IAAI,CAAC,mBAAmB,CAAI,EAAA,CAAA,CAAC,CAAC;AACjM,SAAA;KACF;IAEO,yBAAyB,GAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,0BAA0B,EAAE;YAC7H,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAI;gBAChD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;AACtF,aAAC,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA;YACL,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAI;gBAChD,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBAC3C,OAAO,QAAQ,CAAC,KAAK,CAAC;AACvB,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/B,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;IAEO,sBAAsB,GAAA;AAC5B,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;SAC3C,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAErC,MAAM,0BAA0B,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE;AAC3E,YAAA,MAAM,EAAE;gBACN,aAAa,EAAE,UAAU,CAAC,aAAa;gBACvC,WAAW,EAAE,UAAU,CAAC,aAAa;gBACrC,IAAI,EAAE,SAAS,CAAC,cAAc;AAC/B,aAAA;AACF,SAAA,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;KACvF;IAEO,0BAA0B,GAAA;AAChC,QAAA,MAAM,YAAY,GAAsB,IAAI,CAAC,SAAS,CAAC,yBAAyB,EAAE,IAAI,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;AAC7H,QAAA,IAAI,CAAC,yBAAyB,GAAG,YAAY,CAAC,QAAQ,CAAC;KACxD;IAED,SAAS,CACP,aAAqC,EACrC,KAA0B,EAC1B,IAAS,EAAE,gBAA4C,GAAA,IAAI,EAC3D,aAAA,GAAsC,IAAI,EAAA;QAG1C,IAAI,CAAC,gBAAgB,EAAE;YACrB,gBAAgB,GAAG,IAAI,CAAC,OAAO;AAC9B,iBAAA,QAAQ,EAAE;AACV,iBAAA,MAAM,EAAE;AACR,iBAAA,kBAAkB,EAAE;AACpB,iBAAA,gBAAgB,EAAE,CAAC;AACrB,SAAA;QAED,IAAI,CAAC,aAAa,EAAE;YAClB,aAAa,GAAG,IAAI,aAAa,CAAC;AAChC,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,aAAa,EAAE,UAAU;AACzB,gBAAA,UAAU,EAAE,iBAAiB;gBAC7B,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;gBACrD,gBAAgB;AACjB,aAAA,CAAC,CAAC;AACJ,SAAA;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAErD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEjD,QAAA,MAAM,eAAe,GAA6B,IAAI,eAAe,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1G,MAAM,YAAY,GAA0B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAEpF,QAAA,OAAO,YAAY,CAAC;KACrB;IAEO,cAAc,CAAC,UAAe,EAAE,KAAU,EAAA;QAChD,OAAO,QAAQ,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE;AACzC,aAAA;AACF,SAAA,CAAC,CAAA;KACH;IAEO,sBAAsB,CAAC,CAAS,EAAE,CAAS,EAAA;AACjD,QAAA,IAAI,CAAC,yBAA0B,CAAC,IAAI,GAAG,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,yBAA0B,CAAC,GAAG,GAAG,CAAC,CAAC;KACzC;IAEO,0BAA0B,GAAA;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;AAC1B,SAAA;KACF;AAEO,IAAA,eAAe,CAAC,4BAAmC,EAAA;QACzD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,aAAa,GAAW,CAAC,CAAC;QAC9B,IAAI,UAAU,GAAmB,IAAI,CAAC;AACtC,QAAA,IAAI,QAAoB,CAAC;QACzB,IAAI,WAAW,GAAW,CAAC,CAAC;QAC5B,IAAI,SAAS,GAAe,EAAE,CAAC;AAE/B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEpC,QAAA,IAAI,IAAS,CAAC;AACd,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,4BAA4B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACxE,YAAA,MAAM,IAAI,GAAY,4BAA4B,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAW,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAE3C,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;gBACrC,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,oBAAA,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC7B,WAAW,GAAG,CAAC,CAAC;oBAChB,SAAS,GAAG,EAAE,CAAC;AACf,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrC,iBAAA;gBACD,aAAa,GAAG,CAAC,CAAC;AAClB,gBAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC;gBAChC,QAAQ,GAAG,EAAE,CAAC;AACd,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAClC,aAAA;AACD,YAAA,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;YACpD,aAAa,IAAI,IAAI,CAAC;YACtB,WAAW,IAAI,IAAI,CAAC;AACpB,YAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,SAAA;AAED,QAAA,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAE7B,QAAA,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;KAC9C;IAEO,oBAAoB,GAAA;AAC1B,QAAA,MAAM,4BAA4B,GAAQ,IAAI,CAAC,sBAAsB,CAAC;QACtE,MAAM,GAAG,GAAc,4BAA4B,CAAC;QACpD,IAAI,QAAQ,GAAW,CAAC,CAAC;QACzB,IAAI,UAAU,GAAmB,IAAI,CAAC;QACtC,IAAI,SAAS,GAAyB,IAAI,CAAC;QAC3C,IAAI,SAAS,GAAW,CAAC,CAAC;QAC1B,IAAI,SAAS,GAAW,CAAC,CAAC;QAC1B,IAAI,SAAS,GAAW,CAAC,CAAC;QAC1B,IAAI,YAAY,GAAU,EAAE,CAAC;AAE7B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAEtC,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AAC/C,YAAA,MAAM,IAAI,GAAmB,GAAG,CAAC,KAAK,CAAC,CAAC;AAExC,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;gBACrC,IAAI,KAAK,KAAK,CAAC,EAAE;oBACf,QAAQ,GAAG,CAAC,CAAC;oBACb,SAAS,GAAG,YAAY,CAAC;oBACzB,SAAS,GAAG,KAAK,CAAC;oBAClB,SAAS,GAAG,CAAC,CAAC;oBACd,YAAY,GAAG,EAAE,CAAC;AAClB,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACvC,iBAAA;AACD,gBAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC;AACjC,aAAA;AACD,YAAA,QAAQ,GAAG,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC;YAEjC,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,gBAAA,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,EAAE;AACtD,oBAAA,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;AACvC,oBAAA,SAAS,EAAE,CAAC;AACb,iBAAA;AAEF,aAAA;YAED,IAAI,CAAC,OAAO,GAAG;AACb,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpC,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AAC3B,gBAAA,SAAS,EAAE,EAAE;gBACb,MAAM,EAAE,IAAI,CAAC,aAAwB;AACrC,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,cAAc,EAAE,EAAE;AAClB,gBAAA,eAAe,EAAE,CAAC;aACnB,CAAC;AACF,YAAA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjC,SAAA;QAED,IAAI,aAAa,GAAY,KAAK,CAAC;AACnC,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE;YACxF,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC;YAC9H,aAAa,GAAG,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;AACxF,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;AACzF,SAAA;QAID,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;AACzF,SAAA;QAED,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,IAAI,WAAgB,CAAC;AACrB,YAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE;AACzE,gBAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACnE,iBAAA;AACD,gBAAA,IAAI,KAAK,KAAK,GAAG,GAAG,CAAC,EAAE;AACrB,oBAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAClC,iBAAA;AACF,aAAA;AACF,SAAA;AAAM,aAAA;YAEL,IAAI,CAAC,+BAA+B,EAAE,CAAC;YACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAEzB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,iBAAiB,EAAE;AAC3E,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,iBAAiB,CAAC;AACjG,gBAAA,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,SAAS,CAAC;AAClF,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,iBAAiB,CAAC;AACjG,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,cAAc,CAAC;AAC3F,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,iBAAiB,CAAC;AACjG,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,SAAS,CAAC;AAClF,aAAA;AACF,SAAA;KACF;IAEO,gCAAgC,CAAC,cAA+B,EAAE,cAA+B,EAAA;QACvG,IAAI,sBAAsB,GAAY,IAAI,CAAC;AAC3C,QAAA,IAAI,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE;YACnD,sBAAsB,GAAG,KAAK,CAAC;AAChC,SAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,YAAA,MAAM,aAAa,GAAkB,cAAc,CAAC,CAAC,CAAC,CAAC;AACvD,YAAA,MAAM,aAAa,GAAkB,cAAc,CAAC,CAAC,CAAC,CAAC;AACvD,YAAA,IAAI,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE;gBACjD,sBAAsB,GAAG,KAAK,CAAC;AAChC,aAAA;AACF,SAAA;QACD,IAAI,CAAC,sBAAsB,EAAE;AAC3B,YAAA,MAAM,KAAK,CAAC,CAAyF,uFAAA,CAAA,CAAC,CAAC;AACxG,SAAA;KACF;IAEO,uCAAuC,GAAA;AAE7C,QAAA,MAAM,kBAAkB,GAAuB,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC5E,QAAA,MAAM,yBAAyB,GAAW,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;;QAGxE,KAAK,IAAI,CAAC,GAAG,yBAAyB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACnD,YAAA,MAAM,eAAe,GAAqB,kBAAkB,CAAC,CAAC,CAAC,CAAC;AACjE,SAAA;QAED,MAAM,eAAe,GAAkB,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAW,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,YAAY,GAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,gBAAA,MAAM,UAAU,GAAgB,YAAY,CAAC,CAAC,CAAC,CAAC;AAChD,gBAAA,MAAM,aAAa,GAAQ,UAAU,CAAC,KAAY,CAAC;AACnD,gBAAA,MAAM,eAAe,GAAY,aAAa,CAAC,UAAU,CAAC;gBAC1D,IAAI,gBAAgB,GAAW,CAAC,CAAC;AACjC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACpD,MAAM,QAAQ,GAAgB,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACtD,oBAAA,IAAK,QAAQ,CAAC,KAAa,CAAC,UAAU,EAAE;AACtC,wBAAA,gBAAgB,EAAE,CAAC;AACpB,qBAAA;AACF,iBAAA;AACD,gBAAA,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;oBACrC,IAAI,CAAC,eAAe,IAAI,gBAAgB,KAAK,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE;AACxE,wBAAA,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC;AAChC,wBAAA,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,qBAAA;yBAAM,IAAI,eAAe,IAAI,gBAAgB,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE;AAC5E,wBAAA,aAAa,CAAC,UAAU,GAAG,KAAK,CAAC;AACjC,wBAAA,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACrC,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,eAAe,CAAC;KACxB;AAEO,IAAA,iCAAiC,CAAC,OAA0B,EAAA;AAClE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,YAAY,GAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC5C,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7D,aAAA;AACF,SAAA;KACF;IAEO,4BAA4B,CAAC,OAAsB,EAAE,WAAwB,EAAA;QACnF,MAAM,UAAU,GAAgB,WAAW,CAAC;AAC5C,QAAA,IAAI,UAAU,CAAC,KAAK,KAAK,OAAO,EAAE;YAChC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AACnD,YAAA,MAAM,UAAU,GAAY,OAAO,CAAC,UAAU,CAAC;AAC/C,YAAA,IAAI,UAAU,EAAE;gBACd,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AACjD,aAAA;YACD,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,MAAqB,KAAI;AAC1D,gBAAA,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;gBAC/B,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAClD,gBAAA,IAAI,UAAU,EAAE;oBACd,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAChD,iBAAA;AACH,aAAC,CAAC,CAAC;AAEH,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE;gBACrD,MAAM,QAAQ,GAAgB,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACrD,gBAAA,QAAQ,CAAC,KAAa,CAAC,UAAU,GAAG,UAAU,CAAC;gBAChD,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC7D,aAAA;AACF,SAAA;KACF;AAEM,IAAA,iBAAiB,CAAC,OAAgB,EAAA;QACvC,IAAK,OAAe,CAAC,eAAe,EAAE;YACpC,OAAQ,OAAe,CAAC,eAAe,CAAC;AACzC,SAAA;QACD,IAAI,eAAe,GAA0B,EAAE,CAAC;AAChD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,YAAY,GAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,gBAAA,MAAM,UAAU,GAAgB,YAAY,CAAC,CAAC,CAAC,CAAC;AAChD,gBAAA,IAAI,OAAO,KAAK,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE;AACvF,oBAAA,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACvC,oBAAA,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAG;AACxC,wBAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,eAAe,CAAC;KACxB;AAEM,IAAA,gBAAgB,CAAC,OAAgB,EAAA;QACtC,IAAK,OAAe,CAAC,cAAc,EAAE;YACnC,OAAQ,OAAe,CAAC,cAAc,CAAC;AACxC,SAAA;QACD,IAAI,cAAc,GAAsB,IAAI,CAAC;AAC7C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,YAAY,GAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,gBAAA,MAAM,UAAU,GAAgB,YAAY,CAAC,CAAC,CAAC,CAAC;AAChD,gBAAA,MAAM,gBAAgB,GAAc,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC;AACjG,gBAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/B,oBAAA,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;AACnC,iBAAA;AACF,aAAA;AACF,SAAA;AACA,QAAA,OAAe,CAAC,cAAc,GAAG,cAAc,GAAG,cAAc,GAAG,OAAO,CAAC;QAC5E,OAAQ,OAAe,CAAC,cAAc,CAAC;KACxC;IAEO,iBAAiB,GAAA;QACvB,IAAI,SAAS,GAAW,CAAC,CAAC;AAC1B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,YAAY,GAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,gBAAA,MAAM,UAAU,GAAgB,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAgB,IAAI,CAAC,sBAAsB,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AACvE,gBAAA,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxC,aAAA;AACD,YAAA,SAAS,IAAI,YAAY,CAAC,MAAM,CAAC;AAClC,SAAA;KACF;IACO,+BAA+B,GAAA;QACrC,IAAI,SAAS,GAAW,CAAC,CAAC;AAC1B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,YAAY,GAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAgB,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;AACnE,YAAA,SAAS,IAAI,YAAY,CAAC,MAAM,CAAC;AACjC,YAAA,MAAM,cAAc,GAAG,mBAAmB,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,aAAc,EAAE,cAAc,CAAC,CAAC;AACpE,SAAA;KACF;IAEO,sBAAsB,CAAC,OAAgB,EAAE,GAAW,EAAA;QAC1D,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACpC,YAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5B,SAAA;KACF;IAEO,gBAAgB,CAAC,YAAiB,EAAE,QAAa,EAAA;QAEvD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,YAAY,CAAC,OAAO,CAClB,CAAC,KAAkB,EAAE,KAAa,KAAI;YACpC,MAAM,QAAQ,GAAY,KAAK,CAAC,KAAa,CAAC,WAAW,CAAC,MAAM,CAAC;YACjE,IAAI,aAAa,GAAW,CAAC,CAAC;YAC9B,IAAI,eAAe,GAAW,CAAC,CAAC;YAChC,OAAO,aAAa,GAAG,QAAQ,EAAE;gBAC/B,aAAa,IAAK,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAa,CAAC,WAAW,CAAC,MAAM,CAAC;gBACxE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3C,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,eAAe,EAAE,CAAC;AACnB,aAAA;AACD,YAAA,YAAY,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,eAAe,CAAC;AACxD,SAAC,CACF,CAAC;KACH;IAEO,cAAc,CAAC,WAA0B,EAAE,eAA0B,GAAA,CAAC,EAAE,cAAyB,GAAA,CAAC,EAAE,KAAA,GAAgB,CAAC,EAAA;AAC3H,QAAA,IAAI,KAAuB,CAAC;AAC5B,QAAA,IAAI,WAAmB,CAAC;AACxB,QAAA,IAAI,QAA0B,CAAC;AAC/B,QAAA,IAAI,QAAgB,CAAC;QAErB,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB,EAAE;AAC1E,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;AAChF,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,iBAAiB,CAAC;AACjG,gBAAA,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;AACjF,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC;AAChG,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC;AAC1F,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC;AAChG,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;AACjF,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AAChF,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;AACjG,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AAChF,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;AAChG,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;AAC1F,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;AAChG,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AACjF,aAAA;AACF,SAAA;AAED,QAAA,cAAc,GAAG,eAAe,GAAG,CAAC,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,CAAC,WAAwB,EAAE,WAAwB,KAAI;AACtE,YAAA,OAAO,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;AAC/C,SAAC,CAAC,CAAC;AAEH,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,UAAuB,KAAI;AAC9C,YAAA,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC;YAEnC,MAAM,OAAO,GAAW,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAE/D,WAAW,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAW,CAAC,MAAO,CAAC,aAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACvH,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,UAAW,CAAC,MAAO,CAAC,aAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAEvG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAE5D,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,WAAW,GAAG,GAAG,GAAG,OAAO,GAAG,aAAa,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;AACjH,YAAA,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;AAE7C,YAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC1C,aAAA;AAAM,iBAAA;AACL,gBAAA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACxC,gBAAA,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AACxB,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvC,aAAA;YAED,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AAErH,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;AAClC,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,KAAK,CAAC,EAAE;AAClE,oBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC;AAC5C,iBAAA;AACF,aAAA;AAED,YAAA,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;AACrF,aAAA;AAAM,iBAAA;gBACL,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,aAAa,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;AAC5F,gBAAA,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;AAC7C,gBAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE;AACpC,oBAAA,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC1C,iBAAA;AAAM,qBAAA;AACL,oBAAA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACxC,oBAAA,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AACxB,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvC,iBAAA;gBAED,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;gBAErH,IAAI,CAAC,SAAS,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAE1D,MAAM,YAAY,GAAY,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC;gBACnE,IAAI,SAAS,GAAkB,IAAI,CAAC;AACpC,gBAAA,IAAI,YAAY,EAAE;AAChB,oBAAA,SAAS,GAAG,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;oBAE3C,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,SAAS,GAAG,aAAa,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;AAC9F,oBAAA,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;AAC7C,oBAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE;AACpC,wBAAA,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC1C,qBAAA;AAAM,yBAAA;AACL,wBAAA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACxC,wBAAA,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AACxB,wBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,wBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvC,qBAAA;oBACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AACtH,iBAAA;AACF,aAAA;AACD,YAAA,eAAe,IAAI,UAAU,CAAC,IAAI,CAAC;AACrC,SAAC,CAAC,CAAC;KACJ;IAEO,cAAc,CAAC,KAAuB,EAAE,QAA0B,EAAE,QAAgB,EAAE,SAAiB,EAAE,OAAe,EAAE,KAAa,EAAA;AAC7I,QAAA,KAAK,CAAC,SAAS,GAAG,QAAQ,GAAG,wBAAwB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,qBAAqB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,WAAW,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;AACzK,QAAA,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;KAC1C;IAEO,YAAY,GAAA;AAClB,QAAA,MAAM,mBAAmB,GAAW,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAExE,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YACtC,OAAO;AACR,SAAA;QAED,MAAM,sBAAsB,GAAY,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,eAAe,KAAK,SAAS,CAAC;QAE3J,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,WAA0B,EAAE,KAAK,KAAI;AAC/D,YAAA,IAAI,KAAuB,CAAC;AAC5B,YAAA,IAAI,QAA0B,CAAC;YAE/B,MAAM,QAAQ,GAAW,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAChE,IAAI,mBAAmB,GAAY,KAAK,CAAC;AAEzC,YAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBACzC,mBAAmB,GAAG,IAAI,CAAC;AAC5B,aAAA;AAAM,iBAAA,IAAI,sBAAsB,EAAE;AACjC,gBAAA,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;AAC7C,gBAAA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACxC,gBAAA,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AACxB,gBAAA,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC7B,aAAA;AAAM,iBAAA;AACL,gBAAA,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC3F,gBAAA,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AACrF,gBAAA,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC7B,aAAA;YACD,KAAK,CAAC,SAAS,GAAG,QAAQ,GAAG,2CAA2C,GAAG,mBAAmB,GAAG,KAAK,CAAC;YAGvG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,sBAAsB,EAAE;AAC/D,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAS,CAAC,CAAC;AACzC,aAAA;AAED,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;AAEzC,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,CAAC,mBAAmB,EAAE;gBACxB,IAAI,CAAC,2BAA2B,EAAE,CAAC;gBACnC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACxC,aAAA;YAED,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,gBAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAClC,aAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,eAAe,KAAK,SAAS,EAAE;AACxG,YAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAClG,YAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;AAC7F,SAAA;KACF;AAEO,IAAA,SAAS,CAAC,EAAe,EAAA;AAC/B,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;QACxC,OAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO;AAChC,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO;SAC/B,CAAC;KACH;AAEO,IAAA,6BAA6B,CAAC,EAAsB,EAAA;AAC1D,QAAA,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;AAC7D,YAAA,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;AACvB,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AAEO,IAAA,oBAAoB,CAAC,KAAU,EAAA;AACrC,QAAA,MAAM,QAAQ,GAAc,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACrF,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;KACnF;AAEO,IAAA,uBAAuB,CAAC,KAAU,EAAA;AACxC,QAAA,MAAM,iBAAiB,GAAc,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9F,MAAM,QAAQ,GAAc,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAG;YAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;AACrD,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,QAAQ,CAAC;KACjB;AAEO,IAAA,wBAAwB,CAAC,KAAU,EAAA;AACzC,QAAA,MAAM,kBAAkB,GAAc,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/F,MAAM,QAAQ,GAAc,kBAAkB,CAAC,MAAM,CAAC,IAAI,IAAG;YAC3D,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;AAClD,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,QAAQ,CAAC;KACjB;AAEO,IAAA,2BAA2B,CAAC,KAAU,EAAA;AAC5C,QAAA,MAAM,mBAAmB,GAAc,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChG,MAAM,QAAQ,GAAc,mBAAmB,CAAC,MAAM,CAAC,IAAI,IAAG;YAC5D,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;AACnD,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,QAAQ,CAAC;KACjB;AAEO,IAAA,oBAAoB,CAAC,KAAU,EAAA;AACrC,QAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,QAAQ,GAAc,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAG;YACxD,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,KAAK,IAAI,CAAC;AAC7D,SAAC,CAAC,CAAC;AAEH,QAAA,MAAM,eAAe,GAAY,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;AACvD,QAAA,MAAM,YAAY,GAAW,eAAe,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;AAC7C,YAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,IAAI,aAAa,GAAmB,IAAI,CAAC,aAAa,CAAC;YACvD,OAAM,aAAa,KAAK,IAAI,EAAE;gBAC5B,MAAM,eAAe,GAAY,CAAC,eAAe,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnF,gBAAA,MAAM,yBAAyB,GAAY,eAAe,IAAI,aAAa,CAAC,YAAY,CAAC,uBAAuB,CAAC,KAAK,IAAI,CAAC;gBAC3H,IAAI,eAAe,IAAI,yBAAyB,EAAE;AAChD,oBAAA,QAAQ,GAAG,CAAC,aAAa,CAAC,CAAC;oBAC3B,aAAa,GAAG,IAAI,CAAC;AACtB,iBAAA;AAAM,qBAAA;AACL,oBAAA,aAAa,GAAG,aAAc,CAAC,aAAa,CAAC;AAC9C,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;AAEM,IAAA,gBAAgB,CAAC,WAAkC,GAAA,IAAI,EAAE,aAAA,GAAwB,CAAC,CAAC,EAAA;AACxF,QAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,IAAG;YACxC,IAAI,IAAI,CAAC,EAAE,KAAK,WAAW,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,EAAE;AACnE,gBAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtC,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAEM,IAAA,sBAAsB,CAAC,EAAe,EAAA;AAC3C,QAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACtC,QAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;KACxC;AAEO,IAAA,cAAc,CAAC,KAAU,EAAA;AAC/B,QAAA,MAAM,gBAAgB,GAAgB,IAAI,CAAC,sBAAsB,CAAC;AAClE,QAAA,MAAM,MAAM,GAAQ,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;AAC7D,QAAA,MAAM,GAAG,GAAW,MAAM,CAAC,IAAI,CAAC;AAChC,QAAA,MAAM,GAAG,GAAW,MAAM,CAAC,KAAK,CAAC;AAEjC,QAAA,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;AAC9C,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,gBAAgB,EAAE;YAC5C,OAAO;AACR,SAAA;QACD,IAAI,aAAa,GAAW,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,EAAE;YACpC,aAAa,GAAG,CAAC,CAAC;AACnB,SAAA;AAAM,aAAA;YACL,aAAa,GAAG,CAAC,CAAC;AACnB,SAAA;AAED,QAAA,IAAI,wBAAwB,GAAW,CAAC,CAAC,CAAC;AAC1C,QAAA,IAAI,uBAAuB,GAAW,CAAC,CAAC,CAAC;AACzC,QAAA,IAAI,wBAAwB,GAAW,CAAC,CAAC,CAAC;AAC1C,QAAA,IAAI,uBAAuB,GAAW,CAAC,CAAC,CAAC;AACzC,QAAA,IAAI,UAAU,GAAW,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,UAAU,GAAW,CAAC,CAAC,CAAC;QAC5B,IAAI,YAAY,GAAqB,IAAI,CAAC;QAE1C,MAAM,MAAM,GAAQ,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,QAAQ,KAC5D,KAAK,CAAC,OAAO,CACX,CAAC,IAAI,EAAE,KAAK,KAAI;AACd,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,cAAc,EAAE;gBAChC,wBAAwB,GAAG,QAAQ,CAAC;gBACpC,uBAAuB,GAAG,KAAK,CAAC;gBAChC,UAAU,GAAG,KAAK,CAAC;gBACnB,YAAY,GAAG,KAAK,CAAC;AACtB,aAAA;YACD,IAAI,IAAI,KAAK,gBAAgB,EAAE;gBAC7B,wBAAwB,GAAG,QAAQ,CAAC;gBACpC,uBAAuB,GAAG,KAAK,CAAC;gBAChC,UAAU,GAAG,KAAK,CAAC;AACpB,aAAA;SACF,CACF,CACF,CAAC;QAEF,IAAI,YAAY,GAAsB,IAAI,CAAC;QAC3C,MAAM,UAAU,GAAiB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;AAC9D,QAAA,IAAI,gBAAgB,GAAW,CAAC,CAAC,CAAC;AAClC,QAAA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;YACjC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,YAAa,CAAC,MAAM,EAAE;gBACvD,YAAY,GAAG,IAAI,CAAC;gBACpB,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACtD,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,SAAS,IAAY,uBAAuB,GAAG,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,OAAO,IAAY,uBAAuB,GAAG,CAAC,CAAC,CAAC;;QAGtD,IAAI,gBAAgB,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YACvD,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAC3C,KAAK,IAAG;AACN,gBAAA,MAAM,QAAQ,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAA,MAAM,SAAS,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,gBAAA,IAAI,SAAS,IAAI,QAAQ,IAAI,SAAS,GAAG,SAAS,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,EAAE;oBAChG,MAAM,KAAK,GAAgB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvH,MAAM,KAAK,GAAgB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrH,MAAM,UAAU,GAAkB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACjH,UAAU,CAAC,IAAI,CAAC,CAAC,KAAkB,EAAE,KAAkB,KAAI;AACzD,wBAAA,OAAO,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AACnC,qBAAC,CAAC,CAAC;AACH,oBAAA,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,oBAAA,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;oBACvE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACjC,wBAAA,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AACzB,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CACF,CAAC;AACH,SAAA;AAAM,aAAA;YACL,MAAM,KAAK,GAAgB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvH,MAAM,KAAK,GAAgB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACrH,MAAM,UAAU,GAAkB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,MAAM,EAAE,CAAC;YACxF,UAAU,CAAC,IAAI,CAAC,CAAC,KAAkB,EAAE,KAAkB,KAAI;AACzD,gBAAA,OAAO,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AACnC,aAAC,CAAC,CAAC;AACH,YAAA,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,YAAA,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACvE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACjC,gBAAA,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AACzB,aAAC,CAAC,CAAC;AACJ,SAAA;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;;AAGpB,QAAA,MAAM,cAAc,GAAW,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC/D,IAAI,CAAC,gBAAgB,EAAE,CAAC;;AAGxB,QAAA,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;KACnC;IAEO,qBAAqB,GAAA;AAC3B,QAAA,IAAI,eAAe,GAAW,IAAI,CAAC,QAAS,CAAC,WAAW,CAAC;AACzD,QAAA,OAAO,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;KAClD;IAEO,wBAAwB,GAAA;QAC9B,IAAI,qBAAqB,GAAW,CAAC,CAAC;AACtC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE;gBACvE,qBAAqB,GAAG,CAAC,CAAC;gBAC1B,MAAM;AACP,aAAA;AACF,SAAA;QACD,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,WAAmB,KAAI;AAC7D,YAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACjD,SAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACP;IAEO,gCAAgC,GAAA;QACtC,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,mBAAmB,CAAC;AACnH,SAAA;KACF;IAEO,yBAAyB,GAAA;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;AACnH,SAAA;KACF;IAEO,yBAAyB,GAAA;QAC/B,IAAI,CAAC,gCAAgC,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACzD,IAAI,CAAC,yBAAyB,EAAE,CAAC;KAClC;IAEO,4BAA4B,GAAA;QAClC,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAEjC,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC;AACnC,QAAA,IAAI,aAAa,GAAW,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QACpF,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YACzC,MAAM,eAAe,GAAW,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC1D,YAAA,MAAM,GAAG,GAAW,IAAI,CAAC,WAAW,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrE,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACrB,gBAAA,IAAI,CAAC,mBAAmB,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,aAAA;AAEH,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC,EAAE;YAClC,IAAI,CAAC,yBAAyB,GAAE,IAAI,CAAC,mBAAmB,GAAG,aAAa,CAAC;AAC1E,SAAA;QAED,IAAI,GAAG,GAAW,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YACtC,IAAI,IAAI,GAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACnF,YAAA,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAC3B,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxD,gBAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;oBACtD,GAAG,IAAI,KAAK,CAAC;oBACb,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AACpC,iBAAA;AAAM,qBAAA;AACL,oBAAA,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,yBAAyB,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;oBACtE,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,yBAAyB,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;AACxF,iBAAA;AACF,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;oBACtD,GAAG,IAAI,MAAM,CAAC;AACf,iBAAA;AAAM,qBAAA;oBACL,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;AACrC,iBAAA;AACF,aAAA;AAEH,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,GAAG,CAAC;KAEZ;IAEO,sBAAsB,GAAA;QAC5B,MAAM,mBAAmB,GAAa,EAAE,CAAC;QACzC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,WAA0B,EAAE,KAAK,KAAI;YAC/D,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AACrD,aAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,mBAAmB,CAAC;KAC5B;AAEO,IAAA,YAAY,CAAC,GAAa,EAAE,WAA0B,EAAE,eAAA,GAA0B,CAAC,EAAE,cAAyB,GAAA,CAAC,EAAE,cAAA,GAA0B,KAAK,EAAA;AACtJ,QAAA,cAAc,GAAG,eAAe,GAAG,CAAC,CAAC;QAErC,WAAW,CAAC,IAAI,CAAC,CAAC,WAAwB,EAAE,WAAwB,KAAI;AACtE,YAAA,OAAO,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;AAC/C,SAAC,CAAC,CAAC;AAEH,QAAA,WAAW,CAAC,OAAO,CAAC,UAAU,IAAG;YAE/B,MAAM,UAAU,GAAW,eAAe,CAAC;YAC3C,MAAM,aAAa,GAAkB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC7E,MAAM,YAAY,GAAY,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAE9D,IAAI,CAAC,aAAa,CAAC,UAAU,IAAI,cAAc,KAAK,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;AACnG,gBAAA,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACtB,aAAA;AAED,YAAA,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;AACzG,aAAA;AACD,YAAA,eAAe,IAAI,UAAU,CAAC,IAAI,CAAC;AACrC,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,yBAAyB,CAAC,gBAA6B,EAAA;QAC7D,MAAM,YAAY,GAAW,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC;AAClE,QAAA,MAAM,YAAY,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC;AAC/E,QAAA,MAAM,kBAAkB,GAAW,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACrH,QAAA,MAAM,eAAe,GAAW,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACpG,MAAM,eAAe,GAAW,eAAe,IAAI,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEpF,IAAI,CAAC,qBAAsB,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,8BAA8B,GAAG,IAAI,CAAC,EAAE,GAAG,wCAAwC,GAAG,eAAe,GAAG,iBAAiB,CAAC;QAC5K,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;AAEO,IAAA,yBAAyB,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;QAC9E,IAAI,EAAE,GAA8B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AACrE,QAAA,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE;YACnC,EAAE,GAAG,iBAAiB,CAAC;AACxB,SAAA;QACD,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACrC,QAAA,MAAM,MAAM,GAAW,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AACnE,QAAA,OAAO,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC;KAC1B;AAEO,IAAA,cAAc,CAAC,EAAe,EAAA;QAClC,IAAI,MAAM,GAAkB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC,GAAW,CAAC,CAAC;AAClB,YAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,UAAU,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAE;AAClE,gBAAA,CAAC,EAAE,CAAC;AACL,aAAA;AACD,YAAA,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnC,YAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACzB,YAAA,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/B,SAAA;AAED,QAAA,OAAO,IAAI,GAAG,MAAM,CAAC;KACxB;IAEO,mBAAmB,GAAA;QACzB,gBAAgB,CAAC,UAAU,EAAE,CAAC;AAC9B,QAAA,MAAM,YAAY,GAAY,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;QAC3D,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACzE,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;AAChC,SAAA;AACD,QAAA,MAAM,YAAY,GAAuB,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAEzH,IAAI,YAAY,KAAK,IAAI,EAAE;AACzB,YAAA,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;AACtF,SAAA;KACF;IAEO,kBAAkB,GAAA;AACxB,QAAA,MAAM,SAAS,GAAkB,IAAI,CAAC,uBAAuB,CAAC;AAC9D,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,GAAW,CAAC,CAAC;AAClB,YAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,qBAAqB,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAE;AAC7E,gBAAA,CAAC,EAAE,CAAC;AACL,aAAA;YACD,IAAI,CAAC,UAAU,GAAG,qBAAqB,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACnD,SAAA;KACF;IAEO,yBAAyB,GAAA;QAC/B,IAAI,IAAI,CAAC,0BAA0B,EAAE;YACnC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;AACzD,gBAAA,MAAM,KAAK,CAAC,8FAA8F,CAAC,CAAC;AAC7G,aAAA;AACD,YAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;AAC7B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAkB,EAAE,MAAK;oBACjF,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACrC,iBAAC,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,2BAA2B,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;gBACrE,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAChE,IAAI,CAAC,2BAA2B,EAAE,CAAC;gBACnC,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBAE5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;AACrD,aAAA;AAEF,SAAA;KACF;IAEO,2BAA2B,GAAA;AACjC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAS,CAAC,WAAW,GAAG,IAAI,CAAC,QAAS,CAAC,WAAW,CAAC;AAC9E,QAAA,IAAI,CAAC,wBAAyB,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,2CAA2C,GAAG,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC/I,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;IAEO,cAAc,GAAA;QACpB,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,MAAM,SAAS,GAAqB,MAAM,CAAC,YAAY,EAAE,CAAC;AAC1D,YAAA,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,eAAe,EAAE,CAAC;AAC7B,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;AACpC,SAAA;KACF;AAEO,IAAA,gBAAgB,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AACrE,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9B,SAAA;KACF;AAEO,IAAA,kBAAkB,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AACvE,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChC,SAAA;KACF;AAEO,IAAA,cAAc,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AACnE,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,SAAA;KACF;AAEO,IAAA,oBAAoB,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AACzE,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1C,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClC,SAAA;KACF;AAEO,IAAA,yBAAyB,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AAC9E,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9C,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtC,SAAA;KACF;AAEO,IAAA,MAAM,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AAC3D,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpB,SAAA;KACF;AAEO,IAAA,yBAAyB,CAAC,EAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AAC9E,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,SAAA;KACF;IAEO,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACvB,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAChF,IAAI,CAAC,kBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAW,CAAC,CAAC;AACvD,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC/B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACxB,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,6BAA6B,IAAI,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE;YACjH,IAAI,CAAC,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAsB,CAAC,CAAC;AAC5E,YAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;AAC1C,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;AACnC,SAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YACjE,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAK,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;AAChH,gBAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAsB,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,CAAC;AACrF,gBAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjC,gBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC/B,aAAA;AACF,SAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAClE,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAK,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE;AACnH,gBAAA,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAsB,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,CAAC;AACvF,gBAAA,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAClC,gBAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAChC,aAAA;AACF,SAAA;KACF;IAEM,WAAW,GAAA;QAEhB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACtB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAChC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;QACD,IAAI,IAAI,CAAC,iCAAiC,EAAE;AAC1C,YAAA,IAAI,CAAC,iCAAiC,CAAC,WAAW,EAAE,CAAC;AACtD,SAAA;QACD,IAAI,IAAI,CAAC,gCAAgC,EAAE;AACzC,YAAA,IAAI,CAAC,gCAAgC,CAAC,WAAW,EAAE,CAAC;AACrD,SAAA;AAED,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtD,MAAM,EAAE,GAAW,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAC7C,YAAA,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;AACjC,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YAC9B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,QAAQ,CAAC,sBAAsB,CAAC,KAAK,IAAI,EAAE;AAC7C,YAAA,QAAQ,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;AACzC,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE;YAC3C,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAC3E,YAAA,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC;AACjD,SAAA;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,KAAK,IAAI,EAAE;YACxD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,GAAG,IAAI,CAAC;AACpD,SAAA;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,KAAK,IAAI,EAAE;YACtE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,GAAG,IAAI,CAAC;AAClE,SAAA;QAAA,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,KAAK,IAAI,EAAE;YACpD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC;AAChD,SAAA;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;AAClC,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AACjC,SAAA;QACD,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACrB,SAAA;AACD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AAErC,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AACf,QAAA,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;AAGlC,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,8BAA8B,GAAG,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,+BAA+B,GAAG,EAAE,CAAC;AAE1C,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AAEtB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAEhC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AAEvB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;KACjC;;AA7/EU,aAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,qJAmHd,QAAQ,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,OAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;8FAnHP,aAAa,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,6CAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,6CAA6C,EAAE;AAC/D,iBAAA,CAAA;;0BAoHI,MAAM;2BAAC,QAAQ,CAAA;sKAlBT,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,0BAA0B,EAAA,CAAA;sBAAlC,KAAK;gBAEI,iBAAiB,EAAA,CAAA;sBAA1B,MAAM;gBACG,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,eAAe,EAAA,CAAA;sBAAxB,MAAM;gBACG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBACG,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBACG,QAAQ,EAAA,CAAA;sBAAjB,MAAM;gBACG,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;gBACG,iBAAiB,EAAA,CAAA;sBAA1B,MAAM;gBACG,cAAc,EAAA,CAAA;sBAAvB,MAAM;;;MC7HI,gBAAgB,CAAA;IAE3B,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KACzE;IAED,eAAe,GAAA;QACb,IAAI,CAAC,2BAA2B,EAAE,CAAC;KACpC;IAED,2BAA2B,GAAA;AACzB,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE;AACtC,YAAA,EAAE,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC3D,SAAA;KACF;;6GAdU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAN,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;iGAAhB,gBAAgB,EAAA,QAAA,EAAA,wDAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAL5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wDAAwD;AAClE,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;AACzC,iBAAA,CAAA;;;MCAY,sBAAsB,CAAA;IAEjC,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KACzE;IAED,eAAe,GAAA;QACb,IAAI,CAAC,2BAA2B,EAAE,CAAC;KACpC;IAED,2BAA2B,GAAA;AACzB,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE;AACtC,YAAA,EAAE,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACrE,SAAA;KACF;;mHAdU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;uGAAtB,sBAAsB,EAAA,QAAA,EAAA,0DAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,0DAA0D;AACrE,iBAAA,CAAA;;;MCGY,uBAAuB,CAAA;IAElC,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KACzE;IAED,eAAe,GAAA;QACb,IAAI,CAAC,6BAA6B,EAAE,CAAC;KACtC;IAED,6BAA6B,GAAA;AAC3B,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE;AACtC,YAAA,EAAE,CAAC,eAAe,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC9E,SAAA;KACF;;oHAdU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;wGAAvB,uBAAuB,EAAA,QAAA,EAAA,0IAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,sDAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBALnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,CAAA;AAC+C,0DAAA,CAAA;AACzD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,sDAAsD,EAAE;AACxE,iBAAA,CAAA;;;MCKY,aAAa,CAAA;AAiBxB,IAAA,WAAA,CAAmB,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAfhC,IAAS,CAAA,SAAA,GAAuB,SAAS,CAAC;QAC1C,IAA0B,CAAA,0BAAA,GAAY,KAAK,CAAC;AAE3C,QAAA,IAAA,CAAA,iBAAiB,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC/D,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC1D,QAAA,IAAA,CAAA,eAAe,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC7D,QAAA,IAAA,CAAA,aAAa,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC3D,QAAA,IAAA,CAAA,kBAAkB,GAAsB,IAAI,YAAY,EAAO,CAAC;AAChE,QAAA,IAAA,CAAA,gBAAgB,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC9D,QAAA,IAAA,CAAA,cAAc,GAAsB,IAAI,YAAY,EAAO,CAAC;KAMxB;AAJ9C,IAAA,IAAW,aAAa,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC;KACpD;IAID,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7D,SAAA;KACF;AAED,IAAA,mBAAmB,CAAC,CAAoB,EAAA;AACtC,QAAA,CAAC,CAAC,IAAI,GAAG,iBAAiB,CAAC,eAAe,CAAC;AAC3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAChC;AACD,IAAA,aAAa,CAAC,CAAoB,EAAA;AAChC,QAAA,CAAC,CAAC,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC3B;AACD,IAAA,iBAAiB,CAAC,CAAoB,EAAA;AACpC,QAAA,CAAC,CAAC,IAAI,GAAG,iBAAiB,CAAC,aAAa,CAAC;AACzC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC9B;AAED,IAAA,oBAAoB,CAAC,CAAqB,EAAA;AACxC,QAAA,CAAC,CAAC,IAAI,GAAG,kBAAkB,CAAC,gBAAgB,CAAC;AAC7C,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjC;AACD,IAAA,eAAe,CAAC,CAAqB,EAAA;AACnC,QAAA,CAAC,CAAC,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC;AACvC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5B;AACD,IAAA,kBAAkB,CAAC,CAAqB,EAAA;AACtC,QAAA,CAAC,CAAC,IAAI,GAAG,kBAAkB,CAAC,cAAc,CAAC;AAC3C,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC/B;AAED,IAAA,eAAe,CAAC,CAAY,EAAA;AAC1B,QAAA,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC;AAClC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC7B;;0GAtDU,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,aAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,2ZCZ1B,kgBAYA,EAAA,MAAA,EAAA,CAAA,02BAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAAO,aAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FDAa,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;+BACE,cAAc,EAAA,aAAA,EAGT,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,kgBAAA,EAAA,MAAA,EAAA,CAAA,02BAAA,CAAA,EAAA,CAAA;iGAI5B,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,0BAA0B,EAAA,CAAA;sBAAlC,KAAK;gBAEI,iBAAiB,EAAA,CAAA;sBAA1B,MAAM;gBACG,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,eAAe,EAAA,CAAA;sBAAxB,MAAM;gBACG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBACG,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBACG,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;gBACG,cAAc,EAAA,CAAA;sBAAvB,MAAM;;;MEfI,qBAAqB,CAAA;AAsBhC,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAnBjC,IAAS,CAAA,SAAA,GAAoB,IAAI,CAAC;QAClC,IAAe,CAAA,eAAA,GAAU,EAAE,CAAC;QAC5B,IAAM,CAAA,MAAA,GAAkB,IAAI,CAAC;QAC7B,IAAW,CAAA,WAAA,GAAW,IAAI,CAAC;QAC3B,IAAI,CAAA,IAAA,GAAa,EAAE,CAAC;AACnB,QAAA,IAAA,CAAA,SAAS,GAAsB,IAAI,YAAY,EAAO,CAAC;AACvD,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAO,CAAC;AAC1D,QAAA,IAAA,CAAA,cAAc,GAA0B,IAAI,YAAY,EAAW,CAAC;QAI9E,IAAM,CAAA,MAAA,GAA6B,IAAI,CAAC;QACxC,IAAQ,CAAA,QAAA,GAAkB,IAAI,CAAC;QAC/B,IAAY,CAAA,YAAA,GAAkB,IAAI,CAAC;QACnC,IAAc,CAAA,cAAA,GAAkB,IAAI,CAAC;QAGrC,IAAgB,CAAA,gBAAA,GAAY,KAAK,CAAC;QAGhC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;QAEzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;KACpD;AAEmD,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AACvF,QAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE;AACzC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7D,SAAA;KACF;AAEkC,IAAA,OAAO,CAAC,KAAiB,EAAA;QAC1D,IAAI,QAAQ,GAAY,KAAK,CAAC;AAC9B,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC1C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtE,gBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE;oBACnE,QAAQ,GAAG,IAAI,CAAC;AACjB,iBAAA;AACF,aAAA;AACF,SAAA;QACD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;YAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAE1C,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,aAAA;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,MAAK;AACrB,gBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;oBAC7D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC9D,iBAAA;gBACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;gBAC7C,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC9D,aAAC,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC1D,SAAA;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;KAC3C;IAED,cAAc,GAAA;QACZ,IAAI,KAAK,GAAW,CAAC,CAAC;QACtB,IAAI,EAAE,GAAW,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;AACjD,QAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE;AACxF,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,EAAE,GAAG,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;AACtC,SAAA;QACD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAG;YACxB,MAAM,gBAAgB,GAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAC3G,YAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACjC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvC,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3B,aAAA;AACH,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;KACrC;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;KAC5D;IAED,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;QAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,aAAa,GAAG,MAAK;YACxB,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,MAAM,KAAK,GAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAChE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBAChC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;oBACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAC3C,iBAAA;AAAM,qBAAA;oBACL,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,QAAS,CAAC;AACnC,iBAAA;AACF,aAAA;AAAM,iBAAA;gBACL,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAC3C,aAAA;AACH,SAAC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;KAC9B;IAED,aAAa,GAAA;QACX,OAAO;AACL,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YAC9B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,YAAY;AAChC,YAAA,aAAa,EAAE,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK;SACrD,CAAC;KACH;IAED,aAAa,GAAA;AACX,QAAA,MAAM,YAAY,GAAY,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC;AAClI,QAAA,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACxC,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KACxC;IAED,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AAC5D,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;AAC/B,SAAA;KACF;;kHAhJU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sGAArB,qBAAqB,EAAA,QAAA,EAAA,uEAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uEAAuE;AACjF,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;AACzC,iBAAA,CAAA;iGAG+B,WAAW,EAAA,CAAA;sBAAxC,KAAK;uBAAC,qBAAqB,CAAA;gBACnB,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACI,SAAS,EAAA,CAAA;sBAAlB,MAAM;gBACG,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,cAAc,EAAA,CAAA;sBAAvB,MAAM;gBAoB6C,gBAAgB,EAAA,CAAA;sBAAnE,YAAY;uBAAC,wBAAwB,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAOf,OAAO,EAAA,CAAA;sBAAzC,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;;;MCvCtB,oBAAoB,CAAA;IAE/B,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KAAK;IAE/E,eAAe,GAAA;QACb,IAAI,CAAC,2BAA2B,EAAE,CAAC;KACpC;IAED,2BAA2B,GAAA;AACzB,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE;AACtC,YAAA,EAAE,CAAC,eAAe,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACnE,SAAA;KACF;;iHAbU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qGAApB,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AAC1B,iBAAA,CAAA;;;MCCY,mBAAmB,CAAA;IAK9B,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QAH1D,IAAY,CAAA,YAAA,GAA4B,IAAI,CAAC;QAC7C,IAAmB,CAAA,mBAAA,GAAkB,IAAI,CAAC;KAGzD;IAED,eAAe,GAAA;QACb,IAAI,CAAC,6BAA6B,EAAE,CAAC;KACtC;IAED,6BAA6B,GAAA;AAC3B,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YAC/D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;AAC7E,YAAA,EAAE,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACzE,SAAA;KACF;IAED,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,GAAG,IAAI,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;KACjC;;gHA1BU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;oGAAnB,mBAAmB,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACvC,iBAAA,CAAA;wHAGiB,YAAY,EAAA,CAAA;sBAA3B,KAAK;gBACU,mBAAmB,EAAA,CAAA;sBAAlC,KAAK;;;MCHK,uBAAuB,CAAA;IAIlC,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QAFjE,IAAqB,CAAA,qBAAA,GAAW,EAAE,CAAC;KAEmC;IAE/E,eAAe,GAAA;QACb,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,6CAA6C,EAAE,CAAC;KACtD;IAED,qBAAqB,GAAA;QACnB,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CACxC,uBAAuB,EACvB,IAAI,CAAC,qBAAqB,CAC3B,CAAC;AACH,SAAA;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC9J;IAED,6CAA6C,GAAA;AAC3C,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,EAAE;AACf,YAAA,EAAE,CAAC,eAAe,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC9E,SAAA;KACF;;oHA1BU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;wGAAvB,uBAAuB,EAAA,QAAA,EAAA,8EAAA,EAAA,MAAA,EAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8EAA8E;AACzF,iBAAA,CAAA;wHAGU,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;;;MCFK,qBAAqB,CAAA;IAOhC,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QALjE,IAAmB,CAAA,mBAAA,GAA8B,EAAE,CAAC;KAKkB;IAE/E,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,EAAE,EAAE;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AACtE,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CACxC,qBAAqB,EACrB,IAAI,CAAC,mBAAmB,CACzB,CAAC;YACF,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CACxC,cAAc,EACd,IAAI,CAAC,YAAY,CAClB,CAAC;AACH,aAAA;AACF,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,KAAK,CAAC,qEAAqE,CAAC,CAAC;AACpF,SAAA;AACD,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;YAC/B,IAAI,CAAC,yCAAyC,EAAE,CAAC;SAClD,EAAE,CAAC,CAAC,CAAC;KACP;IAED,yCAAyC,GAAA;AACvC,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;AACnC,YAAA,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAChD,YAAA,OAAO,CAAC,GAAG,CAAC,yHAAyH,CAAC,CAAC;YACvI,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAC/C,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE;AACtC,YAAA,EAAE,CAAC,eAAe,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAoB,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;AAClF,SAAA;KACF;IAED,WAAW,GAAA;AACT,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;KAC9B;;kHA/CU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sGAArB,qBAAqB,EAAA,QAAA,EAAA,wEAAA,EAAA,MAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wEAAwE;AACnF,iBAAA,CAAA;wHAGU,mBAAmB,EAAA,CAAA;sBAA3B,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;;;MCDK,qBAAqB,CAAA;IA0OhC,WAAmB,CAAA,UAAsB,EAAS,WAAwB,EAAA;QAAvD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QAxOlE,IAAW,CAAA,WAAA,GAA+B,KAAK,CAAC;QAEjD,IAAmB,CAAA,mBAAA,GAAW,kBAAkB,CAAC;QACjD,IAAoB,CAAA,oBAAA,GAAY,KAAK,CAAC;QACtC,IAAiB,CAAA,iBAAA,GAA4B,IAAI,CAAC;QAClD,IAAO,CAAA,OAAA,GAAY,IAAI,CAAC;QAoO9B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC;KAClD;IAnOD,IAAoB,mBAAmB,CAAC,IAAgC,EAAA;AAEtE,QAAA,MAAM,UAAU,GAAY,IAAI,CAAC,oBAAoB,CAAC;AACtD,QAAA,MAAM,cAAc,GAA4B,IAAI,CAAC,iBAAiB,CAAC;AAEvE,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAE9B,QAAA,MAAM,EAAE,GAA6B,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,IAAI,EAAE;AACf,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;AAEzC,YAAA,MAAM,uBAAuB,GAAY,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;YACnE,IAAI,CAAC,uBAAuB,EAAE;gBAC5B,IAAI,CAAC,aAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD,OAAO;AACR,aAAA;AAED,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAExB,MAAM,wBAAwB,GAAG,IAAI,CAAC,aAAc,CAAC,qBAAqB,EAAE,CAAC;YAC7E,MAAM,sBAAsB,GAAqB,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AAC/G,gBAAA,OAAO,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,aAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACnG,aAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEN,IAAI,CAAC,cAAc,EAAE;AACnB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,sBAAsB,CAAC;AACjD,aAAA;AAED,YAAA,IAAI,IAAI,EAAE;gBAER,MAAM,gCAAgC,GAAuB,IAAI,CAAC,sCAAsC,CAAC,wBAAwB,CAAC,CAAC;AAEnI,gBAAA,MAAM,2BAA2B,GAAY,gCAAgC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC3F,gBAAA,IAAI,2BAA2B,IAAI,IAAI,CAAC,8BAA8B,CAAC,sBAAsB,EAAE,gCAAgC,EAAE,wBAAwB,CAAC,EAAE;AAC1J,oBAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;oBACzB,IAAI,CAAC,aAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnD,OAAO;AACR,iBAAA;AAED,gBAAA,IAAI,CAAC,aAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,OAAoB,KAAI;oBACpG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAClD,iBAAC,CAAC,CAAC;AAEH,gBAAA,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;gBAC9C,IAAI,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,EAAE;oBAC/E,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,IAAI,CAAC,CAAC;AAC9E,iBAAA;AACF,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,aAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,OAAoB,KAAI;oBACpG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AACrD,iBAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;gBAC9E,IAAI,CAAC,UAAU,EAAE;AACf,oBAAA,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;AAC/C,iBAAA;AACF,aAAA;AAGD,YAAA,MAAM,gBAAgB,GAA4B,CAAC,cAAc,GAAG,sBAAsB,GAAG,IAAI,CAAC;AAClG,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,aAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC,CAAC;AACnL,SAAA;KACF;AACD,IAAA,IAAW,mBAAmB,GAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;IAED,0BAA0B,CAAC,aAAiC,EAAE,KAAa,EAAA;QACzE,MAAM,eAAe,GAAuB,aAAa,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AAC/F,YAAA,OAAO,SAAS,CAAC,KAAK,KAAK,KAAK,IAAK,SAAS,CAAC,OAAe,CAAC,YAAY,CAAC,mBAAmB,KAAK,KAAK,CAAC;AAC5G,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,eAAe,CAAC;KACxB;IAEM,wBAAwB,GAAA;QAC7B,MAAM,wBAAwB,GAAuB,IAAI,CAAC,aAAc,CAAC,qBAAqB,EAAE,CAAC;AACjG,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxD,YAAA,MAAM,eAAe,GAAqB,wBAAwB,CAAC,CAAC,CAAC,CAAC;AACtE,YAAA,MAAM,OAAO,GAAQ,eAAe,CAAC,OAAc,CAAC;AACpD,YAAA,MAAM,YAAY,GAA0B,OAAO,CAAC,YAAY,CAAC;AACjE,YAAA,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;AAC7B,SAAA;QACD,IAAI,eAAe,GAAuB,IAAI,CAAC,0BAA0B,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;AAEvG,QAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,IAAI,eAAe,GAA4B,eAAe,CAAC,CAAC,CAAC,CAAC;YACjE,eAAe,CAAC,OAAe,CAAC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;AAC9D,YAAA,IAAI,UAAU,GAAwB,eAAe,CAAC,UAAU,CAAC;YACjE,IAAI,KAAK,GAAW,CAAC,CAAC;AACtB,YAAA,OAAO,eAAe,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC/C,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;AACvE,gBAAA,eAAe,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC3E,gBAAA,IAAI,eAAe,EAAE;oBAClB,eAAe,CAAC,OAAe,CAAC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;AAC9D,oBAAA,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;AACzC,iBAAA;AACJ,aAAA;AACF,SAAA;KACF;AAEM,IAAA,sCAAsC,CAAC,wBAA4C,EAAA;QAExF,MAAM,gCAAgC,GAAuB,EAAE,CAAC;AAChE,QAAA,MAAM,4BAA4B,GAAuB,wBAAwB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,QAA0B,EAAE,QAA0B,KAAI;AACzJ,YAAA,OAAO,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;AACzC,SAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAW,4BAA4B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAEhE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,4BAA4B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5D,YAAA,MAAM,SAAS,GAAqB,4BAA4B,CAAC,CAAC,CAAC,CAAC;AACpE,YAAA,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE;gBACjC,MAAM;AACP,aAAA;YACD,IAAI,CAAE,SAAS,CAAC,OAAe,CAAC,YAAY,CAAC,mBAAmB,EAAE;AAChE,gBAAA,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClD,aAAA;AACF,SAAA;AAED,QAAA,OAAO,gCAAgC,CAAC;KACzC;AAEM,IAAA,8BAA8B,CAAC,cAAgC,EAAE,iBAAqC,EAAE,wBAA4C,EAAA;QAEzJ,MAAM,6BAA6B,GAAuB,EAAE,CAAC;AAC7D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjD,YAAA,MAAM,sBAAsB,GAAqB,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACtE,IAAI,qBAAqB,GAA4B,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AACnH,gBAAA,OAAO,SAAS,CAAC,OAAO,KAAK,sBAAsB,CAAC,YAAY,CAAC;AACnE,aAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEN,YAAA,OAAO,qBAAqB,EAAE;gBAC5B,IAAI,qBAAqB,KAAK,cAAc,EAAE;AAC5C,oBAAA,6BAA6B,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;oBAC3D,MAAM;AACP,iBAAA;gBAED,MAAM,eAAe,GAAqB,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AACxG,oBAAA,OAAO,SAAS,CAAC,OAAO,KAAK,qBAAsB,CAAC,OAAO,CAAC;AAC9D,iBAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEN,qBAAqB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AACtF,oBAAA,OAAO,SAAS,CAAC,OAAO,KAAK,eAAe,CAAC,YAAY,CAAC;AAC5D,iBAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACP,aAAA;AACF,SAAA;AACD,QAAA,OAAO,iBAAiB,CAAC,MAAM,KAAK,6BAA6B,CAAC,MAAM,CAAC;KAC1E;AAEM,IAAA,gBAAgB,CAAC,eAAiC,EAAA;AACvD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1D,YAAA,MAAM,KAAK,GAAQ,IAAI,CAAC,aAAc,CAAC,gBAAgB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAC/F,YAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,GAAG,eAAe,CAAC;AACvD,YAAA,KAAK,CAAC,YAAY,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAC/C,SAAA;KACF;AAEM,IAAA,gBAAgB,CAAC,eAAiC,EAAA;AACvD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1D,YAAA,MAAM,KAAK,GAAQ,IAAI,CAAC,aAAc,CAAC,gBAAgB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAC/F,YAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,GAAG,eAAe,CAAC;AACvD,YAAA,KAAK,CAAC,YAAY,CAAC,mBAAmB,GAAG,KAAK,CAAC;AAC/C,YAAA,KAAK,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;AACnC,SAAA;KACF;IAEM,oBAAoB,CAAC,eAAiC,EAAE,wBAA4C,EAAA;QACzG,IAAI,qBAAqB,GAA4B,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AACnH,YAAA,OAAO,SAAS,CAAC,OAAO,KAAK,eAAe,CAAC,YAAY,CAAC;AAC5D,SAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEN,IAAI,kBAAkB,GAAW,CAAC,CAAC;AACnC,QAAA,IAAI,aAAqB,CAAC;AAE1B,QAAA,IAAI,qBAAqB,EAAE;AACzB,YAAA,aAAa,GAAG,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC;YACxD,qBAAqB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAA2B,KAAI;AACvE,gBAAA,IAAI,IAAI,CAAC,aAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,mBAAmB,EAAE;AAC5F,oBAAA,kBAAkB,EAAE,CAAC;AACtB,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA;YACL,MAAM,gBAAgB,GAAuB,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AAC3G,gBAAA,OAAO,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC;AAC/B,aAAC,CAAC,CAAC;AACH,YAAA,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC;AACxC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAChD,gBAAA,MAAM,eAAe,GAAqB,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAC9D,gBAAA,IAAI,IAAI,CAAC,aAAc,CAAC,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,mBAAmB,EAAE;AAClG,oBAAA,kBAAkB,EAAE,CAAC;AACtB,iBAAA;AACF,aAAA;AACF,SAAA;QACD,OAAO,kBAAkB,KAAK,aAAa,CAAC;KAC7C;AAEM,IAAA,eAAe,CAAC,sBAAwC,EAAE,wBAA4C,EAAE,MAAe,EAAA;QAC5H,IAAI,qBAAqB,GAA4B,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AACnH,YAAA,OAAO,SAAS,CAAC,OAAO,KAAK,sBAAsB,CAAC,YAAY,CAAC;AACnE,SAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEN,MAAM,iBAAiB,GAAY,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;QAC/G,IAAI,0BAA0B,GAAY,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;QAE5E,OAAO,qBAAqB,IAAI,0BAA0B,EAAE;AAC1D,YAAA,MAAM,aAAa,GAAQ,qBAAqB,CAAC,OAAc,CAAC;AAEhE,YAAA,aAAa,CAAC,YAAY,CAAC,iBAAiB,GAAG,sBAAsB,CAAC;AACtE,YAAA,aAAa,CAAC,YAAY,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACvD,YAAA,aAAa,CAAC,YAAY,CAAC,mBAAmB,GAAG,MAAM,CAAC;AACxD,YAAA,aAAa,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;YAG1C,MAAM,eAAe,GAAqB,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AACxG,gBAAA,OAAO,SAAS,CAAC,OAAO,KAAK,qBAAsB,CAAC,OAAO,CAAC;AAC9D,aAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEN,qBAAqB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAA2B,KAAI;AACtF,gBAAA,OAAO,SAAS,CAAC,OAAO,KAAK,eAAe,CAAC,YAAY,CAAC;AAC5D,aAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACP,SAAA;KACF;IAMD,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC;KACnD;;kHAhPU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sGAArB,qBAAqB,EAAA,QAAA,EAAA,wEAAA,EAAA,MAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wEAAwE;AACnF,iBAAA,CAAA;wHAUqB,mBAAmB,EAAA,CAAA;sBAAtC,KAAK;;;MC+DK,aAAa,CAAA;;0GAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAb,aAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,iBA/CtB,aAAa;QACb,gBAAgB;QAChB,sBAAsB;QACtB,uBAAuB;QACvB,wBAAwB;QACxB,oBAAoB;QACpB,aAAa;QACb,qBAAqB;QACrB,yBAAyB;QACzB,oBAAoB;QACpB,mBAAmB;QACnB,uBAAuB;QACvB,qBAAqB;QACrB,mBAAmB;QACnB,uBAAuB;QACvB,yBAAyB;QACzB,qBAAqB,CAAA,EAAA,OAAA,EAAA,CAGrB,YAAY,CAAA,EAAA,OAAA,EAAA,CASZ,aAAa;QACb,gBAAgB;QAChB,sBAAsB;QACtB,uBAAuB;QACvB,wBAAwB;QACxB,oBAAoB;QACpB,aAAa;QACb,qBAAqB;QACrB,yBAAyB;QACzB,oBAAoB;QACpB,mBAAmB;QACnB,uBAAuB;QACvB,qBAAqB;QACrB,mBAAmB;QACnB,uBAAuB;QACvB,qBAAqB,CAAA,EAAA,CAAA,CAAA;AAIZ,aAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,EA1Bb,SAAA,EAAA;QACT,WAAW;QACX,sBAAsB;QACtB,4BAA4B;QAC5B,uBAAuB;KACxB,EARQ,OAAA,EAAA,CAAA;YACP,YAAY;AACb,SAAA,CAAA,EAAA,CAAA,CAAA;2FA2BU,aAAa,EAAA,UAAA,EAAA,CAAA;kBArDzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,eAAe,EAAE;wBACf,yBAAyB;wBACzB,yBAAyB;AAC1B,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACZ,aAAa;wBACb,gBAAgB;wBAChB,sBAAsB;wBACtB,uBAAuB;wBACvB,wBAAwB;wBACxB,oBAAoB;wBACpB,aAAa;wBACb,qBAAqB;wBACrB,yBAAyB;wBACzB,oBAAoB;wBACpB,mBAAmB;wBACnB,uBAAuB;wBACvB,qBAAqB;wBACrB,mBAAmB;wBACnB,uBAAuB;wBACvB,yBAAyB;wBACzB,qBAAqB;AACtB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;AACb,qBAAA;AACD,oBAAA,SAAS,EAAE;wBACT,WAAW;wBACX,sBAAsB;wBACtB,4BAA4B;wBAC5B,uBAAuB;AACxB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,aAAa;wBACb,gBAAgB;wBAChB,sBAAsB;wBACtB,uBAAuB;wBACvB,wBAAwB;wBACxB,oBAAoB;wBACpB,aAAa;wBACb,qBAAqB;wBACrB,yBAAyB;wBACzB,oBAAoB;wBACpB,mBAAmB;wBACnB,uBAAuB;wBACvB,qBAAqB;wBACrB,mBAAmB;wBACnB,uBAAuB;wBACvB,qBAAqB;AACtB,qBAAA;oBACD,OAAO,EAAE,CAAE,sBAAsB,CAAE;AACpC,iBAAA,CAAA;;;MC3EY,UAAU,CAAA;AAGd,IAAA,OAAO,qBAAqB,GAAA;AACjC,QAAA,OAAO,UAAU,CAAC,iBAAkB,CAAC,kBAAkB,CAAC;KACzD;AAEM,IAAA,OAAO,uBAAuB,GAAA;AACnC,QAAA,OAAO,UAAU,CAAC,iBAAkB,CAAC,oBAAoB,CAAC;KAC3D;IAEM,OAAO,QAAQ,CAAC,GAAQ,EAAA;QAC7B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,YAAY,MAAM,CAAC;KACzD;;AAZa,UAAiB,CAAA,iBAAA,GAA6B,IAAI;;ACL5D,IAAW,cAShB;AATD,CAAA,UAAiB,aAAa,EAAA;IAEf,aAAU,CAAA,UAAA,GAAwB,CAAC,CAAC,CAAC;IAGrC,aAAI,CAAA,IAAA,GAAkB,CAAC,CAAC;IAGxB,aAAS,CAAA,SAAA,GAAuB,CAAC,CAAC;AACjD,CAAC,EATgB,aAAa,KAAb,aAAa,GAS7B,EAAA,CAAA,CAAA;;MCEY,iBAAiB,CAAA;AAyB5B,IAAA,WAAA,GAAA;QAxBO,IAAyB,CAAA,yBAAA,GAAY,KAAK,CAAC;AAyBhD,QAAA,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC;KACrC;AAZD,IAAA,IAAW,oBAAoB,GAAA;QAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC;KACnC;AACD,IAAA,IAAW,kBAAkB,GAAA;QAC3B,OAAO,IAAI,CAAC,mBAAmB,CAAC;KACjC;AACD,IAAA,IAAW,2BAA2B,GAAA;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;AAMD,IAAA,kBAAkB,CAChB,KAAY,EACZ,aAKQ,EACR,WAAiG,EAAA;AAEjG,QAAA,IAAI,aAAoB,CAAC;AAEzB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,aAAa,GAAG,KAAK,CAAC;AAEtB,QAAA,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AAChC,gBAAA,MAAM,gBAAgB,GAAW,aAAa,CAAC,MAAM,CAAC;gBACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE;AACzC,oBAAA,MAAM,OAAO,GAA0C,aAAa,CAAC,CAAC,CAAC,CAAC;AACxE,oBAAA,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC;oBACrC,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACpE,iBAAA;AACF,aAAA;AAAM,iBAAA;gBACL,aAAa,GAAG,IAAI,CAAC,qBAAqB,CACxC,aAAa,EACb,aAAa,CACd,CAAC;AACH,aAAA;AACF,SAAA;AAED,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;gBAC9B,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAC1C,aAAa,EACb,WAAW,CACZ,CAAC;AACH,aAAA;AAAM,iBAAA;gBACL,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AACrE,aAAA;AACF,SAAA;AAED,QAAA,OAAO,aAAa,CAAC;KACtB;AAED,IAAA,QAAQ,CAAC,GAAQ,EAAA;QACf,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,YAAY,MAAM,CAAC;KACzD;IAED,qBAAqB,CAAC,KAAY,EAAE,aAAoD,EAAA;AACtF,QAAA,IAAI,CAAC,qBAAqB,GAAG,aAAa,CAAC;QAC3C,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,KAAK,CACT,uFAAuF,CACxF,CAAC;AACH,SAAA;QACD,MAAM,QAAQ,GAA8D,IAAI,CAAC,QAAQ,CACvF,aAAa,CAAC,mBAAmB,CAClC;AACC,cAAG,CAAC,aAAa,CAAC,mBAAmB,CAAc;AACnD,cAAE,aAAa,CAAC,mBAAmB,CAAC;AAEtC,QAAA,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;AAE3C,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,MAAM,KAAK,CACT,qEAAqE,CACtE,CAAC;AACH,SAAA;AAED,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAED,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AAEvB,QAAA,MAAM,aAAa,GAAW,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAEpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;YACtC,IAAI,CAAC,4BAA4B,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrC,SAAA;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AAEhD,QAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAEvB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AAE/C,QAAA,OAAO,KAAK,CAAC;KACd;AAED,IAAA,4BAA4B,CAAC,OAAkC,EAAA;QAC7D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,EAAE;AAC/D,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACpC,OAAO;AACR,SAAA;QACD,MAAM,gBAAgB,GAAY,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAEpC,QAAA,IAAI,gBAAgB,EAAE;YACpB,MAAM,aAAa,GAAa,EAAE,CAAC;AACnC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,KAAK,GAAW,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,iBAAiB,GAAW,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEnD,gBAAA,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE;oBAC5B,OAAO,KAAK,KAAK,EAAE,EAAE;wBACnB,MAAM,eAAe,GAAW,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACvD,MAAM,aAAa,GAAW,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;AACpE,wBAAA,MAAM,QAAQ,GAAW,KAAK,CAAC,SAAS,CACtC,iBAAiB,GAAG,CAAC,EACrB,eAAe,GAAG,CAAC,CACpB,CAAC;AACF,wBAAA,MAAM,cAAc,GAAW,KAAK,CAAC,SAAS,CAC5C,eAAe,EACf,KAAK,CAAC,MAAM,CACb,CAAC;wBACF,KAAK,GAAG,cAAc,CAAC;AACvB,wBAAA,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBAEvC,IAAI,aAAa,KAAK,EAAE,EAAE;AACxB,4BAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACnC,yBAAA;AACD,wBAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,qBAAA;AACF,iBAAA;AAAM,qBAAA;AACL,oBAAA,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,iBAAA;AACF,aAAA;AACD,YAAA,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;AAC7B,SAAA;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,IAAI,MAAM,GAAW,cAAc,CAAC;AACpC,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC;AAEzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AAC7B,gBAAA,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;AAC5B,aAAA;AAAM,iBAAA;gBACL,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;AAClC,aAAA;AACD,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,SAAA;KACF;IAED,kBAAkB,CAAC,KAAY,EAAE,WAAgC,EAAA;AAC/D,QAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC;QAEvC,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,KAAK,CACT,qFAAqF,CACtF,CAAC;AACH,SAAA;AAED,QAAA,MAAM,OAAO,GAAW,WAAW,CAAC,kBAA4B,CAAC;AACjE,QAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;AAC/C,QAAA,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;AAEzC,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,MAAM,KAAK,CACT,mEAAmE,CACpE,CAAC;AACH,SAAA;AACD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAED,QAAA,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAE3C,QAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,CAAC,IAAI,EAAE;AAC7C,YAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AACpC,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACd;IAED,uBAAuB,CACrB,KAAY,EACZ,gBAAkE,EAAA;QAElE,gBAAgB,CAAC,IAAI,CACnB,CAAC,YAAiC,EAAE,YAAiC,KAAI;AACvE,YAAA,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE;AAClC,gBAAA,OAAO,CAAC,CAAC;AACV,aAAA;AACD,YAAA,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC;AACtC,YAAA,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC;YACtC,IAAI,MAAM,KAAK,MAAM,EAAE;AACrB,gBAAA,OAAO,CAAC,CAAC;AACV,aAAA;AACD,YAAA,OAAO,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAClC,SAAC,CACF,CAAC;AAEF,QAAA,gBAAgB,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;YACvC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AACtD,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,KAAK,CAAC;KACd;AAED,IAAA,uCAAuC,CAAC,KAAU,EAAA;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AAChD,QAAA,MAAM,IAAI,GAAU,IAAI,CAAC,eAAe,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;AAE9D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,MAAM,MAAM,GAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAA,MAAM,SAAS,GAAW,MAAM,CAAC,MAAM,CAAC;YAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;AAClC,gBAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAEvB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACpC,oBAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;AACnC,wBAAA,MAAM,KAAK,CACT,CAAY,SAAA,EAAA,IAAI,CAAC,KAAK,CAAA,cAAA,EAAiB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA,CAAE,CAC1D,CAAC;AACH,qBAAA;oBACD,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,iBAAA;AACF,aAAA;AACD,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACb;IAEO,cAAc,CAAC,GAAQ,EAAE,QAAgB,EAAE,KAAa,GAAA,SAAS,EAAE,QAAA,GAAoB,IAAI,EAAA;AACjG,QAAA,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE;AACnC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC,CAAC;KACJ;IAED,oCAAoC,CAAC,MAAW,EAAE,MAAW,EAAA;QAC3D,IAAI,IAAI,GAAG,MAAM,CAAC;QAClB,IAAI,IAAI,GAAG,MAAM,CAAC;AAElB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5B,IACE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;gBAChC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAChC;AACA,gBAAA,MAAM,KAAK,CAAC,CAAY,SAAA,EAAA,IAAI,CAAC,KAAK,CAAA,cAAA,EAAiB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC;AACxE,aAAA;AACD,YAAA,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,YAAA,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,SAAA;AAED,QAAA,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACrB;;8GAjSU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,iBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCPY,WAAW,CAAA;AA6DtB,IAAA,WAAA,CACE,kBAA0B,EAC1B,UAAgD,EAChD,oBAI8B,GAAA,aAAa,CAAC,IAAI,EAChD,aAAsB,IAAI,EAC1B,YAAoB,CAAC,EACrB,kBAA2B,KAAK,EAChC,uBAA+F,IAAI,EAAA;QA/DrG,IAAe,CAAA,eAAA,GAAY,IAAI,CAAC;AAMhC,QAAA,IAAA,CAAA,eAAe,GAKT,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAuBtE,IAAmB,CAAA,mBAAA,GAAW,CAAC,CAAC,CAAC;AA+BvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAC7C,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;AACjD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;AAC3B,QAAA,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;AACxC,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;AAEjD,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC;KAChD;AA7DD,IAAA,IAAI,cAAc,GAAA;QAMhB,OAAO,IAAI,CAAC,eAAe,CAAC;KAC7B;IAED,IAAI,cAAc,CAChB,KAKG,EAAA;AAEH,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;KAC9B;AAID,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,mBAAmB,KAAK,CAAC,CAAC;cAClC,aAAa,CAAC,IAAI;cAClB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;KACpD;IAED,IAAI,aAAa,CACf,SAIsB,EAAA;QAEtB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;KACpE;IA0BM,iBAAiB,GAAA;QACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;AAC3D,YAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAC9B,SAAA;KACF;AACF;;AC/FK,IAAW,UAMhB;AAND,CAAA,UAAiB,SAAS,EAAA;IAEX,SAAG,CAAA,GAAA,GAAiB,KAAK,CAAC;IAG1B,SAAG,CAAA,GAAA,GAAiB,KAAK,CAAC;AACzC,CAAC,EANgB,SAAS,KAAT,SAAS,GAMzB,EAAA,CAAA,CAAA;;MCHY,aAAa,CAAA;AAUxB,IAAA,WAAA,CACE,mBAAsC,EACtC,UAAkE,EAClE,WAAmB,GAAA,IAAI,EACvB,SAAA,GAAoD,SAAS,CAAC,GAAG,EACjE,aAAsB,IAAI,EAAA;QAX5B,IAAe,CAAA,eAAA,GAAY,IAAI,CAAC;AAa9B,QAAA,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;AAC/C,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;KAC5B;AACF;;ACvBK,MAAO,cAAe,SAAQ,UAAU,CAAA;AAC5C,IAAA,OAAO,IAAI,CAAC,MAAW,EAAE,MAAW,EAAA;AAClC,QAAA,MAAM,MAAM,GACV,UAAU,CAAC,iBAAkB,CAAC,oCAAoC,CAChE,MAAM,EACN,MAAM,CACP,CAAC;AACJ,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAErB,QAAA,MAAM,kBAAkB,GAAwB,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACnF,IAAI,CAAC,kBAAkB,EAAE;YACvB,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;QAED,IAAI,kBAAmB,CAAC,eAAe,EAAE;AACvC,YAAA,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,YAAA,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,SAAA;AAED,QAAA,MAAM,QAAQ,GAAoB,kBAAmB,CAAC,cAAe,CAAC;AACtE,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC/C,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,SAAA;QAED,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,YAAA,OAAO,CAAC,CAAC;AACV,SAAA;AACD,QAAA,OAAO,UAAU,CAAC,iBAAkB,CAAC,aAAa,KAAK,CAAC;cACpD,IAAI,GAAG,IAAI;AACb,cAAE,IAAI,GAAG,IAAI,CAAC;KACjB;AAED,IAAA,OAAO,OAAO,CAAC,MAAW,EAAE,MAAW,EAAA;AACrC,QAAA,MAAM,MAAM,GACV,UAAU,CAAC,iBAAkB,CAAC,oCAAoC,CAChE,MAAM,EACN,MAAM,CACP,CAAC;AACJ,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAErB,QAAA,MAAM,kBAAkB,GAAwB,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACnF,IAAI,CAAC,kBAAkB,EAAE;YACvB,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;AAED,QAAA,MAAM,QAAQ,GAAoB,kBAAmB,CAAC,cAAe,CAAC;AACtE,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC/C,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,SAAA;QAED,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,YAAA,OAAO,CAAC,CAAC;AACV,SAAA;QACD,OAAO,IAAI,GAAG,IAAI;AAChB,cAAE,CAAC,GAAG,UAAU,CAAC,iBAAkB,CAAC,aAAa;cAC/C,CAAC,CAAC,GAAG,UAAU,CAAC,iBAAkB,CAAC,aAAa,CAAC;KACtD;AAED,IAAA,OAAO,OAAO,CAAC,MAAW,EAAE,MAAW,EAAA;AACrC,QAAA,MAAM,MAAM,GACV,UAAU,CAAC,iBAAkB,CAAC,oCAAoC,CAChE,MAAM,EACN,MAAM,CACP,CAAC;AACJ,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAErB,QAAA,MAAM,kBAAkB,GAAwB,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACnF,IAAI,CAAC,kBAAkB,EAAE;YACvB,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;AAED,QAAA,MAAM,QAAQ,GAAoB,kBAAmB,CAAC,cAAe,CAAC;AACtE,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC/C,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,SAAA;QAED,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,YAAA,OAAO,CAAC,CAAC;AACV,SAAA;AACD,QAAA,OAAO,UAAU,CAAC,iBAAkB,CAAC,aAAa,KAAK,CAAC;cACpD,IAAI,GAAG,IAAI;AACb,cAAE,IAAI,GAAG,IAAI,CAAC;KACjB;AAED,IAAA,OAAO,MAAM,CAAC,MAAW,EAAE,MAAW,EAAA;AACpC,QAAA,MAAM,MAAM,GACV,UAAU,CAAC,iBAAkB,CAAC,oCAAoC,CAChE,MAAM,EACN,MAAM,CACP,CAAC;AACJ,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAErB,QAAA,MAAM,kBAAkB,GAAwB,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACnF,IAAI,CAAC,kBAAkB,EAAE;YACvB,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;AAED,QAAA,MAAM,QAAQ,GAAoB,kBAAmB,CAAC,cAAe,CAAC;AACtE,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC/C,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,SAAA;QAED,MAAM,WAAW,GAAW,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,WAAW,GAAW,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,WAAW,KAAK,WAAW,EAAE;AAC/B,YAAA,OAAO,CAAC,CAAC;AACV,SAAA;AACD,QAAA,OAAO,UAAU,CAAC,iBAAkB,CAAC,aAAa,KAAK,CAAC;cACpD,WAAW,GAAG,WAAW;AAC3B,cAAE,WAAW,GAAG,WAAW,CAAC;KAC/B;AAED,IAAA,OAAO,YAAY,CAAC,MAAW,EAAE,MAAW,EAAA;AAC1C,QAAA,MAAM,MAAM,GACV,UAAU,CAAC,iBAAkB,CAAC,oCAAoC,CAChE,MAAM,EACN,MAAM,CACP,CAAC;AACJ,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAErB,QAAA,MAAM,kBAAkB,GAAwB,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACnF,IAAI,CAAC,kBAAkB,EAAE;YACvB,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;AAED,QAAA,MAAM,QAAQ,GAAoB,kBAAmB,CAAC,cAAe,CAAC;AACtE,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC/C,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,SAAA;AAED,QAAA,IAAI,UAAU,CAAC,iBAAkB,CAAC,UAAU,EAAE;YAC5C,IACE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,YAAY,MAAM;iBAClD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,YAAY,MAAM,CAAC,EACpD;AACA,gBAAA,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAC1B,gBAAA,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAC3B,aAAA;AACF,SAAA;AAED,QAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvB,QAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEvB,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAkB,CAAC,kBAAkB,EAAE;AACrE,YAAA,OAAO,CAAC,CAAC;AACV,SAAA;AACD,QAAA,IAAI,UAAU,CAAC,iBAAkB,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;AACrE,YAAA,IACE,UAAU,CAAC,iBAAkB,CAAC,kBAAkB,CAAC,oBAAoB,EACrE;AACA,gBAAA,MAAM,OAAO,GACX,UAAU,CAAC,iBAAkB,CAAC,kBAAkB;qBAC7C,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAC7B,gBAAA,MAAM,OAAO,GAAgC,UAAU,CAAC,iBAAkB,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,iBAAkB,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAyB,GAAG,IAAI,CAAC;AACxO,gBAAA,IAAI,OAAO,EAAE;oBACX,QACE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;AAC1C,wBAAA,UAAU,CAAC,iBAAkB,CAAC,aAAa,EAC3C;AACH,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC;AACtC,wBAAA,UAAU,CAAC,iBAAkB,CAAC,aAAa,CAAC;AAC/C,iBAAA;AACF,aAAA;AAAM,iBAAA;AACL,gBAAA,QACE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,iBAAkB,CAAC,aAAa,EACtE;AACH,aAAA;AACF,SAAA;AAAM,aAAA;YACL,OAAO,IAAI,GAAG,IAAI;AAChB,kBAAE,UAAU,CAAC,iBAAkB,CAAC,aAAa,GAAG,CAAC;kBAC/C,UAAU,CAAC,iBAAkB,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AACtD,SAAA;KACF;AAED,IAAA,OAAO,yBAAyB,GAAA;AAC9B,QAAA,MAAM,KAAK,CAAC,CAA2D,yDAAA,CAAA,CAAC,CAAC;KAC1E;AACF;;AC9LK,MAAO,gBAAiB,SAAQ,UAAU,CAAA;IACtC,OAAO,kBAAkB,CAAC,WAAmB,EAAA;AACnD,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAkB,CAAC,oBAAoB,EAAE;AACvD,YAAA,OAAO,CAAC,CAAC;AACV,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,UAAU,CAAC,iBAAkB,CAAC,oBAAoB,CAAC,SAAS;AACnE,gBAAA,SAAS,CAAC,GAAG;AACb,kBAAE,CAAC;kBACD,WAAW,CAAC;AACf,SAAA;KACF;IAEO,OAAO,YAAY,CAAC,GAAW,EAAA;QACrC,MAAM,MAAM,GAAG,qBAAqB,CAAC;QACrC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC;AAEM,IAAA,OAAO,gBAAgB,CAC5B,KAAU,EACV,eAAsD,EACtD,KAAa,EAAA;AAEb,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AAClC,YAAA,IAAI,KAAK,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,gBAAA,MAAM,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA,gDAAA,CAAkD,CAAC,CAAC;AACzE,aAAA;AACF,SAAA;AACD,QAAA,IAAI,QAAyB,CAAC;AAC9B,QAAA,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;AACvC,cAAE,eAAe,CAAC,KAAK,CAAC;cACtB,eAAe,CAAC;AACpB,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAED,IAAA,OAAO,eAAe,CACpB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,cAAc,GAAY,KAAK,CAAC;AAEpC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAY,oBAAqB,CAAC,WAAW,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAa,oBAAqB,CAAC,UAAU,CAAC;AAE9D,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACF,oBAAqB,CAAC,eAAgB,EACvC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AAEjE,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AAC7B,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,cAAc,GAAG,IAAI,CAAC;AACvB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;AAED,IAAA,OAAO,uBAAuB,CAC5B,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,oBAAoB,GAAY,KAAK,CAAC;AAE1C,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAY,oBAAqB,CAAC,WAAW,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAa,oBAAqB,CAAC,UAAU,CAAC;AAE9D,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACF,oBAAqB,CAAC,eAAgB,EACvC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AAEjE,YAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AAC9B,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,oBAAoB,GAAG,IAAI,CAAC;AAC7B,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,oBAAoB,CAAC;KAC7B;AAED,IAAA,OAAO,aAAa,CAClB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AACJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,gBAAgB,GAAY,KAAK,CAAC;AAEtC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAW,oBAAqB,CAAC,UAAU;AACzD,cAAE,IAAI;cACJ,GAAG,CAAC;QAER,MAAM,WAAW,GAAW,2HAA2H;AACrJ,cAAA,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACzF,QAAA,MAAM,iBAAiB,GAAW,WAAW,GAAG,WAAW,GAAG,GAAG,CAAC;QAClE,MAAM,YAAY,GAAW,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;AAExE,QAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,iBAAiB;YACjB,GAAG;YACH,YAAY;YACZ,IAAI;YACJ,YAAY;YACZ,OAAO;YACP,WAAW;YACX,IAAI,EACJ,UAAU,CACX,CAAC;AAEF,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE9B,YAAA,IAAI,KAAK,EAAE;AACT,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,gBAAgB,GAAG,IAAI,CAAC;AACzB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED,IAAA,OAAO,qBAAqB,CAC1B,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AACJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,kBAAkB,GAAY,KAAK,CAAC;AAExC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAW,oBAAqB,CAAC,UAAU;AACzD,cAAE,IAAI;cACJ,GAAG,CAAC;QAER,MAAM,WAAW,GAAW,2HAA2H;AACrJ,cAAA,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACzF,QAAA,MAAM,iBAAiB,GAAW,WAAW,GAAG,WAAW,GAAG,GAAG,CAAC;QAClE,MAAM,YAAY,GAAW,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;AAExE,QAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,iBAAiB;YACjB,GAAG;YACH,YAAY;YACZ,IAAI;YACJ,YAAY;YACZ,OAAO;YACP,WAAW;YACX,IAAI,EACJ,UAAU,CACX,CAAC;AAEF,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,kBAAkB,GAAG,IAAI,CAAC;AAC3B,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,kBAAkB,CAAC;KAC3B;AAED,IAAA,OAAO,WAAW,CAChB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,gBAAgB,GAAY,KAAK,CAAC;AAEtC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAE7D,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;AAE3C,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,WAAW,EAAE;AACnE,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,gBAAgB,GAAG,IAAI,CAAC;AACzB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED,IAAA,OAAO,mBAAmB,CACxB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,sBAAsB,GAAY,KAAK,CAAC;AAE5C,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAE7D,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;AAE3C,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,WAAW,EAAE;AACnE,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,sBAAsB,GAAG,IAAI,CAAC;AAC/B,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,sBAAsB,CAAC;KAC/B;AAED,IAAA,OAAO,SAAS,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACxD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,cAAc,GAAY,KAAK,CAAC;AAEpC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAE7D,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;AAE3C,YAAA,IACE,GAAG;AACA,iBAAA,QAAQ,EAAE;AACV,iBAAA,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;AAC9D,gBAAA,WAAW,EACX;AACA,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,cAAc,GAAG,IAAI,CAAC;AACvB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;AAED,IAAA,OAAO,iBAAiB,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QAChE,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,oBAAoB,GAAY,KAAK,CAAC;AAE1C,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAE7D,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;AAE3C,YAAA,IACE,GAAG;AACA,iBAAA,QAAQ,EAAE;AACV,iBAAA,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;AAC9D,gBAAA,WAAW,EACX;AACA,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,oBAAoB,GAAG,IAAI,CAAC;AAC7B,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,oBAAoB,CAAC;KAC7B;AAED,IAAA,OAAO,gBAAgB,CACrB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,gBAAgB,GAAY,KAAK,CAAC;AAEtC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAW,oBAAqB,CAAC,UAAU;AACzD,cAAE,IAAI;cACJ,GAAG,CAAC;QACR,MAAM,YAAY,GAAW,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACxE,MAAM,WAAW,GAAW,2HAA2H;AACrJ,cAAA,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACzF,QAAA,MAAM,iBAAiB,GAAW,WAAW,GAAG,WAAW,GAAG,GAAG,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,iBAAiB,GAAG,YAAY,EAAE,UAAU,CAAC,CAAC;AAEvE,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE9B,YAAA,IAAI,KAAK,EAAE;AACT,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,gBAAgB,GAAG,IAAI,CAAC;AACzB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED,IAAA,OAAO,wBAAwB,CAC7B,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,uBAAuB,GAAY,KAAK,CAAC;AAE7C,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAW,oBAAqB,CAAC,UAAU;AACzD,cAAE,IAAI;cACJ,GAAG,CAAC;QACR,MAAM,YAAY,GAAW,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACxE,MAAM,WAAW,GAAW,2HAA2H;AACrJ,cAAA,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACzF,QAAA,MAAM,iBAAiB,GAAW,WAAW,GAAG,WAAW,GAAG,GAAG,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,iBAAiB,GAAG,YAAY,EAAE,UAAU,CAAC,CAAC;AAEvE,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,uBAAuB,GAAG,IAAI,CAAC;AAChC,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,uBAAuB,CAAC;KAChC;AAED,IAAA,OAAO,cAAc,CACnB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,cAAc,GAAY,KAAK,CAAC;AAEpC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAW,oBAAqB,CAAC,UAAU;AACzD,cAAE,IAAI;cACJ,GAAG,CAAC;QACR,MAAM,YAAY,GAAW,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACxE,MAAM,WAAW,GAAW,2HAA2H;AACrJ,cAAA,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACzF,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,GAAG,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,WAAW,GAAG,IAAI,EACzE,UAAU,CACX,CAAC;AAEF,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE9B,YAAA,IAAI,KAAK,EAAE;AACT,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,cAAc,GAAG,IAAI,CAAC;AACvB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;AAED,IAAA,OAAO,sBAAsB,CAC3B,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,oBAAoB,GAAY,KAAK,CAAC;AAE1C,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAW,oBAAqB,CAAC,UAAU;AACzD,cAAE,IAAI;cACJ,GAAG,CAAC;QACR,MAAM,YAAY,GAAW,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACxE,MAAM,WAAW,GAAW,2HAA2H;AACrJ,cAAA,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACzF,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,GAAG,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,WAAW,GAAG,IAAI,EACzE,UAAU,CACX,CAAC;AAEF,QAAA,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,oBAAoB,GAAG,IAAI,CAAC;AAC7B,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,oBAAoB,CAAC;KAC7B;AAED,IAAA,OAAO,MAAM,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACrD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,MAAM,GAAY,KAAK,CAAC;AAE5B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;QAE7D,WAAW;AACT,YAAA,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,UAAU;AAC5C,kBAAE,WAAW,CAAC,WAAW,EAAE;kBACzB,WAAW,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,GAAG;AACD,gBAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU;AACpC,sBAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE;sBAC5B,GAAG,CAAC;YAEV,IAAI,GAAG,IAAI,WAAW,EAAE;AACtB,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,MAAM,GAAG,IAAI,CAAC;AACf,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED,IAAA,OAAO,SAAS,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACxD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,SAAS,GAAY,KAAK,CAAC;AAE/B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;QAE7D,WAAW;AACT,YAAA,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,UAAU;AAC5C,kBAAE,WAAW,CAAC,WAAW,EAAE;kBACzB,WAAW,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,GAAG;AACD,gBAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU;AACpC,sBAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE;sBAC5B,GAAG,CAAC;YAGV,IAAI,GAAG,IAAI,WAAW,EAAE;AACtB,gBAAA,UAAU,EAAE,CAAC;gBACZ,IAAI,UAAU,KAAK,eAAe,EAAE;oBACnC,SAAS,GAAG,IAAI,CAAC;AAClB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;AAED,IAAA,OAAO,aAAa,CAClB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,MAAM,GAAY,KAAK,CAAC;AAE5B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;QAE7D,WAAW;AACT,YAAA,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,UAAU;AAC5C,kBAAE,WAAW,CAAC,WAAW,EAAE;kBACzB,WAAW,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,GAAG;AACD,gBAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU;AACpC,sBAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE;sBAC5B,GAAG,CAAC;YAEV,IAAI,GAAG,KAAK,WAAW,EAAE;AACvB,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,MAAM,GAAG,IAAI,CAAC;AACf,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED,IAAA,OAAO,iBAAiB,CACtB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,eAAe,GAAY,KAAK,CAAC;AAErC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,UAAU,GAAY,oBAAqB,CAAC,UAAU,CAAC;QAE7D,WAAW;AACT,YAAA,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,UAAU;AAC5C,kBAAE,WAAW,CAAC,WAAW,EAAE;kBACzB,WAAW,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,GAAG;AACD,gBAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU;AACpC,sBAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE;sBAC5B,GAAG,CAAC;YAEV,IAAI,GAAG,KAAK,WAAW,EAAE;AACvB,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,eAAe,GAAG,IAAI,CAAC;AACxB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,eAAe,CAAC;KACxB;AAED,IAAA,OAAO,SAAS,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACxD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,QAAQ,GAAY,KAAK,CAAC;AAE9B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,MAAM,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;QAE9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAoB,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAElB,YAAA,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE;AAC7B,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,QAAQ,GAAG,IAAI,CAAC;AACjB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AAED,IAAA,OAAO,YAAY,CACjB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,WAAW,GAAY,KAAK,CAAC;AAEjC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,MAAM,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;QAE9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAoB,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAElB,YAAA,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE;AAC7B,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,WAAW,GAAG,IAAI,CAAC;AACpB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,WAAW,CAAC;KACpB;AAED,IAAA,OAAO,kBAAkB,CACvB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,QAAQ,GAAY,KAAK,CAAC;AAE9B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,MAAM,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;QAE9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAoB,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAElB,YAAA,IAAI,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE;AAC9B,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,QAAQ,GAAG,IAAI,CAAC;AACjB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AAED,IAAA,OAAO,qBAAqB,CAC1B,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,WAAW,GAAY,KAAK,CAAC;AAEjC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,MAAM,WAAW,GAAW,oBAAqB,CAAC,WAAW,CAAC;QAE9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAoB,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAElB,YAAA,IAAI,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE;AAC9B,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,WAAW,GAAG,IAAI,CAAC;AACpB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,WAAW,CAAC;KACpB;AAED,IAAA,OAAO,aAAa,CAClB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,SAAS,GAAY,KAAK,CAAC;AAE/B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAS,oBAAqB,CAAC,WAAW,CAAC;QAE1D,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,YAAA,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,GAAG,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,gBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,aAAA;YAED,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE;AACzC,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,SAAS,GAAG,IAAI,CAAC;AAClB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;AAED,IAAA,OAAO,cAAc,CACnB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,UAAU,GAAY,KAAK,CAAC;AAEhC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAS,oBAAqB,CAAC,WAAW,CAAC;QAE1D,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,YAAA,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,GAAG,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,gBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,aAAA;YAED,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE;AACzC,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,UAAU,GAAG,IAAI,CAAC;AACnB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,UAAU,CAAC;KACnB;AAED,IAAA,OAAO,OAAO,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACtD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,UAAU,GAAY,KAAK,CAAC;AAEhC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAS,oBAAqB,CAAC,WAAW,CAAC;QAE1D,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,YAAA,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,GAAG,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,gBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,aAAA;YAED,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,WAAW,CAAC,OAAO,EAAE,EAAE;AAC3C,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,UAAU,GAAG,IAAI,CAAC;AACnB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,UAAU,CAAC;KACnB;AAED,IAAA,OAAO,WAAW,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QAC1D,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,SAAS,GAAY,KAAK,CAAC;AAE/B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAS,oBAAqB,CAAC,WAAW,CAAC;QAE1D,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,YAAA,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,GAAG,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,gBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,aAAA;YAED,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,WAAW,CAAC,OAAO,EAAE,EAAE;AAC3C,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,SAAS,GAAG,IAAI,CAAC;AAClB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;AAED,IAAA,OAAO,mBAAmB,CACxB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,SAAS,GAAY,KAAK,CAAC;AAE/B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAS,oBAAqB,CAAC,WAAW,CAAC;QAE1D,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,YAAA,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,GAAG,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,gBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,aAAA;YAED,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE;AAC1C,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,SAAS,GAAG,IAAI,CAAC;AAClB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;AAED,IAAA,OAAO,oBAAoB,CACzB,KAAU,EACV,KAAc,EACd,KAAa,EAAA;QAEb,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,UAAU,GAAY,KAAK,CAAC;AAEhC,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,WAAW,GAAS,oBAAqB,CAAC,WAAW,CAAC;QAE1D,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,YAAA,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,GAAG,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,oBAAqB,CAAC,eAAe,EAAE;AACzC,gBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,aAAA;YAED,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE;AAC1C,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,UAAU,GAAG,IAAI,CAAC;AACnB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,UAAU,CAAC;KACnB;AAED,IAAA,OAAO,OAAO,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACtD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,MAAM,GAAY,KAAK,CAAC;AAE5B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAY,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,GAAG,KAAK,IAAI,EAAE;AAChB,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,MAAM,GAAG,IAAI,CAAC;AACf,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED,IAAA,OAAO,QAAQ,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACvD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,OAAO,GAAY,KAAK,CAAC;AAE7B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAY,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,GAAG,KAAK,KAAK,EAAE;AACjB,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,OAAO,GAAG,IAAI,CAAC;AAChB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,OAAO,CAAC;KAChB;AAED,IAAA,OAAO,SAAS,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACxD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,QAAQ,GAAY,KAAK,CAAC;AAE9B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAY,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;AAEF,YAAA,IAAI,GAAG,EAAE;AACP,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,QAAQ,GAAG,IAAI,CAAC;AACjB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AAED,IAAA,OAAO,QAAQ,CAAC,KAAU,EAAE,KAAc,EAAE,KAAa,EAAA;QACvD,MAAM,IAAI,GACR,UAAU,CAAC,iBAAkB,CAAC,uCAAuC,CACnE,KAAK,CACN,CAAC;AAEJ,QAAA,MAAM,WAAW,GAAW,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,eAAe,GACnB,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,IAAI,OAAO,GAAY,KAAK,CAAC;AAE7B,QAAA,MAAM,oBAAoB,GAA0B,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACzF,IAAI,CAAC,oBAAoB,EAAE;YACzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG,GAAY,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,YAAA,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CACrC,GAAG,EACH,oBAAqB,CAAC,eAAgB,EACtC,CAAC,CACF,CAAC;YAEF,IAAI,CAAC,GAAG,EAAE;AACR,gBAAA,UAAU,EAAE,CAAC;gBACb,IAAI,UAAU,KAAK,eAAe,EAAE;oBAClC,OAAO,GAAG,IAAI,CAAC;AAChB,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,OAAO,OAAO,CAAC;KAChB;AAED,IAAA,OAAO,2BAA2B,GAAA;AAChC,QAAA,MAAM,KAAK,CAAC,CAA+D,6DAAA,CAAA,CAAC,CAAC;KAC9E;AACF;;MC/7CY,mBAAmB,CAAA;;gHAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAnB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,YANpB,aAAa,CAAA,EAAA,CAAA,CAAA;AAMZ,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,aAJnB,CAAC,iBAAiB,CAAC,EAFrB,OAAA,EAAA,CAAA,CAAC,aAAa,CAAC,CAAA,EAAA,CAAA,CAAA;2FAMb,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,aAAa,CAAC;AACxB,oBAAA,YAAY,EAAE,EAAE;oBAChB,SAAS,EAAE,CAAC,iBAAiB,CAAC;AAC9B,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,SAAS,EAAE,EAAE;AACd,iBAAA,CAAA;;;MCXY,KAAK,CAAA;AAKjB;;ACLD;;AAEG;;ACFH;;AAEG;;;;"}