@nexterajs/ui 0.0.1 → 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 +279 -34
- package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
- package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-core.mjs +835 -11
- package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-display.mjs +1142 -0
- package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs +621 -69
- package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-file-uploader.mjs +576 -11
- package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-forms.mjs +2702 -452
- package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-grid.mjs +2350 -336
- package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-intl.mjs +117 -15
- package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
- package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-notify.mjs +353 -0
- package/fesm2022/nexterajs-ui-notify.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
- package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-pivot.mjs +191 -136
- package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-shell.mjs +542 -0
- package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-styling.mjs +568 -3
- package/fesm2022/nexterajs-ui-styling.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-tree-view.mjs +150 -18
- package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-validation.mjs +283 -97
- package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
- package/fesm2022/nexterajs-ui.mjs +6 -0
- package/fesm2022/nexterajs-ui.mjs.map +1 -1
- package/package.json +37 -2
- package/styles/_dropdown.scss +150 -1
- package/styles/_editor.scss +75 -21
- package/styles/_icons.scss +92 -0
- package/styles/_mixins.scss +104 -1
- package/styles/_scrollbar.scss +134 -0
- package/styles/_status.scss +21 -0
- package/styles/_toast.scss +243 -0
- package/styles/_tokens.scss +467 -2
- package/styles/_widget.scss +14 -3
- package/styles/index.scss +10 -4
- package/types/nexterajs-ui-charts.d.ts +446 -0
- package/types/nexterajs-ui-core.d.ts +515 -30
- package/types/nexterajs-ui-display.d.ts +720 -0
- package/types/nexterajs-ui-dropdowns.d.ts +318 -57
- package/types/nexterajs-ui-file-uploader.d.ts +240 -8
- package/types/nexterajs-ui-forms.d.ts +772 -43
- package/types/nexterajs-ui-grid.d.ts +878 -135
- package/types/nexterajs-ui-intl.d.ts +39 -4
- package/types/nexterajs-ui-navigation.d.ts +531 -0
- package/types/nexterajs-ui-notify.d.ts +149 -0
- package/types/nexterajs-ui-overlay.d.ts +703 -0
- package/types/nexterajs-ui-pivot.d.ts +91 -70
- package/types/nexterajs-ui-shell.d.ts +294 -0
- package/types/nexterajs-ui-styling.d.ts +163 -3
- package/types/nexterajs-ui-tree-view.d.ts +56 -4
- package/types/nexterajs-ui-validation.d.ts +110 -22
- package/types/nexterajs-ui.d.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nexterajs-ui-file-uploader.mjs","sources":["../../../projects/nextera-ui/file-uploader/src/lib/file-uploader/nxe-file-uploader.component.ts","../../../projects/nextera-ui/file-uploader/src/lib/file-uploader/nxe-file-uploader.component.html","../../../projects/nextera-ui/file-uploader/src/public-api.ts","../../../projects/nextera-ui/file-uploader/src/nexterajs-ui-file-uploader.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n NXE_VALIDATION_TARGET,\r\n NxeValidationTarget,\r\n} from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-file-uploader` — drop-in replacement for DevExtreme `dx-file-uploader`.\r\n *\r\n * Both usages run `uploadMode=\"useForm\"` (the widget never POSTs — the picked File is read by the\r\n * parent and appended to a FormData) and bind the NATIVE `(change)` event, reading\r\n * `$event.target.files[0]`. So this re-emits the inner `<input type=file>` change event verbatim\r\n * via a `change` output, preserving `$event.target.files[0]`. Drag-drop assigns the dropped\r\n * files to the hidden input and dispatches a change, keeping the same contract. Provides\r\n * {@link NXE_VALIDATION_TARGET} (value = the selected File) so a nested `nxe-validator`'s\r\n * `required` rule works — invalid while no file is chosen.\r\n */\r\n@Component({\r\n selector: 'nxe-file-uploader',\r\n standalone: true,\r\n templateUrl: './nxe-file-uploader.component.html',\r\n styleUrl: './nxe-file-uploader.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-file-uploader',\r\n '[class.nxe-fileuploader-empty]': '!file()',\r\n '[class.nxe-fileuploader-dragover]': 'dragOver()',\r\n '[class.nxe-fileuploader-invalid]': '!!validationError()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n '[class.nxe-focused]': 'focused()',\r\n '(dragover)': 'onDragOver($event)',\r\n '(dragleave)': 'onDragLeave()',\r\n '(drop)': 'onDrop($event)',\r\n },\r\n providers: [\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeFileUploaderComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeFileUploaderComponent implements NxeValidationTarget {\r\n readonly allowCanceling = input(false);\r\n readonly accept = input('*');\r\n readonly labelText = input('or Drop here');\r\n readonly selectButtonText = input('Select File');\r\n /** Accepted for parity; only `useForm` is used (no server upload by the widget). */\r\n readonly uploadMode = input<'instantly' | 'useButtons' | 'useForm'>('useForm');\r\n readonly multiple = input(false);\r\n readonly name = input<string>('files[]');\r\n /** Group for a nested nxe-validator (none used today → bare default group). */\r\n readonly validationGroupInput = input<string | undefined>(undefined, {\r\n alias: 'validationGroup',\r\n });\r\n\r\n /** Re-emits the native `<input type=file>` change so `$event.target.files[0]` keeps working. */\r\n readonly change = output<Event>();\r\n\r\n private readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\r\n\r\n readonly file = signal<File | null>(null);\r\n readonly dragOver = signal(false);\r\n readonly focused = signal(false);\r\n readonly validationError = signal<string | null>(null);\r\n\r\n // --- NXE_VALIDATION_TARGET -------------------------------------------------------------\r\n getValue(): unknown {\r\n return this.file();\r\n }\r\n validationGroup(): string | undefined {\r\n return this.validationGroupInput();\r\n }\r\n setValidationError(message: string | null): void {\r\n this.validationError.set(message);\r\n }\r\n\r\n protected browse(): void {\r\n this.fileInput().nativeElement.click();\r\n }\r\n\r\n protected onNativeChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.file.set(input.files?.[0] ?? null);\r\n this.change.emit(event);\r\n }\r\n\r\n protected cancel(): void {\r\n const input = this.fileInput().nativeElement;\r\n input.value = '';\r\n // Re-runs onNativeChange (now with empty files) so the bound form control clears too.\r\n input.dispatchEvent(new Event('change'));\r\n }\r\n\r\n protected onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragOver.set(true);\r\n }\r\n\r\n protected onDragLeave(): void {\r\n this.dragOver.set(false);\r\n }\r\n\r\n protected onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragOver.set(false);\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length) {\r\n const input = this.fileInput().nativeElement;\r\n input.files = files;\r\n input.dispatchEvent(new Event('change'));\r\n }\r\n }\r\n\r\n protected formatSize(bytes: number): string {\r\n if (bytes < 1024) {\r\n return `${bytes} b`;\r\n }\r\n if (bytes < 1024 * 1024) {\r\n return `${(bytes / 1024).toFixed(1)} Kb`;\r\n }\r\n return `${(bytes / 1024 / 1024).toFixed(1)} Mb`;\r\n }\r\n}\r\n","<div class=\"nxe-fileuploader-wrapper\">\r\n <div class=\"nxe-fileuploader-container\">\r\n <div class=\"nxe-fileuploader-content\">\r\n <div class=\"nxe-fileuploader-input-wrapper\">\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-button nxe-fileuploader-upload-button\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (click)=\"browse()\">\r\n {{ selectButtonText() }}\r\n </button>\r\n <div class=\"nxe-fileuploader-input-container\">\r\n <input\r\n #fileInput\r\n class=\"nxe-fileuploader-input\"\r\n type=\"file\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (change)=\"onNativeChange($event)\" />\r\n <span class=\"nxe-fileuploader-input-label\">{{ labelText() }}</span>\r\n </div>\r\n </div>\r\n\r\n @if (file(); as f) {\r\n <div class=\"nxe-fileuploader-files-container\">\r\n <div class=\"nxe-fileuploader-file-container\">\r\n <div class=\"nxe-fileuploader-file\">\r\n <div class=\"nxe-fileuploader-file-info\">\r\n <span class=\"nxe-fileuploader-file-name\">{{ f.name }}</span>\r\n <span class=\"nxe-fileuploader-file-size\">{{ formatSize(f.size) }}</span>\r\n </div>\r\n </div>\r\n @if (allowCanceling()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-cancel-button\"\r\n title=\"Cancel\"\r\n (click)=\"cancel()\">\r\n ×\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (validationError(); as err) {\r\n <div class=\"nxe-fileuploader-error\">{{ err }}</div>\r\n}\r\n\r\n<ng-content />\r\n","// @nexterajs/ui/file-uploader — public API.\r\nexport * from './lib/file-uploader/nxe-file-uploader.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nexterajs-ui-file-uploader.mjs","sources":["../../../projects/nextera-ui/file-uploader/src/lib/file-uploader/nxe-file-uploader.component.ts","../../../projects/nextera-ui/file-uploader/src/lib/file-uploader/nxe-file-uploader.component.html","../../../projects/nextera-ui/file-uploader/src/lib/file-input/nxe-file-input.types.ts","../../../projects/nextera-ui/file-uploader/src/lib/file-input/nxe-file-input.component.ts","../../../projects/nextera-ui/file-uploader/src/lib/file-input/nxe-file-input.component.html","../../../projects/nextera-ui/file-uploader/src/public-api.ts","../../../projects/nextera-ui/file-uploader/src/nexterajs-ui-file-uploader.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n NXE_VALIDATION_TARGET,\n NxeMessageService,\n NxeValidationTarget,\n} from '@nexterajs/ui/core';\n\n/**\n * `nxe-file-uploader` — drop-in replacement for DevExtreme `dx-file-uploader`.\n *\n * Both usages run `uploadMode=\"useForm\"` (the widget never POSTs — the picked File is read by the\n * parent and appended to a FormData) and bind the NATIVE `(change)` event, reading\n * `$event.target.files[0]`. So this re-emits the inner `<input type=file>` change event verbatim\n * via a `change` output, preserving `$event.target.files[0]`. Drag-drop assigns the dropped\n * files to the hidden input and dispatches a change, keeping the same contract. Provides\n * {@link NXE_VALIDATION_TARGET} (value = the selected File) so a nested `nxe-validator`'s\n * `required` rule works — invalid while no file is chosen.\n */\n@Component({\n selector: 'nxe-file-uploader',\n standalone: true,\n templateUrl: './nxe-file-uploader.component.html',\n styleUrl: './nxe-file-uploader.component.scss',\n host: {\n class: 'nxe-widget nxe-file-uploader',\n '[class.nxe-fileuploader-empty]': '!file()',\n '[class.nxe-fileuploader-dragover]': 'dragOver()',\n '[class.nxe-fileuploader-invalid]': '!!validationError()',\n '[class.nxe-invalid]': '!!validationError()',\n '[class.nxe-focused]': 'focused()',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave()',\n '(drop)': 'onDrop($event)',\n },\n providers: [\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeFileUploaderComponent) },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeFileUploaderComponent implements NxeValidationTarget {\n /** Shows the per-file cancel button — except in `useForm` mode, where dx never renders one\n * (m_file_uploader.js `_getCancelButton` returns null for useForm before it reads this). */\n readonly allowCanceling = input(false);\n readonly accept = input('*');\n /** Text beside the button; the active language's \"or Drop here\" when unset. */\n readonly labelText = input<string | undefined>(undefined);\n /** The button's text; the active language's \"Select File\" when unset. */\n readonly selectButtonText = input<string | undefined>(undefined);\n /** Accepted for parity; only `useForm` is used (no server upload by the widget). It also\n * gates the cancel button, which dx omits in `useForm` mode. */\n readonly uploadMode = input<'instantly' | 'useButtons' | 'useForm'>('useForm');\n readonly multiple = input(false);\n readonly name = input<string>('files[]');\n /** Group for a nested nxe-validator (none used today → bare default group). */\n readonly validationGroupInput = input<string | undefined>(undefined, {\n alias: 'validationGroup',\n });\n\n /** Re-emits the native `<input type=file>` change so `$event.target.files[0]` keeps working. */\n readonly change = output<Event>();\n\n private readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\n\n /** The library's runtime-switchable messages. */\n protected readonly messages = inject(NxeMessageService);\n\n readonly file = signal<File | null>(null);\n readonly dragOver = signal(false);\n readonly focused = signal(false);\n readonly validationError = signal<string | null>(null);\n\n // --- NXE_VALIDATION_TARGET -------------------------------------------------------------\n getValue(): unknown {\n return this.file();\n }\n validationGroup(): string | undefined {\n return this.validationGroupInput();\n }\n setValidationError(message: string | null): void {\n this.validationError.set(message);\n }\n\n protected browse(): void {\n this.fileInput().nativeElement.click();\n }\n\n protected onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.file.set(input.files?.[0] ?? null);\n this.change.emit(event);\n }\n\n protected cancel(): void {\n const input = this.fileInput().nativeElement;\n input.value = '';\n // Re-runs onNativeChange (now with empty files) so the bound form control clears too.\n input.dispatchEvent(new Event('change'));\n }\n\n protected onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.dragOver.set(true);\n }\n\n protected onDragLeave(): void {\n this.dragOver.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragOver.set(false);\n const files = event.dataTransfer?.files;\n if (files && files.length) {\n const input = this.fileInput().nativeElement;\n input.files = files;\n input.dispatchEvent(new Event('change'));\n }\n }\n\n protected formatSize(bytes: number): string {\n if (bytes < 1024) {\n return this.messages.t('uploader.sizeB', bytes);\n }\n if (bytes < 1024 * 1024) {\n return this.messages.t('uploader.sizeKb', (bytes / 1024).toFixed(1));\n }\n return this.messages.t('uploader.sizeMb', (bytes / 1024 / 1024).toFixed(1));\n }\n}\n","<div class=\"nxe-fileuploader-wrapper\">\r\n <div class=\"nxe-fileuploader-container\">\r\n <div class=\"nxe-fileuploader-content\">\r\n <div class=\"nxe-fileuploader-input-wrapper\">\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-button nxe-fileuploader-upload-button\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (click)=\"browse()\">\r\n {{ selectButtonText() ?? messages.t('uploader.selectFile') }}\r\n </button>\r\n <div class=\"nxe-fileuploader-input-container\">\r\n <input\r\n #fileInput\r\n class=\"nxe-fileuploader-input\"\r\n type=\"file\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (change)=\"onNativeChange($event)\" />\r\n <span class=\"nxe-fileuploader-input-label\">{{ labelText() ?? messages.t('uploader.dropHere') }}</span>\r\n </div>\r\n </div>\r\n\r\n @if (file(); as f) {\r\n <div class=\"nxe-fileuploader-files-container\">\r\n <div class=\"nxe-fileuploader-file-container\">\r\n <div class=\"nxe-fileuploader-file\">\r\n <div class=\"nxe-fileuploader-file-info\">\r\n <span class=\"nxe-fileuploader-file-name\">{{ f.name }}</span>\r\n <span class=\"nxe-fileuploader-file-size\">{{ formatSize(f.size) }}</span>\r\n </div>\r\n </div>\r\n <!-- dx renders no cancel button at all in useForm mode: _getCancelButton\r\n returns null before it reads allowCanceling\r\n (m_file_uploader.js:535-537). -->\r\n @if (allowCanceling() && uploadMode() !== 'useForm') {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-cancel-button\"\r\n [attr.title]=\"messages.t('uploader.cancel')\"\r\n (click)=\"cancel()\">\r\n ×\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (validationError(); as err) {\r\n <div class=\"nxe-fileuploader-error\">{{ err }}</div>\r\n}\r\n\r\n<ng-content />\r\n","import type { HttpEvent } from '@angular/common/http';\r\nimport type { Observable } from 'rxjs';\r\n\r\n/** Where a file is in its life: chosen, on its way to the server, there, or failed. */\r\nexport type NxeFileStatus = 'pending' | 'uploading' | 'uploaded' | 'error';\r\n\r\n/**\r\n * One entry of the value of `nxe-file-input`: the file chosen, and what became of it.\r\n *\r\n * Descriptors are immutable; every change produces a new array of new objects. `file` is there while\r\n * the browser still holds the `File` (a descriptor the server handed back has `serverId` and `url`\r\n * instead), so a form without an upload can read the files straight from the value.\r\n */\r\nexport interface NxeFileDescriptor {\r\n /** Stable for the life of the entry; what `track` and the remove/retry/cancel calls use. */\r\n readonly id: string;\r\n readonly name: string;\r\n /** Bytes. */\r\n readonly size: number;\r\n /** MIME type as the browser reported it; may be empty. */\r\n readonly type: string;\r\n readonly status: NxeFileStatus;\r\n /** 0 to 100. Live while `uploading`; the value in the form is refreshed at each status change. */\r\n readonly progress: number;\r\n /** Why the upload failed or was cancelled. */\r\n readonly error?: string;\r\n readonly file?: File;\r\n /** The server's id for the stored file, once uploaded. */\r\n readonly serverId?: string;\r\n /** Where the stored file can be fetched, once uploaded. */\r\n readonly url?: string;\r\n}\r\n\r\n/** What an `uploadFn` may emit besides an `HttpEvent`: progress, and optionally the stored file's id and url. */\r\nexport interface NxeUploadProgress {\r\n /** 0 to 100. */\r\n readonly progress: number;\r\n readonly serverId?: string;\r\n readonly url?: string;\r\n}\r\n\r\n/** An event of an upload: an Angular `HttpEvent` (with `reportProgress`), `{ progress }`, or a bare percentage. */\r\nexport type NxeUploadEvent = HttpEvent<unknown> | NxeUploadProgress | number;\r\n\r\n/** What `uploadFn` receives besides the file. */\r\nexport interface NxeUploadContext {\r\n /** Aborted when the user cancels or removes the file; pass it to `fetch`, or ignore it and unsubscribe. */\r\n readonly signal: AbortSignal;\r\n readonly descriptor: NxeFileDescriptor;\r\n}\r\n\r\n/**\r\n * Uploads one file. Emit progress as it happens and complete when the file is stored; an error is a failed\r\n * upload. Unsubscribing is how a cancel reaches you, as it is for `HttpClient`.\r\n */\r\nexport type NxeUploadFn = (file: File, context: NxeUploadContext) => Observable<NxeUploadEvent>;\r\n\r\n/** What the server's response body says about the stored file. */\r\nexport interface NxeUploadResult {\r\n readonly serverId?: string;\r\n readonly url?: string;\r\n}\r\n\r\n/** Why a file cannot be kept, in the order the rules are checked. */\r\nexport type NxeFileIssueKind = 'fileType' | 'fileSize' | 'maxFiles';\r\n\r\n/** Whether `file` matches an `accept` list: `.pdf`, `application/pdf`, `image/*`, comma separated. Empty or `*` accepts all. */\r\nexport function nxeFileAccepted(file: { readonly name: string; readonly type: string }, accept: string): boolean {\r\n const tokens = accept\r\n .split(',')\r\n .map((token) => token.trim().toLowerCase())\r\n .filter((token) => token !== '');\r\n if (tokens.length === 0 || tokens.includes('*') || tokens.includes('*/*')) {\r\n return true;\r\n }\r\n const name = file.name.toLowerCase();\r\n const type = file.type.toLowerCase();\r\n return tokens.some((token) => {\r\n if (token.startsWith('.')) {\r\n return name.endsWith(token);\r\n }\r\n if (token.endsWith('/*')) {\r\n return type.startsWith(token.slice(0, -1));\r\n }\r\n return type === token;\r\n });\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpEventType } from '@angular/common/http';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\nimport { NXE_VALIDATION_TARGET, NxeFormControlBase, nxeFormatFileSize, type NxeMessageKey } from '@nexterajs/ui/core';\nimport { Observable, Subscription, throwError } from 'rxjs';\nimport {\n nxeFileAccepted,\n type NxeFileDescriptor,\n type NxeFileIssueKind,\n type NxeUploadEvent,\n type NxeUploadFn,\n type NxeUploadResult,\n} from './nxe-file-input.types';\n\n/** One row of the list, with everything the template shows already worked out. */\ninterface FileRow {\n readonly file: NxeFileDescriptor;\n /** Why this file cannot be kept (wrong type, too big, over the count), or `null`. */\n readonly issue: { readonly kind: NxeFileIssueKind; readonly message: string } | null;\n readonly sizeText: string;\n readonly statusText: string;\n readonly failed: boolean;\n readonly canRetry: boolean;\n}\n\nfunction numberOrUndefined(value: unknown): number | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** The server's reply to an upload, read as `{ serverId | id, url }`. */\nfunction defaultResult(body: unknown): NxeUploadResult {\n if (typeof body !== 'object' || body === null) {\n return {};\n }\n const record = body as Record<string, unknown>;\n const id = record['serverId'] ?? record['id'];\n return {\n serverId: id === undefined || id === null ? undefined : String(id),\n url: typeof record['url'] === 'string' ? record['url'] : undefined,\n };\n}\n\nlet nextFileId = 0;\n\n/**\n * `nxe-file-input` is a file field for forms: the value is the list of files, `NxeFileDescriptor[]`, and it\n * works with `formControlName`, `[formControl]`, `ngModel` and `nxe-form-field`.\n *\n * ```html\n * <nxe-form-field label=\"Invoice and supporting documents\">\n * <nxe-file-input\n * formControlName=\"attachments\"\n * accept=\".pdf,image/*\"\n * [maxSize]=\"5 * 1024 * 1024\"\n * [maxFiles]=\"3\"\n * uploadUrl=\"/api/files/upload\" />\n * </nxe-form-field>\n * ```\n *\n * **Value.** A file the user picks or drops becomes `{ id, name, size, type, status, progress, file }`. With no\n * upload configured it stays `pending` and the form reads the `File` from the value (to put in a `FormData`\n * itself). With one, it is uploaded as soon as it is added (`autoUpload`, default) and moves through\n * `uploading` to `uploaded` with the server's `serverId` and `url`, or to `error`. A descriptor that came from the\n * server (`writeValue` with `status: 'uploaded'`) shows as an existing attachment, a link when it has a `url`.\n * The form is told at each status change; the progress bar between them is live without churning the form.\n *\n * **Validation.** The control is invalid, with these error keys (which `nxe-form-field` words in the active\n * language), until the problem is removed:\n *\n * | key | when | error value |\n * |---|---|---|\n * | `fileType` | a file does not match `accept` | `{ accept, files }` |\n * | `fileSize` | a file is over `maxSize` bytes | `{ maxSize, files }` |\n * | `maxFiles` | more files than `maxFiles` (1 when not `multiple`) | `{ maxFiles, actual }` |\n * | `uploading` | an upload is running, or a file is waiting for one | `{ count }` |\n * | `uploadFailed` | an upload failed or was cancelled | `{ files }` |\n *\n * A file that breaks a rule is kept in the list, marked, so the user sees which one and can remove it; it is never\n * uploaded. `required` needs a file in the list.\n *\n * **Uploading.** `uploadUrl` posts a `FormData` (field `uploadField`) with `HttpClient` and `reportProgress`, so the\n * app needs `provideHttpClient()` (and its interceptors apply). `uploadFn` is the same job in your hands:\n * `(file, { signal }) => Observable` of `HttpEvent`s, `{ progress, serverId?, url? }` or percentages, completing\n * on success. Cancel and remove unsubscribe, and abort `signal`. `uploadResult` maps the response body to\n * `{ serverId, url }` (default: `serverId` or `id`, and `url`).\n */\n@Component({\n selector: 'nxe-file-input',\n templateUrl: './nxe-file-input.component.html',\n styleUrl: './nxe-file-input.component.scss',\n host: {\n class: 'nxe-widget nxe-file-input',\n '[class.nxe-fileinput-dragover]': 'dragOver()',\n '[class.nxe-fileinput-has-files]': 'rows().length > 0',\n '[class.nxe-invalid]': 'invalidState()',\n },\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeFileInputComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => NxeFileInputComponent), multi: true },\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeFileInputComponent) },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeFileInputComponent extends NxeFormControlBase<NxeFileDescriptor[]> implements Validator {\n /** Accepted files, as in `<input accept>`: `.pdf`, `application/pdf`, `image/*`, comma separated. Empty accepts all. */\n readonly accept = input('');\n /** Largest file, in bytes. */\n readonly maxSize = input<number | undefined, unknown>(undefined, { transform: numberOrUndefined });\n /** Most files the control may hold. */\n readonly maxFiles = input<number | undefined, unknown>(undefined, { transform: numberOrUndefined });\n /** More than one file. When off, choosing a file replaces the current one. */\n readonly multiple = input(true, { transform: booleanAttribute });\n /** Uploads a file; see {@link NxeUploadFn}. Wins over `uploadUrl`. */\n readonly uploadFn = input<NxeUploadFn | undefined>(undefined);\n /** Where to POST each file, with `HttpClient`. */\n readonly uploadUrl = input<string | undefined>(undefined);\n /** Name of the form field the file is sent as. */\n readonly uploadField = input('file');\n /** Headers for the `uploadUrl` request. */\n readonly uploadHeaders = input<Record<string, string | string[]> | undefined>(undefined);\n /** Send cookies with the `uploadUrl` request. */\n readonly withCredentials = input(false, { transform: booleanAttribute });\n /** Reads `{ serverId, url }` from the response body. */\n readonly uploadResult = input<((body: unknown) => NxeUploadResult) | undefined>(undefined);\n /** Start uploading as soon as a file is added. Off, call {@link upload}. */\n readonly autoUpload = input(true, { transform: booleanAttribute });\n /** The button's text; the active language's \"Select files\" when unset. */\n readonly selectButtonText = input<string | undefined>(undefined);\n /** Text beside the button; the active language's \"or drop files here\" when unset. */\n readonly labelText = input<string | undefined>(undefined);\n /** Show the accepted types, size and count under the button. */\n readonly showHints = input(true, { transform: booleanAttribute });\n\n /** Files were added, with their descriptors. */\n readonly filesAdded = output<readonly NxeFileDescriptor[]>();\n /** A file was removed (or replaced). Delete it from the server here, if it was stored. */\n readonly fileRemoved = output<NxeFileDescriptor>();\n /** An upload finished. */\n readonly fileUploaded = output<NxeFileDescriptor>();\n /** An upload failed or was cancelled. */\n readonly fileFailed = output<NxeFileDescriptor>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>('picker');\n private readonly http = inject(HttpClient, { optional: true });\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly running = new Map<string, { readonly abort: AbortController; readonly subscription: Subscription }>();\n private readonly results = new Map<string, NxeUploadResult>();\n private validatorChange: (() => void) | null = null;\n private announceToggle = false;\n\n protected readonly dragOver = signal(false);\n protected readonly announcement = signal('');\n\n /** The files in the control. */\n readonly files = computed(() => this.value() ?? []);\n\n /** An upload is configured. */\n readonly uploads = computed(() => !!this.uploadFn() || !!this.uploadUrl());\n\n /** Most files the control accepts: `maxFiles`, or one when not `multiple`. */\n readonly limit = computed(() => (this.multiple() ? (this.maxFiles() ?? Infinity) : 1));\n\n protected readonly canAdd = computed(() => !this.disabled() && !this.readOnly());\n\n protected readonly rows = computed<readonly FileRow[]>(() =>\n this.files().map((file, index) => {\n const issue = this.issueOf(file, index);\n const failed = !issue && file.status === 'error';\n return {\n file,\n issue,\n sizeText: nxeFormatFileSize(file.size, this.nxeMessages),\n statusText: this.statusText(file, issue?.message ?? null),\n failed,\n canRetry: failed && !!file.file && this.uploads(),\n };\n }),\n );\n\n protected readonly hints = computed(() => {\n const hints: string[] = [];\n const accept = this.accept().trim();\n if (accept && accept !== '*') {\n hints.push(this.nxeMessages.t('uploader.acceptHint', accept.split(',').map((t) => t.trim()).join(', ')));\n }\n const size = this.maxSize();\n if (size !== undefined) {\n hints.push(this.nxeMessages.t('uploader.maxSizeHint', nxeFormatFileSize(size, this.nxeMessages)));\n }\n const limit = this.limit();\n if (this.multiple() && Number.isFinite(limit)) {\n hints.push(this.nxeMessages.t('uploader.maxFilesHint', limit));\n }\n return hints;\n });\n\n constructor() {\n super();\n // The rules are inputs, so a change to one re-runs the control's validators.\n toObservable(computed(() => [this.accept(), this.maxSize(), this.limit(), this.uploads(), this.autoUpload()].join('|')))\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.validatorChange?.());\n this.destroyRef.onDestroy(() => this.running.forEach((run) => this.stop(run)));\n }\n\n // --- Validator -------------------------------------------------------------------------\n\n validate(control: AbstractControl): ValidationErrors | null {\n const files = (control.value as readonly NxeFileDescriptor[] | null) ?? [];\n if (files.length === 0) {\n return null;\n }\n const errors: ValidationErrors = {};\n const wrongType = files.filter((f) => !nxeFileAccepted(f, this.accept())).map((f) => f.name);\n if (wrongType.length) {\n errors['fileType'] = { accept: this.accept(), files: wrongType };\n }\n const maxSize = this.maxSize();\n const tooBig = maxSize === undefined ? [] : files.filter((f) => f.size > maxSize).map((f) => f.name);\n if (maxSize !== undefined && tooBig.length) {\n errors['fileSize'] = { maxSize, files: tooBig };\n }\n if (files.length > this.limit()) {\n errors['maxFiles'] = { maxFiles: this.limit(), actual: files.length };\n }\n const unfinished = files.filter(\n (f, i) => f.status === 'uploading' || (f.status === 'pending' && this.uploads() && !this.issueOf(f, i)),\n ).length;\n if (unfinished) {\n errors['uploading'] = { count: unfinished };\n }\n const failed = files.filter((f) => f.status === 'error').map((f) => f.name);\n if (failed.length) {\n errors['uploadFailed'] = { files: failed };\n }\n return Object.keys(errors).length ? errors : null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.validatorChange = fn;\n }\n\n // --- Public API ------------------------------------------------------------------------\n\n /** Opens the browser's file picker. */\n open(): void {\n if (this.canAdd()) {\n this.picker().nativeElement.click();\n }\n }\n\n /** Adds files as if the user had chosen them. */\n addFiles(list: readonly File[], event: Event | null = null): void {\n if (!this.canAdd() || list.length === 0) {\n return;\n }\n const added = (this.multiple() ? list : list.slice(0, 1)).map((file) => this.describe(file));\n // Not multiple: the new file replaces the old one, and anything the old one was doing stops.\n const replaced = this.multiple() ? [] : this.files();\n replaced.forEach((f) => this.stopById(f.id));\n this.commitValue([...(this.multiple() ? this.files() : []), ...added], event);\n replaced.forEach((f) => this.fileRemoved.emit(f));\n this.afterAdd(added);\n }\n\n /** Removes a file, cancelling its upload if it is running. */\n remove(id: string): void {\n const index = this.files().findIndex((f) => f.id === id);\n if (index < 0 || !this.canAdd()) {\n return;\n }\n const removed = this.files()[index];\n this.stopById(id);\n this.results.delete(id);\n this.commitValue(this.files().filter((f) => f.id !== id));\n this.fileRemoved.emit(removed);\n this.say(this.nxeMessages.t('uploader.announceRemoved', removed.name));\n this.markAsTouched();\n this.focusAfterRemove(index);\n // A file that was over the limit may fit now.\n this.startEligible();\n }\n\n /** Stops a running upload. The file stays, as an error, so it can be retried or removed. */\n cancel(id: string): void {\n const file = this.files().find((f) => f.id === id);\n if (!file || file.status !== 'uploading') {\n return;\n }\n this.stopById(id);\n this.fail(id, this.nxeMessages.t('uploader.cancelled'));\n }\n\n /** Uploads a failed or cancelled file again. */\n retry(id: string): void {\n const index = this.files().findIndex((f) => f.id === id);\n const file = this.files()[index];\n if (!file || file.status !== 'error' || !file.file || !this.uploads() || this.issueOf(file, index)) {\n return;\n }\n this.patch(new Map([[id, { status: 'pending', progress: 0, error: undefined }]]), true);\n this.begin([id]);\n }\n\n /** Uploads every file that is waiting, for `autoUpload` off. */\n upload(): void {\n this.startEligible(true);\n }\n\n // --- Template handlers -----------------------------------------------------------------\n\n protected onPicked(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.addFiles(Array.from(input.files ?? []), event);\n // Choosing the same file again must fire `change` again.\n input.value = '';\n }\n\n protected onDragOver(event: DragEvent): void {\n if (!this.canAdd() || !Array.from(event.dataTransfer?.types ?? []).includes('Files')) {\n return;\n }\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n this.dragOver.set(true);\n }\n\n protected onDragLeave(event: DragEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.elementRef.nativeElement.contains(next)) {\n this.dragOver.set(false);\n }\n }\n\n protected onDrop(event: DragEvent): void {\n if (!this.canAdd()) {\n return;\n }\n event.preventDefault();\n this.dragOver.set(false);\n this.addFiles(Array.from(event.dataTransfer?.files ?? []), event);\n }\n\n protected onZoneFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.elementRef.nativeElement.contains(next)) {\n this.markAsTouched();\n }\n }\n\n protected progressLabel(file: NxeFileDescriptor): string {\n return this.nxeMessages.t('uploader.uploadingFile', file.name);\n }\n\n protected round(value: number): number {\n return Math.round(value);\n }\n\n protected t(key: NxeMessageKey, ...args: readonly unknown[]): string {\n return this.nxeMessages.t(key, ...args);\n }\n\n // --- Rules -----------------------------------------------------------------------------\n\n /** Why `file` at `index` cannot be kept; checked in the order type, size, count. */\n private issueOf(file: NxeFileDescriptor, index: number): FileRow['issue'] {\n const messages = this.nxeMessages;\n if (!nxeFileAccepted(file, this.accept())) {\n return { kind: 'fileType', message: messages.t('uploader.rejectType', file.name) };\n }\n const maxSize = this.maxSize();\n if (maxSize !== undefined && file.size > maxSize) {\n return { kind: 'fileSize', message: messages.t('uploader.rejectSize', file.name, nxeFormatFileSize(maxSize, messages)) };\n }\n if (index >= this.limit()) {\n return { kind: 'maxFiles', message: messages.t('uploader.rejectCount', file.name, this.limit()) };\n }\n return null;\n }\n\n private statusText(file: NxeFileDescriptor, issue: string | null): string {\n if (issue) {\n return issue;\n }\n switch (file.status) {\n case 'uploading':\n return this.nxeMessages.t('uploader.statusUploading', Math.round(file.progress));\n case 'uploaded':\n return this.nxeMessages.t('uploader.statusUploaded');\n case 'error':\n return file.error || this.nxeMessages.t('uploader.statusFailed');\n default:\n return this.uploads() ? this.nxeMessages.t('uploader.statusPending') : '';\n }\n }\n\n // --- Adding and uploading --------------------------------------------------------------\n\n private describe(file: File): NxeFileDescriptor {\n return {\n id: `nxe-file-${++nextFileId}`,\n name: file.name,\n size: file.size,\n type: file.type,\n status: 'pending',\n progress: 0,\n file,\n };\n }\n\n private afterAdd(added: readonly NxeFileDescriptor[]): void {\n this.filesAdded.emit(added);\n this.say(this.nxeMessages.t('uploader.announceAdded', added.map((f) => f.name).join(', ')));\n this.markAsTouched();\n this.startEligible();\n }\n\n /** Starts every pending file that breaks no rule, when uploads are on (`force` ignores `autoUpload`). */\n private startEligible(force = false): void {\n if ((!force && !this.autoUpload()) || !this.uploads()) {\n return;\n }\n const ids = this.files()\n .filter((f, i) => f.status === 'pending' && !!f.file && !this.issueOf(f, i))\n .map((f) => f.id);\n if (ids.length) {\n this.begin(ids);\n }\n }\n\n /** Marks `ids` as uploading in one change, then starts each request. */\n private begin(ids: readonly string[]): void {\n this.patch(new Map(ids.map((id) => [id, { status: 'uploading' as const, progress: 0, error: undefined }])), true);\n for (const id of ids) {\n const descriptor = this.files().find((f) => f.id === id);\n if (!descriptor?.file) {\n continue;\n }\n const abort = new AbortController();\n const subscription = new Subscription();\n this.running.set(id, { abort, subscription });\n subscription.add(\n this.request(descriptor, abort.signal).subscribe({\n next: (event) => this.onEvent(id, event),\n error: (error: unknown) => {\n this.running.delete(id);\n this.fail(id, this.messageOf(error));\n },\n complete: () => {\n this.running.delete(id);\n this.succeed(id);\n },\n }),\n );\n }\n }\n\n private request(descriptor: NxeFileDescriptor, signal: AbortSignal): Observable<NxeUploadEvent> {\n const file = descriptor.file as File;\n const fn = this.uploadFn();\n if (fn) {\n return fn(file, { signal, descriptor });\n }\n const url = this.uploadUrl() as string;\n if (!this.http) {\n return throwError(() => new Error('nxe-file-input needs provideHttpClient() to upload to an uploadUrl.'));\n }\n const body = new FormData();\n body.append(this.uploadField(), file, file.name);\n return this.http.post(url, body, {\n reportProgress: true,\n observe: 'events',\n headers: this.uploadHeaders(),\n withCredentials: this.withCredentials(),\n });\n }\n\n private onEvent(id: string, event: NxeUploadEvent): void {\n let progress: number | undefined;\n if (typeof event === 'number') {\n progress = event;\n } else if ('type' in event) {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n progress = (event.loaded / event.total) * 100;\n } else if (event.type === HttpEventType.Response) {\n this.results.set(id, (this.uploadResult() ?? defaultResult)(event.body));\n progress = 100;\n }\n } else {\n progress = event.progress;\n if (event.serverId !== undefined || event.url !== undefined) {\n this.results.set(id, { serverId: event.serverId, url: event.url });\n }\n }\n if (progress !== undefined) {\n // Live, but not worth a valueChanges per tick: the form hears about the status changes.\n this.patch(new Map([[id, { progress: Math.min(100, Math.max(0, progress)) }]]), false);\n }\n }\n\n private succeed(id: string): void {\n const current = this.files().find((f) => f.id === id);\n if (!current || current.status !== 'uploading') {\n return;\n }\n const result = this.results.get(id);\n this.results.delete(id);\n this.patch(\n new Map([[id, { status: 'uploaded' as const, progress: 100, error: undefined, serverId: result?.serverId, url: result?.url }]]),\n true,\n );\n this.fileUploaded.emit(this.files().find((f) => f.id === id) as NxeFileDescriptor);\n }\n\n private fail(id: string, message: string): void {\n const current = this.files().find((f) => f.id === id);\n if (!current || (current.status !== 'uploading' && current.status !== 'pending')) {\n return;\n }\n this.results.delete(id);\n this.patch(new Map([[id, { status: 'error' as const, error: message }]]), true);\n const failed = this.files().find((f) => f.id === id) as NxeFileDescriptor;\n this.say(`${failed.name}: ${message}`);\n this.fileFailed.emit(failed);\n }\n\n private messageOf(error: unknown): string {\n if (error instanceof HttpErrorResponse) {\n const own = (error.error as { message?: unknown } | null)?.message;\n return typeof own === 'string' && own ? own : this.nxeMessages.t('uploader.uploadFailed');\n }\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return typeof error === 'string' && error ? error : this.nxeMessages.t('uploader.uploadFailed');\n }\n\n private stopById(id: string): void {\n const run = this.running.get(id);\n if (run) {\n this.stop(run);\n this.running.delete(id);\n }\n }\n\n private stop(run: { readonly abort: AbortController; readonly subscription: Subscription }): void {\n run.abort.abort();\n run.subscription.unsubscribe();\n }\n\n /** Applies changes to descriptors; `notify` tells the form, otherwise only the component's own value moves. */\n private patch(changes: ReadonlyMap<string, Partial<NxeFileDescriptor>>, notify: boolean): void {\n const next = this.files().map((f) => (changes.has(f.id) ? { ...f, ...changes.get(f.id) } : f));\n if (notify) {\n this.commitValue(next);\n } else {\n this.value.set(next);\n }\n }\n\n // --- Announcements and focus -----------------------------------------------------------\n\n private say(text: string): void {\n this.announceToggle = !this.announceToggle;\n // The trailing no-break space makes a repeat of the same message a different string.\n this.announcement.set(text + (this.announceToggle ? ' ' : ''));\n }\n\n /** After a removal the focused button is gone: move to the neighbouring file, or to the picker button. */\n private focusAfterRemove(index: number): void {\n afterNextRender(\n () => {\n const host = this.elementRef.nativeElement;\n const rows = Array.from(host.querySelectorAll<HTMLElement>('.nxe-fileinput-file'));\n const target =\n rows[Math.min(index, rows.length - 1)]?.querySelector<HTMLElement>('button') ??\n host.querySelector<HTMLElement>('.nxe-fileinput-button');\n target?.focus();\n },\n { injector: this.injector },\n );\n }\n\n // --- NxeFormControlBase ----------------------------------------------------------------\n\n override writeValue(value: NxeFileDescriptor[] | null): void {\n // A new value from the form replaces the list: nothing from the old one should keep running.\n this.running.forEach((run) => this.stop(run));\n this.running.clear();\n this.value.set(value);\n }\n}\n","@if (canAdd() || disabled()) {\r\n <div\r\n class=\"nxe-fileinput-zone\"\r\n (dragenter)=\"onDragOver($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (focusout)=\"onZoneFocusOut($event)\">\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileinput-button\"\r\n [id]=\"controlId()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"open()\">\r\n {{ selectButtonText() ?? t('uploader.selectFiles') }}\r\n </button>\r\n <span class=\"nxe-fileinput-drop\">{{ labelText() ?? t('uploader.dropFiles') }}</span>\r\n <input\r\n #picker\r\n class=\"nxe-fileinput-picker\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n [attr.accept]=\"accept() || null\"\r\n [multiple]=\"multiple()\"\r\n (change)=\"onPicked($event)\" />\r\n @if (showHints() && hints().length) {\r\n <span class=\"nxe-fileinput-hints\">{{ hints().join(' · ') }}</span>\r\n }\r\n </div>\r\n} @else {\r\n <input #picker class=\"nxe-fileinput-picker\" type=\"file\" tabindex=\"-1\" aria-hidden=\"true\" />\r\n}\r\n\r\n@if (rows().length) {\r\n <ul class=\"nxe-fileinput-list\" [attr.aria-label]=\"t('uploader.listLabel')\">\r\n @for (row of rows(); track row.file.id) {\r\n <li\r\n class=\"nxe-fileinput-file nxe-fileinput-file-{{ row.file.status }}\"\r\n [class.nxe-fileinput-file-invalid]=\"!!row.issue || row.failed\">\r\n <div class=\"nxe-fileinput-file-main\">\r\n @if (row.file.status === 'uploaded' && row.file.url) {\r\n <a class=\"nxe-fileinput-file-name\" [href]=\"row.file.url\" target=\"_blank\" rel=\"noopener\">{{ row.file.name }}</a>\r\n } @else {\r\n <span class=\"nxe-fileinput-file-name\">{{ row.file.name }}</span>\r\n }\r\n <span class=\"nxe-fileinput-file-size\">{{ row.sizeText }}</span>\r\n @if (row.statusText) {\r\n <span class=\"nxe-fileinput-file-status\">{{ row.statusText }}</span>\r\n }\r\n </div>\r\n @if (row.file.status === 'uploading') {\r\n <div\r\n class=\"nxe-fileinput-progress\"\r\n role=\"progressbar\"\r\n aria-valuemin=\"0\"\r\n aria-valuemax=\"100\"\r\n [attr.aria-valuenow]=\"round(row.file.progress)\"\r\n [attr.aria-label]=\"progressLabel(row.file)\">\r\n <span class=\"nxe-fileinput-progress-bar\" [style.width.%]=\"row.file.progress\"></span>\r\n </div>\r\n }\r\n <div class=\"nxe-fileinput-file-actions\">\r\n @if (row.file.status === 'uploading') {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileinput-action\"\r\n [attr.aria-label]=\"t('uploader.cancelFile', row.file.name)\"\r\n (click)=\"cancel(row.file.id)\">\r\n {{ t('uploader.cancel') }}\r\n </button>\r\n } @else {\r\n @if (row.canRetry) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileinput-action\"\r\n [attr.aria-label]=\"t('uploader.retryFile', row.file.name)\"\r\n (click)=\"retry(row.file.id)\">\r\n {{ t('uploader.retry') }}\r\n </button>\r\n }\r\n @if (canAdd()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileinput-action\"\r\n [attr.aria-label]=\"t('uploader.removeFile', row.file.name)\"\r\n (click)=\"remove(row.file.id)\">\r\n {{ t('uploader.remove') }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n}\r\n<div class=\"nxe-fileinput-live\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">{{ announcement() }}</div>\r\n","// @nexterajs/ui/file-uploader — public API.\r\nexport * from './lib/file-uploader/nxe-file-uploader.component';\r\nexport * from './lib/file-input/nxe-file-input.types';\r\nexport * from './lib/file-input/nxe-file-input.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAkBA;;;;;;;;;;AAUG;MAuBU,wBAAwB,CAAA;AACjC;AAC6F;IACpF,cAAc,GAAG,KAAK,CAAC,KAAK;uFAAC;IAC7B,MAAM,GAAG,KAAK,CAAC,GAAG;+EAAC;;IAEnB,SAAS,GAAG,KAAK,CAAqB,SAAS;kFAAC;;IAEhD,gBAAgB,GAAG,KAAK,CAAqB,SAAS;yFAAC;AAChE;AACiE;IACxD,UAAU,GAAG,KAAK,CAAyC,SAAS;mFAAC;IACrE,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,IAAI,GAAG,KAAK,CAAS,SAAS;6EAAC;;IAE/B,oBAAoB,GAAG,KAAK,CAAqB,SAAS,4FAC/D,KAAK,EAAE,iBAAiB,EAAA,CAC1B;;IAGO,MAAM,GAAG,MAAM,EAAS;AAEhB,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAA+B,WAAW;kFAAC;;AAGvE,IAAA,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE9C,IAAI,GAAG,MAAM,CAAc,IAAI;6EAAC;IAChC,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;IACxB,OAAO,GAAG,MAAM,CAAC,KAAK;gFAAC;IACvB,eAAe,GAAG,MAAM,CAAgB,IAAI;wFAAC;;IAGtD,QAAQ,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACtB;IACA,eAAe,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,oBAAoB,EAAE;IACtC;AACA,IAAA,kBAAkB,CAAC,OAAsB,EAAA;AACrC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;IACrC;IAEU,MAAM,GAAA;QACZ,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;IAC1C;AAEU,IAAA,cAAc,CAAC,KAAY,EAAA;AACjC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B;IAEU,MAAM,GAAA;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;AAC5C,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;;QAEhB,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C;AAEU,IAAA,UAAU,CAAC,KAAgB,EAAA;QACjC,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEU,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEU,IAAA,MAAM,CAAC,KAAgB,EAAA;QAC7B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK;AACvC,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;AAC5C,YAAA,KAAK,CAAC,KAAK,GAAG,KAAK;YACnB,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C;IACJ;AAEU,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,KAAK,GAAG,IAAI,EAAE;YACd,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC;QACnD;AACA,QAAA,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACxE;QACA,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/E;uGAxFS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,eAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,8BAAA,EAAA,SAAA,EAAA,iCAAA,EAAA,YAAA,EAAA,gCAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,EAAA,SAAA,EANtB;AACP,YAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,wBAAwB,CAAC,EAAE;AAC9F,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/CL,61FA2DA,EAAA,MAAA,EAAA,CAAA,kyDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDRa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAtBpC,SAAS;+BACI,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,IAAA,EAGV;AACF,wBAAA,KAAK,EAAE,8BAA8B;AACrC,wBAAA,gCAAgC,EAAE,SAAS;AAC3C,wBAAA,mCAAmC,EAAE,YAAY;AACjD,wBAAA,kCAAkC,EAAE,qBAAqB;AACzD,wBAAA,qBAAqB,EAAE,qBAAqB;AAC5C,wBAAA,qBAAqB,EAAE,WAAW;AAClC,wBAAA,YAAY,EAAE,oBAAoB;AAClC,wBAAA,aAAa,EAAE,eAAe;AAC9B,wBAAA,QAAQ,EAAE,gBAAgB;qBAC7B,EAAA,SAAA,EACU;AACP,wBAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAK,wBAAyB,CAAC,EAAE;AAC9F,qBAAA,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,61FAAA,EAAA,MAAA,EAAA,CAAA,kyDAAA,CAAA,EAAA;i6BAwByC,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEP7F;AACM,SAAU,eAAe,CAAC,IAAsD,EAAE,MAAc,EAAA;IAClG,MAAM,MAAM,GAAG;SACV,KAAK,CAAC,GAAG;AACT,SAAA,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACvE,QAAA,OAAO,IAAI;IACf;IACA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACpC,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAI;AACzB,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC/B;AACA,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C;QACA,OAAO,IAAI,KAAK,KAAK;AACzB,IAAA,CAAC,CAAC;AACN;;AC5CA,SAAS,iBAAiB,CAAC,KAAc,EAAA;AACrC,IAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACvD,QAAA,OAAO,SAAS;IACpB;AACA,IAAA,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AACvB,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;AAC7C;AAEA;AACA,SAAS,aAAa,CAAC,IAAa,EAAA;IAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE;AAC3C,QAAA,OAAO,EAAE;IACb;IACA,MAAM,MAAM,GAAG,IAA+B;IAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;IAC7C,OAAO;AACH,QAAA,QAAQ,EAAE,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;AAClE,QAAA,GAAG,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS;KACrE;AACL;AAEA,IAAI,UAAU,GAAG,CAAC;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCG;AAmBG,MAAO,qBAAsB,SAAQ,kBAAuC,CAAA;;IAErE,MAAM,GAAG,KAAK,CAAC,EAAE;+EAAC;;IAElB,OAAO,GAAG,KAAK,CAA8B,SAAS,+EAAI,SAAS,EAAE,iBAAiB,EAAA,CAAG;;IAEzF,QAAQ,GAAG,KAAK,CAA8B,SAAS,gFAAI,SAAS,EAAE,iBAAiB,EAAA,CAAG;;IAE1F,QAAQ,GAAG,KAAK,CAAC,IAAI,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEvD,QAAQ,GAAG,KAAK,CAA0B,SAAS;iFAAC;;IAEpD,SAAS,GAAG,KAAK,CAAqB,SAAS;kFAAC;;IAEhD,WAAW,GAAG,KAAK,CAAC,MAAM;oFAAC;;IAE3B,aAAa,GAAG,KAAK,CAAgD,SAAS;sFAAC;;IAE/E,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAE/D,YAAY,GAAG,KAAK,CAAmD,SAAS;qFAAC;;IAEjF,UAAU,GAAG,KAAK,CAAC,IAAI,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEzD,gBAAgB,GAAG,KAAK,CAAqB,SAAS;yFAAC;;IAEvD,SAAS,GAAG,KAAK,CAAqB,SAAS;kFAAC;;IAEhD,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGxD,UAAU,GAAG,MAAM,EAAgC;;IAEnD,WAAW,GAAG,MAAM,EAAqB;;IAEzC,YAAY,GAAG,MAAM,EAAqB;;IAE1C,UAAU,GAAG,MAAM,EAAqB;AAEhC,IAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAA+B,QAAQ;+EAAC;IACnE,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC7C,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,IAAA,OAAO,GAAG,IAAI,GAAG,EAAoF;AACrG,IAAA,OAAO,GAAG,IAAI,GAAG,EAA2B;IACrD,eAAe,GAAwB,IAAI;IAC3C,cAAc,GAAG,KAAK;IAEX,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;IACxB,YAAY,GAAG,MAAM,CAAC,EAAE;qFAAC;;IAGnC,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;8EAAC;;AAG1C,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE;gFAAC;;IAGjE,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,QAAQ,IAAI,CAAC,CAAC;8EAAC;AAEnE,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;+EAAC;AAE7D,IAAA,IAAI,GAAG,QAAQ,CAAqB,MACnD,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;QAChD,OAAO;YACH,IAAI;YACJ,KAAK;YACL,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;AACxD,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;YACzD,MAAM;AACN,YAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;SACpD;AACL,IAAA,CAAC,CAAC;6EACL;AAEkB,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,KAAK,GAAa,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;AACnC,QAAA,IAAI,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE;AAC1B,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5G;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACrG;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC3C,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAClE;AACA,QAAA,OAAO,KAAK;IAChB,CAAC;8EAAC;AAEF,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;;AAEP,QAAA,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClH,IAAI,CAAC,kBAAkB,EAAE;aACzB,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,IAAI,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF;;AAIA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC7B,QAAA,MAAM,KAAK,GAAI,OAAO,CAAC,KAA6C,IAAI,EAAE;AAC1E,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,YAAA,OAAO,IAAI;QACf;QACA,MAAM,MAAM,GAAqB,EAAE;AACnC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AAC5F,QAAA,IAAI,SAAS,CAAC,MAAM,EAAE;AAClB,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;QACpE;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QACpG,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;YACxC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;QACnD;QACA,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;AAC7B,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;QACzE;QACA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,WAAW,KAAK,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAC1G,CAAC,MAAM;QACR,IAAI,UAAU,EAAE;YACZ,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE;QAC/C;AACA,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AAC3E,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;YACf,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;QAC9C;AACA,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI;IACrD;AAEA,IAAA,yBAAyB,CAAC,EAAc,EAAA;AACpC,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC7B;;;IAKA,IAAI,GAAA;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;QACvC;IACJ;;AAGA,IAAA,QAAQ,CAAC,IAAqB,EAAE,KAAA,GAAsB,IAAI,EAAA;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrC;QACJ;AACA,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;AAE5F,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;AACpD,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC;AAC7E,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACxB;;AAGA,IAAA,MAAM,CAAC,EAAU,EAAA;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACxD,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;YAC7B;QACJ;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9B,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,0BAA0B,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;QAE5B,IAAI,CAAC,aAAa,EAAE;IACxB;;AAGA,IAAA,MAAM,CAAC,EAAU,EAAA;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;YACtC;QACJ;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3D;;AAGA,IAAA,KAAK,CAAC,EAAU,EAAA;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YAChG;QACJ;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AACvF,QAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACpB;;IAGA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IAC5B;;AAIU,IAAA,QAAQ,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;;AAEnD,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;IACpB;AAEU,IAAA,UAAU,CAAC,KAAgB,EAAA;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAClF;QACJ;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACpB,YAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM;QAC1C;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEU,IAAA,WAAW,CAAC,KAAgB,EAAA;AAClC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAA4B;AAC/C,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACxD,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACJ;AAEU,IAAA,MAAM,CAAC,KAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;YAChB;QACJ;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;IACrE;AAEU,IAAA,cAAc,CAAC,KAAiB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAA4B;AAC/C,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACxD,IAAI,CAAC,aAAa,EAAE;QACxB;IACJ;AAEU,IAAA,aAAa,CAAC,IAAuB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,EAAE,IAAI,CAAC,IAAI,CAAC;IAClE;AAEU,IAAA,KAAK,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC5B;AAEU,IAAA,CAAC,CAAC,GAAkB,EAAE,GAAG,IAAwB,EAAA;QACvD,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3C;;;IAKQ,OAAO,CAAC,IAAuB,EAAE,KAAa,EAAA;AAClD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;QACjC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;AACvC,YAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QACtF;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAC9B,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE;YAC9C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE;QAC5H;AACA,QAAA,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;YACvB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,sBAAsB,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE;QACrG;AACA,QAAA,OAAO,IAAI;IACf;IAEQ,UAAU,CAAC,IAAuB,EAAE,KAAoB,EAAA;QAC5D,IAAI,KAAK,EAAE;AACP,YAAA,OAAO,KAAK;QAChB;AACA,QAAA,QAAQ,IAAI,CAAC,MAAM;AACf,YAAA,KAAK,WAAW;AACZ,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,0BAA0B,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACpF,YAAA,KAAK,UAAU;gBACX,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC;AACxD,YAAA,KAAK,OAAO;AACR,gBAAA,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC;AACpE,YAAA;AACI,gBAAA,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,CAAC,GAAG,EAAE;;IAErF;;AAIQ,IAAA,QAAQ,CAAC,IAAU,EAAA;QACvB,OAAO;AACH,YAAA,EAAE,EAAE,CAAA,SAAA,EAAY,EAAE,UAAU,CAAA,CAAE;YAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,QAAQ,EAAE,CAAC;YACX,IAAI;SACP;IACL;AAEQ,IAAA,QAAQ,CAAC,KAAmC,EAAA;AAChD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,aAAa,EAAE;IACxB;;IAGQ,aAAa,CAAC,KAAK,GAAG,KAAK,EAAA;AAC/B,QAAA,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnD;QACJ;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK;AACjB,aAAA,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;aAC1E,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACnB;IACJ;;AAGQ,IAAA,KAAK,CAAC,GAAsB,EAAA;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAoB,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AACjH,QAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACxD,YAAA,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;gBACnB;YACJ;AACA,YAAA,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE;AACnC,YAAA,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE;AACvC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAC7C,YAAA,YAAY,CAAC,GAAG,CACZ,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;AAC7C,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC;AACxC,gBAAA,KAAK,EAAE,CAAC,KAAc,KAAI;AACtB,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACvB,oBAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;gBACD,QAAQ,EAAE,MAAK;AACX,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACvB,oBAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpB,CAAC;AACJ,aAAA,CAAC,CACL;QACL;IACJ;IAEQ,OAAO,CAAC,UAA6B,EAAE,MAAmB,EAAA;AAC9D,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAY;AACpC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC1B,IAAI,EAAE,EAAE;YACJ,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC3C;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAY;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC7G;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;AAC7B,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE;AAC7B,YAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AAC1C,SAAA,CAAC;IACN;IAEQ,OAAO,CAAC,EAAU,EAAE,KAAqB,EAAA;AAC7C,QAAA,IAAI,QAA4B;AAChC,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC3B,QAAQ,GAAG,KAAK;QACpB;AAAO,aAAA,IAAI,MAAM,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5D,gBAAA,QAAQ,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG;YACjD;iBAAO,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;gBAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxE,QAAQ,GAAG,GAAG;YAClB;QACJ;aAAO;AACH,YAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ;AACzB,YAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;gBACzD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;YACtE;QACJ;AACA,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;;AAExB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QAC1F;IACJ;AAEQ,IAAA,OAAO,CAAC,EAAU,EAAA;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE;YAC5C;QACJ;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,CACN,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAmB,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAC/H,IAAI,CACP;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAsB,CAAC;IACtF;IAEQ,IAAI,CAAC,EAAU,EAAE,OAAe,EAAA;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE;YAC9E;QACJ;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAsB;QACzE,IAAI,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAC;AACtC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;IAChC;AAEQ,IAAA,SAAS,CAAC,KAAc,EAAA;AAC5B,QAAA,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACpC,YAAA,MAAM,GAAG,GAAI,KAAK,CAAC,KAAsC,EAAE,OAAO;YAClE,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC7F;QACA,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;YACzC,OAAO,KAAK,CAAC,OAAO;QACxB;QACA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACnG;AAEQ,IAAA,QAAQ,CAAC,EAAU,EAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,EAAE;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACd,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B;IACJ;AAEQ,IAAA,IAAI,CAAC,GAA6E,EAAA;AACtF,QAAA,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE;AACjB,QAAA,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE;IAClC;;IAGQ,KAAK,CAAC,OAAwD,EAAE,MAAe,EAAA;QACnF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9F,IAAI,MAAM,EAAE;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC1B;aAAO;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;IACJ;;AAIQ,IAAA,GAAG,CAAC,IAAY,EAAA;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc;;QAE1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;IAClE;;AAGQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;QAClC,eAAe,CACX,MAAK;AACD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC1C,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,qBAAqB,CAAC,CAAC;YAClF,MAAM,MAAM,GACR,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,CAAc,QAAQ,CAAC;AAC5E,gBAAA,IAAI,CAAC,aAAa,CAAc,uBAAuB,CAAC;YAC5D,MAAM,EAAE,KAAK,EAAE;QACnB,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC9B;IACL;;AAIS,IAAA,UAAU,CAAC,KAAiC,EAAA;;AAEjD,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;uGA3eS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,8BAAA,EAAA,YAAA,EAAA,+BAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,EAAA,cAAA,EAAA,2BAAA,EAAA,EAAA,SAAA,EARnB;AACP,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACjG,YAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7F,YAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,qBAAqB,CAAC,EAAE;AAC3F,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzHL,irJAiGA,EAAA,MAAA,EAAA,CAAA,uiIAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FD4Ba,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAlBjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,IAAA,EAGpB;AACF,wBAAA,KAAK,EAAE,2BAA2B;AAClC,wBAAA,gCAAgC,EAAE,YAAY;AAC9C,wBAAA,iCAAiC,EAAE,mBAAmB;AACtD,wBAAA,qBAAqB,EAAE,gBAAgB;qBAC1C,EAAA,SAAA,EACU;AACP,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,2BAA2B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACjG,wBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,2BAA2B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7F,wBAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAK,qBAAsB,CAAC,EAAE;AAC3F,qBAAA,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,irJAAA,EAAA,MAAA,EAAA,CAAA,uiIAAA,CAAA,EAAA;ksDAyCsC,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEpKvF;;ACAA;;AAEG;;"}
|