@ktortu/aaa 0.1.0-beta.0 → 0.9.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 (37) hide show
  1. package/README.md +23 -7
  2. package/cdk/styles/tabs.css +100 -21
  3. package/fesm2022/ktortu-aaa-button.mjs +18 -11
  4. package/fesm2022/ktortu-aaa-button.mjs.map +1 -1
  5. package/fesm2022/ktortu-aaa-card.mjs +29 -4
  6. package/fesm2022/ktortu-aaa-card.mjs.map +1 -1
  7. package/fesm2022/ktortu-aaa-cdk.mjs +58 -15
  8. package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -1
  9. package/fesm2022/ktortu-aaa-dialog.mjs +69 -12
  10. package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
  11. package/fesm2022/ktortu-aaa-forms.mjs +455 -260
  12. package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
  13. package/fesm2022/ktortu-aaa-i18n.mjs +114 -0
  14. package/fesm2022/ktortu-aaa-i18n.mjs.map +1 -0
  15. package/fesm2022/ktortu-aaa-menu.mjs +38 -13
  16. package/fesm2022/ktortu-aaa-menu.mjs.map +1 -1
  17. package/fesm2022/ktortu-aaa-tabs.mjs +319 -42
  18. package/fesm2022/ktortu-aaa-tabs.mjs.map +1 -1
  19. package/fesm2022/ktortu-aaa-tooltip.mjs +3 -2
  20. package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -1
  21. package/fesm2022/ktortu-aaa.mjs +1 -0
  22. package/fesm2022/ktortu-aaa.mjs.map +1 -1
  23. package/forms/radio/radio-group.css +3 -3
  24. package/forms/styles/field-box.css +150 -2
  25. package/forms/styles/tokens.css +3 -0
  26. package/menu/menu.css +8 -4
  27. package/package.json +5 -1
  28. package/types/ktortu-aaa-button.d.ts +22 -8
  29. package/types/ktortu-aaa-card.d.ts +24 -4
  30. package/types/ktortu-aaa-cdk.d.ts +38 -0
  31. package/types/ktortu-aaa-dialog.d.ts +45 -9
  32. package/types/ktortu-aaa-forms.d.ts +336 -149
  33. package/types/ktortu-aaa-i18n.d.ts +74 -0
  34. package/types/ktortu-aaa-menu.d.ts +15 -8
  35. package/types/ktortu-aaa-tabs.d.ts +130 -13
  36. package/types/ktortu-aaa-tooltip.d.ts +5 -0
  37. package/types/ktortu-aaa.d.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ktortu-aaa-forms.mjs","sources":["../../../../projects/ktortu/aaa/forms/field/field-config.ts","../../../../projects/ktortu/aaa/forms/field/field-control.ts","../../../../projects/ktortu/aaa/forms/field/field.ts","../../../../projects/ktortu/aaa/forms/field/field.html","../../../../projects/ktortu/aaa/forms/base-input/base-input.ts","../../../../projects/ktortu/aaa/forms/datalist.ts","../../../../projects/ktortu/aaa/forms/number-field/number-field.ts","../../../../projects/ktortu/aaa/forms/number-field/number-field.html","../../../../projects/ktortu/aaa/forms/text-area/text-area.ts","../../../../projects/ktortu/aaa/forms/text-area/text-area.html","../../../../projects/ktortu/aaa/forms/text-field/text-field.ts","../../../../projects/ktortu/aaa/forms/text-field/text-field.html","../../../../projects/ktortu/aaa/forms/switch/switch.ts","../../../../projects/ktortu/aaa/forms/checkbox/checkbox-group.ts","../../../../projects/ktortu/aaa/forms/checkbox/checkbox.ts","../../../../projects/ktortu/aaa/forms/radio/radio-group.ts","../../../../projects/ktortu/aaa/forms/radio/radio.ts","../../../../projects/ktortu/aaa/forms/select/select-config.ts","../../../../projects/ktortu/aaa/forms/keyish.ts","../../../../projects/ktortu/aaa/forms/base-select/base-select.ts","../../../../projects/ktortu/aaa/forms/select/select-option-def.ts","../../../../projects/ktortu/aaa/forms/select/select.ts","../../../../projects/ktortu/aaa/forms/select/select.html","../../../../projects/ktortu/aaa/forms/select/select-config.directive.ts","../../../../projects/ktortu/aaa/forms/chips/chip-transition-scope.ts","../../../../projects/ktortu/aaa/forms/chips/chip.ts","../../../../projects/ktortu/aaa/forms/chips/chip.html","../../../../projects/ktortu/aaa/forms/chips/chip-item-def.ts","../../../../projects/ktortu/aaa/forms/chips/chips-config.ts","../../../../projects/ktortu/aaa/forms/chips/chip-list.ts","../../../../projects/ktortu/aaa/forms/chips/chip-list.html","../../../../projects/ktortu/aaa/forms/multi-select/multi-select-option-def.ts","../../../../projects/ktortu/aaa/forms/multi-select/multi-select.ts","../../../../projects/ktortu/aaa/forms/multi-select/multi-select.html","../../../../projects/ktortu/aaa/forms/base-temporal-field.ts","../../../../projects/ktortu/aaa/forms/temporal/temporal.ts","../../../../projects/ktortu/aaa/forms/date-field/date-field.ts","../../../../projects/ktortu/aaa/forms/date-field/date-field.html","../../../../projects/ktortu/aaa/forms/time-field/time-field.ts","../../../../projects/ktortu/aaa/forms/time-field/time-field.html","../../../../projects/ktortu/aaa/forms/date-time-field/date-time-field.ts","../../../../projects/ktortu/aaa/forms/date-time-field/date-time-field.html","../../../../projects/ktortu/aaa/forms/year-month-field/year-month-field.ts","../../../../projects/ktortu/aaa/forms/year-month-field/year-month-field.html","../../../../projects/ktortu/aaa/forms/temporal/clock.ts","../../../../projects/ktortu/aaa/forms/instant-field/instant-field.ts","../../../../projects/ktortu/aaa/forms/instant-field/instant-field.html","../../../../projects/ktortu/aaa/forms/temporal/temporal-date.pipe.ts","../../../../projects/ktortu/aaa/forms/ktortu-aaa-forms.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\n/** État d'un champ pertinent pour décider de l'affichage des erreurs. */\nexport interface KtFieldErrorState {\n invalid: boolean;\n touched: boolean;\n dirty: boolean;\n}\n\n/** Décide QUAND afficher les erreurs d'un champ (équivalent signal de l'ErrorStateMatcher Material). */\nexport type KtFieldErrorMatcher = (state: KtFieldErrorState) => boolean;\n\n/** Défaut : afficher l'erreur une fois le champ quitté (blur). */\nexport const defaultKtFieldErrorMatcher: KtFieldErrorMatcher = (state) => state.invalid && state.touched;\n\n/** Défauts applicables à tous les champs (surchargeables par champ via les inputs).\n Lib neutre i18n : les textes sont fournis par le consommateur, ici en une fois.\n Fourni en `Partial` : un consommateur n'override que ce qu'il veut. */\nexport interface KtFieldConfig {\n /** Libellé accessible du bouton d'effacement. */\n clearLabel: string;\n /** Libellé accessible du bouton d'aide (i18n). */\n helpLabel: string;\n /** Quand afficher les erreurs. Défaut : `invalid && touched`. */\n errorMatcher: KtFieldErrorMatcher;\n /** Masquer le hint quand l'erreur s'affiche (façon Material). Défaut : `false`. */\n hideHintWhenInvalid: boolean;\n /** Afficher toutes les erreurs au lieu de la première seule. Défaut : `false`. */\n showAllErrors: boolean;\n}\n\nexport const KT_FIELD_CONFIG = new InjectionToken<Partial<KtFieldConfig>>('KT_FIELD_CONFIG');\n\n/** Parent field interface representing shared states for its controls. */\nexport interface KtFieldParent {\n readonly baseId: Signal<string>;\n readonly describedBy: Signal<string | null>;\n readonly invalid: Signal<boolean>;\n readonly required: Signal<boolean>;\n}\n\nexport const KT_FIELD = new InjectionToken<KtFieldParent>('KT_FIELD');\n","import { Directive, ElementRef, computed, inject } from '@angular/core';\nimport { KT_FIELD } from './field-config';\n\n/** Marque le contrôle (natif ou custom) d'un champ pour que `Field` y câble l'a11y\n (id, aria-describedby, aria-invalid, aria-required). */\n@Directive({\n selector: '[ktFieldControl]',\n host: {\n '[id]': 'id()',\n '[attr.aria-describedby]': 'describedBy()',\n '[attr.aria-invalid]': 'invalid() ? \"true\" : null',\n '[attr.aria-required]': 'required() ? \"true\" : null',\n },\n})\nexport class KtFieldControl {\n private readonly parent = inject(KT_FIELD, { optional: true });\n\n protected readonly id = computed(() => this.parent?.baseId() ?? null);\n protected readonly describedBy = computed(() => this.parent?.describedBy() ?? null);\n protected readonly invalid = computed(() => this.parent?.invalid() ?? false);\n protected readonly required = computed(() => this.parent?.required() ?? false);\n\n readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { KtFieldControl } from './field-control';\nimport { KT_FIELD_CONFIG, KT_FIELD, type KtFieldParent } from './field-config';\nimport { KtTooltip } from '@ktortu/aaa/tooltip';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Forme minimale d'une erreur affichable — découple `Field` de Signal Forms. */\nexport interface KtFieldError {\n kind: string;\n message?: string;\n}\n\n/** Chrome de champ agnostique du système de forms : label + contrôle projeté + hint + erreur,\n et centralisation du câblage a11y. Nourri par des inputs simples.\n\n @example\n ```html\n <kt-field label=\"E-mail\" hint=\"Nous ne partagerons jamais votre adresse.\" [invalid]=\"emailInvalid()\" [errors]=\"emailErrors()\" required>\n <input ktFieldControl type=\"email\" [(ngModel)]=\"email\" />\n </kt-field>\n ``` */\n@Component({\n selector: 'kt-field',\n imports: [KtTooltip],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './field.css',\n templateUrl: './field.html',\n providers: [{ provide: KT_FIELD, useExisting: forwardRef(() => KtField) }],\n})\nexport class KtField implements KtFieldParent {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Libellé du champ. @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le contrôle. @default undefined */\n readonly hint = input<string>();\n /** Contenu de l'aide contextuelle (texte ou `TemplateRef`) rendu dans le tooltip d'aide. @default undefined */\n readonly helpText = input<string | TemplateRef<unknown>>();\n /** Libellé accessible du déclencheur d'aide. @default KT_FIELD_CONFIG.helpLabel ?? 'Help' */\n readonly helpLabel = input<string>(this.config?.helpLabel ?? 'Help');\n /** id(s) externe(s) à ajouter à l'`aria-describedby` du contrôle (découplage). @default undefined */\n readonly customDescribedBy = input<string>();\n /** Émis au clic sur le déclencheur d'aide (le `preventDefault`/`stopPropagation` est déjà appliqué). */\n readonly helpClick = output<MouseEvent>();\n /** Erreurs de validation à afficher sous le contrôle. @default [] */\n readonly errors = input<readonly KtFieldError[]>([]);\n /** Marque le champ comme invalide (pose `aria-invalid` et conditionne l'affichage des erreurs). @default false */\n readonly invalid = input(false);\n /** Affiche l'astérisque requis et pose `aria-required` sur le contrôle. @default false */\n readonly required = input(false);\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. */\n readonly fieldId = input<string>();\n /** Masquer le hint quand l'erreur s'affiche (façon Material). */\n readonly hideHintWhenInvalid = input<boolean>(this.config?.hideHintWhenInvalid ?? false);\n /** Afficher toutes les erreurs au lieu de la première seule. */\n readonly showAllErrors = input<boolean>(this.config?.showAllErrors ?? false);\n\n // Le contrôle est projeté : l'injection DI ne le traverse pas, on le cible via contentChild.\n private readonly control = contentChild(KtFieldControl);\n\n // Détecte le tooltip d'aide standard défini dans field.html (input DX)\n private readonly templateTooltip = viewChild(KtTooltip);\n // Détecte un tooltip d'aide custom projeté dans le slot ktFieldHelp\n private readonly projectedTooltip = contentChild(KtTooltip, { descendants: true });\n\n // Résout le tooltip actif\n private readonly activeTooltip = computed(() => this.projectedTooltip() ?? this.templateTooltip());\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId();\n readonly baseId = computed(() => this.fieldId() ?? `kt-field-${this.uid}`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n protected readonly hasError = computed(() => this.invalid() && this.errors().length > 0);\n\n // Hint visible sauf s'il est masqué en erreur (option façon Material).\n protected readonly showHint = computed(() => !!this.hint() && !(this.hideHintWhenInvalid() && this.invalid()));\n\n // Première erreur seule par défaut ; toutes si showAllErrors.\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.showHint()) ids.push(this.hintId());\n if (this.hasError()) ids.push(this.errorId());\n\n // Liaison a11y automatique avec le Tooltip d'aide actif (si présent et actif)\n const tooltip = this.activeTooltip();\n if (tooltip && tooltip.isActive()) {\n ids.push(tooltip.idForA11y);\n }\n\n // Ajout de l'ID personnalisé externe (decouplage complet)\n const custom = this.customDescribedBy();\n if (custom) ids.push(custom);\n\n return ids.length ? ids.join(' ') : null;\n });\n\n protected onHelpClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.helpClick.emit(event);\n }\n}\n","<div class=\"kt-field__header\">\n @if (label(); as labelText) {\n <label class=\"kt-field__label\" [id]=\"labelId()\" [for]=\"baseId()\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-field__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n @if (helpText(); as help) {\n <button\n type=\"button\"\n class=\"kt-field__help\"\n [ktTooltip]=\"help\"\n [attr.aria-label]=\"helpLabel()\"\n [attr.aria-describedby]=\"null\"\n (click)=\"onHelpClick($event)\"\n >\n <span class=\"kt-field__help-icon\" aria-hidden=\"true\">help</span>\n </button>\n }\n\n <ng-content select=\"[ktFieldHelp]\" />\n</div>\n\n<div class=\"kt-field__control\">\n <ng-content />\n</div>\n\n@if (showHint()) {\n <p class=\"kt-field__hint\" [id]=\"hintId()\">{{ hint() }}</p>\n}\n\n<!-- Région live toujours présente : les AT annoncent l'erreur dès son apparition. -->\n<p class=\"kt-field__error\" [id]=\"errorId()\" aria-live=\"polite\">\n @if (hasError()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-field__error-message\">{{ error.message }}</span>\n }\n }\n</p>\n","import {\n Directive,\n ElementRef,\n ModelSignal,\n TemplateRef,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n output,\n viewChild,\n} from '@angular/core';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\n\n/** Base partagée des champs simples (TextField, NumberField) : état FormValueControl,\n présentation (label/hint/prefix/suffix/clear) et politique d'affichage des erreurs.\n La valeur, son parsing et la notion de « vide » sont fournis par la sous-classe. */\n@Directive()\nexport abstract class KtBaseInputField<T> {\n protected readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Valeur du contrôle — déclarée concrètement par la sous-classe. */\n abstract value: ModelSignal<T>;\n\n // --- État poussé par [formField] ---\n // Ces entrées sont généralement câblées par l'intégration Signal Forms (`[formField]`) ;\n // tu peux aussi les piloter à la main en usage contrôlé.\n /** Marque le champ comme « visité » (déclenche l'affichage des erreurs). Deux-way. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive la saisie et le focus. @default false */\n readonly disabled = input<boolean>(false);\n /** Rend le champ en lecture seule (valeur visible, non modifiable). @default false */\n readonly readonly = input<boolean>(false);\n /** Le champ est-il en erreur (état fourni par la validation). @default false */\n readonly invalid = input<boolean>(false);\n /** Marque le champ comme requis (ajoute `aria-required`). @default false */\n readonly required = input<boolean>(false);\n /** Le champ a-t-il été modifié depuis sa valeur initiale. @default false */\n readonly dirty = input<boolean>(false);\n /** Liste des erreurs de validation à afficher. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Attribut `name` natif du contrôle. @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé pour des sélecteurs de test stables ; sinon auto-généré par Field. */\n readonly id = input<string>();\n /** Libellé du champ (associé via `<label for>`). */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le champ quand il est valide. */\n readonly hint = input<string>();\n /** Aide contextuelle riche : texte ou `TemplateRef` projeté dans une infobulle d'aide. */\n readonly helpText = input<string | TemplateRef<unknown>>();\n /** Libellé accessible du bouton d'aide. @default 'Help' (ou KT_FIELD_CONFIG.helpLabel) */\n readonly helpLabel = input<string>(this.config?.helpLabel ?? 'Help');\n /** Force la valeur de `aria-describedby` (sinon dérivée de hint/erreur). */\n readonly customDescribedBy = input<string>();\n /** Émis au clic sur le bouton d'aide contextuelle. */\n readonly helpClick = output<MouseEvent>();\n /** Texte indicatif affiché dans le champ vide. */\n readonly placeholder = input<string>();\n /** Indice d'autoremplissage du navigateur (attribut `autocomplete` natif) ; ex. `'current-password'`,\n `'new-password'`, `'email'`, `'username'`, `'off'`.\n @default undefined */\n readonly autocomplete = input<AutoFill>();\n /** Nom d'icône Material Symbols affichée en tête de champ. */\n readonly icon = input<string>();\n /** Affiche un bouton « effacer » quand le champ contient une valeur. @default false */\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Contenu décoratif en tête de champ : texte ou `TemplateRef`. */\n readonly prefix = input<string | TemplateRef<unknown>>();\n /** Contenu décoratif en fin de champ : texte ou `TemplateRef`. */\n readonly suffix = input<string | TemplateRef<unknown>>();\n /** Libellé i18n du bouton « effacer ». @default 'Clear' (ou KT_FIELD_CONFIG.clearLabel) */\n readonly clearLabel = input<string>(this.config?.clearLabel ?? 'Clear');\n /** Quand afficher l'erreur ; surcharge KT_FIELD_CONFIG et le défaut (`invalid && touched`). */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement | HTMLTextAreaElement>>('input');\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n // L'erreur ne s'affiche qu'au déclenchement décidé par le matcher (invalid/touched/dirty).\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly showClear = computed(\n () => this.clearable() && !this.disabled() && !this.readonly() && !this.isEmpty(this.value()),\n );\n\n protected asTemplate(value: string | TemplateRef<unknown> | undefined): TemplateRef<unknown> | null {\n return value instanceof TemplateRef ? value : null;\n }\n\n protected asText(value: string | TemplateRef<unknown> | undefined): string | null {\n return typeof value === 'string' ? value : null;\n }\n\n protected onInput(event: Event): void {\n this.value.set(this.parse((event.target as HTMLInputElement | HTMLTextAreaElement).value));\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.showClear()) {\n event.preventDefault();\n this.clear();\n }\n }\n\n protected clear(): void {\n this.value.set(this.emptyValue());\n this.touched.set(true);\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Parse la saisie brute en valeur typée. */\n protected abstract parse(raw: string): T;\n /** Représentation « vide » de la valeur. */\n protected abstract emptyValue(): T;\n /** La valeur est-elle vide (affichage du bouton d'effacement) ? */\n protected abstract isEmpty(value: T): boolean;\n}\n","/** Suggestion d'un champ de saisie (rendu `<datalist>`) : soit la valeur seule, soit un couple\n `{ value, label }` où `label` est le texte affiché et `value` ce qui est inséré dans le champ.\n @template V Type de la valeur du champ (string, number, ou type Temporal selon le champ). */\nexport type KtSuggestion<V> = V | { value: V; label?: string };\n\n/** Option `<datalist>` normalisée : `value` est la chaîne posée sur l'attribut DOM, `label` le\n libellé affiché (ou `null`). */\nexport interface KtDatalistOption {\n value: string;\n label: string | null;\n}\n\n/** Normalise une liste de suggestions en options `<datalist>`. `toValue` sérialise la valeur en\n chaîne attendue par l'input natif (identité pour le texte, `String()` pour les nombres,\n `serialize()` pour les champs Temporal). */\nexport function normalizeKtSuggestions<V>(\n suggestions: readonly KtSuggestion<V>[] | undefined,\n toValue: (value: V) => string,\n): readonly KtDatalistOption[] {\n if (!suggestions) return [];\n return suggestions.map((suggestion) => {\n if (typeof suggestion === 'object' && suggestion !== null && 'value' in suggestion) {\n return { value: toValue(suggestion.value), label: suggestion.label ?? null };\n }\n return { value: toValue(suggestion as V), label: null };\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl, transformedValue } from '@angular/forms/signals';\nimport { KtBaseInputField } from '../base-input/base-input';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { type KtSuggestion, normalizeKtSuggestions } from '../datalist';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Champ numérique : valeur `number | null` (champ vide ⇒ `null`, jamais `NaN`), intégré aux\n * Signal Forms via `FormValueControl`. Hérite de la présentation commune (label/hint/clear/\n * préfixe/suffixe/erreurs) de `KtBaseInputField`.\n *\n * @example\n * ```html\n * <kt-number-field label=\"Quantité\" [(value)]=\"qty\" [min]=\"0\" [step]=\"1\" />\n * ```\n */\n@Component({\n selector: 'kt-number-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './number-field.html',\n})\nexport class KtNumberField extends KtBaseInputField<number | null> implements FormValueControl<number | null> {\n /** Valeur saisie (two-way). `null` = champ vide. @default null */\n readonly value = model<number | null>(null);\n /** Borne minimale (attribut `min` natif). @default undefined */\n readonly min = input<number>();\n /** Borne maximale (attribut `max` natif). @default undefined */\n readonly max = input<number>();\n /** Pas d'incrément (attribut `step` natif). @default undefined */\n readonly step = input<number>();\n /** Suggestions d'autocomplétion proposées via un `<datalist>` natif (la saisie reste libre).\n Valeurs simples (`number[]`) ou couples `{ value, label }` pour distinguer libellé affiché et\n valeur insérée. @default undefined */\n readonly suggestions = input<readonly KtSuggestion<number>[]>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId();\n protected readonly datalistId = `kt-number-field-list-${this.uid}`;\n protected readonly hasSuggestions = computed(() => (this.suggestions()?.length ?? 0) > 0);\n protected readonly datalistOptions = computed(() =>\n normalizeKtSuggestions(this.suggestions(), (value) => String(value)),\n );\n\n // Utilitaire v22 standardisé pour la synchronisation réactive propre du champ numérique\n protected readonly rawValue = transformedValue(this.value, {\n parse: (val: string) => {\n const trimmed = val.trim().replace(',', '.');\n if (trimmed === '') return { value: null };\n const parsed = Number(trimmed);\n if (Number.isNaN(parsed)) {\n return { error: { kind: 'parse', message: 'La valeur saisie doit être un nombre valide.' } };\n }\n return { value: parsed };\n },\n format: (val) => (val === null ? '' : String(val)),\n });\n\n protected parse(raw: string): number | null {\n const trimmed = raw.trim().replace(',', '.');\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n }\n\n protected override onKeyDown(event: KeyboardEvent): void {\n if (this.disabled() || this.readonly()) return;\n\n super.onKeyDown(event);\n if (event.defaultPrevented) return;\n\n if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return;\n\n const isUp = event.key === 'ArrowUp';\n this.adjustValue(isUp);\n event.preventDefault();\n }\n\n private adjustValue(isUp: boolean): void {\n const step = this.step() ?? 1;\n const min = this.min();\n const max = this.max();\n\n let newValue: number;\n\n if (this.value() === null) {\n if (min !== undefined) {\n newValue = min;\n } else if (max !== undefined) {\n newValue = max;\n } else {\n newValue = 0;\n }\n } else {\n const currentValue = this.value()!;\n newValue = isUp ? currentValue + step : currentValue - step;\n }\n\n if (min !== undefined && newValue < min) {\n newValue = min;\n }\n if (max !== undefined && newValue > max) {\n newValue = max;\n }\n\n // Arrondi pour éviter les erreurs de virgule flottante JS\n const stepStr = String(step);\n const decimalIdx = stepStr.indexOf('.');\n if (decimalIdx !== -1) {\n const precision = stepStr.length - decimalIdx - 1;\n newValue = Number(newValue.toFixed(precision));\n }\n\n this.value.set(newValue);\n }\n\n protected emptyValue(): number | null {\n return null;\n }\n\n protected isEmpty(value: number | null): boolean {\n return value === null;\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"text\"\n inputmode=\"decimal\"\n role=\"spinbutton\"\n [attr.aria-valuemin]=\"min() ?? null\"\n [attr.aria-valuemax]=\"max() ?? null\"\n [attr.aria-valuenow]=\"value() ?? null\"\n [value]=\"rawValue()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.min]=\"min() ?? null\"\n [attr.max]=\"max() ?? null\"\n [attr.step]=\"step() ?? null\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"rawValue.set($event.target.value)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseInputField } from '../base-input/base-input';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\n\n/**\n * Zone de texte multi-ligne (valeur `string`) intégrée aux Signal Forms via `FormValueControl`.\n * Autosize en CSS (`field-sizing: content`) ; hérite de la présentation commune de `KtBaseInputField`.\n *\n * @example\n * ```html\n * <kt-text-area label=\"Commentaire\" [(value)]=\"comment\" [rows]=\"4\" />\n * ```\n */\n@Component({\n selector: 'kt-text-area',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './text-area.html',\n})\nexport class KtTextArea extends KtBaseInputField<string> implements FormValueControl<string> {\n /** Valeur saisie (two-way). @default '' */\n readonly value = model<string>('');\n /** Hauteur initiale (lignes). L'autosize est géré en CSS via `field-sizing: content`. @default 3 */\n readonly rows = input<number>(3);\n /** Plafond de caractères ; poussé par le form (validateur maxLength) ou par le consommateur. @default undefined */\n readonly maxLength = input<number>();\n\n protected parse(raw: string): string {\n return raw;\n }\n\n protected emptyValue(): string {\n return '';\n }\n\n protected isEmpty(value: string): boolean {\n return value.length === 0;\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n data-multiline\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <textarea\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n [value]=\"value()\"\n [rows]=\"rows()\"\n [style.min-height.lh]=\"rows()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.maxlength]=\"maxLength() ?? null\"\n (input)=\"onInput($event)\"\n (blur)=\"touched.set(true)\"\n ></textarea>\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseInputField } from '../base-input/base-input';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { type KtSuggestion, normalizeKtSuggestions } from '../datalist';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Types texte dont la valeur reste une string (number/date = composants séparés). */\nexport type KtTextFieldType = 'text' | 'email' | 'password' | 'search' | 'tel' | 'url';\n\n/**\n * Champ texte (valeur `string`) intégré aux Signal Forms via `FormValueControl`. Hérite de la\n * présentation commune (label/hint/clear/préfixe/suffixe/erreurs) de `KtBaseInputField`.\n *\n * @example\n * ```html\n * <kt-text-field label=\"E-mail\" type=\"email\" [(value)]=\"email\" required />\n * ```\n */\n@Component({\n selector: 'kt-text-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './text-field.html',\n})\nexport class KtTextField extends KtBaseInputField<string> implements FormValueControl<string> {\n /** Valeur saisie (two-way). @default '' */\n readonly value = model<string>('');\n /** Variante HTML du champ (pilote `type` natif et le clavier mobile). @default 'text' */\n readonly type = input<KtTextFieldType>('text');\n /** Suggestions d'autocomplétion proposées via un `<datalist>` natif (la saisie reste libre).\n Valeurs simples (`string[]`) ou couples `{ value, label }` pour distinguer libellé affiché et\n valeur insérée. @default undefined */\n readonly suggestions = input<readonly KtSuggestion<string>[]>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId();\n protected readonly datalistId = `kt-text-field-list-${this.uid}`;\n protected readonly hasSuggestions = computed(() => (this.suggestions()?.length ?? 0) > 0);\n protected readonly datalistOptions = computed(() => normalizeKtSuggestions(this.suggestions(), (value) => value));\n\n protected parse(raw: string): string {\n return raw;\n }\n\n protected emptyValue(): string {\n return '';\n }\n\n protected isEmpty(value: string): boolean {\n return value.length === 0;\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Bouton bascule (Switch / Slide-Toggle) accessible conforme aux normes WAI-ARIA.\n * Permet d'activer ou désactiver une option avec effet immédiat.\n * Intégré aux Signal Forms de l'application via FormValueControl.\n *\n * @example\n * ```html\n * <kt-switch label=\"Notifications par e-mail\" [(value)]=\"emailNotif\" />\n * ```\n */\n@Component({\n selector: 'kt-switch',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './switch.css',\n template: `\n <div\n class=\"kt-switch-field\"\n [class.kt-switch-field--invalid]=\"showInvalid()\"\n [class.kt-switch-field--disabled]=\"disabled()\"\n >\n <div class=\"kt-switch-row\">\n <button\n #switchBtn\n type=\"button\"\n role=\"switch\"\n [id]=\"baseId()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [attr.aria-labelledby]=\"label() ? labelId() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\"\n (keydown.space)=\"onSpacebar($event)\"\n class=\"kt-switch\"\n >\n <span class=\"kt-switch__thumb\"></span>\n </button>\n\n @if (label(); as labelText) {\n <label [id]=\"labelId()\" [attr.for]=\"baseId()\" class=\"kt-switch-label\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-switch-label__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n </div>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-switch-hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-switch-error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-switch-error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtSwitch implements FormValueControl<boolean> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** État de la bascule (two-way) : `true` = activé, `false` = désactivé. @default false */\n readonly value = model<boolean>(false);\n\n // --- État poussé par [formField] ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive la bascule (non actionnable). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque la bascule comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean>(false);\n /** Affiche l'astérisque requis sur le libellé. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean>(false);\n /** Erreurs de validation à afficher sous la bascule. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Identifiant logique du contrôle (à titre indicatif). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Texte du libellé associé à la bascule. @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous la bascule (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) quand `label` est absent. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean>(this.config?.showAllErrors ?? false);\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('switch');\n protected readonly baseId = computed(() => this.id() ?? `kt-switch-${this.uid}`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n protected toggle(): void {\n if (this.disabled()) return;\n this.value.update((v) => !v);\n this.touched.set(true);\n }\n\n protected onSpacebar(event: Event): void {\n event.preventDefault(); // évite le scroll de la page au clavier\n this.toggle();\n }\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Groupe de cases à cocher (Checkbox Group) conforme à l'ARIA APG / RGAA.\n * Orchestrateur : porte une valeur TABLEAU (`FormValueControl<V[]>`) et la sémantique de groupe\n * (`role=\"group\"`, légende, `aria-required`/`aria-invalid`, erreurs).\n *\n * Différence APG avec le radio-group : PAS de roving tabindex — chaque `kt-checkbox` reste\n * tabbable et coche/décoche indépendamment. Les options sont fournies par le dev (boucle `@for`\n * ou en dur) ; `compareWith` gère l'égalité quand les valeurs d'option sont des objets.\n *\n * @example\n * ```html\n * <kt-checkbox-group label=\"Centres d'intérêt\" [(value)]=\"interests\" required>\n * <kt-checkbox [value]=\"'sport'\" label=\"Sport\" />\n * <kt-checkbox [value]=\"'musique'\" label=\"Musique\" />\n * <kt-checkbox [value]=\"'cinema'\" label=\"Cinéma\" />\n * </kt-checkbox-group>\n * ```\n */\n@Component({\n selector: 'kt-checkbox-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './checkbox-group.css',\n template: `\n <div\n class=\"kt-checkbox-group-field\"\n [class.kt-checkbox-group-field--invalid]=\"showInvalid()\"\n [class.kt-checkbox-group-field--disabled]=\"disabled()\"\n role=\"group\"\n [attr.aria-labelledby]=\"label() ? labelId() : null\"\n [attr.aria-label]=\"!label() ? resolvedAriaLabel() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n >\n @if (label(); as labelText) {\n <span [id]=\"labelId()\" class=\"kt-checkbox-group__legend\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-checkbox-group__required\" aria-hidden=\"true\">*</span>\n }\n </span>\n }\n\n <div class=\"kt-checkbox-group__options\">\n <ng-content></ng-content>\n </div>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-checkbox-group__hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-checkbox-group__error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-checkbox-group__error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtCheckboxGroup<V> implements FormValueControl<V[]> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Sélection courante : tableau des valeurs d'options cochées (two-way). @default [] */\n readonly value = model<V[]>([]);\n\n // --- État poussé par [formField] ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive le groupe entier (hérité par chaque case enfant). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque le groupe comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean>(false);\n /** Affiche l'astérisque requis et `aria-required` sur le groupe. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean>(false);\n /** Erreurs de validation à afficher sous le groupe. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Attribut `name` partagé (à titre indicatif). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Légende du groupe (`aria-labelledby`). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le groupe (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) du groupe quand `label` est absent. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean>(this.config?.showAllErrors ?? false);\n\n /** Égalité des valeurs en mode objet (défaut : identité `===`). */\n readonly compareWith = input<(a: V, b: V) => boolean>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('checkbox-group');\n protected readonly baseId = computed(() => this.id() ?? `kt-checkbox-group-${this.uid}`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n private readonly comparator = computed(() => this.compareWith() ?? ((a: V, b: V) => a === b));\n\n /** La valeur d'option d'un enfant est-elle dans la sélection ? (lu dans le `computed` enfant) */\n isSelected(optionValue: V): boolean {\n const arr = this.value() ?? [];\n const cmp = this.comparator();\n return arr.some((v) => cmp(v, optionValue));\n }\n\n /** Ajoute/retire une valeur d'option de la sélection (émis par un enfant au `change` natif). */\n toggle(optionValue: V, checked: boolean): void {\n if (this.disabled()) return;\n const arr = this.value() ?? [];\n const cmp = this.comparator();\n const exists = arr.some((v) => cmp(v, optionValue));\n if (checked && !exists) {\n this.value.set([...arr, optionValue]);\n } else if (!checked && exists) {\n this.value.set(arr.filter((v) => !cmp(v, optionValue)));\n }\n this.touched.set(true);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n booleanAttribute,\n computed,\n effect,\n input,\n inject,\n model,\n viewChild,\n} from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtCheckboxGroup } from './checkbox-group';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Case à cocher (Checkbox) accessible conforme aux normes WAI-ARIA / RGAA.\n * Bâtie sur un `<input type=\"checkbox\">` NATIF (clavier, clic-label, état `indeterminate`,\n * mode contraste élevé gratuits), redessinée via `appearance: none` + pseudo-éléments thémés.\n *\n * DEUX MODES, selon la présence d'un `kt-checkbox-group` parent :\n * - Autonome : `value` est l'état coché (`boolean`, two-way), intégré aux Signal Forms via\n * `FormValueControl<boolean>` (même contrat que `kt-switch`).\n * - Dans un groupe : `value` est la VALEUR d'option représentée ; l'état coché dérive de\n * l'appartenance au tableau du groupe, et le (dé)cochage met à jour ce tableau.\n *\n * Libellé : `label` (texte) par défaut ; un contenu projeté le remplace visuellement pour les\n * rendus riches (carte/option), `ariaLabel` portant alors le nom accessible si besoin.\n *\n * @example\n * ```html\n * <!-- Autonome -->\n * <kt-checkbox label=\"Accepter les conditions\" [(value)]=\"accepted\" required />\n *\n * <!-- Dans un groupe -->\n * <kt-checkbox-group label=\"Centres d'intérêt\" [(value)]=\"interests\">\n * <kt-checkbox [value]=\"'sport'\" label=\"Sport\" />\n * <kt-checkbox [value]=\"'musique'\" label=\"Musique\" />\n * </kt-checkbox-group>\n * ```\n */\n@Component({\n selector: 'kt-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './checkbox.css',\n template: `\n <div\n class=\"kt-checkbox-field\"\n [class.kt-checkbox-field--invalid]=\"showInvalid()\"\n [class.kt-checkbox-field--disabled]=\"isDisabled()\"\n >\n <label class=\"kt-checkbox\">\n <input\n #input\n type=\"checkbox\"\n class=\"kt-checkbox__input\"\n [id]=\"baseId()\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n [attr.name]=\"name() || null\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n (change)=\"onChange($event)\"\n (blur)=\"onBlur()\"\n />\n <span class=\"kt-checkbox__label\">\n <ng-content>{{ label() }}</ng-content>\n @if (required()) {\n <span class=\"kt-checkbox__required\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-checkbox-hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-checkbox-error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-checkbox-error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtCheckbox<V = boolean> implements FormValueControl<V> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Groupe parent optionnel : présent ⇒ la case appartient à un `kt-checkbox-group`. */\n protected readonly group = inject(KtCheckboxGroup, { optional: true }) as KtCheckboxGroup<V> | null;\n\n /** Autonome : état coché (`boolean`, two-way). En groupe : la valeur d'option représentée. */\n readonly value = model<V>(false as unknown as V);\n\n /** Tri-état visuel (parent d'une arborescence) : propriété DOM `indeterminate`, pas un attribut. */\n readonly indeterminate = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n // --- État poussé par [formField] (mode autonome) ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive la case (héritable du groupe parent). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque la case comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean>(false);\n /** Affiche l'astérisque requis et `aria-required`. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean>(false);\n /** Erreurs de validation à afficher sous la case. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Attribut `name` du `<input>` natif. @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Texte du libellé (remplacé visuellement par un contenu projeté). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous la case (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) pour une case sans libellé textuel. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean>(this.config?.showAllErrors ?? false);\n\n private readonly inputEl = viewChild.required<ElementRef<HTMLInputElement>>('input');\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('checkbox');\n protected readonly baseId = computed(() => this.id() ?? `kt-checkbox-${this.uid}`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n /** Coché : appartenance au groupe le cas échéant, sinon l'état booléen propre.\n (Nommé `isChecked` car `FormValueControl` réserve la propriété `checked`.) */\n protected readonly isChecked = computed(() =>\n this.group ? this.group.isSelected(this.value()) : Boolean(this.value()),\n );\n\n /** Désactivé : hérité du groupe le cas échéant. */\n protected readonly isDisabled = computed(() => (this.group?.disabled() ?? false) || this.disabled());\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n constructor() {\n // `indeterminate` est une PROPRIÉTÉ (non un attribut) : poussée impérativement sur l'input natif.\n effect(() => {\n this.inputEl().nativeElement.indeterminate = this.indeterminate();\n });\n }\n\n protected onChange(event: Event): void {\n if (this.isDisabled()) return;\n const checked = (event.target as HTMLInputElement).checked;\n if (this.group) {\n this.group.toggle(this.value(), checked);\n this.group.touched.set(true);\n return;\n }\n this.value.set(checked as unknown as V);\n this.touched.set(true);\n }\n\n protected onBlur(): void {\n (this.group?.touched ?? this.touched).set(true);\n }\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Groupe de boutons radio (Radio Group) conforme à l'ARIA APG / RGAA.\n * Orchestrateur : porte la valeur (`FormValueControl<V | null>`), génère le `name` partagé et la\n * sémantique de groupe (`role=\"radiogroup\"`, légende, `aria-required`/`aria-invalid`, erreurs).\n *\n * Le clavier (roving tabindex + flèches qui déplacent ET cochent) est laissé au NATIF : les\n * `<input type=\"radio\">` des `kt-radio` enfants partagent le `name` du groupe — rien à réimplémenter.\n * Les options sont fournies par le dev (boucle `@for` ou déclaration en dur) ; `compareWith` gère\n * l'égalité quand `value` est un objet.\n *\n * @example\n * ```html\n * <kt-radio-group label=\"Civilité\" [(value)]=\"civility\" required>\n * <kt-radio [value]=\"'mme'\" label=\"Madame\" />\n * <kt-radio [value]=\"'m'\" label=\"Monsieur\" />\n * <kt-radio [value]=\"'autre'\" label=\"Autre\" />\n * </kt-radio-group>\n * ```\n */\n@Component({\n selector: 'kt-radio-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './radio-group.css',\n template: `\n <div\n class=\"kt-radio-group-field\"\n [class.kt-radio-group-field--invalid]=\"showInvalid()\"\n [class.kt-radio-group-field--disabled]=\"disabled()\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label() ? labelId() : null\"\n [attr.aria-label]=\"!label() ? resolvedAriaLabel() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n >\n @if (label(); as labelText) {\n <span [id]=\"labelId()\" class=\"kt-radio-group__legend\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-radio-group__required\" aria-hidden=\"true\">*</span>\n }\n </span>\n }\n\n <div class=\"kt-radio-group__options\">\n <ng-content></ng-content>\n </div>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-radio-group__hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-radio-group__error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-radio-group__error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtRadioGroup<V> implements FormValueControl<V | null> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Valeur sélectionnée (two-way), ou `null` si aucune option n'est cochée. @default null */\n readonly value = model<V | null>(null);\n\n // --- État poussé par [formField] ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive le groupe entier (hérité par chaque radio enfant). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque le groupe comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean>(false);\n /** Affiche l'astérisque requis et `aria-required` sur le groupe. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean>(false);\n /** Erreurs de validation à afficher sous le groupe. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Base du `name` partagé par les radios enfants (sinon auto-généré). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Légende du groupe (`aria-labelledby`). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le groupe (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) du groupe quand `label` est absent. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean>(this.config?.showAllErrors ?? false);\n\n /** Égalité des valeurs en mode objet (défaut : identité `===`). Seul rescapé du contrat select. */\n readonly compareWith = input<(a: V, b: V) => boolean>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('radio-group');\n protected readonly baseId = computed(() => this.id() ?? `kt-radio-group-${this.uid}`);\n /** `name` partagé par les radios enfants → regroupement clavier NATIF (roving + flèches). */\n readonly groupName = computed(() => this.name() || `${this.baseId()}-name`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n private readonly comparator = computed(() => this.compareWith() ?? ((a: V, b: V) => a === b));\n\n /** Le `value` d'un enfant correspond-il à la sélection courante ? (lu dans le `computed` enfant) */\n isSelected(radioValue: V): boolean {\n const v = this.value();\n if (v === null || v === undefined) return false;\n return this.comparator()(radioValue, v as V);\n }\n\n /** Commit d'une sélection émis par un enfant au `change` natif. */\n select(radioValue: V): void {\n if (this.disabled()) return;\n this.value.set(radioValue);\n this.touched.set(true);\n }\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input } from '@angular/core';\nimport { KtRadioGroup } from './radio-group';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Bouton radio individuel (enfant déclaratif de `kt-radio-group`).\n * `<input type=\"radio\">` NATIF partageant le `name` du groupe : clavier (roving + flèches) gratuit.\n * Le libellé suit la même règle que la checkbox : `label` texte par défaut, contenu projeté en\n * override visuel (carte sélectionnable), `ariaLabel` pour le nom accessible d'une option non-textuelle.\n *\n * @example\n * ```html\n * <kt-radio-group label=\"Civilité\" [(value)]=\"civility\">\n * <kt-radio [value]=\"'mme'\" label=\"Madame\" />\n * <kt-radio [value]=\"'m'\" label=\"Monsieur\" />\n * </kt-radio-group>\n * ```\n */\n@Component({\n selector: 'kt-radio',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './radio.css',\n template: `\n <label class=\"kt-radio\">\n <input\n type=\"radio\"\n class=\"kt-radio__input\"\n [id]=\"baseId()\"\n [name]=\"group.groupName()\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-describedby]=\"hint() ? hintId() : null\"\n (change)=\"onChange()\"\n (blur)=\"group.touched.set(true)\"\n />\n <span class=\"kt-radio__label\">\n <ng-content>{{ label() }}</ng-content>\n </span>\n </label>\n\n @if (hint(); as hintText) {\n <p [id]=\"hintId()\" class=\"kt-radio__hint\">{{ hintText }}</p>\n }\n `,\n})\nexport class KtRadio<V> {\n protected readonly group = inject<KtRadioGroup<V>>(KtRadioGroup);\n\n /** Valeur d'option représentée par ce radio (sélectionnée ⇒ devient la valeur du groupe). @default (requis) */\n readonly value = input.required<V>();\n /** Texte du libellé (remplacé visuellement par un contenu projeté). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le radio. @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) pour une option sans libellé textuel. @default undefined */\n readonly ariaLabel = input<string>();\n /** Désactive ce radio (combiné à l'état désactivé du groupe). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('radio');\n protected readonly baseId = computed(() => this.id() ?? `kt-radio-${this.uid}`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n\n protected readonly checked = computed(() => this.group.isSelected(this.value()));\n protected readonly isDisabled = computed(() => this.group.disabled() || this.disabled());\n\n protected onChange(): void {\n this.group.select(this.value());\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/** Défauts applicables à tous les `kt-select` (surchargeables par champ via les inputs).\n Lib neutre i18n : les textes sont fournis par le consommateur (ici en une fois).\n Fourni en `Partial` : un consommateur n'override que ce qu'il veut.\n Calqué sur `KT_FIELD_CONFIG`. */\nexport interface KtSelectConfigOptions {\n /** Texte affiché quand aucune option n'est sélectionnée. */\n placeholder: string;\n /** Texte affiché quand la liste filtrée/d'options est vide. */\n emptyText: string;\n /** Libellé accessible du bouton de fermeture de la bottom-sheet mobile. */\n closeLabel: string;\n /** Fermer le popup après une sélection. Défaut (single) : `true`. */\n closeOnSelect: boolean;\n /** Placeholder du champ de filtre des select filtrables (`[filterable]`). */\n filterPlaceholder: string;\n /** Libellé accessible (aria-label) du champ de filtre. */\n filterLabel: string;\n /** Annonce du nombre de résultats du filtre (live region). Fonction : laisse le\n consommateur gérer les pluriels i18n. Défaut : `'1 result'` / `'N results'`. */\n filterResultsText: (count: number) => string;\n\n // --- Clés propres au multi-select (`kt-multi-select`) ---\n /** Libellé accessible du bouton de retrait d'un chip. Défaut : `'Remove X'`. */\n removeItemLabel: (itemLabel: string) => string;\n /** Libellé accessible du conteneur de chips (reçoit le label du champ, pour\n distinguer plusieurs multi-selects d'une page). Défaut : `'Selected items for X'`. */\n selectedItemsLabel: (fieldLabel: string | undefined) => string;\n /** Résumé affiché sur le trigger au-delà du seuil d'énumération. Défaut : `'N items selected'`. */\n selectionSummaryText: (count: number) => string;\n /** Annonce live après le retrait d'un élément (chip ou tout effacer). Défaut : `'X removed'`. */\n itemRemovedText: (itemLabel: string) => string;\n /** Compteur de sélection (live region du filtre, actions de masse). Défaut : `'N selected'`. */\n selectionCountText: (count: number) => string;\n /** Libellé du bouton « tout sélectionner » du popup (`[selectionActions]`). Défaut : `'Select all'`. */\n selectAllLabel: string;\n /** Libellé du bouton « tout effacer » du popup (`[selectionActions]`). Défaut : `'Clear all'`. */\n clearAllLabel: string;\n /** Libellé du bouton dépliant les chips repliés (`[maxVisibleChips]`). Défaut : `'+N more'`. */\n moreChipsLabel: (hiddenCount: number) => string;\n /** Libellé du même bouton une fois déplié. Défaut : `'Show less'`. */\n lessChipsLabel: string;\n /** Texte informatif de troncature des résultats (visuel). Défaut : `'Showing first X results of Y...'`. */\n truncatedResultsText: (max: number, total: number) => string;\n /** Annonce de la troncature des résultats (live region). Défaut : `'X results displayed out of Y...'`. */\n truncatedResultsAnnouncement: (max: number, total: number) => string;\n}\n\nexport const KT_SELECT_CONFIG = new InjectionToken<Partial<KtSelectConfigOptions>>('KT_SELECT_CONFIG');\n","/** Clé (propriété) OU fonction d'accès, pour dériver une valeur d'un item.\n Partagé par les sélecteurs (BaseSelect) et les chips (ChipList). */\nexport type KtKeyish<T, R> = keyof T | ((item: T) => R);\n\n/** Normalise une clé/fonction en fonction d'accès, avec repli si non fourni. */\nexport function accessor<T, R>(key: KtKeyish<T, R> | undefined, fallback: (item: T) => R): (item: T) => R {\n if (key === undefined) return fallback;\n if (typeof key === 'function') return key;\n return (item: T) => (item as Record<PropertyKey, unknown>)[key] as R;\n}\n\n/** Libellé par défaut : `label`/`name` pour un objet, sinon `String(item)`. */\nexport function defaultLabel<T>(item: T): string {\n if (item !== null && typeof item === 'object') {\n const o = item as Record<string, unknown>;\n const v = o['label'] ?? o['name'];\n if (v !== undefined && v !== null) return String(v);\n }\n return String(item);\n}\n\n/** Identité par défaut : `id`/`value` pour un objet, sinon l'item lui-même (primitif). */\nexport function defaultIdentity<T>(item: T): unknown {\n if (item !== null && typeof item === 'object') {\n const o = item as Record<string, unknown>;\n return o['id'] ?? o['value'] ?? item;\n }\n return item;\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n NgZone,\n Signal,\n TemplateRef,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n model,\n output,\n signal,\n viewChild,\n untracked,\n PLATFORM_ID,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Listbox } from '@angular/aria/listbox';\nimport { Combobox } from '@angular/aria/combobox';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KT_SELECT_CONFIG } from '../select/select-config';\nimport { type KtKeyish, accessor, defaultIdentity, defaultLabel } from '../keyish';\nimport { KtViewport, createKtSheetDrag, KtIdGenerator } from '@ktortu/aaa/cdk';\n\nexport type { KtKeyish } from '../keyish';\n\n/** Annonce différée du nombre de résultats : ~500 ms après la dernière frappe (anti-spam SR). */\nconst ANNOUNCE_DELAY_MS = 500;\n\n/** Normalisation du filtre par défaut : insensible à la casse ET aux accents\n (décomposition NFD puis suppression des diacritiques combinants). */\nfunction normalizeForFilter(s: string): string {\n return s\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n}\n\n/** Annonce par défaut du nombre de résultats (lib neutre : anglais, comme `emptyText`). */\nfunction defaultFilterResultsText(count: number): string {\n return count === 1 ? '1 result' : `${count} results`;\n}\n\nfunction defaultTruncatedResultsText(max: number, total: number): string {\n return `Showing first ${max} results of ${total}. Refine your search to see more.`;\n}\n\nfunction defaultTruncatedResultsAnnouncement(max: number, total: number): string {\n return `${max} results displayed out of ${total}. Refine your search to see more.`;\n}\n\n/** Base partagée des sélecteurs à liste fermée (Select single et MultiSelect), bâtis sur\n `@angular/aria` (Combobox + Listbox) : options et dérivation (clé/fonction), état poussé\n par `[formField]`, popup Popover responsive (dropdown ancré desktop ↔ bottom-sheet\n téléphone, drag-to-dismiss), filtrage opt-in avec live region, clavier commun (Échap\n global, Tab APG depuis le filtre). La VALEUR (`V | null` vs `V[]`) et `selectionChange`\n restent dans les sous-classes : leurs types divergent, chacune implémente seule\n `FormValueControl<…>`. Même pattern d'héritage que `BaseInputField`.\n\n @template T Type d'une option (élément du tableau `options`).\n @template V Type de la valeur émise par le contrôle (défaut `T` : l'objet entier ;\n ou la clé extraite quand `optionValue` est fourni). */\n@Directive({\n host: {\n '(keydown)': 'onHostKeydown($event)',\n },\n})\nexport abstract class KtBaseSelect<T, V = T> {\n protected readonly fieldConfig = inject(KT_FIELD_CONFIG, { optional: true });\n protected readonly config = inject(KT_SELECT_CONFIG, { optional: true });\n protected readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly ngZone = inject(NgZone);\n protected readonly doc = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private wasExpanded = false;\n\n // --- Données / dérivation (clé OU fonction, défauts intelligents) ---\n /** Liste des options affichées (source de vérité du contrôle). */\n readonly options = input.required<readonly T[]>();\n /** Libellé affiché d'une option : clé OU fonction. Défaut : `label`/`name`, sinon `String(option)`. */\n readonly optionLabel = input<KtKeyish<T, string>>();\n /** Dérive la valeur de sortie ET l'identité d'une option.\n - Fourni (clé/fonction) ⇒ `value` = la/les clé(s) extraite(s).\n - Omis ⇒ `value` = l'objet entier ; l'identité interne dérive de `id`/`value`. */\n readonly optionValue = input<KtKeyish<T, V>>();\n /** Désactivation d'une option : clé OU fonction renvoyant un booléen. Défaut : aucune option désactivée. */\n readonly optionDisabled = input<KtKeyish<T, boolean>>();\n /** Égalité des options en mode objet (présélection). Défaut : comparaison par identité (`id`/`value`). */\n readonly compareWith = input<(a: T, b: T) => boolean>();\n\n /** Émis au clic sur le bouton d'aide contextuelle. */\n readonly helpClick = output<MouseEvent>();\n\n // --- État poussé par [formField] (même contrat que BaseInputField) ---\n /** Le champ a-t-il été visité ? Poussé par `[formField]` ; passe à `true` à la première sélection. @default false */\n readonly touched = model<boolean>(false);\n /** Champ désactivé (trigger inerte). Poussé par `[formField]`. @default false */\n readonly disabled = input<boolean>(false);\n /** Champ en lecture seule (sélection figée, valeur affichée). Poussé par `[formField]`. @default false */\n readonly readonly = input<boolean>(false);\n /** Le champ est-il invalide ? Pilote l'affichage des erreurs. Poussé par `[formField]`. @default false */\n readonly invalid = input<boolean>(false);\n /** Champ obligatoire (marqueur visuel/ARIA). Poussé par `[formField]`. @default false */\n readonly required = input<boolean>(false);\n /** Le champ a-t-il été modifié depuis sa valeur initiale ? Poussé par `[formField]`. @default false */\n readonly dirty = input<boolean>(false);\n /** Erreurs de validation à afficher. Poussé par `[formField]`. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Attribut `name` logique du contrôle (à titre indicatif). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré par Field. @default undefined */\n readonly id = input<string>();\n /** Libellé du champ (rendu par Field). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le champ quand il est valide. @default undefined */\n readonly hint = input<string>();\n /** Aide contextuelle riche : texte ou `TemplateRef` rendu dans une infobulle d'aide. @default undefined */\n readonly helpText = input<string | TemplateRef<unknown>>();\n /** Libellé accessible du bouton d'aide. @default 'Help' (ou KT_FIELD_CONFIG.helpLabel) */\n readonly helpLabel = input<string>(this.fieldConfig?.helpLabel ?? 'Help');\n /** Force la valeur de `aria-describedby` (sinon dérivée de hint/erreur). @default undefined */\n readonly customDescribedBy = input<string>();\n /** Texte indicatif affiché quand aucune option n'est sélectionnée. @default undefined */\n readonly placeholder = input<string>();\n /** Quand afficher l'erreur ; surcharge KT_FIELD_CONFIG et le défaut (`invalid && touched`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n\n // --- Filtrage (champ de recherche dans le popup, opt-in) ---\n /** Affiche un champ de recherche en tête du popup (desktop) / de la sheet (téléphone).\n Pour les listes longues ; le texte tapé ne sert qu'à filtrer (réinitialisé à la fermeture). */\n readonly filterable = input<boolean>(false);\n /** Placeholder du champ de recherche du popup. Défaut : `KT_SELECT_CONFIG.filterPlaceholder` ou vide. */\n readonly filterPlaceholder = input<string>();\n /** Libellé accessible du champ de recherche. Défaut : `KT_SELECT_CONFIG.filterLabel` ou « Filter options ». */\n readonly filterLabel = input<string>();\n /** Prédicat de filtre custom `(option, texte tapé brut)`.\n Défaut : libellé de l'option, insensible à la casse et aux accents. */\n readonly filterFn = input<(option: T, query: string) => boolean>();\n /** Nombre maximal d'options affichées dans le DOM en mode filtrable pour optimiser les performances. @default 100 */\n readonly maxVisibleOptions = input<number>(100);\n /** Texte informatif de troncature des résultats (visuel). */\n readonly truncatedResultsText = input<(max: number, total: number) => string>();\n /** Annonce de la troncature des résultats (live region). */\n readonly truncatedResultsAnnouncement = input<(max: number, total: number) => string>();\n\n // --- État interne du popup ---\n protected readonly expanded = signal(false);\n protected readonly viewport = inject(KtViewport);\n /** Écran compact (téléphone / fenêtre étroite) : bascule le popup en bottom-sheet modale.\n Source unique configurable par appli (`KtViewport` / `provideKtBreakpoints`) ; pilote aussi\n la classe CSS `kt-select__popup--sheet` du template. */\n protected readonly compact = this.viewport.isCompact;\n protected readonly triggerEl = viewChild<ElementRef<HTMLElement>>('trigger');\n protected readonly popupEl = viewChild<ElementRef<HTMLElement>>('popup');\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('select');\n private readonly anchorName = `--kt-select-anchor-${this.uid}`;\n /** id du panneau (élément widget) en mode filtrable — cible de l'aria-controls du trigger. */\n protected readonly panelId = `kt-select-panel-${this.uid}`;\n protected readonly filterInputEl = viewChild<ElementRef<HTMLInputElement>>('filterInput');\n protected readonly listboxEl = viewChild<ElementRef<HTMLElement>>('listboxEl');\n protected readonly listboxDir = viewChild(Listbox);\n protected readonly comboboxDir = viewChild(Combobox);\n /** Suit l'état réel du Popover : la fermeture peut être synchrone (Tab) ET pilotée par\n l'effect — sans ce flag, le second `hidePopover()` jetterait une InvalidStateError. */\n private popoverShown = false;\n\n // --- Politique d'affichage des erreurs (cohérente avec les champs) ---\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.fieldConfig?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n // --- Textes résolus (input > KT_SELECT_CONFIG > défaut lib neutre EN) ---\n protected readonly resolvedPlaceholder = computed(() => this.placeholder() ?? this.config?.placeholder ?? '');\n protected readonly resolvedEmptyText = computed(() => this.config?.emptyText ?? 'No options');\n protected readonly resolvedCloseLabel = computed(() => this.config?.closeLabel ?? 'Close');\n protected readonly resolvedFilterPlaceholder = computed(\n () => this.filterPlaceholder() ?? this.config?.filterPlaceholder ?? '',\n );\n protected readonly resolvedFilterLabel = computed(\n () => this.filterLabel() ?? this.config?.filterLabel ?? 'Filter options',\n );\n protected readonly resolvedFilterResultsText = computed(\n () => this.config?.filterResultsText ?? defaultFilterResultsText,\n );\n protected readonly resolvedTruncatedResultsText = computed(\n () => this.truncatedResultsText() ?? this.config?.truncatedResultsText ?? defaultTruncatedResultsText,\n );\n protected readonly resolvedTruncatedResultsAnnouncement = computed(\n () =>\n this.truncatedResultsAnnouncement() ??\n this.config?.truncatedResultsAnnouncement ??\n defaultTruncatedResultsAnnouncement,\n );\n\n // Field attend des { kind, message } ; on mappe les ValidationError.\n protected readonly fieldErrors = computed(() => this.errors().map((e) => ({ kind: e.kind, message: e.message })));\n\n // --- Accès aux options ---\n private readonly labelAccessor = computed(() => accessor<T, string>(this.optionLabel(), defaultLabel));\n private readonly valueAccessor = computed(() => accessor<T, unknown>(this.optionValue(), defaultIdentity));\n private readonly disabledAccessor = computed(() => accessor<T, boolean>(this.optionDisabled(), () => false));\n /** Comparateur effectif en mode objet : `compareWith`, sinon égalité par identité. */\n protected readonly comparator = computed(\n () => this.compareWith() ?? ((a: T, b: T) => this.keyOf(a) === this.keyOf(b)),\n );\n\n protected labelOf(item: T): string {\n return this.labelAccessor()(item);\n }\n protected keyOf(item: T): unknown {\n return this.valueAccessor()(item);\n }\n protected disabledOf(item: T): boolean {\n return this.disabledAccessor()(item);\n }\n\n // --- Filtrage : état éphémère (réinitialisé à la fermeture du popup) ---\n protected readonly filterText = signal('');\n /** Annonce différée du nombre de résultats (live region `role=\"status\"`). */\n protected readonly announcedCount = signal('');\n private announceTimer: ReturnType<typeof setTimeout> | undefined;\n\n /** Options visibles : les options, restreintes par le filtre quand il est actif. */\n protected readonly filteredOptions = computed<readonly T[]>(() => {\n const query = this.filterText().trim();\n if (!this.filterable() || query === '') return this.options();\n const fn =\n this.filterFn() ??\n ((option: T, q: string) => normalizeForFilter(this.labelOf(option)).includes(normalizeForFilter(q)));\n return this.options().filter((option) => fn(option, query));\n });\n\n /** Les options affichées dans le DOM. La limitation (maxVisibleOptions) n'est appliquée qu'en mode filtrable. */\n protected readonly displayedOptions = computed<readonly T[]>(() => {\n const opts = this.filteredOptions();\n if (!this.filterable()) return opts;\n const limit = this.maxVisibleOptions();\n return opts.length <= limit ? opts : opts.slice(0, limit);\n });\n\n // --- Hooks fournis par les sous-classes ---\n /** Valeur poussée au ngListbox sous-jacent : tableau de clés (0/1 en single, N en multi). */\n protected abstract readonly listboxValue: Signal<unknown[]>;\n /** Réception des (dé)sélections du listbox — la sémantique de commit diverge (single/multi). */\n protected abstract onListboxValueChange(keys: readonly unknown[]): void;\n\n /** Texte de la live region du filtre. Virtuel : le multi y ajoute « , M selected ». */\n protected composeFilterAnnouncement(): string {\n const query = this.filterText().trim();\n if (query === '') return '';\n const total = this.filteredOptions().length;\n const limit = this.maxVisibleOptions();\n if (this.filterable() && total > limit) {\n return this.resolvedTruncatedResultsAnnouncement()(limit, total);\n }\n return this.resolvedFilterResultsText()(total);\n }\n\n constructor() {\n // Ancre le trigger : `setProperty` natif (les propriétés CSS à tiret comme `anchor-name`\n // ne sont pas appliquées de façon fiable par le binding `[style.…]`/Renderer2 — cf. Tooltip).\n effect(() => {\n this.triggerEl()?.nativeElement.style.setProperty('anchor-name', this.anchorName);\n });\n\n // Affichage du popup via Popover natif (top-layer). On NE peut PAS utiliser <dialog>.showModal()\n // (vraie modale) : ce combobox @angular/aria se ferme au blur (closePopupOnBlur) et showModal\n // déplace le focus hors du combobox → fermeture immédiate. On reste donc en Popover (le focus\n // reste sur le combobox) ; sur mobile le focusMode 'roving' rend les options réellement focusables.\n effect(() => {\n const el = this.popupEl()?.nativeElement as\n | (HTMLElement & { showPopover?(): void; hidePopover?(): void })\n | undefined;\n if (!el) return;\n if (this.expanded()) {\n el.classList.remove('kt-select__popup--closing');\n el.style.translate = ''; // efface un éventuel translate résiduel d'un drag-to-dismiss précédent\n el.style.setProperty('position-anchor', this.anchorName);\n el.showPopover?.();\n this.popoverShown = true;\n // Desktop filtrable : le champ de recherche prend le focus à l'ouverture (pattern\n // SelectPanel). Pas sur téléphone : le clavier virtuel recouvrirait la bottom-sheet.\n if (this.filterable() && !this.compact()) this.filterInputEl()?.nativeElement.focus();\n } else if (this.popoverShown) {\n this.animateAndCloseSelect(el);\n }\n });\n\n // Filtre éphémère : réinitialisé à la fermeture (liste complète à la réouverture).\n effect(() => {\n if (this.expanded()) return;\n untracked(() => {\n this.filterText.set('');\n this.announcedCount.set('');\n clearTimeout(this.announceTimer);\n });\n });\n\n this.destroyRef.onDestroy(() => {\n clearTimeout(this.announceTimer);\n this.sheetDrag.destroy();\n if (isPlatformBrowser(this.platformId) && this.compact() && this.expanded()) {\n this.doc.body.style.overflow = '';\n }\n });\n\n // Préserve le contenu du template sur mobile pour permettre l'animation de sortie\n effect(() => {\n const cb = this.comboboxDir();\n if (cb) {\n cb.preserveContent.set(this.compact());\n }\n });\n\n // Sheet mobile : verrouille le scroll du fond et restitue le focus au trigger à la fermeture.\n effect(() => {\n if (!this.compact()) return;\n if (!isPlatformBrowser(this.platformId)) return;\n if (this.expanded()) {\n this.doc.body.style.overflow = 'hidden';\n this.wasExpanded = true;\n } else {\n this.doc.body.style.overflow = '';\n if (this.wasExpanded) {\n this.triggerEl()?.nativeElement.focus();\n }\n }\n });\n\n // Ferme au clic/tap en dehors du composant (remplace le binding d'hôte statique document:pointerdown)\n // Enregistré une seule fois hors de la zone Angular pour éviter le change detection global sur chaque clic.\n if (isPlatformBrowser(this.platformId)) {\n this.ngZone.runOutsideAngular(() => {\n const onPointerDown = (event: PointerEvent) => {\n if (!this.expanded()) return;\n const target = event.target as Node | null;\n const popup = this.popupEl()?.nativeElement;\n if (target && (!this.host.nativeElement.contains(target) || target === popup)) {\n this.ngZone.run(() => {\n this.expanded.set(false);\n });\n }\n };\n this.doc.addEventListener('pointerdown', onPointerDown);\n this.destroyRef.onDestroy(() => {\n this.doc.removeEventListener('pointerdown', onPointerDown);\n });\n });\n }\n\n // Fait défiler la liste pour afficher l'option active lors de la navigation au clavier (mode activedescendant).\n effect(() => {\n const activeId = this.listboxDir()?.activeDescendant();\n if (!this.expanded() || !activeId) return;\n\n requestAnimationFrame(() => {\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n const activeEl = listbox.querySelector('.kt-select__option--active');\n if (activeEl) {\n activeEl.scrollIntoView({ block: 'nearest' });\n }\n });\n });\n\n if (isDevMode()) {\n effect(() => {\n const opts = this.options();\n if (this.optionValue() !== undefined || this.compareWith() !== undefined) return;\n const sample = opts.find((o) => o !== null && typeof o === 'object') as Record<string, unknown> | undefined;\n if (sample && sample['id'] === undefined && sample['value'] === undefined) {\n console.warn(\n `[${this.host.nativeElement.tagName.toLowerCase()}] Options de type objet sans identité résoluble ` +\n \"('id'/'value') ni `compareWith` : la sélection peut être incohérente au rechargement \" +\n 'des données. Fournissez `optionValue` ou `compareWith`.',\n );\n }\n });\n }\n }\n\n protected onFilterInput(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.scheduleResultsAnnouncement();\n this.resyncListboxSelection();\n }\n\n /** Relaye la navigation vers le listbox : le focus DOM est dans le champ de filtre et les\n keydown du popup ne remontent pas au combobox (le popup est un sibling DOM du trigger).\n Shift+flèches : extension de plage (multi ; sans effet en single). Home/End/Espace/\n caractères restent dans le champ (convention APG des combobox éditables). */\n protected onFilterKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.expanded.set(false);\n this.refocusTriggerAfterFilterClose();\n return;\n }\n if (event.key === 'Tab') {\n // APG : Tab ferme le popup et suit l'ordre de tabulation. Fermeture SYNCHRONE (l'effect\n // est différé : le popup, sibling DOM du trigger, resterait tabbable pendant l'action\n // par défaut) + focus sur le trigger SANS preventDefault : le Tab natif repart du\n // trigger vers l'élément suivant de la page (Shift+Tab : le précédent).\n this.closePopupNow();\n this.refocusTriggerAfterFilterClose();\n return;\n }\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp' && event.key !== 'Enter') return;\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n event.preventDefault();\n listbox.dispatchEvent(new KeyboardEvent('keydown', { key: event.key, shiftKey: event.shiftKey, cancelable: true }));\n }\n\n /** Échap depuis n'importe où dans le composant popup ouvert : après un clic souris sur une\n option, le focus DOM est sur le listbox (pas le trigger) — ni le listbox ni le combobox ne\n gèrent Échap là. Le popup est rendu dans le sous-arbre DOM de l'hôte : l'événement y bulle.\n (Trigger et champ de filtre gèrent leur Échap en amont avec stopPropagation : pas de doublon.) */\n protected onHostKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape' || !this.expanded()) return;\n event.preventDefault();\n event.stopPropagation();\n this.expanded.set(false);\n this.triggerEl()?.nativeElement.focus();\n }\n\n /** Annonce le contenu du filtre ~500 ms après la dernière frappe (évite le spam SR). */\n protected scheduleResultsAnnouncement(): void {\n this.ngZone.runOutsideAngular(() => {\n clearTimeout(this.announceTimer);\n this.announceTimer = setTimeout(() => {\n this.ngZone.run(() => {\n this.announcedCount.set(this.composeFilterAnnouncement());\n });\n }, ANNOUNCE_DELAY_MS);\n });\n }\n\n /** Annonce immédiate dans la live region du panneau (annule une annonce différée en attente). */\n protected announceNow(text: string): void {\n clearTimeout(this.announceTimer);\n this.announcedCount.set(text);\n }\n\n /** Séquelle de la purge interne du Listbox (il vide sa valeur dès qu'un item n'est plus\n rendu) : quand le filtre redécouvre des options sélectionnées, le binding `[value]` ne\n re-pousse rien (`listboxValue` n'a pas changé) — on resynchronise le modèle du Listbox\n avec les clés sélectionnées actuellement visibles. */\n protected resyncListboxSelection(): void {\n const listbox = this.listboxDir();\n if (!listbox) return;\n const visibleKeys = new Set(this.filteredOptions().map((o) => this.keyOf(o)));\n const expected = this.listboxValue().filter((k) => visibleKeys.has(k));\n const actual = listbox.value();\n if (expected.length === actual.length && expected.every((k) => actual.includes(k))) return;\n listbox.value.set(expected);\n }\n\n /** Desktop filtrable : le focus DOM vit dans le popup (champ/options) — on le rend au trigger\n à la fermeture, sinon il tombe sur `<body>`. (Écran compact : déjà géré par l'effect `compact`.) */\n protected refocusTriggerAfterFilterClose(): void {\n if (!this.filterable() || this.compact()) return;\n this.triggerEl()?.nativeElement.focus();\n }\n\n /** Fermeture synchrone du Popover (l'effect, différé, ne re-cachera pas : flag popoverShown). */\n protected closePopupNow(): void {\n this.expanded.set(false);\n if (!this.popoverShown) return;\n const el = this.popupEl()?.nativeElement as (HTMLElement & { hidePopover?(): void }) | undefined;\n el?.classList.remove('kt-select__popup--closing');\n el?.hidePopover?.();\n this.popoverShown = false;\n }\n\n // --- Drag-to-dismiss de la bottom-sheet (téléphone) ---\n // Geste DOUBLÉ par le bouton Fermer + tap-extérieur + Échap (WCAG 2.5.1). Logique FACTORISÉE\n // avec le mode `sheet` du Dialog via createKtSheetDrag (@ktortu/aaa).\n private readonly sheetDrag = createKtSheetDrag({\n pane: () => (this.popupEl()?.nativeElement.querySelector('.kt-select__sheet-card') as HTMLElement) ?? null,\n onDismiss: () => this.expanded.set(false),\n draggingClass: 'kt-select__popup--dragging',\n });\n\n protected onDragStart(event: PointerEvent): void {\n if (!this.compact()) return; // glissement actif sur écran compact uniquement\n this.sheetDrag.start(event);\n }\n\n private animateAndCloseSelect(el: HTMLElement & { hidePopover?(): void }): void {\n if (!this.compact() || !isPlatformBrowser(this.platformId)) {\n el.hidePopover?.();\n this.popoverShown = false;\n return;\n }\n\n el.classList.add('kt-select__popup--closing');\n const card = (el.querySelector('.kt-select__sheet-card') as HTMLElement) || el;\n\n // Récupérer la durée de transition configurée en CSS (ex: \"150ms\" ou \"0.2s\")\n const styles = window.getComputedStyle(card);\n const durationStr = styles.transitionDuration || '0s';\n const durationMs = parseFloat(durationStr) * (durationStr.includes('ms') ? 1 : 1000);\n\n if (durationMs === 0) {\n el.hidePopover?.();\n el.classList.remove('kt-select__popup--closing');\n this.popoverShown = false;\n return;\n }\n\n // Écouter la fin de la transition sur la propriété 'translate'\n const onTransitionEnd = (event: TransitionEvent) => {\n if (event.target === card && event.propertyName === 'translate') {\n card.removeEventListener('transitionend', onTransitionEnd);\n if (this.expanded()) return;\n el.hidePopover?.();\n el.classList.remove('kt-select__popup--closing');\n this.popoverShown = false;\n }\n };\n card.addEventListener('transitionend', onTransitionEnd);\n\n // Sécurité (au cas où la transition n'aboutirait pas)\n setTimeout(() => {\n card.removeEventListener('transitionend', onTransitionEnd);\n if (this.expanded()) return;\n if (this.popoverShown) {\n el.hidePopover?.();\n el.classList.remove('kt-select__popup--closing');\n this.popoverShown = false;\n }\n }, durationMs + 50);\n }\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Contexte typé reçu par le template d'une option (`ktSelectOption`). */\nexport interface KtSelectOptionContext<T> {\n /** L'option en cours de rendu → `let-option`. */\n $implicit: T;\n /** L'option est-elle sélectionnée ? → `let-selected=\"selected\"`. */\n selected: boolean;\n /** L'option est-elle active (survol/clavier) ? → `let-active=\"active\"`. */\n active: boolean;\n}\n\n/** Contexte typé reçu par le template du trigger (`ktSelectTrigger`). */\nexport interface KtSelectTriggerContext<T> {\n /** L'option sélectionnée (ou `null`) → `let-option`. */\n $implicit: T | null;\n}\n\n/** Template de rendu d'une option, posé sur un `<ng-template>` projeté dans `kt-select`.\n L'input sert UNIQUEMENT à inférer `T` (re-bind de la liste d'options) ; `ngTemplateContextGuard`\n type alors les variables `let-` (`option: T`, `selected`/`active: boolean`). Requiert `strictTemplates`.\n\n ```html\n <kt-select [options]=\"users\" optionLabel=\"name\">\n <ng-template [ktSelectOption]=\"users\" let-user let-selected=\"selected\">\n <user-badge [user]=\"user\" /> @if (selected) { ✓ }\n </ng-template>\n </kt-select>\n ``` */\n@Directive({ selector: 'ng-template[ktSelectOption]' })\nexport class KtSelectOptionDef<T> {\n readonly ktSelectOption = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtSelectOptionContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtSelectOptionDef<T>, ctx: unknown): ctx is KtSelectOptionContext<T> {\n return typeof ctx === 'object';\n }\n}\n\n/** Template de rendu du trigger (libellé de la valeur courante). Même mécanisme typé que `ktSelectOption`.\n Contexte : `let-option` = l'option sélectionnée (`T | null`).\n\n ```html\n <kt-select [options]=\"users\" [(value)]=\"selected\">\n <ng-template [ktSelectTrigger]=\"users\" let-user>\n @if (user) { <user-badge [user]=\"user\" /> } @else { Choisir… }\n </ng-template>\n </kt-select>\n ``` */\n@Directive({ selector: 'ng-template[ktSelectTrigger]' })\nexport class KtSelectTriggerDef<T> {\n readonly ktSelectTrigger = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtSelectTriggerContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtSelectTriggerDef<T>, ctx: unknown): ctx is KtSelectTriggerContext<T> {\n return typeof ctx === 'object';\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, contentChild, model, output } from '@angular/core';\nimport { Combobox, ComboboxPopup, ComboboxWidget } from '@angular/aria/combobox';\nimport { Listbox, Option } from '@angular/aria/listbox';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { KtBaseSelect } from '../base-select/base-select';\nimport { KtSelectOptionDef, KtSelectTriggerDef } from './select-option-def';\n\nexport type { KtKeyish } from '../base-select/base-select';\n\n/** Payload de l'évènement `selectionChange` d'un `kt-select`. */\nexport interface KtSelectSelectionChange<T, V = T> {\n /** Valeur émise : clé extraite ou objet entier (`null` si la sélection est effacée). */\n value: V | null;\n /** Option correspondante (`null` si la sélection est effacée). */\n option: T | null;\n}\n\n/** Select single (« select-only combobox » WAI-ARIA) bâti sur `@angular/aria`.\n Choix dans une liste fermée, sans saisie. Présentation responsive (un seul Popover, CSS @media) :\n desktop = dropdown ancré (focus sur le trigger / activedescendant) ; téléphone tactile = bottom-sheet\n en bas d'écran (focusMode 'roving', options réellement focusables, scrim ::backdrop, cibles ≥44px).\n Composé avec `Field` ; s'intègre aux Signal Forms via `[formField]`.\n Tout le commun (popup, filtre, clavier, drag-to-dismiss) vit dans `BaseSelect`.\n\n @template T Type d'une option (élément du tableau `options`).\n @template V Type de la valeur émise (défaut `T` ; clé extraite si `optionValue` est fourni).\n\n @example\n ```html\n <kt-select [options]=\"users\" optionLabel=\"name\" optionValue=\"id\" [(value)]=\"selectedId\" />\n ``` */\n@Component({\n selector: 'kt-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './select.html',\n styleUrl: '../styles/select-panel.css',\n imports: [KtField, KtFieldControl, NgTemplateOutlet, Combobox, ComboboxPopup, ComboboxWidget, Listbox, Option],\n})\nexport class KtSelect<T, V = T> extends KtBaseSelect<T, V> implements FormValueControl<V | null> {\n // --- Modèle / sortie ---\n /** Valeur sélectionnée (clé extraite, ou objet entier si `optionValue` est omis ; `null` si rien). @default null */\n readonly value = model<V | null>(null);\n /** Émis à chaque sélection. Payload : `{ value, option }` — `value` est la valeur émise (clé ou objet),\n `option` l'objet option correspondant (`null` si la sélection est effacée). */\n readonly selectionChange = output<KtSelectSelectionChange<T, V>>();\n\n // --- Templates projetés (typés via ngTemplateContextGuard) ---\n protected readonly optionDef = contentChild(KtSelectOptionDef);\n protected readonly triggerDef = contentChild(KtSelectTriggerDef);\n\n /** Fermer le popup après une sélection (sémantique single ; le multi reste ouvert). */\n private readonly closeOnSelect = computed(() => this.config?.closeOnSelect ?? true);\n\n /** Option correspondant à la valeur courante (clé extraite, ou objet si `optionValue` est omis). */\n protected readonly selectedOption = computed<T | null>(() => {\n const v = this.value();\n if (v === null || v === undefined) return null;\n const opts = this.options();\n if (this.optionValue() !== undefined) {\n return opts.find((o) => this.keyOf(o) === (v as unknown)) ?? null;\n }\n const cmp = this.comparator();\n return opts.find((o) => cmp(o, v as unknown as T)) ?? (v as unknown as T);\n });\n\n /** Valeur du listbox : tableau de clés (0 ou 1 élément en single). */\n protected override readonly listboxValue = computed<unknown[]>(() => {\n const opt = this.selectedOption();\n return opt === null ? [] : [this.keyOf(opt)];\n });\n\n protected override onListboxValueChange(keys: readonly unknown[]): void {\n // Purge interne du Listbox quand le filtre masque l'option sélectionnée (la lib vide sa\n // valeur dès que l'item n'est plus rendu) : pas un geste utilisateur, on l'ignore.\n if (keys.length === 0 && this.isSelectionFilteredOut()) return;\n const key = keys.length > 0 ? keys[0] : null;\n if (key === null || key === undefined) {\n this.commitSelection(null);\n return;\n }\n const option = this.options().find((o) => this.keyOf(o) === key) ?? null;\n this.commitSelection(option);\n }\n\n /** La sélection courante est-elle masquée par le filtre ou la troncation ? (≠ retirée des données). */\n private isSelectionFilteredOut(): boolean {\n if (!this.filterable()) return false;\n const selected = this.selectedOption();\n if (selected === null) return false;\n const key = this.keyOf(selected);\n return !this.displayedOptions().some((option) => this.keyOf(option) === key);\n }\n\n private commitSelection(option: T | null): void {\n const out =\n option === null ? null : this.optionValue() !== undefined ? (this.keyOf(option) as V) : (option as unknown as V);\n this.value.set(out);\n this.touched.set(true);\n this.selectionChange.emit({ value: out, option });\n if (this.closeOnSelect()) {\n this.expanded.set(false);\n this.refocusTriggerAfterFilterClose();\n }\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"fieldErrors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div class=\"kt-select\" [class.kt-select--open]=\"expanded()\">\n <button\n #combobox=\"ngCombobox\"\n #trigger\n ngCombobox\n ktFieldControl\n type=\"button\"\n class=\"kt-field-box kt-select__trigger\"\n [(expanded)]=\"expanded\"\n [disabled]=\"disabled()\"\n [softDisabled]=\"false\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n <span class=\"kt-select__value\">\n @if (triggerDef(); as def) {\n <ng-container [ngTemplateOutlet]=\"def.template\" [ngTemplateOutletContext]=\"{ $implicit: selectedOption() }\" />\n } @else if (selectedOption(); as option) {\n {{ labelOf(option) }}\n } @else {\n <span class=\"kt-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n </span>\n <span class=\"kt-select__arrow\" aria-hidden=\"true\">arrow_drop_down</span>\n </button>\n\n <!-- Un seul Popover (top-layer). CSS @media : dropdown ancré (desktop) ↔ bottom-sheet (téléphone).\n Pas de <dialog>.showModal() : ce combobox se ferme au blur, et showModal volerait le focus. -->\n <ng-template ngComboboxPopup [combobox]=\"combobox\" [popupType]=\"filterable() ? 'dialog' : 'listbox'\">\n <div #popup popover=\"manual\" class=\"kt-select__popup\" [class.kt-select__popup--sheet]=\"compact()\">\n @if (compact()) {\n <div class=\"kt-select__sheet-scrim\" aria-hidden=\"true\" (click)=\"expanded.set(false)\"></div>\n }\n <div class=\"kt-select__sheet-card\">\n @if (compact()) {\n <div\n class=\"kt-select__sheet-grab\"\n aria-hidden=\"true\"\n (pointerdown)=\"onDragStart($event)\"\n (mousedown)=\"$event.preventDefault()\"\n ></div>\n <header class=\"kt-select__sheet-header\">\n <span class=\"kt-select__sheet-title\">{{ label() }}</span>\n <button\n type=\"button\"\n class=\"kt-select__sheet-close\"\n [attr.aria-label]=\"resolvedCloseLabel()\"\n (click)=\"expanded.set(false)\"\n >\n <span class=\"kt-select__sheet-close-icon\" aria-hidden=\"true\">close</span>\n </button>\n </header>\n }\n @if (filterable()) {\n <!-- Mode filtrable : le widget combobox est le panneau ENTIER (champ + annonce + liste).\n Indispensable : un focus posé hors de l'élément ngComboboxWidget ferme le popup\n (closePopupOnBlur de @angular/aria) — le champ doit donc vivre dans ce sous-arbre. -->\n <div\n ngComboboxWidget\n role=\"dialog\"\n class=\"kt-select__panel\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label()\"\n [activeDescendant]=\"lb.activeDescendant()\"\n >\n <div class=\"kt-select__filter\">\n <input\n #filterInput\n type=\"search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n class=\"kt-select__filter-input\"\n autocomplete=\"off\"\n [placeholder]=\"resolvedFilterPlaceholder()\"\n [attr.aria-label]=\"resolvedFilterLabel()\"\n [attr.aria-controls]=\"lb.id()\"\n [attr.aria-activedescendant]=\"lb.activeDescendant()\"\n [value]=\"filterText()\"\n (input)=\"onFilterInput($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n />\n </div>\n <!-- Nombre de résultats annoncé (différé) aux lecteurs d'écran : une liste qui\n rétrécit en silence est perçue comme un bug (tests utilisateurs S. Higley). -->\n <div class=\"kt-select__sr-only\" role=\"status\" aria-live=\"polite\">{{ announcedCount() }}</div>\n <ul\n #lb=\"ngListbox\"\n #listboxEl\n ngListbox\n [focusMode]=\"compact() && !filterable() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n >\n @for (item of displayedOptions(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n selected: !!opt.selected(),\n active: opt.active(),\n }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n @if (filterable() && filteredOptions().length > maxVisibleOptions()) {\n <li class=\"kt-select__truncated-info\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedTruncatedResultsText()(maxVisibleOptions(), filteredOptions().length) }}\n </li>\n }\n </ul>\n </div>\n } @else {\n <ul\n #listbox=\"ngListbox\"\n #listboxEl\n ngComboboxWidget\n ngListbox\n [focusMode]=\"compact() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [activeDescendant]=\"listbox.activeDescendant()\"\n >\n @for (item of options(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item, selected: !!opt.selected(), active: opt.active() }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </ng-template>\n </div>\n</kt-field>\n","import { Directive, inject, input } from '@angular/core';\nimport { KT_SELECT_CONFIG, KtSelectConfigOptions } from './select-config';\n\n/** Configure les `kt-select` d'un sous-arbre via DI (équivalent du Context provider de react-select).\n Alternative à un provider global de `KT_SELECT_CONFIG` : on pose la directive sur un conteneur et\n tous les `kt-select` descendants en héritent.\n\n ```html\n <div [ktSelectConfig]=\"{ placeholder: 'Choisir…', emptyText: 'Aucun résultat' }\">\n <kt-select … />\n </div>\n ```\n\n La directive EST fournie comme `KT_SELECT_CONFIG` (`useExisting`) : les getters exposent l'objet\n bindé sous la forme `Partial<KtSelectConfigOptions>` attendue par le composant. */\n@Directive({\n selector: '[ktSelectConfig]',\n providers: [{ provide: KT_SELECT_CONFIG, useExisting: KtSelectConfig }],\n})\nexport class KtSelectConfig implements Partial<KtSelectConfigOptions> {\n readonly ktSelectConfig = input<Partial<KtSelectConfigOptions>>({});\n\n /** Config héritée du contexte parent (provider global ou directive englobante) : la\n directive ne masque que les clés qu'elle définit, le reste continue d'en hériter. */\n private readonly parent = inject(KT_SELECT_CONFIG, { optional: true, skipSelf: true });\n\n private resolve<K extends keyof KtSelectConfigOptions>(key: K): Partial<KtSelectConfigOptions>[K] {\n return this.ktSelectConfig()[key] ?? this.parent?.[key];\n }\n\n get placeholder(): string | undefined {\n return this.resolve('placeholder');\n }\n get emptyText(): string | undefined {\n return this.resolve('emptyText');\n }\n get closeLabel(): string | undefined {\n return this.resolve('closeLabel');\n }\n get closeOnSelect(): boolean | undefined {\n return this.resolve('closeOnSelect');\n }\n get filterPlaceholder(): string | undefined {\n return this.resolve('filterPlaceholder');\n }\n get filterLabel(): string | undefined {\n return this.resolve('filterLabel');\n }\n get filterResultsText(): ((count: number) => string) | undefined {\n return this.resolve('filterResultsText');\n }\n get removeItemLabel(): ((itemLabel: string) => string) | undefined {\n return this.resolve('removeItemLabel');\n }\n get selectedItemsLabel(): ((fieldLabel: string | undefined) => string) | undefined {\n return this.resolve('selectedItemsLabel');\n }\n get selectionSummaryText(): ((count: number) => string) | undefined {\n return this.resolve('selectionSummaryText');\n }\n get itemRemovedText(): ((itemLabel: string) => string) | undefined {\n return this.resolve('itemRemovedText');\n }\n get selectionCountText(): ((count: number) => string) | undefined {\n return this.resolve('selectionCountText');\n }\n get selectAllLabel(): string | undefined {\n return this.resolve('selectAllLabel');\n }\n get clearAllLabel(): string | undefined {\n return this.resolve('clearAllLabel');\n }\n get moreChipsLabel(): ((hiddenCount: number) => string) | undefined {\n return this.resolve('moreChipsLabel');\n }\n get lessChipsLabel(): string | undefined {\n return this.resolve('lessChipsLabel');\n }\n get truncatedResultsText(): ((max: number, total: number) => string) | undefined {\n return this.resolve('truncatedResultsText');\n }\n get truncatedResultsAnnouncement(): ((max: number, total: number) => string) | undefined {\n return this.resolve('truncatedResultsAnnouncement');\n }\n}\n","import { Signal } from '@angular/core';\n\n/** Portée de transition des chips. Fourni par `ChipList` (via `useExisting`) ; injecté en\n optionnel par `Chip` pour ne porter un `view-transition-name` QUE pendant la transition\n de SA liste — sinon tous les chips de la page deviendraient des groupes indépendants et\n « glisseraient » individuellement à chaque reflow déclenché par une autre liste.\n Fichier séparé : évite l'import circulaire Chip ↔ ChipList. */\nexport abstract class ChipTransitionScope {\n abstract readonly transitioning: Signal<boolean>;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n booleanAttribute,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { ChipTransitionScope } from './chip-transition-scope';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Pilule individuelle (tag). Utilisable seule (tag statique) ou dans `kt-chip-list`.\n * Le label vient de la projection de contenu ; `removable` ajoute un bouton « retirer »\n * (24px visibles, cible 44px via ::after — technique des boutons icon-only).\n *\n * @example\n * ```html\n * <kt-chip>Angular</kt-chip>\n * <kt-chip removable removeLabel=\"Retirer Angular\" (remove)=\"onRemove()\">Angular</kt-chip>\n * ```\n */\n@Component({\n selector: 'kt-chip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './chip.html',\n styleUrl: './chip.css',\n host: {\n class: 'kt-chip',\n // Nommé UNIQUEMENT pendant la transition de SA liste (cf. ChipTransitionScope) : un nom\n // permanent ferait participer tous les chips de la page à chaque View Transition (glissement\n // individuel au moindre reflow). Chip seul (hors liste) : jamais nommé.\n '[style.view-transition-name]': 'scope?.transitioning() ? viewTransitionName : null',\n '[style.view-transition-class]': '\"chip-transition\"',\n },\n})\nexport class KtChip {\n protected readonly scope = inject(ChipTransitionScope, { optional: true });\n private readonly idGen = inject(KtIdGenerator);\n /** Nom de View Transition propre au chip (détail interne, posé en host binding). */\n protected readonly viewTransitionName = `chip-${this.idGen.generateId('chip')}`;\n\n /** Affiche le bouton « retirer » (sinon tag statique sans bouton). @default false */\n readonly removable = input(false, { transform: booleanAttribute });\n /** Chip désactivé (bouton « retirer » inactif). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Libellé accessible du bouton « retirer » (inclure le nom de l'item : « Remove X »). @default 'Remove' */\n readonly removeLabel = input<string>('Remove');\n /** Émis au clic sur le bouton « retirer » (le parent décide de retirer le chip). */\n readonly remove = output<void>();\n\n private readonly removeBtn = viewChild<ElementRef<HTMLButtonElement>>('removeBtn');\n\n /** Focus programmatique du bouton « retirer » (focus management d'`kt-chip-list`). */\n focusRemove(): void {\n this.removeBtn()?.nativeElement.focus();\n }\n}\n","<span class=\"kt-chip__label\"><ng-content /></span>\n@if (removable()) {\n <button\n #removeBtn\n type=\"button\"\n class=\"kt-chip__remove\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"removeLabel()\"\n (click)=\"remove.emit()\"\n >\n <span class=\"kt-chip__close-icon\" aria-hidden=\"true\">close</span>\n </button>\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Contexte typé reçu par le template d'un chip custom (`ktChipItem`). */\nexport interface KtChipItemContext<T> {\n /** L'item en cours de rendu → `let-item`. */\n $implicit: T;\n /** Fonction pour retirer cet item de la liste → `let-remove=\"remove\"`. */\n remove: () => void;\n}\n\n/** Template de rendu custom d'un chip dans `kt-chip-list`.\n Structurellement compatible avec `MultiSelectChipContext` (forwardable).\n Contexte : `let-item` = l'item rendu (`T`), `let-remove` = fonction qui le retire.\n\n ```html\n <kt-chip-list [items]=\"tags\">\n <ng-template [ktChipItem]=\"tags\" let-tag let-remove=\"remove\">\n <kt-chip [removable]=\"true\" (remove)=\"remove()\">{{ tag.name }}</kt-chip>\n </ng-template>\n </kt-chip-list>\n ``` */\n@Directive({ selector: 'ng-template[ktChipItem]' })\nexport class KtChipItemDef<T> {\n readonly ktChipItem = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtChipItemContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtChipItemDef<T>, ctx: unknown): ctx is KtChipItemContext<T> {\n return typeof ctx === 'object';\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/** Défauts applicables à tous les `kt-chip-list` (surchargeables par liste via les inputs).\n Lib neutre i18n : les textes sont fournis par le consommateur (ici en une fois).\n Fourni en `Partial` : un consommateur n'override que ce qu'il veut.\n Calqué sur `KT_FIELD_CONFIG`/`KT_SELECT_CONFIG`.\n NB : le MultiSelect passe ses propres textes (résolus depuis KT_SELECT_CONFIG) en inputs —\n ils priment donc sur ce token pour les chips rendus sous un multi-select. */\nexport interface KtChipsConfig {\n /** Libellé accessible du bouton de retrait d'un chip. Défaut : `'Remove X'`. */\n removeItemLabel: (itemLabel: string) => string;\n /** Annonce live après le retrait d'un chip. Défaut : `'X removed'`. */\n itemRemovedText: (itemLabel: string) => string;\n /** Libellé du bouton dépliant les chips repliés (`[maxVisible]`). Défaut : `'+N more'`. */\n moreLabel: (hiddenCount: number) => string;\n /** Libellé du même bouton une fois déplié. Défaut : `'Show less'`. */\n lessLabel: string;\n /** Libellé accessible du conteneur (`role=\"list\"`). Défaut : `'Selected items'`. */\n listLabel: string;\n}\n\nexport const KT_CHIPS_CONFIG = new InjectionToken<Partial<KtChipsConfig>>('KT_CHIPS_CONFIG');\n","import { NgTemplateOutlet, DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n TemplateRef,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n signal,\n viewChildren,\n untracked,\n ChangeDetectorRef,\n PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { type KtKeyish, accessor, defaultIdentity, defaultLabel } from '../keyish';\nimport { KtChip } from './chip';\nimport { KtChipItemDef, type KtChipItemContext } from './chip-item-def';\nimport { ChipTransitionScope } from './chip-transition-scope';\nimport { KT_CHIPS_CONFIG } from './chips-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Délai avant effacement de l'annonce de retrait (live region). */\nconst STATUS_CLEAR_MS = 2000;\n\n/**\n * Liste de chips révocables (`role=\"list\"`) : repli au-delà de `maxVisible` (« +N more »),\n * annonces lecteur d'écran (live region TOUJOURS rendue, y compris liste vide) et gestion\n * du focus au retrait (chip suivant, sinon `emptyFocusTarget`).\n * La liste ne possède PAS la donnée : le retrait émet `removed` et le parent met à jour\n * `items` (pattern contrôlé). Rendu custom par chip via `ng-template[ktChipItem]` (projeté)\n * ou `[chipTemplate]` (TemplateRef forwardé, ex. depuis MultiSelect) — le focus management\n * ne voit pas les boutons des templates custom (view queries non traversantes) : le repli\n * `emptyFocusTarget` couvre ce cas.\n *\n * @example\n * ```html\n * <kt-chip-list [items]=\"tags()\" [maxVisible]=\"3\" (removed)=\"onRemoved($event)\" />\n * ```\n */\n@Component({\n selector: 'kt-chip-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './chip-list.html',\n styleUrl: './chip-list.css',\n imports: [KtChip, NgTemplateOutlet],\n providers: [{ provide: ChipTransitionScope, useExisting: KtChipList }],\n host: {\n '[attr.data-empty]': \"items().length === 0 ? '' : null\",\n // Marqueur de portée pendant la View Transition : les règles globales (tokens.css) ne\n // nomment les chips à template custom QUE sous ce marqueur (cf. ChipTransitionScope).\n '[attr.data-vt-active]': \"transitioning() ? '' : null\",\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class KtChipList<T> implements ChipTransitionScope {\n private readonly config = inject(KT_CHIPS_CONFIG, { optional: true });\n private readonly injector = inject(Injector);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly doc = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Vrai pendant la View Transition de CETTE liste : les chips (standards via Chip,\n custom via tokens.css) ne portent leur `view-transition-name` que dans cette fenêtre. */\n readonly transitioning = signal(false);\n\n /** Items affichés sous forme de chips (la liste ne possède pas la donnée : pattern contrôlé). */\n readonly items = input.required<readonly T[]>();\n /** Libellé d'un item : clé OU fonction. @default `label`/`name`, sinon `String(item)` */\n readonly itemLabel = input<KtKeyish<T, string>>();\n /** Identité d'un item (track du @for) : clé OU fonction. @default `id`/`value`, sinon l'item */\n readonly itemKey = input<KtKeyish<T, unknown>>();\n /** Chips révocables (bouton « retirer » par chip). @default true */\n readonly removable = input(true, { transform: booleanAttribute });\n /** Liste désactivée (boutons « retirer » présents mais inactifs). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Lecture seule : les boutons « retirer » sont absents (≠ disabled : présents mais inactifs). @default false */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Nombre maximal de chips affichés avant repli derrière « +N more ». @default undefined (illimité) */\n readonly maxVisible = input<number>();\n /** Libellé accessible de la liste (`aria-label`). Défaut : `KT_CHIPS_CONFIG.listLabel` ou « Selected items ». */\n readonly listLabel = input<string>();\n /** Construit le libellé du bouton « retirer » à partir du libellé de l'item. @default `« Remove {label} »` */\n readonly removeItemLabel = input<(itemLabel: string) => string>();\n /** Construit le message d'annonce après retrait (live region). @default `« {label} removed »` */\n readonly itemRemovedText = input<(itemLabel: string) => string>();\n /** Construit le libellé du bouton de repli à partir du nombre masqué. @default `« +{n} more »` */\n readonly moreLabel = input<(hiddenCount: number) => string>();\n /** Libellé du bouton qui replie la liste dépliée. Défaut : `KT_CHIPS_CONFIG.lessLabel` ou « Show less ». */\n readonly lessLabel = input<string>();\n /** Template custom forwardé (alternative au `ng-template[ktChipItem]` projeté). @default null */\n readonly chipTemplate = input<TemplateRef<KtChipItemContext<T>> | null>(null);\n /** Élément à focuser quand le dernier chip est retiré (ex. le trigger du champ parent). @default undefined */\n readonly emptyFocusTarget = input<HTMLElement>();\n\n /** Émis quand un chip est retiré (le parent doit retirer l'item de `items`).\n Payload : `{ item, index }` — l'item retiré et son index dans `items` au moment du retrait. */\n readonly removed = output<{ item: T; index: number }>();\n\n protected readonly itemDef = contentChild(KtChipItemDef);\n private readonly chips = viewChildren(KtChip);\n\n // --- Textes résolus (input > KT_CHIPS_CONFIG > défaut lib neutre EN) ---\n protected readonly resolvedListLabel = computed(() => this.listLabel() ?? this.config?.listLabel ?? 'Selected items');\n private readonly resolvedRemoveItemLabel = computed(\n () => this.removeItemLabel() ?? this.config?.removeItemLabel ?? ((l: string) => `Remove ${l}`),\n );\n private readonly resolvedItemRemovedText = computed(\n () => this.itemRemovedText() ?? this.config?.itemRemovedText ?? ((l: string) => `${l} removed`),\n );\n protected readonly resolvedMoreLabel = computed(\n () => this.moreLabel() ?? this.config?.moreLabel ?? ((n: number) => `+${n} more`),\n );\n protected readonly resolvedLessLabel = computed(() => this.lessLabel() ?? this.config?.lessLabel ?? 'Show less');\n\n // --- Accès aux items ---\n private readonly labelAccessor = computed(() => accessor<T, string>(this.itemLabel(), defaultLabel));\n private readonly keyAccessor = computed(() => accessor<T, unknown>(this.itemKey(), defaultIdentity));\n\n protected labelOf(item: T): string {\n return this.labelAccessor()(item);\n }\n protected keyOf(item: T): unknown {\n return this.keyAccessor()(item);\n }\n protected removeLabelFor(item: T): string {\n return this.resolvedRemoveItemLabel()(this.labelOf(item));\n }\n\n /** Template effectif : contenu projeté (ktChipItem) prioritaire sur l'input forwardé. */\n protected readonly effectiveTemplate = computed(() => this.itemDef()?.template ?? this.chipTemplate());\n\n protected readonly showRemove = computed(() => this.removable() && !this.readonly());\n\n // --- Repli au-delà de maxVisible ---\n protected readonly expanded = signal(false);\n protected readonly overflow = computed(() => {\n const max = this.maxVisible();\n return max !== undefined && this.items().length > max;\n });\n protected readonly hiddenCount = computed(() => {\n const max = this.maxVisible();\n if (max === undefined || this.expanded()) return 0;\n return Math.max(0, this.items().length - max);\n });\n protected readonly visibleItems = computed<readonly T[]>(() => {\n const all = this.items();\n const max = this.maxVisible();\n if (max === undefined || this.expanded() || all.length <= max) return all;\n return all.slice(0, max);\n });\n\n // --- Live region (toujours rendue, y compris liste vide) ---\n protected readonly status = signal('');\n private statusTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n // Repli automatique quand la liste repasse sous le seuil.\n effect(\n () => {\n if (this.overflow()) return;\n untracked(() => {\n this.expanded.set(false);\n });\n },\n { allowSignalWrites: true },\n );\n\n inject(DestroyRef).onDestroy(() => clearTimeout(this.statusTimer));\n }\n\n private readonly idGen = inject(KtIdGenerator);\n protected readonly moreBtnTransitionName = `chip-list-more-${this.idGen.generateId('chip-list')}`;\n\n /** Annonce un message dans la live region de la liste (effacé après ~2 s).\n Public : permet au parent d'annoncer des actions liées (ex. « tout effacer »). */\n announce(text: string): void {\n clearTimeout(this.statusTimer);\n this.status.set(text);\n this.statusTimer = setTimeout(() => this.status.set(''), STATUS_CLEAR_MS);\n }\n\n private activeTransition: ViewTransition | null = null;\n\n /** Exécute `action` dans une View Transition (morph des chips qui se déplacent, entrée/sortie\n stylées via `::view-transition-*(.chip-transition)` — cf. tokens.css). Transition SCOPÉE à\n l'élément quand le navigateur le permet (`element.startViewTransition`, Chrome 147+) ; sinon\n transition document — dans les deux cas, seuls les chips de CETTE liste sont nommés (cf.\n `transitioning`). Fallback : action directe si l'API est absente ou si l'utilisateur\n préfère moins de mouvement. */\n private withViewTransition(action: () => void): void {\n if (!isPlatformBrowser(this.platformId)) {\n action();\n return;\n }\n // Garde matchMedia : absent en SSR/jsdom (même convention que le gating mobile du select).\n const prefersReducedMotion =\n typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n // Enhancement progressif : transition scopée au sous-arbre de la liste si disponible\n // (capture moins chère, le reste de la page n'est pas concerné), sinon document entier.\n const hostEl = this.host.nativeElement as HTMLElement & {\n startViewTransition?: (update: () => void) => ViewTransition;\n };\n const startViewTransition =\n hostEl.startViewTransition?.bind(hostEl) ??\n (this.doc.startViewTransition?.bind(this.doc) as typeof hostEl.startViewTransition);\n if (!startViewTransition || prefersReducedMotion) {\n action();\n return;\n }\n\n // Interactions rapprochées : Chrome DIFFÈRE le callback d'une transition démarrée pendant\n // qu'une autre est active (UI périmée pour le clic suivant, update parfois perdue — vérifié).\n // On n'empile donc jamais : la transition en vol est sautée (son callback en attente est\n // flushé par skipTransition) et l'action s'applique directement, sans animation.\n if (this.activeTransition) {\n this.activeTransition.skipTransition();\n this.activeTransition = null;\n action();\n return;\n }\n\n // Nommer les chips de CETTE liste AVANT la capture de l'état « avant » (rendu synchrone\n // obligatoire : un nom absent du snapshot « avant » ferait passer chaque chip pour un\n // entrant). Les chips des autres listes restent anonymes => ils suivent le fondu racine.\n this.transitioning.set(true);\n this.cdr.detectChanges();\n\n const vt = startViewTransition(() => {\n action();\n // Rendu synchrone : la View Transition capture l'état \"après\" à la fin de ce callback.\n this.cdr.detectChanges();\n });\n this.activeTransition = vt;\n // `ready` rejette (AbortError) si la transition est sautée : attendu, ne pas laisser\n // remonter en unhandled rejection.\n vt.ready.catch(() => undefined);\n vt.finished.finally(() => {\n if (this.activeTransition === vt) this.activeTransition = null;\n this.transitioning.set(false);\n });\n }\n\n /** Retrait demandé : annonce, émet vers le parent (qui met à jour `items`), puis focus\n le chip suivant — sinon `emptyFocusTarget` (le bouton focusé disparaît du DOM). */\n protected removeAt(item: T, index: number): void {\n if (this.disabled() || this.readonly()) return;\n this.announce(this.resolvedItemRemovedText()(this.labelOf(item)));\n\n this.withViewTransition(() => {\n this.removed.emit({ item, index });\n afterNextRender(\n {\n read: () => {\n const hostEl = this.host.nativeElement;\n const focusables = Array.from(\n hostEl.querySelectorAll(\n '.kt-chip__remove, .kt-chip-list__item button, .kt-chip-list__item [tabindex=\"0\"]',\n ),\n ) as HTMLElement[];\n const target = focusables[Math.min(index, focusables.length - 1)];\n if (target) {\n target.focus();\n return;\n }\n this.emptyFocusTarget()?.focus();\n },\n },\n { injector: this.injector },\n );\n });\n }\n\n protected removeCallback(item: T, index: number): () => void {\n return () => this.removeAt(item, index);\n }\n\n /** Déplie/replie ; au dépliage, focus sur le premier chip nouvellement révélé. */\n protected toggleExpanded(): void {\n this.withViewTransition(() => {\n const expand = !this.expanded();\n this.expanded.set(expand);\n if (!expand) return;\n const firstRevealed = this.maxVisible() ?? 0;\n afterNextRender(\n {\n read: () => {\n const hostEl = this.host.nativeElement;\n const focusables = Array.from(\n hostEl.querySelectorAll(\n '.kt-chip__remove, .kt-chip-list__item button, .kt-chip-list__item [tabindex=\"0\"]',\n ),\n ) as HTMLElement[];\n focusables[firstRevealed]?.focus();\n },\n },\n { injector: this.injector },\n );\n });\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const key = event.key;\n if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) {\n return;\n }\n\n const hostEl = this.host.nativeElement;\n const focusables = Array.from(\n hostEl.querySelectorAll(\n '.kt-chip__remove, .kt-chip-list__item button, .kt-chip-list__item [tabindex=\"0\"], .kt-chip-list__more',\n ),\n ) as HTMLElement[];\n\n if (focusables.length === 0) return;\n\n const active = this.doc.activeElement as HTMLElement;\n const currentIndex = focusables.indexOf(active);\n\n let nextIndex = -1;\n if (key === 'ArrowRight' || key === 'ArrowDown') {\n nextIndex = currentIndex + 1;\n } else if (key === 'ArrowLeft' || key === 'ArrowUp') {\n nextIndex = currentIndex - 1;\n } else if (key === 'Home') {\n nextIndex = 0;\n } else if (key === 'End') {\n nextIndex = focusables.length - 1;\n }\n\n if (nextIndex >= 0 && nextIndex < focusables.length) {\n event.preventDefault();\n focusables[nextIndex].focus();\n }\n }\n}\n","@if (items().length > 0) {\n <div class=\"kt-chip-list\">\n <div class=\"kt-chip-list__items\" role=\"list\" [attr.aria-label]=\"resolvedListLabel()\">\n @for (item of visibleItems(); track keyOf(item); let i = $index) {\n @if (effectiveTemplate(); as tpl) {\n <div role=\"listitem\" class=\"kt-chip-list__item\">\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item, remove: removeCallback(item, i) }\"\n />\n </div>\n } @else {\n <kt-chip\n role=\"listitem\"\n [removable]=\"showRemove()\"\n [disabled]=\"disabled()\"\n [removeLabel]=\"removeLabelFor(item)\"\n (remove)=\"removeAt(item, i)\"\n >{{ labelOf(item) }}</kt-chip\n >\n }\n }\n </div>\n <!-- Le bouton de repli/dépli n'est PAS un chip : hors du role=\"list\" pour ne pas être\n annoncé comme un item de la liste (reste dans la même rangée flex). -->\n @if (overflow()) {\n <button\n type=\"button\"\n class=\"kt-chip-list__more\"\n [attr.aria-expanded]=\"expanded()\"\n [style.view-transition-name]=\"transitioning() ? moreBtnTransitionName : null\"\n [style.view-transition-class]=\"'chip-transition'\"\n (click)=\"toggleExpanded()\"\n >\n {{ expanded() ? resolvedLessLabel() : resolvedMoreLabel()(hiddenCount()) }}\n </button>\n }\n </div>\n}\n<!-- Annonce des retraits : TOUJOURS rendue (hors du @if, sinon elle disparaît avec le dernier chip). -->\n<div class=\"kt-chip-list__status\" role=\"status\" aria-live=\"polite\">{{ status() }}</div>\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Contexte typé reçu par le template d'une option (`ktMultiSelectOption`). */\nexport interface KtMultiSelectOptionContext<T> {\n /** L'option en cours de rendu → `let-option`. */\n $implicit: T;\n /** L'option est-elle sélectionnée ? → `let-selected=\"selected\"`. */\n selected: boolean;\n /** L'option est-elle active (survol/clavier) ? → `let-active=\"active\"`. */\n active: boolean;\n}\n\n/** Contexte typé reçu par le template du trigger (`ktMultiSelectTrigger`). */\nexport interface KtMultiSelectTriggerContext<T> {\n /** Les options sélectionnées (tableau d'objets) → `let-options`. */\n $implicit: readonly T[];\n}\n\n/** Contexte typé reçu par le template de chip (`ktMultiSelectChip`). */\nexport interface KtMultiSelectChipContext<T> {\n /** L'option sélectionnée correspondante → `let-option`. */\n $implicit: T;\n /** Fonction pour retirer cet élément de la sélection → `let-remove=\"remove\"`. */\n remove: () => void;\n}\n\n/** Template de rendu d'une option dans la liste du multi-select. L'input sert à inférer `T` ;\n `ngTemplateContextGuard` type les variables `let-`.\n Contexte : `let-option` = l'option (`T`), `let-selected` / `let-active` = booléens.\n\n ```html\n <kt-multi-select [options]=\"tags\">\n <ng-template [ktMultiSelectOption]=\"tags\" let-tag let-selected=\"selected\">\n <tag-badge [tag]=\"tag\" /> @if (selected) { ✓ }\n </ng-template>\n </kt-multi-select>\n ``` */\n@Directive({ selector: 'ng-template[ktMultiSelectOption]' })\nexport class KtMultiSelectOptionDef<T> {\n readonly ktMultiSelectOption = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtMultiSelectOptionContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: KtMultiSelectOptionDef<T>,\n ctx: unknown,\n ): ctx is KtMultiSelectOptionContext<T> {\n return typeof ctx === 'object';\n }\n}\n\n/** Template de rendu du trigger (contenu du bouton déclencheur) pour le multi-select.\n Contexte : `let-options` = le tableau des options sélectionnées (`readonly T[]`).\n\n ```html\n <kt-multi-select [options]=\"tags\">\n <ng-template [ktMultiSelectTrigger]=\"tags\" let-options>\n @if (options.length) { {{ options.length }} sélectionné(s) } @else { Choisir… }\n </ng-template>\n </kt-multi-select>\n ``` */\n@Directive({ selector: 'ng-template[ktMultiSelectTrigger]' })\nexport class KtMultiSelectTriggerDef<T> {\n readonly ktMultiSelectTrigger = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtMultiSelectTriggerContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: KtMultiSelectTriggerDef<T>,\n ctx: unknown,\n ): ctx is KtMultiSelectTriggerContext<T> {\n return typeof ctx === 'object';\n }\n}\n\n/** Template de rendu d'un jeton (chip) affiché sous le multi-select.\n Contexte : `let-option` = l'option sélectionnée (`T`), `let-remove` = fonction qui la retire.\n\n ```html\n <kt-multi-select [options]=\"tags\">\n <ng-template [ktMultiSelectChip]=\"tags\" let-tag let-remove=\"remove\">\n <kt-chip [removable]=\"true\" (remove)=\"remove()\">{{ tag.name }}</kt-chip>\n </ng-template>\n </kt-multi-select>\n ``` */\n@Directive({ selector: 'ng-template[ktMultiSelectChip]' })\nexport class KtMultiSelectChipDef<T> {\n readonly ktMultiSelectChip = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtMultiSelectChipContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtMultiSelectChipDef<T>, ctx: unknown): ctx is KtMultiSelectChipContext<T> {\n return typeof ctx === 'object';\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n contentChild,\n input,\n model,\n output,\n viewChild,\n} from '@angular/core';\nimport { Combobox, ComboboxPopup, ComboboxWidget } from '@angular/aria/combobox';\nimport { Listbox, Option } from '@angular/aria/listbox';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { KtBaseSelect } from '../base-select/base-select';\nimport { KtChipList } from '../chips/chip-list';\nimport { KtMultiSelectOptionDef, KtMultiSelectTriggerDef, KtMultiSelectChipDef } from './multi-select-option-def';\n\nexport type { KtKeyish } from '../base-select/base-select';\n\n/** Payload de l'évènement `selectionChange` d'un `kt-multi-select`. */\nexport interface KtMultiSelectSelectionChange<T, V = T> {\n /** Valeurs émises : clés extraites ou objets entiers, dans l'ordre de sélection. */\n value: V[];\n /** Options correspondantes, dans l'ordre de sélection. */\n options: T[];\n}\n\n// Défauts lib neutre (anglais, comme le Select single) : le consommateur fournit\n// ses textes via KT_SELECT_CONFIG / les inputs (pas de $localize — cf. select-config.ts).\nfunction defaultSelectionSummaryText(count: number): string {\n return `${count} items selected`;\n}\n\nfunction defaultSelectionCountText(count: number): string {\n return count === 1 ? '1 selected' : `${count} selected`;\n}\n\nfunction defaultSelectedItemsLabel(fieldLabel: string | undefined): string {\n return fieldLabel ? `Selected items for ${fieldLabel}` : 'Selected items';\n}\n\n/**\n * Composant de sélection multiple (Multi-Select) conforme aux exigences d'accessibilité (WCAG 2.2 AAA / RGAA).\n * Repose sur `@angular/aria/combobox` et `@angular/aria/listbox` avec [multi]=\"true\".\n * Présentation adaptative : dropdown (desktop) ou bottom-sheet modale (téléphone tactile).\n * Option 1 : Résumé textuel sur le trigger et chips révocables affichés en dessous.\n *\n * Clavier multi-sélection (APG) : Espace/Entrée toggle, Shift+flèches étend la sélection,\n * Ctrl+A tout (dé)sélectionne, Shift+Espace sélectionne la plage, typeahead — majoritairement\n * natifs via `@angular/aria` ; les combos non relayés par la lib le sont via `onTriggerKeydown`.\n * Tout le commun (popup, filtre, clavier, drag-to-dismiss) vit dans `BaseSelect`.\n *\n * @template T Type d'une option (élément du tableau `options`).\n * @template V Type des valeurs émises (défaut `T` ; clés extraites si `optionValue` est fourni).\n *\n * @example\n * ```html\n * <kt-multi-select [options]=\"tags\" optionLabel=\"name\" optionValue=\"id\" [(value)]=\"selectedIds\" />\n * ```\n */\n@Component({\n selector: 'kt-multi-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './multi-select.html',\n styleUrls: ['../styles/select-panel.css', './multi-select.css'],\n imports: [\n KtField,\n KtFieldControl,\n NgTemplateOutlet,\n Combobox,\n ComboboxPopup,\n ComboboxWidget,\n Listbox,\n Option,\n KtChipList,\n ],\n})\nexport class KtMultiSelect<T, V = T> extends KtBaseSelect<T, V> implements FormValueControl<V[]> {\n // --- Modèle réactif ---\n /** Valeurs sélectionnées (clés extraites, ou objets entiers si `optionValue` est omis). @default [] */\n readonly value = model<V[]>([]);\n /** Émis à chaque (dé)sélection. Payload : `{ value, options }` — `value` le tableau des valeurs émises\n (clés ou objets), `options` les objets options correspondants, dans l'ordre de sélection. */\n readonly selectionChange = output<KtMultiSelectSelectionChange<T, V>>();\n\n // --- Présentation / Configuration (spécifique multi) ---\n /** Bouton « tout effacer » sur le champ (même contrat que `clearable` de BaseInputField). @default false */\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Libellé i18n du bouton « tout effacer ». @default 'Clear' (ou KT_FIELD_CONFIG.clearLabel) */\n readonly clearLabel = input<string>(this.fieldConfig?.clearLabel ?? 'Clear');\n /** Barre « Tout sélectionner / Tout effacer » en tête du popup (bascule le popup en panneau dialog). */\n readonly selectionActions = input(false, { transform: booleanAttribute });\n /** Nombre maximal de chips affichés avant repli derrière un bouton « +N more ». Défaut : illimité. */\n readonly maxVisibleChips = input<number>();\n\n // --- Templates projetés ---\n protected readonly optionDef = contentChild(KtMultiSelectOptionDef);\n protected readonly triggerDef = contentChild(KtMultiSelectTriggerDef);\n protected readonly chipDef = contentChild(KtMultiSelectChipDef);\n\n private readonly chipList = viewChild(KtChipList);\n\n // --- Textes résolus spécifiques multi (input > KT_SELECT_CONFIG > défaut lib neutre EN) ---\n protected readonly resolvedRemoveItemLabel = computed(\n () => this.config?.removeItemLabel ?? ((itemLabel: string) => `Remove ${itemLabel}`),\n );\n protected readonly resolvedSelectedItemsLabel = computed(() =>\n (this.config?.selectedItemsLabel ?? defaultSelectedItemsLabel)(this.label()),\n );\n private readonly resolvedSelectionSummaryText = computed(\n () => this.config?.selectionSummaryText ?? defaultSelectionSummaryText,\n );\n protected readonly resolvedItemRemovedText = computed(\n () => this.config?.itemRemovedText ?? ((itemLabel: string) => `${itemLabel} removed`),\n );\n private readonly resolvedSelectionCountText = computed(\n () => this.config?.selectionCountText ?? defaultSelectionCountText,\n );\n protected readonly resolvedSelectAllLabel = computed(() => this.config?.selectAllLabel ?? 'Select all');\n protected readonly resolvedClearAllLabel = computed(() => this.config?.clearAllLabel ?? 'Clear all');\n protected readonly resolvedMoreChipsLabel = computed(\n () => this.config?.moreChipsLabel ?? ((hiddenCount: number) => `+${hiddenCount} more`),\n );\n protected readonly resolvedLessChipsLabel = computed(() => this.config?.lessChipsLabel ?? 'Show less');\n\n /** Accesseurs bridgés vers le ChipList (fonctions fléchées : une référence de méthode\n non liée perdrait `this`). */\n protected readonly chipLabelOf = (item: T): string => this.labelOf(item);\n protected readonly chipKeyOf = (item: T): unknown => this.keyOf(item);\n\n /** Options correspondant aux entrées de `value`, dans l'ordre de sélection.\n Mode objet : chaque entrée est ramenée à l'option canonique équivalente (compareWith). */\n protected readonly selectedOptions = computed<T[]>(() => {\n const vals = this.value() ?? [];\n if (vals.length === 0) return [];\n const opts = this.options();\n if (this.optionValue() !== undefined) {\n return vals.map((v) => opts.find((o) => this.keyOf(o) === (v as unknown))).filter((o): o is T => o !== undefined);\n }\n const cmp = this.comparator();\n return vals.map((v) => opts.find((o) => cmp(o, v as unknown as T)) ?? (v as unknown as T));\n });\n\n // Texte synthétique du trigger (Option 1)\n protected readonly triggerText = computed(() => {\n const selected = this.selectedOptions();\n if (selected.length === 0) return '';\n if (selected.length <= 3) {\n return selected.map((o) => this.labelOf(o)).join(', ');\n }\n return this.resolvedSelectionSummaryText()(selected.length);\n });\n\n /** Valeur brute transmise au ngListbox sous-jacent (tableau de clés). */\n protected override readonly listboxValue = computed<unknown[]>(() =>\n this.selectedOptions().map((o) => this.keyOf(o)),\n );\n\n // --- Tout effacer depuis le champ (clearable) ---\n protected readonly showClear = computed(\n () => this.clearable() && !this.disabled() && !this.readonly() && this.selectedOptions().length > 0,\n );\n\n /** Le popup utilise la structure « panneau dialog » (champ de filtre et/ou barre d'actions). */\n protected readonly dialogMode = computed(() => this.filterable() || this.selectionActions());\n\n /** Compteur de sélection affiché dans le panneau (info déjà portée par la live region → aria-hidden). */\n protected readonly selectionCountLabel = computed(() =>\n this.resolvedSelectionCountText()(this.selectedOptions().length),\n );\n\n /** Clé listbox d'une entrée de `value` (mode objet : clé de l'option canonique équivalente). */\n private entryKey(v: V): unknown {\n if (this.optionValue() !== undefined) return v;\n const cmp = this.comparator();\n const option = this.options().find((o) => cmp(o, v as unknown as T));\n return option !== undefined ? this.keyOf(option) : this.keyOf(v as unknown as T);\n }\n\n /** Entrée de `value` à committer pour une clé listbox (mode objet : l'option entière). */\n private entryForKey(key: unknown): V | undefined {\n const option = this.options().find((o) => this.keyOf(o) === key);\n if (option === undefined) return undefined;\n return this.optionValue() !== undefined ? (key as V) : (option as unknown as V);\n }\n\n protected override onListboxValueChange(keys: readonly unknown[]): void {\n // Le listbox ne connaît que les options RENDUES : quand le filtre en masque, sa purge\n // interne retire leurs clés (pas un geste utilisateur). On conserve donc les entrées\n // hors vue, on applique les (dé)sélections visibles dans l'ordre courant, et on ignore\n // l'événement si rien n'a réellement changé (sinon touched/selectionChange parasites).\n const current = this.value() ?? [];\n const visibleKeys = new Set(this.displayedOptions().map((o) => this.keyOf(o)));\n const keptKeys = new Set(keys);\n const kept = current.filter((v) => {\n const k = this.entryKey(v);\n return !visibleKeys.has(k) || keptKeys.has(k);\n });\n const currentKeys = new Set(current.map((v) => this.entryKey(v)));\n const added = keys\n .filter((k) => !currentKeys.has(k))\n .map((k) => this.entryForKey(k))\n .filter((v): v is V => v !== undefined);\n if (kept.length === current.length && added.length === 0) return;\n this.commitValue([...kept, ...added]);\n }\n\n private commitValue(next: V[]): void {\n this.value.set(next);\n this.touched.set(true);\n this.selectionChange.emit({ value: next, options: this.selectedOptions() });\n }\n\n /** Comble les combos que le relay du combobox ne transmet pas en activedescendant :\n Shift+Espace (sélection de plage) et Ctrl/Cmd+Shift+Home/End (plage jusqu'aux bornes). */\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (!this.expanded() || this.compact()) return;\n const shiftSpace = event.key === ' ' && event.shiftKey && !event.ctrlKey && !event.metaKey;\n const rangeToEdge =\n (event.key === 'Home' || event.key === 'End') && event.shiftKey && (event.ctrlKey || event.metaKey);\n if (!shiftSpace && !rangeToEdge) return;\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n event.preventDefault();\n listbox.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: event.key,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n cancelable: true,\n }),\n );\n }\n\n /** En panneau dialog, le relay du combobox vise le widget (la div), pas le listbox descendant :\n on fait suivre au listbox les événements relayés (target = la div elle-même uniquement —\n les keydown des éléments internes, qui bubblent, ne sont pas re-forwardés). */\n protected onPanelKeydown(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) return;\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n listbox.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: event.key,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n cancelable: true,\n }),\n );\n }\n\n /** « N results » + « , M selected » quand des sélections existent (dont celles hors filtre). */\n protected override composeFilterAnnouncement(): string {\n const base = super.composeFilterAnnouncement();\n if (base === '') return '';\n const selectedCount = this.selectedOptions().length;\n if (selectedCount === 0) return base;\n return `${base}, ${this.resolvedSelectionCountText()(selectedCount)}`;\n }\n\n /** Retire une option de la valeur (annonce et focus : délégués au ChipList). */\n protected removeOption(option: T): void {\n if (this.disabled() || this.readonly()) return;\n const current = this.value() ?? [];\n const next = this.removeFromValue(option);\n if (next.length === current.length) return;\n this.commitValue(next);\n }\n\n private removeFromValue(option: T): V[] {\n const current = this.value() ?? [];\n if (this.optionValue() !== undefined) {\n const key = this.keyOf(option);\n return current.filter((v) => (v as unknown) !== key);\n }\n const cmp = this.comparator();\n return current.filter((v) => !cmp(v as unknown as T, option));\n }\n\n /** Vide toute la sélection depuis le champ (bouton `clearable`). */\n protected clearSelection(): void {\n if (!this.showClear()) return;\n this.commitValue([]);\n this.chipList()?.announce(this.resolvedSelectionCountText()(0));\n this.triggerEl()?.nativeElement.focus();\n }\n\n /** Sélectionne toutes les options visibles non désactivées (sémantique du Ctrl+A natif :\n avec un filtre actif, seules les options filtrées sont concernées). */\n protected selectAllFiltered(): void {\n if (this.disabled() || this.readonly()) return;\n const current = this.value() ?? [];\n const currentKeys = new Set(current.map((v) => this.entryKey(v)));\n const added = this.filteredOptions()\n .filter((o) => !this.disabledOf(o) && !currentKeys.has(this.keyOf(o)))\n .map((o) => (this.optionValue() !== undefined ? (this.keyOf(o) as V) : (o as unknown as V)));\n if (added.length === 0) return;\n this.commitValue([...current, ...added]);\n this.announceSelectionCount();\n }\n\n /** Désélectionne toutes les options visibles (les sélections masquées par le filtre restent). */\n protected clearAllFiltered(): void {\n if (this.disabled() || this.readonly()) return;\n const current = this.value() ?? [];\n const visibleKeys = new Set(this.filteredOptions().map((o) => this.keyOf(o)));\n const next = current.filter((v) => !visibleKeys.has(this.entryKey(v)));\n if (next.length === current.length) return;\n this.commitValue(next);\n this.announceSelectionCount();\n }\n\n /** Annonce immédiate (action ponctuelle, pas de débounce) du total sélectionné. */\n private announceSelectionCount(): void {\n this.announceNow(this.resolvedSelectionCountText()(this.selectedOptions().length));\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"fieldErrors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div class=\"kt-select\" [class.kt-select--open]=\"expanded()\">\n <button\n #combobox=\"ngCombobox\"\n #trigger\n ngCombobox\n ktFieldControl\n type=\"button\"\n class=\"kt-field-box kt-select__trigger\"\n [class.kt-select__trigger--clearable]=\"showClear()\"\n [(expanded)]=\"expanded\"\n [disabled]=\"disabled()\"\n [softDisabled]=\"false\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"kt-select__value\">\n @if (triggerDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedOptions() }\"\n />\n } @else if (selectedOptions().length > 0) {\n {{ triggerText() }}\n } @else {\n <span class=\"kt-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n </span>\n <span class=\"kt-select__arrow\" aria-hidden=\"true\">arrow_drop_down</span>\n </button>\n\n <!-- Tout effacer depuis le champ : sibling du trigger (pas de bouton imbriqué dans un bouton). -->\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"kt-select__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"clearSelection()\"\n >\n <span class=\"kt-select__clear-icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n <!-- Popup Popover (top-layer). Même logique mobile bottom-sheet adaptative que le select classique. -->\n <ng-template ngComboboxPopup [combobox]=\"combobox\" [popupType]=\"dialogMode() ? 'dialog' : 'listbox'\">\n <div #popup popover=\"manual\" class=\"kt-select__popup\" [class.kt-select__popup--sheet]=\"compact()\">\n @if (compact()) {\n <div class=\"kt-select__sheet-scrim\" aria-hidden=\"true\" (click)=\"expanded.set(false)\"></div>\n }\n <div class=\"kt-select__sheet-card\">\n @if (compact()) {\n <div\n class=\"kt-select__sheet-grab\"\n aria-hidden=\"true\"\n (pointerdown)=\"onDragStart($event)\"\n (mousedown)=\"$event.preventDefault()\"\n ></div>\n <header class=\"kt-select__sheet-header\">\n <span class=\"kt-select__sheet-title\">{{ label() }}</span>\n <button\n type=\"button\"\n class=\"kt-select__sheet-close\"\n [attr.aria-label]=\"resolvedCloseLabel()\"\n (click)=\"expanded.set(false)\"\n >\n <span class=\"kt-select__sheet-close-icon\" aria-hidden=\"true\">close</span>\n </button>\n </header>\n }\n @if (dialogMode()) {\n <!-- Mode panneau (filtre et/ou actions de masse) : Widget Dialog -->\n <div\n ngComboboxWidget\n role=\"dialog\"\n class=\"kt-select__panel\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label()\"\n [activeDescendant]=\"lb.activeDescendant()\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @if (selectionActions()) {\n <div class=\"kt-select__actions\">\n <button type=\"button\" class=\"kt-select__action\" (click)=\"selectAllFiltered()\">\n {{ resolvedSelectAllLabel() }}\n </button>\n <button type=\"button\" class=\"kt-select__action\" (click)=\"clearAllFiltered()\">\n {{ resolvedClearAllLabel() }}\n </button>\n </div>\n }\n @if (filterable()) {\n <div class=\"kt-select__filter\">\n <input\n #filterInput\n type=\"search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n class=\"kt-select__filter-input\"\n autocomplete=\"off\"\n [placeholder]=\"resolvedFilterPlaceholder()\"\n [attr.aria-label]=\"resolvedFilterLabel()\"\n [attr.aria-controls]=\"lb.id()\"\n [attr.aria-activedescendant]=\"lb.activeDescendant()\"\n [value]=\"filterText()\"\n (input)=\"onFilterInput($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n />\n </div>\n }\n @if (selectedOptions().length > 0) {\n <!-- Rappel visuel (sélections potentiellement masquées par le filtre) ;\n l'info SR passe par la live region ci-dessous → aria-hidden. -->\n <div class=\"kt-select__count\" aria-hidden=\"true\">{{ selectionCountLabel() }}</div>\n }\n <div class=\"kt-select__sr-only kt-select__filter-status\" role=\"status\" aria-live=\"polite\">\n {{ announcedCount() }}\n </div>\n <ul\n #lb=\"ngListbox\"\n #listboxEl\n ngListbox\n [multi]=\"true\"\n [focusMode]=\"compact() && !filterable() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n >\n @for (item of displayedOptions(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option kt-select__option--multiple\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n <span class=\"kt-select__checkbox\" aria-hidden=\"true\">\n @if (opt.selected()) {\n <span class=\"kt-select__checkbox-icon\">check_box</span>\n } @else {\n <span class=\"kt-select__checkbox-icon\">check_box_outline_blank</span>\n }\n </span>\n <span class=\"kt-select__option-content\">\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n selected: !!opt.selected(),\n active: opt.active(),\n }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </span>\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n @if (filterable() && filteredOptions().length > maxVisibleOptions()) {\n <li class=\"kt-select__truncated-info\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedTruncatedResultsText()(maxVisibleOptions(), filteredOptions().length) }}\n </li>\n }\n </ul>\n </div>\n } @else {\n <!-- Mode simple : Widget Listbox direct -->\n <ul\n #listbox=\"ngListbox\"\n #listboxEl\n ngComboboxWidget\n ngListbox\n [multi]=\"true\"\n [focusMode]=\"compact() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [activeDescendant]=\"listbox.activeDescendant()\"\n >\n @for (item of options(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option kt-select__option--multiple\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n <span class=\"kt-select__checkbox\" aria-hidden=\"true\">\n @if (opt.selected()) {\n <span class=\"kt-select__checkbox-icon\">check_box</span>\n } @else {\n <span class=\"kt-select__checkbox-icon\">check_box_outline_blank</span>\n }\n </span>\n <span class=\"kt-select__option-content\">\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n selected: !!opt.selected(),\n active: opt.active(),\n }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </span>\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </ng-template>\n </div>\n\n <!-- Chips révocables (Option 1) sous le trigger : délégués au composant réutilisable\n kt-chip-list (focus management, repli +N, live region). Les textes résolus depuis\n KT_SELECT_CONFIG sont passés en inputs (ils priment sur un éventuel KT_CHIPS_CONFIG). -->\n <kt-chip-list\n [items]=\"selectedOptions()\"\n [itemLabel]=\"chipLabelOf\"\n [itemKey]=\"chipKeyOf\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [maxVisible]=\"maxVisibleChips()\"\n [listLabel]=\"resolvedSelectedItemsLabel()\"\n [removeItemLabel]=\"resolvedRemoveItemLabel()\"\n [itemRemovedText]=\"resolvedItemRemovedText()\"\n [moreLabel]=\"resolvedMoreChipsLabel()\"\n [lessLabel]=\"resolvedLessChipsLabel()\"\n [chipTemplate]=\"chipDef()?.template ?? null\"\n [emptyFocusTarget]=\"triggerEl()?.nativeElement\"\n (removed)=\"removeOption($event.item)\"\n />\n</kt-field>\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, computed, input, effect, inject } from '@angular/core';\nimport { KtBaseInputField } from './base-input/base-input';\nimport { type KtSuggestion, normalizeKtSuggestions } from './datalist';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Base partagée des champs Temporal (Date/Time/DateTime/YearMonth).\n Toute la logique commune (parsing tolérant, valeur vide `null`, `displayValue` pour l'input\n natif) vit ici ; chaque sous-classe ne fournit que la construction et la sérialisation propres\n à son type Temporal (`fromString` / `serialize`).\n\n Contrat abstrait : une sous-classe implémente uniquement le couple\n `fromString` (chaîne ISO de l'input natif → valeur typée `T`) et `serialize`\n (valeur `T` → chaîne ISO pour l'attribut `[value]` de l'input). La valeur exposée\n reste toujours `T | null`, où `null` représente le champ vide ; le parsing est\n tolérant (saisie partielle/invalide → `null`, jamais d'exception ni de valeur fausse).\n\n @template T Type Temporal porté par le champ (ex. `Temporal.PlainDate`,\n `Temporal.PlainTime`, …). Doit exposer `toString()`. La valeur du champ est `T | null`. */\n@Directive()\nexport abstract class KtBaseTemporalField<T extends { toString(): string }> extends KtBaseInputField<T | null> {\n private readonly doc = inject(DOCUMENT);\n\n constructor() {\n super();\n effect(() => {\n const val = this.value();\n const ref = this.inputRef();\n if (!ref) return;\n const inputEl = ref.nativeElement;\n const serialized = val === null ? '' : this.serialize(val);\n const isFocused = this.doc.activeElement === inputEl;\n if (inputEl.value !== serialized && (!isFocused || val !== null)) {\n inputEl.value = serialized;\n }\n });\n }\n\n /** Construit la valeur typée depuis la chaîne ISO de l'input natif (ex. `Temporal.PlainDate.from`). */\n protected abstract fromString(raw: string): T;\n /** Sérialise la valeur au format attendu par l'input natif (précision adaptée au type). */\n protected abstract serialize(value: T): string;\n\n protected override parse(raw: string): T | null {\n if (raw === '') return null;\n try {\n return this.fromString(raw);\n } catch {\n // Saisie partielle/invalide (RangeError) → vide, jamais une valeur fausse.\n return null;\n }\n }\n\n protected override emptyValue(): T | null {\n return null;\n }\n\n protected override isEmpty(value: T | null): boolean {\n return value === null;\n }\n\n /** Représentation ISO pour l'attribut `[value]` de l'input natif (null → champ vide). */\n protected readonly displayValue = computed(() => {\n const value = this.value();\n return value === null ? '' : this.serialize(value);\n });\n\n /** Suggestions proposées via un `<datalist>` natif (le picker date/heure reste disponible).\n Valeurs Temporal simples ou couples `{ value, label }` ; chaque valeur est sérialisée au\n format de l'input via `serialize`. @default undefined */\n readonly suggestions = input<readonly KtSuggestion<T>[]>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('temporal-field');\n protected readonly datalistId = `kt-temporal-field-list-${this.uid}`;\n protected readonly hasSuggestions = computed(() => (this.suggestions()?.length ?? 0) > 0);\n protected readonly datalistOptions = computed(() =>\n normalizeKtSuggestions(this.suggestions(), (value) => this.serialize(value)),\n );\n}\n","import type { Temporal as TemporalNamespace } from 'temporal-polyfill';\n\n/**\n * Point d'import unique de Temporal pour toute la lib.\n *\n * - La **valeur** runtime `Temporal` vient de `globalThis.Temporal` : native sur Chrome/Edge 144+,\n * Firefox 139+, Node 26+ ; sinon posée par le polyfill chargé dans `main.ts`\n * (`temporal-polyfill/global`) ou `test-setup.ts`.\n * - Les **types** (`TemporalNamespace.PlainDate`, …) viennent d'un `import type` (effacé au build\n * → 0 KB, le polyfill n'est jamais bundlé dans la lib).\n *\n * Convention : importer `{ Temporal, type TemporalNamespace }` — `Temporal` pour les appels\n * (`Temporal.PlainDate.from(...)`), `TemporalNamespace` pour les annotations\n * (`TemporalNamespace.PlainDate`). Le jour où le natif est garanti partout (Safari inclus), il\n * suffira de retirer le polyfill de `main.ts` : ce fichier ne change pas.\n */\n\n// Type de la valeur runtime `Temporal` (l'objet namespace contenant les classes PlainDate…),\n// récupéré via une expression `import type` — entièrement effacée au build.\ntype TemporalImpl = (typeof import('temporal-polyfill'))['Temporal'];\n\n/** Valeur runtime `Temporal` (native ou polyfill). Cast via `unknown` : selon le contexte de\n compilation, `globalThis.Temporal` peut déjà être typé (augmentation `temporal-polyfill/global`)\n ou non — ce cast fonctionne dans les deux cas. */\nconst rawTemporal = (globalThis as unknown as { Temporal: TemporalImpl }).Temporal;\nif (typeof rawTemporal === 'undefined') {\n throw new Error(\n `[ktortu/aaa] L'espace de noms 'Temporal' est introuvable. ` +\n `Veuillez vous assurer que le polyfill 'temporal-polyfill/global' est correctement importé ` +\n `dans le fichier 'main.ts' de votre application.`,\n );\n}\nexport const Temporal: TemporalImpl = rawTemporal;\n\n/** Espace de noms des types Temporal (`TemporalNamespace.PlainDate`, `.PlainTime`, …). */\nexport type { TemporalNamespace };\n\n// Alias domaine : le code applicatif peut manipuler des noms métier plutôt que l'API brute.\n\n/** Date civile (jour/mois/année), sans heure ni fuseau — alias de `Temporal.PlainDate`.\n À utiliser pour une date « pure » : naissance, échéance, jour d'un événement.\n *\n * @example\n * ```ts\n * import { type CalendarDate } from '@ktortu/aaa';\n * ```\n */\nexport type CalendarDate = TemporalNamespace.PlainDate;\n\n/** Heure « au mur » (heure/minute/seconde), sans date ni fuseau — alias de `Temporal.PlainTime`.\n À utiliser pour une heure isolée : heure d'ouverture, créneau de rendez-vous récurrent. */\nexport type WallTime = TemporalNamespace.PlainTime;\n\n/** Date + heure locale, sans fuseau — alias de `Temporal.PlainDateTime`.\n À utiliser quand date et heure comptent mais que le fuseau est implicite/non pertinent\n (heure « au mur » : ne représente pas un instant absolu). */\nexport type LocalDateTime = TemporalNamespace.PlainDateTime;\n\n/** Instant absolu sur la ligne du temps, en UTC — alias de `Temporal.Instant`.\n À utiliser pour horodater un événement réel (création, mesure) indépendamment du fuseau\n d'affichage ; la conversion en heure locale se fait à la présentation (via `KtClock`). */\nexport type Timestamp = TemporalNamespace.Instant; // instant absolu (UTC)\n\n/** Instant + fuseau nommé (IANA) — alias de `Temporal.ZonedDateTime`.\n À utiliser quand le fuseau fait partie de la donnée (ex. « 14h00 à Paris ») et doit être\n conservé, contrairement à `Timestamp` qui ne porte pas de fuseau. */\nexport type ZonedTimestamp = TemporalNamespace.ZonedDateTime; // instant + fuseau nommé\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTemporalField } from '../base-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « date sans heure » : valeur = `Temporal.PlainDate`, input natif `type=\"date\"`.\n *\n * @example\n * ```html\n * <kt-date-field label=\"Date de naissance\" [(value)]=\"birthDate\" />\n * ```\n */\n@Component({\n selector: 'kt-date-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './date-field.html',\n})\nexport class KtDateField\n extends KtBaseTemporalField<TemporalNamespace.PlainDate>\n implements FormValueControl<TemporalNamespace.PlainDate | null>\n{\n /** Valeur du champ : un `Temporal.PlainDate` (date civile sans heure ni fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainDate | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainDate {\n return Temporal.PlainDate.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainDate): string {\n return value.toString();\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"date\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTemporalField } from '../base-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « heure sans date » : valeur = `Temporal.PlainTime`, input natif `type=\"time\"`.\n *\n * @example\n * ```html\n * <kt-time-field label=\"Heure de rendez-vous\" [(value)]=\"appointmentTime\" />\n * ```\n */\n@Component({\n selector: 'kt-time-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './time-field.html',\n})\nexport class KtTimeField\n extends KtBaseTemporalField<TemporalNamespace.PlainTime>\n implements FormValueControl<TemporalNamespace.PlainTime | null>\n{\n /** Valeur du champ : un `Temporal.PlainTime` (heure « au mur », sans date ni fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainTime | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainTime {\n return Temporal.PlainTime.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainTime): string {\n // Précision minute : un input `type=\"time\"` ne saisit pas les secondes par défaut.\n return value.toString({ smallestUnit: 'minute' });\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"time\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTemporalField } from '../base-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « date-heure sans fuseau » : valeur = `Temporal.PlainDateTime`, input\n natif `type=\"datetime-local\"`. Volontairement SANS timezone (heure « au mur »).\n *\n * @example\n * ```html\n * <kt-date-time-field label=\"Début de l'événement\" [(value)]=\"startsAt\" />\n * ```\n */\n@Component({\n selector: 'kt-date-time-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './date-time-field.html',\n})\nexport class KtDateTimeField\n extends KtBaseTemporalField<TemporalNamespace.PlainDateTime>\n implements FormValueControl<TemporalNamespace.PlainDateTime | null>\n{\n /** Valeur du champ : un `Temporal.PlainDateTime` (date + heure « au mur », sans fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainDateTime | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainDateTime {\n return Temporal.PlainDateTime.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainDateTime): string {\n // Précision minute : `type=\"datetime-local\"` ne saisit pas les secondes par défaut.\n return value.toString({ smallestUnit: 'minute' });\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"datetime-local\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTemporalField } from '../base-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « mois/année » (ex. expiration de carte) : valeur = `Temporal.PlainYearMonth`,\n input natif `type=\"month\"`.\n *\n * @example\n * ```html\n * <kt-year-month-field label=\"Expiration\" [(value)]=\"cardExpiry\" />\n * ```\n */\n@Component({\n selector: 'kt-year-month-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './year-month-field.html',\n})\nexport class KtYearMonthField\n extends KtBaseTemporalField<TemporalNamespace.PlainYearMonth>\n implements FormValueControl<TemporalNamespace.PlainYearMonth | null>\n{\n /** Valeur du champ : un `Temporal.PlainYearMonth` (mois + année, sans jour ni fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainYearMonth | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainYearMonth {\n return Temporal.PlainYearMonth.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainYearMonth): string {\n return value.toString();\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"month\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { Injectable } from '@angular/core';\nimport { Temporal, type TemporalNamespace } from './temporal';\n\n/** Source unique de l'heure courante et du **fuseau local** de l'utilisateur.\n Injectable (et donc figeable en test) : `vi.useFakeTimers()` ne fige PAS `Temporal.Now`.\n Règle d'équipe : ne jamais appeler `Temporal.Now.*` en direct ailleurs — passer par `KtClock`. */\n@Injectable({ providedIn: 'root' })\nexport class KtClock {\n /** Fuseau IANA local de l'utilisateur (auto-détecté), ex. `\"Europe/Paris\"`.\n Sert de zone de référence pour `today()` et pour les conversions UTC↔local.\n @returns L'identifiant de fuseau IANA. */\n timeZoneId(): string {\n return Temporal.Now.timeZoneId();\n }\n\n /** Instant absolu courant, sur la ligne du temps (UTC), indépendant du fuseau.\n @returns L'instant présent en `Temporal.Instant`. */\n now(): TemporalNamespace.Instant {\n return Temporal.Now.instant();\n }\n\n /** Date civile du jour telle qu'observée dans le fuseau local (`timeZoneId()`).\n @returns Le jour courant en `Temporal.PlainDate`. */\n today(): TemporalNamespace.PlainDate {\n return Temporal.Now.plainDateISO(this.timeZoneId());\n }\n}\n\n/** Horloge figée pour les tests : fige l'instant ET le fuseau (sinon un test passe en France mais\n échoue sur un runner CI en UTC). À fournir via `{ provide: KtClock, useValue: new KtFixedClock(...) }`. */\nexport class KtFixedClock extends KtClock {\n /** Construit une horloge figée déterministe pour les tests.\n @param fixedInstant Instant absolu (UTC) renvoyé tel quel par `now()` et utilisé comme base de `today()`.\n @param zone Fuseau IANA fixe (ex. `\"Europe/Paris\"`) renvoyé par `timeZoneId()`.\n *\n * @example\n * ```ts\n * TestBed.configureTestingModule({\n * providers: [\n * { provide: KtClock, useValue: new KtFixedClock(Temporal.Instant.from('2026-06-18T10:00:00Z'), 'Europe/Paris') },\n * ],\n * });\n * ```\n */\n constructor(\n private readonly fixedInstant: TemporalNamespace.Instant,\n private readonly zone: string,\n ) {\n super();\n }\n\n override timeZoneId(): string {\n return this.zone;\n }\n\n override now(): TemporalNamespace.Instant {\n return this.fixedInstant;\n }\n\n override today(): TemporalNamespace.PlainDate {\n return this.fixedInstant.toZonedDateTimeISO(this.zone).toPlainDate();\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTemporalField } from '../base-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { KtClock } from '../temporal/clock';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « instant absolu » : valeur = `Temporal.Instant` (UTC), saisi et affiché en **heure\n locale** via un input `type=\"datetime-local\"`. Conçu pour le flux serveur-UTC → affichage/édition\n locale → renvoi UTC. Le fuseau local vient du service `KtClock` (injecté → testable).\n\n Conversion UTC↔heure locale : à l'affichage, l'`Instant` UTC est projeté dans le fuseau\n local (`KtClock.timeZoneId()`) pour produire l'heure « au mur » montrée à l'utilisateur ; à la\n saisie, cette heure locale est réinterprétée dans le même fuseau puis reconvertie en `Instant`\n UTC. Fournir un `KtClock` figé en test garantit une conversion déterministe.\n *\n * @example\n * ```html\n * <kt-instant-field label=\"Horodatage\" [(value)]=\"recordedAt\" />\n * ```\n */\n@Component({\n selector: 'kt-instant-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './instant-field.html',\n})\nexport class KtInstantField\n extends KtBaseTemporalField<TemporalNamespace.Instant>\n implements FormValueControl<TemporalNamespace.Instant | null>\n{\n private readonly clock = inject(KtClock);\n\n /** Valeur du champ : un `Temporal.Instant` (instant absolu en UTC), saisi/affiché en heure\n locale via `KtClock`. `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.Instant | null>(null);\n\n // Heure locale saisie (wall-clock) → instant absolu. Disambiguation 'compatible' par défaut\n // (ne lève pas sur un créneau DST ambigu).\n protected override fromString(raw: string): TemporalNamespace.Instant {\n return Temporal.PlainDateTime.from(raw).toZonedDateTime(this.clock.timeZoneId()).toInstant();\n }\n\n // Instant absolu → heure locale (précision minute, comme un input datetime-local).\n protected override serialize(value: TemporalNamespace.Instant): string {\n return value.toZonedDateTimeISO(this.clock.timeZoneId()).toPlainDateTime().toString({ smallestUnit: 'minute' });\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"datetime-local\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { LOCALE_ID, Pipe, PipeTransform, inject } from '@angular/core';\nimport { KtClock } from './clock';\nimport { Temporal, type TemporalNamespace } from './temporal';\n\n/** Valeurs Temporal formatables pour l'affichage (toutes exposent `toLocaleString`). */\ntype FormattableTemporal =\n | TemporalNamespace.PlainDate\n | TemporalNamespace.PlainTime\n | TemporalNamespace.PlainDateTime\n | TemporalNamespace.PlainYearMonth\n | TemporalNamespace.Instant\n | TemporalNamespace.ZonedDateTime;\n\n/** Formate une valeur Temporal pour l'affichage selon la locale active.\n `DatePipe` n'accepte pas Temporal (seulement `Date|string|number`) → pipe dédié, basé sur\n `toLocaleString` (interface `Intl.DateTimeFormat`). Cohérent avec la neutralité i18n de la lib\n (format au runtime via `LOCALE_ID`, pas `$localize`).\n\n Un `Instant` n'a pas de fuseau propre → il est affiché dans la **zone locale** (via `KtClock`).\n Un `ZonedDateTime` est affiché dans **sa propre** zone. Les `Plain*` n'ont pas de fuseau.\n *\n * @example\n * ```html\n * <!-- format par défaut de la locale active -->\n * {{ d | temporalDate }}\n * <!-- options Intl.DateTimeFormat -->\n * {{ d | temporalDate:{ month: 'long' } }}\n * {{ d | temporalDate:{ dateStyle: 'full' } }}\n * ```\n */\n@Pipe({ name: 'temporalDate' })\nexport class KtTemporalDatePipe implements PipeTransform {\n private readonly locale = inject(LOCALE_ID);\n private readonly clock = inject(KtClock);\n\n transform(value: FormattableTemporal | null | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (value == null) return '';\n if (value instanceof Temporal.Instant) {\n return value.toZonedDateTimeISO(this.clock.timeZoneId()).toLocaleString(this.locale, options);\n }\n return value.toLocaleString(this.locale, options);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAYA;AACO,MAAM,0BAA0B,GAAwB,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;MAkBpF,eAAe,GAAG,IAAI,cAAc,CAAyB,iBAAiB;MAU9E,QAAQ,GAAG,IAAI,cAAc,CAAgB,UAAU;;ACtCpE;AAC2D;MAU9C,cAAc,CAAA;IACR,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE3C,IAAA,EAAE,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI;2EAAC;AAClD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,IAAI;oFAAC;AAChE,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK;gFAAC;AACzD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,KAAK;iFAAC;AAErE,IAAA,OAAO,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC,aAAa;uGARjE,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,oBAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAT1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,IAAI,EAAE;AACJ,wBAAA,MAAM,EAAE,MAAM;AACd,wBAAA,yBAAyB,EAAE,eAAe;AAC1C,wBAAA,qBAAqB,EAAE,2BAA2B;AAClD,wBAAA,sBAAsB,EAAE,4BAA4B;AACrD,qBAAA;AACF,iBAAA;;;ACUD;;;;;;;;AAQU;MASG,OAAO,CAAA;IACD,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG5D,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,QAAQ,GAAG,KAAK;4FAAiC;;IAEjD,SAAS,GAAG,KAAK,CAAS,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM;kFAAC;;AAE3D,IAAA,iBAAiB,GAAG,KAAK;qGAAU;;IAEnC,SAAS,GAAG,MAAM,EAAc;;IAEhC,MAAM,GAAG,KAAK,CAA0B,EAAE;+EAAC;;IAE3C,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;;IAEtB,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;;AAEvB,IAAA,OAAO,GAAG,KAAK;2FAAU;;IAEzB,mBAAmB,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,EAAE,mBAAmB,IAAI,KAAK;4FAAC;;IAE/E,aAAa,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK;sFAAC;;IAG3D,OAAO,GAAG,YAAY,CAAC,cAAc;gFAAC;;IAGtC,eAAe,GAAG,SAAS,CAAC,SAAS;wFAAC;;IAEtC,gBAAgB,GAAG,YAAY,CAAC,SAAS,wFAAI,WAAW,EAAE,IAAI,EAAA,CAAG;;AAGjE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;sFAAC;AAEjF,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACrC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,CAAA,SAAA,EAAY,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IACvD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;IAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAElD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;iFAAC;;IAGrE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;iFAAC;;AAG3F,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;;AAG7C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;AACpC,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE;AACjC,YAAA,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAC7B;;AAGA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACvC,QAAA,IAAI,MAAM;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;AAE5B,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;AAEQ,IAAA,WAAW,CAAC,KAAiB,EAAA;QACrC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;uGA9EW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,SAAA,EAFP,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA+BlC,cAAc,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAKL,SAAS,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAFb,SAAS,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxExD,irCA0CA,EAAA,MAAA,EAAA,CAAA,83CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDRY,SAAS,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAMR,OAAO,EAAA,UAAA,EAAA,CAAA;kBARnB,SAAS;+BACE,UAAU,EAAA,OAAA,EACX,CAAC,SAAS,CAAC,EAAA,eAAA,EACH,uBAAuB,CAAC,MAAM,EAAA,SAAA,EAGpC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,MAAK,OAAQ,CAAC,EAAE,CAAC,EAAA,QAAA,EAAA,irCAAA,EAAA,MAAA,EAAA,CAAA,83CAAA,CAAA,EAAA;itCA+BlC,cAAc,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGT,SAAS,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAEL,SAAS,QAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE1DnF;;AAEuF;MAEjE,gBAAgB,CAAA;IACjB,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;;;IAS9D,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;;IAEhC,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;;IAEhC,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;;IAEhC,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;IAE7B,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,QAAQ,GAAG,KAAK;4FAAiC;;IAEjD,SAAS,GAAG,KAAK,CAAS,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM;kFAAC;;AAE3D,IAAA,iBAAiB,GAAG,KAAK;qGAAU;;IAEnC,SAAS,GAAG,MAAM,EAAc;;AAEhC,IAAA,WAAW,GAAG,KAAK;+FAAU;AACtC;;AAEyB;AAChB,IAAA,YAAY,GAAG,KAAK;gGAAY;;AAEhC,IAAA,IAAI,GAAG,KAAK;wFAAU;;IAEtB,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAEzD,IAAA,MAAM,GAAG,KAAK;0FAAiC;;AAE/C,IAAA,MAAM,GAAG,KAAK;0FAAiC;;IAE/C,UAAU,GAAG,KAAK,CAAS,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,OAAO;mFAAC;;AAE9D,IAAA,YAAY,GAAG,KAAK;gGAAuB;IAEjC,QAAQ,GAAG,SAAS,CAAqD,OAAO;iFAAC;AAEnF,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;;AAGkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,SAAS,GAAG,QAAQ,CACrC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;kFAC9F;AAES,IAAA,UAAU,CAAC,KAAgD,EAAA;QACnE,OAAO,KAAK,YAAY,WAAW,GAAG,KAAK,GAAG,IAAI;IACpD;AAEU,IAAA,MAAM,CAAC,KAAgD,EAAA;AAC/D,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;IACjD;AAEU,IAAA,OAAO,CAAC,KAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAE,KAAK,CAAC,MAAiD,CAAC,KAAK,CAAC,CAAC;IAC5F;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEU,KAAK,GAAA;QACb,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACxC;uGAlGoB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBADrC;2tEA6D6F,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACpErG;;AAE+C;AACzC,SAAU,sBAAsB,CACpC,WAAmD,EACnD,OAA6B,EAAA;AAE7B,IAAA,IAAI,CAAC,WAAW;AAAE,QAAA,OAAO,EAAE;AAC3B,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,KAAI;AACpC,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,IAAI,UAAU,EAAE;AAClF,YAAA,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE;QAC9E;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,UAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACzD,IAAA,CAAC,CAAC;AACJ;;ACjBA;;;;;;;;;AASG;AAOG,MAAO,aAAc,SAAQ,gBAA+B,CAAA;;IAEvD,KAAK,GAAG,KAAK,CAAgB,IAAI;8EAAC;;AAElC,IAAA,GAAG,GAAG,KAAK;uFAAU;;AAErB,IAAA,GAAG,GAAG,KAAK;uFAAU;;AAErB,IAAA,IAAI,GAAG,KAAK;wFAAU;AAC/B;;AAEyC;AAChC,IAAA,WAAW,GAAG,KAAK;+FAAmC;AAE9C,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAC3B,IAAA,UAAU,GAAG,CAAA,qBAAA,EAAwB,IAAI,CAAC,GAAG,EAAE;AAC/C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;uFAAC;IACtE,eAAe,GAAG,QAAQ,CAAC,MAC5C,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;wFACrE;;AAGkB,IAAA,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE;AACzD,QAAA,KAAK,EAAE,CAAC,GAAW,KAAI;AACrB,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;YAC5C,IAAI,OAAO,KAAK,EAAE;AAAE,gBAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC1C,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;AAC9B,YAAA,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACxB,gBAAA,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,8CAA8C,EAAE,EAAE;YAC9F;AACA,YAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1B,CAAC;QACD,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACnD,KAAA,CAAC;AAEQ,IAAA,KAAK,CAAC,GAAW,EAAA;AACzB,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;QAC5C,IAAI,OAAO,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAC/B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;AAC9B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM;IAC7C;AAEmB,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AAExC,QAAA,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;QACtB,IAAI,KAAK,CAAC,gBAAgB;YAAE;QAE5B,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;YAAE;AAE1D,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACtB,KAAK,CAAC,cAAc,EAAE;IACxB;AAEQ,IAAA,WAAW,CAAC,IAAa,EAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AAEtB,QAAA,IAAI,QAAgB;AAEpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;AACzB,YAAA,IAAI,GAAG,KAAK,SAAS,EAAE;gBACrB,QAAQ,GAAG,GAAG;YAChB;AAAO,iBAAA,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC5B,QAAQ,GAAG,GAAG;YAChB;iBAAO;gBACL,QAAQ,GAAG,CAAC;YACd;QACF;aAAO;AACL,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAG;AAClC,YAAA,QAAQ,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI;QAC7D;QAEA,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,EAAE;YACvC,QAAQ,GAAG,GAAG;QAChB;QACA,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,EAAE;YACvC,QAAQ,GAAG,GAAG;QAChB;;AAGA,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;YACrB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC;YACjD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChD;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1B;IAEU,UAAU,GAAA;AAClB,QAAA,OAAO,IAAI;IACb;AAEU,IAAA,OAAO,CAAC,KAAoB,EAAA;QACpC,OAAO,KAAK,KAAK,IAAI;IACvB;uGApGW,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,4uBCzB1B,+8EAkFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7DY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAClB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+8EAAA,EAAA;;;AEfjD;;;;;;;;AAQG;AAOG,MAAO,UAAW,SAAQ,gBAAwB,CAAA;;IAE7C,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,IAAI,GAAG,KAAK,CAAS,CAAC;6EAAC;;AAEvB,IAAA,SAAS,GAAG,KAAK;6FAAU;AAE1B,IAAA,KAAK,CAAC,GAAW,EAAA;AACzB,QAAA,OAAO,GAAG;IACZ;IAEU,UAAU,GAAA;AAClB,QAAA,OAAO,EAAE;IACX;AAEU,IAAA,OAAO,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;IAC3B;uGAlBW,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,+fCtBvB,u6DAmEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,UAAU,EAAA,UAAA,EAAA,CAAA;kBANtB,SAAS;+BACE,cAAc,EAAA,OAAA,EACf,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,u6DAAA,EAAA;;;AEPjD;;;;;;;;AAQG;AAOG,MAAO,WAAY,SAAQ,gBAAwB,CAAA;;IAE9C,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,IAAI,GAAG,KAAK,CAAkB,MAAM;6EAAC;AAC9C;;AAEyC;AAChC,IAAA,WAAW,GAAG,KAAK;+FAAmC;AAE9C,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAC3B,IAAA,UAAU,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,GAAG,EAAE;AAC7C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;uFAAC;AACtE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;wFAAC;AAEvG,IAAA,KAAK,CAAC,GAAW,EAAA;AACzB,QAAA,OAAO,GAAG;IACZ;IAEU,UAAU,GAAA;AAClB,QAAA,OAAO,EAAE;IACX;AAEU,IAAA,OAAO,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;IAC3B;uGA1BW,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,sgBC3BxB,qmEAyEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qmEAAA,EAAA;;;AElBjD;;;;;;;;;AASG;MAqDU,QAAQ,CAAA;IACF,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAG5D,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;;IAI7B,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;IAE7B,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;IAE3C,aAAa,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK;sFAAC;AAE3D,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AACnC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,UAAA,EAAa,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IAC7D,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;IAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAEpD,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;IAEkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;0FAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;IAEQ,MAAM,GAAA;QACd,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEU,IAAA,UAAU,CAAC,KAAY,EAAA;AAC/B,QAAA,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE;IACf;uGAzEW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhDT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2qIAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,QAAQ,EAAA,UAAA,EAAA,CAAA;kBApDpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,eAAA,EACJ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,2qIAAA,CAAA,EAAA;;;AC5DH;;;;;;;;;;;;;;;;;AAiBG;MA2CU,eAAe,CAAA;IACT,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAG5D,KAAK,GAAG,KAAK,CAAM,EAAE;8EAAC;;;IAItB,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;IAE7B,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;IAE3C,aAAa,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK;sFAAC;;AAGnE,IAAA,WAAW,GAAG,KAAK;+FAA2B;AAEtC,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAC3C,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,kBAAA,EAAqB,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IACrE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;IAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAEpD,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;IAEkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;0FAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;IAEe,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAI,EAAE,CAAI,KAAK,CAAC,KAAK,CAAC,CAAC;mFAAC;;AAG7F,IAAA,UAAU,CAAC,WAAc,EAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC7C;;IAGA,MAAM,CAAC,WAAc,EAAE,OAAgB,EAAA;QACrC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACnD,QAAA,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,WAAW,CAAC,CAAC;QACvC;AAAO,aAAA,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;QACzD;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;uGAxFW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,eAAe,EAAA,UAAA,EAAA,CAAA;kBA1C3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,eAAA,EACZ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA;;;AC9CH;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MAgDU,UAAU,CAAA;IACJ,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAGlD,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAA8B;;IAG1F,KAAK,GAAG,KAAK,CAAI,KAAqB;8EAAC;;IAGvC,aAAa,GAAG,KAAK,CAAmB,KAAK,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;;IAI/E,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;IAE7B,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;IAE3C,aAAa,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK;sFAAC;AAE3D,IAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAA+B,OAAO,CAAC;AAEnE,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;AACrC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,YAAA,EAAe,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IAC/D,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAErE;AACiF;AAC9D,IAAA,SAAS,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;kFACzE;;IAGkB,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE;mFAAC;AAEnF,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;IAEkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;0FAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AACnE,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACvB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAuB,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEU,MAAM,GAAA;AACd,QAAA,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;IACjD;uGArGW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3CX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+5IAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,UAAU,EAAA,UAAA,EAAA,CAAA;kBA/CtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,eAAA,EACN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,+5IAAA,CAAA,EAAA;ikDA4C2E,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC/HrF;;;;;;;;;;;;;;;;;;AAkBG;MA2CU,YAAY,CAAA;IACN,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAG5D,KAAK,GAAG,KAAK,CAAW,IAAI;8EAAC;;;IAI7B,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;IAE7B,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;IAE3C,aAAa,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK;sFAAC;;AAGnE,IAAA,WAAW,GAAG,KAAK;+FAA2B;AAEtC,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;AACxC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,eAAA,EAAkB,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;;AAE5E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;kFAAC;IACxD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;IAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAEpD,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;IAEkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;0FAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;IAEe,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAI,EAAE,CAAI,KAAK,CAAC,KAAK,CAAC,CAAC;mFAAC;;AAG7F,IAAA,UAAU,CAAC,UAAa,EAAA;AACtB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,KAAK;QAC/C,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAM,CAAC;IAC9C;;AAGA,IAAA,MAAM,CAAC,UAAa,EAAA;QAClB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;uGAnFW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtCb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,q9BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,YAAY,EAAA,UAAA,EAAA,CAAA;kBA1CxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EACT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,q9BAAA,CAAA,EAAA;;;AC7DH;;;;;;;;;;;;;AAaG;MA6BU,OAAO,CAAA;AACC,IAAA,KAAK,GAAG,MAAM,CAAkB,YAAY,CAAC;;IAGvD,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAK;;AAE3B,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;IAE3B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAExD,IAAA,EAAE,GAAG,KAAK;sFAAU;AAEZ,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;AAClC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,SAAA,EAAY,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IAC5D,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;AAEhD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gFAAC;AAC7D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;mFAAC;IAE9E,QAAQ,GAAA;QAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjC;uGA1BW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBR;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,69GAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,OAAO,EAAA,UAAA,EAAA,CAAA;kBA5BnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,eAAA,EACH,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAErC;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,69GAAA,CAAA,EAAA;;;MCKU,gBAAgB,GAAG,IAAI,cAAc,CAAiC,kBAAkB;;AC7CrG;AACM,SAAU,QAAQ,CAAO,GAA+B,EAAE,QAAwB,EAAA;IACtF,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,QAAQ;IACtC,IAAI,OAAO,GAAG,KAAK,UAAU;AAAE,QAAA,OAAO,GAAG;IACzC,OAAO,CAAC,IAAO,KAAM,IAAqC,CAAC,GAAG,CAAM;AACtE;AAEA;AACM,SAAU,YAAY,CAAI,IAAO,EAAA;IACrC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC7C,MAAM,CAAC,GAAG,IAA+B;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;AAAE,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC;IACrD;AACA,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB;AAEA;AACM,SAAU,eAAe,CAAI,IAAO,EAAA;IACxC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC7C,MAAM,CAAC,GAAG,IAA+B;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI;IACtC;AACA,IAAA,OAAO,IAAI;AACb;;ACEA;AACA,MAAM,iBAAiB,GAAG,GAAG;AAE7B;AACwE;AACxE,SAAS,kBAAkB,CAAC,CAAS,EAAA;AACnC,IAAA,OAAO;SACJ,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE;AAC9B,SAAA,WAAW,EAAE;AAClB;AAEA;AACA,SAAS,wBAAwB,CAAC,KAAa,EAAA;AAC7C,IAAA,OAAO,KAAK,KAAK,CAAC,GAAG,UAAU,GAAG,CAAA,EAAG,KAAK,UAAU;AACtD;AAEA,SAAS,2BAA2B,CAAC,GAAW,EAAE,KAAa,EAAA;AAC7D,IAAA,OAAO,CAAA,cAAA,EAAiB,GAAG,CAAA,YAAA,EAAe,KAAK,mCAAmC;AACpF;AAEA,SAAS,mCAAmC,CAAC,GAAW,EAAE,KAAa,EAAA;AACrE,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,0BAAA,EAA6B,KAAK,mCAAmC;AACpF;AAEA;;;;;;;;;;AAU4D;MAMtC,YAAY,CAAA;IACb,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,MAAM,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrD,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AACpD,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxC,WAAW,GAAG,KAAK;;;IAIlB,OAAO,GAAG,KAAK,CAAC,QAAQ;gFAAgB;;AAExC,IAAA,WAAW,GAAG,KAAK;+FAAuB;AACnD;;AAEqF;AAC5E,IAAA,WAAW,GAAG,KAAK;+FAAkB;;AAErC,IAAA,cAAc,GAAG,KAAK;kGAAwB;;AAE9C,IAAA,WAAW,GAAG,KAAK;+FAA2B;;IAG9C,SAAS,GAAG,MAAM,EAAc;;;IAIhC,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;;IAEhC,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;;IAEhC,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;;IAEhC,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;IAE7B,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,QAAQ,GAAG,KAAK;4FAAiC;;IAEjD,SAAS,GAAG,KAAK,CAAS,IAAI,CAAC,WAAW,EAAE,SAAS,IAAI,MAAM;kFAAC;;AAEhE,IAAA,iBAAiB,GAAG,KAAK;qGAAU;;AAEnC,IAAA,WAAW,GAAG,KAAK;+FAAU;;AAE7B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;AAGpD;AACkG;IACzF,UAAU,GAAG,KAAK,CAAU,KAAK;mFAAC;;AAElC,IAAA,iBAAiB,GAAG,KAAK;qGAAU;;AAEnC,IAAA,WAAW,GAAG,KAAK;+FAAU;AACtC;AAC0E;AACjE,IAAA,QAAQ,GAAG,KAAK;4FAAyC;;IAEzD,iBAAiB,GAAG,KAAK,CAAS,GAAG;0FAAC;;AAEtC,IAAA,oBAAoB,GAAG,KAAK;wGAA0C;;AAEtE,IAAA,4BAA4B,GAAG,KAAK;gHAA0C;;IAGpE,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;AACxB,IAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;AAChD;;AAE2D;AACxC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS;IACjC,SAAS,GAAG,SAAS,CAA0B,SAAS;kFAAC;IACzD,OAAO,GAAG,SAAS,CAA0B,OAAO;gFAAC;AACvD,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AACrC,IAAA,UAAU,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,GAAG,EAAE;;AAE3C,IAAA,OAAO,GAAG,CAAA,gBAAA,EAAmB,IAAI,CAAC,GAAG,EAAE;IACvC,aAAa,GAAG,SAAS,CAA+B,aAAa;sFAAC;IACtE,SAAS,GAAG,SAAS,CAA0B,WAAW;kFAAC;IAC3D,UAAU,GAAG,SAAS,CAAC,OAAO;mFAAC;IAC/B,WAAW,GAAG,SAAS,CAAC,QAAQ;oFAAC;AACpD;AAC0F;IAClF,YAAY,GAAG,KAAK;;AAGX,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY,IAAI,0BAA0B;gFAC1F;AACkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;;AAGkB,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE;4FAAC;AAC1F,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,YAAY;0FAAC;AAC1E,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,OAAO;2FAAC;AACvE,IAAA,yBAAyB,GAAG,QAAQ,CACrD,MAAM,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,iBAAiB,IAAI,EAAE;kGACvE;AACkB,IAAA,mBAAmB,GAAG,QAAQ,CAC/C,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,gBAAgB;4FACzE;AACkB,IAAA,yBAAyB,GAAG,QAAQ,CACrD,MAAM,IAAI,CAAC,MAAM,EAAE,iBAAiB,IAAI,wBAAwB;kGACjE;AACkB,IAAA,4BAA4B,GAAG,QAAQ,CACxD,MAAM,IAAI,CAAC,oBAAoB,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,oBAAoB,IAAI,2BAA2B;qGACtG;IACkB,oCAAoC,GAAG,QAAQ,CAChE,MACE,IAAI,CAAC,4BAA4B,EAAE;QACnC,IAAI,CAAC,MAAM,EAAE,4BAA4B;QACzC,mCAAmC;6GACtC;;AAGkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oFAAC;;AAGhG,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAY,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC;sFAAC;AACrF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAa,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC;sFAAC;AACzF,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAa,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,KAAK,CAAC;yFAAC;;AAEzF,IAAA,UAAU,GAAG,QAAQ,CACtC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAI,EAAE,CAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;mFAC9E;AAES,IAAA,OAAO,CAAC,IAAO,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;IACnC;AACU,IAAA,KAAK,CAAC,IAAO,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;IACnC;AACU,IAAA,UAAU,CAAC,IAAO,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC;IACtC;;IAGmB,UAAU,GAAG,MAAM,CAAC,EAAE;mFAAC;;IAEvB,cAAc,GAAG,MAAM,CAAC,EAAE;uFAAC;AACtC,IAAA,aAAa;;AAGF,IAAA,eAAe,GAAG,QAAQ,CAAe,MAAK;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QACtC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,OAAO,EAAE;AAC7D,QAAA,MAAM,EAAE,GACN,IAAI,CAAC,QAAQ,EAAE;aACd,CAAC,MAAS,EAAE,CAAS,KAAK,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;AACtG,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;wFAAC;;AAGiB,IAAA,gBAAgB,GAAG,QAAQ,CAAe,MAAK;AAChE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACtC,OAAO,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;IAC3D,CAAC;yFAAC;;IASQ,yBAAyB,GAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QACtC,IAAI,KAAK,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACtC,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,GAAG,KAAK,EAAE;YACtC,OAAO,IAAI,CAAC,oCAAoC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;QAClE;AACA,QAAA,OAAO,IAAI,CAAC,yBAAyB,EAAE,CAAC,KAAK,CAAC;IAChD;AAEA,IAAA,WAAA,GAAA;;;QAGE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC;AACnF,QAAA,CAAC,CAAC;;;;;QAMF,MAAM,CAAC,MAAK;YACV,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAEd;AACb,YAAA,IAAI,CAAC,EAAE;gBAAE;AACT,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,gBAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC;gBAChD,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;gBACxB,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC;AACxD,gBAAA,EAAE,CAAC,WAAW,IAAI;AAClB,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;;gBAGxB,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;oBAAE,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;YACvF;AAAO,iBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AAC5B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAChC;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAAE;YACrB,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,gBAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAClC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACxB,YAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBAC3E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;YAC7B,IAAI,EAAE,EAAE;gBACN,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBAAE;AACrB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE;AACzC,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AACvC,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACzB;iBAAO;gBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;AACjC,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;gBACzC;YACF;AACF,QAAA,CAAC,CAAC;;;AAIF,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,gBAAA,MAAM,aAAa,GAAG,CAAC,KAAmB,KAAI;AAC5C,oBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;wBAAE;AACtB,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;oBAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa;oBAC3C,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,KAAK,CAAC,EAAE;AAC7E,wBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;AACnB,4BAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,wBAAA,CAAC,CAAC;oBACJ;AACF,gBAAA,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC;AACvD,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;oBAC7B,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC;AAC5D,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;;QAGA,MAAM,CAAC,MAAK;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,gBAAgB,EAAE;AACtD,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBAAE;YAEnC,qBAAqB,CAAC,MAAK;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC/C,gBAAA,IAAI,CAAC,OAAO;oBAAE;gBACd,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC;gBACpE,IAAI,QAAQ,EAAE;oBACZ,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAC/C;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,IAAI,SAAS,EAAE,EAAE;YACf,MAAM,CAAC,MAAK;AACV,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;oBAAE;gBAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAwC;AAC3G,gBAAA,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE;AACzE,oBAAA,OAAO,CAAC,IAAI,CACV,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA,gDAAA,CAAkD;wBACjG,uFAAuF;AACvF,wBAAA,yDAAyD,CAC5D;gBACH;AACF,YAAA,CAAC,CAAC;QACJ;IACF;AAEU,IAAA,aAAa,CAAC,KAAY,EAAA;QAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QAC7D,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;;AAGgF;AACtE,IAAA,eAAe,CAAC,KAAoB,EAAA;AAC5C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,8BAA8B,EAAE;YACrC;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;;;;;YAKvB,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,8BAA8B,EAAE;YACrC;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO;YAAE;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC/C,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,KAAK,CAAC,cAAc,EAAE;QACtB,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACrH;AAEA;;;AAGqG;AAC3F,IAAA,aAAa,CAAC,KAAoB,EAAA;QAC1C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;QAChD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACzC;;IAGU,2BAA2B,GAAA;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;AACnC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;oBACnB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAC3D,gBAAA,CAAC,CAAC;YACJ,CAAC,EAAE,iBAAiB,CAAC;AACvB,QAAA,CAAC,CAAC;IACJ;;AAGU,IAAA,WAAW,CAAC,IAAY,EAAA;AAChC,QAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;AAEA;;;AAGyD;IAC/C,sBAAsB,GAAA;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACtE,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE;QAC9B,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE;AACpF,QAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7B;AAEA;AACuG;IAC7F,8BAA8B,GAAA;QACtC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE;QAC1C,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACzC;;IAGU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAqE;AAChG,QAAA,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC;AACjD,QAAA,EAAE,EAAE,WAAW,IAAI;AACnB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;IAC3B;;;;IAKiB,SAAS,GAAG,iBAAiB,CAAC;AAC7C,QAAA,IAAI,EAAE,MAAO,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,aAAa,CAAC,wBAAwB,CAAiB,IAAI,IAAI;QAC1G,SAAS,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACzC,QAAA,aAAa,EAAE,4BAA4B;AAC5C,KAAA,CAAC;AAEQ,IAAA,WAAW,CAAC,KAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;IAC7B;AAEQ,IAAA,qBAAqB,CAAC,EAA0C,EAAA;AACtE,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC1D,YAAA,EAAE,CAAC,WAAW,IAAI;AAClB,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;YACzB;QACF;AAEA,QAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC;QAC7C,MAAM,IAAI,GAAI,EAAE,CAAC,aAAa,CAAC,wBAAwB,CAAiB,IAAI,EAAE;;QAG9E,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC5C,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,IAAI,IAAI;QACrD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAEpF,QAAA,IAAI,UAAU,KAAK,CAAC,EAAE;AACpB,YAAA,EAAE,CAAC,WAAW,IAAI;AAClB,YAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC;AAChD,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;YACzB;QACF;;AAGA,QAAA,MAAM,eAAe,GAAG,CAAC,KAAsB,KAAI;AACjD,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,YAAY,KAAK,WAAW,EAAE;AAC/D,gBAAA,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,eAAe,CAAC;gBAC1D,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAAE;AACrB,gBAAA,EAAE,CAAC,WAAW,IAAI;AAClB,gBAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC;AAChD,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;YAC3B;AACF,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAAC;;QAGvD,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,eAAe,CAAC;YAC1D,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAAE;AACrB,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,EAAE,CAAC,WAAW,IAAI;AAClB,gBAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC;AAChD,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;YAC3B;AACF,QAAA,CAAC,EAAE,UAAU,GAAG,EAAE,CAAC;IACrB;uGA1doB,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAiGU,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACN,QAAQ,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAlG/B,YAAY,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,IAAI,EAAE;AACJ,wBAAA,WAAW,EAAE,uBAAuB;AACrC,qBAAA;AACF,iBAAA;i8FAyFmE,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACX,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAMI,aAAa,mEACtB,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACnC,OAAO,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACN,QAAQ,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACvJrD;;;;;;;;;;AAUU;MAEG,iBAAiB,CAAA;IACnB,cAAc,GAAG,KAAK,CAAC,QAAQ;uFAAgB;AAC/C,IAAA,QAAQ,GAAG,MAAM,CAAwC,WAAW,CAAC;AAE9E,IAAA,OAAO,sBAAsB,CAAI,IAA0B,EAAE,GAAY,EAAA;AACvE,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ;IAChC;uGANW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,SAAS;mBAAC,EAAE,QAAQ,EAAE,6BAA6B,EAAE;;AAUtD;;;;;;;;;AASU;MAEG,kBAAkB,CAAA;IACpB,eAAe,GAAG,KAAK,CAAC,QAAQ;wFAAgB;AAChD,IAAA,QAAQ,GAAG,MAAM,CAAyC,WAAW,CAAC;AAE/E,IAAA,OAAO,sBAAsB,CAAI,IAA2B,EAAE,GAAY,EAAA;AACxE,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ;IAChC;uGANW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,SAAS;mBAAC,EAAE,QAAQ,EAAE,8BAA8B,EAAE;;;AC7BvD;;;;;;;;;;;;;AAaU;AAQJ,MAAO,QAAmB,SAAQ,YAAkB,CAAA;;;IAG/C,KAAK,GAAG,KAAK,CAAW,IAAI;8EAAC;AACtC;AACkF;IACzE,eAAe,GAAG,MAAM,EAAiC;;IAG/C,SAAS,GAAG,YAAY,CAAC,iBAAiB;kFAAC;IAC3C,UAAU,GAAG,YAAY,CAAC,kBAAkB;mFAAC;;AAG/C,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,IAAI;sFAAC;;AAGhE,IAAA,cAAc,GAAG,QAAQ,CAAW,MAAK;AAC1D,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,EAAE;YACpC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAM,CAAa,CAAC,IAAI,IAAI;QACnE;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAiB,CAAC,CAAC,IAAK,CAAkB;IAC3E,CAAC;uFAAC;;AAG0B,IAAA,YAAY,GAAG,QAAQ,CAAY,MAAK;AAClE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE;AACjC,QAAA,OAAO,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;qFAAC;AAEiB,IAAA,oBAAoB,CAAC,IAAwB,EAAA;;;QAG9D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAAE;AACxD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI;QAC5C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE;AACrC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC1B;QACF;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI;AACxE,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;IAC9B;;IAGQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;QACtC,IAAI,QAAQ,KAAK,IAAI;AAAE,YAAA,OAAO,KAAK;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;IAC9E;AAEQ,IAAA,eAAe,CAAC,MAAgB,EAAA;AACtC,QAAA,MAAM,GAAG,GACP,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAO,GAAI,MAAuB;AAClH,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACjD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,8BAA8B,EAAE;QACvC;IACF;uGAjEW,QAAQ,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EASyB,iBAAiB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAChB,kBAAkB,uFCnDjE,szQAkMA,EAAA,MAAA,EAAA,CAAA,+4RAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3JY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,2IAAE,cAAc,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAElG,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;+BACE,WAAW,EAAA,eAAA,EACJ,uBAAuB,CAAC,MAAM,WAGtC,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAA,QAAA,EAAA,szQAAA,EAAA,MAAA,EAAA,CAAA,+4RAAA,CAAA,EAAA;AAWlE,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,iBAAiB,4FAChB,kBAAkB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEhDjE;;;;;;;;;;;AAWsF;MAKzE,cAAc,CAAA;IAChB,cAAc,GAAG,KAAK,CAAiC,EAAE;uFAAC;AAEnE;AACwF;AACvE,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE9E,IAAA,OAAO,CAAwC,GAAM,EAAA;AAC3D,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACzD;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACpC;AACA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC;AACA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IACnC;AACA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACtC;AACA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAC1C;AACA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACpC;AACA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAC1C;AACA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;IACxC;AACA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;IAC3C;AACA,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;IAC7C;AACA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;IACxC;AACA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;IAC3C;AACA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACvC;AACA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACtC;AACA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACvC;AACA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACvC;AACA,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;IAC7C;AACA,IAAA,IAAI,4BAA4B,GAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC;IACrD;uGAhEW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAFd,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAE5D,cAAc,EAAA,UAAA,EAAA,CAAA;kBAJ1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;oBAC5B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAA,cAAgB,EAAE,CAAC;AACxE,iBAAA;;;AChBD;;;;AAIkE;MAC5C,mBAAmB,CAAA;AAExC;;ACID;;;;;;;;;;AAUG;MAeU,MAAM,CAAA;IACE,KAAK,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACzD,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;;IAE3B,kBAAkB,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA,CAAE;;IAGtE,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEzD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,WAAW,GAAG,KAAK,CAAS,QAAQ;oFAAC;;IAErC,MAAM,GAAG,MAAM,EAAQ;IAEf,SAAS,GAAG,SAAS,CAAgC,WAAW;kFAAC;;IAGlF,WAAW,GAAA;QACT,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACzC;uGApBW,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAM,ozBCtCnB,mWAaA,EAAA,MAAA,EAAA,CAAA,46CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDyBa,MAAM,EAAA,UAAA,EAAA,CAAA;kBAdlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAAA,eAAA,EACF,uBAAuB,CAAC,MAAM,EAAA,IAAA,EAGzC;AACJ,wBAAA,KAAK,EAAE,SAAS;;;;AAIhB,wBAAA,8BAA8B,EAAE,oDAAoD;AACpF,wBAAA,+BAA+B,EAAE,mBAAmB;AACrD,qBAAA,EAAA,QAAA,EAAA,mWAAA,EAAA,MAAA,EAAA,CAAA,46CAAA,CAAA,EAAA;gaAiBqE,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE3CnF;;;;;;;;;;AAUU;MAEG,aAAa,CAAA;IACf,UAAU,GAAG,KAAK,CAAC,QAAQ;mFAAgB;AAC3C,IAAA,QAAQ,GAAG,MAAM,CAAoC,WAAW,CAAC;AAE1E,IAAA,OAAO,sBAAsB,CAAI,IAAsB,EAAE,GAAY,EAAA;AACnE,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ;IAChC;uGANW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,SAAS;mBAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE;;;MCArC,eAAe,GAAG,IAAI,cAAc,CAAyB,iBAAiB;;ACS3F;AACA,MAAM,eAAe,GAAG,IAAI;AAE5B;;;;;;;;;;;;;;AAcG;MAgBU,UAAU,CAAA;IACJ,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpD,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AACtB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEhD;AAC4F;IACnF,aAAa,GAAG,MAAM,CAAC,KAAK;sFAAC;;IAG7B,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAgB;;AAEtC,IAAA,SAAS,GAAG,KAAK;6FAAuB;;AAExC,IAAA,OAAO,GAAG,KAAK;2FAAwB;;IAEvC,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAExD,IAAA,UAAU,GAAG,KAAK;8FAAU;;AAE5B,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,eAAe,GAAG,KAAK;mGAAiC;;AAExD,IAAA,eAAe,GAAG,KAAK;mGAAiC;;AAExD,IAAA,SAAS,GAAG,KAAK;6FAAmC;;AAEpD,IAAA,SAAS,GAAG,KAAK;6FAAU;;IAE3B,YAAY,GAAG,KAAK,CAA2C,IAAI;qFAAC;;AAEpE,IAAA,gBAAgB,GAAG,KAAK;oGAAe;AAEhD;AACkG;IACzF,OAAO,GAAG,MAAM,EAA8B;IAEpC,OAAO,GAAG,YAAY,CAAC,aAAa;gFAAC;IACvC,KAAK,GAAG,YAAY,CAAC,MAAM;8EAAC;;AAG1B,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,gBAAgB;0FAAC;IACpG,uBAAuB,GAAG,QAAQ,CACjD,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC,CAAS,KAAK,CAAA,OAAA,EAAU,CAAC,CAAA,CAAE,CAAC;gGAC/F;IACgB,uBAAuB,GAAG,QAAQ,CACjD,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC,CAAS,KAAK,CAAA,EAAG,CAAC,CAAA,QAAA,CAAU,CAAC;gGAChG;IACkB,iBAAiB,GAAG,QAAQ,CAC7C,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,CAAS,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,KAAA,CAAO,CAAC;0FAClF;AACkB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,WAAW;0FAAC;;AAG/F,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAY,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC;sFAAC;AACnF,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAa,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC;oFAAC;AAE1F,IAAA,OAAO,CAAC,IAAO,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;IACnC;AACU,IAAA,KAAK,CAAC,IAAO,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC;IACjC;AACU,IAAA,cAAc,CAAC,IAAO,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D;;AAGmB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;0FAAC;AAEnF,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;mFAAC;;IAGjE,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;AACxB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,OAAO,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG;IACvD,CAAC;iFAAC;AACiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,CAAC;AAClD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC;IAC/C,CAAC;oFAAC;AACiB,IAAA,YAAY,GAAG,QAAQ,CAAe,MAAK;AAC5D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;AAAE,YAAA,OAAO,GAAG;QACzE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;IAC1B,CAAC;qFAAC;;IAGiB,MAAM,GAAG,MAAM,CAAC,EAAE;+EAAC;AAC9B,IAAA,WAAW;AAEnB,IAAA,WAAA,GAAA;;QAEE,MAAM,CACJ,MAAK;YACH,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAAE;YACrB,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;AAED,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpE;AAEiB,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC3B,qBAAqB,GAAG,CAAA,eAAA,EAAkB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA,CAAE;AAEjG;AACqF;AACrF,IAAA,QAAQ,CAAC,IAAY,EAAA;AACnB,QAAA,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IAC3E;IAEQ,gBAAgB,GAA0B,IAAI;AAEtD;;;;;AAKkC;AAC1B,IAAA,kBAAkB,CAAC,MAAkB,EAAA;QAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACvC,YAAA,MAAM,EAAE;YACR;QACF;;AAEA,QAAA,MAAM,oBAAoB,GACxB,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO;;;AAG1G,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAExB;QACD,MAAM,mBAAmB,GACvB,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAuC;AACrF,QAAA,IAAI,CAAC,mBAAmB,IAAI,oBAAoB,EAAE;AAChD,YAAA,MAAM,EAAE;YACR;QACF;;;;;AAMA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE;AACtC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,MAAM,EAAE;YACR;QACF;;;;AAKA,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,MAAM,EAAE,GAAG,mBAAmB,CAAC,MAAK;AAClC,YAAA,MAAM,EAAE;;AAER,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;;;QAG1B,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;AAC/B,QAAA,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAK;AACvB,YAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,EAAE;AAAE,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;AAEA;AACsF;IAC5E,QAAQ,CAAC,IAAO,EAAE,KAAa,EAAA;QACvC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjE,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAK;YAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClC,YAAA,eAAe,CACb;gBACE,IAAI,EAAE,MAAK;AACT,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AACtC,oBAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,MAAM,CAAC,gBAAgB,CACrB,kFAAkF,CACnF,CACe;AAClB,oBAAA,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACjE,IAAI,MAAM,EAAE;wBACV,MAAM,CAAC,KAAK,EAAE;wBACd;oBACF;AACA,oBAAA,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE;gBAClC,CAAC;aACF,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;AACH,QAAA,CAAC,CAAC;IACJ;IAEU,cAAc,CAAC,IAAO,EAAE,KAAa,EAAA;QAC7C,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACzC;;IAGU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAK;AAC3B,YAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;AAC/B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;AACzB,YAAA,IAAI,CAAC,MAAM;gBAAE;YACb,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;AAC5C,YAAA,eAAe,CACb;gBACE,IAAI,EAAE,MAAK;AACT,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AACtC,oBAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,MAAM,CAAC,gBAAgB,CACrB,kFAAkF,CACnF,CACe;AAClB,oBAAA,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE;gBACpC,CAAC;aACF,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;AACH,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;QACrB,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACrF;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AACtC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,MAAM,CAAC,gBAAgB,CACrB,uGAAuG,CACxG,CACe;AAElB,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE;AAE7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAA4B;QACpD,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;AAE/C,QAAA,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,WAAW,EAAE;AAC/C,YAAA,SAAS,GAAG,YAAY,GAAG,CAAC;QAC9B;aAAO,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,SAAS,EAAE;AACnD,YAAA,SAAS,GAAG,YAAY,GAAG,CAAC;QAC9B;AAAO,aAAA,IAAI,GAAG,KAAK,MAAM,EAAE;YACzB,SAAS,GAAG,CAAC;QACf;AAAO,aAAA,IAAI,GAAG,KAAK,KAAK,EAAE;AACxB,YAAA,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;QACnC;QAEA,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE;YACnD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE;QAC/B;IACF;uGAxRW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,kCAAA,EAAA,qBAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,SAAA,EATV,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAsD5B,aAAa,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EACjB,MAAM,gEC7G9C,wtDAyCA,EAAA,MAAA,EAAA,CAAA,k8BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDYY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAUvB,UAAU,EAAA,UAAA,EAAA,CAAA;kBAftB,SAAS;+BACE,cAAc,EAAA,eAAA,EACP,uBAAuB,CAAC,MAAM,WAGtC,CAAC,MAAM,EAAE,gBAAgB,CAAC,aACxB,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAA,UAAY,EAAE,CAAC,EAAA,IAAA,EAChE;AACJ,wBAAA,mBAAmB,EAAE,kCAAkC;;;AAGvD,wBAAA,uBAAuB,EAAE,6BAA6B;AACtD,wBAAA,WAAW,EAAE,mBAAmB;AACjC,qBAAA,EAAA,QAAA,EAAA,wtDAAA,EAAA,MAAA,EAAA,CAAA,k8BAAA,CAAA,EAAA;AA+CyC,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,aAAa,uFACjB,MAAM,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEnF9C;;;;;;;;;;AAUU;MAEG,sBAAsB,CAAA;IACxB,mBAAmB,GAAG,KAAK,CAAC,QAAQ;4FAAgB;AACpD,IAAA,QAAQ,GAAG,MAAM,CAA6C,WAAW,CAAC;AAEnF,IAAA,OAAO,sBAAsB,CAC3B,IAA+B,EAC/B,GAAY,EAAA;AAEZ,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ;IAChC;uGATW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,SAAS;mBAAC,EAAE,QAAQ,EAAE,kCAAkC,EAAE;;AAa3D;;;;;;;;;AASU;MAEG,uBAAuB,CAAA;IACzB,oBAAoB,GAAG,KAAK,CAAC,QAAQ;6FAAgB;AACrD,IAAA,QAAQ,GAAG,MAAM,CAA8C,WAAW,CAAC;AAEpF,IAAA,OAAO,sBAAsB,CAC3B,IAAgC,EAChC,GAAY,EAAA;AAEZ,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ;IAChC;uGATW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,SAAS;mBAAC,EAAE,QAAQ,EAAE,mCAAmC,EAAE;;AAa5D;;;;;;;;;AASU;MAEG,oBAAoB,CAAA;IACtB,iBAAiB,GAAG,KAAK,CAAC,QAAQ;0FAAgB;AAClD,IAAA,QAAQ,GAAG,MAAM,CAA2C,WAAW,CAAC;AAEjF,IAAA,OAAO,sBAAsB,CAAI,IAA6B,EAAE,GAAY,EAAA;AAC1E,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ;IAChC;uGANW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,SAAS;mBAAC,EAAE,QAAQ,EAAE,gCAAgC,EAAE;;;ACpDzD;AACA;AACA,SAAS,2BAA2B,CAAC,KAAa,EAAA;IAChD,OAAO,CAAA,EAAG,KAAK,CAAA,eAAA,CAAiB;AAClC;AAEA,SAAS,yBAAyB,CAAC,KAAa,EAAA;AAC9C,IAAA,OAAO,KAAK,KAAK,CAAC,GAAG,YAAY,GAAG,CAAA,EAAG,KAAK,WAAW;AACzD;AAEA,SAAS,yBAAyB,CAAC,UAA8B,EAAA;IAC/D,OAAO,UAAU,GAAG,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE,GAAG,gBAAgB;AAC3E;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AAkBG,MAAO,aAAwB,SAAQ,YAAkB,CAAA;;;IAGpD,KAAK,GAAG,KAAK,CAAM,EAAE;8EAAC;AAC/B;AACgG;IACvF,eAAe,GAAG,MAAM,EAAsC;;;IAI9D,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEzD,UAAU,GAAG,KAAK,CAAS,IAAI,CAAC,WAAW,EAAE,UAAU,IAAI,OAAO;mFAAC;;IAEnE,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAEhE,IAAA,eAAe,GAAG,KAAK;mGAAU;;IAGvB,SAAS,GAAG,YAAY,CAAC,sBAAsB;kFAAC;IAChD,UAAU,GAAG,YAAY,CAAC,uBAAuB;mFAAC;IAClD,OAAO,GAAG,YAAY,CAAC,oBAAoB;gFAAC;IAE9C,QAAQ,GAAG,SAAS,CAAC,UAAU;iFAAC;;IAG9B,uBAAuB,GAAG,QAAQ,CACnD,MAAM,IAAI,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC,SAAiB,KAAK,CAAA,OAAA,EAAU,SAAS,CAAA,CAAE,CAAC;gGACrF;IACkB,0BAA0B,GAAG,QAAQ,CAAC,MACvD,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,IAAI,yBAAyB,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;mGAC7E;AACgB,IAAA,4BAA4B,GAAG,QAAQ,CACtD,MAAM,IAAI,CAAC,MAAM,EAAE,oBAAoB,IAAI,2BAA2B;qGACvE;IACkB,uBAAuB,GAAG,QAAQ,CACnD,MAAM,IAAI,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC,SAAiB,KAAK,CAAA,EAAG,SAAS,CAAA,QAAA,CAAU,CAAC;gGACtF;AACgB,IAAA,0BAA0B,GAAG,QAAQ,CACpD,MAAM,IAAI,CAAC,MAAM,EAAE,kBAAkB,IAAI,yBAAyB;mGACnE;AACkB,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,cAAc,IAAI,YAAY;+FAAC;AACpF,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,WAAW;8FAAC;IACjF,sBAAsB,GAAG,QAAQ,CAClD,MAAM,IAAI,CAAC,MAAM,EAAE,cAAc,KAAK,CAAC,WAAmB,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,KAAA,CAAO,CAAC;+FACvF;AACkB,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,cAAc,IAAI,WAAW;+FAAC;AAEtG;AACiC;AACd,IAAA,WAAW,GAAG,CAAC,IAAO,KAAa,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AACrD,IAAA,SAAS,GAAG,CAAC,IAAO,KAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAErE;AAC6F;AAC1E,IAAA,eAAe,GAAG,QAAQ,CAAM,MAAK;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAM,CAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAa,CAAC,KAAK,SAAS,CAAC;QACnH;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAiB,CAAC,CAAC,IAAK,CAAkB,CAAC;IAC5F,CAAC;wFAAC;;AAGiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AACpC,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;YACxB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxD;QACA,OAAO,IAAI,CAAC,4BAA4B,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC7D,CAAC;oFAAC;;IAG0B,YAAY,GAAG,QAAQ,CAAY,MAC7D,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qFACjD;;AAGkB,IAAA,SAAS,GAAG,QAAQ,CACrC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC;kFACpG;;AAGkB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE;mFAAC;;AAGzE,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,0BAA0B,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC;4FACjE;;AAGO,IAAA,QAAQ,CAAC,CAAI,EAAA;AACnB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;AAAE,YAAA,OAAO,CAAC;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAiB,CAAC,CAAC;QACpE,OAAO,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAiB,CAAC;IAClF;;AAGQ,IAAA,WAAW,CAAC,GAAY,EAAA;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QAChE,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,SAAS;AAC1C,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,GAAI,GAAS,GAAI,MAAuB;IACjF;AAEmB,IAAA,oBAAoB,CAAC,IAAwB,EAAA;;;;;QAK9D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAClC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1B,YAAA,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,QAAA,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG;AACX,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,aAAA,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,KAAa,CAAC,KAAK,SAAS,CAAC;AACzC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QAC1D,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;IACvC;AAEQ,IAAA,WAAW,CAAC,IAAS,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;IAC7E;AAEA;AAC6F;AACnF,IAAA,gBAAgB,CAAC,KAAoB,EAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;AAC1F,QAAA,MAAM,WAAW,GACf,CAAC,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AACrG,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW;YAAE;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC/C,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,OAAO,CAAC,aAAa,CACnB,IAAI,aAAa,CAAC,SAAS,EAAE;YAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;AACtB,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA,CAAC,CACH;IACH;AAEA;;AAEkF;AACxE,IAAA,cAAc,CAAC,KAAoB,EAAA;AAC3C,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;YAAE;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC/C,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,OAAO,CAAC,aAAa,CACnB,IAAI,aAAa,CAAC,SAAS,EAAE;YAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;AACtB,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA,CAAC,CACH;IACH;;IAGmB,yBAAyB,GAAA;AAC1C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,yBAAyB,EAAE;QAC9C,IAAI,IAAI,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM;QACnD,IAAI,aAAa,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACpC,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,0BAA0B,EAAE,CAAC,aAAa,CAAC,CAAA,CAAE;IACvE;;AAGU,IAAA,YAAY,CAAC,MAAS,EAAA;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;AACzC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YAAE;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACxB;AAEQ,IAAA,eAAe,CAAC,MAAS,EAAA;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAClC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9B,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAM,CAAa,KAAK,GAAG,CAAC;QACtD;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAiB,EAAE,MAAM,CAAC,CAAC;IAC/D;;IAGU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACzC;AAEA;AAC0E;IAChE,iBAAiB,GAAA;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAClC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe;aAC/B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpE,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,GAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAO,GAAI,CAAkB,CAAC,CAAC;AAC9F,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QACxB,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,sBAAsB,EAAE;IAC/B;;IAGU,gBAAgB,GAAA;QACxB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAClC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YAAE;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,sBAAsB,EAAE;IAC/B;;IAGQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;IACpF;uGAhPW,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAmBoB,sBAAsB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACrB,uBAAuB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAC1B,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAExB,UAAU,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxGlD,shXAgRA,EAAA,MAAA,EAAA,CAAA,+4RAAA,EAAA,guEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1MI,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,QAAQ,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,aAAa,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,cAAc,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,OAAO,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,MAAM,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGD,aAAa,EAAA,UAAA,EAAA,CAAA;kBAjBzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,EAAA,OAAA,EAGtC;wBACP,OAAO;wBACP,cAAc;wBACd,gBAAgB;wBAChB,QAAQ;wBACR,aAAa;wBACb,cAAc;wBACd,OAAO;wBACP,MAAM;wBACN,UAAU;AACX,qBAAA,EAAA,QAAA,EAAA,shXAAA,EAAA,MAAA,EAAA,CAAA,+4RAAA,EAAA,guEAAA,CAAA,EAAA;AAqB2C,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,sBAAsB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACrB,uBAAuB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAC1B,oBAAoB,uFAExB,UAAU,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AElGlD;;;;;;;;;;;;AAY8F;AAExF,MAAgB,mBAAsD,SAAQ,gBAA0B,CAAA;AAC3F,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEvC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,GAAG;gBAAE;AACV,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa;AACjC,YAAA,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,KAAK,OAAO;AACpD,YAAA,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,KAAK,CAAC,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,EAAE;AAChE,gBAAA,OAAO,CAAC,KAAK,GAAG,UAAU;YAC5B;AACF,QAAA,CAAC,CAAC;IACJ;AAOmB,IAAA,KAAK,CAAC,GAAW,EAAA;QAClC,IAAI,GAAG,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAC3B,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC7B;AAAE,QAAA,MAAM;;AAEN,YAAA,OAAO,IAAI;QACb;IACF;IAEmB,UAAU,GAAA;AAC3B,QAAA,OAAO,IAAI;IACb;AAEmB,IAAA,OAAO,CAAC,KAAe,EAAA;QACxC,OAAO,KAAK,KAAK,IAAI;IACvB;;AAGmB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,OAAO,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACpD,CAAC;qFAAC;AAEF;;AAE4D;AACnD,IAAA,WAAW,GAAG,KAAK;+FAA8B;AAEzC,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAC3C,IAAA,UAAU,GAAG,CAAA,uBAAA,EAA0B,IAAI,CAAC,GAAG,EAAE;AACjD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;uFAAC;IACtE,eAAe,GAAG,QAAQ,CAAC,MAC5C,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;wFAC7E;uGA1DmB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBADxC;;;ACED;;AAEqD;AACrD,MAAM,WAAW,GAAI,UAAoD,CAAC,QAAQ;AAClF,IAAI,OAAO,WAAW,KAAK,WAAW,EAAE;IACtC,MAAM,IAAI,KAAK,CACb,CAAA,0DAAA,CAA4D;QAC1D,CAAA,0FAAA,CAA4F;AAC5F,QAAA,CAAA,+CAAA,CAAiD,CACpD;AACH;AACO,MAAM,QAAQ,GAAiB,WAAW;;ACxBjD;;;;;;AAMG;AAOG,MAAO,WACX,SAAQ,mBAAgD,CAAA;AAGxD;;AAEoB;IACpB,KAAK,GAAG,KAAK,CAAqC,IAAI;8EAAC;AAEpC,IAAA,UAAU,CAAC,GAAW,EAAA;QACvC,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;IACrC;AAEmB,IAAA,SAAS,CAAC,KAAkC,EAAA;AAC7D,QAAA,OAAO,KAAK,CAAC,QAAQ,EAAE;IACzB;uGAfW,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,uQCrBxB,ujEAwEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ujEAAA,EAAA;;;AEVjD;;;;;;AAMG;AAOG,MAAO,WACX,SAAQ,mBAAgD,CAAA;AAGxD;;AAEoB;IACpB,KAAK,GAAG,KAAK,CAAqC,IAAI;8EAAC;AAEpC,IAAA,UAAU,CAAC,GAAW,EAAA;QACvC,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;IACrC;AAEmB,IAAA,SAAS,CAAC,KAAkC,EAAA;;QAE7D,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IACnD;uGAhBW,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,uQCrBxB,ujEAwEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ujEAAA,EAAA;;;AEVjD;;;;;;;AAOG;AAOG,MAAO,eACX,SAAQ,mBAAoD,CAAA;AAG5D;;AAEoB;IACpB,KAAK,GAAG,KAAK,CAAyC,IAAI;8EAAC;AAExC,IAAA,UAAU,CAAC,GAAW,EAAA;QACvC,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;IACzC;AAEmB,IAAA,SAAS,CAAC,KAAsC,EAAA;;QAEjE,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IACnD;uGAhBW,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,4QCtB5B,ikEAwEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,eAAe,EAAA,UAAA,EAAA,CAAA;kBAN3B,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ikEAAA,EAAA;;;AEXjD;;;;;;;AAOG;AAOG,MAAO,gBACX,SAAQ,mBAAqD,CAAA;AAG7D;;AAEoB;IACpB,KAAK,GAAG,KAAK,CAA0C,IAAI;8EAAC;AAEzC,IAAA,UAAU,CAAC,GAAW,EAAA;QACvC,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1C;AAEmB,IAAA,SAAS,CAAC,KAAuC,EAAA;AAClE,QAAA,OAAO,KAAK,CAAC,QAAQ,EAAE;IACzB;uGAfW,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,6QCtB7B,wjEAwEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;+BACE,qBAAqB,EAAA,OAAA,EACtB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wjEAAA,EAAA;;;AEhBjD;;AAEqG;MAExF,OAAO,CAAA;AAClB;;AAE6C;IAC7C,UAAU,GAAA;AACR,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE;IAClC;AAEA;AACwD;IACxD,GAAG,GAAA;AACD,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE;IAC/B;AAEA;AACwD;IACxD,KAAK,GAAA;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACrD;uGAlBW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAP,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,OAAO,cADM,MAAM,EAAA,CAAA;;2FACnB,OAAO,EAAA,UAAA,EAAA,CAAA;kBADnB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAsBlC;AAC8G;AACxG,MAAO,YAAa,SAAQ,OAAO,CAAA;AAepB,IAAA,YAAA;AACA,IAAA,IAAA;AAfnB;;;;;;;;;;;;AAYG;IACH,WAAA,CACmB,YAAuC,EACvC,IAAY,EAAA;AAE7B,QAAA,KAAK,EAAE;QAHU,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,IAAI,GAAJ,IAAI;IAGvB;IAES,UAAU,GAAA;QACjB,OAAO,IAAI,CAAC,IAAI;IAClB;IAES,GAAG,GAAA;QACV,OAAO,IAAI,CAAC,YAAY;IAC1B;IAES,KAAK,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;IACtE;AACD;;ACrDD;;;;;;;;;;;;;AAaG;AAOG,MAAO,cACX,SAAQ,mBAA8C,CAAA;AAGrC,IAAA,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;AAExC;;AAEoB;IACpB,KAAK,GAAG,KAAK,CAAmC,IAAI;8EAAC;;;AAIlC,IAAA,UAAU,CAAC,GAAW,EAAA;QACvC,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE;IAC9F;;AAGmB,IAAA,SAAS,CAAC,KAAgC,EAAA;QAC3D,OAAO,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IACjH;uGApBW,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,0QC7B3B,ikEAwEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/CY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,SAAS;+BACE,kBAAkB,EAAA,OAAA,EACnB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ikEAAA,EAAA;;;AEbjD;;;;;;;;;;;;;;;;AAgBG;MAEU,kBAAkB,CAAA;AACZ,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAC1B,IAAA,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;IAExC,SAAS,CAAC,KAA6C,EAAE,OAAoC,EAAA;QAC3F,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;AAC5B,QAAA,IAAI,KAAK,YAAY,QAAQ,CAAC,OAAO,EAAE;YACrC,OAAO,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;QAC/F;QACA,OAAO,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;IACnD;uGAVW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,IAAI;mBAAC,EAAE,IAAI,EAAE,cAAc,EAAE;;;AC9B9B;;AAEG;;;;"}
1
+ {"version":3,"file":"ktortu-aaa-forms.mjs","sources":["../../../../projects/ktortu/aaa/forms/field/field-config.ts","../../../../projects/ktortu/aaa/forms/field/field-control.ts","../../../../projects/ktortu/aaa/forms/field/field.ts","../../../../projects/ktortu/aaa/forms/field/field.html","../../../../projects/ktortu/aaa/forms/base-input/base-input.ts","../../../../projects/ktortu/aaa/forms/datalist.ts","../../../../projects/ktortu/aaa/forms/number-field/number-field.ts","../../../../projects/ktortu/aaa/forms/number-field/number-field.html","../../../../projects/ktortu/aaa/forms/text-area/text-area.ts","../../../../projects/ktortu/aaa/forms/text-area/text-area.html","../../../../projects/ktortu/aaa/forms/text-field/text-field.ts","../../../../projects/ktortu/aaa/forms/text-field/text-field.html","../../../../projects/ktortu/aaa/forms/switch/switch.ts","../../../../projects/ktortu/aaa/forms/checkbox/checkbox-group.ts","../../../../projects/ktortu/aaa/forms/checkbox/checkbox.ts","../../../../projects/ktortu/aaa/forms/radio/radio-group.ts","../../../../projects/ktortu/aaa/forms/radio/radio.ts","../../../../projects/ktortu/aaa/forms/select/select-config.ts","../../../../projects/ktortu/aaa/forms/keyish.ts","../../../../projects/ktortu/aaa/forms/base-select/base-select.ts","../../../../projects/ktortu/aaa/forms/select/select-option-def.ts","../../../../projects/ktortu/aaa/forms/select/select.ts","../../../../projects/ktortu/aaa/forms/select/select.html","../../../../projects/ktortu/aaa/forms/select/select-config.directive.ts","../../../../projects/ktortu/aaa/forms/chips/chip-transition-scope.ts","../../../../projects/ktortu/aaa/forms/chips/chip.ts","../../../../projects/ktortu/aaa/forms/chips/chip.html","../../../../projects/ktortu/aaa/forms/chips/chip-item-def.ts","../../../../projects/ktortu/aaa/forms/chips/chips-config.ts","../../../../projects/ktortu/aaa/forms/chips/chip-list.ts","../../../../projects/ktortu/aaa/forms/chips/chip-list.html","../../../../projects/ktortu/aaa/forms/multi-select/multi-select-option-def.ts","../../../../projects/ktortu/aaa/forms/multi-select/multi-select.ts","../../../../projects/ktortu/aaa/forms/multi-select/multi-select.html","../../../../projects/ktortu/aaa/forms/base-temporal-field.ts","../../../../projects/ktortu/aaa/forms/base-time-temporal-field.ts","../../../../projects/ktortu/aaa/forms/temporal/temporal.ts","../../../../projects/ktortu/aaa/forms/date-field/date-field.ts","../../../../projects/ktortu/aaa/forms/date-field/date-field.html","../../../../projects/ktortu/aaa/forms/time-field/time-field.ts","../../../../projects/ktortu/aaa/forms/time-field/time-field.html","../../../../projects/ktortu/aaa/forms/date-time-field/date-time-field.ts","../../../../projects/ktortu/aaa/forms/date-time-field/date-time-field.html","../../../../projects/ktortu/aaa/forms/year-month-field/year-month-field.ts","../../../../projects/ktortu/aaa/forms/year-month-field/year-month-field.html","../../../../projects/ktortu/aaa/forms/temporal/clock.ts","../../../../projects/ktortu/aaa/forms/instant-field/instant-field.ts","../../../../projects/ktortu/aaa/forms/instant-field/instant-field.html","../../../../projects/ktortu/aaa/forms/temporal/temporal-date.pipe.ts","../../../../projects/ktortu/aaa/forms/ktortu-aaa-forms.ts"],"sourcesContent":["import { InjectionToken, Provider, Signal } from '@angular/core';\n\n/** État d'un champ pertinent pour décider de l'affichage des erreurs. */\nexport interface KtFieldErrorState {\n /** Le champ est-il en erreur de validation. */\n invalid: boolean;\n /** Le champ a-t-il été visité (blur). */\n touched: boolean;\n /** Le champ a-t-il été modifié depuis sa valeur initiale. */\n dirty: boolean;\n}\n\n/** Décide QUAND afficher les erreurs d'un champ (équivalent signal de l'ErrorStateMatcher Material). */\nexport type KtFieldErrorMatcher = (state: KtFieldErrorState) => boolean;\n\n/** Apparence du chrome de champ. `fill` = label au-dessus (défaut historique) ; `outline` = bordure\n + label flottant qui se loge dans la bordure (transition douce depuis Angular Material « outline »). */\nexport type KtFieldAppearance = 'fill' | 'outline';\n\n/** Politique du label flottant (apparence `outline` uniquement). `auto` = flotte au focus / quand le\n champ est rempli ; `always` = toujours flotté, même vide (le placeholder s'affiche alors). Équivaut\n au `floatLabel` d'Angular Material. */\nexport type KtFloatLabel = 'auto' | 'always';\n\n/** Défaut : afficher l'erreur une fois le champ quitté (blur). */\nexport const defaultKtFieldErrorMatcher: KtFieldErrorMatcher = (state) => state.invalid && state.touched;\n\n/** Défauts applicables à tous les champs (surchargeables par champ via les inputs).\n Lib neutre i18n : les textes sont fournis par le consommateur, ici en une fois.\n Fourni en `Partial` : un consommateur n'override que ce qu'il veut. */\nexport interface KtFieldConfig {\n /** Libellé accessible du bouton d'effacement. */\n clearLabel: string;\n /** Libellé accessible du bouton d'aide (i18n). */\n helpLabel: string;\n /** Quand afficher les erreurs. Défaut : `invalid && touched`. */\n errorMatcher: KtFieldErrorMatcher;\n /** Masquer le hint quand l'erreur s'affiche (façon Material). Défaut : `false`. */\n hideHintWhenInvalid: boolean;\n /** Afficher toutes les erreurs au lieu de la première seule. Défaut : `false`. */\n showAllErrors: boolean;\n /** Message d'erreur d'un `kt-number-field` quand la saisie n'est pas un nombre valide.\n Défaut (anglais neutre) : `'Please enter a valid number.'`. */\n numberParseError: string;\n /** Apparence par défaut de tous les champs (`fill` | `outline`). Défaut : `'fill'`. */\n appearance: KtFieldAppearance;\n /** Politique du label flottant en `outline` (`auto` | `always`). Défaut : `'auto'`. */\n floatLabel: KtFloatLabel;\n}\n\nexport const KT_FIELD_CONFIG = new InjectionToken<Partial<KtFieldConfig>>('KT_FIELD_CONFIG');\n\n/**\n * Fournit des défauts de champ (apparence, libellés, matcher d'erreurs…) pour un sous-arbre ou\n * l'application entière. Idéal pour une transition globale — ex. tout passer en `outline` façon\n * Material en un seul provider.\n *\n * @example\n * ```ts\n * // app.config.ts\n * providers: [provideKtField({ appearance: 'outline' })]\n * ```\n */\nexport function provideKtField(config: Partial<KtFieldConfig>): Provider {\n return { provide: KT_FIELD_CONFIG, useValue: config };\n}\n\n/** Parent field interface representing shared states for its controls. */\nexport interface KtFieldParent {\n /** id de base du champ, posé sur le contrôle (`[id]`). */\n readonly baseId: Signal<string>;\n /** Valeur de `aria-describedby` à câbler sur le contrôle (ou `null`). */\n readonly describedBy: Signal<string | null>;\n /** Le champ est-il en erreur (pose `aria-invalid`). */\n readonly invalid: Signal<boolean>;\n /** Le champ est-il requis (pose `aria-required`). */\n readonly required: Signal<boolean>;\n}\n\nexport const KT_FIELD = new InjectionToken<KtFieldParent>('KT_FIELD');\n","import { Directive, ElementRef, computed, inject } from '@angular/core';\nimport { KT_FIELD } from './field-config';\n\n/** Marque le contrôle (natif ou custom) d'un champ pour que `Field` y câble l'a11y\n (id, aria-describedby, aria-invalid, aria-required).\n\n @example\n ```html\n <kt-field label=\"E-mail\" [invalid]=\"invalid()\" [errors]=\"errors()\">\n <input ktFieldControl type=\"email\" [(ngModel)]=\"email\" />\n </kt-field>\n ``` */\n@Directive({\n selector: '[ktFieldControl]',\n host: {\n '[id]': 'id()',\n '[attr.aria-describedby]': 'describedBy()',\n '[attr.aria-invalid]': 'invalid() ? \"true\" : null',\n '[attr.aria-required]': 'required() ? \"true\" : null',\n },\n})\nexport class KtFieldControl {\n private readonly parent = inject(KT_FIELD, { optional: true });\n\n protected readonly id = computed(() => this.parent?.baseId() ?? null);\n protected readonly describedBy = computed(() => this.parent?.describedBy() ?? null);\n protected readonly invalid = computed(() => this.parent?.invalid() ?? false);\n protected readonly required = computed(() => this.parent?.required() ?? false);\n\n /** Élément DOM hôte du contrôle (exposé pour le focus / la mesure par le parent). */\n readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { KtFieldControl } from './field-control';\nimport {\n KT_FIELD_CONFIG,\n KT_FIELD,\n type KtFieldParent,\n type KtFieldAppearance,\n type KtFloatLabel,\n} from './field-config';\nimport { KtTooltip } from '@ktortu/aaa/tooltip';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Forme minimale d'une erreur affichable — découple `Field` de Signal Forms. */\nexport interface KtFieldError {\n /** Identifiant du type d'erreur (ex. `'required'`, `'email'`). */\n kind: string;\n /** Message lisible affiché à l'utilisateur (optionnel). */\n message?: string;\n}\n\n/** Chrome de champ agnostique du système de forms : label + contrôle projeté + hint + erreur,\n et centralisation du câblage a11y. Nourri par des inputs simples.\n\n @example\n ```html\n <kt-field label=\"E-mail\" hint=\"Nous ne partagerons jamais votre adresse.\" [invalid]=\"emailInvalid()\" [errors]=\"emailErrors()\" required>\n <input ktFieldControl type=\"email\" [(ngModel)]=\"email\" />\n </kt-field>\n ``` */\n@Component({\n selector: 'kt-field',\n imports: [KtTooltip],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './field.css',\n templateUrl: './field.html',\n host: {\n '[attr.data-appearance]': 'resolvedAppearance()',\n '[attr.data-float-label]': 'resolvedFloatLabel()',\n },\n providers: [{ provide: KT_FIELD, useExisting: forwardRef(() => KtField) }],\n})\nexport class KtField implements KtFieldParent {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Libellé du champ. @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le contrôle. @default undefined */\n readonly hint = input<string>();\n /** Contenu de l'aide contextuelle (texte ou `TemplateRef`) rendu dans le tooltip d'aide. @default undefined */\n readonly helpText = input<string | TemplateRef<unknown>>();\n /** Libellé accessible du déclencheur d'aide. @default KT_FIELD_CONFIG.helpLabel ?? 'Help' */\n readonly helpLabel = input<string>(this.config?.helpLabel ?? 'Help');\n /** id(s) externe(s) à ajouter à l'`aria-describedby` du contrôle (découplage). @default undefined */\n readonly customDescribedBy = input<string>();\n /** Émis au clic sur le déclencheur d'aide (le `preventDefault`/`stopPropagation` est déjà appliqué). */\n readonly helpClick = output<MouseEvent>();\n /** Erreurs de validation à afficher sous le contrôle. @default [] */\n readonly errors = input<readonly KtFieldError[]>([]);\n /** Marque le champ comme invalide (pose `aria-invalid` et conditionne l'affichage des erreurs). @default false */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Affiche l'astérisque requis et pose `aria-required` sur le contrôle. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly fieldId = input<string>();\n /** Masquer le hint quand l'erreur s'affiche (façon Material). @default KT_FIELD_CONFIG.hideHintWhenInvalid ?? false */\n readonly hideHintWhenInvalid = input<boolean, unknown>(this.config?.hideHintWhenInvalid ?? false, {\n transform: booleanAttribute,\n });\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean, unknown>(this.config?.showAllErrors ?? false, {\n transform: booleanAttribute,\n });\n /** Apparence du chrome : `fill` (label au-dessus) ou `outline` (bordure + label flottant, façon\n Material). Non fournie ⇒ valeur du `KT_FIELD_CONFIG`, sinon `'fill'`. @default undefined */\n readonly appearance = input<KtFieldAppearance>();\n\n /** Apparence effective : input ?? KT_FIELD_CONFIG.appearance ?? 'fill'. */\n protected readonly resolvedAppearance = computed<KtFieldAppearance>(\n () => this.appearance() ?? this.config?.appearance ?? 'fill',\n );\n\n /** Politique du label flottant (outline) : `auto` (flotte au focus/rempli) ou `always` (toujours\n flotté, même vide). Non fournie ⇒ valeur du `KT_FIELD_CONFIG`, sinon `'auto'`. @default undefined */\n readonly floatLabel = input<KtFloatLabel>();\n\n /** Politique effective : input ?? KT_FIELD_CONFIG.floatLabel ?? 'auto'. */\n protected readonly resolvedFloatLabel = computed<KtFloatLabel>(\n () => this.floatLabel() ?? this.config?.floatLabel ?? 'auto',\n );\n\n // Le contrôle est projeté : l'injection DI ne le traverse pas, on le cible via contentChild.\n private readonly control = contentChild(KtFieldControl);\n\n // Détecte le tooltip d'aide standard défini dans field.html (input DX)\n private readonly templateTooltip = viewChild(KtTooltip);\n // Détecte un tooltip d'aide custom projeté dans le slot ktFieldHelp\n private readonly projectedTooltip = contentChild(KtTooltip, { descendants: true });\n\n // Résout le tooltip actif\n private readonly activeTooltip = computed(() => this.projectedTooltip() ?? this.templateTooltip());\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('field');\n readonly baseId = computed(() => this.fieldId() ?? `kt-field-${this.uid}`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n protected readonly hasError = computed(() => this.invalid() && this.errors().length > 0);\n\n // Hint visible sauf s'il est masqué en erreur (option façon Material).\n protected readonly showHint = computed(() => !!this.hint() && !(this.hideHintWhenInvalid() && this.invalid()));\n\n // Première erreur seule par défaut ; toutes si showAllErrors.\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.showHint()) ids.push(this.hintId());\n if (this.hasError()) ids.push(this.errorId());\n\n // Liaison a11y automatique avec le Tooltip d'aide actif (si présent et actif)\n const tooltip = this.activeTooltip();\n if (tooltip && tooltip.isActive()) {\n ids.push(tooltip.idForA11y);\n }\n\n // Ajout de l'ID personnalisé externe (decouplage complet)\n const custom = this.customDescribedBy();\n if (custom) ids.push(custom);\n\n return ids.length ? ids.join(' ') : null;\n });\n\n protected onHelpClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.helpClick.emit(event);\n }\n}\n","<div class=\"kt-field__header\">\n @if (label(); as labelText) {\n <label class=\"kt-field__label\" [id]=\"labelId()\" [for]=\"baseId()\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-field__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n @if (helpText(); as help) {\n <button\n type=\"button\"\n class=\"kt-field__help\"\n [ktTooltip]=\"help\"\n [attr.aria-label]=\"helpLabel()\"\n [attr.aria-describedby]=\"null\"\n (click)=\"onHelpClick($event)\"\n >\n <span class=\"kt-field__help-icon\" aria-hidden=\"true\">help</span>\n </button>\n }\n\n <ng-content select=\"[ktFieldHelp]\" />\n</div>\n\n<div class=\"kt-field__control\">\n <ng-content />\n</div>\n\n@if (showHint()) {\n <p class=\"kt-field__hint\" [id]=\"hintId()\">{{ hint() }}</p>\n}\n\n<!-- Région live toujours présente : les AT annoncent l'erreur dès son apparition. -->\n<p class=\"kt-field__error\" [id]=\"errorId()\" aria-live=\"polite\">\n @if (hasError()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-field__error-message\">{{ error.message }}</span>\n }\n }\n</p>\n","import {\n Directive,\n ElementRef,\n ModelSignal,\n TemplateRef,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n output,\n viewChild,\n} from '@angular/core';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport {\n KT_FIELD_CONFIG,\n KtFieldErrorMatcher,\n defaultKtFieldErrorMatcher,\n type KtFieldAppearance,\n type KtFloatLabel,\n} from '../field/field-config';\n\n/** Base partagée des champs simples (TextField, NumberField) : état FormValueControl,\n présentation (label/hint/prefix/suffix/clear) et politique d'affichage des erreurs.\n La valeur, son parsing et la notion de « vide » sont fournis par la sous-classe.\n\n @example\n ```ts\n // Sous-classement : on fournit value (model concret) + parse/emptyValue/isEmpty.\n @Component({ selector: 'kt-text-field', templateUrl: './text-field.html' })\n export class KtTextField extends KtBaseInputField<string> implements FormValueControl<string> {\n readonly value = model<string>('');\n protected parse(raw: string): string { return raw; }\n protected emptyValue(): string { return ''; }\n protected isEmpty(value: string): boolean { return value.length === 0; }\n }\n ``` */\n@Directive()\nexport abstract class KtBaseInputField<T> {\n protected readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Valeur du contrôle — déclarée concrètement par la sous-classe. */\n abstract value: ModelSignal<T>;\n\n // --- État poussé par [formField] ---\n // Ces entrées sont généralement câblées par l'intégration Signal Forms (`[formField]`) ;\n // tu peux aussi les piloter à la main en usage contrôlé.\n /** Marque le champ comme « visité » (déclenche l'affichage des erreurs). Deux-way. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive la saisie et le focus. @default false */\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Rend le champ en lecture seule (valeur visible, non modifiable). @default false */\n readonly readonly = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Le champ est-il en erreur (état fourni par la validation). @default false */\n readonly invalid = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Marque le champ comme requis (ajoute `aria-required`). @default false */\n readonly required = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Le champ a-t-il été modifié depuis sa valeur initiale. @default false */\n readonly dirty = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Liste des erreurs de validation à afficher. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Attribut `name` natif du contrôle. @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé pour des sélecteurs de test stables ; sinon auto-généré par Field. @default undefined */\n readonly id = input<string>();\n /** Libellé du champ (associé via `<label for>`). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le champ quand il est valide. @default undefined */\n readonly hint = input<string>();\n /** Aide contextuelle riche : texte ou `TemplateRef` projeté dans une infobulle d'aide. @default undefined */\n readonly helpText = input<string | TemplateRef<unknown>>();\n /** Libellé accessible du bouton d'aide. @default 'Help' (ou KT_FIELD_CONFIG.helpLabel) */\n readonly helpLabel = input<string>(this.config?.helpLabel ?? 'Help');\n /** Force la valeur de `aria-describedby` (sinon dérivée de hint/erreur). @default undefined */\n readonly customDescribedBy = input<string>();\n /** Émis au clic sur le bouton d'aide contextuelle. */\n readonly helpClick = output<MouseEvent>();\n /** Texte indicatif affiché dans le champ vide. @default undefined */\n readonly placeholder = input<string>();\n /** Indice d'autoremplissage du navigateur (attribut `autocomplete` natif) ; ex. `'current-password'`,\n `'new-password'`, `'email'`, `'username'`, `'off'`.\n @default undefined */\n readonly autocomplete = input<AutoFill>();\n /** Nom d'icône Material Symbols affichée en tête de champ. @default undefined */\n readonly icon = input<string>();\n /** Affiche un bouton « effacer » quand le champ contient une valeur. @default false */\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Contenu décoratif en tête de champ : texte ou `TemplateRef`. @default undefined */\n readonly prefix = input<string | TemplateRef<unknown>>();\n /** Contenu décoratif en fin de champ : texte ou `TemplateRef`. @default undefined */\n readonly suffix = input<string | TemplateRef<unknown>>();\n /** Libellé i18n du bouton « effacer ». @default 'Clear' (ou KT_FIELD_CONFIG.clearLabel) */\n readonly clearLabel = input<string>(this.config?.clearLabel ?? 'Clear');\n /** Quand afficher l'erreur ; surcharge KT_FIELD_CONFIG et le défaut (`invalid && touched`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Apparence du chrome (`fill` | `outline`) ; non fournie ⇒ `KT_FIELD_CONFIG.appearance` ?? `'fill'`.\n @default undefined */\n readonly appearance = input<KtFieldAppearance>();\n /** Politique du label flottant en outline (`auto` | `always`) ; non fournie ⇒ `KT_FIELD_CONFIG.floatLabel`\n ?? `'auto'`. En `always`, le label reste en haut même vide et le placeholder s'affiche. @default undefined */\n readonly floatLabel = input<KtFloatLabel>();\n\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement | HTMLTextAreaElement>>('input');\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n // L'erreur ne s'affiche qu'au déclenchement décidé par le matcher (invalid/touched/dirty).\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly showClear = computed(\n () => this.clearable() && !this.disabled() && !this.readonly() && !this.isEmpty(this.value()),\n );\n\n /** Apparence effective (input ?? config ?? 'fill'). Sert aux templates : forward à `kt-field` et,\n en outline, pose une sentinelle de placeholder pour la détection « rempli » du label flottant. */\n protected readonly outline = computed(() => (this.appearance() ?? this.config?.appearance ?? 'fill') === 'outline');\n\n /** Label toujours flotté en outline (input ?? config ?? 'auto'). */\n protected readonly alwaysFloat = computed(\n () => (this.floatLabel() ?? this.config?.floatLabel ?? 'auto') === 'always',\n );\n\n /** Valeur de l'attribut `placeholder` natif selon l'apparence :\n - fill : le placeholder tel quel ;\n - outline + always : le vrai placeholder (le label est en haut, pas de chevauchement) ;\n - outline + auto : sentinelle `' '` (le label tient lieu de placeholder ; active `:placeholder-shown`). */\n protected readonly placeholderAttr = computed<string | null>(() => {\n if (!this.outline()) return this.placeholder() ?? null;\n if (this.alwaysFloat()) return this.placeholder() ?? null;\n return this.placeholder() ?? ' ';\n });\n\n protected asTemplate(value: string | TemplateRef<unknown> | undefined): TemplateRef<unknown> | null {\n return value instanceof TemplateRef ? value : null;\n }\n\n protected asText(value: string | TemplateRef<unknown> | undefined): string | null {\n return typeof value === 'string' ? value : null;\n }\n\n protected onInput(event: Event): void {\n this.value.set(this.parse((event.target as HTMLInputElement | HTMLTextAreaElement).value));\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.showClear()) {\n event.preventDefault();\n this.clear();\n }\n }\n\n protected clear(): void {\n this.value.set(this.emptyValue());\n this.touched.set(true);\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Parse la saisie brute en valeur typée. */\n protected abstract parse(raw: string): T;\n /** Représentation « vide » de la valeur. */\n protected abstract emptyValue(): T;\n /** La valeur est-elle vide (affichage du bouton d'effacement) ? */\n protected abstract isEmpty(value: T): boolean;\n}\n","/** Suggestion d'un champ de saisie (rendu `<datalist>`) : soit la valeur seule, soit un couple\n `{ value, label }` où `label` est le texte affiché et `value` ce qui est inséré dans le champ.\n @template V Type de la valeur du champ (string, number, ou type Temporal selon le champ). */\nexport type KtSuggestion<V> = V | { value: V; label?: string };\n\n/** Option `<datalist>` normalisée : `value` est la chaîne posée sur l'attribut DOM, `label` le\n libellé affiché (ou `null`). */\nexport interface KtDatalistOption {\n value: string;\n label: string | null;\n}\n\n/** Normalise une liste de suggestions en options `<datalist>`. `toValue` sérialise la valeur en\n chaîne attendue par l'input natif (identité pour le texte, `String()` pour les nombres,\n `serialize()` pour les champs Temporal). */\nexport function normalizeKtSuggestions<V>(\n suggestions: readonly KtSuggestion<V>[] | undefined,\n toValue: (value: V) => string,\n): readonly KtDatalistOption[] {\n if (!suggestions) return [];\n return suggestions.map((suggestion) => {\n if (typeof suggestion === 'object' && suggestion !== null && 'value' in suggestion) {\n return { value: toValue(suggestion.value), label: suggestion.label ?? null };\n }\n return { value: toValue(suggestion as V), label: null };\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl, transformedValue } from '@angular/forms/signals';\nimport { KtBaseInputField } from '../base-input/base-input';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { type KtSuggestion, normalizeKtSuggestions } from '../datalist';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Champ numérique : valeur `number | null` (champ vide ⇒ `null`, jamais `NaN`), intégré aux\n * Signal Forms via `FormValueControl`. Hérite de la présentation commune (label/hint/clear/\n * préfixe/suffixe/erreurs) de `KtBaseInputField`.\n *\n * @example\n * ```html\n * <kt-number-field label=\"Quantité\" [(value)]=\"qty\" [min]=\"0\" [step]=\"1\" />\n * ```\n */\n@Component({\n selector: 'kt-number-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './number-field.html',\n})\nexport class KtNumberField extends KtBaseInputField<number | null> implements FormValueControl<number | null> {\n /** Valeur saisie (two-way). `null` = champ vide. @default null */\n readonly value = model<number | null>(null);\n /** Borne minimale (attribut `min` natif). @default undefined */\n readonly min = input<number>();\n /** Borne maximale (attribut `max` natif). @default undefined */\n readonly max = input<number>();\n /** Pas d'incrément (attribut `step` natif). @default undefined */\n readonly step = input<number>();\n /** Suggestions d'autocomplétion proposées via un `<datalist>` natif (la saisie reste libre).\n Valeurs simples (`number[]`) ou couples `{ value, label }` pour distinguer libellé affiché et\n valeur insérée. @default undefined */\n readonly suggestions = input<readonly KtSuggestion<number>[]>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('number-field');\n protected readonly datalistId = `kt-number-field-list-${this.uid}`;\n protected readonly hasSuggestions = computed(() => (this.suggestions()?.length ?? 0) > 0);\n protected readonly datalistOptions = computed(() =>\n normalizeKtSuggestions(this.suggestions(), (value) => String(value)),\n );\n\n // Chemin de valeur unique : `parse()` (contrat de `KtBaseInputField`) est la SEULE source de\n // vérité du parsing numérique ; `transformedValue` ne fait que l'envelopper pour émettre une\n // erreur de validation Signal Forms sur une saisie non numérique (et formater pour l'affichage).\n protected readonly rawValue = transformedValue(this.value, {\n parse: (val: string) => {\n const trimmed = val.trim().replace(',', '.');\n if (trimmed !== '' && Number.isNaN(Number(trimmed))) {\n // Défaut anglais neutre ; surchargeable via KT_FIELD_CONFIG.numberParseError (cf. provideKtDefaultFR).\n return {\n error: { kind: 'parse', message: this.config?.numberParseError ?? 'Please enter a valid number.' },\n };\n }\n return { value: this.parse(val) };\n },\n format: (val) => (val === null ? '' : String(val)),\n });\n\n protected parse(raw: string): number | null {\n const trimmed = raw.trim().replace(',', '.');\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n }\n\n protected override onKeyDown(event: KeyboardEvent): void {\n if (this.disabled() || this.readonly()) return;\n\n super.onKeyDown(event);\n if (event.defaultPrevented) return;\n\n if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return;\n\n const isUp = event.key === 'ArrowUp';\n this.adjustValue(isUp);\n event.preventDefault();\n }\n\n private adjustValue(isUp: boolean): void {\n const step = this.step() ?? 1;\n const min = this.min();\n const max = this.max();\n\n let newValue: number;\n\n if (this.value() === null) {\n if (min !== undefined) {\n newValue = min;\n } else if (max !== undefined) {\n newValue = max;\n } else {\n newValue = 0;\n }\n } else {\n const currentValue = this.value()!;\n newValue = isUp ? currentValue + step : currentValue - step;\n }\n\n if (min !== undefined && newValue < min) {\n newValue = min;\n }\n if (max !== undefined && newValue > max) {\n newValue = max;\n }\n\n // Arrondi pour éviter les erreurs de virgule flottante JS\n const stepStr = String(step);\n const decimalIdx = stepStr.indexOf('.');\n if (decimalIdx !== -1) {\n const precision = stepStr.length - decimalIdx - 1;\n newValue = Number(newValue.toFixed(precision));\n }\n\n this.value.set(newValue);\n }\n\n protected emptyValue(): number | null {\n return null;\n }\n\n protected isEmpty(value: number | null): boolean {\n return value === null;\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"text\"\n inputmode=\"decimal\"\n role=\"spinbutton\"\n [attr.aria-valuemin]=\"min() ?? null\"\n [attr.aria-valuemax]=\"max() ?? null\"\n [attr.aria-valuenow]=\"value() ?? null\"\n [value]=\"rawValue()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholderAttr()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.min]=\"min() ?? null\"\n [attr.max]=\"max() ?? null\"\n [attr.step]=\"step() ?? null\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"rawValue.set($event.target.value)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseInputField } from '../base-input/base-input';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\n\n/**\n * Zone de texte multi-ligne (valeur `string`) intégrée aux Signal Forms via `FormValueControl`.\n * Autosize en CSS (`field-sizing: content`) ; hérite de la présentation commune de `KtBaseInputField`.\n *\n * @example\n * ```html\n * <kt-text-area label=\"Commentaire\" [(value)]=\"comment\" [rows]=\"4\" />\n * ```\n */\n@Component({\n selector: 'kt-text-area',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './text-area.html',\n})\nexport class KtTextArea extends KtBaseInputField<string> implements FormValueControl<string> {\n /** Valeur saisie (two-way). @default '' */\n readonly value = model<string>('');\n /** Hauteur initiale (lignes). L'autosize est géré en CSS via `field-sizing: content`. @default 3 */\n readonly rows = input<number>(3);\n /** Plafond de caractères ; poussé par le form (validateur maxLength) ou par le consommateur. @default undefined */\n readonly maxLength = input<number>();\n\n protected parse(raw: string): string {\n return raw;\n }\n\n protected emptyValue(): string {\n return '';\n }\n\n protected isEmpty(value: string): boolean {\n return value.length === 0;\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n data-multiline\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <textarea\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n [value]=\"value()\"\n [rows]=\"rows()\"\n [style.min-height.lh]=\"rows()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholderAttr()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.maxlength]=\"maxLength() ?? null\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"onInput($event)\"\n (blur)=\"touched.set(true)\"\n ></textarea>\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseInputField } from '../base-input/base-input';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { type KtSuggestion, normalizeKtSuggestions } from '../datalist';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Types texte dont la valeur reste une string (number/date = composants séparés). */\nexport type KtTextFieldType = 'text' | 'email' | 'password' | 'search' | 'tel' | 'url';\n\n/**\n * Champ texte (valeur `string`) intégré aux Signal Forms via `FormValueControl`. Hérite de la\n * présentation commune (label/hint/clear/préfixe/suffixe/erreurs) de `KtBaseInputField`.\n *\n * @example\n * ```html\n * <kt-text-field label=\"E-mail\" type=\"email\" [(value)]=\"email\" required />\n * ```\n */\n@Component({\n selector: 'kt-text-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './text-field.html',\n})\nexport class KtTextField extends KtBaseInputField<string> implements FormValueControl<string> {\n /** Valeur saisie (two-way). @default '' */\n readonly value = model<string>('');\n /** Variante HTML du champ (pilote `type` natif et le clavier mobile). @default 'text' */\n readonly type = input<KtTextFieldType>('text');\n /** Suggestions d'autocomplétion proposées via un `<datalist>` natif (la saisie reste libre).\n Valeurs simples (`string[]`) ou couples `{ value, label }` pour distinguer libellé affiché et\n valeur insérée. @default undefined */\n readonly suggestions = input<readonly KtSuggestion<string>[]>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('text-field');\n protected readonly datalistId = `kt-text-field-list-${this.uid}`;\n protected readonly hasSuggestions = computed(() => (this.suggestions()?.length ?? 0) > 0);\n protected readonly datalistOptions = computed(() => normalizeKtSuggestions(this.suggestions(), (value) => value));\n\n protected parse(raw: string): string {\n return raw;\n }\n\n protected emptyValue(): string {\n return '';\n }\n\n protected isEmpty(value: string): boolean {\n return value.length === 0;\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholderAttr()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"onInput($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import {\n ChangeDetectionStrategy,\n Component,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n isDevMode,\n model,\n} from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Bouton bascule (Switch / Slide-Toggle) accessible conforme aux normes WAI-ARIA.\n * Permet d'activer ou désactiver une option avec effet immédiat.\n * Intégré aux Signal Forms de l'application via FormValueControl.\n *\n * @example\n * ```html\n * <kt-switch label=\"Notifications par e-mail\" [(value)]=\"emailNotif\" />\n * ```\n */\n@Component({\n selector: 'kt-switch',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './switch.css',\n template: `\n <div\n class=\"kt-switch-field\"\n [class.kt-switch-field--invalid]=\"showInvalid()\"\n [class.kt-switch-field--disabled]=\"disabled()\"\n >\n <div class=\"kt-switch-row\">\n <button\n #switchBtn\n type=\"button\"\n role=\"switch\"\n [id]=\"baseId()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [attr.aria-labelledby]=\"label() ? labelId() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [disabled]=\"disabled()\"\n (click)=\"toggle()\"\n (keydown.space)=\"onSpacebar($event)\"\n (blur)=\"touched.set(true)\"\n class=\"kt-switch\"\n >\n <span class=\"kt-switch__thumb\"></span>\n </button>\n\n @if (label(); as labelText) {\n <label [id]=\"labelId()\" [attr.for]=\"baseId()\" class=\"kt-switch-label\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-switch-label__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n </div>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-switch-hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-switch-error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-switch-error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtSwitch implements FormValueControl<boolean> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** État de la bascule (two-way) : `true` = activé, `false` = désactivé. @default false */\n readonly value = model<boolean>(false);\n\n // --- État poussé par [formField] ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive la bascule (non actionnable). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque la bascule comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Affiche l'astérisque requis sur le libellé. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Erreurs de validation à afficher sous la bascule. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Identifiant logique du contrôle (à titre indicatif). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Texte du libellé associé à la bascule. @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous la bascule (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) quand `label` est absent. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean, unknown>(this.config?.showAllErrors ?? false, {\n transform: booleanAttribute,\n });\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('switch');\n protected readonly baseId = computed(() => this.id() ?? `kt-switch-${this.uid}`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n constructor() {\n // Garde-fou a11y (dev, navigateur uniquement) : un switch sans nom accessible est annoncé vide\n // (WCAG 4.1.2). Le nom vient de `label` ou `ariaLabel` (pas de contenu projeté ici).\n afterNextRender(() => {\n if (!isDevMode() || this.label() || this.ariaLabel()) return;\n console.warn('[ktSwitch] sans `label` ni `ariaLabel` : le contrôle est annoncé sans nom accessible (WCAG 4.1.2).');\n });\n }\n\n protected toggle(): void {\n if (this.disabled()) return;\n this.value.update((v) => !v);\n this.touched.set(true);\n }\n\n protected onSpacebar(event: Event): void {\n event.preventDefault(); // évite le scroll de la page au clavier\n this.toggle();\n }\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Groupe de cases à cocher (Checkbox Group) conforme à l'ARIA APG / RGAA.\n * Orchestrateur : porte une valeur TABLEAU (`FormValueControl<V[]>`) et la sémantique de groupe\n * (`role=\"group\"`, légende, `aria-required`/`aria-invalid`, erreurs).\n *\n * Différence APG avec le radio-group : PAS de roving tabindex — chaque `kt-checkbox` reste\n * tabbable et coche/décoche indépendamment. Les options sont fournies par le dev (boucle `@for`\n * ou en dur) ; `compareWith` gère l'égalité quand les valeurs d'option sont des objets.\n *\n * @example\n * ```html\n * <kt-checkbox-group label=\"Centres d'intérêt\" [(value)]=\"interests\" required>\n * <kt-checkbox [optionValue]=\"'sport'\" label=\"Sport\" />\n * <kt-checkbox [optionValue]=\"'musique'\" label=\"Musique\" />\n * <kt-checkbox [optionValue]=\"'cinema'\" label=\"Cinéma\" />\n * </kt-checkbox-group>\n * ```\n */\n@Component({\n selector: 'kt-checkbox-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './checkbox-group.css',\n template: `\n <div\n class=\"kt-checkbox-group-field\"\n [class.kt-checkbox-group-field--invalid]=\"showInvalid()\"\n [class.kt-checkbox-group-field--disabled]=\"disabled()\"\n role=\"group\"\n [attr.aria-labelledby]=\"label() ? labelId() : null\"\n [attr.aria-label]=\"!label() ? resolvedAriaLabel() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n >\n @if (label(); as labelText) {\n <span [id]=\"labelId()\" class=\"kt-checkbox-group__legend\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-checkbox-group__required\" aria-hidden=\"true\">*</span>\n }\n </span>\n }\n\n <div class=\"kt-checkbox-group__options\">\n <ng-content></ng-content>\n </div>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-checkbox-group__hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-checkbox-group__error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-checkbox-group__error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtCheckboxGroup<V> implements FormValueControl<V[]> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Sélection courante : tableau des valeurs d'options cochées (two-way). @default [] */\n readonly value = model<V[]>([]);\n\n // --- État poussé par [formField] ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive le groupe entier (hérité par chaque case enfant). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque le groupe comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Affiche l'astérisque requis et `aria-required` sur le groupe. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Erreurs de validation à afficher sous le groupe. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Nom logique du groupe, à titre INDICATIF : contrairement à `kt-radio-group` (où `name` est\n propagé aux `<input>` natifs pour le regroupement radio), il n'est PAS répercuté sur les cases\n enfants (les checkboxes n'ont pas besoin d'un `name` partagé). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Légende du groupe (`aria-labelledby`). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le groupe (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) du groupe quand `label` est absent. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean, unknown>(this.config?.showAllErrors ?? false, {\n transform: booleanAttribute,\n });\n\n /** Égalité des valeurs en mode objet (défaut : identité `===`). */\n readonly compareWith = input<(a: V, b: V) => boolean>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('checkbox-group');\n protected readonly baseId = computed(() => this.id() ?? `kt-checkbox-group-${this.uid}`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n private readonly comparator = computed(() => this.compareWith() ?? ((a: V, b: V) => a === b));\n\n /** La valeur d'option d'un enfant est-elle dans la sélection ? (lu dans le `computed` enfant) */\n isSelected(optionValue: V): boolean {\n const arr = this.value() ?? [];\n const cmp = this.comparator();\n return arr.some((v) => cmp(v, optionValue));\n }\n\n /** Ajoute/retire une valeur d'option de la sélection (émis par un enfant au `change` natif). */\n toggle(optionValue: V, checked: boolean): void {\n if (this.disabled()) return;\n const arr = this.value() ?? [];\n const cmp = this.comparator();\n const exists = arr.some((v) => cmp(v, optionValue));\n if (checked && !exists) {\n this.value.set([...arr, optionValue]);\n } else if (!checked && exists) {\n this.value.set(arr.filter((v) => !cmp(v, optionValue)));\n }\n this.touched.set(true);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n input,\n inject,\n isDevMode,\n model,\n viewChild,\n} from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtCheckboxGroup } from './checkbox-group';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Case à cocher (Checkbox) accessible conforme aux normes WAI-ARIA / RGAA.\n * Bâtie sur un `<input type=\"checkbox\">` NATIF (clavier, clic-label, état `indeterminate`,\n * mode contraste élevé gratuits), redessinée via `appearance: none` + pseudo-éléments thémés.\n *\n * DEUX MODES, selon la présence d'un `kt-checkbox-group` parent :\n * - Autonome : `value` est l'état coché (`boolean`, two-way), intégré aux Signal Forms via\n * `FormValueControl<boolean>` (même contrat que `kt-switch`).\n * - Dans un groupe : `optionValue` porte la VALEUR d'option représentée ; l'état coché dérive de\n * l'appartenance au tableau du groupe, et le (dé)cochage met à jour ce tableau. `value` est\n * alors ignoré (c'est le groupe qui détient la sélection).\n *\n * Libellé : `label` (texte) par défaut ; un contenu projeté le remplace visuellement pour les\n * rendus riches (carte/option), `ariaLabel` portant alors le nom accessible si besoin.\n *\n * @example\n * ```html\n * <!-- Autonome -->\n * <kt-checkbox label=\"Accepter les conditions\" [(value)]=\"accepted\" required />\n *\n * <!-- Dans un groupe -->\n * <kt-checkbox-group label=\"Centres d'intérêt\" [(value)]=\"interests\">\n * <kt-checkbox [optionValue]=\"'sport'\" label=\"Sport\" />\n * <kt-checkbox [optionValue]=\"'musique'\" label=\"Musique\" />\n * </kt-checkbox-group>\n * ```\n */\n@Component({\n selector: 'kt-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './checkbox.css',\n template: `\n <div\n class=\"kt-checkbox-field\"\n [class.kt-checkbox-field--invalid]=\"showInvalid()\"\n [class.kt-checkbox-field--disabled]=\"isDisabled()\"\n >\n <label class=\"kt-checkbox\">\n <input\n #input\n type=\"checkbox\"\n class=\"kt-checkbox__input\"\n [id]=\"baseId()\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n [attr.name]=\"name() || null\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n (change)=\"onChange($event)\"\n (blur)=\"onBlur()\"\n />\n <span class=\"kt-checkbox__label\">\n <ng-content>{{ label() }}</ng-content>\n @if (required()) {\n <span class=\"kt-checkbox__required\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-checkbox-hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-checkbox-error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-checkbox-error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtCheckbox<V = unknown> implements FormValueControl<boolean> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Groupe parent optionnel : présent ⇒ la case appartient à un `kt-checkbox-group`. */\n protected readonly group = inject(KtCheckboxGroup, { optional: true }) as KtCheckboxGroup<V> | null;\n\n /** État coché (`boolean`, two-way) en mode autonome. Ignoré en mode groupe : c'est alors\n `optionValue` + le tableau du groupe qui font foi. @default false */\n readonly value = model<boolean>(false);\n\n /** Mode groupe uniquement : valeur d'option contribuée au tableau du `kt-checkbox-group` parent\n quand la case est cochée. Sans effet en mode autonome. @default undefined */\n readonly optionValue = input<V>();\n\n /** Tri-état visuel (parent d'une arborescence) : propriété DOM `indeterminate`, pas un attribut. */\n readonly indeterminate = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n // --- État poussé par [formField] (mode autonome) ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive la case (héritable du groupe parent). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque la case comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Affiche l'astérisque requis et `aria-required`. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Erreurs de validation à afficher sous la case. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Attribut `name` du `<input>` natif. @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Texte du libellé (remplacé visuellement par un contenu projeté). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous la case (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) pour une case sans libellé textuel. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean, unknown>(this.config?.showAllErrors ?? false, {\n transform: booleanAttribute,\n });\n\n private readonly inputEl = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('checkbox');\n protected readonly baseId = computed(() => this.id() ?? `kt-checkbox-${this.uid}`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n /** Coché : appartenance au groupe le cas échéant, sinon l'état booléen propre.\n (Nommé `isChecked` car `FormValueControl` réserve la propriété `checked`.) */\n protected readonly isChecked = computed(() =>\n this.group ? this.group.isSelected(this.optionValue() as V) : this.value(),\n );\n\n /** Désactivé : hérité du groupe le cas échéant. */\n protected readonly isDisabled = computed(() => (this.group?.disabled() ?? false) || this.disabled());\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n constructor() {\n // `indeterminate` est une PROPRIÉTÉ (non un attribut) : poussée impérativement sur l'input natif.\n effect(() => {\n this.inputEl().nativeElement.indeterminate = this.indeterminate();\n });\n\n // Garde-fou a11y (dev, navigateur uniquement) : nom accessible = `label`, `ariaLabel` OU contenu\n // projeté. Sans aucun des trois, la case est annoncée vide (WCAG 4.1.2).\n afterNextRender(() => {\n if (!isDevMode() || this.label() || this.ariaLabel()) return;\n const labelText = this.el.nativeElement.querySelector('.kt-checkbox__label')?.textContent?.replace('*', '').trim();\n if (!labelText) {\n console.warn(\n '[ktCheckbox] sans `label`, `ariaLabel` ni contenu projeté : annoncée sans nom accessible (WCAG 4.1.2).',\n );\n }\n });\n }\n\n protected onChange(event: Event): void {\n if (this.isDisabled()) return;\n const checked = (event.target as HTMLInputElement).checked;\n if (this.group) {\n this.group.toggle(this.optionValue() as V, checked);\n this.group.touched.set(true);\n return;\n }\n this.value.set(checked);\n this.touched.set(true);\n }\n\n protected onBlur(): void {\n (this.group?.touched ?? this.touched).set(true);\n }\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { KT_FIELD_CONFIG, type KtFieldErrorMatcher, defaultKtFieldErrorMatcher } from '../field/field-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Groupe de boutons radio (Radio Group) conforme à l'ARIA APG / RGAA.\n * Orchestrateur : porte la valeur (`FormValueControl<V | null>`), génère le `name` partagé et la\n * sémantique de groupe (`role=\"radiogroup\"`, légende, `aria-required`/`aria-invalid`, erreurs).\n *\n * Le clavier (roving tabindex + flèches qui déplacent ET cochent) est laissé au NATIF : les\n * `<input type=\"radio\">` des `kt-radio` enfants partagent le `name` du groupe — rien à réimplémenter.\n * Les options sont fournies par le dev (boucle `@for` ou déclaration en dur) ; `compareWith` gère\n * l'égalité quand `value` est un objet.\n *\n * @example\n * ```html\n * <kt-radio-group label=\"Civilité\" [(value)]=\"civility\" required>\n * <kt-radio [optionValue]=\"'mme'\" label=\"Madame\" />\n * <kt-radio [optionValue]=\"'m'\" label=\"Monsieur\" />\n * <kt-radio [optionValue]=\"'autre'\" label=\"Autre\" />\n * </kt-radio-group>\n * ```\n */\n@Component({\n selector: 'kt-radio-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './radio-group.css',\n template: `\n <div\n class=\"kt-radio-group-field\"\n [class.kt-radio-group-field--invalid]=\"showInvalid()\"\n [class.kt-radio-group-field--disabled]=\"disabled()\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label() ? labelId() : null\"\n [attr.aria-label]=\"!label() ? resolvedAriaLabel() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"showInvalid() ? 'true' : null\"\n >\n @if (label(); as labelText) {\n <span [id]=\"labelId()\" class=\"kt-radio-group__legend\">\n {{ labelText }}\n @if (required()) {\n <span class=\"kt-radio-group__required\" aria-hidden=\"true\">*</span>\n }\n </span>\n }\n\n <div class=\"kt-radio-group__options\">\n <ng-content></ng-content>\n </div>\n\n @if (hint() && !showInvalid()) {\n <p [id]=\"hintId()\" class=\"kt-radio-group__hint\">{{ hint() }}</p>\n }\n <div [id]=\"errorId()\" class=\"kt-radio-group__error\" aria-live=\"polite\">\n @if (showInvalid()) {\n @for (error of displayedErrors(); track $index) {\n <span class=\"kt-radio-group__error-message\">{{ error.message }}</span>\n }\n }\n </div>\n </div>\n `,\n})\nexport class KtRadioGroup<V> implements FormValueControl<V | null> {\n private readonly config = inject(KT_FIELD_CONFIG, { optional: true });\n\n /** Valeur sélectionnée (two-way), ou `null` si aucune option n'est cochée. @default null */\n readonly value = model<V | null>(null);\n\n // --- État poussé par [formField] ---\n /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */\n readonly touched = model<boolean>(false);\n /** Désactive le groupe entier (hérité par chaque radio enfant). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Marque le groupe comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */\n readonly invalid = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Affiche l'astérisque requis et `aria-required` sur le groupe. @default false */\n readonly required = input(false, { transform: booleanAttribute });\n /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */\n readonly dirty = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Erreurs de validation à afficher sous le groupe. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Base du `name` partagé par les radios enfants (sinon auto-généré). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n /** Légende du groupe (`aria-labelledby`). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le groupe (masqué quand une erreur s'affiche). @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) du groupe quand `label` est absent. @default undefined */\n readonly ariaLabel = input<string>();\n /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */\n readonly showAllErrors = input<boolean, unknown>(this.config?.showAllErrors ?? false, {\n transform: booleanAttribute,\n });\n\n /** Égalité des valeurs en mode objet (défaut : identité `===`). Seul rescapé du contrat select. */\n readonly compareWith = input<(a: V, b: V) => boolean>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('radio-group');\n protected readonly baseId = computed(() => this.id() ?? `kt-radio-group-${this.uid}`);\n /** `name` partagé par les radios enfants → regroupement clavier NATIF (roving + flèches). */\n readonly groupName = computed(() => this.name() || `${this.baseId()}-name`);\n protected readonly labelId = computed(() => `${this.baseId()}-label`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n protected readonly errorId = computed(() => `${this.baseId()}-error`);\n\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.config?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n protected readonly displayedErrors = computed(() =>\n this.showAllErrors() ? this.errors() : this.errors().slice(0, 1),\n );\n\n protected readonly resolvedAriaLabel = computed(() => this.ariaLabel() ?? null);\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.hint() && !this.showInvalid()) ids.push(this.hintId());\n if (this.showInvalid() && this.errors().length > 0) ids.push(this.errorId());\n return ids.length ? ids.join(' ') : null;\n });\n\n private readonly comparator = computed(() => this.compareWith() ?? ((a: V, b: V) => a === b));\n\n /** L'`optionValue` d'un enfant correspond-il à la sélection courante ? (lu dans le `computed` enfant) */\n isSelected(radioValue: V): boolean {\n const v = this.value();\n if (v === null || v === undefined) return false;\n return this.comparator()(radioValue, v as V);\n }\n\n /** Commit d'une sélection émis par un enfant au `change` natif. */\n select(radioValue: V): void {\n if (this.disabled()) return;\n this.value.set(radioValue);\n this.touched.set(true);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n isDevMode,\n} from '@angular/core';\nimport { KtRadioGroup } from './radio-group';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Bouton radio individuel (enfant déclaratif de `kt-radio-group`).\n * `<input type=\"radio\">` NATIF partageant le `name` du groupe : clavier (roving + flèches) gratuit.\n * Le libellé suit la même règle que la checkbox : `label` texte par défaut, contenu projeté en\n * override visuel (carte sélectionnable), `ariaLabel` pour le nom accessible d'une option non-textuelle.\n *\n * @example\n * ```html\n * <kt-radio-group label=\"Civilité\" [(value)]=\"civility\">\n * <kt-radio [optionValue]=\"'mme'\" label=\"Madame\" />\n * <kt-radio [optionValue]=\"'m'\" label=\"Monsieur\" />\n * </kt-radio-group>\n * ```\n */\n@Component({\n selector: 'kt-radio',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './radio.css',\n template: `\n <label class=\"kt-radio\">\n <input\n type=\"radio\"\n class=\"kt-radio__input\"\n [id]=\"baseId()\"\n [name]=\"group.groupName()\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-describedby]=\"hint() ? hintId() : null\"\n (change)=\"onChange()\"\n (blur)=\"group.touched.set(true)\"\n />\n <span class=\"kt-radio__label\">\n <ng-content>{{ label() }}</ng-content>\n </span>\n </label>\n\n @if (hint(); as hintText) {\n <p [id]=\"hintId()\" class=\"kt-radio__hint\">{{ hintText }}</p>\n }\n `,\n})\nexport class KtRadio<V> {\n protected readonly group = inject<KtRadioGroup<V>>(KtRadioGroup);\n\n /** Valeur d'option représentée par ce radio (sélectionnée ⇒ devient la valeur du groupe). Nommée\n `optionValue` pour s'aligner sur `kt-checkbox` (où `value` = état coché). @default (requis) */\n readonly optionValue = input.required<V>();\n /** Texte du libellé (remplacé visuellement par un contenu projeté). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le radio. @default undefined */\n readonly hint = input<string>();\n /** Nom accessible (`aria-label`) pour une option sans libellé textuel. @default undefined */\n readonly ariaLabel = input<string>();\n /** Désactive ce radio (combiné à l'état désactivé du groupe). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */\n readonly id = input<string>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('radio');\n protected readonly baseId = computed(() => this.id() ?? `kt-radio-${this.uid}`);\n protected readonly hintId = computed(() => `${this.baseId()}-hint`);\n\n protected readonly checked = computed(() => this.group.isSelected(this.optionValue()));\n protected readonly isDisabled = computed(() => this.group.disabled() || this.disabled());\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n constructor() {\n // Garde-fou a11y (dev, navigateur uniquement) : nom accessible = `label`, `ariaLabel` OU contenu\n // projeté. Sans aucun des trois, le radio est annoncé vide (WCAG 4.1.2).\n afterNextRender(() => {\n if (!isDevMode() || this.label() || this.ariaLabel()) return;\n const labelText = this.el.nativeElement.querySelector('.kt-radio__label')?.textContent?.trim();\n if (!labelText) {\n console.warn('[ktRadio] sans `label`, `ariaLabel` ni contenu projeté : annoncé sans nom accessible (WCAG 4.1.2).');\n }\n });\n }\n\n protected onChange(): void {\n // Garde défensive : un input natif `disabled` n'émet pas `change`, mais on protège un appel\n // programmatique éventuel (cohérence avec switch/checkbox qui gardent leur commit).\n if (this.isDisabled()) return;\n this.group.select(this.optionValue());\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/** Défauts applicables à tous les `kt-select` (surchargeables par champ via les inputs).\n Lib neutre i18n : les textes sont fournis par le consommateur (ici en une fois).\n Fourni en `Partial` : un consommateur n'override que ce qu'il veut.\n Calqué sur `KT_FIELD_CONFIG`. */\nexport interface KtSelectConfigOptions {\n /** Texte affiché quand aucune option n'est sélectionnée. */\n placeholder: string;\n /** Texte affiché quand la liste filtrée/d'options est vide. */\n emptyText: string;\n /** Libellé accessible du bouton de fermeture de la bottom-sheet mobile. */\n closeLabel: string;\n /** Fermer le popup après une sélection. Défaut (single) : `true`. */\n closeOnSelect: boolean;\n /** Placeholder du champ de filtre des select filtrables (`[filterable]`). */\n filterPlaceholder: string;\n /** Libellé accessible (aria-label) du champ de filtre. */\n filterLabel: string;\n /** Annonce du nombre de résultats du filtre (live region). Fonction : laisse le\n consommateur gérer les pluriels i18n. Défaut : `'1 result'` / `'N results'`. */\n filterResultsText: (count: number) => string;\n\n // --- Clés propres au multi-select (`kt-multi-select`) ---\n /** Libellé accessible du bouton de retrait d'un chip. Défaut : `'Remove X'`. */\n removeItemLabel: (itemLabel: string) => string;\n /** Libellé accessible du conteneur de chips (reçoit le label du champ, pour\n distinguer plusieurs multi-selects d'une page). Défaut : `'Selected items for X'`. */\n selectedItemsLabel: (fieldLabel: string | undefined) => string;\n /** Résumé affiché sur le trigger au-delà du seuil d'énumération. Défaut : `'N items selected'`. */\n selectionSummaryText: (count: number) => string;\n /** Annonce live après le retrait d'un élément (chip ou tout effacer). Défaut : `'X removed'`. */\n itemRemovedText: (itemLabel: string) => string;\n /** Compteur de sélection (live region du filtre, actions de masse). Défaut : `'N selected'`. */\n selectionCountText: (count: number) => string;\n /** Libellé du bouton « tout sélectionner » du popup (`[selectionActions]`). Défaut : `'Select all'`. */\n selectAllLabel: string;\n /** Libellé du bouton « tout effacer » du popup (`[selectionActions]`). Défaut : `'Clear all'`. */\n clearAllLabel: string;\n /** Libellé du bouton dépliant les chips repliés (`[maxVisibleChips]`). Défaut : `'+N more'`. */\n moreChipsLabel: (hiddenCount: number) => string;\n /** Libellé du même bouton une fois déplié. Défaut : `'Show less'`. */\n lessChipsLabel: string;\n /** Texte informatif de troncature des résultats (visuel). Défaut : `'Showing first X results of Y...'`. */\n truncatedResultsText: (max: number, total: number) => string;\n /** Annonce de la troncature des résultats (live region). Défaut : `'X results displayed out of Y...'`. */\n truncatedResultsAnnouncement: (max: number, total: number) => string;\n}\n\nexport const KT_SELECT_CONFIG = new InjectionToken<Partial<KtSelectConfigOptions>>('KT_SELECT_CONFIG');\n\n/**\n * Source UNIQUE des défauts (anglais neutre) de la config select / multi-select. Constitue le 3e\n * maillon de la résolution `input() ?? KT_SELECT_CONFIG ?? DEFAULT_KT_SELECT_CONFIG`, jusqu'ici\n * éparpillé entre `base-select.ts`, `multi-select.ts` et des fonctions locales. Centralisé ici pour\n * éviter toute dérive et garantir la complétude des traductions (cf. test de complétude i18n).\n */\nexport const DEFAULT_KT_SELECT_CONFIG: Required<KtSelectConfigOptions> = {\n placeholder: '',\n emptyText: 'No options',\n closeLabel: 'Close',\n closeOnSelect: true,\n filterPlaceholder: '',\n filterLabel: 'Filter options',\n filterResultsText: (count) => (count === 1 ? '1 result' : `${count} results`),\n removeItemLabel: (itemLabel) => `Remove ${itemLabel}`,\n selectedItemsLabel: (fieldLabel) => (fieldLabel ? `Selected items for ${fieldLabel}` : 'Selected items'),\n selectionSummaryText: (count) => `${count} items selected`,\n itemRemovedText: (itemLabel) => `${itemLabel} removed`,\n selectionCountText: (count) => (count === 1 ? '1 selected' : `${count} selected`),\n selectAllLabel: 'Select all',\n clearAllLabel: 'Clear all',\n moreChipsLabel: (hiddenCount) => `+${hiddenCount} more`,\n lessChipsLabel: 'Show less',\n truncatedResultsText: (max, total) => `Showing first ${max} results of ${total}. Refine your search to see more.`,\n truncatedResultsAnnouncement: (max, total) =>\n `${max} results displayed out of ${total}. Refine your search to see more.`,\n};\n","/** Clé (propriété) OU fonction d'accès, pour dériver une valeur d'un item.\n Partagé par les sélecteurs (BaseSelect) et les chips (ChipList). */\nexport type KtKeyish<T, R> = keyof T | ((item: T) => R);\n\n/** Normalise une clé/fonction en fonction d'accès, avec repli si non fourni. */\nexport function accessor<T, R>(key: KtKeyish<T, R> | undefined, fallback: (item: T) => R): (item: T) => R {\n if (key === undefined) return fallback;\n if (typeof key === 'function') return key;\n return (item: T) => (item as Record<PropertyKey, unknown>)[key] as R;\n}\n\n/** Libellé par défaut : `label`/`name` pour un objet, sinon `String(item)`. */\nexport function defaultLabel<T>(item: T): string {\n if (item !== null && typeof item === 'object') {\n const o = item as Record<string, unknown>;\n const v = o['label'] ?? o['name'];\n if (v !== undefined && v !== null) return String(v);\n }\n return String(item);\n}\n\n/** Identité par défaut : `id`/`value` pour un objet, sinon l'item lui-même (primitif). */\nexport function defaultIdentity<T>(item: T): unknown {\n if (item !== null && typeof item === 'object') {\n const o = item as Record<string, unknown>;\n return o['id'] ?? o['value'] ?? item;\n }\n return item;\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n NgZone,\n Signal,\n TemplateRef,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n model,\n output,\n signal,\n viewChild,\n untracked,\n PLATFORM_ID,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Listbox } from '@angular/aria/listbox';\nimport { Combobox } from '@angular/aria/combobox';\nimport type { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport {\n KT_FIELD_CONFIG,\n type KtFieldErrorMatcher,\n defaultKtFieldErrorMatcher,\n type KtFieldAppearance,\n type KtFloatLabel,\n} from '../field/field-config';\nimport { KT_SELECT_CONFIG, DEFAULT_KT_SELECT_CONFIG } from '../select/select-config';\nimport { type KtKeyish, accessor, defaultIdentity, defaultLabel } from '../keyish';\nimport { KtViewport, createKtSheetDrag, KtIdGenerator } from '@ktortu/aaa/cdk';\n\nexport type { KtKeyish } from '../keyish';\n\n/** Annonce différée du nombre de résultats : ~500 ms après la dernière frappe (anti-spam SR). */\nconst ANNOUNCE_DELAY_MS = 500;\n\n/** Normalisation du filtre par défaut : insensible à la casse ET aux accents\n (décomposition NFD puis suppression des diacritiques combinants). */\nfunction normalizeForFilter(s: string): string {\n return s\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n}\n\n/** Base partagée des sélecteurs à liste fermée (Select single et MultiSelect), bâtis sur\n `@angular/aria` (Combobox + Listbox) : options et dérivation (clé/fonction), état poussé\n par `[formField]`, popup Popover responsive (dropdown ancré desktop ↔ bottom-sheet\n téléphone, drag-to-dismiss), filtrage opt-in avec live region, clavier commun (Échap\n global, Tab APG depuis le filtre). La VALEUR (`V | null` vs `V[]`) et `selectionChange`\n restent dans les sous-classes : leurs types divergent, chacune implémente seule\n `FormValueControl<…>`. Même pattern d'héritage que `BaseInputField`.\n\n @template T Type d'une option (élément du tableau `options`).\n @template V Type de la valeur émise par le contrôle (défaut `T` : l'objet entier ;\n ou la clé extraite quand `optionValue` est fourni). */\n@Directive({\n host: {\n '(keydown)': 'onHostKeydown($event)',\n },\n})\nexport abstract class KtBaseSelect<T, V = T> {\n protected readonly fieldConfig = inject(KT_FIELD_CONFIG, { optional: true });\n protected readonly config = inject(KT_SELECT_CONFIG, { optional: true });\n protected readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly ngZone = inject(NgZone);\n protected readonly doc = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private wasExpanded = false;\n\n // --- Données / dérivation (clé OU fonction, défauts intelligents) ---\n /** Liste des options affichées (source de vérité du contrôle). */\n readonly options = input.required<readonly T[]>();\n /** Libellé affiché d'une option : clé OU fonction. Défaut : `label`/`name`, sinon `String(option)`. */\n readonly optionLabel = input<KtKeyish<T, string>>();\n /** Dérive la valeur de sortie ET l'identité d'une option.\n - Fourni (clé/fonction) ⇒ `value` = la/les clé(s) extraite(s).\n - Omis ⇒ `value` = l'objet entier ; l'identité interne dérive de `id`/`value`. */\n readonly optionValue = input<KtKeyish<T, V>>();\n /** Désactivation d'une option : clé OU fonction renvoyant un booléen. Défaut : aucune option désactivée. */\n readonly optionDisabled = input<KtKeyish<T, boolean>>();\n /** Égalité des options en mode objet (présélection). Défaut : comparaison par identité (`id`/`value`). */\n readonly compareWith = input<(a: T, b: T) => boolean>();\n\n /** Émis au clic sur le bouton d'aide contextuelle. */\n readonly helpClick = output<MouseEvent>();\n\n // --- État poussé par [formField] (même contrat que BaseInputField) ---\n /** Le champ a-t-il été visité ? Poussé par `[formField]` ; passe à `true` à la première sélection. @default false */\n readonly touched = model<boolean>(false);\n /** Champ désactivé (trigger inerte). Poussé par `[formField]`. @default false */\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Champ en lecture seule (sélection figée, valeur affichée). Poussé par `[formField]`. @default false */\n readonly readonly = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Le champ est-il invalide ? Pilote l'affichage des erreurs. Poussé par `[formField]`. @default false */\n readonly invalid = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Champ obligatoire (marqueur visuel/ARIA). Poussé par `[formField]`. @default false */\n readonly required = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Le champ a-t-il été modifié depuis sa valeur initiale ? Poussé par `[formField]`. @default false */\n readonly dirty = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Erreurs de validation à afficher. Poussé par `[formField]`. @default [] */\n readonly errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Attribut `name` logique du contrôle (à titre indicatif). @default '' */\n readonly name = input<string>('');\n\n // --- Présentation ---\n /** id imposé (sélecteurs de test stables) ; sinon auto-généré par Field. @default undefined */\n readonly id = input<string>();\n /** Libellé du champ (rendu par Field). @default undefined */\n readonly label = input<string>();\n /** Texte d'aide affiché sous le champ quand il est valide. @default undefined */\n readonly hint = input<string>();\n /** Aide contextuelle riche : texte ou `TemplateRef` rendu dans une infobulle d'aide. @default undefined */\n readonly helpText = input<string | TemplateRef<unknown>>();\n /** Libellé accessible du bouton d'aide. @default 'Help' (ou KT_FIELD_CONFIG.helpLabel) */\n readonly helpLabel = input<string>(this.fieldConfig?.helpLabel ?? 'Help');\n /** Force la valeur de `aria-describedby` (sinon dérivée de hint/erreur). @default undefined */\n readonly customDescribedBy = input<string>();\n /** Texte indicatif affiché quand aucune option n'est sélectionnée. @default undefined */\n readonly placeholder = input<string>();\n /** Quand afficher l'erreur ; surcharge KT_FIELD_CONFIG et le défaut (`invalid && touched`). @default undefined */\n readonly errorMatcher = input<KtFieldErrorMatcher>();\n /** Apparence du chrome (`fill` | `outline`) ; non fournie ⇒ `KT_FIELD_CONFIG.appearance` ?? `'fill'`.\n @default undefined */\n readonly appearance = input<KtFieldAppearance>();\n /** Politique du label flottant en outline (`auto` | `always`) ; non fournie ⇒ `KT_FIELD_CONFIG.floatLabel`\n ?? `'auto'`. @default undefined */\n readonly floatLabel = input<KtFloatLabel>();\n\n // --- Filtrage (champ de recherche dans le popup, opt-in) ---\n /** Affiche un champ de recherche en tête du popup (desktop) / de la sheet (téléphone).\n Pour les listes longues ; le texte tapé ne sert qu'à filtrer (réinitialisé à la fermeture). @default false */\n readonly filterable = input<boolean, unknown>(false, { transform: booleanAttribute });\n /** Placeholder du champ de recherche du popup. Défaut : `KT_SELECT_CONFIG.filterPlaceholder` ou vide. */\n readonly filterPlaceholder = input<string>();\n /** Libellé accessible du champ de recherche. Défaut : `KT_SELECT_CONFIG.filterLabel` ou « Filter options ». */\n readonly filterLabel = input<string>();\n /** Prédicat de filtre custom `(option, texte tapé brut)`.\n Défaut : libellé de l'option, insensible à la casse et aux accents. */\n readonly filterFn = input<(option: T, query: string) => boolean>();\n /** Nombre maximal d'options affichées dans le DOM en mode filtrable pour optimiser les performances. @default 100 */\n readonly maxVisibleOptions = input<number>(100);\n /** Texte informatif de troncature des résultats (visuel). */\n readonly truncatedResultsText = input<(max: number, total: number) => string>();\n /** Annonce de la troncature des résultats (live region). */\n readonly truncatedResultsAnnouncement = input<(max: number, total: number) => string>();\n\n // --- État interne du popup ---\n protected readonly expanded = signal(false);\n protected readonly viewport = inject(KtViewport);\n /** Écran compact (téléphone / fenêtre étroite) : bascule le popup en bottom-sheet modale.\n Source unique configurable par appli (`KtViewport` / `provideKtBreakpoints`) ; pilote aussi\n la classe CSS `kt-select__popup--sheet` du template. */\n protected readonly compact = this.viewport.isCompact;\n protected readonly triggerEl = viewChild<ElementRef<HTMLElement>>('trigger');\n protected readonly popupEl = viewChild<ElementRef<HTMLElement>>('popup');\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('select');\n private readonly anchorName = `--kt-select-anchor-${this.uid}`;\n /** id du panneau (élément widget) en mode filtrable — cible de l'aria-controls du trigger. */\n protected readonly panelId = `kt-select-panel-${this.uid}`;\n protected readonly filterInputEl = viewChild<ElementRef<HTMLInputElement>>('filterInput');\n protected readonly listboxEl = viewChild<ElementRef<HTMLElement>>('listboxEl');\n protected readonly listboxDir = viewChild(Listbox);\n protected readonly comboboxDir = viewChild(Combobox);\n /** Suit l'état réel du Popover : la fermeture peut être synchrone (Tab) ET pilotée par\n l'effect — sans ce flag, le second `hidePopover()` jetterait une InvalidStateError. */\n private popoverShown = false;\n\n // --- Politique d'affichage des erreurs (cohérente avec les champs) ---\n private readonly matcher = computed(\n () => this.errorMatcher() ?? this.fieldConfig?.errorMatcher ?? defaultKtFieldErrorMatcher,\n );\n protected readonly showInvalid = computed(() =>\n this.matcher()({ invalid: this.invalid(), touched: this.touched(), dirty: this.dirty() }),\n );\n\n // --- Textes résolus (input > KT_SELECT_CONFIG > DEFAULT_KT_SELECT_CONFIG, défauts EN centralisés) ---\n protected readonly resolvedPlaceholder = computed(\n () => this.placeholder() ?? this.config?.placeholder ?? DEFAULT_KT_SELECT_CONFIG.placeholder,\n );\n protected readonly resolvedEmptyText = computed(() => this.config?.emptyText ?? DEFAULT_KT_SELECT_CONFIG.emptyText);\n protected readonly resolvedCloseLabel = computed(() => this.config?.closeLabel ?? DEFAULT_KT_SELECT_CONFIG.closeLabel);\n protected readonly resolvedFilterPlaceholder = computed(\n () => this.filterPlaceholder() ?? this.config?.filterPlaceholder ?? DEFAULT_KT_SELECT_CONFIG.filterPlaceholder,\n );\n protected readonly resolvedFilterLabel = computed(\n () => this.filterLabel() ?? this.config?.filterLabel ?? DEFAULT_KT_SELECT_CONFIG.filterLabel,\n );\n protected readonly resolvedFilterResultsText = computed(\n () => this.config?.filterResultsText ?? DEFAULT_KT_SELECT_CONFIG.filterResultsText,\n );\n protected readonly resolvedTruncatedResultsText = computed(\n () => this.truncatedResultsText() ?? this.config?.truncatedResultsText ?? DEFAULT_KT_SELECT_CONFIG.truncatedResultsText,\n );\n protected readonly resolvedTruncatedResultsAnnouncement = computed(\n () =>\n this.truncatedResultsAnnouncement() ??\n this.config?.truncatedResultsAnnouncement ??\n DEFAULT_KT_SELECT_CONFIG.truncatedResultsAnnouncement,\n );\n\n // Field attend des { kind, message } ; on mappe les ValidationError.\n protected readonly fieldErrors = computed(() => this.errors().map((e) => ({ kind: e.kind, message: e.message })));\n\n // --- Accès aux options ---\n private readonly labelAccessor = computed(() => accessor<T, string>(this.optionLabel(), defaultLabel));\n private readonly valueAccessor = computed(() => accessor<T, unknown>(this.optionValue(), defaultIdentity));\n private readonly disabledAccessor = computed(() => accessor<T, boolean>(this.optionDisabled(), () => false));\n /** Comparateur effectif en mode objet : `compareWith`, sinon égalité par identité. */\n protected readonly comparator = computed(\n () => this.compareWith() ?? ((a: T, b: T) => this.keyOf(a) === this.keyOf(b)),\n );\n\n protected labelOf(item: T): string {\n return this.labelAccessor()(item);\n }\n protected keyOf(item: T): unknown {\n return this.valueAccessor()(item);\n }\n protected disabledOf(item: T): boolean {\n return this.disabledAccessor()(item);\n }\n\n // --- Filtrage : état éphémère (réinitialisé à la fermeture du popup) ---\n protected readonly filterText = signal('');\n /** Annonce différée du nombre de résultats (live region `role=\"status\"`). */\n protected readonly announcedCount = signal('');\n private announceTimer: ReturnType<typeof setTimeout> | undefined;\n\n /** Options visibles : les options, restreintes par le filtre quand il est actif. */\n protected readonly filteredOptions = computed<readonly T[]>(() => {\n const query = this.filterText().trim();\n if (!this.filterable() || query === '') return this.options();\n const fn =\n this.filterFn() ??\n ((option: T, q: string) => normalizeForFilter(this.labelOf(option)).includes(normalizeForFilter(q)));\n return this.options().filter((option) => fn(option, query));\n });\n\n /** Les options affichées dans le DOM. La limitation (maxVisibleOptions) n'est appliquée qu'en mode filtrable. */\n protected readonly displayedOptions = computed<readonly T[]>(() => {\n const opts = this.filteredOptions();\n if (!this.filterable()) return opts;\n const limit = this.maxVisibleOptions();\n return opts.length <= limit ? opts : opts.slice(0, limit);\n });\n\n // --- Hooks fournis par les sous-classes ---\n /** Valeur poussée au ngListbox sous-jacent : tableau de clés (0/1 en single, N en multi). */\n protected abstract readonly listboxValue: Signal<unknown[]>;\n /** Réception des (dé)sélections du listbox — la sémantique de commit diverge (single/multi). */\n protected abstract onListboxValueChange(keys: readonly unknown[]): void;\n\n /** Texte de la live region du filtre. Virtuel : le multi y ajoute « , M selected ». */\n protected composeFilterAnnouncement(): string {\n const query = this.filterText().trim();\n if (query === '') return '';\n const total = this.filteredOptions().length;\n const limit = this.maxVisibleOptions();\n if (this.filterable() && total > limit) {\n return this.resolvedTruncatedResultsAnnouncement()(limit, total);\n }\n return this.resolvedFilterResultsText()(total);\n }\n\n constructor() {\n // Ancre le trigger : `setProperty` natif (les propriétés CSS à tiret comme `anchor-name`\n // ne sont pas appliquées de façon fiable par le binding `[style.…]`/Renderer2 — cf. Tooltip).\n effect(() => {\n this.triggerEl()?.nativeElement.style.setProperty('anchor-name', this.anchorName);\n });\n\n // Affichage du popup via Popover natif (top-layer). On NE peut PAS utiliser <dialog>.showModal()\n // (vraie modale) : ce combobox @angular/aria se ferme au blur (closePopupOnBlur) et showModal\n // déplace le focus hors du combobox → fermeture immédiate. On reste donc en Popover (le focus\n // reste sur le combobox) ; sur mobile le focusMode 'roving' rend les options réellement focusables.\n effect(() => {\n const el = this.popupEl()?.nativeElement as\n | (HTMLElement & { showPopover?(): void; hidePopover?(): void })\n | undefined;\n if (!el) return;\n if (this.expanded()) {\n el.classList.remove('kt-select__popup--closing');\n el.style.translate = ''; // efface un éventuel translate résiduel d'un drag-to-dismiss précédent\n el.style.setProperty('position-anchor', this.anchorName);\n el.showPopover?.();\n this.popoverShown = true;\n // Desktop filtrable : le champ de recherche prend le focus à l'ouverture (pattern\n // SelectPanel). Pas sur téléphone : le clavier virtuel recouvrirait la bottom-sheet.\n if (this.filterable() && !this.compact()) this.filterInputEl()?.nativeElement.focus();\n } else if (this.popoverShown) {\n this.animateAndCloseSelect(el);\n }\n });\n\n // Filtre éphémère : réinitialisé à la fermeture (liste complète à la réouverture).\n effect(() => {\n if (this.expanded()) return;\n untracked(() => {\n this.filterText.set('');\n this.announcedCount.set('');\n clearTimeout(this.announceTimer);\n });\n });\n\n this.destroyRef.onDestroy(() => {\n clearTimeout(this.announceTimer);\n this.sheetDrag.destroy();\n if (isPlatformBrowser(this.platformId) && this.compact() && this.expanded()) {\n this.doc.body.style.overflow = '';\n }\n });\n\n // Préserve le contenu du template sur mobile pour permettre l'animation de sortie\n effect(() => {\n const cb = this.comboboxDir();\n if (cb) {\n cb.preserveContent.set(this.compact());\n }\n });\n\n // Sheet mobile : verrouille le scroll du fond et restitue le focus au trigger à la fermeture.\n effect(() => {\n if (!this.compact()) return;\n if (!isPlatformBrowser(this.platformId)) return;\n if (this.expanded()) {\n this.doc.body.style.overflow = 'hidden';\n this.wasExpanded = true;\n } else {\n this.doc.body.style.overflow = '';\n if (this.wasExpanded) {\n this.triggerEl()?.nativeElement.focus();\n }\n }\n });\n\n // Ferme au clic/tap en dehors du composant (remplace le binding d'hôte statique document:pointerdown)\n // Enregistré une seule fois hors de la zone Angular pour éviter le change detection global sur chaque clic.\n if (isPlatformBrowser(this.platformId)) {\n this.ngZone.runOutsideAngular(() => {\n const onPointerDown = (event: PointerEvent) => {\n if (!this.expanded()) return;\n const target = event.target as Node | null;\n const popup = this.popupEl()?.nativeElement;\n if (target && (!this.host.nativeElement.contains(target) || target === popup)) {\n this.ngZone.run(() => {\n this.expanded.set(false);\n });\n }\n };\n this.doc.addEventListener('pointerdown', onPointerDown);\n this.destroyRef.onDestroy(() => {\n this.doc.removeEventListener('pointerdown', onPointerDown);\n });\n });\n }\n\n // Fait défiler la liste pour afficher l'option active lors de la navigation au clavier (mode activedescendant).\n effect(() => {\n const activeId = this.listboxDir()?.activeDescendant();\n if (!this.expanded() || !activeId) return;\n\n requestAnimationFrame(() => {\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n const activeEl = listbox.querySelector('.kt-select__option--active');\n if (activeEl) {\n activeEl.scrollIntoView({ block: 'nearest' });\n }\n });\n });\n\n if (isDevMode()) {\n effect(() => {\n const opts = this.options();\n if (this.optionValue() !== undefined || this.compareWith() !== undefined) return;\n const sample = opts.find((o) => o !== null && typeof o === 'object') as Record<string, unknown> | undefined;\n if (sample && sample['id'] === undefined && sample['value'] === undefined) {\n console.warn(\n `[${this.host.nativeElement.tagName.toLowerCase()}] Options de type objet sans identité résoluble ` +\n \"('id'/'value') ni `compareWith` : la sélection peut être incohérente au rechargement \" +\n 'des données. Fournissez `optionValue` ou `compareWith`.',\n );\n }\n });\n }\n }\n\n protected onFilterInput(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.scheduleResultsAnnouncement();\n this.resyncListboxSelection();\n }\n\n /** Relaye la navigation vers le listbox : le focus DOM est dans le champ de filtre et les\n keydown du popup ne remontent pas au combobox (le popup est un sibling DOM du trigger).\n Shift+flèches : extension de plage (multi ; sans effet en single). Home/End/Espace/\n caractères restent dans le champ (convention APG des combobox éditables). */\n protected onFilterKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.expanded.set(false);\n this.refocusTriggerAfterFilterClose();\n return;\n }\n if (event.key === 'Tab') {\n // APG : Tab ferme le popup et suit l'ordre de tabulation. Fermeture SYNCHRONE (l'effect\n // est différé : le popup, sibling DOM du trigger, resterait tabbable pendant l'action\n // par défaut) + focus sur le trigger SANS preventDefault : le Tab natif repart du\n // trigger vers l'élément suivant de la page (Shift+Tab : le précédent).\n this.closePopupNow();\n this.refocusTriggerAfterFilterClose();\n return;\n }\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp' && event.key !== 'Enter') return;\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n event.preventDefault();\n listbox.dispatchEvent(new KeyboardEvent('keydown', { key: event.key, shiftKey: event.shiftKey, cancelable: true }));\n }\n\n /** Échap depuis n'importe où dans le composant popup ouvert : après un clic souris sur une\n option, le focus DOM est sur le listbox (pas le trigger) — ni le listbox ni le combobox ne\n gèrent Échap là. Le popup est rendu dans le sous-arbre DOM de l'hôte : l'événement y bulle.\n (Trigger et champ de filtre gèrent leur Échap en amont avec stopPropagation : pas de doublon.) */\n protected onHostKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape' || !this.expanded()) return;\n event.preventDefault();\n event.stopPropagation();\n this.expanded.set(false);\n this.triggerEl()?.nativeElement.focus();\n }\n\n /** Annonce le contenu du filtre ~500 ms après la dernière frappe (évite le spam SR). */\n protected scheduleResultsAnnouncement(): void {\n this.ngZone.runOutsideAngular(() => {\n clearTimeout(this.announceTimer);\n this.announceTimer = setTimeout(() => {\n this.ngZone.run(() => {\n this.announcedCount.set(this.composeFilterAnnouncement());\n });\n }, ANNOUNCE_DELAY_MS);\n });\n }\n\n /** Annonce immédiate dans la live region du panneau (annule une annonce différée en attente). */\n protected announceNow(text: string): void {\n clearTimeout(this.announceTimer);\n this.announcedCount.set(text);\n }\n\n /** Séquelle de la purge interne du Listbox (il vide sa valeur dès qu'un item n'est plus\n rendu) : quand le filtre redécouvre des options sélectionnées, le binding `[value]` ne\n re-pousse rien (`listboxValue` n'a pas changé) — on resynchronise le modèle du Listbox\n avec les clés sélectionnées actuellement visibles. */\n protected resyncListboxSelection(): void {\n const listbox = this.listboxDir();\n if (!listbox) return;\n const visibleKeys = new Set(this.filteredOptions().map((o) => this.keyOf(o)));\n const expected = this.listboxValue().filter((k) => visibleKeys.has(k));\n const actual = listbox.value();\n if (expected.length === actual.length && expected.every((k) => actual.includes(k))) return;\n listbox.value.set(expected);\n }\n\n /** Desktop filtrable : le focus DOM vit dans le popup (champ/options) — on le rend au trigger\n à la fermeture, sinon il tombe sur `<body>`. (Écran compact : déjà géré par l'effect `compact`.) */\n protected refocusTriggerAfterFilterClose(): void {\n if (!this.filterable() || this.compact()) return;\n this.triggerEl()?.nativeElement.focus();\n }\n\n /** Fermeture synchrone du Popover (l'effect, différé, ne re-cachera pas : flag popoverShown). */\n protected closePopupNow(): void {\n this.expanded.set(false);\n if (!this.popoverShown) return;\n const el = this.popupEl()?.nativeElement as (HTMLElement & { hidePopover?(): void }) | undefined;\n el?.classList.remove('kt-select__popup--closing');\n el?.hidePopover?.();\n this.popoverShown = false;\n }\n\n // --- Drag-to-dismiss de la bottom-sheet (téléphone) ---\n // Geste DOUBLÉ par le bouton Fermer + tap-extérieur + Échap (WCAG 2.5.1). Logique FACTORISÉE\n // avec le mode `sheet` du Dialog via createKtSheetDrag (@ktortu/aaa).\n private readonly sheetDrag = createKtSheetDrag({\n pane: () => (this.popupEl()?.nativeElement.querySelector('.kt-select__sheet-card') as HTMLElement) ?? null,\n onDismiss: () => this.expanded.set(false),\n draggingClass: 'kt-select__popup--dragging',\n });\n\n protected onDragStart(event: PointerEvent): void {\n if (!this.compact()) return; // glissement actif sur écran compact uniquement\n this.sheetDrag.start(event);\n }\n\n private animateAndCloseSelect(el: HTMLElement & { hidePopover?(): void }): void {\n if (!this.compact() || !isPlatformBrowser(this.platformId)) {\n el.hidePopover?.();\n this.popoverShown = false;\n return;\n }\n\n el.classList.add('kt-select__popup--closing');\n const card = (el.querySelector('.kt-select__sheet-card') as HTMLElement) || el;\n\n // Récupérer la durée de transition configurée en CSS (ex: \"150ms\" ou \"0.2s\")\n const styles = window.getComputedStyle(card);\n const durationStr = styles.transitionDuration || '0s';\n const durationMs = parseFloat(durationStr) * (durationStr.includes('ms') ? 1 : 1000);\n\n if (durationMs === 0) {\n el.hidePopover?.();\n el.classList.remove('kt-select__popup--closing');\n this.popoverShown = false;\n return;\n }\n\n // Écouter la fin de la transition sur la propriété 'translate'\n const onTransitionEnd = (event: TransitionEvent) => {\n if (event.target === card && event.propertyName === 'translate') {\n card.removeEventListener('transitionend', onTransitionEnd);\n if (this.expanded()) return;\n el.hidePopover?.();\n el.classList.remove('kt-select__popup--closing');\n this.popoverShown = false;\n }\n };\n card.addEventListener('transitionend', onTransitionEnd);\n\n // Sécurité (au cas où la transition n'aboutirait pas)\n setTimeout(() => {\n card.removeEventListener('transitionend', onTransitionEnd);\n if (this.expanded()) return;\n if (this.popoverShown) {\n el.hidePopover?.();\n el.classList.remove('kt-select__popup--closing');\n this.popoverShown = false;\n }\n }, durationMs + 50);\n }\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Contexte typé reçu par le template d'une option (`ktSelectOption`). */\nexport interface KtSelectOptionContext<T> {\n /** L'option en cours de rendu → `let-option`. */\n $implicit: T;\n /** L'option est-elle sélectionnée ? → `let-selected=\"selected\"`. */\n selected: boolean;\n /** L'option est-elle active (survol/clavier) ? → `let-active=\"active\"`. */\n active: boolean;\n}\n\n/** Contexte typé reçu par le template du trigger (`ktSelectTrigger`). */\nexport interface KtSelectTriggerContext<T> {\n /** L'option sélectionnée (ou `null`) → `let-option`. */\n $implicit: T | null;\n}\n\n/** Template de rendu d'une option, posé sur un `<ng-template>` projeté dans `kt-select`.\n L'input sert UNIQUEMENT à inférer `T` (re-bind de la liste d'options) ; `ngTemplateContextGuard`\n type alors les variables `let-` (`option: T`, `selected`/`active: boolean`). Requiert `strictTemplates`.\n\n ```html\n <kt-select [options]=\"users\" optionLabel=\"name\">\n <ng-template [ktSelectOption]=\"users\" let-user let-selected=\"selected\">\n <user-badge [user]=\"user\" /> @if (selected) { ✓ }\n </ng-template>\n </kt-select>\n ``` */\n@Directive({ selector: 'ng-template[ktSelectOption]' })\nexport class KtSelectOptionDef<T> {\n readonly ktSelectOption = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtSelectOptionContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtSelectOptionDef<T>, ctx: unknown): ctx is KtSelectOptionContext<T> {\n return typeof ctx === 'object';\n }\n}\n\n/** Template de rendu du trigger (libellé de la valeur courante). Même mécanisme typé que `ktSelectOption`.\n Contexte : `let-option` = l'option sélectionnée (`T | null`).\n\n ```html\n <kt-select [options]=\"users\" [(value)]=\"selected\">\n <ng-template [ktSelectTrigger]=\"users\" let-user>\n @if (user) { <user-badge [user]=\"user\" /> } @else { Choisir… }\n </ng-template>\n </kt-select>\n ``` */\n@Directive({ selector: 'ng-template[ktSelectTrigger]' })\nexport class KtSelectTriggerDef<T> {\n readonly ktSelectTrigger = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtSelectTriggerContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtSelectTriggerDef<T>, ctx: unknown): ctx is KtSelectTriggerContext<T> {\n return typeof ctx === 'object';\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, contentChild, model, output } from '@angular/core';\nimport { Combobox, ComboboxPopup, ComboboxWidget } from '@angular/aria/combobox';\nimport { Listbox, Option } from '@angular/aria/listbox';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { KtBaseSelect } from '../base-select/base-select';\nimport { KtSelectOptionDef, KtSelectTriggerDef } from './select-option-def';\n\nexport type { KtKeyish } from '../base-select/base-select';\n\n/** Payload de l'évènement `selectionChange` d'un `kt-select`. */\nexport interface KtSelectSelectionChange<T, V = T> {\n /** Valeur émise : clé extraite ou objet entier (`null` si la sélection est effacée). */\n value: V | null;\n /** Option correspondante (`null` si la sélection est effacée). */\n option: T | null;\n}\n\n/** Select single (« select-only combobox » WAI-ARIA) bâti sur `@angular/aria`.\n Choix dans une liste fermée, sans saisie. Présentation responsive (un seul Popover, CSS @media) :\n desktop = dropdown ancré (focus sur le trigger / activedescendant) ; téléphone tactile = bottom-sheet\n en bas d'écran (focusMode 'roving', options réellement focusables, scrim ::backdrop, cibles ≥44px).\n Composé avec `Field` ; s'intègre aux Signal Forms via `[formField]`.\n Tout le commun (popup, filtre, clavier, drag-to-dismiss) vit dans `BaseSelect`.\n\n @template T Type d'une option (élément du tableau `options`).\n @template V Type de la valeur émise (défaut `T` ; clé extraite si `optionValue` est fourni).\n\n @example\n ```html\n <kt-select\n [options]=\"users\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [(value)]=\"selectedId\"\n (selectionChange)=\"onSelectionChange($event)\" />\n ``` */\n@Component({\n selector: 'kt-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './select.html',\n styleUrl: '../styles/select-panel.css',\n imports: [KtField, KtFieldControl, NgTemplateOutlet, Combobox, ComboboxPopup, ComboboxWidget, Listbox, Option],\n})\nexport class KtSelect<T, V = T> extends KtBaseSelect<T, V> implements FormValueControl<V | null> {\n // --- Modèle / sortie ---\n /** Valeur sélectionnée (clé extraite, ou objet entier si `optionValue` est omis ; `null` si rien). @default null */\n readonly value = model<V | null>(null);\n /** Émis à chaque sélection. Payload : `{ value, option }` — `value` est la valeur émise (clé ou objet),\n `option` l'objet option correspondant (`null` si la sélection est effacée). */\n readonly selectionChange = output<KtSelectSelectionChange<T, V>>();\n\n // --- Templates projetés (typés via ngTemplateContextGuard) ---\n protected readonly optionDef = contentChild(KtSelectOptionDef);\n protected readonly triggerDef = contentChild(KtSelectTriggerDef);\n\n /** Fermer le popup après une sélection (sémantique single ; le multi reste ouvert). */\n private readonly closeOnSelect = computed(() => this.config?.closeOnSelect ?? true);\n\n /** Option correspondant à la valeur courante (clé extraite, ou objet si `optionValue` est omis). */\n protected readonly selectedOption = computed<T | null>(() => {\n const v = this.value();\n if (v === null || v === undefined) return null;\n const opts = this.options();\n if (this.optionValue() !== undefined) {\n return opts.find((o) => this.keyOf(o) === (v as unknown)) ?? null;\n }\n const cmp = this.comparator();\n return opts.find((o) => cmp(o, v as unknown as T)) ?? (v as unknown as T);\n });\n\n /** Valeur du listbox : tableau de clés (0 ou 1 élément en single). */\n protected override readonly listboxValue = computed<unknown[]>(() => {\n const opt = this.selectedOption();\n return opt === null ? [] : [this.keyOf(opt)];\n });\n\n protected override onListboxValueChange(keys: readonly unknown[]): void {\n // Purge interne du Listbox quand le filtre masque l'option sélectionnée (la lib vide sa\n // valeur dès que l'item n'est plus rendu) : pas un geste utilisateur, on l'ignore.\n if (keys.length === 0 && this.isSelectionFilteredOut()) return;\n const key = keys.length > 0 ? keys[0] : null;\n if (key === null || key === undefined) {\n this.commitSelection(null);\n return;\n }\n const option = this.options().find((o) => this.keyOf(o) === key) ?? null;\n this.commitSelection(option);\n }\n\n /** La sélection courante est-elle masquée par le filtre ou la troncation ? (≠ retirée des données). */\n private isSelectionFilteredOut(): boolean {\n if (!this.filterable()) return false;\n const selected = this.selectedOption();\n if (selected === null) return false;\n const key = this.keyOf(selected);\n return !this.displayedOptions().some((option) => this.keyOf(option) === key);\n }\n\n private commitSelection(option: T | null): void {\n const out =\n option === null ? null : this.optionValue() !== undefined ? (this.keyOf(option) as V) : (option as unknown as V);\n this.value.set(out);\n this.touched.set(true);\n this.selectionChange.emit({ value: out, option });\n if (this.closeOnSelect()) {\n this.expanded.set(false);\n this.refocusTriggerAfterFilterClose();\n }\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"fieldErrors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div class=\"kt-select\" [class.kt-select--open]=\"expanded()\">\n <button\n #combobox=\"ngCombobox\"\n #trigger\n ngCombobox\n ktFieldControl\n type=\"button\"\n class=\"kt-field-box kt-select__trigger\"\n [(expanded)]=\"expanded\"\n [disabled]=\"disabled()\"\n [softDisabled]=\"false\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n [attr.data-filled]=\"selectedOption() ? '' : null\"\n >\n <span class=\"kt-select__value\">\n @if (triggerDef(); as def) {\n <ng-container [ngTemplateOutlet]=\"def.template\" [ngTemplateOutletContext]=\"{ $implicit: selectedOption() }\" />\n } @else if (selectedOption(); as option) {\n {{ labelOf(option) }}\n } @else {\n <span class=\"kt-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n </span>\n <span class=\"kt-select__arrow\" aria-hidden=\"true\">arrow_drop_down</span>\n </button>\n\n <!-- Un seul Popover (top-layer). CSS @media : dropdown ancré (desktop) ↔ bottom-sheet (téléphone).\n Pas de <dialog>.showModal() : ce combobox se ferme au blur, et showModal volerait le focus. -->\n <ng-template ngComboboxPopup [combobox]=\"combobox\" [popupType]=\"filterable() ? 'dialog' : 'listbox'\">\n <div #popup popover=\"manual\" class=\"kt-select__popup\" [class.kt-select__popup--sheet]=\"compact()\">\n @if (compact()) {\n <div class=\"kt-select__sheet-scrim\" aria-hidden=\"true\" (click)=\"expanded.set(false)\"></div>\n }\n <div class=\"kt-select__sheet-card\">\n @if (compact()) {\n <div\n class=\"kt-select__sheet-grab\"\n aria-hidden=\"true\"\n (pointerdown)=\"onDragStart($event)\"\n (mousedown)=\"$event.preventDefault()\"\n ></div>\n <header class=\"kt-select__sheet-header\">\n <span class=\"kt-select__sheet-title\">{{ label() }}</span>\n <button\n type=\"button\"\n class=\"kt-select__sheet-close\"\n [attr.aria-label]=\"resolvedCloseLabel()\"\n (click)=\"expanded.set(false)\"\n >\n <span class=\"kt-select__sheet-close-icon\" aria-hidden=\"true\">close</span>\n </button>\n </header>\n }\n @if (filterable()) {\n <!-- Mode filtrable : le widget combobox est le panneau ENTIER (champ + annonce + liste).\n Indispensable : un focus posé hors de l'élément ngComboboxWidget ferme le popup\n (closePopupOnBlur de @angular/aria) — le champ doit donc vivre dans ce sous-arbre. -->\n <div\n ngComboboxWidget\n role=\"dialog\"\n class=\"kt-select__panel\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label()\"\n [activeDescendant]=\"lb.activeDescendant()\"\n >\n <div class=\"kt-select__filter\">\n <input\n #filterInput\n type=\"search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n class=\"kt-select__filter-input\"\n autocomplete=\"off\"\n [placeholder]=\"resolvedFilterPlaceholder()\"\n [attr.aria-label]=\"resolvedFilterLabel()\"\n [attr.aria-controls]=\"lb.id()\"\n [attr.aria-activedescendant]=\"lb.activeDescendant()\"\n [value]=\"filterText()\"\n (input)=\"onFilterInput($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n />\n </div>\n <!-- Nombre de résultats annoncé (différé) aux lecteurs d'écran : une liste qui\n rétrécit en silence est perçue comme un bug (tests utilisateurs S. Higley). -->\n <div class=\"kt-select__sr-only\" role=\"status\" aria-live=\"polite\">{{ announcedCount() }}</div>\n <ul\n #lb=\"ngListbox\"\n #listboxEl\n ngListbox\n [focusMode]=\"compact() && !filterable() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n >\n @for (item of displayedOptions(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n selected: !!opt.selected(),\n active: opt.active(),\n }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n @if (filterable() && filteredOptions().length > maxVisibleOptions()) {\n <li class=\"kt-select__truncated-info\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedTruncatedResultsText()(maxVisibleOptions(), filteredOptions().length) }}\n </li>\n }\n </ul>\n </div>\n } @else {\n <ul\n #listbox=\"ngListbox\"\n #listboxEl\n ngComboboxWidget\n ngListbox\n [focusMode]=\"compact() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [activeDescendant]=\"listbox.activeDescendant()\"\n >\n @for (item of options(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item, selected: !!opt.selected(), active: opt.active() }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </ng-template>\n </div>\n</kt-field>\n","import { Directive, inject, input } from '@angular/core';\nimport { KT_SELECT_CONFIG, KtSelectConfigOptions } from './select-config';\n\n/** Configure les `kt-select` d'un sous-arbre via DI (équivalent du Context provider de react-select).\n Alternative à un provider global de `KT_SELECT_CONFIG` : on pose la directive sur un conteneur et\n tous les `kt-select` descendants en héritent.\n\n ```html\n <div [ktSelectConfig]=\"{ placeholder: 'Choisir…', emptyText: 'Aucun résultat' }\">\n <kt-select … />\n </div>\n ```\n\n La directive EST fournie comme `KT_SELECT_CONFIG` (`useExisting`) : les getters exposent l'objet\n bindé sous la forme `Partial<KtSelectConfigOptions>` attendue par le composant. */\n@Directive({\n selector: '[ktSelectConfig]',\n providers: [\n {\n provide: KT_SELECT_CONFIG,\n // Vue `Partial<KtSelectConfigOptions>` calculée à la volée : chaque accès de clé résout\n // `input bindé ?? contexte parent hérité`. Un Proxy évite d'énumérer (et de maintenir à la\n // main) un getter par clé — toute nouvelle clé de `KtSelectConfigOptions` est couverte\n // automatiquement, sans risque de dérive entre les deux fichiers.\n useFactory: (directive: KtSelectConfig) =>\n new Proxy({} as Partial<KtSelectConfigOptions>, {\n get: (_target, key) => directive.resolve(key as keyof KtSelectConfigOptions),\n }),\n deps: [KtSelectConfig],\n },\n ],\n})\nexport class KtSelectConfig {\n readonly ktSelectConfig = input<Partial<KtSelectConfigOptions>>({});\n\n /** Config héritée du contexte parent (provider global ou directive englobante) : la\n directive ne masque que les clés qu'elle définit, le reste continue d'en hériter. */\n private readonly parent = inject(KT_SELECT_CONFIG, { optional: true, skipSelf: true });\n\n /** Résout une clé : valeur bindée sur la directive, sinon valeur héritée du contexte parent. */\n resolve<K extends keyof KtSelectConfigOptions>(key: K): Partial<KtSelectConfigOptions>[K] {\n return this.ktSelectConfig()[key] ?? this.parent?.[key];\n }\n}\n","import { Signal } from '@angular/core';\n\n/** Portée de transition des chips. Fourni par `ChipList` (via `useExisting`) ; injecté en\n optionnel par `Chip` pour ne porter un `view-transition-name` QUE pendant la transition\n de SA liste — sinon tous les chips de la page deviendraient des groupes indépendants et\n « glisseraient » individuellement à chaque reflow déclenché par une autre liste.\n Fichier séparé : évite l'import circulaire Chip ↔ ChipList. */\nexport abstract class ChipTransitionScope {\n abstract readonly transitioning: Signal<boolean>;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n booleanAttribute,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { ChipTransitionScope } from './chip-transition-scope';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/**\n * Pilule individuelle (tag). Utilisable seule (tag statique) ou dans `kt-chip-list`.\n * Le label vient de la projection de contenu ; `removable` ajoute un bouton « retirer »\n * (24px visibles, cible 44px via ::after — technique des boutons icon-only).\n *\n * @example\n * ```html\n * <kt-chip>Angular</kt-chip>\n * <kt-chip removable removeLabel=\"Retirer Angular\" (remove)=\"onRemove()\">Angular</kt-chip>\n * ```\n */\n@Component({\n selector: 'kt-chip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './chip.html',\n styleUrl: './chip.css',\n host: {\n class: 'kt-chip',\n // Nommé UNIQUEMENT pendant la transition de SA liste (cf. ChipTransitionScope) : un nom\n // permanent ferait participer tous les chips de la page à chaque View Transition (glissement\n // individuel au moindre reflow). Chip seul (hors liste) : jamais nommé.\n '[style.view-transition-name]': 'scope?.transitioning() ? viewTransitionName : null',\n '[style.view-transition-class]': '\"chip-transition\"',\n },\n})\nexport class KtChip {\n protected readonly scope = inject(ChipTransitionScope, { optional: true });\n private readonly idGen = inject(KtIdGenerator);\n /** Nom de View Transition propre au chip (détail interne, posé en host binding). */\n protected readonly viewTransitionName = `chip-${this.idGen.generateId('chip')}`;\n\n /** Affiche le bouton « retirer » (sinon tag statique sans bouton). @default false */\n readonly removable = input(false, { transform: booleanAttribute });\n /** Chip désactivé (bouton « retirer » inactif). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Libellé accessible du bouton « retirer » (inclure le nom de l'item : « Remove X »). @default 'Remove' */\n readonly removeLabel = input<string>('Remove');\n /** Émis au clic sur le bouton « retirer » (le parent décide de retirer le chip). */\n readonly remove = output<void>();\n\n private readonly removeBtn = viewChild<ElementRef<HTMLButtonElement>>('removeBtn');\n\n /**\n * Focus programmatique du bouton « retirer ». Helper de coordination interne (focus management\n * d'`kt-chip-list`), non destiné aux consommateurs.\n * @internal\n */\n focusRemove(): void {\n this.removeBtn()?.nativeElement.focus();\n }\n}\n","<span class=\"kt-chip__label\"><ng-content /></span>\n@if (removable()) {\n <button\n #removeBtn\n type=\"button\"\n class=\"kt-chip__remove\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"removeLabel()\"\n (click)=\"remove.emit()\"\n >\n <span class=\"kt-chip__close-icon\" aria-hidden=\"true\">close</span>\n </button>\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Contexte typé reçu par le template d'un chip custom (`ktChipItem`). */\nexport interface KtChipItemContext<T> {\n /** L'item en cours de rendu → `let-item`. */\n $implicit: T;\n /** Fonction pour retirer cet item de la liste → `let-remove=\"remove\"`. */\n remove: () => void;\n}\n\n/** Template de rendu custom d'un chip dans `kt-chip-list`.\n Structurellement compatible avec `MultiSelectChipContext` (forwardable).\n Contexte : `let-item` = l'item rendu (`T`), `let-remove` = fonction qui le retire.\n\n ```html\n <kt-chip-list [items]=\"tags\">\n <ng-template [ktChipItem]=\"tags\" let-tag let-remove=\"remove\">\n <kt-chip [removable]=\"true\" (remove)=\"remove()\">{{ tag.name }}</kt-chip>\n </ng-template>\n </kt-chip-list>\n ``` */\n@Directive({ selector: 'ng-template[ktChipItem]' })\nexport class KtChipItemDef<T> {\n /** Liste des items rendus par ce template (sert aussi à inférer le type `T` du contexte). */\n readonly ktChipItem = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtChipItemContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtChipItemDef<T>, ctx: unknown): ctx is KtChipItemContext<T> {\n return typeof ctx === 'object';\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/** Défauts applicables à tous les `kt-chip-list` (surchargeables par liste via les inputs).\n Lib neutre i18n : les textes sont fournis par le consommateur (ici en une fois).\n Fourni en `Partial` : un consommateur n'override que ce qu'il veut.\n Calqué sur `KT_FIELD_CONFIG`/`KT_SELECT_CONFIG`.\n NB : le MultiSelect passe ses propres textes (résolus depuis KT_SELECT_CONFIG) en inputs —\n ils priment donc sur ce token pour les chips rendus sous un multi-select. */\nexport interface KtChipsConfig {\n /** Libellé accessible du bouton de retrait d'un chip. Défaut : `'Remove X'`. */\n removeItemLabel: (itemLabel: string) => string;\n /** Annonce live après le retrait d'un chip. Défaut : `'X removed'`. */\n itemRemovedText: (itemLabel: string) => string;\n /** Libellé du bouton dépliant les chips repliés (`[maxVisible]`). Défaut : `'+N more'`. */\n moreLabel: (hiddenCount: number) => string;\n /** Libellé du même bouton une fois déplié. Défaut : `'Show less'`. */\n lessLabel: string;\n /** Libellé accessible du conteneur (`role=\"list\"`). Défaut : `'Selected items'`. */\n listLabel: string;\n}\n\nexport const KT_CHIPS_CONFIG = new InjectionToken<Partial<KtChipsConfig>>('KT_CHIPS_CONFIG');\n","import { NgTemplateOutlet, DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n NgZone,\n TemplateRef,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n signal,\n viewChildren,\n untracked,\n ChangeDetectorRef,\n PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { type KtKeyish, accessor, defaultIdentity, defaultLabel } from '../keyish';\nimport { KtChip } from './chip';\nimport { KtChipItemDef, type KtChipItemContext } from './chip-item-def';\nimport { ChipTransitionScope } from './chip-transition-scope';\nimport { KT_CHIPS_CONFIG } from './chips-config';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Délai avant effacement de l'annonce de retrait (live region). */\nconst STATUS_CLEAR_MS = 2000;\n\n/**\n * Liste de chips révocables (`role=\"list\"`) : repli au-delà de `maxVisible` (« +N more »),\n * annonces lecteur d'écran (live region TOUJOURS rendue, y compris liste vide) et gestion\n * du focus au retrait (chip suivant, sinon `emptyFocusTarget`).\n * La liste ne possède PAS la donnée : le retrait émet `removed` et le parent met à jour\n * `items` (pattern contrôlé). Rendu custom par chip via `ng-template[ktChipItem]` (projeté)\n * ou `[chipTemplate]` (TemplateRef forwardé, ex. depuis MultiSelect) — le focus management\n * ne voit pas les boutons des templates custom (view queries non traversantes) : le repli\n * `emptyFocusTarget` couvre ce cas.\n *\n * @example\n * ```html\n * <kt-chip-list [items]=\"tags()\" [maxVisible]=\"3\" (removed)=\"onRemoved($event)\" />\n * ```\n */\n@Component({\n selector: 'kt-chip-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './chip-list.html',\n styleUrl: './chip-list.css',\n imports: [KtChip, NgTemplateOutlet],\n providers: [{ provide: ChipTransitionScope, useExisting: KtChipList }],\n host: {\n '[attr.data-empty]': \"items().length === 0 ? '' : null\",\n // Marqueur de portée pendant la View Transition : les règles globales (tokens.css) ne\n // nomment les chips à template custom QUE sous ce marqueur (cf. ChipTransitionScope).\n '[attr.data-vt-active]': \"transitioning() ? '' : null\",\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class KtChipList<T> implements ChipTransitionScope {\n private readonly config = inject(KT_CHIPS_CONFIG, { optional: true });\n private readonly injector = inject(Injector);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly doc = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly ngZone = inject(NgZone);\n\n /** Vrai pendant la View Transition de CETTE liste : les chips (standards via Chip,\n custom via tokens.css) ne portent leur `view-transition-name` que dans cette fenêtre. */\n readonly transitioning = signal(false);\n\n /** Items affichés sous forme de chips (la liste ne possède pas la donnée : pattern contrôlé). */\n readonly items = input.required<readonly T[]>();\n /** Libellé d'un item : clé OU fonction. @default `label`/`name`, sinon `String(item)` */\n readonly itemLabel = input<KtKeyish<T, string>>();\n /** Identité d'un item (track du @for) : clé OU fonction. @default `id`/`value`, sinon l'item */\n readonly itemKey = input<KtKeyish<T, unknown>>();\n /** Chips révocables (bouton « retirer » par chip). @default true */\n readonly removable = input(true, { transform: booleanAttribute });\n /** Liste désactivée (boutons « retirer » présents mais inactifs). @default false */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Lecture seule : les boutons « retirer » sont absents (≠ disabled : présents mais inactifs). @default false */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Nombre maximal de chips affichés avant repli derrière « +N more ». @default undefined (illimité) */\n readonly maxVisible = input<number>();\n /** Libellé accessible de la liste (`aria-label`). Défaut : `KT_CHIPS_CONFIG.listLabel` ou « Selected items ». */\n readonly listLabel = input<string>();\n /** Construit le libellé du bouton « retirer » à partir du libellé de l'item. @default `« Remove {label} »` */\n readonly removeItemLabel = input<(itemLabel: string) => string>();\n /** Construit le message d'annonce après retrait (live region). @default `« {label} removed »` */\n readonly itemRemovedText = input<(itemLabel: string) => string>();\n /** Construit le libellé du bouton de repli à partir du nombre masqué. @default `« +{n} more »` */\n readonly moreLabel = input<(hiddenCount: number) => string>();\n /** Libellé du bouton qui replie la liste dépliée. Défaut : `KT_CHIPS_CONFIG.lessLabel` ou « Show less ». */\n readonly lessLabel = input<string>();\n /** Template custom forwardé (alternative au `ng-template[ktChipItem]` projeté). @default null */\n readonly chipTemplate = input<TemplateRef<KtChipItemContext<T>> | null>(null);\n /** Élément à focuser quand le dernier chip est retiré (ex. le trigger du champ parent). @default undefined */\n readonly emptyFocusTarget = input<HTMLElement>();\n\n /** Émis quand un chip est retiré (le parent doit retirer l'item de `items`).\n Payload : `{ item, index }` — l'item retiré et son index dans `items` au moment du retrait. */\n readonly removed = output<{ item: T; index: number }>();\n\n protected readonly itemDef = contentChild(KtChipItemDef);\n private readonly chips = viewChildren(KtChip);\n\n // --- Textes résolus (input > KT_CHIPS_CONFIG > défaut lib neutre EN) ---\n protected readonly resolvedListLabel = computed(() => this.listLabel() ?? this.config?.listLabel ?? 'Selected items');\n private readonly resolvedRemoveItemLabel = computed(\n () => this.removeItemLabel() ?? this.config?.removeItemLabel ?? ((l: string) => `Remove ${l}`),\n );\n private readonly resolvedItemRemovedText = computed(\n () => this.itemRemovedText() ?? this.config?.itemRemovedText ?? ((l: string) => `${l} removed`),\n );\n protected readonly resolvedMoreLabel = computed(\n () => this.moreLabel() ?? this.config?.moreLabel ?? ((n: number) => `+${n} more`),\n );\n protected readonly resolvedLessLabel = computed(() => this.lessLabel() ?? this.config?.lessLabel ?? 'Show less');\n\n // --- Accès aux items ---\n private readonly labelAccessor = computed(() => accessor<T, string>(this.itemLabel(), defaultLabel));\n private readonly keyAccessor = computed(() => accessor<T, unknown>(this.itemKey(), defaultIdentity));\n\n protected labelOf(item: T): string {\n return this.labelAccessor()(item);\n }\n protected keyOf(item: T): unknown {\n return this.keyAccessor()(item);\n }\n protected removeLabelFor(item: T): string {\n return this.resolvedRemoveItemLabel()(this.labelOf(item));\n }\n\n /** Template effectif : contenu projeté (ktChipItem) prioritaire sur l'input forwardé. */\n protected readonly effectiveTemplate = computed(() => this.itemDef()?.template ?? this.chipTemplate());\n\n protected readonly showRemove = computed(() => this.removable() && !this.readonly());\n\n // --- Repli au-delà de maxVisible ---\n protected readonly expanded = signal(false);\n protected readonly overflow = computed(() => {\n const max = this.maxVisible();\n return max !== undefined && this.items().length > max;\n });\n protected readonly hiddenCount = computed(() => {\n const max = this.maxVisible();\n if (max === undefined || this.expanded()) return 0;\n return Math.max(0, this.items().length - max);\n });\n protected readonly visibleItems = computed<readonly T[]>(() => {\n const all = this.items();\n const max = this.maxVisible();\n if (max === undefined || this.expanded() || all.length <= max) return all;\n return all.slice(0, max);\n });\n\n // --- Live region (toujours rendue, y compris liste vide) ---\n protected readonly status = signal('');\n private statusTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n // Repli automatique quand la liste repasse sous le seuil.\n effect(\n () => {\n if (this.overflow()) return;\n untracked(() => {\n this.expanded.set(false);\n });\n },\n { allowSignalWrites: true },\n );\n\n inject(DestroyRef).onDestroy(() => clearTimeout(this.statusTimer));\n }\n\n private readonly idGen = inject(KtIdGenerator);\n protected readonly moreBtnTransitionName = `chip-list-more-${this.idGen.generateId('chip-list')}`;\n\n /** Annonce un message dans la live region de la liste (effacé après ~2 s).\n Public : permet au parent d'annoncer des actions liées (ex. « tout effacer »). */\n announce(text: string): void {\n clearTimeout(this.statusTimer);\n this.status.set(text);\n this.statusTimer = setTimeout(() => this.status.set(''), STATUS_CLEAR_MS);\n }\n\n private activeTransition: ViewTransition | null = null;\n\n /** Exécute `action` dans une View Transition (morph des chips qui se déplacent, entrée/sortie\n stylées via `::view-transition-*(.chip-transition)` — cf. tokens.css). Transition SCOPÉE à\n l'élément quand le navigateur le permet (`element.startViewTransition`, Chrome 147+) ; sinon\n transition document — dans les deux cas, seuls les chips de CETTE liste sont nommés (cf.\n `transitioning`). Fallback : action directe si l'API est absente ou si l'utilisateur\n préfère moins de mouvement. */\n private withViewTransition(action: () => void): void {\n if (!isPlatformBrowser(this.platformId)) {\n action();\n return;\n }\n // Garde matchMedia : absent en SSR/jsdom (même convention que le gating mobile du select).\n const prefersReducedMotion =\n typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n // Enhancement progressif : transition scopée au sous-arbre de la liste si disponible\n // (capture moins chère, le reste de la page n'est pas concerné), sinon document entier.\n const hostEl = this.host.nativeElement as HTMLElement & {\n startViewTransition?: (update: () => void) => ViewTransition;\n };\n const startViewTransition =\n hostEl.startViewTransition?.bind(hostEl) ??\n (this.doc.startViewTransition?.bind(this.doc) as typeof hostEl.startViewTransition);\n if (!startViewTransition || prefersReducedMotion) {\n action();\n return;\n }\n\n // Interactions rapprochées : Chrome DIFFÈRE le callback d'une transition démarrée pendant\n // qu'une autre est active (UI périmée pour le clic suivant, update parfois perdue — vérifié).\n // On n'empile donc jamais : la transition en vol est sautée (son callback en attente est\n // flushé par skipTransition) et l'action s'applique directement, sans animation.\n if (this.activeTransition) {\n this.activeTransition.skipTransition();\n this.activeTransition = null;\n action();\n return;\n }\n\n // Nommer les chips de CETTE liste AVANT la capture de l'état « avant » (rendu synchrone\n // obligatoire : un nom absent du snapshot « avant » ferait passer chaque chip pour un\n // entrant). Les chips des autres listes restent anonymes => ils suivent le fondu racine.\n this.transitioning.set(true);\n this.cdr.detectChanges();\n\n const vt = startViewTransition(() => {\n // `items` est un input POSSÉDÉ par le parent (`[items]=\"selectedOptions()\"` côté MultiSelect) :\n // le retrait émet `removed`, le parent met à jour son signal, et seule une CD du PARENT re-pousse\n // le nouvel `items` dans cette liste. Une CD locale (`cdr.detectChanges()`) ne verrait que l'ancien\n // input → snapshot « après » identique au « avant » → aucune animation. Une CD globale forcée\n // (`appRef.tick()`) corrigerait le rendu mais ajouterait une passe synchrone sur toute l'appli à\n // chaque retrait. On préfère DIFFÉRER la capture de l'état « après » : le callback d'une View\n // Transition peut renvoyer une Promise, le navigateur attend sa résolution avant le snapshot.\n // On déclenche la mutation dans la zone (la CD déjà planifiée, OnPush, ne vérifie que les vues\n // « dirty » : pas de passe globale supplémentaire) et on résout au prochain rendu.\n this.ngZone.run(action);\n return new Promise<void>((resolve) => {\n let settled = false;\n const done = () => {\n if (settled) return;\n settled = true;\n resolve();\n };\n afterNextRender({ read: done }, { injector: this.injector });\n // Garde-fou : si aucun rendu n'est planifié (retrait ignoré par le parent), ne pas figer la page.\n this.ngZone.runOutsideAngular(() => setTimeout(done, 100));\n });\n });\n this.activeTransition = vt;\n // `ready` rejette (AbortError) si la transition est sautée : attendu, ne pas laisser\n // remonter en unhandled rejection.\n vt.ready.catch(() => undefined);\n vt.finished.finally(() => {\n if (this.activeTransition === vt) this.activeTransition = null;\n this.transitioning.set(false);\n });\n }\n\n /** Retrait demandé : annonce, émet vers le parent (qui met à jour `items`), puis focus\n le chip suivant — sinon `emptyFocusTarget` (le bouton focusé disparaît du DOM). */\n protected removeAt(item: T, index: number): void {\n if (this.disabled() || this.readonly()) return;\n this.announce(this.resolvedItemRemovedText()(this.labelOf(item)));\n\n this.withViewTransition(() => {\n this.removed.emit({ item, index });\n afterNextRender(\n {\n read: () => {\n const hostEl = this.host.nativeElement;\n const focusables = Array.from(\n hostEl.querySelectorAll(\n '.kt-chip__remove, .kt-chip-list__item button, .kt-chip-list__item [tabindex=\"0\"]',\n ),\n ) as HTMLElement[];\n const target = focusables[Math.min(index, focusables.length - 1)];\n if (target) {\n target.focus();\n return;\n }\n this.emptyFocusTarget()?.focus();\n },\n },\n { injector: this.injector },\n );\n });\n }\n\n protected removeCallback(item: T, index: number): () => void {\n return () => this.removeAt(item, index);\n }\n\n /** Déplie/replie ; au dépliage, focus sur le premier chip nouvellement révélé. */\n protected toggleExpanded(): void {\n this.withViewTransition(() => {\n const expand = !this.expanded();\n this.expanded.set(expand);\n if (!expand) return;\n const firstRevealed = this.maxVisible() ?? 0;\n afterNextRender(\n {\n read: () => {\n const hostEl = this.host.nativeElement;\n const focusables = Array.from(\n hostEl.querySelectorAll(\n '.kt-chip__remove, .kt-chip-list__item button, .kt-chip-list__item [tabindex=\"0\"]',\n ),\n ) as HTMLElement[];\n focusables[firstRevealed]?.focus();\n },\n },\n { injector: this.injector },\n );\n });\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const key = event.key;\n if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) {\n return;\n }\n\n const hostEl = this.host.nativeElement;\n const focusables = Array.from(\n hostEl.querySelectorAll(\n '.kt-chip__remove, .kt-chip-list__item button, .kt-chip-list__item [tabindex=\"0\"], .kt-chip-list__more',\n ),\n ) as HTMLElement[];\n\n if (focusables.length === 0) return;\n\n const active = this.doc.activeElement as HTMLElement;\n const currentIndex = focusables.indexOf(active);\n\n let nextIndex = -1;\n if (key === 'ArrowRight' || key === 'ArrowDown') {\n nextIndex = currentIndex + 1;\n } else if (key === 'ArrowLeft' || key === 'ArrowUp') {\n nextIndex = currentIndex - 1;\n } else if (key === 'Home') {\n nextIndex = 0;\n } else if (key === 'End') {\n nextIndex = focusables.length - 1;\n }\n\n if (nextIndex >= 0 && nextIndex < focusables.length) {\n event.preventDefault();\n focusables[nextIndex].focus();\n }\n }\n}\n","@if (items().length > 0) {\n <div class=\"kt-chip-list\">\n <div class=\"kt-chip-list__items\" role=\"list\" [attr.aria-label]=\"resolvedListLabel()\">\n @for (item of visibleItems(); track keyOf(item); let i = $index) {\n @if (effectiveTemplate(); as tpl) {\n <div role=\"listitem\" class=\"kt-chip-list__item\">\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item, remove: removeCallback(item, i) }\"\n />\n </div>\n } @else {\n <kt-chip\n role=\"listitem\"\n [removable]=\"showRemove()\"\n [disabled]=\"disabled()\"\n [removeLabel]=\"removeLabelFor(item)\"\n (remove)=\"removeAt(item, i)\"\n >{{ labelOf(item) }}</kt-chip\n >\n }\n }\n </div>\n <!-- Le bouton de repli/dépli n'est PAS un chip : hors du role=\"list\" pour ne pas être\n annoncé comme un item de la liste (reste dans la même rangée flex). -->\n @if (overflow()) {\n <button\n type=\"button\"\n class=\"kt-chip-list__more\"\n [attr.aria-expanded]=\"expanded()\"\n [style.view-transition-name]=\"transitioning() ? moreBtnTransitionName : null\"\n [style.view-transition-class]=\"'chip-transition'\"\n (click)=\"toggleExpanded()\"\n >\n {{ expanded() ? resolvedLessLabel() : resolvedMoreLabel()(hiddenCount()) }}\n </button>\n }\n </div>\n}\n<!-- Annonce des retraits : TOUJOURS rendue (hors du @if, sinon elle disparaît avec le dernier chip). -->\n<div class=\"kt-chip-list__status\" role=\"status\" aria-live=\"polite\">{{ status() }}</div>\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Contexte typé reçu par le template d'une option (`ktMultiSelectOption`). */\nexport interface KtMultiSelectOptionContext<T> {\n /** L'option en cours de rendu → `let-option`. */\n $implicit: T;\n /** L'option est-elle sélectionnée ? → `let-selected=\"selected\"`. */\n selected: boolean;\n /** L'option est-elle active (survol/clavier) ? → `let-active=\"active\"`. */\n active: boolean;\n}\n\n/** Contexte typé reçu par le template du trigger (`ktMultiSelectTrigger`). */\nexport interface KtMultiSelectTriggerContext<T> {\n /** Les options sélectionnées (tableau d'objets) → `let-options`. */\n $implicit: readonly T[];\n}\n\n/** Contexte typé reçu par le template de chip (`ktMultiSelectChip`). */\nexport interface KtMultiSelectChipContext<T> {\n /** L'option sélectionnée correspondante → `let-option`. */\n $implicit: T;\n /** Fonction pour retirer cet élément de la sélection → `let-remove=\"remove\"`. */\n remove: () => void;\n}\n\n/** Template de rendu d'une option dans la liste du multi-select. L'input sert à inférer `T` ;\n `ngTemplateContextGuard` type les variables `let-`.\n Contexte : `let-option` = l'option (`T`), `let-selected` / `let-active` = booléens.\n\n ```html\n <kt-multi-select [options]=\"tags\">\n <ng-template [ktMultiSelectOption]=\"tags\" let-tag let-selected=\"selected\">\n <tag-badge [tag]=\"tag\" /> @if (selected) { ✓ }\n </ng-template>\n </kt-multi-select>\n ``` */\n@Directive({ selector: 'ng-template[ktMultiSelectOption]' })\nexport class KtMultiSelectOptionDef<T> {\n readonly ktMultiSelectOption = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtMultiSelectOptionContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: KtMultiSelectOptionDef<T>,\n ctx: unknown,\n ): ctx is KtMultiSelectOptionContext<T> {\n return typeof ctx === 'object';\n }\n}\n\n/** Template de rendu du trigger (contenu du bouton déclencheur) pour le multi-select.\n Contexte : `let-options` = le tableau des options sélectionnées (`readonly T[]`).\n\n ```html\n <kt-multi-select [options]=\"tags\">\n <ng-template [ktMultiSelectTrigger]=\"tags\" let-options>\n @if (options.length) { {{ options.length }} sélectionné(s) } @else { Choisir… }\n </ng-template>\n </kt-multi-select>\n ``` */\n@Directive({ selector: 'ng-template[ktMultiSelectTrigger]' })\nexport class KtMultiSelectTriggerDef<T> {\n readonly ktMultiSelectTrigger = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtMultiSelectTriggerContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: KtMultiSelectTriggerDef<T>,\n ctx: unknown,\n ): ctx is KtMultiSelectTriggerContext<T> {\n return typeof ctx === 'object';\n }\n}\n\n/** Template de rendu d'un jeton (chip) affiché sous le multi-select.\n Contexte : `let-option` = l'option sélectionnée (`T`), `let-remove` = fonction qui la retire.\n\n ```html\n <kt-multi-select [options]=\"tags\">\n <ng-template [ktMultiSelectChip]=\"tags\" let-tag let-remove=\"remove\">\n <kt-chip [removable]=\"true\" (remove)=\"remove()\">{{ tag.name }}</kt-chip>\n </ng-template>\n </kt-multi-select>\n ``` */\n@Directive({ selector: 'ng-template[ktMultiSelectChip]' })\nexport class KtMultiSelectChipDef<T> {\n readonly ktMultiSelectChip = input.required<readonly T[]>();\n readonly template = inject<TemplateRef<KtMultiSelectChipContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(_dir: KtMultiSelectChipDef<T>, ctx: unknown): ctx is KtMultiSelectChipContext<T> {\n return typeof ctx === 'object';\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n contentChild,\n input,\n model,\n output,\n viewChild,\n} from '@angular/core';\nimport { Combobox, ComboboxPopup, ComboboxWidget } from '@angular/aria/combobox';\nimport { Listbox, Option } from '@angular/aria/listbox';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { KtBaseSelect } from '../base-select/base-select';\nimport { KtChipList } from '../chips/chip-list';\nimport { KtMultiSelectOptionDef, KtMultiSelectTriggerDef, KtMultiSelectChipDef } from './multi-select-option-def';\nimport { DEFAULT_KT_SELECT_CONFIG } from '../select/select-config';\n\nexport type { KtKeyish } from '../base-select/base-select';\n\n/** Payload de l'évènement `selectionChange` d'un `kt-multi-select`. */\nexport interface KtMultiSelectSelectionChange<T, V = T> {\n /** Valeurs émises : clés extraites ou objets entiers, dans l'ordre de sélection. */\n value: V[];\n /** Options correspondantes, dans l'ordre de sélection. */\n options: T[];\n}\n\n/**\n * Composant de sélection multiple (Multi-Select) conforme aux exigences d'accessibilité (WCAG 2.2 AAA / RGAA).\n * Repose sur `@angular/aria/combobox` et `@angular/aria/listbox` avec [multi]=\"true\".\n * Présentation adaptative : dropdown (desktop) ou bottom-sheet modale (téléphone tactile).\n * Option 1 : Résumé textuel sur le trigger et chips révocables affichés en dessous.\n *\n * Clavier multi-sélection (APG) : Espace/Entrée toggle, Shift+flèches étend la sélection,\n * Ctrl+A tout (dé)sélectionne, Shift+Espace sélectionne la plage, typeahead — majoritairement\n * natifs via `@angular/aria` ; les combos non relayés par la lib le sont via `onTriggerKeydown`.\n * Tout le commun (popup, filtre, clavier, drag-to-dismiss) vit dans `BaseSelect`.\n *\n * @template T Type d'une option (élément du tableau `options`).\n * @template V Type des valeurs émises (défaut `T` ; clés extraites si `optionValue` est fourni).\n *\n * @example\n * ```html\n * <kt-multi-select\n * [options]=\"tags\"\n * optionLabel=\"name\"\n * optionValue=\"id\"\n * [(value)]=\"selectedIds\"\n * (selectionChange)=\"onSelectionChange($event)\" />\n * ```\n */\n@Component({\n selector: 'kt-multi-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './multi-select.html',\n styleUrls: ['../styles/select-panel.css', './multi-select.css'],\n imports: [\n KtField,\n KtFieldControl,\n NgTemplateOutlet,\n Combobox,\n ComboboxPopup,\n ComboboxWidget,\n Listbox,\n Option,\n KtChipList,\n ],\n})\nexport class KtMultiSelect<T, V = T> extends KtBaseSelect<T, V> implements FormValueControl<V[]> {\n // --- Modèle réactif ---\n /** Valeurs sélectionnées (clés extraites, ou objets entiers si `optionValue` est omis). @default [] */\n readonly value = model<V[]>([]);\n /** Émis à chaque (dé)sélection. Payload : `{ value, options }` — `value` le tableau des valeurs émises\n (clés ou objets), `options` les objets options correspondants, dans l'ordre de sélection. */\n readonly selectionChange = output<KtMultiSelectSelectionChange<T, V>>();\n\n // --- Présentation / Configuration (spécifique multi) ---\n /** Bouton « tout effacer » sur le champ (même contrat que `clearable` de BaseInputField). @default false */\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Libellé i18n du bouton « tout effacer ». @default 'Clear' (ou KT_FIELD_CONFIG.clearLabel) */\n readonly clearLabel = input<string>(this.fieldConfig?.clearLabel ?? 'Clear');\n /** Barre « Tout sélectionner / Tout effacer » en tête du popup (bascule le popup en panneau dialog). */\n readonly selectionActions = input(false, { transform: booleanAttribute });\n /** Nombre maximal de chips affichés avant repli derrière un bouton « +N more ». Défaut : illimité. */\n readonly maxVisibleChips = input<number>();\n\n // --- Templates projetés ---\n protected readonly optionDef = contentChild(KtMultiSelectOptionDef);\n protected readonly triggerDef = contentChild(KtMultiSelectTriggerDef);\n protected readonly chipDef = contentChild(KtMultiSelectChipDef);\n\n private readonly chipList = viewChild(KtChipList);\n\n // --- Textes résolus spécifiques multi (input > KT_SELECT_CONFIG > DEFAULT_KT_SELECT_CONFIG centralisé) ---\n protected readonly resolvedRemoveItemLabel = computed(\n () => this.config?.removeItemLabel ?? DEFAULT_KT_SELECT_CONFIG.removeItemLabel,\n );\n protected readonly resolvedSelectedItemsLabel = computed(() =>\n (this.config?.selectedItemsLabel ?? DEFAULT_KT_SELECT_CONFIG.selectedItemsLabel)(this.label()),\n );\n private readonly resolvedSelectionSummaryText = computed(\n () => this.config?.selectionSummaryText ?? DEFAULT_KT_SELECT_CONFIG.selectionSummaryText,\n );\n protected readonly resolvedItemRemovedText = computed(\n () => this.config?.itemRemovedText ?? DEFAULT_KT_SELECT_CONFIG.itemRemovedText,\n );\n private readonly resolvedSelectionCountText = computed(\n () => this.config?.selectionCountText ?? DEFAULT_KT_SELECT_CONFIG.selectionCountText,\n );\n protected readonly resolvedSelectAllLabel = computed(\n () => this.config?.selectAllLabel ?? DEFAULT_KT_SELECT_CONFIG.selectAllLabel,\n );\n protected readonly resolvedClearAllLabel = computed(\n () => this.config?.clearAllLabel ?? DEFAULT_KT_SELECT_CONFIG.clearAllLabel,\n );\n protected readonly resolvedMoreChipsLabel = computed(\n () => this.config?.moreChipsLabel ?? DEFAULT_KT_SELECT_CONFIG.moreChipsLabel,\n );\n protected readonly resolvedLessChipsLabel = computed(\n () => this.config?.lessChipsLabel ?? DEFAULT_KT_SELECT_CONFIG.lessChipsLabel,\n );\n\n /** Accesseurs bridgés vers le ChipList (fonctions fléchées : une référence de méthode\n non liée perdrait `this`). */\n protected readonly chipLabelOf = (item: T): string => this.labelOf(item);\n protected readonly chipKeyOf = (item: T): unknown => this.keyOf(item);\n\n /** Options correspondant aux entrées de `value`, dans l'ordre de sélection.\n Mode objet : chaque entrée est ramenée à l'option canonique équivalente (compareWith). */\n protected readonly selectedOptions = computed<T[]>(() => {\n const vals = this.value() ?? [];\n if (vals.length === 0) return [];\n const opts = this.options();\n if (this.optionValue() !== undefined) {\n return vals.map((v) => opts.find((o) => this.keyOf(o) === (v as unknown))).filter((o): o is T => o !== undefined);\n }\n const cmp = this.comparator();\n return vals.map((v) => opts.find((o) => cmp(o, v as unknown as T)) ?? (v as unknown as T));\n });\n\n // Texte synthétique du trigger (Option 1)\n protected readonly triggerText = computed(() => {\n const selected = this.selectedOptions();\n if (selected.length === 0) return '';\n if (selected.length <= 3) {\n return selected.map((o) => this.labelOf(o)).join(', ');\n }\n return this.resolvedSelectionSummaryText()(selected.length);\n });\n\n /** Valeur brute transmise au ngListbox sous-jacent (tableau de clés). */\n protected override readonly listboxValue = computed<unknown[]>(() =>\n this.selectedOptions().map((o) => this.keyOf(o)),\n );\n\n // --- Tout effacer depuis le champ (clearable) ---\n protected readonly showClear = computed(\n () => this.clearable() && !this.disabled() && !this.readonly() && this.selectedOptions().length > 0,\n );\n\n /** Le popup utilise la structure « panneau dialog » (champ de filtre et/ou barre d'actions). */\n protected readonly dialogMode = computed(() => this.filterable() || this.selectionActions());\n\n /** Compteur de sélection affiché dans le panneau (info déjà portée par la live region → aria-hidden). */\n protected readonly selectionCountLabel = computed(() =>\n this.resolvedSelectionCountText()(this.selectedOptions().length),\n );\n\n /** Clé listbox d'une entrée de `value` (mode objet : clé de l'option canonique équivalente). */\n private entryKey(v: V): unknown {\n if (this.optionValue() !== undefined) return v;\n const cmp = this.comparator();\n const option = this.options().find((o) => cmp(o, v as unknown as T));\n return option !== undefined ? this.keyOf(option) : this.keyOf(v as unknown as T);\n }\n\n /** Entrée de `value` à committer pour une clé listbox (mode objet : l'option entière). */\n private entryForKey(key: unknown): V | undefined {\n const option = this.options().find((o) => this.keyOf(o) === key);\n if (option === undefined) return undefined;\n return this.optionValue() !== undefined ? (key as V) : (option as unknown as V);\n }\n\n protected override onListboxValueChange(keys: readonly unknown[]): void {\n // Le listbox ne connaît que les options RENDUES : quand le filtre en masque, sa purge\n // interne retire leurs clés (pas un geste utilisateur). On conserve donc les entrées\n // hors vue, on applique les (dé)sélections visibles dans l'ordre courant, et on ignore\n // l'événement si rien n'a réellement changé (sinon touched/selectionChange parasites).\n const current = this.value() ?? [];\n const visibleKeys = new Set(this.displayedOptions().map((o) => this.keyOf(o)));\n const keptKeys = new Set(keys);\n const kept = current.filter((v) => {\n const k = this.entryKey(v);\n return !visibleKeys.has(k) || keptKeys.has(k);\n });\n const currentKeys = new Set(current.map((v) => this.entryKey(v)));\n const added = keys\n .filter((k) => !currentKeys.has(k))\n .map((k) => this.entryForKey(k))\n .filter((v): v is V => v !== undefined);\n if (kept.length === current.length && added.length === 0) return;\n this.commitValue([...kept, ...added]);\n }\n\n private commitValue(next: V[]): void {\n this.value.set(next);\n this.touched.set(true);\n this.selectionChange.emit({ value: next, options: this.selectedOptions() });\n }\n\n /** Comble les combos que le relay du combobox ne transmet pas en activedescendant :\n Shift+Espace (sélection de plage) et Ctrl/Cmd+Shift+Home/End (plage jusqu'aux bornes). */\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (!this.expanded() || this.compact()) return;\n const shiftSpace = event.key === ' ' && event.shiftKey && !event.ctrlKey && !event.metaKey;\n const rangeToEdge =\n (event.key === 'Home' || event.key === 'End') && event.shiftKey && (event.ctrlKey || event.metaKey);\n if (!shiftSpace && !rangeToEdge) return;\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n event.preventDefault();\n listbox.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: event.key,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n cancelable: true,\n }),\n );\n }\n\n /** En panneau dialog, le relay du combobox vise le widget (la div), pas le listbox descendant :\n on fait suivre au listbox les événements relayés (target = la div elle-même uniquement —\n les keydown des éléments internes, qui bubblent, ne sont pas re-forwardés). */\n protected onPanelKeydown(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) return;\n const listbox = this.listboxEl()?.nativeElement;\n if (!listbox) return;\n listbox.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: event.key,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n cancelable: true,\n }),\n );\n }\n\n /** « N results » + « , M selected » quand des sélections existent (dont celles hors filtre). */\n protected override composeFilterAnnouncement(): string {\n const base = super.composeFilterAnnouncement();\n if (base === '') return '';\n const selectedCount = this.selectedOptions().length;\n if (selectedCount === 0) return base;\n return `${base}, ${this.resolvedSelectionCountText()(selectedCount)}`;\n }\n\n /** Retire une option de la valeur (annonce et focus : délégués au ChipList). */\n protected removeOption(option: T): void {\n if (this.disabled() || this.readonly()) return;\n const current = this.value() ?? [];\n const next = this.removeFromValue(option);\n if (next.length === current.length) return;\n this.commitValue(next);\n }\n\n private removeFromValue(option: T): V[] {\n const current = this.value() ?? [];\n if (this.optionValue() !== undefined) {\n const key = this.keyOf(option);\n return current.filter((v) => (v as unknown) !== key);\n }\n const cmp = this.comparator();\n return current.filter((v) => !cmp(v as unknown as T, option));\n }\n\n /** Vide toute la sélection depuis le champ (bouton `clearable`). */\n protected clearSelection(): void {\n if (!this.showClear()) return;\n this.commitValue([]);\n this.chipList()?.announce(this.resolvedSelectionCountText()(0));\n this.triggerEl()?.nativeElement.focus();\n }\n\n /** Sélectionne toutes les options visibles non désactivées (sémantique du Ctrl+A natif :\n avec un filtre actif, seules les options filtrées sont concernées). */\n protected selectAllFiltered(): void {\n if (this.disabled() || this.readonly()) return;\n const current = this.value() ?? [];\n const currentKeys = new Set(current.map((v) => this.entryKey(v)));\n const added = this.filteredOptions()\n .filter((o) => !this.disabledOf(o) && !currentKeys.has(this.keyOf(o)))\n .map((o) => (this.optionValue() !== undefined ? (this.keyOf(o) as V) : (o as unknown as V)));\n if (added.length === 0) return;\n this.commitValue([...current, ...added]);\n this.announceSelectionCount();\n }\n\n /** Désélectionne toutes les options visibles (les sélections masquées par le filtre restent). */\n protected clearAllFiltered(): void {\n if (this.disabled() || this.readonly()) return;\n const current = this.value() ?? [];\n const visibleKeys = new Set(this.filteredOptions().map((o) => this.keyOf(o)));\n const next = current.filter((v) => !visibleKeys.has(this.entryKey(v)));\n if (next.length === current.length) return;\n this.commitValue(next);\n this.announceSelectionCount();\n }\n\n /** Annonce immédiate (action ponctuelle, pas de débounce) du total sélectionné. */\n private announceSelectionCount(): void {\n this.announceNow(this.resolvedSelectionCountText()(this.selectedOptions().length));\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"fieldErrors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div class=\"kt-select\" [class.kt-select--open]=\"expanded()\">\n <button\n #combobox=\"ngCombobox\"\n #trigger\n ngCombobox\n ktFieldControl\n type=\"button\"\n class=\"kt-field-box kt-select__trigger\"\n [class.kt-select__trigger--clearable]=\"showClear()\"\n [(expanded)]=\"expanded\"\n [disabled]=\"disabled()\"\n [softDisabled]=\"false\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n [attr.data-filled]=\"selectedOptions().length ? '' : null\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"kt-select__value\">\n @if (triggerDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedOptions() }\"\n />\n } @else if (selectedOptions().length > 0) {\n {{ triggerText() }}\n } @else {\n <span class=\"kt-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n </span>\n <span class=\"kt-select__arrow\" aria-hidden=\"true\">arrow_drop_down</span>\n </button>\n\n <!-- Tout effacer depuis le champ : sibling du trigger (pas de bouton imbriqué dans un bouton). -->\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"kt-select__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"clearSelection()\"\n >\n <span class=\"kt-select__clear-icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n <!-- Popup Popover (top-layer). Même logique mobile bottom-sheet adaptative que le select classique. -->\n <ng-template ngComboboxPopup [combobox]=\"combobox\" [popupType]=\"dialogMode() ? 'dialog' : 'listbox'\">\n <div #popup popover=\"manual\" class=\"kt-select__popup\" [class.kt-select__popup--sheet]=\"compact()\">\n @if (compact()) {\n <div class=\"kt-select__sheet-scrim\" aria-hidden=\"true\" (click)=\"expanded.set(false)\"></div>\n }\n <div class=\"kt-select__sheet-card\">\n @if (compact()) {\n <div\n class=\"kt-select__sheet-grab\"\n aria-hidden=\"true\"\n (pointerdown)=\"onDragStart($event)\"\n (mousedown)=\"$event.preventDefault()\"\n ></div>\n <header class=\"kt-select__sheet-header\">\n <span class=\"kt-select__sheet-title\">{{ label() }}</span>\n <button\n type=\"button\"\n class=\"kt-select__sheet-close\"\n [attr.aria-label]=\"resolvedCloseLabel()\"\n (click)=\"expanded.set(false)\"\n >\n <span class=\"kt-select__sheet-close-icon\" aria-hidden=\"true\">close</span>\n </button>\n </header>\n }\n @if (dialogMode()) {\n <!-- Mode panneau (filtre et/ou actions de masse) : Widget Dialog -->\n <div\n ngComboboxWidget\n role=\"dialog\"\n class=\"kt-select__panel\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label()\"\n [activeDescendant]=\"lb.activeDescendant()\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @if (selectionActions()) {\n <div class=\"kt-select__actions\">\n <button type=\"button\" class=\"kt-select__action\" (click)=\"selectAllFiltered()\">\n {{ resolvedSelectAllLabel() }}\n </button>\n <button type=\"button\" class=\"kt-select__action\" (click)=\"clearAllFiltered()\">\n {{ resolvedClearAllLabel() }}\n </button>\n </div>\n }\n @if (filterable()) {\n <div class=\"kt-select__filter\">\n <input\n #filterInput\n type=\"search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n class=\"kt-select__filter-input\"\n autocomplete=\"off\"\n [placeholder]=\"resolvedFilterPlaceholder()\"\n [attr.aria-label]=\"resolvedFilterLabel()\"\n [attr.aria-controls]=\"lb.id()\"\n [attr.aria-activedescendant]=\"lb.activeDescendant()\"\n [value]=\"filterText()\"\n (input)=\"onFilterInput($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n />\n </div>\n }\n @if (selectedOptions().length > 0) {\n <!-- Rappel visuel (sélections potentiellement masquées par le filtre) ;\n l'info SR passe par la live region ci-dessous → aria-hidden. -->\n <div class=\"kt-select__count\" aria-hidden=\"true\">{{ selectionCountLabel() }}</div>\n }\n <div class=\"kt-select__sr-only kt-select__filter-status\" role=\"status\" aria-live=\"polite\">\n {{ announcedCount() }}\n </div>\n <ul\n #lb=\"ngListbox\"\n #listboxEl\n ngListbox\n [multi]=\"true\"\n [focusMode]=\"compact() && !filterable() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n >\n @for (item of displayedOptions(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option kt-select__option--multiple\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n <span class=\"kt-select__checkbox\" aria-hidden=\"true\">\n @if (opt.selected()) {\n <span class=\"kt-select__checkbox-icon\">check_box</span>\n } @else {\n <span class=\"kt-select__checkbox-icon\">check_box_outline_blank</span>\n }\n </span>\n <span class=\"kt-select__option-content\">\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n selected: !!opt.selected(),\n active: opt.active(),\n }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </span>\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n @if (filterable() && filteredOptions().length > maxVisibleOptions()) {\n <li class=\"kt-select__truncated-info\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedTruncatedResultsText()(maxVisibleOptions(), filteredOptions().length) }}\n </li>\n }\n </ul>\n </div>\n } @else {\n <!-- Mode simple : Widget Listbox direct -->\n <ul\n #listbox=\"ngListbox\"\n #listboxEl\n ngComboboxWidget\n ngListbox\n [multi]=\"true\"\n [focusMode]=\"compact() ? 'roving' : 'activedescendant'\"\n selectionMode=\"explicit\"\n class=\"kt-select__listbox\"\n [attr.aria-label]=\"label()\"\n [value]=\"listboxValue()\"\n (valueChange)=\"onListboxValueChange($event)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [activeDescendant]=\"listbox.activeDescendant()\"\n >\n @for (item of options(); track keyOf(item)) {\n <li\n #opt=\"ngOption\"\n ngOption\n class=\"kt-select__option kt-select__option--multiple\"\n [value]=\"keyOf(item)\"\n [label]=\"labelOf(item)\"\n [disabled]=\"disabledOf(item)\"\n [class.kt-select__option--active]=\"opt.active()\"\n >\n <span class=\"kt-select__checkbox\" aria-hidden=\"true\">\n @if (opt.selected()) {\n <span class=\"kt-select__checkbox-icon\">check_box</span>\n } @else {\n <span class=\"kt-select__checkbox-icon\">check_box_outline_blank</span>\n }\n </span>\n <span class=\"kt-select__option-content\">\n @if (optionDef(); as def) {\n <ng-container\n [ngTemplateOutlet]=\"def.template\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n selected: !!opt.selected(),\n active: opt.active(),\n }\"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </span>\n </li>\n } @empty {\n <li class=\"kt-select__empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n {{ resolvedEmptyText() }}\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </ng-template>\n </div>\n\n <!-- Chips révocables (Option 1) sous le trigger : délégués au composant réutilisable\n kt-chip-list (focus management, repli +N, live region). Les textes résolus depuis\n KT_SELECT_CONFIG sont passés en inputs (ils priment sur un éventuel KT_CHIPS_CONFIG). -->\n <kt-chip-list\n [items]=\"selectedOptions()\"\n [itemLabel]=\"chipLabelOf\"\n [itemKey]=\"chipKeyOf\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [maxVisible]=\"maxVisibleChips()\"\n [listLabel]=\"resolvedSelectedItemsLabel()\"\n [removeItemLabel]=\"resolvedRemoveItemLabel()\"\n [itemRemovedText]=\"resolvedItemRemovedText()\"\n [moreLabel]=\"resolvedMoreChipsLabel()\"\n [lessLabel]=\"resolvedLessChipsLabel()\"\n [chipTemplate]=\"chipDef()?.template ?? null\"\n [emptyFocusTarget]=\"triggerEl()?.nativeElement\"\n (removed)=\"removeOption($event.item)\"\n />\n</kt-field>\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, computed, input, effect, inject } from '@angular/core';\nimport { KtBaseInputField } from './base-input/base-input';\nimport { type KtSuggestion, normalizeKtSuggestions } from './datalist';\nimport { KtIdGenerator } from '@ktortu/aaa/cdk';\n\n/** Base partagée des champs Temporal (Date/Time/DateTime/YearMonth).\n Toute la logique commune (parsing tolérant, valeur vide `null`, synchronisation de l'input natif)\n vit ici ; chaque sous-classe ne fournit que la construction et la sérialisation propres\n à son type Temporal (`fromString` / `serialize`).\n\n Contrat abstrait : une sous-classe implémente uniquement le couple\n `fromString` (chaîne ISO de l'input natif → valeur typée `T`) et `serialize`\n (valeur `T` → chaîne ISO pour l'attribut `[value]` de l'input). La valeur exposée\n reste toujours `T | null`, où `null` représente le champ vide ; le parsing est\n tolérant (saisie partielle/invalide → `null`, jamais d'exception ni de valeur fausse).\n\n @template T Type Temporal porté par le champ (ex. `Temporal.PlainDate`,\n `Temporal.PlainTime`, …). Doit exposer `toString()`. La valeur du champ est `T | null`.\n\n @example\n ```ts\n // Sous-classer : ne fournir que fromString (input natif → T) et serialize (T → input natif).\n export class KtDateField extends KtBaseTemporalField<Temporal.PlainDate> {\n protected override fromString(raw: string): Temporal.PlainDate {\n return Temporal.PlainDate.from(raw);\n }\n protected override serialize(value: Temporal.PlainDate): string {\n return value.toString();\n }\n }\n ``` */\n@Directive()\nexport abstract class KtBaseTemporalField<T extends { toString(): string }> extends KtBaseInputField<T | null> {\n private readonly doc = inject(DOCUMENT);\n\n constructor() {\n super();\n effect(() => {\n const val = this.value();\n const ref = this.inputRef();\n if (!ref) return;\n const inputEl = ref.nativeElement;\n const serialized = val === null ? '' : this.serialize(val);\n const isFocused = this.doc.activeElement === inputEl;\n if (inputEl.value !== serialized && (!isFocused || val !== null)) {\n inputEl.value = serialized;\n }\n });\n }\n\n /** Construit la valeur typée depuis la chaîne ISO de l'input natif (ex. `Temporal.PlainDate.from`). */\n protected abstract fromString(raw: string): T;\n /** Sérialise la valeur au format attendu par l'input natif (précision adaptée au type). */\n protected abstract serialize(value: T): string;\n\n protected override parse(raw: string): T | null {\n if (raw === '') return null;\n try {\n return this.fromString(raw);\n } catch {\n // Saisie partielle/invalide (RangeError) → vide, jamais une valeur fausse.\n return null;\n }\n }\n\n protected override emptyValue(): T | null {\n return null;\n }\n\n protected override isEmpty(value: T | null): boolean {\n return value === null;\n }\n\n /** Borne minimale autorisée (membre `min` du contrat `FormValueControl`, aussi posé en attribut\n `min` natif via `serialize`). Non bornée par défaut. @default undefined */\n readonly min = input<T>();\n /** Borne maximale autorisée (membre `max` du contrat `FormValueControl`, aussi posé en attribut\n `max` natif via `serialize`). Non bornée par défaut. @default undefined */\n readonly max = input<T>();\n\n /** Représentation ISO de `min` pour l'attribut natif (`null` quand non borné). */\n protected readonly serializedMin = computed(() => {\n const value = this.min();\n return value == null ? null : this.serialize(value);\n });\n /** Représentation ISO de `max` pour l'attribut natif (`null` quand non borné). */\n protected readonly serializedMax = computed(() => {\n const value = this.max();\n return value == null ? null : this.serialize(value);\n });\n\n /** Suggestions proposées via un `<datalist>` natif (le picker date/heure reste disponible).\n Valeurs Temporal simples ou couples `{ value, label }` ; chaque valeur est sérialisée au\n format de l'input via `serialize`. @default undefined */\n readonly suggestions = input<readonly KtSuggestion<T>[]>();\n\n private readonly idGen = inject(KtIdGenerator);\n private readonly uid = this.idGen.generateId('temporal-field');\n protected readonly datalistId = `kt-temporal-field-list-${this.uid}`;\n protected readonly hasSuggestions = computed(() => (this.suggestions()?.length ?? 0) > 0);\n protected readonly datalistOptions = computed(() =>\n normalizeKtSuggestions(this.suggestions(), (value) => this.serialize(value)),\n );\n}\n","import { Directive, computed, input } from '@angular/core';\nimport { KtBaseTemporalField } from './base-temporal-field';\n\n/** Précision de saisie/sérialisation des champs Temporal porteurs d'une heure. */\nexport type KtTimePrecision = 'minute' | 'second';\n\n/** Base des champs Temporal porteurs d'une heure (`Time`, `DateTime`, `Instant`). Ajoute le réglage\n `precision` qui pilote, d'un seul point, la sérialisation (`smallestUnit` du `toString`) et\n l'attribut `step` natif de l'input — un input `time`/`datetime-local` n'affiche le sélecteur de\n secondes que si `step` < 60. Les champs sans heure (`Date`, `YearMonth`) n'héritent pas de cette\n base. Chaque sous-classe lit `precision()` dans son `serialize`.\n\n @example\n ```ts\n // Sous-classer : lire precision() dans serialize pour piloter smallestUnit.\n export class KtTimeField extends KtBaseTimeTemporalField<Temporal.PlainTime> {\n protected override fromString(raw: string): Temporal.PlainTime {\n return Temporal.PlainTime.from(raw);\n }\n protected override serialize(value: Temporal.PlainTime): string {\n return value.toString({ smallestUnit: this.precision() });\n }\n }\n ``` */\n@Directive()\nexport abstract class KtBaseTimeTemporalField<T extends { toString(): string }> extends KtBaseTemporalField<T> {\n /** Précision de l'heure : `'minute'` (secondes masquées) ou `'second'`.\n @default 'minute' */\n readonly precision = input<KtTimePrecision>('minute');\n\n /** Attribut `step` natif : `'1'` (seconde) en précision seconde, sinon `null` (pas natif = minute). */\n protected readonly step = computed<string | null>(() => (this.precision() === 'second' ? '1' : null));\n}\n","import type { Temporal as TemporalNamespace } from 'temporal-polyfill';\n\n/**\n * Point d'import unique de Temporal pour toute la lib.\n *\n * - La **valeur** runtime `Temporal` vient de `globalThis.Temporal` : native sur Chrome/Edge 144+,\n * Firefox 139+, Node 26+ ; sinon posée par le polyfill chargé dans `main.ts`\n * (`temporal-polyfill/global`) ou `test-setup.ts`.\n * - Les **types** (`TemporalNamespace.PlainDate`, …) viennent d'un `import type` (effacé au build\n * → 0 KB, le polyfill n'est jamais bundlé dans la lib).\n *\n * Convention : importer `{ Temporal, type TemporalNamespace }` — `Temporal` pour les appels\n * (`Temporal.PlainDate.from(...)`), `TemporalNamespace` pour les annotations\n * (`TemporalNamespace.PlainDate`). Le jour où le natif est garanti partout (Safari inclus), il\n * suffira de retirer le polyfill de `main.ts` : ce fichier ne change pas.\n */\n\n// Type de la valeur runtime `Temporal` (l'objet namespace contenant les classes PlainDate…),\n// récupéré via une expression `import type` — entièrement effacée au build.\ntype TemporalImpl = (typeof import('temporal-polyfill'))['Temporal'];\n\n/** Valeur runtime `Temporal` (native ou polyfill). Cast via `unknown` : selon le contexte de\n compilation, `globalThis.Temporal` peut déjà être typé (augmentation `temporal-polyfill/global`)\n ou non — ce cast fonctionne dans les deux cas. */\nconst rawTemporal = (globalThis as unknown as { Temporal: TemporalImpl }).Temporal;\nif (typeof rawTemporal === 'undefined') {\n throw new Error(\n `[ktortu/aaa] L'espace de noms 'Temporal' est introuvable. ` +\n `Veuillez vous assurer que le polyfill 'temporal-polyfill/global' est correctement importé ` +\n `dans le fichier 'main.ts' de votre application.`,\n );\n}\nexport const Temporal: TemporalImpl = rawTemporal;\n\n/** Espace de noms des types Temporal (`TemporalNamespace.PlainDate`, `.PlainTime`, …). */\nexport type { TemporalNamespace };\n\n// Alias domaine : le code applicatif peut manipuler des noms métier plutôt que l'API brute.\n\n/** Date civile (jour/mois/année), sans heure ni fuseau — alias de `Temporal.PlainDate`.\n À utiliser pour une date « pure » : naissance, échéance, jour d'un événement.\n *\n * @example\n * ```ts\n * import { type CalendarDate } from '@ktortu/aaa';\n * ```\n */\nexport type CalendarDate = TemporalNamespace.PlainDate;\n\n/** Heure « au mur » (heure/minute/seconde), sans date ni fuseau — alias de `Temporal.PlainTime`.\n À utiliser pour une heure isolée : heure d'ouverture, créneau de rendez-vous récurrent. */\nexport type WallTime = TemporalNamespace.PlainTime;\n\n/** Date + heure locale, sans fuseau — alias de `Temporal.PlainDateTime`.\n À utiliser quand date et heure comptent mais que le fuseau est implicite/non pertinent\n (heure « au mur » : ne représente pas un instant absolu). */\nexport type LocalDateTime = TemporalNamespace.PlainDateTime;\n\n/** Instant absolu sur la ligne du temps, en UTC — alias de `Temporal.Instant`.\n À utiliser pour horodater un événement réel (création, mesure) indépendamment du fuseau\n d'affichage ; la conversion en heure locale se fait à la présentation (via `KtClock`). */\nexport type Timestamp = TemporalNamespace.Instant; // instant absolu (UTC)\n\n/** Instant + fuseau nommé (IANA) — alias de `Temporal.ZonedDateTime`.\n À utiliser quand le fuseau fait partie de la donnée (ex. « 14h00 à Paris ») et doit être\n conservé, contrairement à `Timestamp` qui ne porte pas de fuseau. */\nexport type ZonedTimestamp = TemporalNamespace.ZonedDateTime; // instant + fuseau nommé\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTemporalField } from '../base-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « date sans heure » : valeur = `Temporal.PlainDate`, input natif `type=\"date\"`.\n *\n * @example\n * ```html\n * <kt-date-field label=\"Date de naissance\" [(value)]=\"birthDate\" />\n * ```\n */\n@Component({\n selector: 'kt-date-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './date-field.html',\n})\nexport class KtDateField\n extends KtBaseTemporalField<TemporalNamespace.PlainDate>\n implements FormValueControl<TemporalNamespace.PlainDate | null>\n{\n /** Valeur du champ : un `Temporal.PlainDate` (date civile sans heure ni fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainDate | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainDate {\n return Temporal.PlainDate.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainDate): string {\n return value.toString();\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"date\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.min]=\"serializedMin()\"\n [attr.max]=\"serializedMax()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTimeTemporalField } from '../base-time-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « heure sans date » : valeur = `Temporal.PlainTime`, input natif `type=\"time\"`.\n *\n * @example\n * ```html\n * <kt-time-field label=\"Heure de rendez-vous\" [(value)]=\"appointmentTime\" />\n * ```\n */\n@Component({\n selector: 'kt-time-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './time-field.html',\n})\nexport class KtTimeField\n extends KtBaseTimeTemporalField<TemporalNamespace.PlainTime>\n implements FormValueControl<TemporalNamespace.PlainTime | null>\n{\n /** Valeur du champ : un `Temporal.PlainTime` (heure « au mur », sans date ni fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainTime | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainTime {\n return Temporal.PlainTime.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainTime): string {\n // Précision pilotée par `precision()` : minute (défaut) ou seconde.\n return value.toString({ smallestUnit: this.precision() });\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"time\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.min]=\"serializedMin()\"\n [attr.max]=\"serializedMax()\"\n [attr.step]=\"step()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTimeTemporalField } from '../base-time-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « date-heure sans fuseau » : valeur = `Temporal.PlainDateTime`, input\n natif `type=\"datetime-local\"`. Volontairement SANS timezone (heure « au mur »).\n *\n * @example\n * ```html\n * <kt-date-time-field label=\"Début de l'événement\" [(value)]=\"startsAt\" />\n * ```\n */\n@Component({\n selector: 'kt-date-time-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './date-time-field.html',\n})\nexport class KtDateTimeField\n extends KtBaseTimeTemporalField<TemporalNamespace.PlainDateTime>\n implements FormValueControl<TemporalNamespace.PlainDateTime | null>\n{\n /** Valeur du champ : un `Temporal.PlainDateTime` (date + heure « au mur », sans fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainDateTime | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainDateTime {\n return Temporal.PlainDateTime.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainDateTime): string {\n // Précision pilotée par `precision()` : minute (défaut) ou seconde.\n return value.toString({ smallestUnit: this.precision() });\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"datetime-local\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.min]=\"serializedMin()\"\n [attr.max]=\"serializedMax()\"\n [attr.step]=\"step()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTemporalField } from '../base-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « mois/année » (ex. expiration de carte) : valeur = `Temporal.PlainYearMonth`,\n input natif `type=\"month\"`.\n *\n * @example\n * ```html\n * <kt-year-month-field label=\"Expiration\" [(value)]=\"cardExpiry\" />\n * ```\n */\n@Component({\n selector: 'kt-year-month-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './year-month-field.html',\n})\nexport class KtYearMonthField\n extends KtBaseTemporalField<TemporalNamespace.PlainYearMonth>\n implements FormValueControl<TemporalNamespace.PlainYearMonth | null>\n{\n /** Valeur du champ : un `Temporal.PlainYearMonth` (mois + année, sans jour ni fuseau).\n `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.PlainYearMonth | null>(null);\n\n protected override fromString(raw: string): TemporalNamespace.PlainYearMonth {\n return Temporal.PlainYearMonth.from(raw);\n }\n\n protected override serialize(value: TemporalNamespace.PlainYearMonth): string {\n return value.toString();\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"month\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.min]=\"serializedMin()\"\n [attr.max]=\"serializedMax()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { Injectable } from '@angular/core';\nimport { Temporal, type TemporalNamespace } from './temporal';\n\n/** Source unique de l'heure courante et du **fuseau local** de l'utilisateur.\n Injectable (et donc figeable en test) : `vi.useFakeTimers()` ne fige PAS `Temporal.Now`.\n Règle d'équipe : ne jamais appeler `Temporal.Now.*` en direct ailleurs — passer par `KtClock`. */\n@Injectable({ providedIn: 'root' })\nexport class KtClock {\n /** Fuseau IANA local de l'utilisateur (auto-détecté), ex. `\"Europe/Paris\"`.\n Sert de zone de référence pour `today()` et pour les conversions UTC↔local.\n @returns L'identifiant de fuseau IANA. */\n timeZoneId(): string {\n return Temporal.Now.timeZoneId();\n }\n\n /** Instant absolu courant, sur la ligne du temps (UTC), indépendant du fuseau.\n @returns L'instant présent en `Temporal.Instant`. */\n now(): TemporalNamespace.Instant {\n return Temporal.Now.instant();\n }\n\n /** Date civile du jour telle qu'observée dans le fuseau local (`timeZoneId()`).\n @returns Le jour courant en `Temporal.PlainDate`. */\n today(): TemporalNamespace.PlainDate {\n return Temporal.Now.plainDateISO(this.timeZoneId());\n }\n}\n\n/** Horloge figée pour les tests : fige l'instant ET le fuseau (sinon un test passe en France mais\n échoue sur un runner CI en UTC). À fournir via `{ provide: KtClock, useValue: new KtFixedClock(...) }`. */\nexport class KtFixedClock extends KtClock {\n /** Construit une horloge figée déterministe pour les tests.\n @param fixedInstant Instant absolu (UTC) renvoyé tel quel par `now()` et utilisé comme base de `today()`.\n @param zone Fuseau IANA fixe (ex. `\"Europe/Paris\"`) renvoyé par `timeZoneId()`.\n *\n * @example\n * ```ts\n * TestBed.configureTestingModule({\n * providers: [\n * { provide: KtClock, useValue: new KtFixedClock(Temporal.Instant.from('2026-06-18T10:00:00Z'), 'Europe/Paris') },\n * ],\n * });\n * ```\n */\n constructor(\n private readonly fixedInstant: TemporalNamespace.Instant,\n private readonly zone: string,\n ) {\n super();\n }\n\n override timeZoneId(): string {\n return this.zone;\n }\n\n override now(): TemporalNamespace.Instant {\n return this.fixedInstant;\n }\n\n override today(): TemporalNamespace.PlainDate {\n return this.fixedInstant.toZonedDateTimeISO(this.zone).toPlainDate();\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { KtBaseTimeTemporalField } from '../base-time-temporal-field';\nimport { KtField } from '../field/field';\nimport { KtFieldControl } from '../field/field-control';\nimport { KtClock } from '../temporal/clock';\nimport { Temporal, type TemporalNamespace } from '../temporal/temporal';\n\n/** Champ « instant absolu » : valeur = `Temporal.Instant` (UTC), saisi et affiché en **heure\n locale** via un input `type=\"datetime-local\"`. Conçu pour le flux serveur-UTC → affichage/édition\n locale → renvoi UTC. Le fuseau local vient du service `KtClock` (injecté → testable).\n\n Conversion UTC↔heure locale : à l'affichage, l'`Instant` UTC est projeté dans le fuseau\n local (`KtClock.timeZoneId()`) pour produire l'heure « au mur » montrée à l'utilisateur ; à la\n saisie, cette heure locale est réinterprétée dans le même fuseau puis reconvertie en `Instant`\n UTC. Fournir un `KtClock` figé en test garantit une conversion déterministe.\n *\n * @example\n * ```html\n * <kt-instant-field label=\"Horodatage\" [(value)]=\"recordedAt\" />\n * ```\n */\n@Component({\n selector: 'kt-instant-field',\n imports: [KtField, KtFieldControl, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './instant-field.html',\n})\nexport class KtInstantField\n extends KtBaseTimeTemporalField<TemporalNamespace.Instant>\n implements FormValueControl<TemporalNamespace.Instant | null>\n{\n private readonly clock = inject(KtClock);\n\n /** Valeur du champ : un `Temporal.Instant` (instant absolu en UTC), saisi/affiché en heure\n locale via `KtClock`. `null` = champ vide.\n @default null */\n value = model<TemporalNamespace.Instant | null>(null);\n\n // Heure locale saisie (wall-clock) → instant absolu. Disambiguation 'compatible' par défaut\n // (ne lève pas sur un créneau DST ambigu).\n protected override fromString(raw: string): TemporalNamespace.Instant {\n return Temporal.PlainDateTime.from(raw).toZonedDateTime(this.clock.timeZoneId()).toInstant();\n }\n\n // Instant absolu → heure locale ; précision pilotée par `precision()` (minute par défaut).\n protected override serialize(value: TemporalNamespace.Instant): string {\n return value\n .toZonedDateTimeISO(this.clock.timeZoneId())\n .toPlainDateTime()\n .toString({ smallestUnit: this.precision() });\n }\n}\n","<kt-field\n [label]=\"label()\"\n [hint]=\"hint()\"\n [helpText]=\"helpText()\"\n [helpLabel]=\"helpLabel()\"\n [customDescribedBy]=\"customDescribedBy()\"\n [errors]=\"errors()\"\n [invalid]=\"showInvalid()\"\n [required]=\"required()\"\n [fieldId]=\"id()\"\n [appearance]=\"appearance()\"\n [floatLabel]=\"floatLabel()\"\n (helpClick)=\"helpClick.emit($event)\"\n>\n <ng-content select=\"[ktFieldHelp]\" />\n <div\n class=\"kt-field-box\"\n [attr.data-invalid]=\"showInvalid() ? '' : null\"\n [attr.data-disabled]=\"disabled() ? '' : null\"\n >\n @if (icon(); as icon) {\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">{{ icon }}</span>\n }\n\n @if (prefix(); as prefix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(prefix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(prefix) }}\n }\n </span>\n }\n\n <input\n #input\n ktFieldControl\n class=\"kt-field-box__input\"\n type=\"datetime-local\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.name]=\"name() || null\"\n [attr.placeholder]=\"placeholder()\"\n [attr.min]=\"serializedMin()\"\n [attr.max]=\"serializedMax()\"\n [attr.step]=\"step()\"\n [attr.list]=\"hasSuggestions() ? datalistId : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"touched.set(true)\"\n />\n\n @if (hasSuggestions()) {\n <datalist [id]=\"datalistId\">\n @for (option of datalistOptions(); track $index) {\n <option [value]=\"option.value\" [attr.label]=\"option.label\"></option>\n }\n </datalist>\n }\n\n @if (showClear()) {\n <button type=\"button\" class=\"kt-field-box__clear\" [attr.aria-label]=\"clearLabel()\" (click)=\"clear()\">\n <span class=\"kt-field-box__icon\" aria-hidden=\"true\">close</span>\n </button>\n }\n\n @if (suffix(); as suffix) {\n <span class=\"kt-field-box__affix\">\n @if (asTemplate(suffix); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n {{ asText(suffix) }}\n }\n </span>\n }\n </div>\n</kt-field>\n","import { LOCALE_ID, Pipe, PipeTransform, inject } from '@angular/core';\nimport { KtClock } from './clock';\nimport { Temporal, type TemporalNamespace } from './temporal';\n\n/** Valeurs Temporal formatables pour l'affichage (toutes exposent `toLocaleString`). */\ntype FormattableTemporal =\n | TemporalNamespace.PlainDate\n | TemporalNamespace.PlainTime\n | TemporalNamespace.PlainDateTime\n | TemporalNamespace.PlainYearMonth\n | TemporalNamespace.Instant\n | TemporalNamespace.ZonedDateTime;\n\n/** Formate une valeur Temporal pour l'affichage selon la locale active.\n `DatePipe` n'accepte pas Temporal (seulement `Date|string|number`) → pipe dédié, basé sur\n `toLocaleString` (interface `Intl.DateTimeFormat`). Cohérent avec la neutralité i18n de la lib\n (format au runtime via `LOCALE_ID`, pas `$localize`).\n\n Un `Instant` n'a pas de fuseau propre → il est affiché dans la **zone locale** (via `KtClock`).\n Un `ZonedDateTime` est affiché dans **sa propre** zone. Les `Plain*` n'ont pas de fuseau.\n *\n * @example\n * ```html\n * <!-- format par défaut de la locale active -->\n * {{ d | temporalDate }}\n * <!-- options Intl.DateTimeFormat -->\n * {{ d | temporalDate:{ month: 'long' } }}\n * {{ d | temporalDate:{ dateStyle: 'full' } }}\n * ```\n */\n// Exception R1 ASSUMÉE : le name `temporalDate` (non préfixé `kt`) relève du domaine Temporal,\n// exempté de préfixe au même titre que le namespace `Temporal` et ses alias de types. La CLASSE\n// reste préfixée (`KtTemporalDatePipe`). Choix ergonomique acté (ADR-4).\n@Pipe({ name: 'temporalDate' })\nexport class KtTemporalDatePipe implements PipeTransform {\n private readonly locale = inject(LOCALE_ID);\n private readonly clock = inject(KtClock);\n\n /** Formate la valeur Temporal en chaîne localisée via `toLocaleString`.\n * @param value Valeur Temporal à formater (`Plain*`, `Instant` ou `ZonedDateTime`) ; `null`/`undefined` → chaîne vide.\n * @param options Options `Intl.DateTimeFormatOptions` transmises telles quelles. Styles globaux :\n * `dateStyle`/`timeStyle` (`'full' | 'long' | 'medium' | 'short'`). Champs fins :\n * `weekday`/`era`/`month` (`'long' | 'short' | 'narrow'`), `year`/`day`/`hour`/`minute`/`second`\n * (`'numeric' | '2-digit'`), `hour12`, `timeZoneName`, `timeZone`, etc. Omis → format par défaut de la locale.\n * @returns La chaîne formatée selon la locale active (`LOCALE_ID`), ou `''` si la valeur est absente. */\n transform(value: FormattableTemporal | null | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (value == null) return '';\n if (value instanceof Temporal.Instant) {\n return value.toZonedDateTimeISO(this.clock.timeZoneId()).toLocaleString(this.locale, options);\n }\n return value.toLocaleString(this.locale, options);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBADrC;m6EAmE6F,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC5FrG;;AAE+C;AACzC,SAAU,sBAAsB,CACpC,WAAmD,EACnD,OAA6B,EAAA;AAE7B,IAAA,IAAI,CAAC,WAAW;AAAE,QAAA,OAAO,EAAE;AAC3B,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,KAAI;AACpC,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,IAAI,UAAU,EAAE;AAClF,YAAA,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE;QAC9E;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,UAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACzD,IAAA,CAAC,CAAC;AACJ;;ACjBA;;;;;;;;;AASG;AAOG,MAAO,aAAc,SAAQ,gBAA+B,CAAA;;IAEvD,KAAK,GAAG,KAAK,CAAgB,IAAI;8EAAC;;AAElC,IAAA,GAAG,GAAG,KAAK;uFAAU;;AAErB,IAAA,GAAG,GAAG,KAAK;uFAAU;;AAErB,IAAA,IAAI,GAAG,KAAK;wFAAU;AAC/B;;AAEyC;AAChC,IAAA,WAAW,GAAG,KAAK;+FAAmC;AAE9C,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;AACzC,IAAA,UAAU,GAAG,CAAA,qBAAA,EAAwB,IAAI,CAAC,GAAG,EAAE;AAC/C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;uFAAC;IACtE,eAAe,GAAG,QAAQ,CAAC,MAC5C,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;wFACrE;;;;AAKkB,IAAA,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE;AACzD,QAAA,KAAK,EAAE,CAAC,GAAW,KAAI;AACrB,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;AAC5C,YAAA,IAAI,OAAO,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;;gBAEnD,OAAO;AACL,oBAAA,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,IAAI,8BAA8B,EAAE;iBACnG;YACH;YACA,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACnC,CAAC;QACD,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACnD,KAAA,CAAC;AAEQ,IAAA,KAAK,CAAC,GAAW,EAAA;AACzB,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;QAC5C,IAAI,OAAO,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAC/B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;AAC9B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM;IAC7C;AAEmB,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AAExC,QAAA,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;QACtB,IAAI,KAAK,CAAC,gBAAgB;YAAE;QAE5B,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;YAAE;AAE1D,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACtB,KAAK,CAAC,cAAc,EAAE;IACxB;AAEQ,IAAA,WAAW,CAAC,IAAa,EAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AAEtB,QAAA,IAAI,QAAgB;AAEpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;AACzB,YAAA,IAAI,GAAG,KAAK,SAAS,EAAE;gBACrB,QAAQ,GAAG,GAAG;YAChB;AAAO,iBAAA,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC5B,QAAQ,GAAG,GAAG;YAChB;iBAAO;gBACL,QAAQ,GAAG,CAAC;YACd;QACF;aAAO;AACL,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAG;AAClC,YAAA,QAAQ,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI;QAC7D;QAEA,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,EAAE;YACvC,QAAQ,GAAG,GAAG;QAChB;QACA,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,EAAE;YACvC,QAAQ,GAAG,GAAG;QAChB;;AAGA,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;YACrB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC;YACjD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChD;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1B;IAEU,UAAU,GAAA;AAClB,QAAA,OAAO,IAAI;IACb;AAEU,IAAA,OAAO,CAAC,KAAoB,EAAA;QACpC,OAAO,KAAK,KAAK,IAAI;IACvB;uGAvGW,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,4uBCzB1B,qhFAoFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/DY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAClB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qhFAAA,EAAA;;;AEfjD;;;;;;;;AAQG;AAOG,MAAO,UAAW,SAAQ,gBAAwB,CAAA;;IAE7C,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,IAAI,GAAG,KAAK,CAAS,CAAC;6EAAC;;AAEvB,IAAA,SAAS,GAAG,KAAK;6FAAU;AAE1B,IAAA,KAAK,CAAC,GAAW,EAAA;AACzB,QAAA,OAAO,GAAG;IACZ;IAEU,UAAU,GAAA;AAClB,QAAA,OAAO,EAAE;IACX;AAEU,IAAA,OAAO,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;IAC3B;uGAlBW,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,+fCtBvB,ohEAsEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,UAAU,EAAA,UAAA,EAAA,CAAA;kBANtB,SAAS;+BACE,cAAc,EAAA,OAAA,EACf,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ohEAAA,EAAA;;;AEPjD;;;;;;;;AAQG;AAOG,MAAO,WAAY,SAAQ,gBAAwB,CAAA;;IAE9C,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,IAAI,GAAG,KAAK,CAAkB,MAAM;6EAAC;AAC9C;;AAEyC;AAChC,IAAA,WAAW,GAAG,KAAK;+FAAmC;AAE9C,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;AACvC,IAAA,UAAU,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,GAAG,EAAE;AAC7C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;uFAAC;AACtE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;wFAAC;AAEvG,IAAA,KAAK,CAAC,GAAW,EAAA;AACzB,QAAA,OAAO,GAAG;IACZ;IAEU,UAAU,GAAA;AAClB,QAAA,OAAO,EAAE;IACX;AAEU,IAAA,OAAO,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;IAC3B;uGA1BW,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,sgBC3BxB,ktEA4EA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDrDY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,6DAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIxC,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ktEAAA,EAAA;;;AERjD;;;;;;;;;AASG;MAuDU,QAAQ,CAAA;IACF,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAG5D,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;;;IAI7B,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAmB,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEzE,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,KAAK,GAAG,KAAK,CAAmB,KAAK,6EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEvE,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;AAE3C,IAAA,aAAa,GAAG,KAAK,CAAmB,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EAClF,SAAS,EAAE,gBAAgB,GAC3B;AAEe,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AACnC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,UAAA,EAAa,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IAC7D,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;IAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAEpD,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;IAEkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;0FAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;AAEF,IAAA,WAAA,GAAA;;;QAGE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;gBAAE;AACtD,YAAA,OAAO,CAAC,IAAI,CAAC,oGAAoG,CAAC;AACpH,QAAA,CAAC,CAAC;IACJ;IAEU,MAAM,GAAA;QACd,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEU,IAAA,UAAU,CAAC,KAAY,EAAA;AAC/B,QAAA,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE;IACf;uGApFW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlDT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2qIAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAtDpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,eAAA,EACJ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,2qIAAA,CAAA,EAAA;;;ACxEH;;;;;;;;;;;;;;;;;AAiBG;MA2CU,eAAe,CAAA;IACT,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAG5D,KAAK,GAAG,KAAK,CAAM,EAAE;8EAAC;;;IAItB,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAmB,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEzE,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,KAAK,GAAG,KAAK,CAAmB,KAAK,6EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEvE,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;AAC9E;;AAEiF;IACxE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;AAE3C,IAAA,aAAa,GAAG,KAAK,CAAmB,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EAClF,SAAS,EAAE,gBAAgB,GAC3B;;AAGO,IAAA,WAAW,GAAG,KAAK;+FAA2B;AAEtC,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAC3C,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,kBAAA,EAAqB,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IACrE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;IAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAEpD,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;IAEkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;0FAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;IAEe,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAI,EAAE,CAAI,KAAK,CAAC,KAAK,CAAC,CAAC;mFAAC;;AAG7F,IAAA,UAAU,CAAC,WAAc,EAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC7C;;IAGA,MAAM,CAAC,WAAc,EAAE,OAAgB,EAAA;QACrC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACnD,QAAA,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,WAAW,CAAC,CAAC;QACvC;AAAO,aAAA,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;QACzD;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;uGA5FW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,eAAe,EAAA,UAAA,EAAA,CAAA;kBA1C3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,eAAA,EACZ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA;;;AC5CH;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;MAgDU,UAAU,CAAA;IACJ,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAGlD,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAA8B;AAEnG;AACwE;IAC/D,KAAK,GAAG,KAAK,CAAU,KAAK;8EAAC;AAEtC;AACgF;AACvE,IAAA,WAAW,GAAG,KAAK;+FAAK;;IAGxB,aAAa,GAAG,KAAK,CAAmB,KAAK,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;;IAI/E,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAmB,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEzE,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,KAAK,GAAG,KAAK,CAAmB,KAAK,6EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEvE,MAAM,GAAG,KAAK,CAAoD,EAAE;+EAAC;;IAErE,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;;AAIxB,IAAA,EAAE,GAAG,KAAK;sFAAU;;AAEpB,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,IAAI,GAAG,KAAK;wFAAU;;AAEtB,IAAA,SAAS,GAAG,KAAK;6FAAU;;AAE3B,IAAA,YAAY,GAAG,KAAK;gGAAuB;;AAE3C,IAAA,aAAa,GAAG,KAAK,CAAmB,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EAClF,SAAS,EAAE,gBAAgB,GAC3B;AAEe,IAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAA+B,OAAO,CAAC;AACnE,IAAA,EAAE,GAAG,MAAM,CAA0B,UAAU,CAAC;AAEhD,IAAA,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;AACrC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAA,YAAA,EAAe,IAAI,CAAC,GAAG,CAAA,CAAE;+EAAC;IAC/D,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,KAAA,CAAO;+EAAC;IAChD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,MAAA,CAAQ;gFAAC;AAErE;AACiF;AAC9D,IAAA,SAAS,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAO,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;kFAC3E;;IAGkB,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE;mFAAC;AAEnF,IAAA,OAAO,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,0BAA0B;gFACrF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oFAC1F;AAEkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wFACjE;IAEkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;0FAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C,CAAC;oFAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AACnE,QAAA,CAAC,CAAC;;;QAIF,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;gBAAE;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAClH,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,OAAO,CAAC,IAAI,CACV,wGAAwG,CACzG;YACH;AACF,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACvB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAO,EAAE,OAAO,CAAC;YACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEU,MAAM,GAAA;AACd,QAAA,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;IACjD;uGAzHW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,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"}