{"version":3,"file":"e-is-ngx-material-table.mjs","sources":["../../src/app/ngx-material-table/table-element.ts","../../src/app/ngx-material-table/table-element-reactive-forms.ts","../../src/app/ngx-material-table/modules.ts","../../src/app/ngx-material-table/table-element-template-driven.ts","../../src/app/ngx-material-table/table-element.factory.ts","../../src/app/ngx-material-table/table-data-source.ts","../../src/app/ngx-material-table/validator.service.ts","../../src/app/ngx-material-table/validator.utils.ts","../../src/app/ngx-material-table/async/async-table-element.ts","../../src/app/ngx-material-table/async/async-table-element-reactive-forms.ts","../../src/app/ngx-material-table/async/async-table-element-template-driven.ts","../../src/app/ngx-material-table/async/async-table-element.factory.ts","../../src/app/ngx-material-table/async/async-table-data-source.ts","../../e-is-ngx-material-table.ts"],"sourcesContent":["import { UntypedFormGroup } from '@angular/forms';\n\nimport { TableDataSource } from './table-data-source';\n\nexport abstract class TableElement<T> {\n  id: number;\n  originalData?: T;\n  source: TableDataSource<T, any, any, TableElement<any>>;\n\n  abstract get editing(): boolean;\n  abstract set editing(editing: boolean);\n\n  abstract get currentData(): T;\n  abstract set currentData(currentData: T);\n  abstract cloneData(): T;\n\n  abstract get validator(): UntypedFormGroup;\n  abstract set validator(validator: UntypedFormGroup);\n\n  delete( options = { emitEvent: true }): boolean {\n    return this.source.delete(this.id, options);\n  }\n\n  confirmEditCreate(options = { emitEvent: true }): boolean {\n    return this.source.confirmEditCreate(this, options);\n  }\n\n  /**\n   * Cancel or delete\n   */\n  cancelOrDelete(options = { emitEvent: true }): boolean {\n    return this.source.cancelOrDelete(this, options);\n  }\n\n  cancel(): boolean {\n    return this.source.cancel(this);\n  }\n\n  startEdit(): boolean {\n    return this.source.startEdit(this);\n  }\n\n  move(direction: number): boolean {\n    return this.source.move(this.id, direction);\n  }\n\n  abstract get valid(): boolean;\n\n  abstract get pending(): boolean;\n\n  abstract get invalid(): boolean;\n\n  abstract get dirty(): boolean;\n\n  /**\n   * Check if the row is valid.\n   */\n  abstract isValid(): boolean;\n}\n","import { TableElement } from './table-element';\nimport { UntypedFormGroup } from '@angular/forms';\n\nexport class TableElementReactiveForms<T> extends TableElement<T> {\n  validator: UntypedFormGroup;\n\n  get currentData(): T {\n    return this.validator.getRawValue();\n  }\n\n  set currentData(data: T) {\n    this.validator.patchValue(data);\n  }\n\n  get editing(): boolean {\n    return this.validator.enabled;\n  }\n\n  set editing(value: boolean) {\n    if (value) {\n      this.validator.enable();\n    } else {\n      this.validator.disable();\n    }\n  }\n\n  get valid(): boolean {\n    return this.validator.valid;\n  }\n\n  get pending(): boolean {\n    return this.validator.pending;\n  }\n\n  get invalid(): boolean {\n    return this.validator.invalid;\n  }\n\n  get dirty(): boolean {\n    return this.validator.dirty;\n  }\n\n  constructor(init: Partial<TableElementReactiveForms<T>>) {\n    super();\n    this.validator = init.validator;\n    Object.assign(this, init);\n  }\n\n  isValid(): boolean {\n    // Enable temporarily the validator to get the valid status\n    const disabled = this.validator.disabled;\n    if (disabled) {\n      this.validator.enable({ emitEvent: false, onlySelf: true });\n      this.validator.updateValueAndValidity({ emitEvent: false, onlySelf: true });\n    }\n\n    try {\n      if (!this.validator.valid) {\n        // FIXME: enable this code, when isValid() will be async\n        // Wait end of async validation\n        //if (this.validator.pending) {\n        //  await waitWhilePending(this.validator);\n        //}\n\n        // Quit if really invalid\n        if (this.validator.invalid) {\n          return false;\n        }\n      }\n\n      return true;\n    } finally {\n      // Re-disabled, if need\n      if (disabled) {\n        this.validator.disable({ emitEvent: false, onlySelf: true });\n      }\n    }\n  }\n\n  cloneData(): T {\n    return this.validator.getRawValue();\n  }\n}\n","export function isESModule<T>(value: any | T): value is { default: T } {\n  return value && value['__esModule'] === true && !!value['default'];\n}\n\n/**\n * Workaround need for CommonJS library (eg. moment), because of packagr's issue - see https://github.com/ng-packagr/ng-packagr/issues/2215\n * @param commonJSModule\n */\nexport function unwrapESModule<T = any>(commonJSModule: T | any): T {\n  return isESModule<T>(commonJSModule) ? commonJSModule.default : (commonJSModule as T);\n}\n","import { TableElement } from './table-element';\nimport * as cloneImported from 'clone';\nimport { unwrapESModule } from './modules';\n\nconst clone = unwrapESModule<typeof cloneImported>(cloneImported);\n\nexport class TableElementTemplateDriven<T> extends TableElement<T> {\n  _editing: boolean;\n  _currentData: T;\n\n  get validator(): any {\n    return undefined;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  set validator(value: any) {}\n\n  get currentData(): T {\n    return this._currentData;\n  }\n\n  set currentData(data: T) {\n    this._currentData = data;\n  }\n\n  get editing(): boolean {\n    return this._editing;\n  }\n\n  set editing(value: boolean) {\n    this._editing = value;\n  }\n\n  get valid(): boolean {\n    return true;\n  }\n\n  get invalid(): boolean {\n    return false;\n  }\n\n  get pending(): boolean {\n    return false;\n  }\n\n  get dirty(): boolean {\n    return false;\n  }\n\n  constructor(init: Partial<TableElementTemplateDriven<T>>) {\n    super();\n    Object.assign(this, init);\n  }\n\n  isValid(): boolean {\n    return true;\n  }\n\n  cloneData(): T {\n    return clone(this._currentData);\n  }\n}\n","import { TableElementReactiveForms } from './table-element-reactive-forms';\nimport { TableElementTemplateDriven } from './table-element-template-driven';\n\nexport class TableElementFactory {\n  public static createTableElement(newElement: any): any {\n    if (this.isValidatorDefined(newElement)) {\n      // Create reactive forms element here.\n      return new TableElementReactiveForms(newElement);\n    } else {\n      // Default is the one without validator.\n      return new TableElementTemplateDriven(newElement);\n    }\n  }\n\n  static isValidatorDefined(newElement: any) {\n    return newElement.validator !== undefined && newElement.validator !== null;\n  }\n}\n","import { CollectionViewer, DataSource, ListRange } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable, Subject, Subscription } from 'rxjs';\nimport { TableElementFactory } from './table-element.factory';\nimport { ValidatorService } from './validator.service';\nimport { TableElement } from './table-element';\nimport { filter, map } from 'rxjs/operators';\nimport { moveItemInArray } from '@angular/cdk/drag-drop';\nimport { UntypedFormGroup } from '@angular/forms';\n\n/**\n * TableDataSourceConfig:\n * prependNewElements: if true, the new row is prepended to all other rows; otherwise it is appended\n * suppressErrors: if true, no error log\n * restoreOriginalDataOnCancel: if true, canceling a row will restore the original data, otherwise, previous data is restored\n **/\nexport interface TableDataSourceConfig {\n  prependNewElements?: boolean;\n  suppressErrors?: boolean;\n  restoreOriginalDataOnCancel?: boolean;\n}\n\nexport class TableDataSource<\n  T,\n  V extends ValidatorService = ValidatorService,\n  C extends TableDataSourceConfig = TableDataSourceConfig,\n  R extends TableElement<T> = TableElement<T>,\n> extends DataSource<R> {\n  /**\n   * Return the data array, of confirmed rows (currentData)\n   */\n  datasourceSubject: Subject<T[]>;\n\n  /**\n   * Return all existing rows. Please use connect() instead\n   */\n  rowsSubject: BehaviorSubject<R[]>;\n\n  protected dataConstructor: new () => T;\n  protected dataKeys: any[];\n  protected connectedViewers: {\n    viewer: CollectionViewer;\n    subscription: Subscription;\n    range: ListRange;\n  }[] = [];\n  protected currentData: any;\n  private readonly _config: C;\n  private _newElement: R = null;\n\n  get config(): C {\n    return this._config;\n  }\n\n  /**\n   * Say if there is a new (and not confirmed) row\n   */\n  get hasNewElement(): boolean {\n    return !!this._newElement;\n  }\n\n  /**\n   * Creates a new TableDataSource instance, that can be used as datasource of `@angular/cdk` data-table.\n   * @param data Array containing the initial values for the TableDataSource. If not specified, then `dataType` must be specified.\n   * @param dataType Type of data contained by the Table. If not specified, then `data` with at least one element must be specified.\n   * @param validatorService Service that create instances of the UntypedFormGroup used to validate row fields.\n   * @param config Additional configuration for table.\n   */\n  constructor(\n    data: T[],\n    dataType?: new () => T,\n    protected validatorService?: V,\n    config?: C\n  ) {\n    super();\n\n    this._config = {\n      prependNewElements: false,\n      suppressErrors: false,\n      restoreOriginalDataOnCancel: false,\n      ...config,\n    };\n\n    if (dataType) {\n      this.dataConstructor = dataType;\n    } else {\n      if (data && data.length > 0) {\n        this.dataKeys = Object.keys(data[0]);\n      } else {\n        throw new Error('You must define either a non empty array, or an associated class to build the table.');\n      }\n    }\n\n    this.checkValidatorFields();\n\n    this.datasourceSubject = new Subject<T[]>();\n    const rows = this.createRowsFromData(data);\n    this.rowsSubject = new BehaviorSubject(rows);\n  }\n\n  protected checkValidatorFields() {\n    if (this._config.suppressErrors) return; // Skip, as error will not be logged\n\n    const validator = this.createRowValidator();\n    if (validator != null) {\n      const rowKeys = Object.keys(this.createNewObject());\n      const invalidKeys = Object.keys(validator.controls).filter((key) => !rowKeys.some((x) => x === key));\n      if (invalidKeys.length > 0) {\n        console.error('Validator form control keys must match row object keys. Invalid keys: ' + invalidKeys.toString());\n      }\n    }\n  }\n\n  /**\n   * Start the creation of a new element, pushing an empty-data row in the table.\n   * @param insertAt\n   * @param options\n   */\n  async createNew(insertAt?: number, options?: { editing?: boolean; originalData?: T; emitEvent?: boolean }): Promise<R | undefined> {\n    if (this.hasNewElement) {\n      if (!this._config.suppressErrors) {\n        console.warn('Cannot add new row, because already has nex row. Please confirm it first');\n      }\n      return; // Cannot add if still have some new element\n    }\n\n    const rows = this.rowsSubject.getValue();\n\n    const currentData = options?.originalData || this.createNewObject();\n    const validator = this.createRowValidator({ editing: options?.editing });\n\n    const editing = options?.editing !== false; // true by default\n    const id = editing ? -1 : this.getRowIdFromIndex(rows.length, rows.length + 1);\n    const newElement = TableElementFactory.createTableElement({\n      id,\n      editing,\n      currentData,\n      validator,\n      // Link to datasource\n      source: this,\n    });\n\n    if (insertAt != null && insertAt >= 0) {\n      rows.splice(insertAt, 0, newElement);\n      this.rowsSubject.next(rows);\n    } else {\n      if (this._config.prependNewElements) {\n        this.rowsSubject.next([newElement].concat(rows));\n      } else {\n        rows.push(newElement);\n        this.rowsSubject.next(rows);\n      }\n    }\n\n    // New row is not confirmed: remember it\n    if (editing) {\n      this._newElement = newElement;\n    }\n\n    // Notify the changes\n    else if (!options || options.emitEvent !== false) {\n      this.datasourceSubject.next(this.getDataFromRows(rows));\n    }\n\n    return newElement;\n  }\n\n  /**\n   * Pushing new data row in the table.\n   * @param originalData data to insert\n   * @param insertAt\n   * @param options\n   */\n  async addMany(originalData: T[], insertAt?: number, options?: { editing?: boolean; emitEvent?: boolean }): Promise<R[] | undefined> {\n    if (this.hasNewElement) {\n      if (!this._config.suppressErrors) {\n        console.warn('Cannot add new row, because already has nex row. Please confirm it first');\n      }\n      return; // Cannot add if still have some new element\n    }\n\n    const editing = options?.editing === true; // false by default\n\n    // Create new rows:\n    // WARNING: ids will be bad. Need to be recomputed (see bellow)\n    const newElements = this.createRowsFromData(originalData, { editing });\n\n    // Retrieve actual rows array\n    let rows = this.rowsSubject.getValue();\n\n    // Insert into rows array\n    if (insertAt != null && insertAt >= 0) {\n      rows.splice(insertAt, 0, ...newElements);\n      const refreshStartIndex = this._config.prependNewElements ? insertAt + newElements.length - 1 : insertAt;\n      this.updateRowIds(refreshStartIndex, rows);\n    } else {\n      if (this._config.prependNewElements) {\n        rows = newElements.concat(...rows);\n        this.updateRowIds(newElements.length, rows);\n      } else {\n        rows = rows.concat(...newElements);\n        this.updateRowIds(rows.length - newElements.length, rows);\n      }\n    }\n\n    this.rowsSubject.next(rows);\n\n    if (editing) {\n      // New rows are still editing: do not emit changes\n    }\n\n    // New rows have been confirmed: notify changes\n    else if (!options || options.emitEvent !== false) {\n      this.updateDatasourceFromRows(this.rowsSubject.getValue());\n    }\n\n    return newElements;\n  }\n\n  confirmEditCreate(row: R, options = { emitEvent: true }): boolean {\n    if (row.id === -1) {\n      return this.confirmCreate(row, options);\n    } else {\n      return this.confirmEdit(row, options);\n    }\n  }\n\n  cancelOrDelete(row: R, options = { emitEvent: true }): boolean {\n    if (row.id === -1 || !row.editing) {\n      return this.delete(row.id, options);\n    } else {\n      return this.cancel(row);\n    }\n  }\n\n  /**\n   * Confirm creation of the row. Save changes and disable editing.\n   * If validation active and row data is invalid, it doesn't confirm creation neither disable editing.\n   * @param row Row to be confirmed.\n   * @param options Use emitEvent=false to avoid 'datasourceSubject' to be updated\n   */\n  confirmCreate(row: R, options = { emitEvent: true }): boolean {\n    const valid = row.isValid();\n    if (!valid) {\n      return false;\n    }\n\n    const source = this.rowsSubject.getValue();\n    row.id = source.length - 1;\n    this._newElement = null;\n    this.rowsSubject.next(source);\n    row.editing = false;\n\n    if (!options || options.emitEvent != false) {\n      this.updateDatasourceFromRows(source);\n    }\n\n    return true;\n  }\n\n  /**\n   * Confirm edition of the row. Save changes and disable editing.\n   * If validation active and row data is invalid, it doesn't confirm editing neither disable editing.\n   * @param row Row to be edited.\n   * @param options Use emitEvent=false to avoid 'datasourceSubject' to be updated\n   */\n  confirmEdit(row: R, options = { emitEvent: true }): boolean {\n    const valid = row.isValid();\n    if (!valid) {\n      return false;\n    }\n\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(row.id, source);\n\n    source[index] = row;\n    this.rowsSubject.next(source);\n\n    // Reset backup data\n    if (!this._config.restoreOriginalDataOnCancel) {\n      row.originalData = undefined;\n    }\n    row.editing = false;\n\n    if (!options || options.emitEvent !== false) {\n      this.updateDatasourceFromRows(source);\n    }\n    return true;\n  }\n\n  startEdit(row: R): boolean {\n    if (row.editing) return true; // Already editing\n\n    // Save the original data, to be able to cancel changes\n    if (!row.originalData || !this._config.restoreOriginalDataOnCancel) {\n      row.originalData = row.cloneData();\n    }\n    row.editing = true;\n    return true;\n  }\n\n  /**\n   * Delete the row with the index specified.\n   */\n  delete(id: number, options = { emitEvent: true }): boolean {\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(id, source);\n\n    source.splice(index, 1);\n    this.updateRowIds(index, source);\n\n    if (id === -1) this._newElement = null; // Forget the new element\n\n    this.rowsSubject.next(source);\n\n    if (id !== -1 && (!options || options.emitEvent !== false)) {\n      this.updateDatasourceFromRows(source);\n    }\n\n    return true;\n  }\n\n  /**\n   * Restore the original data\n   * @param row\n   */\n  cancel(row: R): boolean {\n    if (row.id === -1) throw new Error('Cannot cancel a newly created row. Please use delete() or cancelOrDelete() instead');\n    if (!row.editing) throw new Error('Cannot cancel a not editing row. Please use delete() or cancelOrDelete() instead');\n\n    row.currentData = row.originalData;\n    row.editing = false;\n\n    // Mark row as pristine (if content was restored from original data)\n    if (row.validator && this._config.restoreOriginalDataOnCancel) {\n      row.validator.markAsPristine();\n    }\n\n    return true;\n  }\n\n  /**\n   * Move a row up or down\n   * @param id Id of the row\n   * @param direction Direction: negative value for up, positive value for down\n   */\n  move(id: number, direction: number): boolean {\n    if (!direction) return false;\n\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(id, source);\n\n    moveItemInArray(source, index, index + direction);\n\n    const refreshStartIndex = this._config.prependNewElements ? Math.max(index, index + direction) : Math.min(index, index + direction);\n    this.updateRowIds(refreshStartIndex, source);\n\n    this.rowsSubject.next(source);\n\n    if (id !== -1) {\n      this.updateDatasourceFromRows(source);\n    }\n    return true;\n  }\n\n  async confirmAllRows(options = { emitEvent: true }): Promise<boolean> {\n    return this.confirmRows(this.rowsSubject.getValue(), options);\n  }\n\n  async confirmRows(source: R[], options = { emitEvent: true }): Promise<boolean> {\n    // Get editing rows\n    const editingRows = this.getEditingRows(source);\n    if (editingRows.length === 0) return true; // No row to confirm\n\n    // Try to confirm each rows\n    const confirmResults = editingRows.map((row) =>\n      this.confirmEditCreate(row, { emitEvent: false /* Avoid calling updateDatasourceFromRows() here, to make sure to call it once, just after */ })\n    );\n\n    // Update datasource, if some rows has been confirmed (=changed)\n    const confirmedRowCount = confirmResults.filter((ok) => ok).length;\n    if (confirmedRowCount > 0 && (!options || options.emitEvent !== false)) {\n      this.updateDatasourceFromRows(this.rowsSubject.getValue());\n    }\n\n    // Return if all rows has been confirmed\n    return confirmedRowCount === confirmResults.length;\n  }\n\n  /**\n   * Get row from the table.\n   * @param id Id of the row to retrieve, -1 returns the current new line.\n   */\n  getRow(id: number): R {\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(id, source);\n\n    return index >= 0 && index < source.length ? source[index] : null;\n  }\n\n  /**\n   * Update the datasource with a new array of data. If the array reference\n   * is the same as the previous one, it doesn't trigger an update.\n   * @param data Data to update the table datasource.\n   * @param options Specify options to update the datasource.\n   * If emitEvent is true and the datasource is updated, it emits an event\n   * from 'datasourceSubject' with the updated data. If false, it doesn't\n   * emit an event. True by default.\n   */\n  updateDatasource(data: T[], options = { emitEvent: true }): void {\n    if (this.currentData !== data) {\n      this.currentData = data;\n\n      const rows = this.createRowsFromData(data);\n      this.rowsSubject.next(rows);\n\n      if (!options || options.emitEvent !== false) {\n        this.datasourceSubject.next(data);\n      }\n    }\n  }\n\n  /**\n   * Checks the existence of the a new row (not yet saved).\n   * @param source\n   */\n  protected existsNewElement(source: R[]): boolean {\n    return source.length > 0 && this.getNewRowIndex(source) > -1;\n  }\n\n  /**\n   * Get editing rows\n   */\n  protected getEditingRows(source: R[]): R[] {\n    return source.filter((row) => row.editing);\n  }\n\n  /**\n   * Returns the possible index of the new row depending on the insertion type.\n   * It doesn't imply that the new row is created, that must be checked.\n   * @param source\n   */\n  protected getNewRowIndex(source: R[]): number {\n    return this.getIndexFromRowId(-1, source);\n  }\n\n  /**\n   * Returns the row id from the index specified. It does\n   * not consider if the new row is present or not, assumes\n   * that new row is not present.\n   * @param index Index of the array.\n   * @param count Quantity of elements in the array.\n   */\n  protected getRowIdFromIndex(index: number, count: number): number {\n    if (this._config.prependNewElements) {\n      return count - 1 - index;\n    } else {\n      return index;\n    }\n  }\n\n  /**\n   * Returns the index from the row id specified.\n   * It takes into account if the new row exists or not.\n   * @param id\n   * @param source\n   */\n  protected getIndexFromRowId(id: number, source: R[]): number {\n    return source.findIndex((element) => element.id === id);\n  }\n\n  /**\n   * Update rows ids in the array specified, starting in the specified index\n   * until the start/end of the array, depending on config.prependNewElements\n   * configuration.\n   * @param initialIndex Initial index of source to be updated.\n   * @param source Array that contains the rows to be updated.\n   */\n  protected updateRowIds(initialIndex: number, source: R[]): void {\n    const delta = this._config.prependNewElements ? -1 : 1;\n\n    for (let index = initialIndex; index < source.length && index >= 0; index += delta) {\n      if (source[index].id !== -1) {\n        // DEBUG\n        //const newId = this.getRowIdFromIndex(index, source.length);\n        //console.debug(`Updating row id ${source[index].id} -> ${newId}`);\n        source[index].id = this.getRowIdFromIndex(index, source.length);\n      }\n    }\n  }\n\n  /**\n   * Get the data from the rows.\n   * @param rows Rows to extract the data.\n   */\n  protected getDataFromRows(rows: R[]): T[] {\n    const mapToDataFn = !this._config.restoreOriginalDataOnCancel ? (row) => row.originalData || row.currentData : (row) => row.currentData; // Always return currentData, if orginalData is NOT update at each edition\n    return rows.filter((row) => row.id !== -1).map<T>(mapToDataFn);\n  }\n\n  /**\n   * Update the datasource with the data contained in the specified rows.\n   * @param rows Rows that contains the datasource's new data.\n   */\n  protected updateDatasourceFromRows(rows: R[]): void {\n    this.currentData = this.getDataFromRows(rows);\n    this.datasourceSubject.next(this.currentData);\n  }\n\n  /**\n   * From an array of data, it returns rows containing the original data.\n   * @param arrayData Data from which create the rows.\n   * @param options\n   */\n  protected createRowsFromData(arrayData: T[], options = { editing: false }): R[] {\n    const editing = options.editing === true; // false by default (e.g. when initial data)\n\n    // Create many validators (batch mode)\n    const validators = this.createRowValidators(arrayData.length, { editing });\n\n    return arrayData.map<R>((currentData, index) => {\n      return TableElementFactory.createTableElement({\n        id: this.getRowIdFromIndex(index, arrayData.length),\n        editing,\n        currentData,\n        validator: validators[index],\n        // Link to datasource\n        source: this,\n      });\n    });\n  }\n\n  /**\n   * Create a new object with identical structure than the table source data.\n   * It uses the object's type constructor if available, otherwise it creates\n   * an object with the same keys of the first element contained in the original\n   * datasource (used in the constructor).\n   */\n  protected createNewObject(): T {\n    if (this.dataConstructor) {\n      return new this.dataConstructor();\n    } else {\n      return this.dataKeys.reduce((obj, key) => {\n        obj[key] = undefined;\n        return obj;\n      }, {});\n    }\n  }\n\n  protected createRowValidator(options = { editing: true }): UntypedFormGroup {\n    if (!this.validatorService) return null; // No validators\n\n    const validator = this.validatorService.getRowValidator();\n\n    // Disable if ask\n    if (options.editing === false) {\n      validator.disable();\n    }\n    return validator;\n  }\n\n  /**\n   * Create many validators (batch mode)\n   * @param count\n   * @param options\n   * @protected\n   */\n  protected createRowValidators(count: number, options = { editing: false }): UntypedFormGroup[] {\n    const validators = new Array<UntypedFormGroup>(count);\n\n    if (!this.validatorService) return validators; // No validator\n\n    for (let i = 0; i < count; i++) {\n      validators[i] = this.createRowValidator(options);\n    }\n    return validators;\n  }\n\n  /** Connect function called by the table to retrieve one stream containing\n   *  the data to render. */\n  connect(collectionViewer: CollectionViewer): Observable<R[] | ReadonlyArray<R>> {\n    // No collection viewer: return all data\n    if (!collectionViewer) {\n      return this.rowsSubject.asObservable();\n    }\n\n    const range: ListRange = {\n      start: 0,\n      end: -1,\n    };\n    this.connectedViewers.push({\n      viewer: collectionViewer,\n      range,\n      subscription: collectionViewer.viewChange.subscribe((r) => {\n        range.start = r.start;\n        range.end = r.end;\n      }),\n    });\n    return this.rowsSubject.asObservable().pipe(\n      filter((data) => data !== null && data !== undefined),\n      map((data) => {\n        if (range.start > 0) {\n          if (range.end > range.start) {\n            return data.slice(range.start, range.end);\n          }\n          return data.slice(range.start);\n        }\n        if (range.end < data.length) {\n          return data.slice(0, range.end);\n        }\n        return data;\n      })\n    );\n  }\n\n  disconnect(collectionViewer: CollectionViewer) {\n    if (collectionViewer) {\n      const refIndex = this.connectedViewers.findIndex((r) => r.viewer === collectionViewer);\n      if (refIndex !== -1) {\n        const ref = this.connectedViewers.splice(refIndex, 1)[0];\n        ref.subscription.unsubscribe();\n      }\n    }\n\n    // Destroy observables\n    if (this.connectedViewers.length === 0) {\n      this.rowsSubject.complete();\n      this.datasourceSubject.complete();\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\n\n@Injectable()\nexport abstract class ValidatorService {\n  abstract getRowValidator(): UntypedFormGroup;\n}\n","import { Observable, timer } from 'rxjs';\nimport { AbstractControl } from '@angular/forms';\nimport { filter, first, map, takeUntil } from 'rxjs/operators';\n\nexport function waitWhilePending(form: AbstractControl, opts?: { stop?: Observable<any>; timeout?: number }): Promise<any> {\n  const status$ = form.statusChanges.pipe(\n    filter((status) => status !== 'PENDING'),\n    map((status) => status === 'VALID')\n  );\n  const stop$ = opts?.stop || (opts?.timeout > 0 && timer(opts?.timeout));\n  if (stop$) {\n    return status$.pipe(takeUntil(stop$), first()).toPromise();\n  }\n\n  return status$.pipe(first()).toPromise();\n}\n","import { UntypedFormGroup } from '@angular/forms';\nimport {AsyncTableDataSource, IAsyncTableDataSource} from './async-table-data-source';\nimport {ScrollableTableDataSource} from \"../scrollable/scrollable-table-data-source\";\n\nexport abstract class AsyncTableElement<T> {\n  id: number;\n  originalData?: T;\n  source: IAsyncTableDataSource<T, any>;\n\n  abstract get editing(): boolean;\n  abstract set editing(editing: boolean);\n\n  abstract get currentData(): T;\n  abstract set currentData(currentData: T);\n  abstract cloneData(): T;\n\n  abstract get validator(): UntypedFormGroup;\n  abstract set validator(validator: UntypedFormGroup);\n\n  delete( options = { emitEvent: true }): Promise<boolean> {\n    return this.source.delete(this.id, options);\n  }\n\n  confirmEditCreate(options = { emitEvent: true }): Promise<boolean> {\n    return this.source.confirmEditCreate(this, options);\n  }\n\n  /**\n   * Cancel or delete\n   */\n  cancelOrDelete(options = { emitEvent: true }): Promise<boolean> {\n    return this.source.cancelOrDelete(this, options);\n  }\n\n  cancel(): Promise<boolean> {\n    return this.source.cancel(this);\n  }\n\n  startEdit(): Promise<boolean> {\n    return this.source.startEdit(this);\n  }\n\n  move(direction: number): Promise<boolean> {\n    return this.source.move(this.id, direction);\n  }\n\n  abstract get valid(): boolean;\n\n  abstract get pending(): boolean;\n\n  abstract get invalid(): boolean;\n\n  abstract get dirty(): boolean;\n\n  /**\n   * Check if the row is valid. Use Promise to allow async validator to finish\n   */\n  abstract isValid(): Promise<boolean>;\n}\n","import { UntypedFormGroup } from '@angular/forms';\nimport { waitWhilePending } from '../validator.utils';\nimport { AsyncTableElement } from './async-table-element';\n\nexport class AsyncTableElementReactiveForms<T> extends AsyncTableElement<T> {\n  validator: UntypedFormGroup;\n\n  get currentData(): T {\n    return this.validator.getRawValue();\n  }\n\n  set currentData(data: T) {\n    this.validator.patchValue(data);\n  }\n\n  get editing(): boolean {\n    return this.validator.enabled;\n  }\n\n  set editing(value: boolean) {\n    if (value) {\n      this.validator.enable();\n    } else {\n      this.validator.disable();\n    }\n  }\n\n  get valid(): boolean {\n    return this.validator.valid;\n  }\n\n  get pending(): boolean {\n    return this.validator.pending;\n  }\n\n  get invalid(): boolean {\n    return this.validator.invalid;\n  }\n\n  get dirty(): boolean {\n    return this.validator.dirty;\n  }\n\n  constructor(init: Partial<AsyncTableElementReactiveForms<T>>) {\n    super();\n    this.validator = init.validator;\n    Object.assign(this, init);\n  }\n\n  async isValid(): Promise<boolean> {\n    // Enable temporarily the validator to get the valid status\n    const disabled = this.validator.disabled;\n    if (disabled) {\n      this.validator.enable({ emitEvent: false, onlySelf: true });\n      this.validator.updateValueAndValidity({ emitEvent: false, onlySelf: true });\n    }\n\n    try {\n      if (!this.validator.valid) {\n        // Wait end of async validation\n        if (this.validator.pending) {\n          // DEBUG\n          // console.debug('WAITING validation');\n\n          await waitWhilePending(this.validator);\n        }\n\n        // Quit if really invalid\n        if (this.validator.invalid) {\n          return false;\n        }\n      }\n\n      return true;\n    } finally {\n      // Re-disabled, if need\n      if (disabled) {\n        this.validator.disable({ emitEvent: false, onlySelf: true });\n      }\n    }\n  }\n\n  cloneData(): T {\n    return this.validator.getRawValue();\n  }\n}\n","import { AsyncTableElement } from './async-table-element';\nimport * as cloneImported from 'clone';\nimport { unwrapESModule } from '../modules';\n\nconst clone = unwrapESModule<typeof cloneImported>(cloneImported);\n\nexport class AsyncTableElementTemplateDriven<T> extends AsyncTableElement<T> {\n  _editing: boolean;\n  _currentData: T;\n\n  get validator(): any {\n    return undefined;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  set validator(value: any) {}\n\n  get currentData(): T {\n    return this._currentData;\n  }\n\n  set currentData(data: T) {\n    this._currentData = data;\n  }\n\n  get editing(): boolean {\n    return this._editing;\n  }\n\n  set editing(value: boolean) {\n    this._editing = value;\n  }\n\n  get valid(): boolean {\n    return true;\n  }\n\n  get invalid(): boolean {\n    return false;\n  }\n\n  get pending(): boolean {\n    return false;\n  }\n\n  get dirty(): boolean {\n    return false;\n  }\n\n  constructor(init: Partial<AsyncTableElementTemplateDriven<T>>) {\n    super();\n    Object.assign(this, init);\n  }\n\n  isValid(): Promise<boolean> {\n    return Promise.resolve(true);\n  }\n\n  cloneData(): T {\n    return clone(this._currentData);\n  }\n}\n","import { AsyncTableElementReactiveForms } from './async-table-element-reactive-forms';\nimport { AsyncTableElementTemplateDriven } from './async-table-element-template-driven';\n\nexport class AsyncTableElementFactory {\n  public static createTableElement(newElement: any): any {\n    if (this.isValidatorDefined(newElement)) {\n      // Create reactive forms element here.\n      return new AsyncTableElementReactiveForms(newElement);\n    } else {\n      // Default is the one without validator.\n      return new AsyncTableElementTemplateDriven(newElement);\n    }\n  }\n\n  static isValidatorDefined(newElement: any) {\n    return newElement.validator !== undefined && newElement.validator !== null;\n  }\n}\n","import { CollectionViewer, DataSource, ListRange } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable, Subject, Subscription } from 'rxjs';\nimport { AsyncTableElementFactory } from './async-table-element.factory';\nimport { ValidatorService } from '../validator.service';\nimport { filter, map } from 'rxjs/operators';\nimport { moveItemInArray } from '@angular/cdk/drag-drop';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { TableDataSourceConfig } from '../table-data-source';\nimport { AsyncTableElement } from './async-table-element';\n\nexport interface IAsyncTableDataSource<T, R extends AsyncTableElement<T>> extends DataSource<R> {\n  delete(id: number, options?: { emitEvent: boolean }): Promise<boolean>;\n  confirmEditCreate(row: R, options?: { emitEvent: boolean }): Promise<boolean>;\n  cancelOrDelete(row: R, options?: { emitEvent: boolean }): Promise<boolean>;\n  cancel(row: R): Promise<boolean>;\n  startEdit(row: R): Promise<boolean>;\n  move(id: number, direction: number): Promise<boolean>;\n}\n\nexport class AsyncTableDataSource<\n  T,\n  V extends ValidatorService = ValidatorService,\n  C extends TableDataSourceConfig = TableDataSourceConfig,\n  R extends AsyncTableElement<T> = AsyncTableElement<T>,\n> extends DataSource<R> implements IAsyncTableDataSource<T, R> {\n  /**\n   * Return the data array, of confirmed rows (currentData)\n   */\n  datasourceSubject: Subject<T[]>;\n\n  /**\n   * Return all existing rows. Please use connect() instead\n   */\n  rowsSubject: BehaviorSubject<R[]>;\n\n  protected dataConstructor: new () => T;\n  protected dataKeys: any[];\n  protected connectedViewers: {\n    viewer: CollectionViewer;\n    subscription: Subscription;\n    range: ListRange;\n  }[] = [];\n  protected currentData: any;\n  private readonly _config: C;\n  private _newElement: R = null;\n\n  get config(): C {\n    return this._config;\n  }\n\n  /**\n   * Say if there is a new (and not confirmed) row\n   */\n  get hasNewElement(): boolean {\n    return !!this._newElement;\n  }\n\n  /**\n   * Creates a new TableDataSource instance, that can be used as datasource of `@angular/cdk` data-table.\n   * @param data Array containing the initial values for the TableDataSource. If not specified, then `dataType` must be specified.\n   * @param dataType Type of data contained by the Table. If not specified, then `data` with at least one element must be specified.\n   * @param validatorService Service that create instances of the UntypedFormGroup used to validate row fields.\n   * @param config Additional configuration for table.\n   */\n  constructor(\n    data: T[],\n    dataType?: new () => T,\n    protected validatorService?: V,\n    config?: C\n  ) {\n    super();\n\n    this._config = {\n      prependNewElements: false,\n      suppressErrors: false,\n      restoreOriginalDataOnCancel: false,\n      ...config,\n    };\n\n    if (dataType) {\n      this.dataConstructor = dataType;\n    } else {\n      if (data && data.length > 0) {\n        this.dataKeys = Object.keys(data[0]);\n      } else {\n        throw new Error('You must define either a non empty array, or an associated class to build the table.');\n      }\n    }\n\n    this.checkValidatorFields();\n\n    this.datasourceSubject = new Subject<T[]>();\n    const rows = this.createRowsFromData(data);\n    this.rowsSubject = new BehaviorSubject(rows);\n  }\n\n  protected checkValidatorFields() {\n    if (this._config.suppressErrors) return; // Skip, as error will not be logged\n\n    const formGroup = this.createRowValidator();\n    if (formGroup != null) {\n      const rowKeys = Object.keys(this.createNewObject());\n      const invalidKeys = Object.keys(formGroup.controls).filter((key) => !rowKeys.some((x) => x === key));\n      if (invalidKeys.length > 0) {\n        console.error('Validator form control keys must match row object keys. Invalid keys: ' + invalidKeys.toString());\n      }\n    }\n  }\n\n  /**\n   * Start the creation of a new element, pushing an empty-data row in the table.\n   * @param insertAt\n   * @param options\n   */\n  async createNew(insertAt?: number, options?: { editing?: boolean; originalData?: T; emitEvent?: boolean }): Promise<R | undefined> {\n    if (this.hasNewElement) {\n      if (!this._config.suppressErrors) {\n        console.warn('Cannot add new row, because already has nex row. Please confirm it first');\n      }\n      return; // Cannot add if still have some new element\n    }\n\n    const rows = this.rowsSubject.getValue();\n\n    const currentData = options?.originalData || this.createNewObject();\n    const validator = this.createRowValidator({ editing: options?.editing });\n\n    const editing = options?.editing !== false; // true by default\n    const id = editing ? -1 : this.getRowIdFromIndex(rows.length, rows.length + 1);\n    const newElement = AsyncTableElementFactory.createTableElement({\n      id,\n      editing,\n      currentData,\n      validator,\n      // Link to datasource\n      source: this,\n    });\n\n    if (insertAt != null && insertAt >= 0) {\n      rows.splice(insertAt, 0, newElement);\n      this.rowsSubject.next(rows);\n    } else {\n      if (this._config.prependNewElements) {\n        this.rowsSubject.next([newElement].concat(rows));\n      } else {\n        rows.push(newElement);\n        this.rowsSubject.next(rows);\n      }\n    }\n\n    // New row is not confirmed: remember it\n    if (editing) {\n      this._newElement = newElement;\n    }\n\n    // Notify the changes\n    else if (!options || options.emitEvent !== false) {\n      this.datasourceSubject.next(this.getDataFromRows(rows));\n    }\n\n    return newElement;\n  }\n\n  /**\n   * Pushing new data row in the table.\n   * @param originalData data to insert\n   * @param insertAt\n   * @param options\n   */\n  async addMany(originalData: T[], insertAt?: number, options?: { editing?: boolean; emitEvent?: boolean }): Promise<R[] | undefined> {\n    if (this.hasNewElement) {\n      if (!this._config.suppressErrors) {\n        console.warn('Cannot add new row, because already has nex row. Please confirm it first');\n      }\n      return; // Cannot add if still have some new element\n    }\n\n    const editing = options?.editing === true; // false by default\n\n    // Create new rows:\n    // WARNING: ids will be bad. Need to be recomputed (see bellow)\n    const newElements = this.createRowsFromData(originalData, { editing });\n\n    // Retrieve actual rows array\n    let rows = this.rowsSubject.getValue();\n\n    // Insert into rows array\n    if (insertAt != null && insertAt >= 0) {\n      rows.splice(insertAt, 0, ...newElements);\n      const refreshStartIndex = this._config.prependNewElements ? insertAt + newElements.length - 1 : insertAt;\n      this.updateRowIds(refreshStartIndex, rows);\n    } else {\n      if (this._config.prependNewElements) {\n        rows = newElements.concat(...rows);\n        this.updateRowIds(newElements.length, rows);\n      } else {\n        rows = rows.concat(...newElements);\n        this.updateRowIds(rows.length - newElements.length, rows);\n      }\n    }\n\n    this.rowsSubject.next(rows);\n\n    if (editing) {\n      // New rows are still editing: do not emit changes\n    }\n\n    // New rows have been confirmed: notify changes\n    else if (!options || options.emitEvent !== false) {\n      this.updateDatasourceFromRows(this.rowsSubject.getValue());\n    }\n\n    return newElements;\n  }\n\n  confirmEditCreate(row: R, options = { emitEvent: true }): Promise<boolean> {\n    if (row.id === -1) {\n      return this.confirmCreate(row, options);\n    } else {\n      return this.confirmEdit(row, options);\n    }\n  }\n\n  cancelOrDelete(row: R, options = { emitEvent: true }): Promise<boolean> {\n    if (row.id === -1 || !row.editing) {\n      return this.delete(row.id, options);\n    } else {\n      return this.cancel(row);\n    }\n  }\n\n  /**\n   * Confirm creation of the row. Save changes and disable editing.\n   * If validation active and row data is invalid, it doesn't confirm creation neither disable editing.\n   * @param row Row to be confirmed.\n   * @param options Use emitEvent=false to avoid 'datasourceSubject' to be updated\n   */\n  async confirmCreate(row: R, options = { emitEvent: true }): Promise<boolean> {\n    const valid = await row.isValid();\n    if (valid !== true) {\n      return false;\n    }\n\n    const source = this.rowsSubject.getValue();\n    row.id = source.length - 1;\n    this._newElement = null;\n    this.rowsSubject.next(source);\n    row.editing = false;\n\n    if (!options || options.emitEvent != false) {\n      this.updateDatasourceFromRows(source);\n    }\n\n    return true;\n  }\n\n  /**\n   * Confirm edition of the row. Save changes and disable editing.\n   * If validation active and row data is invalid, it doesn't confirm editing neither disable editing.\n   * @param row Row to be edited.\n   * @param options Use emitEvent=false to avoid 'datasourceSubject' to be updated\n   */\n  async confirmEdit(row: R, options = { emitEvent: true }): Promise<boolean> {\n    const valid = await row.isValid();\n    if (valid !== true) {\n      return false;\n    }\n\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(row.id, source);\n\n    source[index] = row;\n    this.rowsSubject.next(source);\n\n    // Reset backup data\n    if (!this._config.restoreOriginalDataOnCancel) {\n      row.originalData = undefined;\n    }\n    row.editing = false;\n\n    if (!options || options.emitEvent !== false) {\n      this.updateDatasourceFromRows(source);\n    }\n    return true;\n  }\n\n  async startEdit(row: R): Promise<boolean> {\n    if (row.editing) return true; // Already editing\n\n    // Save the original data, to be able to cancel changes\n    if (!row.originalData || !this._config.restoreOriginalDataOnCancel) {\n      row.originalData = row.cloneData();\n    }\n    row.editing = true;\n    return true;\n  }\n\n  /**\n   * Delete the row with the index specified.\n   */\n  async delete(id: number, options = { emitEvent: true }): Promise<boolean> {\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(id, source);\n\n    source.splice(index, 1);\n    this.updateRowIds(index, source);\n\n    if (id === -1) this._newElement = null; // Forget the new element\n\n    this.rowsSubject.next(source);\n\n    if (id !== -1 && (!options || options.emitEvent !== false)) {\n      this.updateDatasourceFromRows(source);\n    }\n\n    return true;\n  }\n\n  /**\n   * Restore the original data\n   * @param row\n   */\n  async cancel(row: R): Promise<boolean> {\n    if (row.id === -1) throw new Error('Cannot cancel a newly created row. Please use delete() or cancelOrDelete() instead');\n    if (!row.editing) throw new Error('Cannot cancel a not editing row. Please use delete() or cancelOrDelete() instead');\n\n    row.currentData = row.originalData;\n    row.editing = false;\n\n    // Mark row as pristine (if content was restored from original data)\n    if (row.validator && this._config.restoreOriginalDataOnCancel) {\n      row.validator.markAsPristine();\n    }\n\n    return true;\n  }\n\n  /**\n   * Move a row up or down\n   * @param id Id of the row\n   * @param direction Direction: negative value for up, positive value for down\n   */\n  async move(id: number, direction: number): Promise<boolean> {\n    if (!direction) return false;\n\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(id, source);\n\n    moveItemInArray(source, index, index + direction);\n\n    const refreshStartIndex = this._config.prependNewElements ? Math.max(index, index + direction) : Math.min(index, index + direction);\n    this.updateRowIds(refreshStartIndex, source);\n\n    this.rowsSubject.next(source);\n\n    if (id !== -1) {\n      this.updateDatasourceFromRows(source);\n    }\n    return true;\n  }\n\n  async confirmAllRows(options = { emitEvent: true }): Promise<boolean> {\n    return this.confirmRows(this.rowsSubject.getValue(), options);\n  }\n\n  async confirmRows(source: R[], options = { emitEvent: true }): Promise<boolean> {\n    // Get editing rows\n    const editingRows = this.getEditingRows(source);\n    if (editingRows.length === 0) return true; // No row to confirm\n\n    // Try to confirm each rows\n    const confirmResults = await Promise.all(\n      editingRows.map((row) =>\n        this.confirmEditCreate(row, { emitEvent: false /* Avoid calling updateDatasourceFromRows() here, to make sure to call it once, just after*/ })\n      )\n    );\n\n    // Update datasource, if some rows has been confirmed (=changed)\n    const confirmedRowCount = confirmResults.filter((ok) => ok).length;\n    if (confirmedRowCount > 0 && (!options || options.emitEvent !== false)) {\n      this.updateDatasourceFromRows(this.rowsSubject.getValue());\n    }\n\n    // Return if all rows has been confirmed\n    return confirmedRowCount === confirmResults.length;\n  }\n\n  /**\n   * Get row from the table.\n   * @param id Id of the row to retrieve, -1 returns the current new line.\n   */\n  getRow(id: number): R {\n    const source = this.rowsSubject.getValue();\n    const index = this.getIndexFromRowId(id, source);\n\n    return index >= 0 && index < source.length ? source[index] : null;\n  }\n\n  /**\n   * Update the datasource with a new array of data. If the array reference\n   * is the same as the previous one, it doesn't trigger an update.\n   * @param data Data to update the table datasource.\n   * @param options Specify options to update the datasource.\n   * If emitEvent is true and the datasource is updated, it emits an event\n   * from 'datasourceSubject' with the updated data. If false, it doesn't\n   * emit an event. True by default.\n   */\n  updateDatasource(data: T[], options = { emitEvent: true }): void {\n    if (this.currentData !== data) {\n      this.currentData = data;\n\n      const rows = this.createRowsFromData(data);\n      this.rowsSubject.next(rows);\n\n      if (!options || options.emitEvent !== false) {\n        this.datasourceSubject.next(data);\n      }\n    }\n  }\n\n  /**\n   * Checks the existence of the a new row (not yet saved).\n   * @param source\n   */\n  protected existsNewElement(source: R[]): boolean {\n    return source.length > 0 && this.getNewRowIndex(source) > -1;\n  }\n\n  /**\n   * Get editing rows\n   */\n  protected getEditingRows(source: R[]): R[] {\n    return source.filter((row) => row.editing);\n  }\n\n  /**\n   * Returns the possible index of the new row depending on the insertion type.\n   * It doesn't imply that the new row is created, that must be checked.\n   * @param source\n   */\n  protected getNewRowIndex(source: R[]): number {\n    return this.getIndexFromRowId(-1, source);\n  }\n\n  /**\n   * Returns the row id from the index specified. It does\n   * not consider if the new row is present or not, assumes\n   * that new row is not present.\n   * @param index Index of the array.\n   * @param count Quantity of elements in the array.\n   */\n  protected getRowIdFromIndex(index: number, count: number): number {\n    if (this._config.prependNewElements) {\n      return count - 1 - index;\n    } else {\n      return index;\n    }\n  }\n\n  /**\n   * Returns the index from the row id specified.\n   * It takes into account if the new row exists or not.\n   * @param id\n   * @param source\n   */\n  protected getIndexFromRowId(id: number, source: R[]): number {\n    return source.findIndex((element) => element.id === id);\n  }\n\n  /**\n   * Update rows ids in the array specified, starting in the specified index\n   * until the start/end of the array, depending on config.prependNewElements\n   * configuration.\n   * @param initialIndex Initial index of source to be updated.\n   * @param source Array that contains the rows to be updated.\n   */\n  protected updateRowIds(initialIndex: number, source: R[]): void {\n    const delta = this._config.prependNewElements ? -1 : 1;\n\n    for (let index = initialIndex; index < source.length && index >= 0; index += delta) {\n      if (source[index].id !== -1) {\n        // DEBUG\n        //const newId = this.getRowIdFromIndex(index, source.length);\n        //console.debug(`Updating row id ${source[index].id} -> ${newId}`);\n        source[index].id = this.getRowIdFromIndex(index, source.length);\n      }\n    }\n  }\n\n  /**\n   * Get the data from the rows.\n   * @param rows Rows to extract the data.\n   */\n  protected getDataFromRows(rows: R[]): T[] {\n    const mapToDataFn = !this._config.restoreOriginalDataOnCancel ? (row) => row.originalData || row.currentData : (row) => row.currentData; // Always return currentData, if orginalData is NOT update at each edition\n    return rows.filter((row) => row.id !== -1).map<T>(mapToDataFn);\n  }\n\n  /**\n   * Update the datasource with the data contained in the specified rows.\n   * @param rows Rows that contains the datasource's new data.\n   */\n  protected updateDatasourceFromRows(rows: R[]): void {\n    this.currentData = this.getDataFromRows(rows);\n    this.datasourceSubject.next(this.currentData);\n  }\n\n  /**\n   * From an array of data, it returns rows containing the original data.\n   * @param arrayData Data from which create the rows.\n   * @param options\n   */\n  protected createRowsFromData(arrayData: T[], options = { editing: false }): R[] {\n    const editing = options.editing === true; // false by default (e.g. when initial data)\n\n    // Create many validators (batch mode)\n    const validators = this.createRowValidators(arrayData.length);\n\n    return arrayData.map<R>((currentData, index) => {\n      return AsyncTableElementFactory.createTableElement({\n        id: this.getRowIdFromIndex(index, arrayData.length),\n        editing,\n        currentData,\n        validator: validators[index],\n        // Link to datasource\n        source: this,\n      });\n    });\n  }\n\n  /**\n   * Create a new object with identical structure than the table source data.\n   * It uses the object's type constructor if available, otherwise it creates\n   * an object with the same keys of the first element contained in the original\n   * datasource (used in the constructor).\n   */\n  protected createNewObject(): T {\n    if (this.dataConstructor) {\n      return new this.dataConstructor();\n    } else {\n      return this.dataKeys.reduce((obj, key) => {\n        obj[key] = undefined;\n        return obj;\n      }, {});\n    }\n  }\n\n  protected createRowValidator(options = { editing: true }): UntypedFormGroup {\n    if (!this.validatorService) return null;\n    const validator = this.validatorService.getRowValidator();\n\n    // Disable if ask\n    if (options.editing === false && validator.enabled) {\n      validator.disable();\n    }\n    return validator;\n  }\n\n  /**\n   * Create many validators (batch mode)\n   * @param count\n   * @param options\n   * @protected\n   */\n  protected createRowValidators(count: number, options = { editing: false }): UntypedFormGroup[] {\n    const validators = new Array<UntypedFormGroup>(count);\n    for (let i = 0; i < count; i++) {\n      validators[i] = this.createRowValidator(options);\n    }\n    return validators;\n  }\n\n  /** Connect function called by the table to retrieve one stream containing\n   *  the data to render. */\n  connect(collectionViewer: CollectionViewer): Observable<R[] | ReadonlyArray<R>> {\n    // No collection viewer: return all data\n    if (!collectionViewer) {\n      return this.rowsSubject.asObservable();\n    }\n\n    const range: ListRange = {\n      start: 0,\n      end: -1,\n    };\n    this.connectedViewers.push({\n      viewer: collectionViewer,\n      range,\n      subscription: collectionViewer.viewChange.subscribe((r) => {\n        range.start = r.start;\n        range.end = r.end;\n      }),\n    });\n    return this.rowsSubject.asObservable().pipe(\n      filter((data) => data !== null && data !== undefined),\n      map((data) => {\n        if (range.start > 0) {\n          if (range.end > range.start) {\n            return data.slice(range.start, range.end);\n          }\n          return data.slice(range.start);\n        }\n        if (range.end < data.length) {\n          return data.slice(0, range.end);\n        }\n        return data;\n      })\n    );\n  }\n\n  disconnect(collectionViewer: CollectionViewer) {\n    if (collectionViewer) {\n      const refIndex = this.connectedViewers.findIndex((r) => r.viewer === collectionViewer);\n      if (refIndex !== -1) {\n        const ref = this.connectedViewers.splice(refIndex, 1)[0];\n        ref.subscription.unsubscribe();\n      }\n    }\n\n    // Destroy observables\n    if (this.connectedViewers.length === 0) {\n      this.rowsSubject.complete();\n      this.datasourceSubject.complete();\n    }\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["clone"],"mappings":";;;;;;;;MAIsB,YAAY,CAAA;AAChC,IAAA,EAAE;AACF,IAAA,YAAY;AACZ,IAAA,MAAM;AAYN,IAAA,MAAM,CAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACnC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;;AAG7C,IAAA,iBAAiB,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC;;AAGrD;;AAEG;AACH,IAAA,cAAc,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;;IAGlD,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;IAGjC,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;;AAGpC,IAAA,IAAI,CAAC,SAAiB,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC;;AAe9C;;ACvDK,MAAO,yBAA6B,SAAQ,YAAe,CAAA;AAC/D,IAAA,SAAS;AAET,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;IAGrC,IAAI,WAAW,CAAC,IAAO,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;;AAGjC,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;;IAG/B,IAAI,OAAO,CAAC,KAAc,EAAA;QACxB,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;;aAClB;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;;;AAI5B,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK;;AAG7B,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;;AAG/B,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;;AAG/B,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK;;AAG7B,IAAA,WAAA,CAAY,IAA2C,EAAA;AACrD,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAC/B,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;;IAG3B,OAAO,GAAA;;AAEL,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ;QACxC,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC3D,YAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG7E,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;;;;;;AAQzB,gBAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AAC1B,oBAAA,OAAO,KAAK;;;AAIhB,YAAA,OAAO,IAAI;;gBACH;;YAER,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;;IAKlE,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;AAEtC;;AClFK,SAAU,UAAU,CAAI,KAAc,EAAA;AAC1C,IAAA,OAAO,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;AACpE;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAU,cAAuB,EAAA;AAC7D,IAAA,OAAO,UAAU,CAAI,cAAc,CAAC,GAAG,cAAc,CAAC,OAAO,GAAI,cAAoB;AACvF;;ACNA,MAAMA,OAAK,GAAG,cAAc,CAAuB,aAAa,CAAC;AAE3D,MAAO,0BAA8B,SAAQ,YAAe,CAAA;AAChE,IAAA,QAAQ;AACR,IAAA,YAAY;AAEZ,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,SAAS;;;AAIlB,IAAA,IAAI,SAAS,CAAC,KAAU,EAAA;AAExB,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;;IAG1B,IAAI,WAAW,CAAC,IAAO,EAAA;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;AAG1B,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;;IAGtB,IAAI,OAAO,CAAC,KAAc,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;;AAGvB,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI;;AAGb,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,KAAK;;AAGd,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,KAAK;;AAGd,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,KAAK;;AAGd,IAAA,WAAA,CAAY,IAA4C,EAAA;AACtD,QAAA,KAAK,EAAE;AACP,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;;IAG3B,OAAO,GAAA;AACL,QAAA,OAAO,IAAI;;IAGb,SAAS,GAAA;AACP,QAAA,OAAOA,OAAK,CAAC,IAAI,CAAC,YAAY,CAAC;;AAElC;;MC1DY,mBAAmB,CAAA;IACvB,OAAO,kBAAkB,CAAC,UAAe,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE;;AAEvC,YAAA,OAAO,IAAI,yBAAyB,CAAC,UAAU,CAAC;;aAC3C;;AAEL,YAAA,OAAO,IAAI,0BAA0B,CAAC,UAAU,CAAC;;;IAIrD,OAAO,kBAAkB,CAAC,UAAe,EAAA;QACvC,OAAO,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,KAAK,IAAI;;AAE7E;;ACIK,MAAO,eAKX,SAAQ,UAAa,CAAA;AA2CT,IAAA,gBAAA;AA1CZ;;AAEG;AACH,IAAA,iBAAiB;AAEjB;;AAEG;AACH,IAAA,WAAW;AAED,IAAA,eAAe;AACf,IAAA,QAAQ;IACR,gBAAgB,GAIpB,EAAE;AACE,IAAA,WAAW;AACJ,IAAA,OAAO;IAChB,WAAW,GAAM,IAAI;AAE7B,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;;AAGrB;;AAEG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW;;AAG3B;;;;;;AAMG;AACH,IAAA,WAAA,CACE,IAAS,EACT,QAAsB,EACZ,gBAAoB,EAC9B,MAAU,EAAA;AAEV,QAAA,KAAK,EAAE;QAHG,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAK1B,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,2BAA2B,EAAE,KAAK;AAClC,YAAA,GAAG,MAAM;SACV;QAED,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;;aAC1B;YACL,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,gBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;iBAC/B;AACL,gBAAA,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC;;;QAI3G,IAAI,CAAC,oBAAoB,EAAE;AAE3B,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,OAAO,EAAO;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC;;IAGpC,oBAAoB,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc;AAAE,YAAA,OAAO;AAExC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC3C,QAAA,IAAI,SAAS,IAAI,IAAI,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AACnD,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACpG,YAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,wEAAwE,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;;;;AAKtH;;;;AAIG;AACH,IAAA,MAAM,SAAS,CAAC,QAAiB,EAAE,OAAsE,EAAA;AACvG,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;AAChC,gBAAA,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;;AAE1F,YAAA,OAAO;;QAGT,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAExC,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE;AACnE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAExE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC;QAC3C,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9E,QAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC;YACxD,EAAE;YACF,OAAO;YACP,WAAW;YACX,SAAS;;AAET,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;QAEF,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,CAAC;AACpC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;aACtB;AACL,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;AACnC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;iBAC3C;AACL,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACrB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;;;QAK/B,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU;;;aAI1B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AAChD,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;;AAGzD,QAAA,OAAO,UAAU;;AAGnB;;;;;AAKG;AACH,IAAA,MAAM,OAAO,CAAC,YAAiB,EAAE,QAAiB,EAAE,OAAoD,EAAA;AACtG,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;AAChC,gBAAA,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;;AAE1F,YAAA,OAAO;;QAGT,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;;;AAI1C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC;;QAGtE,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;;QAGtC,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;YACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ;AACxG,YAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC;;aACrC;AACL,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;gBACnC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;gBAClC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;;iBACtC;gBACL,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;AAClC,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;;;AAI7D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAE3B,IAAI,OAAO,EAAE;;;;aAKR,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;YAChD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;;AAG5D,QAAA,OAAO,WAAW;;IAGpB,iBAAiB,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACrD,QAAA,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;YACjB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC;;aAClC;YACL,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;;;IAIzC,cAAc,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AAClD,QAAA,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YACjC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC;;aAC9B;AACL,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;;;AAI3B;;;;;AAKG;IACH,aAAa,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACjD,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE;QAC3B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;;QAGd,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7B,QAAA,GAAG,CAAC,OAAO,GAAG,KAAK;QAEnB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE;AAC1C,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAGvC,QAAA,OAAO,IAAI;;AAGb;;;;;AAKG;IACH,WAAW,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AAC/C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE;QAC3B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;;QAGd,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;AAEpD,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG7B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;AAC7C,YAAA,GAAG,CAAC,YAAY,GAAG,SAAS;;AAE9B,QAAA,GAAG,CAAC,OAAO,GAAG,KAAK;QAEnB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AAC3C,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAEvC,QAAA,OAAO,IAAI;;AAGb,IAAA,SAAS,CAAC,GAAM,EAAA;QACd,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;;AAG7B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;AAClE,YAAA,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,SAAS,EAAE;;AAEpC,QAAA,GAAG,CAAC,OAAO,GAAG,IAAI;AAClB,QAAA,OAAO,IAAI;;AAGb;;AAEG;IACH,MAAM,CAAC,EAAU,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC;AAEhD,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;QAEhC,IAAI,EAAE,KAAK,CAAC,CAAC;AAAE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAEvC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAE7B,QAAA,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE;AAC1D,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAGvC,QAAA,OAAO,IAAI;;AAGb;;;AAGG;AACH,IAAA,MAAM,CAAC,GAAM,EAAA;AACX,QAAA,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC;QACxH,IAAI,CAAC,GAAG,CAAC,OAAO;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC;AAErH,QAAA,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,YAAY;AAClC,QAAA,GAAG,CAAC,OAAO,GAAG,KAAK;;QAGnB,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;AAC7D,YAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE;;AAGhC,QAAA,OAAO,IAAI;;AAGb;;;;AAIG;IACH,IAAI,CAAC,EAAU,EAAE,SAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,KAAK;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC;QAEhD,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;AAEjD,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;AACnI,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAE5C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAE7B,QAAA,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;AACb,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAEvC,QAAA,OAAO,IAAI;;IAGb,MAAM,cAAc,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;;IAG/D,MAAM,WAAW,CAAC,MAAW,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;;QAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC/C,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;;QAG1C,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,KACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,gGAAgG,CAAC,CAChJ;;AAGD,QAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM;AAClE,QAAA,IAAI,iBAAiB,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE;YACtE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;;;AAI5D,QAAA,OAAO,iBAAiB,KAAK,cAAc,CAAC,MAAM;;AAGpD;;;AAGG;AACH,IAAA,MAAM,CAAC,EAAU,EAAA;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC;QAEhD,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI;;AAGnE;;;;;;;;AAQG;IACH,gBAAgB,CAAC,IAAS,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAE3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AAC3C,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;AAKvC;;;AAGG;AACO,IAAA,gBAAgB,CAAC,MAAW,EAAA;AACpC,QAAA,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;AAG9D;;AAEG;AACO,IAAA,cAAc,CAAC,MAAW,EAAA;AAClC,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,CAAC;;AAG5C;;;;AAIG;AACO,IAAA,cAAc,CAAC,MAAW,EAAA;QAClC,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;;AAG3C;;;;;;AAMG;IACO,iBAAiB,CAAC,KAAa,EAAE,KAAa,EAAA;AACtD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;AACnC,YAAA,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK;;aACnB;AACL,YAAA,OAAO,KAAK;;;AAIhB;;;;;AAKG;IACO,iBAAiB,CAAC,EAAU,EAAE,MAAW,EAAA;AACjD,QAAA,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;;AAGzD;;;;;;AAMG;IACO,YAAY,CAAC,YAAoB,EAAE,MAAW,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,CAAC,CAAC,GAAG,CAAC;AAEtD,QAAA,KAAK,IAAI,KAAK,GAAG,YAAY,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,KAAK,EAAE;YAClF,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;;;;AAI3B,gBAAA,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;;;;AAKrE;;;AAGG;AACO,IAAA,eAAe,CAAC,IAAS,EAAA;AACjC,QAAA,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,CAAC;QACxI,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAI,WAAW,CAAC;;AAGhE;;;AAGG;AACO,IAAA,wBAAwB,CAAC,IAAS,EAAA;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC7C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;;AAG/C;;;;AAIG;IACO,kBAAkB,CAAC,SAAc,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAA;QACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;;AAGzC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC;QAE1E,OAAO,SAAS,CAAC,GAAG,CAAI,CAAC,WAAW,EAAE,KAAK,KAAI;YAC7C,OAAO,mBAAmB,CAAC,kBAAkB,CAAC;gBAC5C,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;gBACnD,OAAO;gBACP,WAAW;AACX,gBAAA,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC;;AAE5B,gBAAA,MAAM,EAAE,IAAI;AACb,aAAA,CAAC;AACJ,SAAC,CAAC;;AAGJ;;;;;AAKG;IACO,eAAe,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE;;aAC5B;YACL,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AACvC,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS;AACpB,gBAAA,OAAO,GAAG;aACX,EAAE,EAAE,CAAC;;;AAIA,IAAA,kBAAkB,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAA;QACtD,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QAExC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE;;AAGzD,QAAA,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;YAC7B,SAAS,CAAC,OAAO,EAAE;;AAErB,QAAA,OAAO,SAAS;;AAGlB;;;;;AAKG;IACO,mBAAmB,CAAC,KAAa,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAA;AACvE,QAAA,MAAM,UAAU,GAAG,IAAI,KAAK,CAAmB,KAAK,CAAC;QAErD,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,UAAU,CAAC;AAE9C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;;AAElD,QAAA,OAAO,UAAU;;AAGnB;AAC0B;AAC1B,IAAA,OAAO,CAAC,gBAAkC,EAAA;;QAExC,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;;AAGxC,QAAA,MAAM,KAAK,GAAc;AACvB,YAAA,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,CAAC,CAAC;SACR;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,MAAM,EAAE,gBAAgB;YACxB,KAAK;YACL,YAAY,EAAE,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AACxD,gBAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AACrB,gBAAA,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;AACnB,aAAC,CAAC;AACH,SAAA,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,IAAI,CACzC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,EACrD,GAAG,CAAC,CAAC,IAAI,KAAI;AACX,YAAA,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE;gBACnB,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE;AAC3B,oBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;;gBAE3C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;;YAEhC,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;gBAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC;;AAEjC,YAAA,OAAO,IAAI;SACZ,CAAC,CACH;;AAGH,IAAA,UAAU,CAAC,gBAAkC,EAAA;QAC3C,IAAI,gBAAgB,EAAE;AACpB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC;AACtF,YAAA,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;AACnB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,gBAAA,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE;;;;QAKlC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;;;AAGtC;;MChnBqB,gBAAgB,CAAA;wGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBADrC;;;ACCe,SAAA,gBAAgB,CAAC,IAAqB,EAAE,IAAmD,EAAA;AACzG,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CACrC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC,EACxC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,OAAO,CAAC,CACpC;IACD,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvE,IAAI,KAAK,EAAE;AACT,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE;;IAG5D,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE;AAC1C;;MCXsB,iBAAiB,CAAA;AACrC,IAAA,EAAE;AACF,IAAA,YAAY;AACZ,IAAA,MAAM;AAYN,IAAA,MAAM,CAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACnC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;;AAG7C,IAAA,iBAAiB,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC;;AAGrD;;AAEG;AACH,IAAA,cAAc,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;;IAGlD,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;IAGjC,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;;AAGpC,IAAA,IAAI,CAAC,SAAiB,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC;;AAe9C;;ACtDK,MAAO,8BAAkC,SAAQ,iBAAoB,CAAA;AACzE,IAAA,SAAS;AAET,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;IAGrC,IAAI,WAAW,CAAC,IAAO,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;;AAGjC,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;;IAG/B,IAAI,OAAO,CAAC,KAAc,EAAA;QACxB,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;;aAClB;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;;;AAI5B,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK;;AAG7B,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;;AAG/B,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;;AAG/B,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK;;AAG7B,IAAA,WAAA,CAAY,IAAgD,EAAA;AAC1D,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAC/B,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;;AAG3B,IAAA,MAAM,OAAO,GAAA;;AAEX,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ;QACxC,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC3D,YAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG7E,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;AAEzB,gBAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;;;AAI1B,oBAAA,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;;;AAIxC,gBAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AAC1B,oBAAA,OAAO,KAAK;;;AAIhB,YAAA,OAAO,IAAI;;gBACH;;YAER,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;;IAKlE,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;AAEtC;;ACjFD,MAAM,KAAK,GAAG,cAAc,CAAuB,aAAa,CAAC;AAE3D,MAAO,+BAAmC,SAAQ,iBAAoB,CAAA;AAC1E,IAAA,QAAQ;AACR,IAAA,YAAY;AAEZ,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,SAAS;;;AAIlB,IAAA,IAAI,SAAS,CAAC,KAAU,EAAA;AAExB,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;;IAG1B,IAAI,WAAW,CAAC,IAAO,EAAA;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;AAG1B,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;;IAGtB,IAAI,OAAO,CAAC,KAAc,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;;AAGvB,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI;;AAGb,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,KAAK;;AAGd,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,KAAK;;AAGd,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,KAAK;;AAGd,IAAA,WAAA,CAAY,IAAiD,EAAA;AAC3D,QAAA,KAAK,EAAE;AACP,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;;IAG3B,OAAO,GAAA;AACL,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;;IAG9B,SAAS,GAAA;AACP,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;;AAElC;;MC1DY,wBAAwB,CAAA;IAC5B,OAAO,kBAAkB,CAAC,UAAe,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE;;AAEvC,YAAA,OAAO,IAAI,8BAA8B,CAAC,UAAU,CAAC;;aAChD;;AAEL,YAAA,OAAO,IAAI,+BAA+B,CAAC,UAAU,CAAC;;;IAI1D,OAAO,kBAAkB,CAAC,UAAe,EAAA;QACvC,OAAO,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,KAAK,IAAI;;AAE7E;;ACEK,MAAO,oBAKX,SAAQ,UAAa,CAAA;AA2CT,IAAA,gBAAA;AA1CZ;;AAEG;AACH,IAAA,iBAAiB;AAEjB;;AAEG;AACH,IAAA,WAAW;AAED,IAAA,eAAe;AACf,IAAA,QAAQ;IACR,gBAAgB,GAIpB,EAAE;AACE,IAAA,WAAW;AACJ,IAAA,OAAO;IAChB,WAAW,GAAM,IAAI;AAE7B,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;;AAGrB;;AAEG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW;;AAG3B;;;;;;AAMG;AACH,IAAA,WAAA,CACE,IAAS,EACT,QAAsB,EACZ,gBAAoB,EAC9B,MAAU,EAAA;AAEV,QAAA,KAAK,EAAE;QAHG,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAK1B,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,2BAA2B,EAAE,KAAK;AAClC,YAAA,GAAG,MAAM;SACV;QAED,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;;aAC1B;YACL,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,gBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;iBAC/B;AACL,gBAAA,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC;;;QAI3G,IAAI,CAAC,oBAAoB,EAAE;AAE3B,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,OAAO,EAAO;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC;;IAGpC,oBAAoB,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc;AAAE,YAAA,OAAO;AAExC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC3C,QAAA,IAAI,SAAS,IAAI,IAAI,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AACnD,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACpG,YAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,wEAAwE,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;;;;AAKtH;;;;AAIG;AACH,IAAA,MAAM,SAAS,CAAC,QAAiB,EAAE,OAAsE,EAAA;AACvG,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;AAChC,gBAAA,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;;AAE1F,YAAA,OAAO;;QAGT,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAExC,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE;AACnE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAExE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC;QAC3C,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9E,QAAA,MAAM,UAAU,GAAG,wBAAwB,CAAC,kBAAkB,CAAC;YAC7D,EAAE;YACF,OAAO;YACP,WAAW;YACX,SAAS;;AAET,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;QAEF,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,CAAC;AACpC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;aACtB;AACL,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;AACnC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;iBAC3C;AACL,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACrB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;;;QAK/B,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU;;;aAI1B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AAChD,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;;AAGzD,QAAA,OAAO,UAAU;;AAGnB;;;;;AAKG;AACH,IAAA,MAAM,OAAO,CAAC,YAAiB,EAAE,QAAiB,EAAE,OAAoD,EAAA;AACtG,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;AAChC,gBAAA,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;;AAE1F,YAAA,OAAO;;QAGT,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;;;AAI1C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC;;QAGtE,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;;QAGtC,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;YACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ;AACxG,YAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC;;aACrC;AACL,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;gBACnC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;gBAClC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;;iBACtC;gBACL,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;AAClC,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;;;AAI7D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAE3B,IAAI,OAAO,EAAE;;;;aAKR,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;YAChD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;;AAG5D,QAAA,OAAO,WAAW;;IAGpB,iBAAiB,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACrD,QAAA,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;YACjB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC;;aAClC;YACL,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;;;IAIzC,cAAc,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AAClD,QAAA,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YACjC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC;;aAC9B;AACL,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;;;AAI3B;;;;;AAKG;IACH,MAAM,aAAa,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACvD,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE;AACjC,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,KAAK;;QAGd,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7B,QAAA,GAAG,CAAC,OAAO,GAAG,KAAK;QAEnB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE;AAC1C,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAGvC,QAAA,OAAO,IAAI;;AAGb;;;;;AAKG;IACH,MAAM,WAAW,CAAC,GAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACrD,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE;AACjC,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,KAAK;;QAGd,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;AAEpD,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG7B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;AAC7C,YAAA,GAAG,CAAC,YAAY,GAAG,SAAS;;AAE9B,QAAA,GAAG,CAAC,OAAO,GAAG,KAAK;QAEnB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AAC3C,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAEvC,QAAA,OAAO,IAAI;;IAGb,MAAM,SAAS,CAAC,GAAM,EAAA;QACpB,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;;AAG7B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;AAClE,YAAA,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,SAAS,EAAE;;AAEpC,QAAA,GAAG,CAAC,OAAO,GAAG,IAAI;AAClB,QAAA,OAAO,IAAI;;AAGb;;AAEG;IACH,MAAM,MAAM,CAAC,EAAU,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC;AAEhD,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;QAEhC,IAAI,EAAE,KAAK,CAAC,CAAC;AAAE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAEvC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAE7B,QAAA,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE;AAC1D,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAGvC,QAAA,OAAO,IAAI;;AAGb;;;AAGG;IACH,MAAM,MAAM,CAAC,GAAM,EAAA;AACjB,QAAA,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC;QACxH,IAAI,CAAC,GAAG,CAAC,OAAO;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC;AAErH,QAAA,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,YAAY;AAClC,QAAA,GAAG,CAAC,OAAO,GAAG,KAAK;;QAGnB,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;AAC7D,YAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE;;AAGhC,QAAA,OAAO,IAAI;;AAGb;;;;AAIG;AACH,IAAA,MAAM,IAAI,CAAC,EAAU,EAAE,SAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,KAAK;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC;QAEhD,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;AAEjD,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;AACnI,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAE5C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAE7B,QAAA,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;AACb,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;;AAEvC,QAAA,OAAO,IAAI;;IAGb,MAAM,cAAc,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;;IAG/D,MAAM,WAAW,CAAC,MAAW,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;;QAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC/C,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;;AAG1C,QAAA,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CACtC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,KAClB,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,+FAA+F,CAAC,CAC/I,CACF;;AAGD,QAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM;AAClE,QAAA,IAAI,iBAAiB,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE;YACtE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;;;AAI5D,QAAA,OAAO,iBAAiB,KAAK,cAAc,CAAC,MAAM;;AAGpD;;;AAGG;AACH,IAAA,MAAM,CAAC,EAAU,EAAA;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC;QAEhD,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI;;AAGnE;;;;;;;;AAQG;IACH,gBAAgB,CAAC,IAAS,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAE3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AAC3C,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;AAKvC;;;AAGG;AACO,IAAA,gBAAgB,CAAC,MAAW,EAAA;AACpC,QAAA,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;AAG9D;;AAEG;AACO,IAAA,cAAc,CAAC,MAAW,EAAA;AAClC,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,CAAC;;AAG5C;;;;AAIG;AACO,IAAA,cAAc,CAAC,MAAW,EAAA;QAClC,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;;AAG3C;;;;;;AAMG;IACO,iBAAiB,CAAC,KAAa,EAAE,KAAa,EAAA;AACtD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;AACnC,YAAA,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK;;aACnB;AACL,YAAA,OAAO,KAAK;;;AAIhB;;;;;AAKG;IACO,iBAAiB,CAAC,EAAU,EAAE,MAAW,EAAA;AACjD,QAAA,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;;AAGzD;;;;;;AAMG;IACO,YAAY,CAAC,YAAoB,EAAE,MAAW,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,CAAC,CAAC,GAAG,CAAC;AAEtD,QAAA,KAAK,IAAI,KAAK,GAAG,YAAY,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,KAAK,EAAE;YAClF,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;;;;AAI3B,gBAAA,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;;;;AAKrE;;;AAGG;AACO,IAAA,eAAe,CAAC,IAAS,EAAA;AACjC,QAAA,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,CAAC;QACxI,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAI,WAAW,CAAC;;AAGhE;;;AAGG;AACO,IAAA,wBAAwB,CAAC,IAAS,EAAA;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC7C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;;AAG/C;;;;AAIG;IACO,kBAAkB,CAAC,SAAc,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAA;QACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;;QAGzC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC;QAE7D,OAAO,SAAS,CAAC,GAAG,CAAI,CAAC,WAAW,EAAE,KAAK,KAAI;YAC7C,OAAO,wBAAwB,CAAC,kBAAkB,CAAC;gBACjD,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;gBACnD,OAAO;gBACP,WAAW;AACX,gBAAA,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC;;AAE5B,gBAAA,MAAM,EAAE,IAAI;AACb,aAAA,CAAC;AACJ,SAAC,CAAC;;AAGJ;;;;;AAKG;IACO,eAAe,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE;;aAC5B;YACL,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AACvC,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS;AACpB,gBAAA,OAAO,GAAG;aACX,EAAE,EAAE,CAAC;;;AAIA,IAAA,kBAAkB,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAA;QACtD,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,IAAI;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE;;QAGzD,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE;YAClD,SAAS,CAAC,OAAO,EAAE;;AAErB,QAAA,OAAO,SAAS;;AAGlB;;;;;AAKG;IACO,mBAAmB,CAAC,KAAa,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAA;AACvE,QAAA,MAAM,UAAU,GAAG,IAAI,KAAK,CAAmB,KAAK,CAAC;AACrD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;;AAElD,QAAA,OAAO,UAAU;;AAGnB;AAC0B;AAC1B,IAAA,OAAO,CAAC,gBAAkC,EAAA;;QAExC,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;;AAGxC,QAAA,MAAM,KAAK,GAAc;AACvB,YAAA,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,CAAC,CAAC;SACR;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,MAAM,EAAE,gBAAgB;YACxB,KAAK;YACL,YAAY,EAAE,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AACxD,gBAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AACrB,gBAAA,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;AACnB,aAAC,CAAC;AACH,SAAA,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,IAAI,CACzC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,EACrD,GAAG,CAAC,CAAC,IAAI,KAAI;AACX,YAAA,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE;gBACnB,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE;AAC3B,oBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;;gBAE3C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;;YAEhC,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;gBAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC;;AAEjC,YAAA,OAAO,IAAI;SACZ,CAAC,CACH;;AAGH,IAAA,UAAU,CAAC,gBAAkC,EAAA;QAC3C,IAAI,gBAAgB,EAAE;AACpB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC;AACtF,YAAA,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;AACnB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,gBAAA,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE;;;;QAKlC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;;;AAGtC;;AChnBD;;AAEG;;;;"}