@xosue-utils/services 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.
Files changed (30) hide show
  1. package/README.md +70 -0
  2. package/config/services-config.d.ts +46 -0
  3. package/fesm2022/xosue-utils-services.mjs +1657 -0
  4. package/fesm2022/xosue-utils-services.mjs.map +1 -0
  5. package/index.d.ts +5 -0
  6. package/lib/ai-autofill-overlay-service/ai-autofill-overlay-service.component.d.ts +13 -0
  7. package/lib/ai-autofill-overlay-service/ai-autofill-overlay.service.d.ts +19 -0
  8. package/lib/alert-service/alert-service.component.d.ts +17 -0
  9. package/lib/alert-service/alert.service.d.ts +25 -0
  10. package/lib/browser-notification/browser-notification.service.d.ts +42 -0
  11. package/lib/context-menu-service/context-menu-service.component.d.ts +37 -0
  12. package/lib/context-menu-service/context-menu.service.d.ts +63 -0
  13. package/lib/field-help-tooltip/field-help-tooltip.component.d.ts +9 -0
  14. package/lib/global-loading-service/global-loading-service.component.d.ts +14 -0
  15. package/lib/global-loading-service/global-loading.service.d.ts +22 -0
  16. package/lib/index.d.ts +29 -0
  17. package/lib/media-viewer-service/items/audio-player/audio-player.component.d.ts +14 -0
  18. package/lib/media-viewer-service/items/image-viewer/image-viewer.component.d.ts +19 -0
  19. package/lib/media-viewer-service/items/video-player/video-player.component.d.ts +18 -0
  20. package/lib/media-viewer-service/media-viewer-service.component.d.ts +62 -0
  21. package/lib/media-viewer-service/media-viewer.service.d.ts +34 -0
  22. package/lib/navigation-loading/navigation-loading-service.component.d.ts +9 -0
  23. package/lib/navigation-loading/navigation-loading.service.d.ts +24 -0
  24. package/lib/session-request-service/session-request-service.component.d.ts +15 -0
  25. package/lib/session-request-service/session-request.service.d.ts +21 -0
  26. package/lib/toast-service/toast-service.component.d.ts +16 -0
  27. package/lib/toast-service/toast.service.d.ts +22 -0
  28. package/package.json +47 -0
  29. package/public-api.d.ts +4 -0
  30. package/vendor/lucide-icon/lucide-icon.component.d.ts +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xosue-utils-services.mjs","sources":["../../src/lib/alert-service/alert.service.ts","../../src/vendor/lucide-icon/lucide-icon.component.ts","../../src/config/services-config.ts","../../src/lib/alert-service/alert-service.component.ts","../../src/lib/alert-service/alert-service.component.html","../../src/lib/toast-service/toast.service.ts","../../src/lib/toast-service/toast-service.component.ts","../../src/lib/toast-service/toast-service.component.html","../../src/lib/context-menu-service/context-menu.service.ts","../../src/lib/context-menu-service/context-menu-service.component.ts","../../src/lib/context-menu-service/context-menu-service.component.html","../../src/lib/field-help-tooltip/field-help-tooltip.component.ts","../../src/lib/field-help-tooltip/field-help-tooltip.component.html","../../src/lib/media-viewer-service/media-viewer.service.ts","../../src/lib/media-viewer-service/items/image-viewer/image-viewer.component.ts","../../src/lib/media-viewer-service/items/image-viewer/image-viewer.component.html","../../src/lib/media-viewer-service/items/video-player/video-player.component.ts","../../src/lib/media-viewer-service/items/video-player/video-player.component.html","../../src/lib/media-viewer-service/items/audio-player/audio-player.component.ts","../../src/lib/media-viewer-service/items/audio-player/audio-player.component.html","../../src/lib/media-viewer-service/media-viewer-service.component.ts","../../src/lib/media-viewer-service/media-viewer-service.component.html","../../src/lib/session-request-service/session-request.service.ts","../../src/lib/session-request-service/session-request-service.component.ts","../../src/lib/session-request-service/session-request-service.component.html","../../src/lib/global-loading-service/global-loading.service.ts","../../src/lib/global-loading-service/global-loading-service.component.ts","../../src/lib/global-loading-service/global-loading-service.component.html","../../src/lib/navigation-loading/navigation-loading.service.ts","../../src/lib/navigation-loading/navigation-loading-service.component.ts","../../src/lib/navigation-loading/navigation-loading-service.component.html","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay.service.ts","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay-service.component.ts","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay-service.component.html","../../src/lib/browser-notification/browser-notification.service.ts","../../src/public-api.ts","../../src/xosue-utils-services.ts"],"sourcesContent":["import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport type AlertMode = 'normal' | 'actions';\r\n\r\nexport type AlertConfirmOptions = {\r\n /** Se ejecuta en el mismo tick del clic en Aceptar (p. ej. Notification.requestPermission). */\r\n onAcceptClick?: () => void;\r\n};\r\n\r\nexport interface AlertMessage {\r\n id: number;\r\n message: string;\r\n mode: AlertMode;\r\n resolve: (value: boolean) => void;\r\n onAcceptClick?: () => void;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AlertService {\r\n private alertSubject = new Subject<AlertMessage>();\r\n alert$ = this.alertSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n showAlert(message: string): Promise<boolean> {\r\n if (!this.isBrowser) return Promise.resolve(false);\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const alert: AlertMessage = {\r\n id: ++this.idCounter,\r\n message,\r\n mode: 'normal',\r\n resolve,\r\n };\r\n this.alertSubject.next(alert);\r\n });\r\n }\r\n\r\n showConfirm(message: string, options?: AlertConfirmOptions): Promise<boolean> {\r\n if (!this.isBrowser) return Promise.resolve(false);\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const alert: AlertMessage = {\r\n id: ++this.idCounter,\r\n message,\r\n mode: 'actions',\r\n resolve,\r\n onAcceptClick: options?.onAcceptClick,\r\n };\r\n this.alertSubject.next(alert);\r\n });\r\n }\r\n}\r\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\r\nimport { LucideDynamicIcon } from '@lucide/angular';\r\n\r\n/**\r\n * Icono Lucide.\r\n *\r\n * HTML:\r\n * <lucide-icon name=\"star\"></lucide-icon>\r\n * <lucide-icon name=\"heart\" filled></lucide-icon> // relleno + trazo\r\n *\r\n * SASS — variables CSS (heredan del padre):\r\n * --lucide-stroke: var(--primary)\r\n * --lucide-fill: var(--accent)\r\n * --lucide-stroke-width: 2\r\n */\r\n@Component({\r\n selector: 'lucide-icon',\r\n standalone: true,\r\n imports: [LucideDynamicIcon],\r\n host: {\r\n '[class.lucide-icon--filled]': 'filled()',\r\n '[attr.filled]': 'filled() ? \"\" : null',\r\n },\r\n template: `\r\n <svg\r\n class=\"lucide-svg inline-block shrink-0 align-middle\"\r\n [class.lucide-svg--filled]=\"filled()\"\r\n [class.animate-spin]=\"spin()\"\r\n [style.width]=\"dimStyle()?.width\"\r\n [style.height]=\"dimStyle()?.height\"\r\n [lucideIcon]=\"name()\"\r\n aria-hidden=\"true\"\r\n />\r\n `,\r\n})\r\nexport class LucideIconComponent {\r\n readonly name = input.required<string>();\r\n readonly size = input<number | string | undefined>(undefined);\r\n readonly spin = input(false, { transform: booleanAttribute });\r\n /** Activa relleno (--lucide-fill); el trazo se conserva. */\r\n readonly filled = input(false, { transform: booleanAttribute });\r\n\r\n readonly dimStyle = computed(() => {\r\n const s = this.size();\r\n if (s === undefined || s === null || s === '') return null;\r\n if (typeof s === 'number') {\r\n return { width: `${s}px`, height: `${s}px` };\r\n }\r\n const trimmed = String(s).trim();\r\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\r\n return { width: `${trimmed}px`, height: `${trimmed}px` };\r\n }\r\n return { width: trimmed, height: trimmed };\r\n });\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport type ToastDurationKey = 'success' | 'warning' | 'error' | 'info';\r\n\r\nexport interface XosueUtilsServicesConfig {\r\n /** i18n / labels */\r\n alertAcceptLabel?: string;\r\n alertCancelLabel?: string;\r\n loadingDefaultMessage?: string;\r\n sessionRegisterPath?: string;\r\n sessionLoginPath?: string;\r\n sessionRegisterLabel?: string;\r\n sessionLoginLabel?: string;\r\n /** toast assets (absolute or app-root relative) */\r\n toastSoundUrl?: string;\r\n toastErrorSoundUrl?: string;\r\n toastSuccessGifUrl?: string;\r\n toastDurationsMs?: Partial<Record<ToastDurationKey, number>>;\r\n /** media viewer */\r\n mediaFileNameFallback?: string;\r\n /** browser notification */\r\n browserNotificationIconUrl?: string;\r\n browserNotificationSoundUrl?: string;\r\n browserNotificationPermissionPrompt?: string;\r\n}\r\n\r\nexport const XOSUE_UTILS_SERVICES_DEFAULTS: Required<\r\n Omit<XosueUtilsServicesConfig, 'toastDurationsMs' | 'toastSuccessGifUrl'>\r\n> & {\r\n toastSuccessGifUrl: string;\r\n toastDurationsMs: Record<ToastDurationKey, number>;\r\n} = {\r\n alertAcceptLabel: 'Aceptar',\r\n alertCancelLabel: 'Cancelar',\r\n loadingDefaultMessage: 'Cargando',\r\n sessionRegisterPath: '/auth/register',\r\n sessionLoginPath: '/auth/login',\r\n sessionRegisterLabel: 'Registrarse',\r\n sessionLoginLabel: 'Iniciar Sesión',\r\n toastSoundUrl: '/sounds/toast.mp3',\r\n toastErrorSoundUrl: '/sounds/error-toast.mp3',\r\n toastSuccessGifUrl: '/gifs/success-toast.gif',\r\n toastDurationsMs: {\r\n success: 1000,\r\n info: 1000,\r\n warning: 5000,\r\n error: 5000,\r\n },\r\n mediaFileNameFallback: 'Archivo',\r\n browserNotificationIconUrl: '/favicon.ico',\r\n browserNotificationSoundUrl: '/sounds/toast.mp3',\r\n browserNotificationPermissionPrompt:\r\n '¿Permitir notificaciones del navegador para avisarte cuando no estés en la pestaña?',\r\n};\r\n\r\nexport type ResolvedXosueUtilsServicesConfig = typeof XOSUE_UTILS_SERVICES_DEFAULTS;\r\n\r\nexport const XOSUE_UTILS_SERVICES_CONFIG = new InjectionToken<ResolvedXosueUtilsServicesConfig>(\r\n 'XOSUE_UTILS_SERVICES_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({ ...XOSUE_UTILS_SERVICES_DEFAULTS }),\r\n },\r\n);\r\n\r\nexport function resolveXosueUtilsServicesConfig(\r\n config?: XosueUtilsServicesConfig,\r\n): ResolvedXosueUtilsServicesConfig {\r\n return {\r\n ...XOSUE_UTILS_SERVICES_DEFAULTS,\r\n ...config,\r\n toastDurationsMs: {\r\n ...XOSUE_UTILS_SERVICES_DEFAULTS.toastDurationsMs,\r\n ...config?.toastDurationsMs,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Provide overlay services configuration in the host app.\r\n *\r\n * ```ts\r\n * providers: [\r\n * provideXosueUtilsServices({\r\n * sessionLoginPath: '/login',\r\n * toastSoundUrl: '/assets/sounds/toast.mp3',\r\n * }),\r\n * ]\r\n * ```\r\n */\r\nexport function provideXosueUtilsServices(config?: XosueUtilsServicesConfig): Provider[] {\r\n return [\r\n {\r\n provide: XOSUE_UTILS_SERVICES_CONFIG,\r\n useValue: resolveXosueUtilsServicesConfig(config),\r\n },\r\n ];\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertMessage, AlertService } from './alert.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'alert-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule],\r\n templateUrl: './alert-service.component.html',\r\n styleUrls: ['./alert-service.component.sass'],\r\n animations: [\r\n trigger('alertAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'scale(0.9)' }),\r\n animate('200ms ease-out', style({ opacity: 1, transform: 'scale(1)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ opacity: 0, transform: 'scale(0.9)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class AlertServiceComponent implements OnInit {\r\n alerts: AlertMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private alertService: AlertService) {}\r\n\r\n ngOnInit(): void {\r\n this.alertService.alert$.subscribe((alert) => {\r\n this.alerts.push(alert);\r\n });\r\n }\r\n\r\n removeAlert(id: number): void {\r\n this.alerts = this.alerts.filter((a) => a.id !== id);\r\n }\r\n\r\n accept(alert: AlertMessage): void {\r\n try {\r\n alert.onAcceptClick?.();\r\n } catch {\r\n /* ignore */\r\n }\r\n alert.resolve(true);\r\n this.removeAlert(alert.id);\r\n }\r\n\r\n cancel(alert: AlertMessage): void {\r\n alert.resolve(false);\r\n this.removeAlert(alert.id);\r\n }\r\n\r\n trackById(_index: number, item: AlertMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"AlertOverlay\" *ngIf=\"alerts.length > 0\">\r\n <div\r\n class=\"Alert\"\r\n *ngFor=\"let alert of alerts; trackBy: trackById\"\r\n [@alertAnimation]\r\n >\r\n <div class=\"AlertContent\">\r\n <div class=\"AlertIcon\">\r\n <lucide-icon name=\"circle-alert\"></lucide-icon>\r\n </div>\r\n <div class=\"AlertMessage\">\r\n {{ alert.message }}\r\n </div>\r\n <div class=\"AlertActions\">\r\n <button\r\n *ngIf=\"alert.mode === 'normal'\"\r\n type=\"button\"\r\n class=\"AlertButton AcceptButton\"\r\n (click)=\"accept(alert)\"\r\n >\r\n {{ config.alertAcceptLabel }}\r\n </button>\r\n <ng-container *ngIf=\"alert.mode === 'actions'\">\r\n <button\r\n type=\"button\"\r\n class=\"AlertButton CancelButton\"\r\n (click)=\"cancel(alert)\"\r\n >\r\n {{ config.alertCancelLabel }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"AlertButton AcceptButton\"\r\n (click)=\"accept(alert)\"\r\n >\r\n {{ config.alertAcceptLabel }}\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID, NgZone, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport type ToastType = 'success' | 'warning' | 'error' | 'info';\r\n\r\nexport interface ToastMessage {\r\n id: number;\r\n type: ToastType;\r\n message: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToastService {\r\n private toastSubject = new Subject<ToastMessage>();\r\n toast$ = this.toastSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n private ngZone: NgZone,\r\n ) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n showToast(type: ToastType, message: string): void {\r\n if (!this.isBrowser) return;\r\n\r\n const toast: ToastMessage = { id: ++this.idCounter, type, message };\r\n this.toastSubject.next(toast);\r\n this.ngZone.runOutsideAngular(() => this.playSound(type));\r\n }\r\n\r\n private playSound(type: ToastType): void {\r\n if (type === 'info') return;\r\n try {\r\n const src =\r\n type === 'error' ? this.config.toastErrorSoundUrl : this.config.toastSoundUrl;\r\n const audio = new Audio(src);\r\n void audio.play().catch(() => {});\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToastMessage, ToastService, ToastType } from './toast.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'toast-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule],\r\n templateUrl: './toast-service.component.html',\r\n styleUrls: ['./toast-service.component.sass'],\r\n animations: [\r\n trigger('toastAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateY(-20px)' }),\r\n animate('300ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('300ms ease-in', style({ opacity: 0, transform: 'translateY(-20px)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class ToastServiceComponent implements OnInit {\r\n toasts: ToastMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private toastService: ToastService) {}\r\n\r\n ngOnInit(): void {\r\n this.toastService.toast$.subscribe((toast) => {\r\n this.toasts.push(toast);\r\n const durationMs = this.config.toastDurationsMs[toast.type as ToastType] ?? 5000;\r\n setTimeout(() => this.removeToast(toast.id), durationMs);\r\n });\r\n }\r\n\r\n successGifSrc(toast: ToastMessage): string {\r\n const base = this.config.toastSuccessGifUrl;\r\n const sep = base.includes('?') ? '&' : '?';\r\n return `${base}${sep}t=${toast.id}`;\r\n }\r\n\r\n removeToast(id: number): void {\r\n this.toasts = this.toasts.filter((t) => t.id !== id);\r\n }\r\n\r\n trackById(_index: number, item: ToastMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"ToastOverlay\">\r\n <div class=\"ToastContainer\">\r\n <div\r\n class=\"Toast\"\r\n *ngFor=\"let toast of toasts; trackBy: trackById\"\r\n [@toastAnimation]\r\n [ngClass]=\"toast.type\"\r\n (click)=\"removeToast(toast.id)\"\r\n >\r\n <div class=\"Icon\" [ngSwitch]=\"toast.type\">\r\n <lucide-icon name=\"info\" *ngSwitchCase=\"'info'\"></lucide-icon>\r\n <lucide-icon name=\"circle-check\" *ngSwitchCase=\"'success'\"></lucide-icon>\r\n <lucide-icon name=\"circle-alert\" *ngSwitchCase=\"'error'\"></lucide-icon>\r\n <lucide-icon name=\"triangle-alert\" *ngSwitchCase=\"'warning'\"></lucide-icon>\r\n <lucide-icon name=\"bell\" *ngSwitchDefault></lucide-icon>\r\n </div>\r\n\r\n <div class=\"Text\">\r\n {{ toast.message }}\r\n </div>\r\n\r\n <img\r\n *ngIf=\"toast.type === 'success' && config.toastSuccessGifUrl\"\r\n class=\"SuccessToastGif\"\r\n [attr.src]=\"successGifSrc(toast)\"\r\n alt=\"\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface ContextMenuOption<T = unknown> {\r\n icon: string;\r\n name: string;\r\n value: T;\r\n /** Estilo destructivo (rojo). */\r\n danger?: boolean;\r\n /** Separador visual antes de esta opción. */\r\n separatorBefore?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface ContextMenuInfo {\r\n icon: string;\r\n title: string;\r\n info: string;\r\n}\r\n\r\nexport type ContextMenuKind = 'menu' | 'info';\r\n\r\ninterface ContextMenuRequestBase {\r\n id: number;\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport interface ContextMenuMenuRequest extends ContextMenuRequestBase {\r\n kind: 'menu';\r\n title?: string;\r\n options: ContextMenuOption[];\r\n resolve: (value: ContextMenuOption | null) => void;\r\n}\r\n\r\nexport interface ContextMenuInfoRequest extends ContextMenuRequestBase {\r\n kind: 'info';\r\n info: ContextMenuInfo;\r\n resolve: () => void;\r\n}\r\n\r\nexport type ContextMenuRequest = ContextMenuMenuRequest | ContextMenuInfoRequest;\r\n\r\nexport type ContextMenuOpenEvent = MouseEvent | { clientX: number; clientY: number };\r\n\r\nexport interface ContextMenuOpenOptions {\r\n title?: string;\r\n /** Si true (default), evita el menú nativo del navegador cuando el evento es MouseEvent. */\r\n preventDefault?: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ContextMenuService {\r\n private readonly requestSubject = new Subject<ContextMenuRequest>();\r\n readonly request$ = this.requestSubject.asObservable();\r\n\r\n private readonly closeSubject = new Subject<void>();\r\n readonly close$ = this.closeSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n /** Menú contextual en el punto del clic. Solo uno activo a la vez. */\r\n openMenu(\r\n event: ContextMenuOpenEvent,\r\n options: ContextMenuOption[],\r\n menuOptions?: ContextMenuOpenOptions,\r\n ): Promise<ContextMenuOption | null> {\r\n if (!this.isBrowser || options.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n if (event instanceof MouseEvent && menuOptions?.preventDefault !== false) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const { x, y } = this.pointFromEvent(event);\r\n return new Promise((resolve) => {\r\n const request: ContextMenuMenuRequest = {\r\n id: ++this.idCounter,\r\n kind: 'menu',\r\n x,\r\n y,\r\n title: menuOptions?.title,\r\n options,\r\n resolve,\r\n };\r\n this.requestSubject.next(request);\r\n });\r\n }\r\n\r\n /** Globo informativo en el punto del clic. */\r\n openInfo(event: ContextMenuOpenEvent, info: ContextMenuInfo): Promise<void> {\r\n if (!this.isBrowser) return Promise.resolve();\r\n\r\n const { x, y } = this.pointFromEvent(event);\r\n return new Promise((resolve) => {\r\n const request: ContextMenuInfoRequest = {\r\n id: ++this.idCounter,\r\n kind: 'info',\r\n x,\r\n y,\r\n info,\r\n resolve,\r\n };\r\n this.requestSubject.next(request);\r\n });\r\n }\r\n\r\n /** Cierra el menú contextual activo desde código. */\r\n close(): void {\r\n if (!this.isBrowser) return;\r\n this.closeSubject.next();\r\n }\r\n\r\n private pointFromEvent(event: ContextMenuOpenEvent): { x: number; y: number } {\r\n if ('clientX' in event && 'clientY' in event) {\r\n return { x: event.clientX, y: event.clientY };\r\n }\r\n return { x: 0, y: 0 };\r\n }\r\n}\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n PLATFORM_ID,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser, CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n ContextMenuOption,\r\n ContextMenuRequest,\r\n ContextMenuService,\r\n} from './context-menu.service';\r\n\r\n@Component({\r\n selector: 'context-menu-service',\r\n standalone: true,\r\n imports: [CommonModule, LucideIconComponent],\r\n templateUrl: './context-menu-service.component.html',\r\n styleUrls: ['./context-menu-service.component.sass'],\r\n})\r\nexport class ContextMenuServiceComponent implements OnInit, OnDestroy {\r\n private static readonly VIEWPORT_EDGE_INSET = 5;\r\n private static readonly ANCHOR_OFFSET = 8;\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @ViewChild('panel') panelRef?: ElementRef<HTMLElement>;\r\n\r\n active: ContextMenuRequest | null = null;\r\n position = { x: 0, y: 0 };\r\n panelVisible = false;\r\n\r\n private anchor = { x: 0, y: 0 };\r\n /** Timestamp hasta el cual ignoramos cierres (evita que el gesto de apertura cierre el menú). */\r\n private ignoreOutsideUntil = 0;\r\n private sub?: Subscription;\r\n private closeSub?: Subscription;\r\n private readonly scrollListener = (): void => {\r\n if (this.active) this.dismissCurrent(null);\r\n };\r\n private readonly outsidePointerListener = (event: Event): void => {\r\n this.handleOutsideEvent(event);\r\n };\r\n private readonly outsideContextMenuListener = (event: Event): void => {\r\n this.handleOutsideEvent(event);\r\n };\r\n\r\n constructor(\r\n private contextMenuService: ContextMenuService,\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.contextMenuService.request$.subscribe((request) => {\r\n this.dismissCurrent(null);\r\n this.active = request;\r\n this.anchor = { x: request.x, y: request.y };\r\n this.position = {\r\n x: request.x + ContextMenuServiceComponent.ANCHOR_OFFSET,\r\n y: request.y + ContextMenuServiceComponent.ANCHOR_OFFSET,\r\n };\r\n this.panelVisible = true;\r\n // Ignorar el mismo gesto de apertura y el click sintético post-contextmenu.\r\n this.ignoreOutsideUntil = performance.now() + 180;\r\n this.cdr.detectChanges();\r\n this.applyClampedPosition();\r\n });\r\n\r\n this.closeSub = this.contextMenuService.close$.subscribe(() => {\r\n this.dismissCurrent(null);\r\n });\r\n\r\n if (isPlatformBrowser(this.platformId)) {\r\n document.addEventListener('scroll', this.scrollListener, true);\r\n // Captura: no depende de que el click burbujee hasta document.\r\n document.addEventListener('pointerdown', this.outsidePointerListener, true);\r\n document.addEventListener('contextmenu', this.outsideContextMenuListener, true);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.dismissCurrent(null);\r\n this.sub?.unsubscribe();\r\n this.closeSub?.unsubscribe();\r\n if (isPlatformBrowser(this.platformId)) {\r\n document.removeEventListener('scroll', this.scrollListener, true);\r\n document.removeEventListener('pointerdown', this.outsidePointerListener, true);\r\n document.removeEventListener('contextmenu', this.outsideContextMenuListener, true);\r\n }\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n if (this.active && this.panelVisible) {\r\n this.applyClampedPosition();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onEscape(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this.active) {\r\n this.dismissCurrent(null);\r\n }\r\n }\r\n\r\n selectOption(option: ContextMenuOption): void {\r\n if (!this.active || this.active.kind !== 'menu' || option.disabled) return;\r\n const request = this.active;\r\n this.clearMenu();\r\n this.cdr.detectChanges();\r\n request.resolve(option);\r\n }\r\n\r\n private handleOutsideEvent(event: Event): void {\r\n if (!this.active) return;\r\n if (performance.now() < this.ignoreOutsideUntil) return;\r\n\r\n const target = event.target as Node | null;\r\n const panel = this.panelRef?.nativeElement;\r\n if (panel && target && panel.contains(target)) return;\r\n\r\n this.dismissCurrent(null);\r\n }\r\n\r\n private dismissCurrent(value: ContextMenuOption | null): void {\r\n if (!this.active) return;\r\n const request = this.active;\r\n this.clearMenu();\r\n this.cdr.detectChanges();\r\n if (request.kind === 'menu') {\r\n request.resolve(value);\r\n } else {\r\n request.resolve();\r\n }\r\n }\r\n\r\n private clearMenu(): void {\r\n this.active = null;\r\n this.panelVisible = false;\r\n this.ignoreOutsideUntil = 0;\r\n }\r\n\r\n private applyClampedPosition(): void {\r\n const panel = this.panelRef?.nativeElement;\r\n if (!panel) return;\r\n\r\n const inset = ContextMenuServiceComponent.VIEWPORT_EDGE_INSET;\r\n const gap = ContextMenuServiceComponent.ANCHOR_OFFSET;\r\n const viewportW = document.documentElement.clientWidth;\r\n const viewportH = document.documentElement.clientHeight;\r\n const w = panel.offsetWidth || 220;\r\n const h = panel.offsetHeight || 120;\r\n\r\n const minX = inset;\r\n const maxX = Math.max(inset, viewportW - inset - w);\r\n const minY = inset;\r\n const maxY = Math.max(inset, viewportH - inset - h);\r\n\r\n let x = this.anchor.x + gap;\r\n let y = this.anchor.y + gap;\r\n\r\n if (x > maxX) {\r\n x = this.anchor.x - w - gap;\r\n }\r\n if (y > maxY) {\r\n y = this.anchor.y - h - gap;\r\n }\r\n\r\n this.position = {\r\n x: Math.max(minX, Math.min(x, maxX)),\r\n y: Math.max(minY, Math.min(y, maxY)),\r\n };\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n","@if (active) {\r\n <div class=\"ContextMenuOverlay\" aria-hidden=\"true\">\r\n <div\r\n #panel\r\n class=\"ContextMenuPanel\"\r\n [class.ContextMenuPanel--visible]=\"panelVisible\"\r\n [class.ContextMenuPanel--menu]=\"active.kind === 'menu'\"\r\n [class.ContextMenuPanel--info]=\"active.kind === 'info'\"\r\n [style.left.px]=\"position.x\"\r\n [style.top.px]=\"position.y\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"active.kind === 'info' ? active.info.title : (active.title || 'Opciones')\"\r\n [attr.aria-hidden]=\"!panelVisible\"\r\n (contextmenu)=\"$event.preventDefault()\"\r\n >\r\n @if (active.kind === 'menu') {\r\n @if (active.title) {\r\n <p class=\"ContextMenuMenuTitle\">{{ active.title }}</p>\r\n }\r\n @for (option of active.options; track $index) {\r\n @if (option.separatorBefore) {\r\n <div class=\"ContextMenuMenuSep\" aria-hidden=\"true\"></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"ContextMenuMenuItem\"\r\n [class.ContextMenuMenuItem--danger]=\"option.danger\"\r\n [class.ContextMenuMenuItem--disabled]=\"option.disabled\"\r\n [disabled]=\"option.disabled\"\r\n role=\"menuitem\"\r\n (click)=\"selectOption(option)\"\r\n >\r\n <lucide-icon [name]=\"option.icon\" [size]=\"14\"></lucide-icon>\r\n <span>{{ option.name }}</span>\r\n </button>\r\n }\r\n } @else {\r\n <div class=\"ContextMenuInfo\">\r\n <div class=\"ContextMenuInfoHeader\">\r\n <lucide-icon [name]=\"active.info.icon\" [size]=\"18\"></lucide-icon>\r\n <strong>{{ active.info.title }}</strong>\r\n </div>\r\n <p class=\"ContextMenuInfoBody\">{{ active.info.info }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n","import { Component, Input, inject } from '@angular/core';\r\n\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport { ContextMenuService } from '../context-menu-service/context-menu.service';\r\n\r\n@Component({\r\n selector: 'field-help-tooltip',\r\n standalone: true,\r\n imports: [LucideIconComponent],\r\n templateUrl: './field-help-tooltip.component.html',\r\n styleUrl: './field-help-tooltip.component.sass',\r\n})\r\nexport class FieldHelpTooltipComponent {\r\n private readonly contextMenuService = inject(ContextMenuService);\r\n\r\n @Input({ required: true }) text = '';\r\n @Input() title = 'Información del campo';\r\n\r\n showHelp(event: MouseEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n void this.contextMenuService.openInfo(event, {\r\n icon: 'info',\r\n title: this.title,\r\n info: this.text,\r\n });\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n class=\"HelpButton\"\r\n (click)=\"showHelp($event)\"\r\n aria-label=\"Información del campo\"\r\n>\r\n <lucide-icon name=\"info\"></lucide-icon>\r\n</button>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SafeResourceUrl } from '@angular/platform-browser';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport type GeneralViewerMode = 'image' | 'video' | 'audio' | 'document' | 'download';\r\n\r\nexport interface MediaViewerState {\r\n open: boolean;\r\n mode: GeneralViewerMode;\r\n /** Pasado al visor hijo; `null`/`undefined` = autodetección según `autoDetectType`. */\r\n type: GeneralViewerMode | null | undefined;\r\n url: string | null;\r\n urlSafe: SafeResourceUrl | null;\r\n downloadUrl: string | null;\r\n fileName: string;\r\n downloadContext: unknown | null;\r\n autoDetectType: boolean;\r\n}\r\n\r\nexport type MediaViewerOpenParams = Omit<\r\n MediaViewerState,\r\n 'open' | 'type' | 'downloadContext' | 'autoDetectType' | 'fileName'\r\n> &\r\n Partial<Pick<MediaViewerState, 'type' | 'downloadContext' | 'autoDetectType' | 'fileName'>> & {\r\n onDownloadRequested?: (context: unknown) => void;\r\n };\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MediaViewerService {\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n private closedState = (): MediaViewerState => ({\r\n open: false,\r\n mode: 'image',\r\n type: undefined,\r\n url: null,\r\n urlSafe: null,\r\n downloadUrl: null,\r\n fileName: this.config.mediaFileNameFallback,\r\n downloadContext: null,\r\n autoDetectType: true,\r\n });\r\n\r\n private readonly state = new BehaviorSubject<MediaViewerState>(this.closedState());\r\n readonly state$ = this.state.asObservable();\r\n\r\n private onDownloadRequestedCallback: ((context: unknown) => void) | null = null;\r\n\r\n /**\r\n * Opens the viewer with already-resolved URLs.\r\n * Host is responsible for CDN/crypto resolution before calling `open()`.\r\n */\r\n open(params: MediaViewerOpenParams): void {\r\n const { onDownloadRequested, type, downloadContext, autoDetectType, fileName, ...rest } =\r\n params;\r\n this.onDownloadRequestedCallback = onDownloadRequested ?? null;\r\n this.state.next({\r\n open: true,\r\n type: type ?? null,\r\n downloadContext: downloadContext ?? null,\r\n autoDetectType: autoDetectType ?? true,\r\n mode: rest.mode,\r\n url: rest.url,\r\n urlSafe: rest.urlSafe,\r\n downloadUrl: rest.downloadUrl,\r\n fileName: fileName?.trim() || this.config.mediaFileNameFallback,\r\n });\r\n }\r\n\r\n close(): void {\r\n this.onDownloadRequestedCallback = null;\r\n this.state.next(this.closedState());\r\n }\r\n\r\n handleDownloadRequested(context: unknown): void {\r\n this.onDownloadRequestedCallback?.(context);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/** Resoluciones usadas en el visor (referencia para otros componentes). */\r\nexport const IMAGE_MULTIRES_WIDTHS = [150, 400, 800] as const;\r\n\r\n/**\r\n * Visor de imagen: una sola carga del original, sin progresividad (sin versión pequeña previa).\r\n */\r\n@Component({\r\n selector: 'app-image-viewer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './image-viewer.component.html',\r\n styleUrls: ['./image-viewer.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ImageViewerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n\r\n ready = false;\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.ready = false;\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onLoad(): void {\r\n this.ready = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"ImageViewer\" *ngIf=\"src\">\r\n <div class=\"RainbowLoader\" *ngIf=\"!ready && !loadError\"></div>\r\n <img\r\n *ngIf=\"src\"\r\n class=\"Layer\"\r\n [class.visible]=\"ready\"\r\n [src]=\"src\"\r\n [alt]=\"\"\r\n decoding=\"async\"\r\n (load)=\"onLoad()\"\r\n (error)=\"onError()\"\r\n />\r\n <div *ngIf=\"loadError\" class=\"FallbackNote\">\r\n <span>Error al cargar la imagen</span>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/**\r\n * Lightweight native video player (no hls.js).\r\n * HLS (.m3u8) relies on browser Safari support; other browsers may need host-side remux.\r\n */\r\n@Component({\r\n selector: 'app-video-player',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './video-player.component.html',\r\n styleUrls: ['./video-player.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class VideoPlayerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n /** Informational; native player only. */\r\n @Input() videoFormat: 'hls' | null = null;\r\n\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"VideoPlayer\" *ngIf=\"src\">\r\n <video\r\n class=\"VideoPlayerEl\"\r\n [src]=\"src\"\r\n controls\r\n playsinline\r\n (error)=\"onError()\"\r\n ></video>\r\n <p *ngIf=\"loadError\" class=\"VideoPlayerError\">No se pudo reproducir el video.</p>\r\n <p *ngIf=\"videoFormat === 'hls'\" class=\"VideoPlayerHint\">\r\n HLS: requiere soporte nativo del navegador.\r\n </p>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/** Lightweight native audio player (no wavesurfer / hls.js). */\r\n@Component({\r\n selector: 'app-audio-player',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './audio-player.component.html',\r\n styleUrls: ['./audio-player.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AudioPlayerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n @Input() name: string | null = null;\r\n\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"AudioPlayer\" *ngIf=\"src\">\r\n <p *ngIf=\"name\" class=\"AudioPlayerName\">{{ name }}</p>\r\n <audio class=\"AudioPlayerEl\" [src]=\"src\" controls (error)=\"onError()\"></audio>\r\n <p *ngIf=\"loadError\" class=\"AudioPlayerError\">No se pudo reproducir el audio.</p>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnDestroy,\r\n inject,\r\n PLATFORM_ID,\r\n SimpleChange,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { ImageViewerComponent } from './items/image-viewer/image-viewer.component';\r\nimport { VideoPlayerComponent } from './items/video-player/video-player.component';\r\nimport { AudioPlayerComponent } from './items/audio-player/audio-player.component';\r\nimport { GeneralViewerMode, MediaViewerService, MediaViewerState } from './media-viewer.service';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nconst DOCUMENT_LOAD_TIMEOUT_MS = 10000;\r\nconst VIEWER_DIFF_KEYS = ['open', 'mode', 'type', 'url', 'urlSafe', 'autoDetectType'] as const;\r\n\r\n/**\r\n * Host singleton media viewer.\r\n * Expects already-resolved public URLs from the host (no crypto / CDN decrypt).\r\n */\r\n@Component({\r\n selector: 'media-viewer-service',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,\r\n CommonModule,\r\n ImageViewerComponent,\r\n VideoPlayerComponent,\r\n AudioPlayerComponent,\r\n ],\r\n templateUrl: './media-viewer-service.component.html',\r\n styleUrls: ['./media-viewer-service.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MediaViewerServiceComponent implements OnDestroy {\r\n private platformId = inject(PLATFORM_ID);\r\n private readonly viewer = inject(MediaViewerService);\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n private cdr = inject(ChangeDetectorRef);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n private _prevVm: MediaViewerState | null = null;\r\n\r\n open = false;\r\n mode: GeneralViewerMode = 'image';\r\n type: GeneralViewerMode | null | undefined = undefined;\r\n url: string | null = null;\r\n urlSafe: SafeResourceUrl | null = null;\r\n autoDetectType = true;\r\n downloadUrl: string | null = null;\r\n fileName = 'Archivo';\r\n downloadContext: unknown = null;\r\n\r\n detectedMode: GeneralViewerMode | null = null;\r\n detectingOrLoading = false;\r\n detectError = false;\r\n documentBlobUrl: string | null = null;\r\n documentRenderFailed = false;\r\n resolvedMediaUrl: string | null = null;\r\n private blobUrlsToRevoke: string[] = [];\r\n private documentLoadTimeout: ReturnType<typeof setTimeout> | null = null;\r\n private cachedDocumentUrlRaw: string | null = null;\r\n private cachedDocumentUrlSafe: SafeResourceUrl | null = null;\r\n\r\n constructor() {\r\n this.viewer.state$.pipe(takeUntilDestroyed()).subscribe((vm) => {\r\n const changes = this.diffViewerState(this._prevVm, vm);\r\n this.applyVmFields(vm);\r\n this._prevVm = vm;\r\n this.onViewerInputsChanged(changes);\r\n });\r\n }\r\n\r\n private diffViewerState(prev: MediaViewerState | null, curr: MediaViewerState): SimpleChanges {\r\n const out: SimpleChanges = {};\r\n for (const k of VIEWER_DIFF_KEYS) {\r\n const p = prev?.[k];\r\n const c = curr[k];\r\n if (p !== c) {\r\n out[k] = new SimpleChange(p, c, prev === null);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n private applyVmFields(vm: MediaViewerState): void {\r\n this.open = vm.open;\r\n this.mode = vm.mode;\r\n this.type = vm.type;\r\n this.url = vm.url;\r\n this.urlSafe = vm.urlSafe;\r\n this.autoDetectType = vm.autoDetectType;\r\n this.downloadUrl = vm.downloadUrl;\r\n this.fileName = vm.fileName || this.config.mediaFileNameFallback;\r\n this.downloadContext = vm.downloadContext;\r\n }\r\n\r\n get effectiveMode(): GeneralViewerMode {\r\n return this.detectedMode ?? this.mode;\r\n }\r\n\r\n get videoPlayerFormat(): 'hls' | null {\r\n const u = (this.mediaSrc ?? '').trim().toLowerCase();\r\n return u.includes('.m3u8') ? 'hls' : null;\r\n }\r\n\r\n get typeLabel(): string {\r\n if (this.detectingOrLoading && !this.detectedMode) return 'Cargando...';\r\n const labels: Record<GeneralViewerMode, string> = {\r\n image: 'Imagen',\r\n video: 'Video',\r\n audio: 'Audio',\r\n document: 'Documento',\r\n download: 'Archivo',\r\n };\r\n return labels[this.effectiveMode] ?? this.config.mediaFileNameFallback;\r\n }\r\n\r\n get loadingMessage(): string {\r\n if (!this.detectedMode) return 'Detectando tipo...';\r\n const labels: Record<GeneralViewerMode, string> = {\r\n image: 'Imagen',\r\n video: 'Video',\r\n audio: 'Audio',\r\n document: 'Documento',\r\n download: 'Archivo',\r\n };\r\n const name = labels[this.detectedMode] ?? 'archivo';\r\n return `Cargando ${name.toLowerCase()}...`;\r\n }\r\n\r\n get mediaSrc(): string | null {\r\n if (this.resolvedMediaUrl) return this.resolvedMediaUrl;\r\n return this.url;\r\n }\r\n\r\n get documentUrlSafe(): SafeResourceUrl | null {\r\n if (this.urlSafe) return this.urlSafe;\r\n const url = this.documentBlobUrl ?? this.url ?? null;\r\n if (!url || this.effectiveMode !== 'document') {\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n return null;\r\n }\r\n if (this.cachedDocumentUrlRaw === url && this.cachedDocumentUrlSafe) {\r\n return this.cachedDocumentUrlSafe;\r\n }\r\n this.cachedDocumentUrlRaw = url;\r\n this.cachedDocumentUrlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n return this.cachedDocumentUrlSafe;\r\n }\r\n\r\n private onViewerInputsChanged(changes: SimpleChanges): void {\r\n const docRelevant =\r\n (changes['open'] ??\r\n changes['mode'] ??\r\n changes['type'] ??\r\n changes['url'] ??\r\n changes['urlSafe'] ??\r\n changes['autoDetectType']) != null;\r\n if (!docRelevant) return;\r\n\r\n if (changes['url'] ?? changes['urlSafe']) {\r\n this.documentBlobUrl = null;\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n }\r\n\r\n if (!this.open || !this.url) {\r\n this.documentBlobUrl = null;\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n this.revokeBlobUrls();\r\n this.resolvedMediaUrl = null;\r\n this.detectedMode = null;\r\n this.detectingOrLoading = false;\r\n this.detectError = false;\r\n }\r\n\r\n if (this.open && this.url) {\r\n const hasExplicitType = this.type != null && this.type !== undefined;\r\n if (hasExplicitType) {\r\n this.detectedMode = this.type;\r\n this.detectError = false;\r\n this.detectingOrLoading = false;\r\n this.resolvedMediaUrl = this.url;\r\n if (this.type === 'document') {\r\n void this.fetchAsBlob(this.url).then((blobUrl) => {\r\n if (blobUrl) {\r\n this.documentBlobUrl = blobUrl;\r\n this.blobUrlsToRevoke.push(blobUrl);\r\n }\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n this.cdr.markForCheck();\r\n } else if (this.autoDetectType) {\r\n this.detectAndLoadFromUrl(this.url);\r\n } else {\r\n this.detectedMode = this.mode;\r\n this.resolvedMediaUrl = this.url;\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n }\r\n } else {\r\n this.resolvedMediaUrl = null;\r\n }\r\n\r\n this.clearDocumentLoadTimeout();\r\n if (\r\n this.open &&\r\n this.effectiveMode === 'document' &&\r\n (this.documentBlobUrl || this.url || this.urlSafe)\r\n ) {\r\n this.documentRenderFailed = false;\r\n this.documentLoadTimeout = setTimeout(() => {\r\n this.documentLoadTimeout = null;\r\n this.documentRenderFailed = true;\r\n this.cdr.markForCheck();\r\n }, DOCUMENT_LOAD_TIMEOUT_MS);\r\n } else {\r\n this.documentRenderFailed = false;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearDocumentLoadTimeout();\r\n this.revokeBlobUrls();\r\n }\r\n\r\n private detectAndLoadFromUrl(url: string): void {\r\n this.revokeBlobUrls();\r\n this.resolvedMediaUrl = null;\r\n this.documentBlobUrl = null;\r\n this.detectedMode = null;\r\n this.detectError = false;\r\n this.detectingOrLoading = true;\r\n this.cdr.markForCheck();\r\n\r\n this.fetchContentType(url)\r\n .then((contentType) => this.detectModeFromContentType(url, contentType))\r\n .then((mode) => {\r\n this.detectedMode = mode;\r\n this.cdr.markForCheck();\r\n if (mode === 'image' || mode === 'document') {\r\n return this.fetchAsBlob(url).then((blobUrl) => {\r\n if (mode === 'image') this.resolvedMediaUrl = blobUrl ?? url;\r\n else this.documentBlobUrl = blobUrl;\r\n if (blobUrl) this.blobUrlsToRevoke.push(blobUrl);\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n this.resolvedMediaUrl = url;\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n return undefined;\r\n })\r\n .catch(() => {\r\n this.detectError = true;\r\n this.detectingOrLoading = false;\r\n this.detectedMode = this.mode;\r\n this.resolvedMediaUrl = url;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n private fetchContentType(url: string): Promise<string> {\r\n const readCt = (r: Response) => (r.headers.get('content-type') ?? '').trim();\r\n\r\n const tryHead = (): Promise<string> =>\r\n fetch(url, { method: 'HEAD', mode: 'cors' }).then((r) => {\r\n if (!r.ok) return '';\r\n return readCt(r);\r\n });\r\n\r\n const tryGetRange = (): Promise<string> =>\r\n fetch(url, {\r\n method: 'GET',\r\n mode: 'cors',\r\n headers: { Range: 'bytes=0-0' },\r\n }).then((r) => {\r\n if (!(r.ok || r.status === 206)) return '';\r\n return readCt(r);\r\n });\r\n\r\n return tryHead()\r\n .then((ct) => ct || tryGetRange())\r\n .catch(() => tryGetRange())\r\n .catch(() => '');\r\n }\r\n\r\n private urlPathname(absUrl: string): string {\r\n try {\r\n const base =\r\n typeof window !== 'undefined' && window.location?.origin\r\n ? window.location.origin\r\n : 'https://invalid.local';\r\n return new URL(absUrl, base).pathname;\r\n } catch {\r\n return absUrl.split(/[?#]/)[0];\r\n }\r\n }\r\n\r\n private pathnameExtensionFromUrl(absUrl: string): string {\r\n const path = this.urlPathname(absUrl);\r\n const base = path.split('/').pop() ?? '';\r\n const dot = base.lastIndexOf('.');\r\n return dot > 0 ? base.slice(dot + 1).toLowerCase() : '';\r\n }\r\n\r\n private detectModeFromUrlPathOnly(absUrl: string): GeneralViewerMode | null {\r\n const pathLower = this.urlPathname(absUrl).toLowerCase();\r\n if (pathLower.endsWith('.m3u8') || pathLower.includes('/master.m3u8')) {\r\n return 'video';\r\n }\r\n const ext = this.pathnameExtensionFromUrl(absUrl);\r\n if (['webp', 'jpg', 'jpeg', 'png', 'gif', 'avif', 'bmp', 'svg'].includes(ext)) return 'image';\r\n if (['webm', 'mp4', 'ogg', 'ogv', 'mov', 'm4v', 'mkv'].includes(ext)) return 'video';\r\n if (['mp3', 'wav', 'oga', 'm4a', 'aac', 'flac', 'opus'].includes(ext)) return 'audio';\r\n if (['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp'].includes(ext)) {\r\n return 'document';\r\n }\r\n return null;\r\n }\r\n\r\n private detectModeFromContentType(url: string, contentType: string): GeneralViewerMode {\r\n const type = (contentType.split(';')[0] ?? '').trim().toLowerCase();\r\n const fromPath = this.detectModeFromUrlPathOnly(url);\r\n\r\n if (type.startsWith('image/')) return 'image';\r\n if (type.startsWith('video/')) return 'video';\r\n if (type.startsWith('audio/')) return 'audio';\r\n if (type === 'application/pdf' || type.includes('pdf')) return 'document';\r\n if (\r\n type.includes('document') ||\r\n type.includes('msword') ||\r\n type.includes('excel') ||\r\n type.includes('powerpoint') ||\r\n type.includes('officedocument') ||\r\n type.includes('opendocument')\r\n ) {\r\n return 'document';\r\n }\r\n\r\n if (fromPath) return fromPath;\r\n return 'download';\r\n }\r\n\r\n private fetchAsBlob(url: string): Promise<string | null> {\r\n return fetch(url, { mode: 'cors' })\r\n .then((r) => {\r\n if (!r.ok) throw new Error('Fetch failed');\r\n return r.blob();\r\n })\r\n .then((blob) => URL.createObjectURL(blob))\r\n .catch(() => null);\r\n }\r\n\r\n private revokeBlobUrls(): void {\r\n const toRevoke = [...this.blobUrlsToRevoke];\r\n this.blobUrlsToRevoke = [];\r\n if (this.resolvedMediaUrl && toRevoke.includes(this.resolvedMediaUrl)) {\r\n this.resolvedMediaUrl = null;\r\n }\r\n this.documentBlobUrl = null;\r\n for (const u of toRevoke) {\r\n try {\r\n URL.revokeObjectURL(u);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n }\r\n\r\n private clearDocumentLoadTimeout(): void {\r\n if (this.documentLoadTimeout != null) {\r\n clearTimeout(this.documentLoadTimeout);\r\n this.documentLoadTimeout = null;\r\n }\r\n }\r\n\r\n onDocumentIframeLoad(): void {\r\n this.clearDocumentLoadTimeout();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onBackdropClick(): void {\r\n this.viewer.close();\r\n }\r\n\r\n onContentClick(event: Event): void {\r\n event.stopPropagation();\r\n }\r\n\r\n close(): void {\r\n this.viewer.close();\r\n }\r\n\r\n triggerDownload(): void {\r\n const url = this.downloadUrl ?? this.url;\r\n if (url && typeof url === 'string' && url.trim().startsWith('http')) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n window.open(url.trim(), '_blank');\r\n }\r\n } else if (this.downloadContext != null) {\r\n this.viewer.handleDownloadRequested(this.downloadContext);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"GeneralViewerBackdrop\" *ngIf=\"open\" (click)=\"onBackdropClick()\">\r\n <div class=\"GeneralViewerContent\" (click)=\"onContentClick($event)\">\r\n <div class=\"GeneralViewerHeader\">\r\n <span class=\"GeneralViewerTypeLabel\">{{ typeLabel }}</span>\r\n <button type=\"button\" class=\"GeneralViewerClose\" (click)=\"close()\" aria-label=\"Cerrar\">\r\n <lucide-icon name=\"x\"></lucide-icon>\r\n </button>\r\n </div>\r\n <div class=\"GeneralViewerBody\" [class.GeneralViewerBody--document]=\"effectiveMode === 'document'\">\r\n <div *ngIf=\"detectingOrLoading\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\r\n <p>{{ loadingMessage }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && detectError && !resolvedMediaUrl && effectiveMode === 'download'\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"triangle-alert\"></lucide-icon>\r\n <p>No se pudo detectar el tipo de archivo.</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"url\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">Descargar</button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <app-image-viewer\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'image' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n ></app-image-viewer>\r\n\r\n <app-video-player\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'video' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n [videoFormat]=\"videoPlayerFormat\"\r\n ></app-video-player>\r\n\r\n <app-audio-player\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'audio' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n [name]=\"fileName\"\r\n ></app-audio-player>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'document' && documentUrlSafe && !documentRenderFailed\" class=\"GeneralViewerDocument\">\r\n <iframe\r\n [src]=\"documentUrlSafe\"\r\n frameborder=\"0\"\r\n class=\"GeneralViewerIframe\"\r\n [attr.title]=\"fileName\"\r\n (load)=\"onDocumentIframeLoad()\"\r\n ></iframe>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'document' && documentRenderFailed\" class=\"GeneralViewerDownload\">\r\n <p class=\"GeneralViewerDownloadMessage\">\r\n No se pudo mostrar el documento. Puede descargarlo con el botón o cerrar.\r\n </p>\r\n <p class=\"GeneralViewerDownloadFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"downloadUrl || url || downloadContext\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">\r\n Descargar\r\n </button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">\r\n Listo, Cerrar\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'download' && !detectError\" class=\"GeneralViewerDownload\">\r\n <p class=\"GeneralViewerDownloadMessage\">\r\n {{ (downloadUrl || url || downloadContext) ? 'Este archivo no se puede previsualizar. Puede descargarlo con el botón o cerrar.' : 'No se pudo cargar la URL del archivo.' }}\r\n </p>\r\n <p class=\"GeneralViewerDownloadFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"downloadUrl || url || downloadContext\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">\r\n Descargar\r\n </button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">\r\n Listo, Cerrar\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && open && effectiveMode === 'document' && !documentUrlSafe && !documentRenderFailed\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\r\n <p>Cargando documento...</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && open && effectiveMode !== 'download' && effectiveMode !== 'document' && !mediaSrc && !documentUrlSafe\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"file\"></lucide-icon>\r\n <p>No se pudo cargar el archivo</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Listo, Cerrar</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface SessionRequestMessage {\r\n id: number;\r\n lucideIcon: string;\r\n message: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SessionRequestService {\r\n private sessionRequestSubject = new Subject<SessionRequestMessage>();\r\n sessionRequest$ = this.sessionRequestSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n /**\r\n * Muestra un overlay solicitando sesión.\r\n * @param lucideIcon Nombre del icono Lucide en kebab-case (ej: shopping-cart).\r\n */\r\n showSessionRequest(lucideIcon: string, message: string): void {\r\n if (!this.isBrowser) return;\r\n\r\n const sessionRequest: SessionRequestMessage = {\r\n id: ++this.idCounter,\r\n lucideIcon,\r\n message,\r\n };\r\n this.sessionRequestSubject.next(sessionRequest);\r\n }\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { SessionRequestMessage, SessionRequestService } from './session-request.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'session-request-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule, RouterModule],\r\n templateUrl: './session-request-service.component.html',\r\n styleUrls: ['./session-request-service.component.sass'],\r\n animations: [\r\n trigger('sessionRequestAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'scale(0.9)' }),\r\n animate('200ms ease-out', style({ opacity: 1, transform: 'scale(1)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ opacity: 0, transform: 'scale(0.9)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class SessionRequestServiceComponent implements OnInit {\r\n sessionRequests: SessionRequestMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private sessionRequestService: SessionRequestService) {}\r\n\r\n ngOnInit(): void {\r\n this.sessionRequestService.sessionRequest$.subscribe((sessionRequest) => {\r\n this.sessionRequests.push(sessionRequest);\r\n });\r\n }\r\n\r\n closeSessionRequest(id: number): void {\r\n this.sessionRequests = this.sessionRequests.filter((sr) => sr.id !== id);\r\n }\r\n\r\n trackById(_index: number, item: SessionRequestMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"SessionRequestOverlay\" *ngIf=\"sessionRequests.length > 0\">\r\n <div\r\n class=\"SessionRequest\"\r\n *ngFor=\"let sessionRequest of sessionRequests; trackBy: trackById\"\r\n [@sessionRequestAnimation]\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"CloseButton\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n title=\"Cerrar\"\r\n >\r\n <lucide-icon name=\"x\"></lucide-icon>\r\n </button>\r\n <div class=\"SessionRequestContent\">\r\n <div class=\"SessionRequestIcon\">\r\n <lucide-icon [name]=\"sessionRequest.lucideIcon\"></lucide-icon>\r\n </div>\r\n <div class=\"SessionRequestMessage\">\r\n {{ sessionRequest.message }}\r\n </div>\r\n <div class=\"SessionRequestActions\">\r\n <a\r\n class=\"SessionRequestButton RegisterButton\"\r\n [routerLink]=\"config.sessionRegisterPath\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n >\r\n <lucide-icon name=\"user-plus\"></lucide-icon>\r\n {{ config.sessionRegisterLabel }}\r\n </a>\r\n <a\r\n class=\"SessionRequestButton LoginButton\"\r\n [routerLink]=\"config.sessionLoginPath\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n >\r\n <lucide-icon name=\"log-in\"></lucide-icon>\r\n {{ config.sessionLoginLabel }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport interface GlobalLoadingProcess {\r\n id: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Capa global de carga: un mismo backdrop desde el primer `push` hasta el último `pop`.\r\n * Varios procesos concurrentes se listan con su mensaje.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class GlobalLoadingService {\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n get defaultMessage(): string {\r\n return this.config.loadingDefaultMessage;\r\n }\r\n\r\n private seq = 0;\r\n private readonly processes$ = new BehaviorSubject<GlobalLoadingProcess[]>([]);\r\n\r\n get snapshot(): GlobalLoadingProcess[] {\r\n return this.processes$.getValue();\r\n }\r\n\r\n readonly processes = this.processes$.asObservable();\r\n\r\n push(message?: string): string {\r\n const id = `gl-${++this.seq}`;\r\n const msg =\r\n message != null && String(message).trim() !== ''\r\n ? String(message).trim()\r\n : this.defaultMessage;\r\n const next = [...this.processes$.getValue(), { id, message: msg }];\r\n this.processes$.next(next);\r\n return id;\r\n }\r\n\r\n setMessage(id: string, message: string): void {\r\n const msg = String(message).trim() || this.defaultMessage;\r\n const cur = this.processes$.getValue();\r\n const idx = cur.findIndex((p) => p.id === id);\r\n if (idx < 0) return;\r\n const next = [...cur];\r\n next[idx] = { ...next[idx], message: msg };\r\n this.processes$.next(next);\r\n }\r\n\r\n pop(id: string): void {\r\n const cur = this.processes$.getValue();\r\n const next = cur.filter((p) => p.id !== id);\r\n if (next.length === cur.length) return;\r\n this.processes$.next(next);\r\n }\r\n}\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n GlobalLoadingProcess,\r\n GlobalLoadingService,\r\n} from './global-loading.service';\r\n\r\n@Component({\r\n selector: 'global-loading-service',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './global-loading-service.component.html',\r\n styleUrls: ['./global-loading-service.component.sass'],\r\n})\r\nexport class GlobalLoadingServiceComponent implements OnInit, OnDestroy {\r\n processes: GlobalLoadingProcess[] = [];\r\n private sub?: Subscription;\r\n\r\n constructor(private globalLoading: GlobalLoadingService) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.globalLoading.processes.subscribe((list) => {\r\n this.processes = list;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n }\r\n\r\n trackById(_index: number, item: GlobalLoadingProcess): string {\r\n return item.id;\r\n }\r\n}\r\n","<div\r\n *ngIf=\"processes.length > 0\"\r\n class=\"GlobalLoadingOverlay\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"GlobalLoadingCard\">\r\n <div class=\"GlobalLoadingSpinner\" aria-hidden=\"true\"></div>\r\n <ul class=\"GlobalLoadingList\">\r\n <li *ngFor=\"let p of processes; trackBy: trackById\" class=\"GlobalLoadingItem\">\r\n {{ p.message }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>\r\n","import { Injectable, PLATFORM_ID, inject, signal } from '@angular/core'\nimport { isPlatformBrowser } from '@angular/common'\nimport {\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n NavigationStart,\n Router,\n} from '@angular/router'\n\nconst SHOW_DELAY_MS = 120\nconst COMPLETE_HIDE_MS = 320\nconst PROGRESS_TICK_MS = 180\nconst MAX_SIMULATED_PROGRESS = 92\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationLoadingService {\n private readonly router = inject(Router)\n private readonly platformId = inject(PLATFORM_ID)\n\n /** Barra visible (solo tras superar el delay en navegaciones lentas). */\n readonly active = signal(false)\n /** Progreso 0–100 para la barra. */\n readonly progress = signal(0)\n\n private routerBound = false\n private navigationGeneration = 0\n private showDelayTimer: ReturnType<typeof setTimeout> | null = null\n private progressTimer: ReturnType<typeof setInterval> | null = null\n private hideTimer: ReturnType<typeof setTimeout> | null = null\n\n /** Llamar una vez desde el host (evita suscribirse en el constructor). */\n bindToRouter(): void {\n if (this.routerBound || !isPlatformBrowser(this.platformId)) {\n return\n }\n this.routerBound = true\n\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationStart) {\n this.onNavigationStart()\n return\n }\n if (\n event instanceof NavigationEnd ||\n event instanceof NavigationCancel ||\n event instanceof NavigationError\n ) {\n this.onNavigationEnd()\n }\n })\n }\n\n private onNavigationStart(): void {\n this.navigationGeneration += 1\n const generation = this.navigationGeneration\n\n this.clearHideTimer()\n this.clearProgressTimer()\n this.clearShowDelayTimer()\n\n this.showDelayTimer = setTimeout(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n this.active.set(true)\n this.progress.set(12)\n this.startProgressSimulation(generation)\n }, SHOW_DELAY_MS)\n }\n\n private onNavigationEnd(): void {\n this.navigationGeneration += 1\n const generation = this.navigationGeneration\n\n this.clearShowDelayTimer()\n this.clearProgressTimer()\n\n if (!this.active()) {\n this.progress.set(0)\n return\n }\n\n this.progress.set(100)\n\n this.clearHideTimer()\n this.hideTimer = setTimeout(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n this.active.set(false)\n this.progress.set(0)\n }, COMPLETE_HIDE_MS)\n }\n\n private startProgressSimulation(generation: number): void {\n this.clearProgressTimer()\n this.progressTimer = setInterval(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n const current = this.progress()\n if (current >= MAX_SIMULATED_PROGRESS) {\n return\n }\n const step = current < 40 ? 14 : current < 70 ? 8 : 4\n this.progress.set(Math.min(MAX_SIMULATED_PROGRESS, current + step))\n }, PROGRESS_TICK_MS)\n }\n\n private clearShowDelayTimer(): void {\n if (this.showDelayTimer !== null) {\n clearTimeout(this.showDelayTimer)\n this.showDelayTimer = null\n }\n }\n\n private clearProgressTimer(): void {\n if (this.progressTimer !== null) {\n clearInterval(this.progressTimer)\n this.progressTimer = null\n }\n }\n\n private clearHideTimer(): void {\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer)\n this.hideTimer = null\n }\n }\n}\n","import { Component, OnInit, inject } from '@angular/core';\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\nimport { NavigationLoadingService } from './navigation-loading.service';\n\n@Component({\n selector: 'navigation-loading-service',\n standalone: true,\n imports: [LucideIconComponent],\n templateUrl: './navigation-loading-service.component.html',\n styleUrl: './navigation-loading-service.component.sass',\n})\nexport class NavigationLoadingServiceComponent implements OnInit {\n readonly navLoading = inject(NavigationLoadingService);\n\n ngOnInit(): void {\n this.navLoading.bindToRouter();\n }\n}\n","@if (navLoading.active()) {\n <div\n class=\"NavigationLoadingBackdrop\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n aria-label=\"Navegando\"\n >\n <div class=\"NavigationLoadingCard\">\n <div class=\"NavigationLoadingIconWrap\" aria-hidden=\"true\">\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\n </div>\n <div class=\"NavigationLoadingCopy\">\n <p class=\"NavigationLoadingTitle\">Navegando...</p>\n <p class=\"NavigationLoadingHint\">Preparando la vista</p>\n </div>\n <div class=\"NavigationLoadingProgressTrack\" aria-hidden=\"true\">\n <div class=\"NavigationLoadingProgressFill\" [style.width.%]=\"navLoading.progress()\"></div>\n </div>\n </div>\n </div>\n}\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport interface AiAutofillOverlayState {\r\n id: string;\r\n title: string;\r\n logs: string[];\r\n startedAt: number;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AiAutofillOverlayService {\r\n private seq = 0;\r\n private readonly state$ = new BehaviorSubject<AiAutofillOverlayState | null>(null);\r\n\r\n readonly state = this.state$.asObservable();\r\n\r\n get snapshot(): AiAutofillOverlayState | null {\r\n return this.state$.getValue();\r\n }\r\n\r\n start(title: string = 'Autocompletando con IA...'): string {\r\n const id = `ai-${++this.seq}`;\r\n this.state$.next({\r\n id,\r\n title: String(title).trim() || 'Autocompletando con IA...',\r\n logs: [],\r\n startedAt: Date.now(),\r\n });\r\n return id;\r\n }\r\n\r\n log(id: string, line: string): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n const msg = String(line ?? '').trim();\r\n if (!msg) return;\r\n this.state$.next({ ...cur, logs: [...cur.logs, msg] });\r\n }\r\n\r\n replaceLogs(id: string, logs: string[]): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n this.state$.next({ ...cur, logs: Array.isArray(logs) ? logs.map((x) => String(x)) : [] });\r\n }\r\n\r\n end(id: string): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n this.state$.next(null);\r\n }\r\n}\r\n\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n AiAutofillOverlayService,\r\n AiAutofillOverlayState,\r\n} from './ai-autofill-overlay.service';\r\n\r\n@Component({\r\n selector: 'ai-autofill-overlay-service',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ai-autofill-overlay-service.component.html',\r\n styleUrls: ['./ai-autofill-overlay-service.component.sass'],\r\n})\r\nexport class AiAutofillOverlayServiceComponent implements OnInit, OnDestroy {\r\n state: AiAutofillOverlayState | null = null;\r\n private sub?: Subscription;\r\n\r\n constructor(private aiOverlay: AiAutofillOverlayService) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.aiOverlay.state.subscribe((s) => {\r\n this.state = s;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n }\r\n}\r\n\r\n","<div\r\n *ngIf=\"state\"\r\n class=\"AiAutofillOverlay\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"AiAutofillCard\">\r\n <div class=\"AiAutofillHeader\">\r\n <div class=\"AiAutofillSpinner\" aria-hidden=\"true\"></div>\r\n <div class=\"AiAutofillTitle\">{{ state.title }}</div>\r\n </div>\r\n\r\n <div class=\"AiAutofillLogs\" aria-label=\"Logs de IA en tiempo real\">\r\n <pre class=\"AiAutofillPre\">{{ state.logs.join('\\n') }}</pre>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Inject, Injectable, PLATFORM_ID, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\nimport { AlertService } from '../alert-service/alert.service';\r\n\r\nexport type BrowserNotificationPayload = {\r\n title: string;\r\n body: string;\r\n /** Agrupa/reemplaza notificaciones con el mismo tag. */\r\n tag: string;\r\n data?: Record<string, unknown>;\r\n onClick?: () => void;\r\n};\r\n\r\n/**\r\n * Thin wrapper around the Web Notifications API.\r\n * Host-agnostic: no chat/app coupling. Optional AlertService for permission prompt.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class BrowserNotificationService {\r\n private readonly isBrowser: boolean;\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n private readonly alert = inject(AlertService, { optional: true });\r\n private permissionRequestInFlight: Promise<NotificationPermission> | null = null;\r\n private readonly pendingQueue: BrowserNotificationPayload[] = [];\r\n private readonly tracked = new Map<string, Notification>();\r\n\r\n constructor(@Inject(PLATFORM_ID) platformId: object) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n }\r\n\r\n get isSupported(): boolean {\r\n return this.isBrowser && typeof Notification !== 'undefined';\r\n }\r\n\r\n get permission(): NotificationPermission {\r\n if (!this.isSupported) return 'denied';\r\n return Notification.permission;\r\n }\r\n\r\n get canShow(): boolean {\r\n return this.isSupported && this.permission === 'granted';\r\n }\r\n\r\n queuePending(payload: BrowserNotificationPayload): void {\r\n this.pendingQueue.push(payload);\r\n if (this.pendingQueue.length > 8) {\r\n this.pendingQueue.shift();\r\n }\r\n }\r\n\r\n /** Call from a user gesture (click) so the browser allows requestPermission. */\r\n beginPermissionRequest(): void {\r\n if (!this.isSupported || Notification.permission !== 'default') return;\r\n if (!this.permissionRequestInFlight) {\r\n this.permissionRequestInFlight = Notification.requestPermission().catch(\r\n () => 'denied' as NotificationPermission,\r\n );\r\n }\r\n }\r\n\r\n async completePermissionRequest(): Promise<boolean> {\r\n if (!this.isSupported) return false;\r\n if (Notification.permission === 'granted') return true;\r\n if (Notification.permission === 'denied') return false;\r\n if (!this.permissionRequestInFlight) return false;\r\n const perm = await this.permissionRequestInFlight;\r\n return perm === 'granted';\r\n }\r\n\r\n /**\r\n * Optional UX helper: confirm via AlertService then request permission on Accept click.\r\n * Returns whether permission was granted.\r\n */\r\n async requestPermissionWithPrompt(promptMessage?: string): Promise<boolean> {\r\n if (!this.isSupported) return false;\r\n if (this.permission === 'granted') return true;\r\n if (this.permission === 'denied') return false;\r\n\r\n if (!this.alert) {\r\n this.beginPermissionRequest();\r\n return this.completePermissionRequest();\r\n }\r\n\r\n const accepted = await this.alert.showConfirm(\r\n promptMessage ?? this.config.browserNotificationPermissionPrompt,\r\n { onAcceptClick: () => this.beginPermissionRequest() },\r\n );\r\n if (!accepted) return false;\r\n return this.completePermissionRequest();\r\n }\r\n\r\n drainPendingQueue(): number {\r\n const batch = [...this.pendingQueue];\r\n this.pendingQueue.length = 0;\r\n let shown = 0;\r\n for (const payload of batch) {\r\n if (this.show(payload)) shown += 1;\r\n }\r\n return shown;\r\n }\r\n\r\n showOrQueue(payload: BrowserNotificationPayload): boolean {\r\n if (!this.isSupported) return false;\r\n if (this.canShow) return this.show(payload);\r\n if (Notification.permission === 'denied') return false;\r\n this.queuePending(payload);\r\n return false;\r\n }\r\n\r\n show(payload: BrowserNotificationPayload): boolean {\r\n if (!this.canShow) return false;\r\n\r\n try {\r\n const icon = this.resolveIconUrl();\r\n const notification = new Notification(payload.title, {\r\n body: payload.body,\r\n tag: payload.tag,\r\n icon,\r\n badge: icon,\r\n requireInteraction: false,\r\n silent: false,\r\n data: payload.data,\r\n });\r\n\r\n this.tracked.set(payload.tag, notification);\r\n notification.onclose = () => this.tracked.delete(payload.tag);\r\n\r\n notification.onclick = (ev) => {\r\n ev.preventDefault();\r\n try {\r\n window.focus();\r\n } catch {\r\n /* ignore */\r\n }\r\n payload.onClick?.();\r\n notification.close();\r\n };\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n closeByTag(tag: string): void {\r\n const n = this.tracked.get(tag);\r\n if (n) {\r\n try {\r\n n.close();\r\n } catch {\r\n /* ignore */\r\n }\r\n this.tracked.delete(tag);\r\n }\r\n }\r\n\r\n playSound(): void {\r\n if (!this.isBrowser || !this.canShow) return;\r\n try {\r\n const audio = new Audio(this.config.browserNotificationSoundUrl);\r\n audio.volume = 0.45;\r\n void audio.play().catch(() => {});\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n\r\n private resolveIconUrl(): string | undefined {\r\n if (!this.isBrowser) return undefined;\r\n try {\r\n return new URL(this.config.browserNotificationIconUrl, window.location.origin).href;\r\n } catch {\r\n return this.config.browserNotificationIconUrl;\r\n }\r\n }\r\n}\r\n","/*\r\n * Public API Surface of @xosue-utils/services\r\n */\r\n\r\nexport * from './lib/index';\r\n\r\nexport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n XOSUE_UTILS_SERVICES_DEFAULTS,\r\n provideXosueUtilsServices,\r\n resolveXosueUtilsServicesConfig,\r\n} from './config/services-config';\r\nexport type {\r\n XosueUtilsServicesConfig,\r\n ResolvedXosueUtilsServicesConfig,\r\n ToastDurationKey,\r\n} from './config/services-config';\r\n\r\nexport { LucideIconComponent } from './vendor/lucide-icon/lucide-icon.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AlertService","i1.ToastService","i1","i1.SessionRequestService","i1.GlobalLoadingService","i1.AiAutofillOverlayService"],"mappings":";;;;;;;;;;;;MAoBa,YAAY,CAAA;AAOkB,IAAA,UAAA;AANjC,IAAA,YAAY,GAAG,IAAI,OAAO,EAAgB;AAClD,IAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IAEjC,SAAS,GAAG,CAAC;AACJ,IAAA,SAAS;AAE1B,IAAA,WAAA,CAAyC,UAAkB,EAAA;QAAlB,IAAA,CAAA,UAAU,GAAV,UAAU;QACjD,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IACrD;AAEA,IAAA,SAAS,CAAC,OAAe,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAElD,QAAA,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,KAAI;AACtC,YAAA,MAAM,KAAK,GAAiB;AAC1B,gBAAA,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS;gBACpB,OAAO;AACP,gBAAA,IAAI,EAAE,QAAQ;gBACd,OAAO;aACR;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,CAAC,OAAe,EAAE,OAA6B,EAAA;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAElD,QAAA,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,KAAI;AACtC,YAAA,MAAM,KAAK,GAAiB;AAC1B,gBAAA,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS;gBACpB,OAAO;AACP,gBAAA,IAAI,EAAE,SAAS;gBACf,OAAO;gBACP,aAAa,EAAE,OAAO,EAAE,aAAa;aACtC;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;AAtCW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,kBAOH,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAPpB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA;;4FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAQnB,MAAM;2BAAC,WAAW;;;ACxBjC;;;;;;;;;;;AAWG;MAqBU,mBAAmB,CAAA;AACrB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAU;AAC/B,IAAA,IAAI,GAAG,KAAK,CAA8B,SAAS,CAAC;IACpD,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;IAEpD,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAEtD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;QACrB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAC1D,QAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACzB,YAAA,OAAO,EAAE,KAAK,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI,EAAE,MAAM,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI,EAAE;QAC9C;QACA,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAChC,QAAA,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACjC,YAAA,OAAO,EAAE,KAAK,EAAE,CAAA,EAAG,OAAO,CAAA,EAAA,CAAI,EAAE,MAAM,EAAE,CAAA,EAAG,OAAO,CAAA,EAAA,CAAI,EAAE;QAC1D;QACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;AAC5C,IAAA,CAAC,CAAC;wGAlBS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAZpB,CAAA;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAfS,iBAAiB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAiBhB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBApB/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,iBAAiB,CAAC;AAC5B,oBAAA,IAAI,EAAE;AACJ,wBAAA,6BAA6B,EAAE,UAAU;AACzC,wBAAA,eAAe,EAAE,sBAAsB;AACxC,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;AAUT,EAAA,CAAA;AACF,iBAAA;;;ACRM,MAAM,6BAA6B,GAKtC;AACF,IAAA,gBAAgB,EAAE,SAAS;AAC3B,IAAA,gBAAgB,EAAE,UAAU;AAC5B,IAAA,qBAAqB,EAAE,UAAU;AACjC,IAAA,mBAAmB,EAAE,gBAAgB;AACrC,IAAA,gBAAgB,EAAE,aAAa;AAC/B,IAAA,oBAAoB,EAAE,aAAa;AACnC,IAAA,iBAAiB,EAAE,gBAAgB;AACnC,IAAA,aAAa,EAAE,mBAAmB;AAClC,IAAA,kBAAkB,EAAE,yBAAyB;AAC7C,IAAA,kBAAkB,EAAE,yBAAyB;AAC7C,IAAA,gBAAgB,EAAE;AAChB,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA;AACD,IAAA,qBAAqB,EAAE,SAAS;AAChC,IAAA,0BAA0B,EAAE,cAAc;AAC1C,IAAA,2BAA2B,EAAE,mBAAmB;AAChD,IAAA,mCAAmC,EACjC,qFAAqF;;MAK5E,2BAA2B,GAAG,IAAI,cAAc,CAC3D,6BAA6B,EAC7B;AACE,IAAA,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,OAAO,EAAE,GAAG,6BAA6B,EAAE,CAAC;AACtD,CAAA;AAGG,SAAU,+BAA+B,CAC7C,MAAiC,EAAA;IAEjC,OAAO;AACL,QAAA,GAAG,6BAA6B;AAChC,QAAA,GAAG,MAAM;AACT,QAAA,gBAAgB,EAAE;YAChB,GAAG,6BAA6B,CAAC,gBAAgB;YACjD,GAAG,MAAM,EAAE,gBAAgB;AAC5B,SAAA;KACF;AACH;AAEA;;;;;;;;;;;AAWG;AACG,SAAU,yBAAyB,CAAC,MAAiC,EAAA;IACzE,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,2BAA2B;AACpC,YAAA,QAAQ,EAAE,+BAA+B,CAAC,MAAM,CAAC;AAClD,SAAA;KACF;AACH;;MCrEa,qBAAqB,CAAA;AAIZ,IAAA,YAAA;IAHpB,MAAM,GAAmB,EAAE;AAClB,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;AAEvF,IAAA,WAAA,CAAoB,YAA0B,EAAA;QAA1B,IAAA,CAAA,YAAY,GAAZ,YAAY;IAAiB;IAEjD,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC3C,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACtD;AAEA,IAAA,MAAM,CAAC,KAAmB,EAAA;AACxB,QAAA,IAAI;AACF,YAAA,KAAK,CAAC,aAAa,IAAI;QACzB;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5B;AAEA,IAAA,MAAM,CAAC,KAAmB,EAAA;AACxB,QAAA,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5B;IAEA,SAAS,CAAC,MAAc,EAAE,IAAkB,EAAA;QAC1C,OAAO,IAAI,CAAC,EAAE;IAChB;wGAjCW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,YAAA,EAAA,CAAA,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,SAAA,EAAA,IAAA,EAAA,qBAAqB,yEC5BlC,2xCA0CA,EAAA,MAAA,EAAA,CAAA,mpCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7BY,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAG/B;YACV,OAAO,CAAC,gBAAgB,EAAE;gBACxB,UAAU,CAAC,QAAQ,EAAE;oBACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAC9C,oBAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;iBACxE,CAAC;gBACF,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;iBACzE,CAAC;aACH,CAAC;AACH,SAAA,EAAA,CAAA;;4FAEU,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAlBjC,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,YAAY,CAAC,EAAA,UAAA,EAGhC;wBACV,OAAO,CAAC,gBAAgB,EAAE;4BACxB,UAAU,CAAC,QAAQ,EAAE;gCACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAC9C,gCAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;6BACxE,CAAC;4BACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;6BACzE,CAAC;yBACH,CAAC;AACH,qBAAA,EAAA,QAAA,EAAA,2xCAAA,EAAA,MAAA,EAAA,CAAA,mpCAAA,CAAA,EAAA;;;METU,YAAY,CAAA;AASQ,IAAA,UAAA;AACrB,IAAA,MAAA;AATF,IAAA,YAAY,GAAG,IAAI,OAAO,EAAgB;AAClD,IAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IAEjC,SAAS,GAAG,CAAC;AACJ,IAAA,SAAS;AACT,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;IAE/F,WAAA,CAC+B,UAAkB,EACvC,MAAc,EAAA;QADO,IAAA,CAAA,UAAU,GAAV,UAAU;QAC/B,IAAA,CAAA,MAAM,GAAN,MAAM;QAEd,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IACrD;IAEA,SAAS,CAAC,IAAe,EAAE,OAAe,EAAA;QACxC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,MAAM,KAAK,GAAiB,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;AACnE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3D;AAEQ,IAAA,SAAS,CAAC,IAAe,EAAA;QAC/B,IAAI,IAAI,KAAK,MAAM;YAAE;AACrB,QAAA,IAAI;YACF,MAAM,GAAG,GACP,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;AAC/E,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;AAC5B,YAAA,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;QACnC;AAAE,QAAA,MAAM;;QAER;IACF;AAjCW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,kBASb,WAAW,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AATV,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA;;4FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAU7B,MAAM;2BAAC,WAAW;;;MCEV,qBAAqB,CAAA;AAIZ,IAAA,YAAA;IAHpB,MAAM,GAAmB,EAAE;AAClB,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;AAEvF,IAAA,WAAA,CAAoB,YAA0B,EAAA;QAA1B,IAAA,CAAA,YAAY,GAAZ,YAAY;IAAiB;IAEjD,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC3C,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAiB,CAAC,IAAI,IAAI;AAChF,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;AAC1D,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,KAAmB,EAAA;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;QAC1C,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,GAAG,KAAK,KAAK,CAAC,EAAE,CAAA,CAAE;IACrC;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACtD;IAEA,SAAS,CAAC,MAAc,EAAE,IAAkB,EAAA;QAC1C,OAAO,IAAI,CAAC,EAAE;IAChB;wGA1BW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,YAAA,EAAA,CAAA,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,SAAA,EAAA,IAAA,EAAA,qBAAqB,yEC5BlC,qmCA+BA,EAAA,MAAA,EAAA,CAAA,i9BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlBY,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,UAAA,EAG/B;YACV,OAAO,CAAC,gBAAgB,EAAE;gBACxB,UAAU,CAAC,QAAQ,EAAE;oBACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;AACrD,oBAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;iBAC7E,CAAC;gBACF,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;iBAChF,CAAC;aACH,CAAC;AACH,SAAA,EAAA,CAAA;;4FAEU,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAlBjC,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,YAAY,CAAC,EAAA,UAAA,EAGhC;wBACV,OAAO,CAAC,gBAAgB,EAAE;4BACxB,UAAU,CAAC,QAAQ,EAAE;gCACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;AACrD,gCAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;6BAC7E,CAAC;4BACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;6BAChF,CAAC;yBACH,CAAC;AACH,qBAAA,EAAA,QAAA,EAAA,qmCAAA,EAAA,MAAA,EAAA,CAAA,i9BAAA,CAAA,EAAA;;;ME2BU,kBAAkB,CAAA;AAUY,IAAA,UAAA;AATxB,IAAA,cAAc,GAAG,IAAI,OAAO,EAAsB;AAC1D,IAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AAErC,IAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAC1C,IAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IAE1C,SAAS,GAAG,CAAC;AACJ,IAAA,SAAS;AAE1B,IAAA,WAAA,CAAyC,UAAkB,EAAA;QAAlB,IAAA,CAAA,UAAU,GAAV,UAAU;QACjD,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IACrD;;AAGA,IAAA,QAAQ,CACN,KAA2B,EAC3B,OAA4B,EAC5B,WAAoC,EAAA;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3C,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9B;QAEA,IAAI,KAAK,YAAY,UAAU,IAAI,WAAW,EAAE,cAAc,KAAK,KAAK,EAAE;YACxE,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;QACzB;AAEA,QAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC3C,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,MAAM,OAAO,GAA2B;AACtC,gBAAA,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS;AACpB,gBAAA,IAAI,EAAE,MAAM;gBACZ,CAAC;gBACD,CAAC;gBACD,KAAK,EAAE,WAAW,EAAE,KAAK;gBACzB,OAAO;gBACP,OAAO;aACR;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACnC,QAAA,CAAC,CAAC;IACJ;;IAGA,QAAQ,CAAC,KAA2B,EAAE,IAAqB,EAAA;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AAE7C,QAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC3C,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,MAAM,OAAO,GAA2B;AACtC,gBAAA,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS;AACpB,gBAAA,IAAI,EAAE,MAAM;gBACZ,CAAC;gBACD,CAAC;gBACD,IAAI;gBACJ,OAAO;aACR;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACnC,QAAA,CAAC,CAAC;IACJ;;IAGA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEQ,IAAA,cAAc,CAAC,KAA2B,EAAA;QAChD,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,EAAE;AAC5C,YAAA,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;QAC/C;QACA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACvB;AAzEW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,kBAUT,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAVpB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;4FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAWnB,MAAM;2BAAC,WAAW;;;MCnCpB,2BAA2B,CAAA;AA4B5B,IAAA,kBAAA;AACqB,IAAA,UAAA;AA5BvB,IAAA,OAAgB,mBAAmB,GAAG,CAAC;AACvC,IAAA,OAAgB,aAAa,GAAG,CAAC;AAExB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE5B,IAAA,QAAQ;IAE5B,MAAM,GAA8B,IAAI;IACxC,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACzB,YAAY,GAAG,KAAK;IAEZ,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;IAEvB,kBAAkB,GAAG,CAAC;AACtB,IAAA,GAAG;AACH,IAAA,QAAQ;IACC,cAAc,GAAG,MAAW;QAC3C,IAAI,IAAI,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC5C,IAAA,CAAC;AACgB,IAAA,sBAAsB,GAAG,CAAC,KAAY,KAAU;AAC/D,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChC,IAAA,CAAC;AACgB,IAAA,0BAA0B,GAAG,CAAC,KAAY,KAAU;AACnE,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChC,IAAA,CAAC;IAED,WAAA,CACU,kBAAsC,EACjB,UAAkB,EAAA;QADvC,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;QACG,IAAA,CAAA,UAAU,GAAV,UAAU;IACtC;IAEH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,KAAI;AAChE,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,CAAC,MAAM,GAAG,OAAO;AACrB,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE;YAC5C,IAAI,CAAC,QAAQ,GAAG;AACd,gBAAA,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,2BAA2B,CAAC,aAAa;AACxD,gBAAA,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,2BAA2B,CAAC,aAAa;aACzD;AACD,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;YAExB,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG;AACjD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAK;AAC5D,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC3B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC;;YAE9D,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC;YAC3E,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC;QACjF;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;AAC5B,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC;YACjE,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC;YAC9E,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC;QACpF;IACF;IAGA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE;YACpC,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;AAGA,IAAA,QAAQ,CAAC,KAAoB,EAAA;QAC3B,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;AACzC,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAC3B;IACF;AAEA,IAAA,YAAY,CAAC,MAAyB,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ;YAAE;AACpE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM;QAC3B,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACzB;AAEQ,IAAA,kBAAkB,CAAC,KAAY,EAAA;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;AAClB,QAAA,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB;YAAE;AAEjD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa;QAC1C,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE;AAE/C,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;IAC3B;AAEQ,IAAA,cAAc,CAAC,KAA+B,EAAA;QACpD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;AAClB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM;QAC3B,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;AAC3B,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QACxB;aAAO;YACL,OAAO,CAAC,OAAO,EAAE;QACnB;IACF;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC;IAC7B;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa;AAC1C,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,MAAM,KAAK,GAAG,2BAA2B,CAAC,mBAAmB;AAC7D,QAAA,MAAM,GAAG,GAAG,2BAA2B,CAAC,aAAa;AACrD,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW;AACtD,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,YAAY;AACvD,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,IAAI,GAAG;AAClC,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,IAAI,GAAG;QAEnC,MAAM,IAAI,GAAG,KAAK;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;QAEnD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG;QAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG;AAE3B,QAAA,IAAI,CAAC,GAAG,IAAI,EAAE;YACZ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;QAC7B;AACA,QAAA,IAAI,CAAC,GAAG,IAAI,EAAE;YACZ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;QAC7B;QAEA,IAAI,CAAC,QAAQ,GAAG;AACd,YAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;SACrC;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAzJW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,iDA6B5B,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AA7BV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BxC,g6DAgDA,EAAA,MAAA,EAAA,CAAA,i5EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxBY,YAAY,+BAAE,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIhC,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,g6DAAA,EAAA,MAAA,EAAA,CAAA,i5EAAA,CAAA,EAAA;;0BAiCzC,MAAM;2BAAC,WAAW;yCAvBD,QAAQ,EAAA,CAAA;sBAA3B,SAAS;uBAAC,OAAO;gBAkElB,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,eAAe;gBAQ7B,QAAQ,EAAA,CAAA;sBADP,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;;;ME9FjC,yBAAyB,CAAA;AACnB,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAErC,IAAI,GAAG,EAAE;IAC3B,KAAK,GAAG,uBAAuB;AAExC,IAAA,QAAQ,CAAC,KAAiB,EAAA;QACxB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE;AAC3C,YAAA,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,SAAA,CAAC;IACJ;wGAdW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZtC,8MAQA,EAAA,MAAA,EAAA,CAAA,kSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAY,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIlB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,CAAC,EAAA,QAAA,EAAA,8MAAA,EAAA,MAAA,EAAA,CAAA,kSAAA,CAAA,EAAA;8BAOH,IAAI,EAAA,CAAA;sBAA9B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChB,KAAK,EAAA,CAAA;sBAAb;;;MEgBU,kBAAkB,CAAA;AACZ,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;AAEvF,IAAA,WAAW,GAAG,OAAyB;AAC7C,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,GAAG,EAAE,IAAI;AACT,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB;AAC3C,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,cAAc,EAAE,IAAI;AACrB,KAAA,CAAC;IAEe,KAAK,GAAG,IAAI,eAAe,CAAmB,IAAI,CAAC,WAAW,EAAE,CAAC;AACzE,IAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAEnC,2BAA2B,GAAwC,IAAI;AAE/E;;;AAGG;AACH,IAAA,IAAI,CAAC,MAA6B,EAAA;AAChC,QAAA,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GACrF,MAAM;AACR,QAAA,IAAI,CAAC,2BAA2B,GAAG,mBAAmB,IAAI,IAAI;AAC9D,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACd,YAAA,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI,IAAI,IAAI;YAClB,eAAe,EAAE,eAAe,IAAI,IAAI;YACxC,cAAc,EAAE,cAAc,IAAI,IAAI;YACtC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB;AAChE,SAAA,CAAC;IACJ;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;QACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC;AAEA,IAAA,uBAAuB,CAAC,OAAgB,EAAA;AACtC,QAAA,IAAI,CAAC,2BAA2B,GAAG,OAAO,CAAC;IAC7C;wGAhDW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;4FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACrBlC;AACO,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU;AAE7D;;AAEG;MASU,oBAAoB,CAAA;AAMX,IAAA,GAAA;IALX,GAAG,GAAkB,IAAI;IAElC,KAAK,GAAG,KAAK;IACb,SAAS,GAAG,KAAK;AAEjB,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;IAAsB;AAE7C,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;wGAxBW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBjC,ycAgBA,EAAA,MAAA,EAAA,CAAA,ogCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDGY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ycAAA,EAAA,MAAA,EAAA,CAAA,ogCAAA,CAAA,EAAA;sFAGtC,GAAG,EAAA,CAAA;sBAAX;;;AEfH;;;AAGG;MASU,oBAAoB,CAAA;AAOX,IAAA,GAAA;IANX,GAAG,GAAkB,IAAI;;IAEzB,WAAW,GAAiB,IAAI;IAEzC,SAAS,GAAG,KAAK;AAEjB,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;IAAsB;AAE7C,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;wGAnBW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBjC,maAaA,EAAA,MAAA,EAAA,CAAA,wbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,maAAA,EAAA,MAAA,EAAA,CAAA,wbAAA,CAAA,EAAA;sFAGtC,GAAG,EAAA,CAAA;sBAAX;gBAEQ,WAAW,EAAA,CAAA;sBAAnB;;;AEfH;MASa,oBAAoB,CAAA;AAMX,IAAA,GAAA;IALX,GAAG,GAAkB,IAAI;IACzB,IAAI,GAAkB,IAAI;IAEnC,SAAS,GAAG,KAAK;AAEjB,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;IAAsB;AAE7C,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;wGAlBW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBjC,8SAKA,EAAA,MAAA,EAAA,CAAA,6bAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDSY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8SAAA,EAAA,MAAA,EAAA,CAAA,6bAAA,CAAA,EAAA;sFAGtC,GAAG,EAAA,CAAA;sBAAX;gBACQ,IAAI,EAAA,CAAA;sBAAZ;;;AEEH,MAAM,wBAAwB,GAAG,KAAK;AACtC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAU;AAE9F;;;AAGG;MAeU,2BAA2B,CAAA;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AACvB,IAAA,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACnC,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;AACvF,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;IAEhC,OAAO,GAA4B,IAAI;IAE/C,IAAI,GAAG,KAAK;IACZ,IAAI,GAAsB,OAAO;IACjC,IAAI,GAAyC,SAAS;IACtD,GAAG,GAAkB,IAAI;IACzB,OAAO,GAA2B,IAAI;IACtC,cAAc,GAAG,IAAI;IACrB,WAAW,GAAkB,IAAI;IACjC,QAAQ,GAAG,SAAS;IACpB,eAAe,GAAY,IAAI;IAE/B,YAAY,GAA6B,IAAI;IAC7C,kBAAkB,GAAG,KAAK;IAC1B,WAAW,GAAG,KAAK;IACnB,eAAe,GAAkB,IAAI;IACrC,oBAAoB,GAAG,KAAK;IAC5B,gBAAgB,GAAkB,IAAI;IAC9B,gBAAgB,GAAa,EAAE;IAC/B,mBAAmB,GAAyC,IAAI;IAChE,oBAAoB,GAAkB,IAAI;IAC1C,qBAAqB,GAA2B,IAAI;AAE5D,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAI;AAC7D,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;AACtD,YAAA,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AACtB,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,YAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;AACrC,QAAA,CAAC,CAAC;IACJ;IAEQ,eAAe,CAAC,IAA6B,EAAE,IAAsB,EAAA;QAC3E,MAAM,GAAG,GAAkB,EAAE;AAC7B,QAAA,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE;AAChC,YAAA,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AACnB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACjB,YAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,gBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;YAChD;QACF;AACA,QAAA,OAAO,GAAG;IACZ;AAEQ,IAAA,aAAa,CAAC,EAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;AACnB,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;AACnB,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,cAAc;AACvC,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW;AACjC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB;AAChE,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,eAAe;IAC3C;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI;IACvC;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;AACpD,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,IAAI;IAC3C;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,aAAa;AACvE,QAAA,MAAM,MAAM,GAAsC;AAChD,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,QAAQ,EAAE,SAAS;SACpB;AACD,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB;IACxE;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,oBAAoB;AACnD,QAAA,MAAM,MAAM,GAAsC;AAChD,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,QAAQ,EAAE,SAAS;SACpB;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS;AACnD,QAAA,OAAO,YAAY,IAAI,CAAC,WAAW,EAAE,KAAK;IAC5C;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,gBAAgB;QACvD,OAAO,IAAI,CAAC,GAAG;IACjB;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI;QACpD,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;AAC7C,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,YAAA,OAAO,IAAI;QACb;QACA,IAAI,IAAI,CAAC,oBAAoB,KAAK,GAAG,IAAI,IAAI,CAAC,qBAAqB,EAAE;YACnE,OAAO,IAAI,CAAC,qBAAqB;QACnC;AACA,QAAA,IAAI,CAAC,oBAAoB,GAAG,GAAG;QAC/B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,GAAG,CAAC;QAC/E,OAAO,IAAI,CAAC,qBAAqB;IACnC;AAEQ,IAAA,qBAAqB,CAAC,OAAsB,EAAA;AAClD,QAAA,MAAM,WAAW,GACf,CAAC,OAAO,CAAC,MAAM,CAAC;YACd,OAAO,CAAC,MAAM,CAAC;YACf,OAAO,CAAC,MAAM,CAAC;YACf,OAAO,CAAC,KAAK,CAAC;YACd,OAAO,CAAC,SAAS,CAAC;AAClB,YAAA,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI;AACtC,QAAA,IAAI,CAAC,WAAW;YAAE;QAElB,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;QACnC;QAEA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AAC3B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;YACjC,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QAC1B;QAEA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;AACzB,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YACpE,IAAI,eAAe,EAAE;AACnB,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI;AAC7B,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG;AAChC,gBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;AAC5B,oBAAA,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;wBAC/C,IAAI,OAAO,EAAE;AACX,4BAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAC9B,4BAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;wBACrC;AACA,wBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,oBAAA,CAAC,CAAC;gBACJ;AACA,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB;AAAO,iBAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AAC9B,gBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;YACrC;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI;AAC7B,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG;AAChC,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB;QACF;aAAO;AACL,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;QAEA,IAAI,CAAC,wBAAwB,EAAE;QAC/B,IACE,IAAI,CAAC,IAAI;YACT,IAAI,CAAC,aAAa,KAAK,UAAU;AACjC,aAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,EAClD;AACA,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,YAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,MAAK;AACzC,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,gBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB,CAAC,EAAE,wBAAwB,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;QACnC;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,wBAAwB,EAAE;QAC/B,IAAI,CAAC,cAAc,EAAE;IACvB;AAEQ,IAAA,oBAAoB,CAAC,GAAW,EAAA;QACtC,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AAEvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG;AACtB,aAAA,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,WAAW,CAAC;AACtE,aAAA,IAAI,CAAC,CAAC,IAAI,KAAI;AACb,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACvB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE;AAC3C,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;oBAC5C,IAAI,IAAI,KAAK,OAAO;AAAE,wBAAA,IAAI,CAAC,gBAAgB,GAAG,OAAO,IAAI,GAAG;;AACvD,wBAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AACnC,oBAAA,IAAI,OAAO;AAAE,wBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;AAChD,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,oBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,gBAAA,CAAC,CAAC;YACJ;AACA,YAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACvB,YAAA,OAAO,SAAS;AAClB,QAAA,CAAC;aACA,KAAK,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI;AAC7B,YAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,gBAAgB,CAAC,GAAW,EAAA;QAClC,MAAM,MAAM,GAAG,CAAC,CAAW,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;QAE5E,MAAM,OAAO,GAAG,MACd,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;YACtD,IAAI,CAAC,CAAC,CAAC,EAAE;AAAE,gBAAA,OAAO,EAAE;AACpB,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC;AAClB,QAAA,CAAC,CAAC;QAEJ,MAAM,WAAW,GAAG,MAClB,KAAK,CAAC,GAAG,EAAE;AACT,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;AAChC,SAAA,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;YACZ,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC;AAAE,gBAAA,OAAO,EAAE;AAC1C,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC;AAClB,QAAA,CAAC,CAAC;AAEJ,QAAA,OAAO,OAAO;aACX,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE;AAChC,aAAA,KAAK,CAAC,MAAM,WAAW,EAAE;AACzB,aAAA,KAAK,CAAC,MAAM,EAAE,CAAC;IACpB;AAEQ,IAAA,WAAW,CAAC,MAAc,EAAA;AAChC,QAAA,IAAI;YACF,MAAM,IAAI,GACR,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,EAAE;AAChD,kBAAE,MAAM,CAAC,QAAQ,CAAC;kBAChB,uBAAuB;YAC7B,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQ;QACvC;AAAE,QAAA,MAAM;YACN,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChC;IACF;AAEQ,IAAA,wBAAwB,CAAC,MAAc,EAAA;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;QACjC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE;IACzD;AAEQ,IAAA,yBAAyB,CAAC,MAAc,EAAA;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;AACxD,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;AACrE,YAAA,OAAO,OAAO;QAChB;QACA,MAAM,GAAG,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,OAAO;AAC7F,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,OAAO;AACpF,QAAA,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,OAAO;QACrF,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3F,YAAA,OAAO,UAAU;QACnB;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,yBAAyB,CAAC,GAAW,EAAE,WAAmB,EAAA;QAChE,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC;AAEpD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,OAAO;QAC7C,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,UAAU;AACzE,QAAA,IACE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AACzB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC/B,YAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAC7B;AACA,YAAA,OAAO,UAAU;QACnB;AAEA,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ;AAC7B,QAAA,OAAO,UAAU;IACnB;AAEQ,IAAA,WAAW,CAAC,GAAW,EAAA;QAC7B,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AAC/B,aAAA,IAAI,CAAC,CAAC,CAAC,KAAI;YACV,IAAI,CAAC,CAAC,CAAC,EAAE;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC;AAC1C,YAAA,OAAO,CAAC,CAAC,IAAI,EAAE;AACjB,QAAA,CAAC;AACA,aAAA,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACxC,aAAA,KAAK,CAAC,MAAM,IAAI,CAAC;IACtB;IAEQ,cAAc,GAAA;QACpB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;AACrE,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;AACxB,YAAA,IAAI;AACF,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;YACxB;AAAE,YAAA,MAAM;;YAER;QACF;IACF;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE;AACpC,YAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACtC,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QACjC;IACF;IAEA,oBAAoB,GAAA;QAClB,IAAI,CAAC,wBAAwB,EAAE;AAC/B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;IACrB;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,KAAK,CAAC,eAAe,EAAE;IACzB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;IACrB;IAEA,eAAe,GAAA;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG;AACxC,QAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACnE,YAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBACtC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC;YACnC;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,CAAC;QAC3D;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;wGAxXW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5CxC,o4JA4FA,EAAA,MAAA,EAAA,CAAA,i0FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1DI,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMX,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAdvC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP;wBACP,mBAAmB;wBACnB,YAAY;wBACZ,oBAAoB;wBACpB,oBAAoB;wBACpB,oBAAoB;qBACrB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,o4JAAA,EAAA,MAAA,EAAA,CAAA,i0FAAA,CAAA,EAAA;;;ME/BpC,qBAAqB,CAAA;AAOS,IAAA,UAAA;AANjC,IAAA,qBAAqB,GAAG,IAAI,OAAO,EAAyB;AACpE,IAAA,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE;IAEnD,SAAS,GAAG,CAAC;AACJ,IAAA,SAAS;AAE1B,IAAA,WAAA,CAAyC,UAAkB,EAAA;QAAlB,IAAA,CAAA,UAAU,GAAV,UAAU;QACjD,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IACrD;AAEA;;;AAGG;IACH,kBAAkB,CAAC,UAAkB,EAAE,OAAe,EAAA;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,MAAM,cAAc,GAA0B;AAC5C,YAAA,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS;YACpB,UAAU;YACV,OAAO;SACR;AACD,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC;IACjD;AAxBW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,kBAOZ,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAPpB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAQnB,MAAM;2BAAC,WAAW;;;MCWpB,8BAA8B,CAAA;AAIrB,IAAA,qBAAA;IAHpB,eAAe,GAA4B,EAAE;AACpC,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;AAEvF,IAAA,WAAA,CAAoB,qBAA4C,EAAA;QAA5C,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;IAA0B;IAEnE,QAAQ,GAAA;QACN,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,cAAc,KAAI;AACtE,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,mBAAmB,CAAC,EAAU,EAAA;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC1E;IAEA,SAAS,CAAC,MAAc,EAAE,IAA2B,EAAA;QACnD,OAAO,IAAI,CAAC,EAAE;IAChB;wGAlBW,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7B3C,69CA0CA,EAAA,MAAA,EAAA,CAAA,knDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5BY,mBAAmB,mGAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,CAAA,EAAA,UAAA,EAG7C;YACV,OAAO,CAAC,yBAAyB,EAAE;gBACjC,UAAU,CAAC,QAAQ,EAAE;oBACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAC9C,oBAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;iBACxE,CAAC;gBACF,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;iBACzE,CAAC;aACH,CAAC;AACH,SAAA,EAAA,CAAA;;4FAEU,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAlB1C,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,YAAY,EAAE,YAAY,CAAC,EAAA,UAAA,EAG9C;wBACV,OAAO,CAAC,yBAAyB,EAAE;4BACjC,UAAU,CAAC,QAAQ,EAAE;gCACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAC9C,gCAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;6BACxE,CAAC;4BACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;6BACzE,CAAC;yBACH,CAAC;AACH,qBAAA,EAAA,QAAA,EAAA,69CAAA,EAAA,MAAA,EAAA,CAAA,knDAAA,CAAA,EAAA;;;AEfH;;;AAGG;MAEU,oBAAoB,CAAA;AACd,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;AAE/F,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB;IAC1C;IAEQ,GAAG,GAAG,CAAC;AACE,IAAA,UAAU,GAAG,IAAI,eAAe,CAAyB,EAAE,CAAC;AAE7E,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;IACnC;AAES,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;AAEnD,IAAA,IAAI,CAAC,OAAgB,EAAA;QACnB,MAAM,EAAE,GAAG,CAAA,GAAA,EAAM,EAAE,IAAI,CAAC,GAAG,EAAE;AAC7B,QAAA,MAAM,GAAG,GACP,OAAO,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK;AAC5C,cAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI;AACtB,cAAE,IAAI,CAAC,cAAc;AACzB,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAClE,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B,QAAA,OAAO,EAAE;IACX;IAEA,UAAU,CAAC,EAAU,EAAE,OAAe,EAAA;AACpC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;AACtC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAC7C,IAAI,GAAG,GAAG,CAAC;YAAE;AACb,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;AAC1C,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,GAAG,CAAC,EAAU,EAAA;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;AACtC,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM;YAAE;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;wGA1CW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA;;4FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCDrB,6BAA6B,CAAA;AAIpB,IAAA,aAAA;IAHpB,SAAS,GAA2B,EAAE;AAC9B,IAAA,GAAG;AAEX,IAAA,WAAA,CAAoB,aAAmC,EAAA;QAAnC,IAAA,CAAA,aAAa,GAAb,aAAa;IAAyB;IAE1D,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AACzD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACvB,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;IACzB;IAEA,SAAS,CAAC,MAAc,EAAE,IAA0B,EAAA;QAClD,OAAO,IAAI,CAAC,EAAE;IAChB;wGAlBW,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECf1C,2fAiBA,EAAA,MAAA,EAAA,CAAA,uiCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDNY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIX,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAPzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,2fAAA,EAAA,MAAA,EAAA,CAAA,uiCAAA,CAAA,EAAA;;;AEDzB,MAAM,aAAa,GAAG,GAAG;AACzB,MAAM,gBAAgB,GAAG,GAAG;AAC5B,MAAM,gBAAgB,GAAG,GAAG;AAC5B,MAAM,sBAAsB,GAAG,EAAE;MAGpB,wBAAwB,CAAA;AAClB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;;AAGxC,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;;AAEtB,IAAA,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC;IAErB,WAAW,GAAG,KAAK;IACnB,oBAAoB,GAAG,CAAC;IACxB,cAAc,GAAyC,IAAI;IAC3D,aAAa,GAA0C,IAAI;IAC3D,SAAS,GAAyC,IAAI;;IAG9D,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAC3D;QACF;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAEvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AACrC,YAAA,IAAI,KAAK,YAAY,eAAe,EAAE;gBACpC,IAAI,CAAC,iBAAiB,EAAE;gBACxB;YACF;YACA,IACE,KAAK,YAAY,aAAa;AAC9B,gBAAA,KAAK,YAAY,gBAAgB;gBACjC,KAAK,YAAY,eAAe,EAChC;gBACA,IAAI,CAAC,eAAe,EAAE;YACxB;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,oBAAoB,IAAI,CAAC;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB;QAE5C,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;AACpC,YAAA,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE;gBAC5C;YACF;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC;QAC1C,CAAC,EAAE,aAAa,CAAC;IACnB;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,oBAAoB,IAAI,CAAC;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB;QAE5C,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,kBAAkB,EAAE;AAEzB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACpB;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAEtB,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,YAAA,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE;gBAC5C;YACF;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,CAAC,EAAE,gBAAgB,CAAC;IACtB;AAEQ,IAAA,uBAAuB,CAAC,UAAkB,EAAA;QAChD,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,MAAK;AACpC,YAAA,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE;gBAC5C;YACF;AACA,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC/B,YAAA,IAAI,OAAO,IAAI,sBAAsB,EAAE;gBACrC;YACF;YACA,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;AACrD,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC,EAAE,gBAAgB,CAAC;IACtB;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;AAC/B,YAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;AACjC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;wGAjHW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;4FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCJrB,iCAAiC,CAAA;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAEtD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;IAChC;wGALW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX9C,2xBAsBA,EAAA,MAAA,EAAA,CAAA,uxDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDfY,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIlB,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAP7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,CAAC,EAAA,QAAA,EAAA,2xBAAA,EAAA,MAAA,EAAA,CAAA,uxDAAA,CAAA,EAAA;;;MEInB,wBAAwB,CAAA;IAC3B,GAAG,GAAG,CAAC;AACE,IAAA,MAAM,GAAG,IAAI,eAAe,CAAgC,IAAI,CAAC;AAEzE,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAE3C,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC/B;IAEA,KAAK,CAAC,QAAgB,2BAA2B,EAAA;QAC/C,MAAM,EAAE,GAAG,CAAA,GAAA,EAAM,EAAE,IAAI,CAAC,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,EAAE;YACF,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,2BAA2B;AAC1D,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACtB,SAAA,CAAC;AACF,QAAA,OAAO,EAAE;IACX;IAEA,GAAG,CAAC,EAAU,EAAE,IAAY,EAAA;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AAClC,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE;YAAE;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACrC,QAAA,IAAI,CAAC,GAAG;YAAE;QACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;IACxD;IAEA,WAAW,CAAC,EAAU,EAAE,IAAc,EAAA;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AAClC,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE;YAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IAC3F;AAEA,IAAA,GAAG,CAAC,EAAU,EAAA;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AAClC,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE;YAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB;wGAvCW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;4FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCKrB,iCAAiC,CAAA;AAIxB,IAAA,SAAA;IAHpB,KAAK,GAAkC,IAAI;AACnC,IAAA,GAAG;AAEX,IAAA,WAAA,CAAoB,SAAmC,EAAA;QAAnC,IAAA,CAAA,SAAS,GAAT,SAAS;IAA6B;IAE1D,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AAC9C,YAAA,IAAI,CAAC,KAAK,GAAG,CAAC;AAChB,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;IACzB;wGAdW,iCAAiC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECf9C,8kBAoBA,EAAA,MAAA,EAAA,CAAA,ixCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDTY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIX,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAP7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,UAAA,EAC3B,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,8kBAAA,EAAA,MAAA,EAAA,CAAA,ixCAAA,CAAA,EAAA;;;AEMzB;;;AAGG;MAEU,0BAA0B,CAAA;AACpB,IAAA,SAAS;AACT,IAAA,MAAM,GAAqC,MAAM,CAAC,2BAA2B,CAAC;IAC9E,KAAK,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,yBAAyB,GAA2C,IAAI;IAC/D,YAAY,GAAiC,EAAE;AAC/C,IAAA,OAAO,GAAG,IAAI,GAAG,EAAwB;AAE1D,IAAA,WAAA,CAAiC,UAAkB,EAAA;AACjD,QAAA,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC;IAChD;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,SAAS,IAAI,OAAO,YAAY,KAAK,WAAW;IAC9D;AAEA,IAAA,IAAI,UAAU,GAAA;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,QAAQ;QACtC,OAAO,YAAY,CAAC,UAAU;IAChC;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;IAC1D;AAEA,IAAA,YAAY,CAAC,OAAmC,EAAA;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;QAC3B;IACF;;IAGA,sBAAsB,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS;YAAE;AAChE,QAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;AACnC,YAAA,IAAI,CAAC,yBAAyB,GAAG,YAAY,CAAC,iBAAiB,EAAE,CAAC,KAAK,CACrE,MAAM,QAAkC,CACzC;QACH;IACF;AAEA,IAAA,MAAM,yBAAyB,GAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;AACnC,QAAA,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,IAAI,YAAY,CAAC,UAAU,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QACtD,IAAI,CAAC,IAAI,CAAC,yBAAyB;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,yBAAyB;QACjD,OAAO,IAAI,KAAK,SAAS;IAC3B;AAEA;;;AAGG;IACH,MAAM,2BAA2B,CAAC,aAAsB,EAAA;QACtD,IAAI,CAAC,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;AACnC,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AAC9C,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AAE9C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,IAAI,CAAC,sBAAsB,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC,yBAAyB,EAAE;QACzC;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAC3C,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,mCAAmC,EAChE,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC,sBAAsB,EAAE,EAAE,CACvD;AACD,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;AAC3B,QAAA,OAAO,IAAI,CAAC,yBAAyB,EAAE;IACzC;IAEA,iBAAiB,GAAA;QACf,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,KAAK,IAAI,CAAC;QACpC;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,WAAW,CAAC,OAAmC,EAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;QACnC,IAAI,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3C,QAAA,IAAI,YAAY,CAAC,UAAU,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC1B,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,CAAC,OAAmC,EAAA;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;AAE/B,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;YAClC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE;gBACnD,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI;AACJ,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,kBAAkB,EAAE,KAAK;AACzB,gBAAA,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,aAAA,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC;AAC3C,YAAA,YAAY,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;AAE7D,YAAA,YAAY,CAAC,OAAO,GAAG,CAAC,EAAE,KAAI;gBAC5B,EAAE,CAAC,cAAc,EAAE;AACnB,gBAAA,IAAI;oBACF,MAAM,CAAC,KAAK,EAAE;gBAChB;AAAE,gBAAA,MAAM;;gBAER;AACA,gBAAA,OAAO,CAAC,OAAO,IAAI;gBACnB,YAAY,CAAC,KAAK,EAAE;AACtB,YAAA,CAAC;AAED,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEA,IAAA,UAAU,CAAC,GAAW,EAAA;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAC/B,IAAI,CAAC,EAAE;AACL,YAAA,IAAI;gBACF,CAAC,CAAC,KAAK,EAAE;YACX;AAAE,YAAA,MAAM;;YAER;AACA,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1B;IACF;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACtC,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC;AAChE,YAAA,KAAK,CAAC,MAAM,GAAG,IAAI;AACnB,YAAA,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;QACnC;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,SAAS;AACrC,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI;QACrF;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,0BAA0B;QAC/C;IACF;AA5JW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,kBAQjB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AARpB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cADb,MAAM,EAAA,CAAA;;4FACnB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BASnB,MAAM;2BAAC,WAAW;;;AC9BjC;;AAEG;;ACFH;;AAEG;;"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@xosue-utils/services" />
5
+ export * from './public-api';
@@ -0,0 +1,13 @@
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
+ import { AiAutofillOverlayService, AiAutofillOverlayState } from './ai-autofill-overlay.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class AiAutofillOverlayServiceComponent implements OnInit, OnDestroy {
5
+ private aiOverlay;
6
+ state: AiAutofillOverlayState | null;
7
+ private sub?;
8
+ constructor(aiOverlay: AiAutofillOverlayService);
9
+ ngOnInit(): void;
10
+ ngOnDestroy(): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<AiAutofillOverlayServiceComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<AiAutofillOverlayServiceComponent, "ai-autofill-overlay-service", never, {}, {}, never, never, true, never>;
13
+ }
@@ -0,0 +1,19 @@
1
+ import * as i0 from "@angular/core";
2
+ export interface AiAutofillOverlayState {
3
+ id: string;
4
+ title: string;
5
+ logs: string[];
6
+ startedAt: number;
7
+ }
8
+ export declare class AiAutofillOverlayService {
9
+ private seq;
10
+ private readonly state$;
11
+ readonly state: import("rxjs").Observable<AiAutofillOverlayState>;
12
+ get snapshot(): AiAutofillOverlayState | null;
13
+ start(title?: string): string;
14
+ log(id: string, line: string): void;
15
+ replaceLogs(id: string, logs: string[]): void;
16
+ end(id: string): void;
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<AiAutofillOverlayService, never>;
18
+ static ɵprov: i0.ɵɵInjectableDeclaration<AiAutofillOverlayService>;
19
+ }
@@ -0,0 +1,17 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { AlertMessage, AlertService } from './alert.service';
3
+ import { ResolvedXosueUtilsServicesConfig } from '../../config/services-config';
4
+ import * as i0 from "@angular/core";
5
+ export declare class AlertServiceComponent implements OnInit {
6
+ private alertService;
7
+ alerts: AlertMessage[];
8
+ readonly config: ResolvedXosueUtilsServicesConfig;
9
+ constructor(alertService: AlertService);
10
+ ngOnInit(): void;
11
+ removeAlert(id: number): void;
12
+ accept(alert: AlertMessage): void;
13
+ cancel(alert: AlertMessage): void;
14
+ trackById(_index: number, item: AlertMessage): number;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<AlertServiceComponent, never>;
16
+ static ɵcmp: i0.ɵɵComponentDeclaration<AlertServiceComponent, "alert-service", never, {}, {}, never, never, true, never>;
17
+ }
@@ -0,0 +1,25 @@
1
+ import * as i0 from "@angular/core";
2
+ export type AlertMode = 'normal' | 'actions';
3
+ export type AlertConfirmOptions = {
4
+ /** Se ejecuta en el mismo tick del clic en Aceptar (p. ej. Notification.requestPermission). */
5
+ onAcceptClick?: () => void;
6
+ };
7
+ export interface AlertMessage {
8
+ id: number;
9
+ message: string;
10
+ mode: AlertMode;
11
+ resolve: (value: boolean) => void;
12
+ onAcceptClick?: () => void;
13
+ }
14
+ export declare class AlertService {
15
+ private platformId;
16
+ private alertSubject;
17
+ alert$: import("rxjs").Observable<AlertMessage>;
18
+ private idCounter;
19
+ private readonly isBrowser;
20
+ constructor(platformId: object);
21
+ showAlert(message: string): Promise<boolean>;
22
+ showConfirm(message: string, options?: AlertConfirmOptions): Promise<boolean>;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<AlertService, never>;
24
+ static ɵprov: i0.ɵɵInjectableDeclaration<AlertService>;
25
+ }
@@ -0,0 +1,42 @@
1
+ import * as i0 from "@angular/core";
2
+ export type BrowserNotificationPayload = {
3
+ title: string;
4
+ body: string;
5
+ /** Agrupa/reemplaza notificaciones con el mismo tag. */
6
+ tag: string;
7
+ data?: Record<string, unknown>;
8
+ onClick?: () => void;
9
+ };
10
+ /**
11
+ * Thin wrapper around the Web Notifications API.
12
+ * Host-agnostic: no chat/app coupling. Optional AlertService for permission prompt.
13
+ */
14
+ export declare class BrowserNotificationService {
15
+ private readonly isBrowser;
16
+ private readonly config;
17
+ private readonly alert;
18
+ private permissionRequestInFlight;
19
+ private readonly pendingQueue;
20
+ private readonly tracked;
21
+ constructor(platformId: object);
22
+ get isSupported(): boolean;
23
+ get permission(): NotificationPermission;
24
+ get canShow(): boolean;
25
+ queuePending(payload: BrowserNotificationPayload): void;
26
+ /** Call from a user gesture (click) so the browser allows requestPermission. */
27
+ beginPermissionRequest(): void;
28
+ completePermissionRequest(): Promise<boolean>;
29
+ /**
30
+ * Optional UX helper: confirm via AlertService then request permission on Accept click.
31
+ * Returns whether permission was granted.
32
+ */
33
+ requestPermissionWithPrompt(promptMessage?: string): Promise<boolean>;
34
+ drainPendingQueue(): number;
35
+ showOrQueue(payload: BrowserNotificationPayload): boolean;
36
+ show(payload: BrowserNotificationPayload): boolean;
37
+ closeByTag(tag: string): void;
38
+ playSound(): void;
39
+ private resolveIconUrl;
40
+ static ɵfac: i0.ɵɵFactoryDeclaration<BrowserNotificationService, never>;
41
+ static ɵprov: i0.ɵɵInjectableDeclaration<BrowserNotificationService>;
42
+ }
@@ -0,0 +1,37 @@
1
+ import { ElementRef, OnDestroy, OnInit } from '@angular/core';
2
+ import { ContextMenuOption, ContextMenuRequest, ContextMenuService } from './context-menu.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ContextMenuServiceComponent implements OnInit, OnDestroy {
5
+ private contextMenuService;
6
+ private platformId;
7
+ private static readonly VIEWPORT_EDGE_INSET;
8
+ private static readonly ANCHOR_OFFSET;
9
+ private readonly cdr;
10
+ panelRef?: ElementRef<HTMLElement>;
11
+ active: ContextMenuRequest | null;
12
+ position: {
13
+ x: number;
14
+ y: number;
15
+ };
16
+ panelVisible: boolean;
17
+ private anchor;
18
+ /** Timestamp hasta el cual ignoramos cierres (evita que el gesto de apertura cierre el menú). */
19
+ private ignoreOutsideUntil;
20
+ private sub?;
21
+ private closeSub?;
22
+ private readonly scrollListener;
23
+ private readonly outsidePointerListener;
24
+ private readonly outsideContextMenuListener;
25
+ constructor(contextMenuService: ContextMenuService, platformId: object);
26
+ ngOnInit(): void;
27
+ ngOnDestroy(): void;
28
+ onWindowResize(): void;
29
+ onEscape(event: KeyboardEvent): void;
30
+ selectOption(option: ContextMenuOption): void;
31
+ private handleOutsideEvent;
32
+ private dismissCurrent;
33
+ private clearMenu;
34
+ private applyClampedPosition;
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContextMenuServiceComponent, never>;
36
+ static ɵcmp: i0.ɵɵComponentDeclaration<ContextMenuServiceComponent, "context-menu-service", never, {}, {}, never, never, true, never>;
37
+ }
@@ -0,0 +1,63 @@
1
+ import * as i0 from "@angular/core";
2
+ export interface ContextMenuOption<T = unknown> {
3
+ icon: string;
4
+ name: string;
5
+ value: T;
6
+ /** Estilo destructivo (rojo). */
7
+ danger?: boolean;
8
+ /** Separador visual antes de esta opción. */
9
+ separatorBefore?: boolean;
10
+ disabled?: boolean;
11
+ }
12
+ export interface ContextMenuInfo {
13
+ icon: string;
14
+ title: string;
15
+ info: string;
16
+ }
17
+ export type ContextMenuKind = 'menu' | 'info';
18
+ interface ContextMenuRequestBase {
19
+ id: number;
20
+ x: number;
21
+ y: number;
22
+ }
23
+ export interface ContextMenuMenuRequest extends ContextMenuRequestBase {
24
+ kind: 'menu';
25
+ title?: string;
26
+ options: ContextMenuOption[];
27
+ resolve: (value: ContextMenuOption | null) => void;
28
+ }
29
+ export interface ContextMenuInfoRequest extends ContextMenuRequestBase {
30
+ kind: 'info';
31
+ info: ContextMenuInfo;
32
+ resolve: () => void;
33
+ }
34
+ export type ContextMenuRequest = ContextMenuMenuRequest | ContextMenuInfoRequest;
35
+ export type ContextMenuOpenEvent = MouseEvent | {
36
+ clientX: number;
37
+ clientY: number;
38
+ };
39
+ export interface ContextMenuOpenOptions {
40
+ title?: string;
41
+ /** Si true (default), evita el menú nativo del navegador cuando el evento es MouseEvent. */
42
+ preventDefault?: boolean;
43
+ }
44
+ export declare class ContextMenuService {
45
+ private platformId;
46
+ private readonly requestSubject;
47
+ readonly request$: import("rxjs").Observable<ContextMenuRequest>;
48
+ private readonly closeSubject;
49
+ readonly close$: import("rxjs").Observable<void>;
50
+ private idCounter;
51
+ private readonly isBrowser;
52
+ constructor(platformId: object);
53
+ /** Menú contextual en el punto del clic. Solo uno activo a la vez. */
54
+ openMenu(event: ContextMenuOpenEvent, options: ContextMenuOption[], menuOptions?: ContextMenuOpenOptions): Promise<ContextMenuOption | null>;
55
+ /** Globo informativo en el punto del clic. */
56
+ openInfo(event: ContextMenuOpenEvent, info: ContextMenuInfo): Promise<void>;
57
+ /** Cierra el menú contextual activo desde código. */
58
+ close(): void;
59
+ private pointFromEvent;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContextMenuService, never>;
61
+ static ɵprov: i0.ɵɵInjectableDeclaration<ContextMenuService>;
62
+ }
63
+ export {};
@@ -0,0 +1,9 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class FieldHelpTooltipComponent {
3
+ private readonly contextMenuService;
4
+ text: string;
5
+ title: string;
6
+ showHelp(event: MouseEvent): void;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<FieldHelpTooltipComponent, never>;
8
+ static ɵcmp: i0.ɵɵComponentDeclaration<FieldHelpTooltipComponent, "field-help-tooltip", never, { "text": { "alias": "text"; "required": true; }; "title": { "alias": "title"; "required": false; }; }, {}, never, never, true, never>;
9
+ }
@@ -0,0 +1,14 @@
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
+ import { GlobalLoadingProcess, GlobalLoadingService } from './global-loading.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class GlobalLoadingServiceComponent implements OnInit, OnDestroy {
5
+ private globalLoading;
6
+ processes: GlobalLoadingProcess[];
7
+ private sub?;
8
+ constructor(globalLoading: GlobalLoadingService);
9
+ ngOnInit(): void;
10
+ ngOnDestroy(): void;
11
+ trackById(_index: number, item: GlobalLoadingProcess): string;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<GlobalLoadingServiceComponent, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<GlobalLoadingServiceComponent, "global-loading-service", never, {}, {}, never, never, true, never>;
14
+ }