@honuware/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -0
- package/fesm2022/honuware-ui-access.mjs +557 -0
- package/fesm2022/honuware-ui-access.mjs.map +1 -0
- package/fesm2022/honuware-ui-auth.mjs +503 -0
- package/fesm2022/honuware-ui-auth.mjs.map +1 -0
- package/fesm2022/honuware-ui-controls.mjs +624 -0
- package/fesm2022/honuware-ui-controls.mjs.map +1 -0
- package/fesm2022/honuware-ui-crud.mjs +1101 -0
- package/fesm2022/honuware-ui-crud.mjs.map +1 -0
- package/fesm2022/honuware-ui-foundation.mjs +745 -0
- package/fesm2022/honuware-ui-foundation.mjs.map +1 -0
- package/fesm2022/honuware-ui-photos.mjs +238 -0
- package/fesm2022/honuware-ui-photos.mjs.map +1 -0
- package/fesm2022/honuware-ui-square.mjs +128 -0
- package/fesm2022/honuware-ui-square.mjs.map +1 -0
- package/fesm2022/honuware-ui-testing.mjs +325 -0
- package/fesm2022/honuware-ui-testing.mjs.map +1 -0
- package/fesm2022/honuware-ui.mjs +17 -0
- package/fesm2022/honuware-ui.mjs.map +1 -0
- package/package.json +80 -0
- package/types/honuware-ui-access.d.ts +382 -0
- package/types/honuware-ui-auth.d.ts +164 -0
- package/types/honuware-ui-controls.d.ts +136 -0
- package/types/honuware-ui-crud.d.ts +287 -0
- package/types/honuware-ui-foundation.d.ts +89 -0
- package/types/honuware-ui-photos.d.ts +46 -0
- package/types/honuware-ui-square.d.ts +65 -0
- package/types/honuware-ui-testing.d.ts +126 -0
- package/types/honuware-ui.d.ts +3 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honuware-ui-crud.mjs","sources":["../../../projects/honuware-ui/crud/src/database-schema.service.ts","../../../projects/honuware-ui/crud/src/table-binding.utils.ts","../../../projects/honuware-ui/crud/src/crud-editor-routes.ts","../../../projects/honuware-ui/crud/src/table-view-control/table-view-control.component.ts","../../../projects/honuware-ui/crud/src/table-view-control/table-view-control.component.html","../../../projects/honuware-ui/crud/src/composite-row-control/composite-row-control.component.ts","../../../projects/honuware-ui/crud/src/composite-row-control/composite-row-control.component.html","../../../projects/honuware-ui/crud/src/table-view-page/table-view-page.component.ts","../../../projects/honuware-ui/crud/src/table-view-page/table-view-page.component.html","../../../projects/honuware-ui/crud/src/table-edit-page/table-edit-page.component.ts","../../../projects/honuware-ui/crud/src/table-edit-page/table-edit-page.component.html","../../../projects/honuware-ui/crud/src/table-new-page/table-new-page.component.ts","../../../projects/honuware-ui/crud/src/table-new-page/table-new-page.component.html","../../../projects/honuware-ui/crud/src/public-api.ts","../../../projects/honuware-ui/crud/src/honuware-ui-crud.ts"],"sourcesContent":["import { Injectable, Inject, DestroyRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, Observable, Subscription, timer, of } from 'rxjs';\nimport { catchError, distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators';\nimport { CrudAccess, HONUWARE_CRUD_ACCESS, DatabaseSchema } from '@honuware/ui/access';\nimport { AuthService } from '@honuware/ui/auth';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatabaseSchemaService {\n private _schema?: DatabaseSchema;\n private _schemaSubject = new BehaviorSubject<DatabaseSchema | undefined>(undefined);\n private _refreshSub?: Subscription;\n private _fetchInProgress = false;\n private _retryTimeoutMs: number = 6000; // configurable timeout\n private readonly destroyRef = inject(DestroyRef);\n\n public readonly schema$: Observable<DatabaseSchema | undefined> = this._schemaSubject.asObservable();\n\n constructor(\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n private authService: AuthService\n ) {\n this.startSchemaPolling();\n\n this.authService.authData$.pipe(\n map(authData => authData.isAuth),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => {\n this.refreshSchema();\n });\n }\n\n private startSchemaPolling(): void {\n this.tryFetchSchema();\n }\n\n public refreshSchema(): void {\n this._schema = undefined;\n this._schemaSubject.next(undefined);\n this.tryFetchSchema();\n }\n\n private tryFetchSchema(): void {\n if (this._fetchInProgress) return;\n\n this._refreshSub?.unsubscribe();\n this._fetchInProgress = true;\n\n this._refreshSub = this.crudAccess.getDbSchema().pipe(\n tap(schema => {\n this._schema = schema;\n this._schemaSubject.next(schema);\n this._fetchInProgress = false;\n this._refreshSub?.unsubscribe(); // Stop further polling\n this._refreshSub = undefined;\n }),\n catchError(() => {\n this._fetchInProgress = false;\n // Schedule retry after timeout\n this._refreshSub = timer(this._retryTimeoutMs).subscribe(() => this.tryFetchSchema());\n return of(undefined);\n })\n ).subscribe();\n }\n\n /**\n * Returns the cached DatabaseSchema if present, otherwise waits for a successful fetch.\n */\n public GetDBSchema(): Observable<DatabaseSchema> {\n if (this._schema) {\n return of(this._schema);\n }\n // Wait for the schema to be available\n return this.schema$.pipe(\n filter((schema): schema is DatabaseSchema => !!schema),\n take(1)\n );\n }\n}\n","import { TableBinding, FilterPair, TableSchema } from '@honuware/ui/access';\n\n/**\n * Serialize a binding stack to a ctx query param string.\n * Format: \"table:pkColumn:pkValue,table:pkColumn:pkValue\"\n */\nexport function serializeBindingStack(stack: TableBinding[]): string {\n return stack.map(b => `${b.tableName}:${b.primaryKeyName}:${b.primaryKeyValue}`).join(',');\n}\n\n/**\n * Deserialize a ctx query param string into a TableBinding array.\n * Returns empty array for null/empty input.\n */\nexport function parseBindingStack(ctx: string | null | undefined): TableBinding[] {\n if (!ctx) return [];\n return ctx.split(',').map(triple => {\n const [tableName, primaryKeyName, primaryKeyValue] = triple.split(':');\n return { tableName, primaryKeyName, primaryKeyValue };\n });\n}\n\n/**\n * Derive filter pairs from the binding stack for the current table.\n * Looks at the current table's foreign keys and matches them against\n * the binding stack to build WHERE clause filters.\n *\n * For example, if viewing purchases with ctx=people:person_id:42,\n * and purchases has FK column payer_person_id -> people.person_id,\n * this returns [{ column_name: 'payer_person_id', column_value: '42' }].\n */\nexport function deriveFilterPairs(\n currentTableSchema: TableSchema,\n bindingStack: TableBinding[]\n): FilterPair[] {\n if (bindingStack.length === 0) return [];\n\n const filterPairs: FilterPair[] = [];\n for (const fk of currentTableSchema.foreign_keys) {\n const binding = bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n filterPairs.push({\n column_name: fk.column_name,\n column_value: binding.primaryKeyValue,\n });\n }\n }\n return filterPairs;\n}\n","import { InjectionToken } from '@angular/core';\n\n// Route literals the generic CRUD editor (the table-view / composite-row\n// containers and the table pages) would otherwise hardcode. Injected so a\n// honuware consumer can mount the editor under a different path without\n// forking the components.\nexport interface CrudEditorRoutes {\n /**\n * Base path for the generic table editor routes. Navigation is built as\n * `[basePath, tableName, 'view'|'edit'|'new', ...]`, so this must be the\n * absolute prefix the editor routes are mounted at.\n */\n basePath: string;\n /** The admin portal home the \"back\" links point at. */\n adminHome: string;\n}\n\nexport const DEFAULT_CRUD_EDITOR_ROUTES: CrudEditorRoutes = {\n basePath: '/admin/tables',\n adminHome: '/admin',\n};\n\n// Root-provided with the knottyyoga defaults, so nothing needs wiring today.\nexport const CRUD_EDITOR_ROUTES = new InjectionToken<CrudEditorRoutes>(\n 'CRUD_EDITOR_ROUTES',\n {\n providedIn: 'root',\n factory: () => DEFAULT_CRUD_EDITOR_ROUTES,\n }\n);\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, Inject } from '@angular/core';\n\nimport { Router } from '@angular/router';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport {\n CrudAccess, HONUWARE_CRUD_ACCESS, PhotoUrlBuilder,\n DatabaseSchema, TableSchema, ColumnDataInfo, ForeignKeyInfo, TableBinding,\n} from '@honuware/ui/access';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\nimport { from } from 'rxjs';\nimport { concatMap, tap } from 'rxjs/operators';\nimport { serializeBindingStack, deriveFilterPairs } from '../table-binding.utils';\nimport { ConfirmDialogComponent } from '@honuware/ui/foundation';\nimport { formatMicroseconds, isMicrosecondTimestamp } from '@honuware/ui/foundation';\n\nexport interface ChildTableReference {\n childTableName: string;\n childTableFriendlyName: string;\n foreignKey: ForeignKeyInfo;\n}\n\n@Component({\n selector: 'hw-table-view-control',\n standalone: true,\n imports: [\n MatTableModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatDialogModule,\n MatSelectModule,\n MatFormFieldModule\n],\n templateUrl: './table-view-control.component.html',\n styleUrls: ['./table-view-control.component.scss']\n})\nexport class TableViewControlComponent implements OnInit, OnChanges {\n @Input() tableName!: string;\n @Input() pageSize: number = 10;\n @Input() pageOffset: number = 0;\n @Input() sortColumn?: string;\n @Input() sortAscending: boolean = true;\n @Input() bindingStack: TableBinding[] = [];\n\n databaseSchema?: DatabaseSchema;\n tableSchema?: TableSchema;\n columns: ColumnDataInfo[] = [];\n displayedColumns: string[] = [];\n dataSource: Record<string, string>[] = [];\n totalCount: number = 0;\n loading: boolean = true;\n error?: string;\n childTableReferences: ChildTableReference[] = [];\n /** Maps column_name → pk_value → display_text for FK columns. */\n fkDisplayMap: Record<string, Record<string, string>> = {};\n\n pageSizeOptions: number[] = [5, 10, 20, 30, 50, 100];\n\n constructor(\n private dbSchemaService: DatabaseSchemaService,\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n private photoUrlBuilder: PhotoUrlBuilder,\n @Inject(CRUD_EDITOR_ROUTES) private editorRoutes: CrudEditorRoutes,\n private router: Router,\n private dialog: MatDialog\n ) {}\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['tableName'] || changes['pageSize'] || changes['pageOffset'] ||\n changes['sortColumn'] || changes['sortAscending'] || changes['bindingStack']) {\n if (!changes['tableName']?.firstChange) {\n this.loadData();\n }\n }\n }\n\n private loadData(): void {\n this.loading = true;\n this.error = undefined;\n\n this.dbSchemaService.GetDBSchema().subscribe({\n next: (schema) => {\n this.databaseSchema = schema;\n this.tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!this.tableSchema) {\n this.error = `Table \"${this.tableName}\" not found in schema`;\n this.loading = false;\n return;\n }\n\n this.columns = this.tableSchema.columns.filter(c => !this.isTrueValue(c.hidden));\n // Display actions column first, then photo column if supported, then data columns\n const photoColumn = this.hasPhotoSupport ? ['photo'] : [];\n this.displayedColumns = ['actions'].concat(photoColumn, this.columns.map(c => c.column_name));\n\n // Compute child table references\n this.childTableReferences = this.getChildTableReferences(schema);\n\n // Derive filter pairs from binding stack + FK info\n const filterPairs = deriveFilterPairs(this.tableSchema, this.bindingStack);\n\n // Use primary key as default sort column if not specified\n const sortCol = this.sortColumn || this.tableSchema.primary_key;\n\n this.crudAccess.getFilteredTableRows(\n this.tableName,\n sortCol,\n this.sortAscending,\n this.pageSize,\n this.pageOffset,\n filterPairs\n ).subscribe({\n next: (result) => {\n this.totalCount = result.totalCount;\n // Convert dataTable array to array of objects\n this.dataSource = result.dataTable.map(row => {\n const obj: Record<string, string> = {};\n result.sortedColumnNames.forEach((colName, idx) => {\n obj[colName] = row[idx];\n });\n return obj;\n });\n this.resolveFkDisplayValues();\n },\n error: (err) => {\n this.error = 'Failed to load data';\n this.loading = false;\n console.error('Error loading table data:', err);\n }\n });\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n private getChildTableReferences(schema: DatabaseSchema): ChildTableReference[] {\n const refs: ChildTableReference[] = [];\n for (const nestedTableName of schema.nested_tables) {\n const childSchema = schema.tables.find(t => t.table_name === nestedTableName);\n if (!childSchema) continue;\n for (const fk of childSchema.foreign_keys) {\n if (fk.parent_table_name === this.tableName) {\n refs.push({\n childTableName: nestedTableName,\n childTableFriendlyName: childSchema.table_friendly_name || nestedTableName,\n foreignKey: fk,\n });\n }\n }\n }\n return refs;\n }\n\n private resolveFkDisplayValues(): void {\n if (!this.tableSchema || this.tableSchema.foreign_keys.length === 0) {\n this.loading = false;\n return;\n }\n\n const fkEntries: { colName: string; parentTable: string; values: string[] }[] = [];\n\n for (const fk of this.tableSchema.foreign_keys) {\n const uniqueValues = [...new Set(\n this.dataSource\n .map(row => row[fk.column_name])\n .filter(v => !!v)\n )];\n if (uniqueValues.length === 0) continue;\n fkEntries.push({\n colName: fk.column_name,\n parentTable: fk.parent_table_name,\n values: uniqueValues,\n });\n }\n\n if (fkEntries.length === 0) {\n this.loading = false;\n return;\n }\n\n // Process sequentially to avoid concurrent transaction errors on the server\n from(fkEntries).pipe(\n concatMap(entry =>\n this.crudAccess.resolveFkDisplay(entry.parentTable, entry.values).pipe(\n tap(response => {\n this.fkDisplayMap[entry.colName] = response.resolved;\n })\n )\n )\n ).subscribe({\n complete: () => {\n this.loading = false;\n },\n error: (err) => {\n console.error('FK display resolution failed:', err);\n this.loading = false;\n }\n });\n }\n\n onNavigateToChild(ref: ChildTableReference, row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n if (!primaryKeyValue || !this.tableSchema) return;\n\n const newStack: TableBinding[] = [\n ...this.bindingStack,\n {\n tableName: this.tableName,\n primaryKeyName: this.tableSchema.primary_key,\n primaryKeyValue,\n }\n ];\n\n this.router.navigate(\n [this.editorRoutes.basePath, ref.childTableName, 'view', this.pageSize, 0],\n { queryParams: { ctx: serializeBindingStack(newStack) } }\n );\n }\n\n private isTrueValue(value: boolean | undefined): boolean {\n return value === true || (value as unknown) === 't';\n }\n\n formatCellValue(column: ColumnDataInfo, value: string): string {\n if (!value) return value;\n // Check FK display map first\n const fkResolved = this.fkDisplayMap[column.column_name];\n if (fkResolved && fkResolved[value]) {\n return fkResolved[value];\n }\n if (column.html_input_type === 'date' && isMicrosecondTimestamp(value)) {\n return formatMicroseconds(value);\n }\n return value;\n }\n\n isBoolColumn(column: ColumnDataInfo): boolean {\n return column.type === 'bool' ||\n column.html_input_type === 'bool' ||\n column.html_input_type === 'checkbox';\n }\n\n getBoolValue(value: string): boolean {\n return value === 't' || value === 'true' || value === '1';\n }\n\n getColumnHeader(column: ColumnDataInfo): string {\n return column.column_friendly_name || column.column_name;\n }\n\n get hasPhotoSupport(): boolean {\n return this.isTrueValue(this.tableSchema?.has_photo_support);\n }\n\n getPhotoUrl(row: Record<string, string>): string {\n const id = this.getPrimaryKeyValue(row);\n return this.photoUrlBuilder.scaledPhotoUrl(this.tableName, id, 50, 50);\n }\n\n getPrimaryKeyValue(row: Record<string, string>): string {\n return this.tableSchema ? row[this.tableSchema.primary_key] : '';\n }\n\n // Pagination helpers\n get currentPage(): number {\n return this.pageOffset;\n }\n\n get totalPages(): number {\n return Math.ceil(this.totalCount / this.pageSize);\n }\n\n get startRow(): number {\n return this.pageOffset * this.pageSize + 1;\n }\n\n get endRow(): number {\n return Math.min((this.pageOffset + 1) * this.pageSize, this.totalCount);\n }\n\n get canGoPrevious(): boolean {\n return this.pageOffset > 0;\n }\n\n get canGoNext(): boolean {\n return this.pageOffset < this.totalPages - 1;\n }\n\n // Navigation methods\n goToFirstPage(): void {\n this.navigateToPage(0);\n }\n\n goToPreviousPage(): void {\n if (this.canGoPrevious) {\n this.navigateToPage(this.pageOffset - 1);\n }\n }\n\n goToNextPage(): void {\n if (this.canGoNext) {\n this.navigateToPage(this.pageOffset + 1);\n }\n }\n\n goToLastPage(): void {\n this.navigateToPage(this.totalPages - 1);\n }\n\n /** Build query params preserving ctx for nested navigation. */\n private buildCtxQueryParams(extra?: Record<string, string>): Record<string, string> {\n const params: Record<string, string> = { ...extra };\n if (this.bindingStack.length > 0) {\n params['ctx'] = serializeBindingStack(this.bindingStack);\n }\n return params;\n }\n\n private navigateToPage(page: number): void {\n this.router.navigate(\n [this.editorRoutes.basePath, this.tableName, 'view', this.pageSize, page],\n { queryParams: this.buildCtxQueryParams() }\n );\n }\n\n onPageSizeChange(newPageSize: number): void {\n // Reset to first page when changing page size\n this.router.navigate(\n [this.editorRoutes.basePath, this.tableName, 'view', newPageSize, 0],\n { queryParams: this.buildCtxQueryParams() }\n );\n }\n\n // Action methods\n onNewItem(): void {\n const returnUrl = this.router.url;\n this.router.navigate([this.editorRoutes.basePath, this.tableName, 'new'], {\n queryParams: this.buildCtxQueryParams({ returnUrl })\n });\n }\n\n onEditRow(row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n if (!primaryKeyValue) {\n console.error('Cannot edit row: no primary key value found', { row, tableSchema: this.tableSchema });\n return;\n }\n const returnUrl = this.router.url;\n this.router.navigate([this.editorRoutes.basePath, this.tableName, 'edit', primaryKeyValue], {\n queryParams: this.buildCtxQueryParams({ returnUrl })\n });\n }\n\n /** Navigate back to the parent table's edit page by popping the binding stack. */\n onNavigateToParent(): void {\n if (this.bindingStack.length === 0) return;\n\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentStack = this.bindingStack.slice(0, -1);\n\n const queryParams: Record<string, string> = {};\n if (parentStack.length > 0) {\n queryParams['ctx'] = serializeBindingStack(parentStack);\n }\n\n this.router.navigate(\n [this.editorRoutes.basePath, parentBinding.tableName, 'edit', parentBinding.primaryKeyValue],\n { queryParams }\n );\n }\n\n get hasParent(): boolean {\n return this.bindingStack.length > 0;\n }\n\n get parentFriendlyName(): string {\n if (this.bindingStack.length === 0) return '';\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentSchema = this.databaseSchema?.tables.find(t => t.table_name === parentBinding.tableName);\n return parentSchema?.table_friendly_name || parentBinding.tableName;\n }\n\n onDeleteRow(row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n const primaryKeyName = this.tableSchema?.primary_key || 'id';\n\n const friendlyName = this.tableSchema?.table_friendly_name || this.tableName;\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n width: '400px',\n data: {\n title: 'Confirm Delete',\n description: `Are you sure you want to delete this ${friendlyName} record (ID: ${primaryKeyValue})?`,\n buttonText: 'Delete',\n }\n });\n\n dialogRef.afterClosed().subscribe(confirmed => {\n if (confirmed) {\n this.crudAccess.deleteItem(this.tableName, primaryKeyName, primaryKeyValue).subscribe({\n next: () => {\n // Refresh the data after deletion\n this.loadData();\n },\n error: (err) => {\n console.error('Error deleting row:', err);\n this.error = 'Failed to delete row';\n }\n });\n }\n });\n }\n}\n","<div class=\"table-view-container\">\n <!-- Back to Parent button -->\n @if (hasParent) {\n <button mat-stroked-button class=\"parent-button\" (click)=\"onNavigateToParent()\">\n <mat-icon>arrow_back</mat-icon>\n Back to {{ parentFriendlyName }}\n </button>\n }\n\n <!-- Header with New Item button -->\n <div class=\"table-header\">\n <h2>{{ tableSchema?.table_friendly_name || tableName }}</h2>\n <button mat-raised-button color=\"primary\" (click)=\"onNewItem()\">\n <mat-icon>add</mat-icon>\n New Item\n </button>\n </div>\n\n <!-- Loading state -->\n @if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n }\n\n <!-- Error state -->\n @if (error && !loading) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n }\n\n <!-- Empty state -->\n @if (!loading && !error && dataSource.length === 0) {\n <div class=\"empty-container\">\n <mat-icon>inbox</mat-icon>\n <p>No records found</p>\n <button mat-stroked-button color=\"primary\" (click)=\"onNewItem()\">\n Create First Record\n </button>\n </div>\n }\n\n <!-- Data table -->\n @if (!loading && !error && dataSource.length > 0) {\n <div class=\"table-wrapper\">\n <table mat-table [dataSource]=\"dataSource\" multiTemplateDataRows>\n <!-- Dynamic columns -->\n @for (column of columns; track column.column_name) {\n <ng-container [matColumnDef]=\"column.column_name\">\n <th mat-header-cell *matHeaderCellDef>{{ getColumnHeader(column) }}</th>\n <td mat-cell *matCellDef=\"let row\">\n @if (isBoolColumn(column)) {\n <mat-icon [class]=\"getBoolValue(row[column.column_name]) ? 'bool-true' : 'bool-false'\">\n {{ getBoolValue(row[column.column_name]) ? 'check_circle' : 'cancel' }}\n </mat-icon>\n } @else {\n {{ formatCellValue(column, row[column.column_name]) }}\n }\n </td>\n </ng-container>\n }\n\n <!-- Photo column (always defined, only included in displayedColumns when supported) -->\n <ng-container matColumnDef=\"photo\">\n <th mat-header-cell *matHeaderCellDef>Photo</th>\n <td mat-cell *matCellDef=\"let row\">\n <img [src]=\"getPhotoUrl(row)\"\n class=\"photo-thumbnail\"\n (error)=\"$any($event.target).style.display='none'; $any($event.target).nextElementSibling.style.display='inline-flex'\"\n alt=\"Photo\">\n <mat-icon class=\"photo-placeholder\" style=\"display: none\">image</mat-icon>\n </td>\n </ng-container>\n\n <!-- Actions column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"actions-row\">\n <button mat-icon-button color=\"primary\" (click)=\"onEditRow(row); $event.stopPropagation()\" title=\"Edit\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button color=\"warn\" (click)=\"onDeleteRow(row); $event.stopPropagation()\" title=\"Delete\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </td>\n </ng-container>\n\n <!-- Child tables detail row (spans all columns) -->\n <ng-container matColumnDef=\"childTables\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"displayedColumns.length\">\n <div class=\"child-table-pills\">\n @for (ref of childTableReferences; track ref.childTableName + ref.foreignKey.column_name) {\n <button class=\"child-pill\" (click)=\"onNavigateToChild(ref, row); $event.stopPropagation()\">\n <mat-icon>subdirectory_arrow_right</mat-icon>\n {{ ref.childTableFriendlyName }}\n </button>\n }\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['childTables'];\"\n class=\"child-tables-row\"\n [class.hidden-row]=\"childTableReferences.length === 0\"></tr>\n </table>\n </div>\n\n <!-- Pagination controls -->\n <div class=\"pagination-container\">\n <div class=\"pagination-left\">\n <mat-form-field appearance=\"outline\" class=\"page-size-select\">\n <mat-label>Page size</mat-label>\n <mat-select [value]=\"pageSize\" (selectionChange)=\"onPageSizeChange($event.value)\">\n @for (size of pageSizeOptions; track size) {\n <mat-option [value]=\"size\">{{ size }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <span class=\"pagination-info\">\n Showing {{ startRow }} - {{ endRow }} of {{ totalCount }}\n </span>\n </div>\n <div class=\"pagination-buttons\">\n <button mat-icon-button\n [disabled]=\"!canGoPrevious\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <mat-icon>first_page</mat-icon>\n </button>\n <button mat-icon-button\n [disabled]=\"!canGoPrevious\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <span class=\"page-info\">Page {{ currentPage + 1 }} of {{ totalPages }}</span>\n <button mat-icon-button\n [disabled]=\"!canGoNext\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button mat-icon-button\n [disabled]=\"!canGoNext\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <mat-icon>last_page</mat-icon>\n </button>\n </div>\n </div>\n }\n</div>\n","import { Component, Input, ViewChild, ViewChildren, QueryList, OnInit, Inject } from '@angular/core';\n\nimport { Router } from '@angular/router';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CompositeControlComponent } from '@honuware/ui/controls';\nimport { PhotoUploadComponent } from '@honuware/ui/photos';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport {\n CrudAccess, UpdateItemBody, AddItemBody, HONUWARE_CRUD_ACCESS,\n DatabaseSchema, TableSchema, ColumnDataInfo, ForeignKeyInfo,\n TableBinding, FilterPair, CrudFormAssist, ComputedDateRule,\n} from '@honuware/ui/access';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\nimport { serializeBindingStack } from '../table-binding.utils';\n\n/**\n * A child table reference discovered from the schema.\n * Represents a nested table that has an FK pointing back to the current table.\n */\nexport interface ChildTableReference {\n childTableName: string;\n childTableFriendlyName: string;\n foreignKey: ForeignKeyInfo;\n}\n\n@Component({\n selector: 'hw-composite-row-control',\n standalone: true,\n imports: [MatButtonModule, MatCheckboxModule, MatIconModule, CompositeControlComponent, PhotoUploadComponent],\n templateUrl: './composite-row-control.component.html',\n styleUrls: ['./composite-row-control.component.scss']\n})\nexport class CompositeRowControlComponent implements OnInit {\n @Input() tableName!: string;\n @Input() columnNames!: string[];\n @Input() primaryKeyName?: string;\n @Input() primaryKeyValue?: string;\n @Input() isCreateMode!: boolean;\n @Input() returnUrl?: string;\n @Input() bindingStack: TableBinding[] = [];\n @Input() formAssist?: CrudFormAssist;\n\n @ViewChildren(CompositeControlComponent) controls!: QueryList<CompositeControlComponent>;\n @ViewChild(PhotoUploadComponent) photoUpload?: PhotoUploadComponent;\n\n columnInfos: ColumnDataInfo[] = [];\n loading: boolean = true;\n columnValues: (string | undefined)[] = []; // values for each column\n hasPhotoSupport: boolean = false;\n childTableReferences: ChildTableReference[] = [];\n /** Set of FK column names from navigation context (readonly + pre-filled in create mode). */\n private contextFkColumnNames: Set<string> = new Set();\n private databaseSchema?: DatabaseSchema;\n private tableSchema?: TableSchema;\n /** Tracks whether each computed date dest column is in auto-compute mode. */\n computedDateAutoState: Record<string, boolean> = {};\n\n constructor(\n private dbSchemaService: DatabaseSchemaService,\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n @Inject(CRUD_EDITOR_ROUTES) private editorRoutes: CrudEditorRoutes,\n private router: Router\n ) {}\n\n ngOnInit() {\n this.loadColumnInfos();\n }\n\n private loadColumnInfos() {\n this.dbSchemaService.GetDBSchema().subscribe(schema => {\n this.databaseSchema = schema;\n const table = schema.tables.find(t => t.table_name === this.tableName);\n if (!table) {\n this.columnInfos = [];\n this.loading = false;\n return;\n }\n this.tableSchema = table;\n this.hasPhotoSupport = this.isTrueValue(table.has_photo_support);\n this.columnInfos = this.columnNames.map(colName =>\n table.columns.find(col => col.column_name === colName)!\n );\n\n // Compute context FK columns from binding stack\n this.contextFkColumnNames = this.computeContextFkColumns(table);\n\n // Compute child table references (for nested table navigation buttons)\n this.childTableReferences = this.isCreateMode ? [] : this.getChildTableReferences(schema);\n\n if (!this.isCreateMode && this.primaryKeyName && this.primaryKeyValue) {\n // Fetch row data using getRowByValues (unified for root and nested)\n const filterPairs: FilterPair[] = [\n { column_name: this.primaryKeyName, column_value: this.primaryKeyValue }\n ];\n this.crudAccess.getRowByValues(this.tableName, filterPairs).subscribe(result => {\n // Map each columnName to its value in the returned row\n this.columnValues = this.columnNames.map(colName => {\n const sortedIdx = result.sortedColumnNames.indexOf(colName);\n return result.dataTable.length > 0 && sortedIdx !== -1 ? result.dataTable[0][sortedIdx] : undefined;\n });\n this.loading = false;\n });\n } else {\n // Create mode: pre-fill FK columns from binding stack context, then apply formAssist defaults\n this.columnValues = this.columnNames.map(colName => {\n const fkPrefill = this.getContextFkValue(table, colName);\n if (fkPrefill) return fkPrefill;\n // Apply formAssist defaults\n if (this.formAssist?.defaults && colName in this.formAssist.defaults) {\n return this.formAssist.defaults[colName];\n }\n return undefined;\n });\n // Initialize computed date auto state\n this.initComputedDateState();\n this.loading = false;\n }\n });\n }\n\n /**\n * Compute the set of FK column names that come from navigation context.\n * These should be readonly in both edit and create mode.\n */\n private computeContextFkColumns(table: TableSchema): Set<string> {\n const fkColumns = new Set<string>();\n for (const fk of table.foreign_keys) {\n const binding = this.bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n fkColumns.add(fk.column_name);\n }\n }\n return fkColumns;\n }\n\n /**\n * Get the pre-fill value for an FK column from the binding stack.\n * Returns null if the column is not an FK from context.\n */\n private getContextFkValue(table: TableSchema, columnName: string): string | null {\n for (const fk of table.foreign_keys) {\n if (fk.column_name !== columnName) continue;\n const binding = this.bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n return binding.primaryKeyValue;\n }\n }\n return null;\n }\n\n /**\n * Find nested tables that have FK references to the current table.\n * Only includes tables listed in schema.nested_tables.\n */\n private getChildTableReferences(schema: DatabaseSchema): ChildTableReference[] {\n const refs: ChildTableReference[] = [];\n for (const nestedTableName of schema.nested_tables) {\n const childSchema = schema.tables.find(t => t.table_name === nestedTableName);\n if (!childSchema) continue;\n for (const fk of childSchema.foreign_keys) {\n if (fk.parent_table_name === this.tableName) {\n refs.push({\n childTableName: nestedTableName,\n childTableFriendlyName: childSchema.table_friendly_name || nestedTableName,\n foreignKey: fk,\n });\n }\n }\n }\n return refs;\n }\n\n get visibleColumns(): { col: ColumnDataInfo; index: number }[] {\n return this.columnInfos\n .map((col, index) => ({ col, index }))\n .filter(({ col }) => {\n if (this.isTrueValue(col.hidden)) return false;\n if (this.isTrueValue(col.readonly) && this.isCreateMode) return false;\n return true;\n });\n }\n\n /** Check if a column should be readonly. Includes context FK columns. */\n isReadonlyColumn(col: ColumnDataInfo): boolean {\n return this.isPrimaryKeyColumn(col) || this.isTrueValue(col.readonly)\n || this.contextFkColumnNames.has(col.column_name);\n }\n\n /** Whether the column is an FK from navigation context. */\n isContextFkColumn(col: ColumnDataInfo): boolean {\n return this.contextFkColumnNames.has(col.column_name);\n }\n\n onValueChanged(index: number, value: string): void {\n const visible = this.visibleColumns;\n const entry = visible[index];\n if (!entry) return;\n const control = this.controls.get(index);\n if (control) {\n control.value = value;\n }\n // Update the backing columnValues so computed dates can read it\n this.columnValues[entry.index] = value;\n // Propagate to computed date destinations\n this.applyComputedDates(entry.col.column_name);\n }\n\n getControlValues(): Record<string, string | undefined> {\n const values: Record<string, string | undefined> = {};\n const visible = this.visibleColumns;\n this.controls.forEach((control, idx) => {\n const entry = visible[idx];\n if (!entry) return;\n const col = entry.col;\n if (this.isTrueValue(col.readonly)) return;\n // Skip empty strings for non-text columns — PostgreSQL can't cast \"\"\n // to numeric/date/bool types, and empty means \"no change\" for those.\n if (control.value === '' && !this.isTextColumnType(col.type)) return;\n values[this.columnNames[entry.index]] = control.value;\n });\n return values;\n }\n\n private isTextColumnType(type: string): boolean {\n const upper = type.toUpperCase();\n return upper === 'VARCHAR' || upper === 'TEXT' || upper === 'CHAR';\n }\n\n onSubmit() {\n const values = this.getControlValues();\n if (this.isCreateMode) {\n const body: AddItemBody = {\n table_name: this.tableName,\n value: values\n };\n if (this.hasPhotoSupport) {\n this.crudAccess.addItemFetchPrimaryKey(body).subscribe({\n next: (primaryKey) => {\n if (this.photoUpload?.hasPendingFile) {\n this.photoUpload.uploadPendingPhoto(this.tableName, Number(primaryKey)).subscribe({\n next: () => this.navigateBack(),\n error: (err) => {\n console.error('Error uploading photo:', err);\n this.navigateBack();\n }\n });\n } else {\n this.navigateBack();\n }\n },\n error: (err) => console.error('Error creating item:', err)\n });\n } else {\n this.crudAccess.addItem(body).subscribe({\n next: () => this.navigateBack(),\n error: (err) => console.error('Error creating item:', err)\n });\n }\n } else {\n if (!this.primaryKeyName || !this.primaryKeyValue) return;\n const body: UpdateItemBody = {\n table_name: this.tableName,\n value: values,\n column_name: this.primaryKeyName,\n column_value: this.primaryKeyValue\n };\n this.crudAccess.updateItem(body).subscribe({\n next: () => this.navigateBack(),\n error: (err) => console.error('Error updating item:', err)\n });\n }\n }\n\n onCancel() {\n this.navigateBack();\n }\n\n private isTrueValue(value: boolean | undefined): boolean {\n return value === true || (value as unknown) === 't';\n }\n\n get showPhotoUpload(): boolean {\n if (!this.hasPhotoSupport) return false;\n if (this.isCreateMode) return true;\n return !!this.primaryKeyValue;\n }\n\n get photoItemId(): number {\n if (this.isCreateMode) return 0;\n return Number(this.primaryKeyValue);\n }\n\n getForeignKeyInfo(col: ColumnDataInfo): ForeignKeyInfo | undefined {\n return this.tableSchema?.foreign_keys.find(fk => fk.column_name === col.column_name);\n }\n\n isPrimaryKeyColumn(col: ColumnDataInfo): boolean {\n if (this.isCreateMode) return false;\n // Handle both boolean true and string \"t\" from server\n return col.primary_key === true || (col.primary_key as unknown) === 't';\n }\n\n // --- Nested navigation ---\n\n get hasParent(): boolean {\n return this.bindingStack.length > 0;\n }\n\n get parentFriendlyName(): string {\n if (this.bindingStack.length === 0) return '';\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentSchema = this.databaseSchema?.tables.find(t => t.table_name === parentBinding.tableName);\n return parentSchema?.table_friendly_name || parentBinding.tableName;\n }\n\n /** Navigate back to the parent table's edit page by popping the binding stack. */\n onNavigateToParent(): void {\n if (this.bindingStack.length === 0) return;\n\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentStack = this.bindingStack.slice(0, -1);\n\n const queryParams: Record<string, string> = {};\n if (parentStack.length > 0) {\n queryParams['ctx'] = serializeBindingStack(parentStack);\n }\n\n this.router.navigate(\n [this.editorRoutes.basePath, parentBinding.tableName, 'edit', parentBinding.primaryKeyValue],\n { queryParams }\n );\n }\n\n /** Navigate to a child (nested) table filtered by the current row. */\n onNavigateToChild(ref: ChildTableReference): void {\n if (!this.primaryKeyValue || !this.tableSchema) return;\n\n // Push current table onto the binding stack\n const newStack: TableBinding[] = [\n ...this.bindingStack,\n {\n tableName: this.tableName,\n primaryKeyName: this.tableSchema.primary_key,\n primaryKeyValue: this.primaryKeyValue,\n }\n ];\n\n const queryParams: Record<string, string> = {\n ctx: serializeBindingStack(newStack),\n };\n\n this.router.navigate(\n [this.editorRoutes.basePath, ref.childTableName, 'view', 10, 0],\n { queryParams }\n );\n }\n\n // --- Computed date support ---\n\n private initComputedDateState(): void {\n if (!this.formAssist?.computedDates) return;\n for (const rule of this.formAssist.computedDates) {\n this.computedDateAutoState[rule.dest] = rule.autoByDefault;\n }\n }\n\n /** When a source field changes, update any auto-computed dest fields. */\n private applyComputedDates(changedColumn: string): void {\n if (!this.formAssist?.computedDates) return;\n for (const rule of this.formAssist.computedDates) {\n if (rule.source !== changedColumn) continue;\n if (!this.computedDateAutoState[rule.dest]) continue;\n this.computeAndSetDate(rule);\n }\n }\n\n private computeAndSetDate(rule: ComputedDateRule): void {\n const sourceIndex = this.columnNames.indexOf(rule.source);\n const destIndex = this.columnNames.indexOf(rule.dest);\n if (sourceIndex === -1 || destIndex === -1) return;\n\n const sourceValue = this.columnValues[sourceIndex];\n if (!sourceValue) return;\n\n const sourceUs = parseInt(sourceValue, 10);\n if (isNaN(sourceUs)) return;\n\n const destUs = sourceUs + (rule.offsetMinutes * 60 * 1_000_000);\n const destValue = String(destUs);\n this.columnValues[destIndex] = destValue;\n\n // Update the visible control if it exists\n const visible = this.visibleColumns;\n const visibleIdx = visible.findIndex(v => v.index === destIndex);\n if (visibleIdx !== -1) {\n const control = this.controls?.get(visibleIdx);\n if (control) {\n control.value = destValue;\n }\n }\n }\n\n /** Toggle auto-compute for a computed date dest column. */\n onToggleComputedDate(destColumn: string): void {\n this.computedDateAutoState[destColumn] = !this.computedDateAutoState[destColumn];\n if (this.computedDateAutoState[destColumn]) {\n // Re-compute from source\n const rule = this.formAssist?.computedDates?.find(r => r.dest === destColumn);\n if (rule) {\n this.computeAndSetDate(rule);\n }\n }\n }\n\n /** Check if a column is a computed date dest in auto mode. */\n isComputedDateAuto(columnName: string): boolean {\n return this.computedDateAutoState[columnName] === true;\n }\n\n /** Get the computed date rule for a column, if any. */\n getComputedDateRule(columnName: string): ComputedDateRule | undefined {\n return this.formAssist?.computedDates?.find(r => r.dest === columnName);\n }\n\n private navigateBack() {\n if (this.returnUrl) {\n this.router.navigateByUrl(this.returnUrl);\n }\n }\n}\n","@if (loading) {\n<div>Loading...</div>\n}\n@if (!loading) {\n<!-- Back to Parent button -->\n@if (hasParent) {\n <button mat-stroked-button class=\"parent-button\" (click)=\"onNavigateToParent()\">\n <mat-icon>arrow_back</mat-icon>\n Back to {{ parentFriendlyName }}\n </button>\n}\n@if (showPhotoUpload) {\n <hw-photo-upload [tableName]=\"tableName\" [tableItemId]=\"photoItemId\" [deferUpload]=\"isCreateMode\"></hw-photo-upload>\n}\n<form>\n @for (entry of visibleColumns; track entry.col.column_name; let i = $index) {\n <hw-composite-control [dataInfo]=\"entry.col\"\n [value]=\"columnValues[entry.index]\"\n [readOnly]=\"isReadonlyColumn(entry.col) || isComputedDateAuto(entry.col.column_name)\"\n [foreignKeyInfo]=\"getForeignKeyInfo(entry.col)\"\n (valueChanged)=\"onValueChanged(i, $event)\">\n </hw-composite-control>\n @if (getComputedDateRule(entry.col.column_name); as rule) {\n <div class=\"computed-date-toggle\">\n <mat-checkbox [checked]=\"isComputedDateAuto(entry.col.column_name)\"\n (change)=\"onToggleComputedDate(entry.col.column_name)\">\n Auto-compute from {{ rule.source }} + {{ rule.offsetMinutes }} min\n </mat-checkbox>\n </div>\n }\n }\n <div class=\"form-actions\">\n <button type=\"button\" mat-raised-button color=\"primary\" class=\"submit-button\" (click)=\"onSubmit()\">\n {{ isCreateMode ? 'Create' : 'Update' }}\n </button>\n @if (returnUrl) {\n <button type=\"button\" mat-stroked-button class=\"cancel-button\" (click)=\"onCancel()\">\n Cancel\n </button>\n }\n </div>\n</form>\n<!-- Nested table cards (only in edit mode) -->\n@if (!isCreateMode && childTableReferences.length > 0) {\n <div class=\"nested-tables-section\">\n <h3>Related Tables</h3>\n <div class=\"nested-table-cards\">\n @for (ref of childTableReferences; track ref.childTableName + ref.foreignKey.column_name) {\n <button mat-stroked-button class=\"nested-table-card\" (click)=\"onNavigateToChild(ref)\">\n <mat-icon>subdirectory_arrow_right</mat-icon>\n {{ ref.childTableFriendlyName }}\n </button>\n }\n </div>\n </div>\n}\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Subject, combineLatest, takeUntil } from 'rxjs';\nimport { TableViewControlComponent } from '../table-view-control/table-view-control.component';\nimport { TableBinding } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-view-page',\n standalone: true,\n imports: [RouterModule, TableViewControlComponent],\n templateUrl: './table-view-page.component.html'\n})\nexport class TableViewPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n pageSize: number = 10;\n pageOffset: number = 0;\n bindingStack: TableBinding[] = [];\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams\n ]).pipe(takeUntil(this.destroy$)).subscribe(([params, queryParams]) => {\n this.tableName = params['tableName'] || '';\n this.pageSize = parseInt(params['pageSize'], 10) || 10;\n this.pageOffset = parseInt(params['pageOffset'], 10) || 0;\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">← Back to admin portal</a>\n<hw-table-view-control\n [tableName]=\"tableName\"\n [pageSize]=\"pageSize\"\n [pageOffset]=\"pageOffset\"\n [bindingStack]=\"bindingStack\">\n</hw-table-view-control>\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CompositeRowControlComponent } from '../composite-row-control/composite-row-control.component';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport { TableBinding } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-edit-page',\n standalone: true,\n imports: [\n RouterModule,\n MatCardModule,\n MatProgressSpinnerModule,\n MatIconModule,\n CompositeRowControlComponent\n],\n templateUrl: './table-edit-page.component.html',\n styleUrls: ['./table-edit-page.component.scss']\n})\nexport class TableEditPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n primaryKeyName: string = 'id';\n primaryKeyValue: string = '';\n columnNames: string[] = [];\n tableFriendlyName: string = '';\n returnUrl: string = '';\n bindingStack: TableBinding[] = [];\n loading: boolean = true;\n error?: string;\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n private dbSchemaService: DatabaseSchemaService,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams,\n this.dbSchemaService.GetDBSchema()\n ]).pipe(takeUntil(this.destroy$)).subscribe({\n next: ([params, queryParams, schema]) => {\n this.tableName = params['tableName'] || '';\n this.primaryKeyValue = params['id'] || '';\n this.returnUrl = queryParams['returnUrl'] || '';\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n\n const tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!tableSchema) {\n this.error = `Table \"${this.tableName}\" not found`;\n this.loading = false;\n return;\n }\n\n this.tableFriendlyName = tableSchema.table_friendly_name || this.tableName;\n this.primaryKeyName = tableSchema.primary_key;\n this.columnNames = tableSchema.columns.map(c => c.column_name);\n this.loading = false;\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n}\n@if (!loading && error) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n}\n@if (!loading && !error) {\n <div class=\"edit-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">← Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">Edit {{ tableFriendlyName }}</h1>\n <mat-card class=\"edit-card\">\n <mat-card-content>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [primaryKeyName]=\"primaryKeyName\"\n [primaryKeyValue]=\"primaryKeyValue\"\n [isCreateMode]=\"false\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\">\n </hw-composite-row-control>\n </mat-card-content>\n </mat-card>\n </div>\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\nimport { CompositeRowControlComponent } from '../composite-row-control/composite-row-control.component';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport { TableBinding, CrudFormAssist } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-new-page',\n standalone: true,\n imports: [RouterModule, CompositeRowControlComponent],\n templateUrl: './table-new-page.component.html',\n styleUrls: ['./table-new-page.component.scss']\n})\nexport class TableNewPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n columnNames: string[] = [];\n tableFriendlyName: string = '';\n returnUrl: string = '';\n bindingStack: TableBinding[] = [];\n formAssist?: CrudFormAssist;\n loading: boolean = true;\n error?: string;\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private dbSchemaService: DatabaseSchemaService,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n // Read formAssist from browser history state. Angular's router.navigate({ state })\n // stores data in the History API. getCurrentNavigation() is unreliable (returns null\n // for lazy-loaded routes), so we read directly from history.state instead.\n this.formAssist = history.state?.formAssist as CrudFormAssist | undefined;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams,\n this.dbSchemaService.GetDBSchema()\n ]).pipe(takeUntil(this.destroy$)).subscribe({\n next: ([params, queryParams, schema]) => {\n this.tableName = params['tableName'] || '';\n this.returnUrl = queryParams['returnUrl'] || '';\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n\n const tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!tableSchema) {\n this.error = `Table \"${this.tableName}\" not found`;\n this.loading = false;\n return;\n }\n\n this.tableFriendlyName = tableSchema.table_friendly_name || this.tableName;\n // Filter out primary key column for create mode (auto-generated)\n // Handle both boolean true and string \"t\" from server\n this.columnNames = tableSchema.columns\n .filter(c => c.primary_key !== true && (c.primary_key as unknown) !== 't')\n .map(c => c.column_name);\n this.loading = false;\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (loading) {\n <div class=\"loading\">Loading...</div>\n}\n@if (!loading && error) {\n <div class=\"error\">{{ error }}</div>\n}\n@if (!loading && !error) {\n <div class=\"new-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">← Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">New {{ tableFriendlyName }}</h1>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [isCreateMode]=\"true\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\"\n [formAssist]=\"formAssist\">\n </hw-composite-row-control>\n </div>\n}\n","/*\n * @honuware/ui/crud — the generic table editor: DatabaseSchemaService, the\n * table-binding utils, the table-view / composite-row containers, the\n * TableView/Edit/New pages, and the CRUD_EDITOR_ROUTES config token. Sits on\n * top of foundation + access + auth + controls + photos. Selectors use `hw-`.\n */\nexport { DatabaseSchemaService } from './database-schema.service';\n\nexport { serializeBindingStack, parseBindingStack, deriveFilterPairs } from './table-binding.utils';\n\nexport { CRUD_EDITOR_ROUTES, DEFAULT_CRUD_EDITOR_ROUTES } from './crud-editor-routes';\nexport type { CrudEditorRoutes } from './crud-editor-routes';\n\nexport { TableViewControlComponent } from './table-view-control/table-view-control.component';\nexport { CompositeRowControlComponent } from './composite-row-control/composite-row-control.component';\nexport type { ChildTableReference } from './composite-row-control/composite-row-control.component';\n\nexport { TableViewPageComponent } from './table-view-page/table-view-page.component';\nexport { TableEditPageComponent } from './table-edit-page/table-edit-page.component';\nexport { TableNewPageComponent } from './table-new-page/table-new-page.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DatabaseSchemaService","i3","i7","i2","i4","i5","i1"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAUa,qBAAqB,CAAA;AAWQ,IAAA,UAAA;AAC9B,IAAA,WAAA;AAXF,IAAA,OAAO;AACP,IAAA,cAAc,GAAG,IAAI,eAAe,CAA6B,SAAS,CAAC;AAC3E,IAAA,WAAW;IACX,gBAAgB,GAAG,KAAK;AACxB,IAAA,eAAe,GAAW,IAAI,CAAC;AACtB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhC,IAAA,OAAO,GAA2C,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IAEpG,WAAA,CACwC,UAAsB,EACpD,WAAwB,EAAA;QADM,IAAA,CAAA,UAAU,GAAV,UAAU;QACxC,IAAA,CAAA,WAAW,GAAX,WAAW;QAEnB,IAAI,CAAC,kBAAkB,EAAE;AAEzB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAC7B,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,EAChC,oBAAoB,EAAE,EACtB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CACpC,CAAC,SAAS,CAAC,MAAK;YACf,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,CAAC;IACJ;IAEQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,cAAc,EAAE;IACvB;IAEO,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;QACpB,IAAI,IAAI,CAAC,gBAAgB;YAAE;AAE3B,QAAA,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE;AAC/B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAE5B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CACnD,GAAG,CAAC,MAAM,IAAG;AACX,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACrB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAC7B,YAAA,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;AAChC,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC9B,QAAA,CAAC,CAAC,EACF,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;;YAE7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;AACrF,YAAA,OAAO,EAAE,CAAC,SAAS,CAAC;AACtB,QAAA,CAAC,CAAC,CACH,CAAC,SAAS,EAAE;IACf;AAEA;;AAEG;IACI,WAAW,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;QACzB;;QAEA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,MAAM,CAAC,CAAC,MAAM,KAA+B,CAAC,CAAC,MAAM,CAAC,EACtD,IAAI,CAAC,CAAC,CAAC,CACR;IACH;AAtEW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,kBAWtB,oBAAoB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAXnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;4FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAYI,MAAM;2BAAC,oBAAoB;;;ACnBhC;;;AAGG;AACG,SAAU,qBAAqB,CAAC,KAAqB,EAAA;IACzD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,CAAC,SAAS,CAAA,CAAA,EAAI,CAAC,CAAC,cAAc,CAAA,CAAA,EAAI,CAAC,CAAC,eAAe,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5F;AAEA;;;AAGG;AACG,SAAU,iBAAiB,CAAC,GAA8B,EAAA;AAC9D,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,EAAE;IACnB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAG;AACjC,QAAA,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AACtE,QAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE;AACvD,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;;;;AAQG;AACG,SAAU,iBAAiB,CAC/B,kBAA+B,EAC/B,YAA4B,EAAA;AAE5B,IAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;IAExC,MAAM,WAAW,GAAiB,EAAE;AACpC,IAAA,KAAK,MAAM,EAAE,IAAI,kBAAkB,CAAC,YAAY,EAAE;QAChD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAC/B,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,iBAAiB,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC,kBAAkB,CACxF;QACD,IAAI,OAAO,EAAE;YACX,WAAW,CAAC,IAAI,CAAC;gBACf,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,YAAY,EAAE,OAAO,CAAC,eAAe;AACtC,aAAA,CAAC;QACJ;IACF;AACA,IAAA,OAAO,WAAW;AACpB;;ACjCO,MAAM,0BAA0B,GAAqB;AAC1D,IAAA,QAAQ,EAAE,eAAe;AACzB,IAAA,SAAS,EAAE,QAAQ;;AAGrB;MACa,kBAAkB,GAAG,IAAI,cAAc,CAClD,oBAAoB,EACpB;AACE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,0BAA0B;AAC1C,CAAA;;MCeU,yBAAyB,CAAA;AAuB1B,IAAA,eAAA;AAC8B,IAAA,UAAA;AAC9B,IAAA,eAAA;AAC4B,IAAA,YAAA;AAC5B,IAAA,MAAA;AACA,IAAA,MAAA;AA3BD,IAAA,SAAS;IACT,QAAQ,GAAW,EAAE;IACrB,UAAU,GAAW,CAAC;AACtB,IAAA,UAAU;IACV,aAAa,GAAY,IAAI;IAC7B,YAAY,GAAmB,EAAE;AAE1C,IAAA,cAAc;AACd,IAAA,WAAW;IACX,OAAO,GAAqB,EAAE;IAC9B,gBAAgB,GAAa,EAAE;IAC/B,UAAU,GAA6B,EAAE;IACzC,UAAU,GAAW,CAAC;IACtB,OAAO,GAAY,IAAI;AACvB,IAAA,KAAK;IACL,oBAAoB,GAA0B,EAAE;;IAEhD,YAAY,GAA2C,EAAE;AAEzD,IAAA,eAAe,GAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IAEpD,WAAA,CACU,eAAsC,EACR,UAAsB,EACpD,eAAgC,EACJ,YAA8B,EAC1D,MAAc,EACd,MAAiB,EAAA;QALjB,IAAA,CAAA,eAAe,GAAf,eAAe;QACe,IAAA,CAAA,UAAU,GAAV,UAAU;QACxC,IAAA,CAAA,eAAe,GAAf,eAAe;QACa,IAAA,CAAA,YAAY,GAAZ,YAAY;QACxC,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,EAAE;IACjB;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC;AACpE,YAAA,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE;YAChF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE;gBACtC,IAAI,CAAC,QAAQ,EAAE;YACjB;QACF;IACF;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;AAEtB,QAAA,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC;AAC3C,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;AACf,gBAAA,IAAI,CAAC,cAAc,GAAG,MAAM;gBAC5B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC;AAC3E,gBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBACrB,IAAI,CAAC,KAAK,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,SAAS,uBAAuB;AAC5D,oBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;oBACpB;gBACF;gBAEA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;;AAEhF,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzD,IAAI,CAAC,gBAAgB,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;;gBAG7F,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;;AAGhE,gBAAA,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC;;gBAG1E,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW;gBAE/D,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAClC,IAAI,CAAC,SAAS,EACd,OAAO,EACP,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,UAAU,EACf,WAAW,CACZ,CAAC,SAAS,CAAC;AACV,oBAAA,IAAI,EAAE,CAAC,MAAM,KAAI;AACf,wBAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;;wBAEnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAG;4BAC3C,MAAM,GAAG,GAA2B,EAAE;4BACtC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,KAAI;gCAChD,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;AACzB,4BAAA,CAAC,CAAC;AACF,4BAAA,OAAO,GAAG;AACZ,wBAAA,CAAC,CAAC;wBACF,IAAI,CAAC,sBAAsB,EAAE;oBAC/B,CAAC;AACD,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,wBAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB;AAClC,wBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,wBAAA,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC;oBACjD;AACD,iBAAA,CAAC;YACJ,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,KAAK,GAAG,uBAAuB;AACpC,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC;YAC7C;AACD,SAAA,CAAC;IACJ;AAEQ,IAAA,uBAAuB,CAAC,MAAsB,EAAA;QACpD,MAAM,IAAI,GAA0B,EAAE;AACtC,QAAA,KAAK,MAAM,eAAe,IAAI,MAAM,CAAC,aAAa,EAAE;AAClD,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,eAAe,CAAC;AAC7E,YAAA,IAAI,CAAC,WAAW;gBAAE;AAClB,YAAA,KAAK,MAAM,EAAE,IAAI,WAAW,CAAC,YAAY,EAAE;gBACzC,IAAI,EAAE,CAAC,iBAAiB,KAAK,IAAI,CAAC,SAAS,EAAE;oBAC3C,IAAI,CAAC,IAAI,CAAC;AACR,wBAAA,cAAc,EAAE,eAAe;AAC/B,wBAAA,sBAAsB,EAAE,WAAW,CAAC,mBAAmB,IAAI,eAAe;AAC1E,wBAAA,UAAU,EAAE,EAAE;AACf,qBAAA,CAAC;gBACJ;YACF;QACF;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AACnE,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB;QACF;QAEA,MAAM,SAAS,GAAiE,EAAE;QAElF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;YAC9C,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAC9B,IAAI,CAAC;qBACF,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC;qBAC9B,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACpB,CAAC;AACF,YAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;gBAAE;YAC/B,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,EAAE,CAAC,WAAW;gBACvB,WAAW,EAAE,EAAE,CAAC,iBAAiB;AACjC,gBAAA,MAAM,EAAE,YAAY;AACrB,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB;QACF;;AAGA,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAClB,SAAS,CAAC,KAAK,IACb,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CACpE,GAAG,CAAC,QAAQ,IAAG;YACb,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,QAAQ;AACtD,QAAA,CAAC,CAAC,CACH,CACF,CACF,CAAC,SAAS,CAAC;YACV,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACtB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC;AACnD,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACtB;AACD,SAAA,CAAC;IACJ;IAEA,iBAAiB,CAAC,GAAwB,EAAE,GAA2B,EAAA;QACrE,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;AACpD,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE;AAE3C,QAAA,MAAM,QAAQ,GAAmB;YAC/B,GAAG,IAAI,CAAC,YAAY;AACpB,YAAA;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,gBAAA,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW;gBAC5C,eAAe;AAChB;SACF;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAC1E,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,EAAE,CAC1D;IACH;AAEQ,IAAA,WAAW,CAAC,KAA0B,EAAA;AAC5C,QAAA,OAAO,KAAK,KAAK,IAAI,IAAK,KAAiB,KAAK,GAAG;IACrD;IAEA,eAAe,CAAC,MAAsB,EAAE,KAAa,EAAA;AACnD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;;QAExB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;AACxD,QAAA,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;AACnC,YAAA,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B;QACA,IAAI,MAAM,CAAC,eAAe,KAAK,MAAM,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE;AACtE,YAAA,OAAO,kBAAkB,CAAC,KAAK,CAAC;QAClC;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,YAAY,CAAC,MAAsB,EAAA;AACjC,QAAA,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM;YAC3B,MAAM,CAAC,eAAe,KAAK,MAAM;AACjC,YAAA,MAAM,CAAC,eAAe,KAAK,UAAU;IACzC;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG;IAC3D;AAEA,IAAA,eAAe,CAAC,MAAsB,EAAA;AACpC,QAAA,OAAO,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,WAAW;IAC1D;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAC9D;AAEA,IAAA,WAAW,CAAC,GAA2B,EAAA;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;AACvC,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACxE;AAEA,IAAA,kBAAkB,CAAC,GAA2B,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE;IAClE;;AAGA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;IACnD;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;IAC5C;AAEA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;IACzE;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC;IAC5B;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;IAC9C;;IAGA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACxB;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC1C;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC1C;IACF;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IAC1C;;AAGQ,IAAA,mBAAmB,CAAC,KAA8B,EAAA;AACxD,QAAA,MAAM,MAAM,GAA2B,EAAE,GAAG,KAAK,EAAE;QACnD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAChC,MAAM,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC;QAC1D;AACA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,cAAc,CAAC,IAAY,EAAA;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EACzE,EAAE,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAC5C;IACH;AAEA,IAAA,gBAAgB,CAAC,WAAmB,EAAA;;AAElC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,EACpE,EAAE,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAC5C;IACH;;IAGA,SAAS,GAAA;AACP,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;YACxE,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE;AACpD,SAAA,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,GAA2B,EAAA;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;QACpD,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YACpG;QACF;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE;YAC1F,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE;AACpD,SAAA,CAAC;IACJ;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;AAEpC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AACrE,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAElD,MAAM,WAAW,GAA2B,EAAE;AAC9C,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,WAAW,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,WAAW,CAAC;QACzD;QAEA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EAC5F,EAAE,WAAW,EAAE,CAChB;IACH;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IACrC;AAEA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAC7C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,aAAa,CAAC,SAAS,CAAC;AACpG,QAAA,OAAO,YAAY,EAAE,mBAAmB,IAAI,aAAa,CAAC,SAAS;IACrE;AAEA,IAAA,WAAW,CAAC,GAA2B,EAAA;QACrC,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;QACpD,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,IAAI,IAAI;QAE5D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,IAAI,IAAI,CAAC,SAAS;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,gBAAgB;AACvB,gBAAA,WAAW,EAAE,CAAA,qCAAA,EAAwC,YAAY,CAAA,aAAA,EAAgB,eAAe,CAAA,EAAA,CAAI;AACpG,gBAAA,UAAU,EAAE,QAAQ;AACrB;AACF,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;YAC5C,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC;oBACpF,IAAI,EAAE,MAAK;;wBAET,IAAI,CAAC,QAAQ,EAAE;oBACjB,CAAC;AACD,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,wBAAA,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC;AACzC,wBAAA,IAAI,CAAC,KAAK,GAAG,sBAAsB;oBACrC;AACD,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;wGA9XW,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,qBAAA,EAAA,EAAA,EAAA,KAAA,EAwB1B,oBAAoB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAEpB,kBAAkB,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AA1BjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3CtC,irMA+JA,EAAA,MAAA,EAAA,CAAA,mtEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/HI,cAAc,sgCACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,29BACf,kBAAkB,EAAA,CAAA,EAAA,CAAA;;4FAKT,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAfrC,SAAS;+BACE,uBAAuB,EAAA,UAAA,EACrB,IAAI,EAAA,OAAA,EACP;wBACP,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,wBAAwB;wBACxB,eAAe;wBACf,eAAe;wBACf;AACH,qBAAA,EAAA,QAAA,EAAA,irMAAA,EAAA,MAAA,EAAA,CAAA,mtEAAA,CAAA,EAAA;;0BA4BI,MAAM;2BAAC,oBAAoB;;0BAE3B,MAAM;2BAAC,kBAAkB;;sBAzB3B;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;;MEfU,4BAA4B,CAAA;AA0B7B,IAAA,eAAA;AAC8B,IAAA,UAAA;AACF,IAAA,YAAA;AAC5B,IAAA,MAAA;AA5BD,IAAA,SAAS;AACT,IAAA,WAAW;AACX,IAAA,cAAc;AACd,IAAA,eAAe;AACf,IAAA,YAAY;AACZ,IAAA,SAAS;IACT,YAAY,GAAmB,EAAE;AACjC,IAAA,UAAU;AAEsB,IAAA,QAAQ;AAChB,IAAA,WAAW;IAE5C,WAAW,GAAqB,EAAE;IAClC,OAAO,GAAY,IAAI;AACvB,IAAA,YAAY,GAA2B,EAAE,CAAC;IAC1C,eAAe,GAAY,KAAK;IAChC,oBAAoB,GAA0B,EAAE;;AAExC,IAAA,oBAAoB,GAAgB,IAAI,GAAG,EAAE;AAC7C,IAAA,cAAc;AACd,IAAA,WAAW;;IAEnB,qBAAqB,GAA4B,EAAE;AAEnD,IAAA,WAAA,CACU,eAAsC,EACR,UAAsB,EACxB,YAA8B,EAC1D,MAAc,EAAA;QAHd,IAAA,CAAA,eAAe,GAAf,eAAe;QACe,IAAA,CAAA,UAAU,GAAV,UAAU;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACxC,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,EAAE;IACxB;IAEQ,eAAe,GAAA;QACrB,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACpD,YAAA,IAAI,CAAC,cAAc,GAAG,MAAM;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC;YACtE,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;gBACpB;YACF;AACA,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;YACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC;AAChE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,IAC7C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO,CAAE,CACxD;;YAGD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;;AAG/D,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;AAEzF,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE;;AAErE,gBAAA,MAAM,WAAW,GAAiB;oBAChC,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe;iBACvE;AACD,gBAAA,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;;oBAE7E,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,IAAG;wBACjD,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC;AAC3D,wBAAA,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS;AACrG,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACtB,gBAAA,CAAC,CAAC;YACJ;iBAAO;;gBAEL,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,IAAG;oBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;AACxD,oBAAA,IAAI,SAAS;AAAE,wBAAA,OAAO,SAAS;;AAE/B,oBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;wBACpE,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAC1C;AACA,oBAAA,OAAO,SAAS;AAClB,gBAAA,CAAC,CAAC;;gBAEF,IAAI,CAAC,qBAAqB,EAAE;AAC5B,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACtB;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACK,IAAA,uBAAuB,CAAC,KAAkB,EAAA;AAChD,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU;AACnC,QAAA,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE;AACnC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CACpC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,iBAAiB,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC,kBAAkB,CACxF;YACD,IAAI,OAAO,EAAE;AACX,gBAAA,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC;YAC/B;QACF;AACA,QAAA,OAAO,SAAS;IAClB;AAEA;;;AAGG;IACK,iBAAiB,CAAC,KAAkB,EAAE,UAAkB,EAAA;AAC9D,QAAA,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE;AACnC,YAAA,IAAI,EAAE,CAAC,WAAW,KAAK,UAAU;gBAAE;AACnC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CACpC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,iBAAiB,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC,kBAAkB,CACxF;YACD,IAAI,OAAO,EAAE;gBACX,OAAO,OAAO,CAAC,eAAe;YAChC;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;AACK,IAAA,uBAAuB,CAAC,MAAsB,EAAA;QACpD,MAAM,IAAI,GAA0B,EAAE;AACtC,QAAA,KAAK,MAAM,eAAe,IAAI,MAAM,CAAC,aAAa,EAAE;AAClD,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,eAAe,CAAC;AAC7E,YAAA,IAAI,CAAC,WAAW;gBAAE;AAClB,YAAA,KAAK,MAAM,EAAE,IAAI,WAAW,CAAC,YAAY,EAAE;gBACzC,IAAI,EAAE,CAAC,iBAAiB,KAAK,IAAI,CAAC,SAAS,EAAE;oBAC3C,IAAI,CAAC,IAAI,CAAC;AACR,wBAAA,cAAc,EAAE,eAAe;AAC/B,wBAAA,sBAAsB,EAAE,WAAW,CAAC,mBAAmB,IAAI,eAAe;AAC1E,wBAAA,UAAU,EAAE,EAAE;AACf,qBAAA,CAAC;gBACJ;YACF;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC;AACT,aAAA,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACpC,aAAA,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAI;AAClB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,gBAAA,OAAO,KAAK;YAC9C,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,YAAY;AAAE,gBAAA,OAAO,KAAK;AACrE,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACN;;AAGA,IAAA,gBAAgB,CAAC,GAAmB,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ;eAC/D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;IACrD;;AAGA,IAAA,iBAAiB,CAAC,GAAmB,EAAA;QACnC,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;IACvD;IAEA,cAAc,CAAC,KAAa,EAAE,KAAa,EAAA;AACzC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc;AACnC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxC,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,GAAG,KAAK;QACvB;;QAEA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK;;QAEtC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IAChD;IAEA,gBAAgB,GAAA;QACd,MAAM,MAAM,GAAuC,EAAE;AACrD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc;QACnC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;AAC1B,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;AACrB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE;;;AAGpC,YAAA,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE;AAC9D,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK;AACvD,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,gBAAgB,CAAC,IAAY,EAAA;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;QAChC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM;IACpE;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACtC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,MAAM,IAAI,GAAgB;gBACxB,UAAU,EAAE,IAAI,CAAC,SAAS;AAC1B,gBAAA,KAAK,EAAE;aACR;AACD,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxB,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AACrD,oBAAA,IAAI,EAAE,CAAC,UAAU,KAAI;AACnB,wBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;AACpC,4BAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,gCAAA,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;AAC/B,gCAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oCAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC;oCAC5C,IAAI,CAAC,YAAY,EAAE;gCACrB;AACD,6BAAA,CAAC;wBACJ;6BAAO;4BACL,IAAI,CAAC,YAAY,EAAE;wBACrB;oBACF,CAAC;AACD,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG;AAC1D,iBAAA,CAAC;YACJ;iBAAO;gBACL,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AACtC,oBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;AAC/B,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG;AAC1D,iBAAA,CAAC;YACJ;QACF;aAAO;YACL,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,eAAe;gBAAE;AACnD,YAAA,MAAM,IAAI,GAAmB;gBAC3B,UAAU,EAAE,IAAI,CAAC,SAAS;AAC1B,gBAAA,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,IAAI,CAAC,cAAc;gBAChC,YAAY,EAAE,IAAI,CAAC;aACpB;YACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AACzC,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;AAC/B,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG;AAC1D,aAAA,CAAC;QACJ;IACF;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,EAAE;IACrB;AAEQ,IAAA,WAAW,CAAC,KAA0B,EAAA;AAC5C,QAAA,OAAO,KAAK,KAAK,IAAI,IAAK,KAAiB,KAAK,GAAG;IACrD;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,eAAe;AAAE,YAAA,OAAO,KAAK;QACvC,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,IAAI;AAClC,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe;IAC/B;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,CAAC;AAC/B,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;IACrC;AAEA,IAAA,iBAAiB,CAAC,GAAmB,EAAA;QACnC,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,CAAC;IACtF;AAEA,IAAA,kBAAkB,CAAC,GAAmB,EAAA;QACpC,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,KAAK;;QAEnC,OAAO,GAAG,CAAC,WAAW,KAAK,IAAI,IAAK,GAAG,CAAC,WAAuB,KAAK,GAAG;IACzE;;AAIA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IACrC;AAEA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAC7C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,aAAa,CAAC,SAAS,CAAC;AACpG,QAAA,OAAO,YAAY,EAAE,mBAAmB,IAAI,aAAa,CAAC,SAAS;IACrE;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;AAEpC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AACrE,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAElD,MAAM,WAAW,GAA2B,EAAE;AAC9C,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,WAAW,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,WAAW,CAAC;QACzD;QAEA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EAC5F,EAAE,WAAW,EAAE,CAChB;IACH;;AAGA,IAAA,iBAAiB,CAAC,GAAwB,EAAA;QACxC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE;;AAGhD,QAAA,MAAM,QAAQ,GAAmB;YAC/B,GAAG,IAAI,CAAC,YAAY;AACpB,YAAA;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,gBAAA,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW;gBAC5C,eAAe,EAAE,IAAI,CAAC,eAAe;AACtC;SACF;AAED,QAAA,MAAM,WAAW,GAA2B;AAC1C,YAAA,GAAG,EAAE,qBAAqB,CAAC,QAAQ,CAAC;SACrC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAC/D,EAAE,WAAW,EAAE,CAChB;IACH;;IAIQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa;YAAE;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;YAChD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa;QAC5D;IACF;;AAGQ,IAAA,kBAAkB,CAAC,aAAqB,EAAA;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa;YAAE;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;AAChD,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa;gBAAE;YACnC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE;AAC5C,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC9B;IACF;AAEQ,IAAA,iBAAiB,CAAC,IAAsB,EAAA;AAC9C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AACzD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QACrD,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC;YAAE;QAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAClD,QAAA,IAAI,CAAC,WAAW;YAAE;QAElB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC;YAAE;AAErB,QAAA,MAAM,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,SAAS,CAAC;AAC/D,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,SAAS;;AAGxC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc;AACnC,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;AAChE,QAAA,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC;YAC9C,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,KAAK,GAAG,SAAS;YAC3B;QACF;IACF;;AAGA,IAAA,oBAAoB,CAAC,UAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;AAChF,QAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE;;YAE1C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;YAC7E,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC9B;QACF;IACF;;AAGA,IAAA,kBAAkB,CAAC,UAAkB,EAAA;QACnC,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,KAAK,IAAI;IACxD;;AAGA,IAAA,mBAAmB,CAAC,UAAkB,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;IACzE;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3C;IACF;wGAhZW,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,qBAAA,EAAA,EAAA,EAAA,KAAA,EA2B7B,oBAAoB,EAAA,EAAA,EAAA,KAAA,EACpB,kBAAkB,EAAA,EAAA,EAAA,KAAA,EAAAG,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AA5BjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAW5B,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EADjB,yBAAyB,gDC5CzC,0uEAyDA,EAAA,MAAA,EAAA,CAAA,0kBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3BY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,yJAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIjG,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,yBAAyB,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,0uEAAA,EAAA,MAAA,EAAA,CAAA,0kBAAA,CAAA,EAAA;;0BA+B1G,MAAM;2BAAC,oBAAoB;;0BAC3B,MAAM;2BAAC,kBAAkB;;sBA3B3B;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA,YAAY;uBAAC,yBAAyB;;sBACtC,SAAS;uBAAC,oBAAoB;;;ME9BpB,sBAAsB,CAAA;AAUvB,IAAA,KAAA;IATV,SAAS,GAAW,EAAE;IACtB,QAAQ,GAAW,EAAE;IACrB,UAAU,GAAW,CAAC;IACtB,YAAY,GAAmB,EAAE;AACxB,IAAA,SAAS;AAEV,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;IAEtC,WAAA,CACU,KAAqB,EACD,YAA8B,EAAA;QADlD,IAAA,CAAA,KAAK,GAAL,KAAK;AAGb,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS;IACzC;IAEA,QAAQ,GAAA;AACN,QAAA,aAAa,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,MAAM;YACjB,IAAI,CAAC,KAAK,CAAC;SACZ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,KAAI;YACpE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;AAC1C,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE;AACtD,YAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;YACzD,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC3D,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AA/BW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,kDAWvB,kBAAkB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAXjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfnC,oTAOA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDKY,YAAY,kRAAE,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAGtC,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,yBAAyB,CAAC,EAAA,QAAA,EAAA,oTAAA,EAAA;;0BAc/C,MAAM;2BAAC,kBAAkB;;;MEAjB,sBAAsB,CAAA;AAevB,IAAA,KAAA;AACA,IAAA,eAAA;IAfV,SAAS,GAAW,EAAE;IACtB,cAAc,GAAW,IAAI;IAC7B,eAAe,GAAW,EAAE;IAC5B,WAAW,GAAa,EAAE;IAC1B,iBAAiB,GAAW,EAAE;IAC9B,SAAS,GAAW,EAAE;IACtB,YAAY,GAAmB,EAAE;IACjC,OAAO,GAAY,IAAI;AACvB,IAAA,KAAK;AACI,IAAA,SAAS;AAEV,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEtC,IAAA,WAAA,CACU,KAAqB,EACrB,eAAsC,EAClB,YAA8B,EAAA;QAFlD,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,eAAe,GAAf,eAAe;AAGvB,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS;IACzC;IAEA,QAAQ,GAAA;AACN,QAAA,aAAa,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,MAAM;YACjB,IAAI,CAAC,KAAK,CAAC,WAAW;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,WAAW;AACjC,SAAA,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,KAAI;gBACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC1C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;gBACzC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC/C,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAEzD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC;gBAC5E,IAAI,CAAC,WAAW,EAAE;oBAChB,IAAI,CAAC,KAAK,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,SAAS,aAAa;AAClD,oBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;oBACpB;gBACF;gBAEA,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,mBAAmB,IAAI,IAAI,CAAC,SAAS;AAC1E,gBAAA,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,WAAW;AAC7C,gBAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;AAC9D,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACtB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,KAAK,GAAG,uBAAuB;AACpC,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC;YAC7C;AACD,SAAA,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AAzDW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,oFAiBvB,kBAAkB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAjBjB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BnC,ohCA+BA,EAAA,MAAA,EAAA,CAAA,iaAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDdI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,4BAA4B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAblC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,aAAa;wBACb,wBAAwB;wBACxB,aAAa;wBACb;AACH,qBAAA,EAAA,QAAA,EAAA,ohCAAA,EAAA,MAAA,EAAA,CAAA,iaAAA,CAAA,EAAA;;0BAqBI,MAAM;2BAAC,kBAAkB;;;ME1BjB,qBAAqB,CAAA;AActB,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,eAAA;IAfV,SAAS,GAAW,EAAE;IACtB,WAAW,GAAa,EAAE;IAC1B,iBAAiB,GAAW,EAAE;IAC9B,SAAS,GAAW,EAAE;IACtB,YAAY,GAAmB,EAAE;AACjC,IAAA,UAAU;IACV,OAAO,GAAY,IAAI;AACvB,IAAA,KAAK;AACI,IAAA,SAAS;AAEV,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEtC,IAAA,WAAA,CACU,KAAqB,EACrB,MAAc,EACd,eAAsC,EAClB,YAA8B,EAAA;QAHlD,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,eAAe,GAAf,eAAe;AAGvB,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS;;;;QAIvC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,UAAwC;IAC3E;IAEA,QAAQ,GAAA;AACN,QAAA,aAAa,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,MAAM;YACjB,IAAI,CAAC,KAAK,CAAC,WAAW;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,WAAW;AACjC,SAAA,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,KAAI;gBACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC1C,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC/C,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAEzD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC;gBAC5E,IAAI,CAAC,WAAW,EAAE;oBAChB,IAAI,CAAC,KAAK,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,SAAS,aAAa;AAClD,oBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;oBACpB;gBACF;gBAEA,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,mBAAmB,IAAI,IAAI,CAAC,SAAS;;;AAG1E,gBAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAC5B,qBAAA,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,IAAK,CAAC,CAAC,WAAuB,KAAK,GAAG;qBACxE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;AAC1B,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACtB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,KAAK,GAAG,uBAAuB;AACpC,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC;YAC7C;AACD,SAAA,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AA/DW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,4GAiBtB,kBAAkB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAjBjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBlC,usBAoBA,EAAA,MAAA,EAAA,CAAA,6GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDPY,YAAY,kRAAE,4BAA4B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIzC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,4BAA4B,CAAC,EAAA,QAAA,EAAA,usBAAA,EAAA,MAAA,EAAA,CAAA,6GAAA,CAAA,EAAA;;0BAqBlD,MAAM;2BAAC,kBAAkB;;;AElC9B;;;;;AAKG;;ACLH;;AAEG;;;;"}
|