ngx-dynamic-entity-builder 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -54
- package/esm2022/lib/builder-store.service.mjs +101 -22
- package/esm2022/lib/clone.mjs +1 -1
- package/esm2022/lib/components/entity-builder-tree-node.component.mjs +1 -1
- package/esm2022/lib/components/entity-reference-config.component.mjs +301 -301
- package/esm2022/lib/components/field-inspector.component.mjs +3 -3
- package/esm2022/lib/components/field-palette.component.mjs +33 -33
- package/esm2022/lib/components/field-rules-list.component.mjs +157 -157
- package/esm2022/lib/components/referenced-field-config.component.mjs +8 -2
- package/esm2022/lib/components/rule-form.component.mjs +1 -1
- package/esm2022/lib/components/tab-manager.component.mjs +301 -288
- package/esm2022/lib/entity-builder.component.mjs +14 -3
- package/esm2022/public-api.mjs +1 -2
- package/fesm2022/ngx-dynamic-entity-builder.mjs +902 -913
- package/fesm2022/ngx-dynamic-entity-builder.mjs.map +1 -1
- package/lib/builder-store.service.d.ts +28 -0
- package/lib/components/referenced-field-config.component.d.ts +6 -0
- package/lib/components/tab-manager.component.d.ts +11 -2
- package/lib/entity-builder.component.d.ts +7 -1
- package/package.json +22 -13
- package/public-api.d.ts +0 -1
- package/esm2022/lib/components/connection-source-config.component.mjs +0 -121
- package/lib/components/connection-source-config.component.d.ts +0 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-dynamic-entity-builder.mjs","sources":["../../src/lib/field-catalog.ts","../../src/lib/clone.ts","../../src/lib/builder-store.service.ts","../../src/lib/components/entity-reference-config.component.ts","../../src/lib/components/rule-form.component.ts","../../src/lib/components/field-rules-list.component.ts","../../src/lib/components/referenced-field-config.component.ts","../../src/lib/components/field-inspector.component.ts","../../src/lib/components/field-inspector.component.html","../../src/lib/components/field-palette.component.ts","../../src/lib/components/tab-manager.component.ts","../../src/lib/components/entity-builder-tree-node.component.ts","../../src/lib/components/entity-builder-canvas.component.ts","../../src/lib/entity-builder.component.ts","../../src/lib/entity-builder.component.html","../../src/lib/components/connection-source-config.component.ts","../../src/public-api.ts","../../src/ngx-dynamic-entity-builder.ts"],"sourcesContent":["/**\n * field-catalog.ts — re-exports shared field catalog from @dynamic-entity/core.\n * Single source of truth shared by both visual builder and renderer.\n */\nexport {\n FIELD_TYPE_CATALOG,\n getFieldTypeMeta,\n humanizeId,\n createFieldConfig,\n type FieldTypeMeta,\n type FlagValidator,\n type ParamValidator,\n} from '@dynamic-entity/core';\n","/**\r\n * Deep clone with a JSON fallback.\r\n *\r\n * `structuredClone` is not universally available (older browsers, and jsdom before v22),\r\n * so it must never be called unguarded — an unguarded call throws a ReferenceError and the\r\n * caller silently does nothing. Config and rule objects are JSON-safe, so the fallback is\r\n * lossless here.\r\n */\r\nexport function deepClone<T>(value: T): T {\r\n if (typeof structuredClone === 'function') return structuredClone(value);\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport type {\r\n AutoPatchMapping,\r\n DropdownOption,\r\n EntityFormConfig,\r\n EntityPermissions,\r\n EntityReferenceConfig,\r\n FormRule,\r\n NestedFieldConfig,\r\n NestedTabConfig,\r\n PatchOnTrueMapping,\r\n RichFieldType,\r\n} from '@dynamic-entity/core';\r\nimport { findTab, labelToId, normalizeConfigOptions, computeFieldDrift, createFieldSnapshot } from '@dynamic-entity/core';\r\nimport {\r\n createFieldConfig,\r\n getFieldTypeMeta,\r\n humanizeId,\r\n type FlagValidator,\r\n type ParamValidator,\r\n} from './field-catalog';\r\nimport { deepClone } from './clone';\r\n\r\nexport interface BuilderProblem {\r\n level: 'error' | 'warning';\r\n message: string;\r\n fieldId?: string;\r\n}\r\n\r\nconst clone = deepClone;\r\n\r\nconst ID_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\r\n\r\n@Injectable()\r\nexport class BuilderStore {\r\n private readonly _config = signal<EntityFormConfig>(this.emptyConfig());\r\n private readonly _selectedFieldId = signal<string | null>(null);\r\n private readonly _activeLanguage = signal<string>('en');\r\n /** Rules live beside the config: they are persisted per form, not inside `EntityFormConfig`. */\r\n private readonly _rules = signal<FormRule[]>([]);\r\n /**\r\n * Field ids the author owns — set by an explicit rename, or by loading a saved config\r\n * whose ids are already live data keys. Ids outside this set are still derived from the\r\n * field's label. Builder-session state, deliberately not part of the exported config.\r\n */\r\n private readonly manualIds = new Set<string>();\r\n\r\n private readonly _isDirty = signal<boolean>(false);\r\n\r\n readonly config = this._config.asReadonly();\r\n readonly selectedFieldId = this._selectedFieldId.asReadonly();\r\n readonly activeLanguage = this._activeLanguage.asReadonly();\r\n readonly rules = this._rules.asReadonly();\r\n readonly isDirty = this._isDirty.asReadonly();\r\n\r\n readonly tabs = computed<NestedTabConfig[]>(() => this._config().tabs ?? []);\r\n\r\n readonly fields = computed<NestedFieldConfig[]>(() => {\r\n return (this._config().tabs ?? []).flatMap(t => t.fields ?? []);\r\n });\r\n\r\n readonly selectedField = computed<NestedFieldConfig | null>(() => {\r\n const id = this._selectedFieldId();\r\n if (!id) return null;\r\n return this.findFieldInTabs(this._config().tabs, id);\r\n });\r\n\r\n readonly problems = computed<BuilderProblem[]>(() => this.validate(this._config()));\r\n readonly errors = computed<BuilderProblem[]>(() =>\r\n this.problems().filter(p => p.level === 'error'),\r\n );\r\n readonly isValid = computed<boolean>(() => this.errors().length === 0);\r\n\r\n // ─── Initialisation ─────────────────────────────────────────────────────────\r\n\r\n load(config: EntityFormConfig): void {\r\n // Check if any fields carry both inline options and listName before normalizing options\r\n const fieldsWithBoth = this.getAllFields(config.tabs ?? []).filter(\r\n f => Array.isArray(f.options) && f.options.length > 0 && typeof f.listName === 'string' && f.listName.trim() !== '',\r\n );\r\n for (const f of fieldsWithBoth) {\r\n console.warn(\r\n `[BuilderStore] Field \"${f.id}\" carries both inline options and listName \"${f.listName}\". ` +\r\n `Inline options win; listName was dropped.`,\r\n );\r\n }\r\n\r\n // The other boundary where a config enters the library (the renderer's ngOnChanges is\r\n // the first). Authoring must start from the canonical option shape, or the builder\r\n // would round-trip a legacy config straight back out unchanged.\r\n const next = clone(normalizeConfigOptions(config));\r\n next.tabs = next.tabs ?? [];\r\n if (next.tabs.length === 0) {\r\n next.tabs = [{ id: 'default', label: { en: 'Default' }, fields: [] }];\r\n }\r\n this._config.set(next);\r\n const firstField = this.getAllFields(next.tabs)[0];\r\n this._selectedFieldId.set(firstField?.id ?? null);\r\n this._activeLanguage.set(next.defaultLanguage ?? 'en');\r\n\r\n // Ids in a saved config are live data keys — records are already stored under them.\r\n // Editing a label must never rewrite one, so freeze every id the config arrived with.\r\n this.manualIds.clear();\r\n for (const field of this.getAllFields(next.tabs)) this.manualIds.add(field.id);\r\n this._isDirty.set(false);\r\n }\r\n\r\n reset(entity = ''): void {\r\n this._config.set(this.emptyConfig(entity));\r\n this._selectedFieldId.set(null);\r\n this._rules.set([]);\r\n this.manualIds.clear();\r\n this._isDirty.set(false);\r\n }\r\n\r\n resetDirty(): void {\r\n this._isDirty.set(false);\r\n }\r\n\r\n private emptyConfig(entity = ''): EntityFormConfig {\r\n return {\r\n entity,\r\n version: 1,\r\n defaultLanguage: 'en',\r\n tabs: [],\r\n };\r\n }\r\n\r\n // ─── Entity-level settings ──────────────────────────────────────────────────\r\n\r\n setEntityName(entity: string): void {\r\n this.mutate(draft => {\r\n draft.entity = entity.trim();\r\n });\r\n }\r\n\r\n setDefaultLanguage(language: string): void {\r\n this.mutate(draft => {\r\n draft.defaultLanguage = language;\r\n });\r\n }\r\n\r\n setMaskData(mask: boolean): void {\r\n this.mutate(draft => {\r\n draft.maskData = mask;\r\n });\r\n }\r\n\r\n setPermission(action: keyof EntityPermissions, roles: string[]): void {\r\n this.mutate(draft => {\r\n const permissions: EntityPermissions = { ...(draft.permissions ?? {}) };\r\n permissions[action] = roles;\r\n draft.permissions = permissions;\r\n });\r\n }\r\n\r\n setActiveLanguage(language: string): void {\r\n this._activeLanguage.set(language);\r\n }\r\n\r\n // ─── Helper Traversal ───────────────────────────────────────────────────────\r\n\r\n private getAllFields(tabs: NestedTabConfig[] = []): NestedFieldConfig[] {\r\n const list: NestedFieldConfig[] = [];\r\n for (const t of tabs) {\r\n if (t.fields) list.push(...t.fields);\r\n if (t.children) list.push(...this.getAllFields(t.children));\r\n }\r\n return list;\r\n }\r\n\r\n private findFieldInTabs(tabs: NestedTabConfig[] = [], id: string): NestedFieldConfig | null {\r\n for (const t of tabs) {\r\n if (t.fields) {\r\n const found = t.fields.find(f => f.id === id);\r\n if (found) return found;\r\n }\r\n if (t.children) {\r\n const found = this.findFieldInTabs(t.children, id);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Field CRUD ─────────────────────────────────────────────────────────────\r\n\r\n addField(type: RichFieldType, targetTabId?: string): string {\r\n const meta = getFieldTypeMeta(type);\r\n const prefix = meta?.idPrefix ?? 'field';\r\n const allFields = this.fields();\r\n const id = this.uniqueId(prefix, allFields);\r\n\r\n this.mutate(draft => {\r\n const field = createFieldConfig(type, id, draft.defaultLanguage ?? 'en');\r\n const targetTab = targetTabId\r\n ? draft.tabs.find(t => t.id === targetTabId)\r\n : draft.tabs[0];\r\n if (targetTab) {\r\n targetTab.fields = targetTab.fields ?? [];\r\n targetTab.fields.push(field);\r\n } else {\r\n draft.tabs.push({ id: 'main', label: { en: 'Main' }, fields: [field] });\r\n }\r\n });\r\n this._selectedFieldId.set(id);\r\n return id;\r\n }\r\n\r\n updateField(id: string, patch: Partial<NestedFieldConfig>): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, id);\r\n if (field) Object.assign(field, patch);\r\n });\r\n }\r\n\r\n /**\r\n * Rename a field explicitly, pinning the id so it is no longer derived from the label.\r\n *\r\n * Not reachable from the inspector — the id input is read-only by design. This exists for\r\n * programmatic callers that must match an id to an existing data key.\r\n */\r\n renameField(oldId: string, newId: string): void {\r\n const trimmed = newId.trim();\r\n if (!trimmed || trimmed === oldId) return;\r\n if (this.fields().some(f => f.id === trimmed)) return;\r\n if (!this.findFieldInTabs(this._config().tabs, oldId)) return;\r\n\r\n this.applyRename(oldId, trimmed);\r\n this.manualIds.delete(oldId);\r\n this.manualIds.add(trimmed);\r\n }\r\n\r\n /** Whether this field's id is pinned (loaded from storage or explicitly renamed). */\r\n hasManualId(id: string): boolean {\r\n return this.manualIds.has(id);\r\n }\r\n\r\n /**\r\n * Move a field to a new id and repoint every id-based reference in the config at it.\r\n *\r\n * Ids are the wiring between fields — rules, cascades, patches and `showWhen` all address\r\n * fields by id — so a rename that only touches `field.id` silently breaks that wiring.\r\n * That was survivable while renaming was a rare manual act; label-derived ids make it\r\n * routine, so the references move with it.\r\n */\r\n private applyRename(oldId: string, newId: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, oldId);\r\n if (!field) return;\r\n field.id = newId;\r\n\r\n const walkFields = (fields: NestedFieldConfig[] | undefined) => {\r\n for (const f of fields ?? []) {\r\n if (f.showWhen && oldId in f.showWhen) {\r\n const next: Record<string, unknown> = {};\r\n // Rebuild in place so condition order survives the rename.\r\n for (const [key, value] of Object.entries(f.showWhen)) {\r\n next[key === oldId ? newId : key] = value;\r\n }\r\n f.showWhen = next;\r\n }\r\n if (f.entityReference?.parentField === oldId) {\r\n f.entityReference = { ...f.entityReference, parentField: newId };\r\n }\r\n if (f.autoPatch) {\r\n // `source` names a field on the *linked* record, not this config — leave it.\r\n f.autoPatch = {\r\n ...f.autoPatch,\r\n mappings: f.autoPatch.mappings.map(m =>\r\n m.target === oldId ? { ...m, target: newId } : m,\r\n ),\r\n };\r\n }\r\n if (f.patchOnTrue) {\r\n f.patchOnTrue = f.patchOnTrue.map(m => ({\r\n from: m.from === oldId ? newId : m.from,\r\n to: m.to === oldId ? newId : m.to,\r\n }));\r\n }\r\n if (f.children?.length) walkFields(f.children);\r\n }\r\n };\r\n const walkTabs = (tabs: NestedTabConfig[] | undefined) => {\r\n for (const tab of tabs ?? []) {\r\n walkFields(tab.fields);\r\n walkTabs(tab.children);\r\n }\r\n };\r\n walkTabs(draft.tabs);\r\n });\r\n\r\n this._rules.update(rules =>\r\n rules.map(rule => ({\r\n ...rule,\r\n fieldId: rule.fieldId === oldId ? newId : rule.fieldId,\r\n targets: rule.targets.map(t =>\r\n t.type === 'field' && t.id === oldId ? { ...t, id: newId } : t,\r\n ),\r\n })),\r\n );\r\n\r\n if (this._selectedFieldId() === oldId) this._selectedFieldId.set(newId);\r\n }\r\n\r\n removeField(id: string): void {\r\n this.mutate(draft => {\r\n for (const tab of draft.tabs) {\r\n if (tab.fields) {\r\n tab.fields = tab.fields.filter(f => f.id !== id);\r\n }\r\n }\r\n });\r\n this.manualIds.delete(id);\r\n if (this._selectedFieldId() === id) this._selectedFieldId.set(null);\r\n }\r\n\r\n duplicateField(id: string): string | null {\r\n // Look the source up by id — not by current selection. The insert below searches by id\r\n // too, so falling back to the selected field could report a new id while inserting\r\n // nothing, or duplicate a field the caller never named.\r\n const source = this.findFieldInTabs(this._config().tabs, id);\r\n if (!source) return null;\r\n const meta = getFieldTypeMeta(source.type);\r\n const prefix = meta?.idPrefix ?? 'field';\r\n const newId = this.uniqueId(prefix, this.fields());\r\n\r\n this.mutate(draft => {\r\n for (const tab of draft.tabs) {\r\n const index = (tab.fields ?? []).findIndex(f => f.id === id);\r\n if (index !== -1) {\r\n const copy = clone(source);\r\n copy.id = newId;\r\n tab.fields!.splice(index + 1, 0, copy);\r\n break;\r\n }\r\n }\r\n });\r\n this._selectedFieldId.set(newId);\r\n return newId;\r\n }\r\n\r\n moveField(id: string, direction: -1 | 1): void {\r\n this.mutate(draft => {\r\n for (const tab of draft.tabs) {\r\n const fields = tab.fields ?? [];\r\n const from = fields.findIndex(f => f.id === id);\r\n if (from !== -1) {\r\n const to = from + direction;\r\n if (to < 0 || to >= fields.length) return;\r\n const [item] = fields.splice(from, 1);\r\n fields.splice(to, 0, item);\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** Safe reorder for drag & drop within active tab or flat list */\r\n reorderField(fromIndex: number, toIndex: number, tabId?: string): void {\r\n this.mutate(draft => {\r\n const targetTab = tabId\r\n ? draft.tabs.find(t => t.id === tabId)\r\n : draft.tabs[0];\r\n const fields = targetTab?.fields ?? [];\r\n if (\r\n fromIndex < 0 ||\r\n toIndex < 0 ||\r\n fromIndex >= fields.length ||\r\n toIndex >= fields.length\r\n ) {\r\n return;\r\n }\r\n const [item] = fields.splice(fromIndex, 1);\r\n fields.splice(toIndex, 0, item);\r\n });\r\n }\r\n\r\n selectField(id: string | null): void {\r\n this._selectedFieldId.set(id);\r\n }\r\n\r\n // ─── Localised text ─────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Set a field's label, and derive the field's id from it: type \"Employee Count\", get\r\n * `employeeCount`. The inspector renders the id read-only, so this is the only way a\r\n * new field's id is set.\r\n *\r\n * Two things stop derivation: a config loaded from storage (its ids are live data keys\r\n * that records are already stored under — see `load`), and an explicit `renameField`\r\n * call, which remains available to programmatic callers.\r\n *\r\n * Only the config's default language drives the id; translating a label must not rename\r\n * anything.\r\n */\r\n setFieldLabel(id: string, language: string, value: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, id);\r\n if (field) field.label = { ...field.label, [language]: value };\r\n });\r\n\r\n if (language !== (this._config().defaultLanguage ?? 'en')) return;\r\n if (this.manualIds.has(id)) return;\r\n\r\n const derived = labelToId(value);\r\n if (!derived || derived === id) return;\r\n\r\n this.applyRename(id, this.availableId(derived, id));\r\n }\r\n\r\n /** `derived`, or `derived_2`, `derived_3`… if another field already holds it. */\r\n private availableId(derived: string, currentId: string): string {\r\n const taken = new Set(this.fields().map(f => f.id).filter(fid => fid !== currentId));\r\n if (!taken.has(derived)) return derived;\r\n\r\n let n = 2;\r\n while (taken.has(`${derived}_${n}`)) n += 1;\r\n return `${derived}_${n}`;\r\n }\r\n\r\n setFieldPlaceholder(id: string, language: string, value: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, id);\r\n if (!field) return;\r\n field.placeholder = { ...(field.placeholder ?? {}), [language]: value };\r\n });\r\n }\r\n\r\n // ─── Validators ─────────────────────────────────────────────────────────────\r\n\r\n toggleFlagValidator(id: string, validator: FlagValidator, on: boolean): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, id);\r\n if (!field) return;\r\n field.validators = field.validators ?? {};\r\n if (validator === 'required') {\r\n if (on) field.validators.required = true;\r\n else delete field.validators.required;\r\n } else if (validator === 'email') {\r\n if (on) field.validators.pattern = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$';\r\n else delete field.validators.pattern;\r\n }\r\n });\r\n }\r\n\r\n setParamValidator(id: string, validator: ParamValidator, value: number | null): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, id);\r\n if (!field) return;\r\n field.validators = field.validators ?? {};\r\n if (value === null || value === undefined || Number.isNaN(value)) {\r\n delete field.validators[validator];\r\n } else {\r\n field.validators[validator] = value;\r\n }\r\n });\r\n }\r\n\r\n getParamValidator(field: NestedFieldConfig, validator: ParamValidator): number | null {\r\n const val = field.validators?.[validator];\r\n return typeof val === 'number' ? val : null;\r\n }\r\n\r\n hasFlagValidator(field: NestedFieldConfig, validator: FlagValidator): boolean {\r\n if (validator === 'required') return !!field.validators?.required;\r\n if (validator === 'email') return !!field.validators?.pattern;\r\n return false;\r\n }\r\n\r\n // ─── Options (dropdown / multiSelect / radio) ────────────────────────────────\r\n\r\n /**\r\n * Where a choice field's options come from.\r\n *\r\n * `entity` is absent on purpose: in this model an entity reference is a field *type*\r\n * (`entity-ref`), not a data source a dropdown can switch to, so offering it here would mean\r\n * mutating the field's type — and rebuilding its control — from a source picker. The\r\n * exclusion that matters within a choice field is inline `options` vs `listName`.\r\n */\r\n fieldDataSource(field: NestedFieldConfig | undefined): 'none' | 'manual' | 'lookup' {\r\n if (!field) return 'none';\r\n // Presence, not emptiness: a source the author has picked but not filled in yet — no\r\n // options authored, no list name typed — must still read as that source, or the editor\r\n // for it disappears the moment they select it.\r\n if (Array.isArray(field.options)) return 'manual';\r\n if (typeof field.listName === 'string') return 'lookup';\r\n return 'none';\r\n }\r\n\r\n /**\r\n * Switch a choice field's data source, clearing the one it is leaving.\r\n *\r\n * The reference makes these mutually exclusive (doc §4.4) and it has to stay that way here:\r\n * `optionsFor` resolves inline options first, so a field left holding both would silently\r\n * ignore its list.\r\n */\r\n setFieldDataSource(fieldId: string, source: 'none' | 'manual' | 'lookup'): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n if (source === 'manual') {\r\n delete field.listName;\r\n field.options = field.options?.length ? field.options : [];\r\n } else if (source === 'lookup') {\r\n delete field.options;\r\n field.listName = field.listName ?? '';\r\n } else {\r\n delete field.options;\r\n delete field.listName;\r\n }\r\n });\r\n }\r\n\r\n /** Set the named list a choice field reads its options from. */\r\n setListName(fieldId: string, listName: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n const trimmed = listName.trim();\r\n if (trimmed) {\r\n field.listName = trimmed;\r\n // Belt and braces: inline options would win over the list at render time.\r\n delete field.options;\r\n } else {\r\n field.listName = '';\r\n }\r\n });\r\n }\r\n\r\n /** Link a field to a field defined in another entity configuration (Phase 8). */\r\n linkReferencedField(fieldId: string, sourceEntityKey: string, sourceField: NestedFieldConfig): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n field.isReferenced = true;\r\n field.referencedEntityKey = sourceEntityKey;\r\n field.referencedFieldId = sourceField.id;\r\n field.referencedSnapshot = createFieldSnapshot(sourceField);\r\n field.hasDrift = false;\r\n // Copy label, type, validators, options from source\r\n if (sourceField.label) field.label = clone(sourceField.label);\r\n if (sourceField.type) field.type = sourceField.type;\r\n if (sourceField.validators) field.validators = clone(sourceField.validators);\r\n if (sourceField.options) field.options = clone(sourceField.options);\r\n });\r\n }\r\n\r\n /** Unlink a referenced field back to an independent field. */\r\n unlinkReferencedField(fieldId: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n delete field.isReferenced;\r\n delete field.referencedEntityKey;\r\n delete field.referencedFieldId;\r\n delete field.referencedSnapshot;\r\n delete field.hasDrift;\r\n });\r\n }\r\n\r\n /** Sync a drifted referenced field with the updated source field definition. */\r\n syncReferencedField(fieldId: string, currentSourceField: NestedFieldConfig): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field || !field.isReferenced) return;\r\n field.referencedSnapshot = createFieldSnapshot(currentSourceField);\r\n field.hasDrift = false;\r\n if (currentSourceField.label) field.label = clone(currentSourceField.label);\r\n if (currentSourceField.type) field.type = currentSourceField.type;\r\n if (currentSourceField.validators) field.validators = clone(currentSourceField.validators);\r\n if (currentSourceField.options) field.options = clone(currentSourceField.options);\r\n });\r\n }\r\n\r\n /** Scan all referenced fields in the config and update their hasDrift state against current source configs. */\r\n checkDrift(sourceConfigs: Record<string, EntityFormConfig>): void {\r\n this.mutate(draft => {\r\n const scanFields = (fields: NestedFieldConfig[]) => {\r\n for (const f of fields) {\r\n if (f.isReferenced && f.referencedEntityKey && f.referencedFieldId) {\r\n const sourceConfig = sourceConfigs[f.referencedEntityKey];\r\n const sourceField = sourceConfig\r\n ? this.findFieldInTabs(sourceConfig.tabs ?? [], f.referencedFieldId)\r\n : undefined;\r\n f.hasDrift = computeFieldDrift(f, sourceField ?? undefined);\r\n }\r\n if (f.children?.length) scanFields(f.children);\r\n }\r\n };\r\n\r\n for (const tab of draft.tabs ?? []) {\r\n if (tab.fields?.length) scanFields(tab.fields);\r\n }\r\n });\r\n }\r\n\r\n addOption(fieldId: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n const options = field.options ?? [];\r\n const n = options.length + 1;\r\n const lang = draft.defaultLanguage ?? 'en';\r\n options.push({ [lang]: `Option ${n}` });\r\n field.options = options;\r\n // Authoring an inline option makes this a manual field — see `setFieldDataSource`.\r\n delete field.listName;\r\n });\r\n }\r\n\r\n /** Merge language keys into an option. `setOptionLabel` is the usual single-language path. */\r\n updateOption(fieldId: string, index: number, patch: DropdownOption): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n const option = field?.options?.[index];\r\n if (!option) return;\r\n field.options![index] = { ...option, ...patch };\r\n });\r\n }\r\n\r\n /**\r\n * Set an option's text for one language.\r\n *\r\n * An option is a language-keyed object and the displayed text **is** the stored value,\r\n * so this is the only way to edit one — there is no separate value to set.\r\n */\r\n setOptionLabel(fieldId: string, index: number, language: string, value: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n const option = field?.options?.[index];\r\n if (!option) return;\r\n field.options![index] = { ...option, [language]: value };\r\n });\r\n }\r\n\r\n removeOption(fieldId: string, index: number): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field?.options) return;\r\n field.options = field.options.filter((_, i) => i !== index);\r\n });\r\n }\r\n\r\n // ─── Entity reference / cascade ─────────────────────────────────────────────\r\n\r\n /** Merge a patch into a field's `entityReference` block, keeping it enabled. */\r\n updateEntityReference(fieldId: string, patch: Partial<EntityReferenceConfig>): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n const next: EntityReferenceConfig = {\r\n ...(field.entityReference ?? { enabled: true }),\r\n ...patch,\r\n enabled: true,\r\n };\r\n // Drop keys explicitly cleared to `undefined` so exported configs stay clean.\r\n for (const key of Object.keys(patch) as (keyof EntityReferenceConfig)[]) {\r\n if (patch[key] === undefined) delete next[key];\r\n }\r\n field.entityReference = next;\r\n });\r\n }\r\n\r\n // ─── autoPatch ──────────────────────────────────────────────────────────────\r\n\r\n addAutoPatchMapping(fieldId: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n const targetTab = field.autoPatch?.targetTab ?? draft.tabs[0]?.id ?? '';\r\n const mappings = [...(field.autoPatch?.mappings ?? []), { source: '', target: '' }];\r\n field.autoPatch = { targetTab, mappings };\r\n });\r\n }\r\n\r\n setAutoPatchTargetTab(fieldId: string, targetTab: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field?.autoPatch) return;\r\n field.autoPatch = { ...field.autoPatch, targetTab };\r\n });\r\n }\r\n\r\n updateAutoPatchMapping(fieldId: string, index: number, patch: Partial<AutoPatchMapping>): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field?.autoPatch?.mappings?.[index]) return;\r\n field.autoPatch = {\r\n ...field.autoPatch,\r\n mappings: field.autoPatch.mappings.map((m, i) => (i === index ? { ...m, ...patch } : m)),\r\n };\r\n });\r\n }\r\n\r\n /** Removing the last mapping drops `autoPatch` entirely — no empty config in the export. */\r\n removeAutoPatchMapping(fieldId: string, index: number): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field?.autoPatch) return;\r\n const mappings = field.autoPatch.mappings.filter((_, i) => i !== index);\r\n if (mappings.length === 0) delete field.autoPatch;\r\n else field.autoPatch = { ...field.autoPatch, mappings };\r\n });\r\n }\r\n\r\n // ─── patchOnTrue ────────────────────────────────────────────────────────────\r\n\r\n addPatchOnTrueMapping(fieldId: string): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n field.patchOnTrue = [...(field.patchOnTrue ?? []), { from: '', to: '' }];\r\n });\r\n }\r\n\r\n updatePatchOnTrueMapping(fieldId: string, index: number, patch: Partial<PatchOnTrueMapping>): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field?.patchOnTrue?.[index]) return;\r\n field.patchOnTrue = field.patchOnTrue.map((m, i) => (i === index ? { ...m, ...patch } : m));\r\n });\r\n }\r\n\r\n removePatchOnTrueMapping(fieldId: string, index: number): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field?.patchOnTrue) return;\r\n const mappings = field.patchOnTrue.filter((_, i) => i !== index);\r\n if (mappings.length === 0) delete field.patchOnTrue;\r\n else field.patchOnTrue = mappings;\r\n });\r\n }\r\n\r\n // ─── showWhen (static conditional visibility) ───────────────────────────────\r\n\r\n /** Replace a field's `showWhen` map; an empty map removes the condition. */\r\n setShowWhen(fieldId: string, showWhen: Record<string, unknown> | undefined): void {\r\n this.mutate(draft => {\r\n const field = this.findFieldInTabs(draft.tabs, fieldId);\r\n if (!field) return;\r\n if (!showWhen || Object.keys(showWhen).length === 0) delete field.showWhen;\r\n else field.showWhen = showWhen;\r\n });\r\n }\r\n\r\n // ─── Rules ──────────────────────────────────────────────────────────────────\r\n\r\n /** Rules for the field currently selected in the inspector. */\r\n readonly rulesForSelectedField = computed<FormRule[]>(() => {\r\n const id = this._selectedFieldId();\r\n if (!id) return [];\r\n return this._rules().filter(r => r.fieldId === id || r.targets.some(t => t.id === id));\r\n });\r\n\r\n loadRules(rules: FormRule[]): void {\r\n this._rules.set(clone(rules));\r\n }\r\n\r\n addRule(rule: FormRule): string {\r\n const id = rule.id?.trim() || this.uniqueId('rule', this._rules().map(r => ({ id: r.id ?? '' })));\r\n this._rules.update(rules => [...rules, { ...clone(rule), id }]);\r\n return id;\r\n }\r\n\r\n updateRule(id: string, patch: Partial<FormRule>): void {\r\n this._rules.update(rules => rules.map(r => (r.id === id ? { ...r, ...clone(patch), id } : r)));\r\n }\r\n\r\n removeRule(id: string): void {\r\n this._rules.update(rules => rules.filter(r => r.id !== id));\r\n }\r\n\r\n toggleRule(id: string, enabled: boolean): void {\r\n this.updateRule(id, { enabled });\r\n }\r\n\r\n /** Move a rule in priority order. Priorities are renumbered 1..n so they stay contiguous. */\r\n moveRule(id: string, direction: -1 | 1): void {\r\n this._rules.update(rules => {\r\n const next = [...rules];\r\n const from = next.findIndex(r => r.id === id);\r\n if (from === -1) return rules;\r\n const to = from + direction;\r\n if (to < 0 || to >= next.length) return rules;\r\n const [item] = next.splice(from, 1);\r\n next.splice(to, 0, item);\r\n return next.map((r, i) => ({ ...r, priority: i + 1 }));\r\n });\r\n }\r\n\r\n exportRules(): FormRule[] {\r\n return clone(this._rules());\r\n }\r\n\r\n // ─── Tabs ───────────────────────────────────────────────────────────────────\r\n\r\n addTab(): string {\r\n // Must be unique across the whole tree, not just the top level: a tab id is the record\r\n // storage path, so a new top-level tab colliding with an existing sub-tab would make two\r\n // tabs write to the same key and break findTab/getTabPath.\r\n const id = this.uniqueId('tab', this.allTabIds().map(tid => ({ id: tid })));\r\n this.mutate(draft => {\r\n const tabs = draft.tabs ?? (draft.tabs = []);\r\n const lang = draft.defaultLanguage ?? 'en';\r\n tabs.push({ id, label: { [lang]: humanizeId(id) }, fields: [] });\r\n });\r\n return id;\r\n }\r\n\r\n /** Every tab id in the tree, at any depth. Tab ids must be globally unique — they are paths. */\r\n private allTabIds(): string[] {\r\n const ids: string[] = [];\r\n const collect = (tabs: NestedTabConfig[] | undefined) => {\r\n for (const t of tabs ?? []) {\r\n ids.push(t.id);\r\n collect(t.children);\r\n }\r\n };\r\n collect(this._config().tabs);\r\n return ids;\r\n }\r\n\r\n addSubTab(parentId: string): string {\r\n const id = this.uniqueId('tab', this.allTabIds().map(tid => ({ id: tid })));\r\n this.mutate(draft => {\r\n const parent = findTab(draft.tabs, parentId);\r\n if (parent) {\r\n parent.children = parent.children ?? [];\r\n const lang = draft.defaultLanguage ?? 'en';\r\n parent.children.push({ id, label: { [lang]: humanizeId(id) }, fields: [] });\r\n }\r\n });\r\n return id;\r\n }\r\n\r\n setPrimaryTab(tabId: string): void {\r\n this.mutate(draft => {\r\n const markPrimary = (tabs: NestedTabConfig[]) => {\r\n for (const t of tabs) {\r\n t.isPrimaryTab = t.id === tabId;\r\n if (t.children) markPrimary(t.children);\r\n }\r\n };\r\n markPrimary(draft.tabs ?? []);\r\n });\r\n }\r\n\r\n updateTab(id: string, patch: Partial<NestedTabConfig>): void {\r\n this.mutate(draft => {\r\n const tab = findTab(draft.tabs, id);\r\n if (tab) Object.assign(tab, patch);\r\n });\r\n }\r\n\r\n setTabLabel(id: string, language: string, value: string): void {\r\n this.mutate(draft => {\r\n const tab = findTab(draft.tabs, id);\r\n if (tab) tab.label = { ...tab.label, [language]: value };\r\n });\r\n }\r\n\r\n removeTab(id: string): void {\r\n this.mutate(draft => {\r\n const removeRecursive = (tabs: NestedTabConfig[]): NestedTabConfig[] => {\r\n return tabs\r\n .filter(t => t.id !== id)\r\n .map(t => ({\r\n ...t,\r\n children: t.children ? removeRecursive(t.children) : undefined,\r\n }));\r\n };\r\n draft.tabs = removeRecursive(draft.tabs ?? []);\r\n });\r\n }\r\n\r\n moveTab(id: string, direction: -1 | 1): void {\r\n this.mutate(draft => {\r\n const tabs = draft.tabs ?? [];\r\n const from = tabs.findIndex(t => t.id === id);\r\n if (from === -1) return;\r\n const to = from + direction;\r\n if (to < 0 || to >= tabs.length) return;\r\n const [item] = tabs.splice(from, 1);\r\n tabs.splice(to, 0, item);\r\n });\r\n }\r\n\r\n // ─── Export ─────────────────────────────────────────────────────────────────\r\n\r\n exportConfig(): EntityFormConfig {\r\n return clone(this._config());\r\n }\r\n\r\n // ─── Internals ──────────────────────────────────────────────────────────────\r\n\r\n private mutate(fn: (draft: EntityFormConfig) => void): void {\r\n const draft = clone(this._config());\r\n draft.tabs = draft.tabs ?? [];\r\n fn(draft);\r\n this._config.set(draft);\r\n this._isDirty.set(true);\r\n }\r\n\r\n private uniqueId(prefix: string, existing: { id: string }[]): string {\r\n const taken = new Set(existing.map(e => e.id));\r\n let n = 1;\r\n let candidate = `${prefix}_${n}`;\r\n while (taken.has(candidate)) {\r\n n += 1;\r\n candidate = `${prefix}_${n}`;\r\n }\r\n return candidate;\r\n }\r\n\r\n private validate(config: EntityFormConfig): BuilderProblem[] {\r\n const problems: BuilderProblem[] = [];\r\n\r\n if (!config.entity || !config.entity.trim()) {\r\n problems.push({ level: 'error', message: 'Entity name is required.' });\r\n } else if (!ID_PATTERN.test(config.entity)) {\r\n problems.push({\r\n level: 'error',\r\n message:\r\n 'Entity name must start with a letter or underscore and contain only letters, digits, and underscores.',\r\n });\r\n }\r\n\r\n const allFields = this.getAllFields(config.tabs);\r\n if (allFields.length === 0) {\r\n problems.push({ level: 'warning', message: 'This entity has no fields yet.' });\r\n }\r\n\r\n const seen = new Map<string, number>();\r\n for (const field of allFields) {\r\n seen.set(field.id, (seen.get(field.id) ?? 0) + 1);\r\n\r\n if (!field.id || !ID_PATTERN.test(field.id)) {\r\n problems.push({\r\n level: 'error',\r\n message: `Field id \"${field.id}\" is not a valid identifier.`,\r\n fieldId: field.id,\r\n });\r\n }\r\n\r\n const labels = field.label ?? {};\r\n const hasLabel = Object.values(labels).some(v => typeof v === 'string' && v.trim());\r\n if (!hasLabel) {\r\n problems.push({\r\n level: 'warning',\r\n message: `Field \"${field.id}\" has no label.`,\r\n fieldId: field.id,\r\n });\r\n }\r\n\r\n const meta = getFieldTypeMeta(field.type);\r\n // A field on the lookup source has no inline options by design — its options arrive from\r\n // the registry at runtime. Warn only about the missing list name.\r\n if (meta?.hasOptions && typeof field.listName === 'string') {\r\n if (!field.listName.trim()) {\r\n problems.push({\r\n level: 'warning',\r\n message: `Field \"${field.id}\" reads options from a named list but has no list name.`,\r\n fieldId: field.id,\r\n });\r\n }\r\n } else if (meta?.hasOptions && (!field.options || field.options.length === 0)) {\r\n problems.push({\r\n level: 'warning',\r\n message: `Field \"${field.id}\" is a ${field.type} but has no options.`,\r\n fieldId: field.id,\r\n });\r\n }\r\n }\r\n\r\n for (const [id, count] of seen) {\r\n if (count > 1) {\r\n problems.push({ level: 'error', message: `Duplicate field id \"${id}\" (${count}×).`, fieldId: id });\r\n }\r\n }\r\n\r\n return problems;\r\n }\r\n}\r\n","import { Component, computed, inject, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { NestedFieldConfig } from '@dynamic-entity/core';\r\nimport { resolveLabel } from '@dynamic-entity/core';\r\nimport { BuilderStore } from '../builder-store.service';\r\n\r\n/**\r\n * EntityReferenceConfigComponent — authors the `entityReference` block of an entity-ref field:\r\n * registry key, display fields, static filters, and the parent→child cascade.\r\n *\r\n * Also authors `autoPatch`, since the mappings only make sense against the record the\r\n * selected reference returns.\r\n */\r\n@Component({\r\n selector: 'ngx-entity-reference-config',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatButtonModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSlideToggleModule,\r\n MatTooltipModule,\r\n ],\r\n template: `\r\n @if (field(); as f) {\r\n <div class=\"deb-entity-ref\">\r\n <span class=\"deb-section-title\">Entity reference</span>\r\n\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Registry key</mat-label>\r\n <input\r\n matInput\r\n data-testid=\"entity-ref-key\"\r\n [ngModel]=\"ref(f).linkedEntityKey ?? ''\"\r\n (ngModelChange)=\"patchRef(f, { linkedEntityKey: $event || undefined })\"\r\n />\r\n <mat-hint>Key the consumer registered a loader under. Defaults to the field id.</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Display fields</mat-label>\r\n <input\r\n matInput\r\n data-testid=\"entity-ref-display-fields\"\r\n [ngModel]=\"displayFieldsText(f)\"\r\n (ngModelChange)=\"setDisplayFields(f, $event)\"\r\n />\r\n <mat-hint>Comma-separated record paths used to build each option label.</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Static filters (JSON)</mat-label>\r\n <input\r\n matInput\r\n data-testid=\"entity-ref-filters\"\r\n [ngModel]=\"filtersText(f)\"\r\n (ngModelChange)=\"setFilters(f, $event)\"\r\n />\r\n @if (filtersError()) {\r\n <mat-hint class=\"deb-error-hint\">{{ filtersError() }}</mat-hint>\r\n } @else {\r\n <mat-hint>Passed to the loader, e.g. {\"isEmployee\": false}.</mat-hint>\r\n }\r\n </mat-form-field>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Cascade -->\r\n <span class=\"deb-section-title\">Cascade</span>\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Parent field</mat-label>\r\n <mat-select\r\n data-testid=\"entity-ref-parent\"\r\n [ngModel]=\"ref(f).parentField ?? ''\"\r\n (ngModelChange)=\"patchRef(f, { parentField: $event || undefined })\"\r\n >\r\n <mat-option value=\"\">None — load all options</mat-option>\r\n @for (candidate of parentCandidates(); track candidate.id) {\r\n <mat-option [value]=\"candidate.id\">{{ fieldLabel(candidate) }} ({{ candidate.id }})</mat-option>\r\n }\r\n </mat-select>\r\n <mat-hint>This field's options reload whenever the parent changes.</mat-hint>\r\n </mat-form-field>\r\n\r\n @if (ref(f).parentField) {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Lookup filter path</mat-label>\r\n <input\r\n matInput\r\n data-testid=\"entity-ref-lookup-filter\"\r\n [ngModel]=\"ref(f).lookupFilter ?? ''\"\r\n (ngModelChange)=\"patchRef(f, { lookupFilter: $event || undefined })\"\r\n />\r\n <mat-hint>Keep options whose record matches the parent value at this path.</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Lookup path (nested options)</mat-label>\r\n <input\r\n matInput\r\n data-testid=\"entity-ref-lookup-path\"\r\n [ngModel]=\"ref(f).lookupPath ?? ''\"\r\n (ngModelChange)=\"patchRef(f, { lookupPath: $event || undefined })\"\r\n />\r\n <mat-hint>Take options from this array on the selected parent's record instead.</mat-hint>\r\n </mat-form-field>\r\n }\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- autoPatch -->\r\n <div class=\"deb-row deb-row--split\">\r\n <span class=\"deb-section-title\">Auto-patch on select</span>\r\n <button\r\n mat-stroked-button\r\n type=\"button\"\r\n data-testid=\"add-auto-patch\"\r\n (click)=\"store.addAutoPatchMapping(f.id)\"\r\n >\r\n <mat-icon>add</mat-icon> Mapping\r\n </button>\r\n </div>\r\n\r\n @if (f.autoPatch) {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Target tab</mat-label>\r\n <mat-select\r\n data-testid=\"auto-patch-tab\"\r\n [ngModel]=\"f.autoPatch.targetTab\"\r\n (ngModelChange)=\"store.setAutoPatchTargetTab(f.id, $event)\"\r\n >\r\n @for (tab of store.tabs(); track tab.id) {\r\n <mat-option [value]=\"tab.id\">{{ tabLabel(tab.id) }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n @for (mapping of f.autoPatch.mappings; track $index) {\r\n <div class=\"deb-option-row\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-label>Source (linked record)</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"mapping.source\"\r\n (ngModelChange)=\"store.updateAutoPatchMapping(f.id, $index, { source: $event })\"\r\n />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-label>Target field</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"mapping.target\"\r\n (ngModelChange)=\"store.updateAutoPatchMapping(f.id, $index, { target: $event })\"\r\n />\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n matTooltip=\"Remove mapping\"\r\n (click)=\"store.removeAutoPatchMapping(f.id, $index)\"\r\n >\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n } @else {\r\n <p class=\"deb-hint\">\r\n No auto-patch configured — selecting a reference will not copy any values.\r\n </p>\r\n }\r\n </div>\r\n }\r\n `,\r\n styles: [\r\n `\r\n .deb-entity-ref {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n .deb-full {\r\n width: 100%;\r\n }\r\n .deb-row {\r\n display: flex;\r\n gap: 8px;\r\n align-items: center;\r\n }\r\n .deb-row--split {\r\n justify-content: space-between;\r\n }\r\n .deb-option-row {\r\n display: flex;\r\n gap: 6px;\r\n align-items: center;\r\n }\r\n .deb-option-row > mat-form-field {\r\n flex: 1;\r\n }\r\n .deb-error-hint {\r\n color: #b91c1c;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class EntityReferenceConfigComponent {\r\n protected readonly store = inject(BuilderStore);\r\n\r\n protected readonly field = this.store.selectedField;\r\n\r\n /** Sibling fields that can drive a cascade — anything but this field itself. */\r\n protected readonly parentCandidates = computed<NestedFieldConfig[]>(() => {\r\n const current = this.field();\r\n return this.store.fields().filter(f => f.id !== current?.id);\r\n });\r\n\r\n private readonly filtersParseError = signal<string | null>(null);\r\n protected readonly filtersError = this.filtersParseError.asReadonly();\r\n\r\n protected ref(field: NestedFieldConfig) {\r\n return field.entityReference ?? { enabled: true };\r\n }\r\n\r\n protected patchRef(field: NestedFieldConfig, patch: Record<string, unknown>): void {\r\n this.store.updateEntityReference(field.id, patch);\r\n }\r\n\r\n protected fieldLabel(field: NestedFieldConfig): string {\r\n return resolveLabel(field.label, this.store.activeLanguage());\r\n }\r\n\r\n protected tabLabel(tabId: string): string {\r\n const tab = this.store.tabs().find(t => t.id === tabId);\r\n return tab ? resolveLabel(tab.label, this.store.activeLanguage()) : tabId;\r\n }\r\n\r\n protected displayFieldsText(field: NestedFieldConfig): string {\r\n return (this.ref(field).displayFields ?? []).join(', ');\r\n }\r\n\r\n protected setDisplayFields(field: NestedFieldConfig, value: string): void {\r\n const parts = value\r\n .split(',')\r\n .map(s => s.trim())\r\n .filter(Boolean);\r\n this.patchRef(field, { displayFields: parts.length ? parts : undefined });\r\n }\r\n\r\n protected filtersText(field: NestedFieldConfig): string {\r\n const filters = this.ref(field).filters;\r\n return filters ? JSON.stringify(filters) : '';\r\n }\r\n\r\n /** Invalid JSON is reported inline and left unapplied rather than silently dropped. */\r\n protected setFilters(field: NestedFieldConfig, value: string): void {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n this.filtersParseError.set(null);\r\n this.patchRef(field, { filters: undefined });\r\n return;\r\n }\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\r\n this.filtersParseError.set('Filters must be a JSON object.');\r\n return;\r\n }\r\n this.filtersParseError.set(null);\r\n this.patchRef(field, { filters: parsed as Record<string, unknown> });\r\n } catch {\r\n this.filtersParseError.set('Invalid JSON.');\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\n\nimport type { FormRule, RuleActionType, RuleOperator } from '@dynamic-entity/core';\n\n/**\n * RuleFormComponent — dialog/panel form for creating or editing a FormRule.\n */\n@Component({\n selector: 'ngx-rule-form',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSelectModule,\n ],\n template: `\n <div class=\"deb-rule-form\">\n <h3 class=\"deb-rule-form__title\">{{ rule.id ? 'Edit Rule' : 'New Form Rule' }}</h3>\n\n <!-- Trigger Field -->\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Trigger Field ID</mat-label>\n <input matInput [(ngModel)]=\"rule.fieldId\" placeholder=\"e.g. status\" />\n </mat-form-field>\n\n <!-- Conditions -->\n <div class=\"deb-rule-section\">\n <h4>Conditions</h4>\n @for (cond of rule.conditions; track $index) {\n <div class=\"deb-rule-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Operator</mat-label>\n <mat-select [(ngModel)]=\"cond.operator\">\n @for (op of operators; track op) {\n <mat-option [value]=\"op\">{{ op }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Value</mat-label>\n <input matInput [(ngModel)]=\"cond.value\" placeholder=\"Condition value\" />\n </mat-form-field>\n <button mat-icon-button color=\"warn\" type=\"button\" (click)=\"removeCondition($index)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n }\n <button mat-stroked-button type=\"button\" (click)=\"addCondition()\">\n <mat-icon>add</mat-icon> Add Condition\n </button>\n </div>\n\n <!-- Action -->\n <div class=\"deb-rule-section\">\n <h4>Action</h4>\n <div class=\"deb-rule-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Action Type</mat-label>\n <mat-select [(ngModel)]=\"rule.action.type\">\n <mat-option value=\"visibility\">Visibility (Show/Hide)</mat-option>\n <mat-option value=\"validation\">Validation Message</mat-option>\n <mat-option value=\"info\">Info Banner</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Value / Message</mat-label>\n <input matInput [(ngModel)]=\"rule.action.value\" placeholder=\"false to hide, or message text\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"deb-rule-form__actions\">\n <button mat-button type=\"button\" (click)=\"cancel.emit()\">Cancel</button>\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"save.emit(rule)\">Save Rule</button>\n </div>\n </div>\n `,\n styles: [\n `\n .deb-rule-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n background: #fafafa;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n padding: 16px;\n }\n .deb-rule-form__title {\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n }\n .deb-full {\n width: 100%;\n }\n .deb-rule-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .deb-rule-section h4 {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: #555;\n }\n .deb-rule-row {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n .deb-rule-row > * {\n flex: 1;\n }\n .deb-rule-form__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 8px;\n }\n `,\n ],\n})\nexport class RuleFormComponent {\n @Input() rule: FormRule = {\n formConfigId: 'form-1',\n fieldId: '',\n conditions: [{ operator: 'EQUAL', compareType: 'value', value: '' }],\n action: { type: 'visibility', value: false },\n targets: [],\n enabled: true,\n priority: 1,\n };\n\n @Output() save = new EventEmitter<FormRule>();\n @Output() cancel = new EventEmitter<void>();\n\n readonly operators: RuleOperator[] = [\n 'EQUAL',\n 'NOT_EQUAL',\n 'CONTAINS',\n 'NOT_CONTAINS',\n 'STARTS_WITH',\n 'ENDS_WITH',\n 'IS_EMPTY',\n 'IS_NOT_EMPTY',\n 'LESS_THAN',\n 'MORE_THAN',\n 'LESS_THAN_EQUAL',\n 'MORE_THAN_EQUAL',\n 'DATE_BEFORE',\n 'DATE_AFTER',\n 'IN',\n 'NOT_IN',\n 'HAS_ITEMS',\n 'VALUE_CHANGED',\n ];\n\n addCondition(): void {\n this.rule.conditions.push({ operator: 'EQUAL', compareType: 'value', value: '' });\n }\n\n removeCondition(index: number): void {\n this.rule.conditions.splice(index, 1);\n }\n}\n","import { Component, inject, signal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { FormRule } from '@dynamic-entity/core';\r\nimport { BuilderStore } from '../builder-store.service';\r\nimport { deepClone } from '../clone';\r\nimport { RuleFormComponent } from './rule-form.component';\r\n\r\n/**\r\n * FieldRulesListComponent — the rules attached to the selected field: view, reorder,\r\n * enable/disable, edit, delete. `RuleFormComponent` authors one rule; this owns the set.\r\n */\r\n@Component({\r\n selector: 'ngx-field-rules-list',\r\n standalone: true,\r\n imports: [MatButtonModule, MatIconModule, MatSlideToggleModule, MatTooltipModule, RuleFormComponent],\r\n template: `\r\n <div class=\"deb-rules\">\r\n <div class=\"deb-rules__head\">\r\n <span class=\"deb-section-title\">Rules</span>\r\n <button\r\n mat-stroked-button\r\n type=\"button\"\r\n data-testid=\"add-rule\"\r\n [disabled]=\"!store.selectedFieldId()\"\r\n (click)=\"startCreate()\"\r\n >\r\n <mat-icon>add</mat-icon> Rule\r\n </button>\r\n </div>\r\n\r\n @if (editing(); as draft) {\r\n <ngx-rule-form [rule]=\"draft\" (save)=\"commit($event)\" (cancel)=\"editing.set(null)\" />\r\n }\r\n\r\n @if (store.rulesForSelectedField().length === 0 && !editing()) {\r\n <p class=\"deb-hint\" data-testid=\"rules-empty\">No rules on this field.</p>\r\n }\r\n\r\n @for (rule of store.rulesForSelectedField(); track rule.id) {\r\n <div class=\"deb-rule-item\" [class.deb-rule-item--off]=\"!rule.enabled\" data-testid=\"rule-item\">\r\n <div class=\"deb-rule-item__body\">\r\n <span class=\"deb-rule-item__summary\">{{ summarize(rule) }}</span>\r\n <span class=\"deb-rule-item__meta\">\r\n priority {{ rule.priority }} · {{ rule.targets.length }} target(s)\r\n </span>\r\n </div>\r\n <div class=\"deb-rule-item__actions\">\r\n <mat-slide-toggle\r\n [checked]=\"rule.enabled\"\r\n matTooltip=\"Enable / disable\"\r\n (change)=\"store.toggleRule(rule.id!, $event.checked)\"\r\n />\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Move up\"\r\n [attr.data-testid]=\"'rule-up-' + rule.id\"\r\n (click)=\"store.moveRule(rule.id!, -1)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Move down\"\r\n [attr.data-testid]=\"'rule-down-' + rule.id\"\r\n (click)=\"store.moveRule(rule.id!, 1)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Edit rule\"\r\n [attr.data-testid]=\"'rule-edit-' + rule.id\"\r\n (click)=\"startEdit(rule)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n matTooltip=\"Delete rule\"\r\n [attr.data-testid]=\"'rule-delete-' + rule.id\"\r\n (click)=\"store.removeRule(rule.id!)\"\r\n >\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .deb-rules {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n }\r\n .deb-rules__head {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n .deb-rule-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 8px;\r\n border: 1px solid #e5e7eb;\r\n border-radius: 8px;\r\n padding: 8px 10px;\r\n }\r\n .deb-rule-item--off {\r\n opacity: 0.55;\r\n }\r\n .deb-rule-item__body {\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n }\r\n .deb-rule-item__summary {\r\n font-size: 13px;\r\n font-weight: 600;\r\n overflow-wrap: anywhere;\r\n }\r\n .deb-rule-item__meta {\r\n font-size: 11px;\r\n color: #6b7280;\r\n }\r\n .deb-rule-item__actions {\r\n display: flex;\r\n align-items: center;\r\n flex: 0 0 auto;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class FieldRulesListComponent {\r\n protected readonly store = inject(BuilderStore);\r\n\r\n /** The rule currently open in the editor — a new draft or a copy of an existing rule. */\r\n protected readonly editing = signal<FormRule | null>(null);\r\n\r\n protected startCreate(): void {\r\n const fieldId = this.store.selectedFieldId();\r\n if (!fieldId) return;\r\n this.editing.set({\r\n formConfigId: this.store.config().entity || 'form-1',\r\n fieldId,\r\n conditions: [{ operator: 'EQUAL', compareType: 'value', value: '' }],\r\n action: { type: 'visibility', value: false },\r\n targets: [{ id: fieldId, type: 'field' }],\r\n enabled: true,\r\n priority: this.store.rules().length + 1,\r\n });\r\n }\r\n\r\n protected startEdit(rule: FormRule): void {\r\n this.editing.set(deepClone(rule));\r\n }\r\n\r\n protected commit(rule: FormRule): void {\r\n if (rule.id) this.store.updateRule(rule.id, rule);\r\n else this.store.addRule(rule);\r\n this.editing.set(null);\r\n }\r\n\r\n /** One-line human summary: `status EQUAL \"archived\" → hide`. */\r\n protected summarize(rule: FormRule): string {\r\n const cond = rule.conditions\r\n .map(c => {\r\n const rhs = c.compareType === 'field' ? c.compareToField : JSON.stringify(c.value ?? '');\r\n return `${c.operator} ${rhs ?? ''}`.trim();\r\n })\r\n .join(' AND ');\r\n\r\n const action =\r\n rule.action.type === 'visibility'\r\n ? rule.action.value === false || rule.action.value === 'false'\r\n ? 'hide'\r\n : 'show'\r\n : `${rule.action.type}: ${rule.action.value}`;\r\n\r\n return `${rule.fieldId} ${cond} → ${action}`;\r\n }\r\n}\r\n","import { Component, computed, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { ConfigSourceService } from 'ngx-dynamic-entity';\nimport type { NestedFieldConfig } from '@dynamic-entity/core';\nimport { BuilderStore } from '../builder-store.service';\n\n@Component({\n selector: 'ngx-referenced-field-config',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatDividerModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSlideToggleModule,\n ],\n template: `\n @if (field(); as f) {\n <div class=\"deb-referenced-field\" style=\"margin-top: 16px;\">\n <div class=\"deb-row\" style=\"justify-content: space-between; align-items: center; margin-bottom: 8px;\">\n <span class=\"deb-section-title\" style=\"margin:0;\">Referenced Field</span>\n <mat-slide-toggle\n data-testid=\"toggle-referenced\"\n [ngModel]=\"f.isReferenced ?? false\"\n (ngModelChange)=\"toggleReferenced(f, $event)\"\n >\n Link\n </mat-slide-toggle>\n </div>\n\n @if (f.isReferenced) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\" style=\"margin-bottom: 8px;\">\n <mat-label>Source Entity Key</mat-label>\n <input\n matInput\n data-testid=\"referenced-entity-key\"\n [ngModel]=\"f.referencedEntityKey ?? ''\"\n (ngModelChange)=\"updateEntityKey(f, $event)\"\n placeholder=\"e.g. individuals\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\" style=\"margin-bottom: 8px;\">\n <mat-label>Source Field ID</mat-label>\n <input\n matInput\n data-testid=\"referenced-field-id\"\n [ngModel]=\"f.referencedFieldId ?? ''\"\n (ngModelChange)=\"updateFieldId(f, $event)\"\n placeholder=\"e.g. firstName\"\n />\n </mat-form-field>\n\n @if (f.hasDrift) {\n <div class=\"deb-drift-banner\" data-testid=\"drift-banner\" style=\"background: #fff3e0; border: 1px solid #ffe0b2; padding: 8px 12px; border-radius: 4px; margin-top: 8px;\">\n <div class=\"deb-row\" style=\"gap: 8px; align-items: center; color: #e65100; font-weight: 500;\">\n <mat-icon style=\"font-size: 18px; width:18px; height:18px;\">warning</mat-icon>\n <span>Source field definition has drifted!</span>\n </div>\n <p style=\"margin: 4px 0 8px 0; font-size: 12px; color: #666;\">\n The upstream field configuration in \"{{ f.referencedEntityKey }}\" has evolved.\n </p>\n <button\n mat-flat-button\n color=\"warn\"\n type=\"button\"\n data-testid=\"sync-source-btn\"\n (click)=\"syncWithSource(f)\"\n >\n Sync with Source\n </button>\n </div>\n }\n }\n </div>\n }\n `,\n})\nexport class ReferencedFieldConfigComponent {\n protected readonly store = inject(BuilderStore);\n protected readonly configSource = inject(ConfigSourceService, { optional: true }) as ConfigSourceService | null;\n protected readonly field = computed(() => this.store.selectedField());\n\n protected toggleReferenced(field: NestedFieldConfig, enabled: boolean): void {\n if (enabled) {\n this.store.updateField(field.id, { isReferenced: true });\n } else {\n this.store.unlinkReferencedField(field.id);\n }\n }\n\n protected updateEntityKey(field: NestedFieldConfig, key: string): void {\n const trimmed = key.trim();\n this.store.updateField(field.id, { referencedEntityKey: trimmed || undefined });\n this.checkDriftForField(field.id);\n }\n\n protected updateFieldId(field: NestedFieldConfig, fieldId: string): void {\n const trimmed = fieldId.trim();\n this.store.updateField(field.id, { referencedFieldId: trimmed || undefined });\n this.checkDriftForField(field.id);\n }\n\n protected async syncWithSource(field: NestedFieldConfig): Promise<void> {\n if (!field.referencedEntityKey || !field.referencedFieldId || !this.configSource) return;\n const sourceConfig = await this.configSource.getConfig(field.referencedEntityKey);\n if (!sourceConfig) return;\n\n const sourceField = this.findField(sourceConfig.tabs ?? [], field.referencedFieldId);\n if (sourceField) {\n this.store.syncReferencedField(field.id, sourceField);\n }\n }\n\n private async checkDriftForField(fieldId: string): Promise<void> {\n const f = this.store.selectedField();\n if (!f || !f.isReferenced || !f.referencedEntityKey || !f.referencedFieldId || !this.configSource) return;\n const sourceConfig = await this.configSource.getConfig(f.referencedEntityKey);\n if (sourceConfig) {\n this.store.checkDrift({ [f.referencedEntityKey]: sourceConfig });\n }\n }\n\n private findField(tabs: any[], id: string): NestedFieldConfig | undefined {\n for (const t of tabs) {\n for (const f of t.fields ?? []) {\n if (f.id === id) return f;\n if (f.children?.length) {\n const res = this.findFieldInList(f.children, id);\n if (res) return res;\n }\n }\n }\n return undefined;\n }\n\n private findFieldInList(fields: NestedFieldConfig[], id: string): NestedFieldConfig | undefined {\n for (const f of fields) {\n if (f.id === id) return f;\n if (f.children?.length) {\n const res = this.findFieldInList(f.children, id);\n if (res) return res;\n }\n }\n return undefined;\n }\n}\n","import { Component, computed, inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { DropdownOption, NestedFieldConfig } from '@dynamic-entity/core';\r\nimport { getOptionStoredValue, resolveLabel, resolveOptionLabel } from '@dynamic-entity/core';\r\nimport { BuilderStore } from '../builder-store.service';\r\nimport { getFieldTypeMeta, type FieldTypeMeta } from '../field-catalog';\r\nimport { EntityReferenceConfigComponent } from './entity-reference-config.component';\r\nimport { FieldRulesListComponent } from './field-rules-list.component';\r\nimport { ReferencedFieldConfigComponent } from './referenced-field-config.component';\r\n\r\n/**\r\n * FieldInspectorComponent — edits every property of the currently selected field.\r\n */\r\n@Component({\r\n selector: 'ngx-field-inspector',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSlideToggleModule,\r\n MatTooltipModule,\r\n EntityReferenceConfigComponent,\r\n FieldRulesListComponent,\r\n ReferencedFieldConfigComponent,\r\n ],\r\n templateUrl: './field-inspector.component.html',\r\n styles: [\r\n `\r\n .deb-inspector {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n .deb-inspector__empty {\r\n color: var(--deb-muted, #6b7280);\r\n text-align: center;\r\n padding: 24px 8px;\r\n }\r\n .deb-full {\r\n width: 100%;\r\n }\r\n .deb-row {\r\n display: flex;\r\n gap: 8px;\r\n align-items: center;\r\n }\r\n .deb-row > * {\r\n flex: 1;\r\n }\r\n .deb-row--split {\r\n justify-content: space-between;\r\n }\r\n .deb-row--split > * {\r\n flex: 0 0 auto;\r\n }\r\n .deb-toggles {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 8px 12px;\r\n }\r\n .deb-option-row {\r\n display: flex;\r\n gap: 6px;\r\n align-items: center;\r\n }\r\n .deb-chip {\r\n display: inline-block;\r\n padding: 2px 8px;\r\n border-radius: 12px;\r\n background: var(--deb-accent-soft, #eef2ff);\r\n color: var(--deb-accent, #6366f1);\r\n font-size: 12px;\r\n font-weight: 600;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class FieldInspectorComponent {\r\n protected readonly store = inject(BuilderStore);\r\n\r\n protected readonly field = this.store.selectedField;\r\n protected readonly meta = computed<FieldTypeMeta | undefined>(() => {\r\n const f = this.field();\r\n return f ? getFieldTypeMeta(f.type) : undefined;\r\n });\r\n\r\n protected lang(): string {\r\n return this.store.activeLanguage();\r\n }\r\n\r\n\r\n protected toNum(value: unknown): number | null {\r\n if (value === '' || value === null || value === undefined) return null;\r\n const n = Number(value);\r\n return Number.isNaN(n) ? null : n;\r\n }\r\n\r\n protected labelValue(field: NestedFieldConfig): string {\r\n return resolveLabel(field.label, this.lang());\r\n }\r\n\r\n protected placeholderValue(field: NestedFieldConfig): string {\r\n return resolveLabel(field.placeholder, this.lang());\r\n }\r\n\r\n protected optionLabel(option: DropdownOption): string {\r\n return resolveOptionLabel(option, this.lang());\r\n }\r\n\r\n // ─── showWhen editing ───────────────────────────────────────────────────────\r\n\r\n protected showWhenEntries(field: NestedFieldConfig): { key: string; display: string }[] {\r\n return Object.entries(field.showWhen ?? {}).map(([key, value]) => ({\r\n key,\r\n display: this.stringifyShowWhen(value),\r\n }));\r\n }\r\n\r\n protected addShowWhen(field: NestedFieldConfig): void {\r\n const next = { ...(field.showWhen ?? {}) };\r\n let key = 'field';\r\n let n = 1;\r\n while (key in next) key = `field_${++n}`;\r\n next[key] = true;\r\n this.store.setShowWhen(field.id, next);\r\n }\r\n\r\n protected renameShowWhen(field: NestedFieldConfig, oldKey: string, newKey: string): void {\r\n const trimmed = newKey.trim();\r\n if (!trimmed || trimmed === oldKey) return;\r\n const current = field.showWhen ?? {};\r\n if (trimmed in current) return;\r\n const next: Record<string, unknown> = {};\r\n // Rebuild in order so the row does not jump while the user is typing.\r\n for (const [k, v] of Object.entries(current)) next[k === oldKey ? trimmed : k] = v;\r\n this.store.setShowWhen(field.id, next);\r\n }\r\n\r\n protected setShowWhenValue(field: NestedFieldConfig, key: string, raw: string): void {\r\n this.store.setShowWhen(field.id, { ...(field.showWhen ?? {}), [key]: this.parseShowWhen(raw) });\r\n }\r\n\r\n protected removeShowWhen(field: NestedFieldConfig, key: string): void {\r\n const next = { ...(field.showWhen ?? {}) };\r\n delete next[key];\r\n this.store.setShowWhen(field.id, next);\r\n }\r\n\r\n /**\r\n * `showWhen` compares with `!==`, so the authored type has to survive the round trip:\r\n * \"true\"/\"false\" become booleans and numeric text becomes a number.\r\n */\r\n private parseShowWhen(raw: string): unknown {\r\n const trimmed = raw.trim();\r\n if (trimmed === 'true') return true;\r\n if (trimmed === 'false') return false;\r\n if (trimmed === 'null') return null;\r\n if (trimmed !== '' && !Number.isNaN(Number(trimmed))) return Number(trimmed);\r\n return raw;\r\n }\r\n\r\n private stringifyShowWhen(value: unknown): string {\r\n if (value === null) return 'null';\r\n if (typeof value === 'object') return JSON.stringify(value);\r\n return String(value);\r\n }\r\n}\r\n","@if (field(); as f) {\r\n <div class=\"deb-inspector\">\r\n <!-- Identity -->\r\n <div class=\"deb-row\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-label>Field id</mat-label>\r\n <input matInput data-testid=\"field-id\" [value]=\"f.id\" disabled />\r\n @if (store.hasManualId(f.id)) {\r\n <mat-hint>The stored data key for this saved field — fixed.</mat-hint>\r\n } @else {\r\n <mat-hint>Derived from the label. Used as the data key.</mat-hint>\r\n }\r\n </mat-form-field>\r\n <span class=\"deb-chip\">{{ meta()?.label || f.type }}</span>\r\n </div>\r\n\r\n <!-- Localised text (active language) -->\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Label ({{ lang() }})</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"labelValue(f)\"\r\n (ngModelChange)=\"store.setFieldLabel(f.id, lang(), $event)\"\r\n />\r\n </mat-form-field>\r\n\r\n @if (meta()?.supportsPlaceholder) {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Placeholder ({{ lang() }})</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"placeholderValue(f)\"\r\n (ngModelChange)=\"store.setFieldPlaceholder(f.id, lang(), $event)\"\r\n />\r\n </mat-form-field>\r\n }\r\n\r\n @if (meta()?.supportsDefaultValue) {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Default value</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"f.defaultValue ?? ''\"\r\n (ngModelChange)=\"store.updateField(f.id, { defaultValue: $event })\"\r\n />\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Entity reference, cascade, and autoPatch -->\r\n @if (meta()?.isEntityRef) {\r\n <mat-divider></mat-divider>\r\n <ngx-entity-reference-config />\r\n }\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Validators -->\r\n @if (meta(); as m) {\r\n @if (m.flagValidators.length || m.paramValidators.length) {\r\n <span class=\"deb-section-title\">Validation</span>\r\n <div class=\"deb-toggles\">\r\n @for (v of m.flagValidators; track v) {\r\n <mat-checkbox\r\n [ngModel]=\"store.hasFlagValidator(f, v)\"\r\n (ngModelChange)=\"store.toggleFlagValidator(f.id, v, $event)\"\r\n >{{ v }}</mat-checkbox>\r\n }\r\n </div>\r\n @for (v of m.paramValidators; track v) {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>{{ v }}</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [ngModel]=\"store.getParamValidator(f, v)\"\r\n (ngModelChange)=\"store.setParamValidator(f.id, v, toNum($event))\"\r\n />\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n <!-- Options (dropdown / radio / multiSelect) -->\r\n @if (meta()?.hasOptions) {\r\n <mat-divider></mat-divider>\r\n <span class=\"deb-section-title\">Data source</span>\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Options come from</mat-label>\r\n <mat-select\r\n data-testid=\"data-source\"\r\n [ngModel]=\"store.fieldDataSource(f)\"\r\n (ngModelChange)=\"store.setFieldDataSource(f.id, $event)\"\r\n >\r\n <mat-option value=\"none\">Nothing yet</mat-option>\r\n <mat-option value=\"manual\">Options authored here</mat-option>\r\n <mat-option value=\"lookup\">A named list</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Named lookup list -->\r\n @if (meta()?.hasOptions && store.fieldDataSource(f) === 'lookup') {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>List name</mat-label>\r\n <input\r\n matInput\r\n data-testid=\"list-name\"\r\n [ngModel]=\"f.listName ?? ''\"\r\n (ngModelChange)=\"store.setListName(f.id, $event)\"\r\n />\r\n </mat-form-field>\r\n <p class=\"deb-hint\">\r\n The consuming app resolves this name through its lookup registry. Options are not\r\n authored here.\r\n </p>\r\n }\r\n\r\n <!-- Inline options -->\r\n @if (meta()?.hasOptions && store.fieldDataSource(f) !== 'lookup') {\r\n <div class=\"deb-row\" style=\"justify-content: space-between;\">\r\n <span class=\"deb-section-title\">Options</span>\r\n <button mat-stroked-button type=\"button\" (click)=\"store.addOption(f.id)\">\r\n <mat-icon>add</mat-icon> Option\r\n </button>\r\n </div>\r\n @for (opt of f.options ?? []; track $index) {\r\n <div class=\"deb-option-row\" data-testid=\"option-row\">\r\n <!-- One input: the displayed text is the stored value. -->\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Option ({{ lang() }})</mat-label>\r\n <input\r\n matInput\r\n [attr.data-testid]=\"'option-' + $index\"\r\n [ngModel]=\"optionLabel(opt)\"\r\n (ngModelChange)=\"store.setOptionLabel(f.id, $index, lang(), $event)\"\r\n />\r\n </mat-form-field>\r\n <button mat-icon-button type=\"button\" color=\"warn\"\r\n (click)=\"store.removeOption(f.id, $index)\" matTooltip=\"Remove option\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n @if (!(f.options ?? []).length) {\r\n <p class=\"deb-hint\">No options yet — add at least one.</p>\r\n }\r\n }\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Flags -->\r\n <span class=\"deb-section-title\">Display</span>\r\n <div class=\"deb-toggles\">\r\n <mat-slide-toggle\r\n [ngModel]=\"f.visibility ?? true\"\r\n (ngModelChange)=\"store.updateField(f.id, { visibility: $event })\"\r\n >Visible</mat-slide-toggle>\r\n <mat-slide-toggle\r\n [ngModel]=\"f.table?.visible ?? false\"\r\n (ngModelChange)=\"store.updateField(f.id, { table: { visible: $event } })\"\r\n >Table column</mat-slide-toggle>\r\n <mat-slide-toggle\r\n [ngModel]=\"f.readonly ?? false\"\r\n (ngModelChange)=\"store.updateField(f.id, { readonly: $event })\"\r\n >Read-only</mat-slide-toggle>\r\n <mat-slide-toggle\r\n [ngModel]=\"f.disabled ?? false\"\r\n (ngModelChange)=\"store.updateField(f.id, { disabled: $event })\"\r\n >Disabled</mat-slide-toggle>\r\n <mat-slide-toggle\r\n [ngModel]=\"f.maskData ?? false\"\r\n (ngModelChange)=\"store.updateField(f.id, { maskData: $event })\"\r\n >Mask data (RBAC)</mat-slide-toggle>\r\n <mat-slide-toggle\r\n data-testid=\"toggle-critical\"\r\n [ngModel]=\"f.criticalField ?? false\"\r\n (ngModelChange)=\"store.updateField(f.id, { criticalField: $event })\"\r\n matTooltip=\"Renders locked; editing it announces a change against the session baseline.\"\r\n >Critical field</mat-slide-toggle>\r\n <mat-slide-toggle\r\n [ngModel]=\"f.showOnMinimize ?? false\"\r\n (ngModelChange)=\"store.updateField(f.id, { showOnMinimize: $event })\"\r\n matTooltip=\"Shown in the record editor's summary panel.\"\r\n >Show in summary</mat-slide-toggle>\r\n </div>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Conditional visibility (static showWhen) -->\r\n <div class=\"deb-row deb-row--split\">\r\n <span class=\"deb-section-title\">Show when</span>\r\n <button mat-stroked-button type=\"button\" data-testid=\"add-show-when\" (click)=\"addShowWhen(f)\">\r\n <mat-icon>add</mat-icon> Condition\r\n </button>\r\n </div>\r\n @for (entry of showWhenEntries(f); track entry.key) {\r\n <div class=\"deb-option-row\" data-testid=\"option-row\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-label>Field id</mat-label>\r\n <input matInput [ngModel]=\"entry.key\" (ngModelChange)=\"renameShowWhen(f, entry.key, $event)\" />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-label>Equals</mat-label>\r\n <input matInput [ngModel]=\"entry.display\" (ngModelChange)=\"setShowWhenValue(f, entry.key, $event)\" />\r\n </mat-form-field>\r\n <button mat-icon-button type=\"button\" color=\"warn\" matTooltip=\"Remove condition\"\r\n (click)=\"removeShowWhen(f, entry.key)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n @if (!showWhenEntries(f).length) {\r\n <p class=\"deb-hint\">Always visible. Add a condition to show this field only for certain values.</p>\r\n }\r\n\r\n <!-- patchOnTrue (boolean/checkbox only) -->\r\n @if (f.type === 'boolean' || f.type === 'checkbox') {\r\n <mat-divider></mat-divider>\r\n <div class=\"deb-row deb-row--split\">\r\n <span class=\"deb-section-title\">Copy on true</span>\r\n <button mat-stroked-button type=\"button\" data-testid=\"add-patch-on-true\"\r\n (click)=\"store.addPatchOnTrueMapping(f.id)\">\r\n <mat-icon>add</mat-icon> Mapping\r\n </button>\r\n </div>\r\n @for (mapping of f.patchOnTrue ?? []; track $index) {\r\n <div class=\"deb-option-row\" data-testid=\"option-row\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-label>From field</mat-label>\r\n <input matInput [ngModel]=\"mapping.from\"\r\n (ngModelChange)=\"store.updatePatchOnTrueMapping(f.id, $index, { from: $event })\" />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-label>To field</mat-label>\r\n <input matInput [ngModel]=\"mapping.to\"\r\n (ngModelChange)=\"store.updatePatchOnTrueMapping(f.id, $index, { to: $event })\" />\r\n </mat-form-field>\r\n <button mat-icon-button type=\"button\" color=\"warn\" matTooltip=\"Remove mapping\"\r\n (click)=\"store.removePatchOnTrueMapping(f.id, $index)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n @if (!(f.patchOnTrue ?? []).length) {\r\n <p class=\"deb-hint\">When this flips to true, copy one field's value into another.</p>\r\n }\r\n }\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Rules attached to this field -->\r\n <ngx-field-rules-list />\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Cross-entity field reference & drift management (Phase 8) -->\r\n <ngx-referenced-field-config />\r\n </div>\r\n} @else {\r\n <div class=\"deb-inspector__empty\">\r\n <mat-icon>touch_app</mat-icon>\r\n <p>Select a field to edit its properties.</p>\r\n </div>\r\n}\r\n","import { Component, EventEmitter, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { RichFieldType } from '@dynamic-entity/core';\r\nimport { FIELD_TYPE_CATALOG, type FieldTypeMeta } from '../field-catalog';\r\n\r\n/**\r\n * FieldPaletteComponent — the list of buildable field types (Angular Material).\r\n */\r\n@Component({\r\n selector: 'ngx-field-palette',\r\n standalone: true,\r\n imports: [MatButtonModule, MatIconModule, MatTooltipModule],\r\n template: `\r\n <div class=\"deb-palette\">\r\n @for (meta of catalog; track meta.type) {\r\n <button\r\n mat-stroked-button\r\n type=\"button\"\r\n class=\"deb-palette__item\"\r\n [attr.data-testid]=\"'palette-' + meta.type\"\r\n [matTooltip]=\"meta.description\"\r\n (click)=\"pick.emit(meta.type)\"\r\n >\r\n <mat-icon>{{ meta.icon }}</mat-icon>\r\n <span>{{ meta.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .deb-palette {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 8px;\r\n }\r\n .deb-palette__item {\r\n justify-content: flex-start;\r\n overflow: hidden;\r\n border-radius: 8px !important;\r\n border: 1px solid var(--border, #e2e8f0) !important;\r\n padding: 8px 12px !important;\r\n font-family: var(--font-heading, inherit) !important;\r\n font-weight: 600 !important;\r\n font-size: 13px !important;\r\n transition: all 0.18s cubic-bezier(0.16, 1, 0.3, 1) !important;\r\n background: #ffffff !important;\r\n }\r\n .deb-palette__item:hover {\r\n border-color: #6366f1 !important;\r\n background: #f5f3ff !important;\r\n color: #4f46e5 !important;\r\n transform: translateY(-1px);\r\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15) !important;\r\n }\r\n .deb-palette__item mat-icon {\r\n color: #6366f1;\r\n margin-right: 6px;\r\n font-size: 18px;\r\n width: 18px;\r\n height: 18px;\r\n }\r\n .deb-palette__item span {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class FieldPaletteComponent {\r\n readonly catalog: readonly FieldTypeMeta[] = FIELD_TYPE_CATALOG;\r\n\r\n @Output() pick = new EventEmitter<RichFieldType>();\r\n}\r\n","import { Component, InjectionToken, inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { NestedTabConfig } from '@dynamic-entity/core';\r\nimport { resolveLabel } from '@dynamic-entity/core';\r\nimport { BuilderStore } from '../builder-store.service';\r\n\r\nexport const SYSTEM_DEFAULT_CAN_EDIT = new InjectionToken<(roles: string[]) => boolean>('SYSTEM_DEFAULT_CAN_EDIT');\r\n\r\n/**\r\n * TabManagerComponent — add / rename / reorder / remove tabs & sub-tabs with systemDefault protection.\r\n */\r\n@Component({\r\n selector: 'ngx-tab-manager',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSlideToggleModule,\r\n MatTooltipModule,\r\n ],\r\n template: `\r\n <div class=\"deb-tabs\">\r\n <div class=\"deb-tabs__head\">\r\n <span class=\"deb-section-title\">Tabs Manager</span>\r\n <button mat-stroked-button type=\"button\" (click)=\"store.addTab()\">\r\n <mat-icon>add</mat-icon> Add Tab\r\n </button>\r\n </div>\r\n\r\n @if (store.tabs().length === 0) {\r\n <p class=\"deb-hint\">No tabs — all fields render in a single section.</p>\r\n }\r\n\r\n @for (tab of store.tabs(); track tab.id; let i = $index, count = $count) {\r\n <div class=\"deb-tab-card\" [class.deb-tab-card--system]=\"tab.systemDefault\">\r\n <div class=\"deb-tabs__row\" [attr.data-testid]=\"'tab-row-' + tab.id\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\r\n <mat-label>{{ tab.id }} {{ tab.systemDefault ? '(System)' : '' }}</mat-label>\r\n <input\r\n matInput\r\n [disabled]=\"!canEditTab(tab)\"\r\n [ngModel]=\"tabLabel(tab)\"\r\n (ngModelChange)=\"store.setTabLabel(tab.id, lang(), $event)\"\r\n />\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [disabled]=\"i === 0 || !canEditTab(tab)\"\r\n (click)=\"store.moveTab(tab.id, -1)\"\r\n matTooltip=\"Move up\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [disabled]=\"i === count - 1 || !canEditTab(tab)\"\r\n (click)=\"store.moveTab(tab.id, 1)\"\r\n matTooltip=\"Move down\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n [disabled]=\"!canEditTab(tab)\"\r\n (click)=\"store.removeTab(tab.id)\"\r\n matTooltip=\"Remove tab\"\r\n >\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Tab settings row -->\r\n <div class=\"deb-tab-settings\">\r\n <mat-checkbox\r\n [disabled]=\"!canEditTab(tab)\"\r\n [ngModel]=\"tab.flatData\"\r\n (ngModelChange)=\"store.updateTab(tab.id, { flatData: $event })\"\r\n >\r\n Flat Data\r\n </mat-checkbox>\r\n <mat-checkbox\r\n [disabled]=\"!canEditTab(tab)\"\r\n [ngModel]=\"tab.isPrimaryTab\"\r\n (ngModelChange)=\"$event ? store.setPrimaryTab(tab.id) : store.updateTab(tab.id, { isPrimaryTab: false })\"\r\n >\r\n Primary Tab\r\n </mat-checkbox>\r\n <mat-checkbox\r\n [disabled]=\"!canEditTab(tab)\"\r\n [ngModel]=\"tab.maskData\"\r\n (ngModelChange)=\"store.updateTab(tab.id, { maskData: $event })\"\r\n >\r\n Mask Tab Data\r\n </mat-checkbox>\r\n <mat-checkbox\r\n [disabled]=\"!canEditTab(tab)\"\r\n [ngModel]=\"tab.systemDefault\"\r\n (ngModelChange)=\"store.updateTab(tab.id, { systemDefault: $event })\"\r\n >\r\n System Default\r\n </mat-checkbox>\r\n <button\r\n mat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n [disabled]=\"!canEditTab(tab)\"\r\n (click)=\"store.addSubTab(tab.id)\"\r\n >\r\n + Sub-tab\r\n </button>\r\n </div>\r\n\r\n <!-- Module tab configuration -->\r\n <div class=\"deb-tab-module\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\r\n <mat-label>Consumer Module Name (Optional)</mat-label>\r\n <input\r\n matInput\r\n placeholder=\"e.g. documents-view\"\r\n [disabled]=\"!canEditTab(tab)\"\r\n [ngModel]=\"tab.moduleName\"\r\n (ngModelChange)=\"store.updateTab(tab.id, { moduleName: $event || undefined })\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- Sub-tabs recursive render (Level 2) -->\r\n @if (tab.children && tab.children.length > 0) {\r\n <div class=\"deb-subtabs\">\r\n <span class=\"deb-subtabs__title\">Sub-tabs:</span>\r\n @for (sub of tab.children; track sub.id) {\r\n <div class=\"deb-tabs__row deb-subtab-row\" [attr.data-testid]=\"'subtab-row-' + sub.id\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\r\n <mat-label>{{ sub.id }}</mat-label>\r\n <input\r\n matInput\r\n [disabled]=\"!canEditTab(sub)\"\r\n [ngModel]=\"tabLabel(sub)\"\r\n (ngModelChange)=\"store.setTabLabel(sub.id, lang(), $event)\"\r\n />\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n [disabled]=\"!canEditTab(sub)\"\r\n (click)=\"store.removeTab(sub.id)\"\r\n matTooltip=\"Remove sub-tab\"\r\n >\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .deb-tabs__head {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 12px;\r\n }\r\n .deb-tab-card {\r\n border: 1px solid var(--deb-border, #e5e7eb);\r\n border-radius: 8px;\r\n padding: 10px;\r\n margin-bottom: 10px;\r\n background: var(--deb-bg-surface, #ffffff);\r\n }\r\n .deb-tab-card--system {\r\n border-left: 4px solid var(--deb-accent, #6366f1);\r\n }\r\n .deb-tabs__row {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n }\r\n .deb-tab-settings {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px 16px;\r\n align-items: center;\r\n margin-top: 8px;\r\n font-size: 13px;\r\n }\r\n .deb-tab-module {\r\n margin-top: 8px;\r\n }\r\n .deb-subtabs {\r\n margin-top: 8px;\r\n padding-left: 16px;\r\n border-left: 2px dashed var(--deb-border, #e5e7eb);\r\n }\r\n .deb-subtabs__title {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--deb-muted, #6b7280);\r\n }\r\n .deb-subtab-row {\r\n margin-top: 6px;\r\n }\r\n .deb-grow {\r\n flex: 1;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TabManagerComponent {\r\n protected readonly store = inject(BuilderStore);\r\n private readonly canEditSystemDefaultsFn = inject<(roles: string[]) => boolean>(SYSTEM_DEFAULT_CAN_EDIT, { optional: true });\r\n\r\n protected lang(): string {\r\n return this.store.activeLanguage();\r\n }\r\n\r\n protected tabLabel(tab: { label?: any }): string {\r\n return resolveLabel(tab.label, this.lang());\r\n }\r\n\r\n protected canEditTab(tab: NestedTabConfig): boolean {\r\n if (!tab.systemDefault) return true;\r\n if (this.canEditSystemDefaultsFn) {\r\n return this.canEditSystemDefaultsFn([]);\r\n }\r\n return true;\r\n }\r\n}\r\n","import { Component, Input, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DragDropModule, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { resolveLabel, type NestedFieldConfig } from '@dynamic-entity/core';\nimport { BuilderStore } from '../builder-store.service';\nimport { getFieldTypeMeta } from '../field-catalog';\n\n@Component({\n selector: 'ngx-entity-builder-tree-node',\n standalone: true,\n imports: [\n CommonModule,\n DragDropModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n ],\n template: `\n <div\n cdkDrag\n class=\"deb-field-row\"\n data-testid=\"builder-field-row\"\n [class.deb-field-row--active]=\"store.selectedFieldId() === field.id\"\n (click)=\"store.selectField(field.id)\"\n >\n <mat-icon class=\"deb-drag-handle\" cdkDragHandle title=\"Drag to reorder\">drag_indicator</mat-icon>\n <mat-icon class=\"deb-field-type\" [matTooltip]=\"fieldTypeLabel(field.type)\">{{ fieldTypeIcon(field.type) }}</mat-icon>\n <div class=\"deb-field-meta\">\n <div class=\"deb-row\" style=\"gap:6px\">\n <span class=\"deb-field-label\" [attr.data-testid]=\"'row-label-' + field.id\">{{ fieldLabel(field) }}</span>\n <span class=\"deb-type-badge\">{{ field.type }}</span>\n @if (field.isReferenced) {\n <mat-icon style=\"font-size: 16px; width: 16px; height: 16px; color: #1976d2;\" matTooltip=\"Referenced field (linked to {{ field.referencedEntityKey }})\">link</mat-icon>\n }\n @if (field.hasDrift) {\n <mat-icon style=\"font-size: 16px; width: 16px; height: 16px; color: #d32f2f;\" data-testid=\"drift-warning-icon\" matTooltip=\"Drift detected: source field has evolved\">sync_problem</mat-icon>\n }\n </div>\n <span class=\"deb-field-id\" [attr.data-testid]=\"'row-id-' + field.id\">{{ field.id }}</span>\n </div>\n @if (field.validators?.required) { <span class=\"deb-req\" title=\"Required\">*</span> }\n\n <button mat-icon-button type=\"button\" [disabled]=\"index === 0\"\n [attr.data-testid]=\"'row-up-' + field.id\"\n (click)=\"store.moveField(field.id, -1); $event.stopPropagation()\" matTooltip=\"Move up\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"index === totalCount - 1\"\n [attr.data-testid]=\"'row-down-' + field.id\"\n (click)=\"store.moveField(field.id, 1); $event.stopPropagation()\" matTooltip=\"Move down\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button mat-icon-button type=\"button\"\n [attr.data-testid]=\"'row-duplicate-' + field.id\"\n (click)=\"store.duplicateField(field.id); $event.stopPropagation()\" matTooltip=\"Duplicate\">\n <mat-icon>content_copy</mat-icon>\n </button>\n <button mat-icon-button type=\"button\" color=\"warn\"\n [attr.data-testid]=\"'row-delete-' + field.id\"\n (click)=\"store.removeField(field.id); $event.stopPropagation()\" matTooltip=\"Delete\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n @if (field.children && field.children.length > 0) {\n <div class=\"deb-tree-children\" style=\"padding-left: 20px; border-left: 2px solid rgba(0,0,0,0.08); margin-left: 12px; margin-top: 4px;\">\n @for (child of field.children; track child.id; let ci = $index, cCount = $count) {\n <ngx-entity-builder-tree-node\n [field]=\"child\"\n [index]=\"ci\"\n [totalCount]=\"cCount\"\n />\n }\n </div>\n }\n `,\n})\nexport class EntityBuilderTreeNodeComponent {\n protected readonly store = inject(BuilderStore);\n\n @Input({ required: true }) field!: NestedFieldConfig;\n @Input({ required: true }) index!: number;\n @Input({ required: true }) totalCount!: number;\n\n protected fieldTypeLabel(type: string): string {\n return getFieldTypeMeta(type)?.label ?? type;\n }\n\n protected fieldTypeIcon(type: string): string {\n return getFieldTypeMeta(type)?.icon ?? 'help_outline';\n }\n\n protected fieldLabel(field: { id: string; label?: any }): string {\n const lang = this.store.activeLanguage();\n return resolveLabel(field.label, lang) || field.id;\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { BuilderStore } from '../builder-store.service';\nimport { EntityBuilderTreeNodeComponent } from './entity-builder-tree-node.component';\n\n@Component({\n selector: 'ngx-entity-builder-canvas',\n standalone: true,\n imports: [\n CommonModule,\n DragDropModule,\n MatCardModule,\n MatIconModule,\n EntityBuilderTreeNodeComponent,\n ],\n template: `\n <mat-card class=\"deb-canvas\">\n <mat-card-header>\n <mat-card-title>Fields ({{ store.fields().length }})</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n @if (store.fields().length === 0) {\n <div class=\"deb-empty\">\n <mat-icon>widgets</mat-icon>\n <p>No fields yet. Pick a type from <strong>Add field</strong> to get started.</p>\n </div>\n }\n\n <div cdkDropList class=\"deb-field-list\" data-testid=\"builder-field-list\" (cdkDropListDropped)=\"onDrop($event)\">\n @for (f of store.fields(); track f.id; let i = $index, count = $count) {\n <ngx-entity-builder-tree-node\n [field]=\"f\"\n [index]=\"i\"\n [totalCount]=\"count\"\n />\n }\n </div>\n </mat-card-content>\n </mat-card>\n `,\n})\nexport class EntityBuilderCanvasComponent {\n protected readonly store = inject(BuilderStore);\n\n protected onDrop(event: CdkDragDrop<unknown>): void {\n this.store.reorderField(event.previousIndex, event.currentIndex);\n }\n}\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n effect,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n COMMON_MODULES,\r\n type CommonModuleEntry,\r\n type EntityFormConfig,\r\n type EntityPermissions,\r\n resolveLabel,\r\n} from '@dynamic-entity/core';\r\nimport { BuilderStore } from './builder-store.service';\r\nimport { FieldInspectorComponent } from './components/field-inspector.component';\r\nimport { FieldPaletteComponent } from './components/field-palette.component';\r\nimport { TabManagerComponent } from './components/tab-manager.component';\r\nimport { EntityBuilderCanvasComponent } from './components/entity-builder-canvas.component';\r\nimport { getFieldTypeMeta } from './field-catalog';\r\n\r\n/** RBAC actions surfaced in the settings panel. */\r\nconst RBAC_ACTIONS: (keyof EntityPermissions)[] = ['view', 'edit', 'delete'];\r\n\r\n/** Shared stable empty array — never allocate a fresh [] per change-detection (mat-select loops). */\r\nconst EMPTY_ROLES: readonly string[] = Object.freeze([]);\r\n\r\n/**\r\n * EntityBuilderComponent — the top-level visual builder for an EntityFormConfig.\r\n */\r\n@Component({\r\n selector: 'ngx-entity-builder',\r\n standalone: true,\r\n providers: [BuilderStore],\r\n imports: [\r\n FormsModule,\r\n DragDropModule,\r\n MatButtonModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSlideToggleModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n FieldPaletteComponent,\r\n TabManagerComponent,\r\n FieldInspectorComponent,\r\n EntityBuilderCanvasComponent,\r\n ],\r\n templateUrl: './entity-builder.component.html',\r\n styleUrl: './entity-builder.component.css',\r\n})\r\nexport class EntityBuilderComponent implements OnChanges {\r\n protected readonly store = inject(BuilderStore);\r\n\r\n /** Existing config to edit. When omitted, the builder starts blank. */\r\n @Input() config?: EntityFormConfig;\r\n /** Languages available for label/placeholder editing. First entry is the default. */\r\n @Input() languages: string[] = ['en'];\r\n /** Optional role list — enables multi-select role pickers for RBAC instead of free text. */\r\n @Input() availableRoles: string[] = [];\r\n /** Optional common-module definitions for module tabs; defaults to the built-in list from core. */\r\n @Input() commonModules: readonly CommonModuleEntry[] = COMMON_MODULES;\r\n\r\n /** Emitted on every change to the working config. */\r\n @Output() configChange = new EventEmitter<EntityFormConfig>();\r\n /** Emitted when the user clicks Save. Carries a clean, deep-cloned config. */\r\n @Output() save = new EventEmitter<EntityFormConfig>();\r\n\r\n protected readonly rbacActions = RBAC_ACTIONS;\r\n\r\n constructor() {\r\n effect(() => this.configChange.emit(this.store.config()), { allowSignalWrites: true });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config'] && changes['config'].currentValue !== changes['config'].previousValue) {\r\n if (this.config) this.store.load(this.config);\r\n else if (changes['config'].isFirstChange()) this.store.reset();\r\n }\r\n if (changes['languages'] && this.languages.length) {\r\n const active = this.store.activeLanguage();\r\n if (!this.languages.includes(active)) this.store.setActiveLanguage(this.languages[0]);\r\n }\r\n }\r\n\r\n // ─── Field canvas ─────────────────────────────────────────────────────────\r\n\r\n protected onDrop(event: CdkDragDrop<unknown>): void {\r\n this.store.reorderField(event.previousIndex, event.currentIndex);\r\n }\r\n\r\n protected fieldTypeLabel(type: string): string {\r\n return getFieldTypeMeta(type)?.label ?? type;\r\n }\r\n\r\n protected fieldTypeIcon(type: string): string {\r\n return getFieldTypeMeta(type)?.icon ?? 'help_outline';\r\n }\r\n\r\n protected fieldLabel(field: { id: string; label?: any }): string {\r\n const lang = this.store.activeLanguage();\r\n return resolveLabel(field.label, lang) || field.id;\r\n }\r\n\r\n // ─── Toolbar actions ──────────────────────────────────────────────────────\r\n\r\n protected doSave(): void {\r\n this.save.emit(this.store.exportConfig());\r\n }\r\n\r\n protected get json(): string {\r\n return JSON.stringify(this.store.exportConfig(), null, 2);\r\n }\r\n\r\n protected copyJson(): void {\r\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\r\n void navigator.clipboard.writeText(this.json);\r\n }\r\n }\r\n\r\n // ─── RBAC settings ────────────────────────────────────────────────────────\r\n\r\n protected rolesFor(action: keyof EntityPermissions): readonly string[] {\r\n // Return the stored array (stable ref between mutations) or a shared empty — NOT a fresh [],\r\n // which would make the bound mat-select re-evaluate every CD and loop forever.\r\n return this.store.config().permissions?.[action] ?? EMPTY_ROLES;\r\n }\r\n\r\n protected setRoles(action: keyof EntityPermissions, roles: string[]): void {\r\n this.store.setPermission(action, roles);\r\n }\r\n\r\n /** Parse a comma-separated role string into a trimmed, de-duplicated array. */\r\n protected setRolesFromText(action: keyof EntityPermissions, text: string): void {\r\n const roles = Array.from(\r\n new Set(\r\n text\r\n .split(',')\r\n .map(r => r.trim())\r\n .filter(Boolean),\r\n ),\r\n );\r\n this.store.setPermission(action, roles);\r\n }\r\n}\r\n","<mat-toolbar class=\"deb-toolbar\" color=\"primary\">\r\n <mat-icon>dashboard_customize</mat-icon>\r\n <span class=\"deb-toolbar__title\">Entity Builder</span>\r\n <span class=\"deb-spacer\"></span>\r\n\r\n @if (store.problems().length) {\r\n <button\r\n mat-button\r\n type=\"button\"\r\n class=\"deb-problems\"\r\n [class.deb-problems--error]=\"!store.isValid()\"\r\n [matTooltip]=\"store.problems().length + ' issue(s) — hover items in the list'\"\r\n >\r\n <mat-icon>{{ store.isValid() ? 'warning' : 'error' }}</mat-icon>\r\n {{ store.errors().length }} / {{ store.problems().length }}\r\n </button>\r\n }\r\n\r\n <button mat-button type=\"button\" (click)=\"copyJson()\">\r\n <mat-icon>content_copy</mat-icon> Copy JSON\r\n </button>\r\n <button mat-flat-button color=\"accent\" type=\"button\" [disabled]=\"!store.isValid()\" (click)=\"doSave()\">\r\n <mat-icon>save</mat-icon> Save\r\n </button>\r\n</mat-toolbar>\r\n\r\n<div class=\"deb-body\">\r\n <!-- ─── Left: settings, palette, tabs ─── -->\r\n <div class=\"deb-col deb-col--left\">\r\n <mat-card>\r\n <mat-card-content>\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>Entity name</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"store.config().entity\"\r\n (ngModelChange)=\"store.setEntityName($event)\"\r\n placeholder=\"e.g. clients\"\r\n />\r\n </mat-form-field>\r\n\r\n <div class=\"deb-row\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\r\n <mat-label>Editing language</mat-label>\r\n <mat-select\r\n [ngModel]=\"store.activeLanguage()\"\r\n (ngModelChange)=\"store.setActiveLanguage($event)\"\r\n >\r\n @for (l of languages; track l) {\r\n <mat-option [value]=\"l\">{{ l }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <mat-slide-toggle\r\n [ngModel]=\"store.config().maskData ?? false\"\r\n (ngModelChange)=\"store.setMaskData($event)\"\r\n >Mask this entity (RBAC)</mat-slide-toggle>\r\n\r\n <mat-expansion-panel class=\"deb-rbac\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Permissions</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n @for (action of rbacActions; track action) {\r\n @if (availableRoles.length) {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>{{ action }} roles</mat-label>\r\n <mat-select multiple [ngModel]=\"rolesFor(action)\" (ngModelChange)=\"setRoles(action, $event)\">\r\n @for (role of availableRoles; track role) {\r\n <mat-option [value]=\"role\">{{ role }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\r\n <mat-label>{{ action }} roles (comma-separated)</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"rolesFor(action).join(', ')\"\r\n (ngModelChange)=\"setRolesFromText(action, $event)\"\r\n />\r\n </mat-form-field>\r\n }\r\n }\r\n <p class=\"deb-hint\">Empty = no restriction for that action.</p>\r\n </mat-expansion-panel>\r\n </mat-card-content>\r\n </mat-card>\r\n\r\n <mat-card>\r\n <mat-card-header><mat-card-title>Add field</mat-card-title></mat-card-header>\r\n <mat-card-content>\r\n <ngx-field-palette (pick)=\"store.addField($event)\"></ngx-field-palette>\r\n </mat-card-content>\r\n </mat-card>\r\n\r\n <mat-card>\r\n <mat-card-content>\r\n <ngx-tab-manager></ngx-tab-manager>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <!-- ─── Center: field canvas ─── -->\r\n <div class=\"deb-col deb-col--center\">\r\n <ngx-entity-builder-canvas />\r\n </div>\r\n\r\n <!-- ─── Right: inspector ─── -->\r\n <div class=\"deb-col deb-col--right\">\r\n <mat-card>\r\n <mat-card-header><mat-card-title>Field properties</mat-card-title></mat-card-header>\r\n <mat-card-content>\r\n <ngx-field-inspector></ngx-field-inspector>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n</div>\r\n\r\n<!-- ─── Footer: JSON + optional live preview ─── -->\r\n<div class=\"deb-footer\">\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title><mat-icon>data_object</mat-icon> Config JSON</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <pre class=\"deb-json\">{{ json }}</pre>\r\n </mat-expansion-panel>\r\n\r\n <div class=\"deb-preview-slot\">\r\n <ng-content select=\"[ngxBuilderPreview]\"></ng-content>\r\n </div>\r\n</div>\r\n","import { Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { BuilderStore } from '../builder-store.service';\n\n/**\n * ConnectionSourceConfigComponent — allows configuring connection source settings\n * for an entity or field (Phase 7.2).\n */\n@Component({\n selector: 'ngx-connection-source-config',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n ],\n template: `\n @if (field(); as f) {\n <div class=\"deb-connection-source\">\n <span class=\"deb-section-title\">Connection Source</span>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Source Entity</mat-label>\n <input\n matInput\n data-testid=\"connection-source-entity\"\n [ngModel]=\"connectionSourceEntity(f)\"\n (ngModelChange)=\"setConnectionSourceEntity(f, $event)\"\n placeholder=\"e.g. organizations\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Target Field ID</mat-label>\n <input\n matInput\n data-testid=\"connection-target-field\"\n [ngModel]=\"connectionTargetField(f)\"\n (ngModelChange)=\"setConnectionTargetField(f, $event)\"\n placeholder=\"e.g. companyId\"\n />\n </mat-form-field>\n </div>\n }\n `,\n})\nexport class ConnectionSourceConfigComponent {\n protected readonly store = inject(BuilderStore);\n protected readonly field = computed(() => this.store.selectedField());\n\n protected connectionSourceEntity(field: any): string {\n return field.connectionSource?.entity ?? '';\n }\n\n protected setConnectionSourceEntity(field: any, entity: string): void {\n const trimmed = entity.trim();\n const existing = field.connectionSource ?? {};\n if (!trimmed && !existing.targetField) {\n this.store.updateField(field.id, { connectionSource: undefined } as any);\n } else {\n this.store.updateField(field.id, {\n connectionSource: { ...existing, entity: trimmed },\n } as any);\n }\n }\n\n protected connectionTargetField(field: any): string {\n return field.connectionSource?.targetField ?? '';\n }\n\n protected setConnectionTargetField(field: any, targetField: string): void {\n const trimmed = targetField.trim();\n const existing = field.connectionSource ?? {};\n if (!trimmed && !existing.entity) {\n this.store.updateField(field.id, { connectionSource: undefined } as any);\n } else {\n this.store.updateField(field.id, {\n connectionSource: { ...existing, targetField: trimmed },\n } as any);\n }\n }\n}\n","// Main component\r\nexport * from './lib/entity-builder.component';\r\n\r\n// Sub-components (individually importable — reusability rule, mirrors ngx-dynamic-entity)\r\nexport * from './lib/components/field-palette.component';\r\nexport * from './lib/components/field-inspector.component';\r\nexport * from './lib/components/tab-manager.component';\r\nexport * from './lib/components/rule-form.component';\r\nexport * from './lib/components/field-rules-list.component';\r\nexport * from './lib/components/entity-reference-config.component';\r\nexport * from './lib/components/connection-source-config.component';\r\nexport * from './lib/components/entity-builder-canvas.component';\r\nexport * from './lib/components/entity-builder-tree-node.component';\r\n\r\n// Store (provided per builder instance)\r\nexport * from './lib/builder-store.service';\r\n\r\n// Catalog + helpers\r\nexport * from './lib/field-catalog';\r\n\r\n// Re-export the core types a consumer of the builder needs\r\nexport type {\r\n EntityFormConfig,\r\n NestedTabConfig,\r\n NestedFieldConfig,\r\n RichFieldType,\r\n DropdownOption,\r\n EntityPermissions,\r\n EntityReferenceConfig,\r\n AutoPatchConfig,\r\n AutoPatchMapping,\r\n PatchOnTrueMapping,\r\n FormRule,\r\n RuleCondition,\r\n RuleAction,\r\n RuleOperator,\r\n} from '@dynamic-entity/core';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i5","i6","i7","i8","i9","i3","i4","i2","i11","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-dynamic-entity-builder.mjs","sources":["../../src/lib/field-catalog.ts","../../src/lib/clone.ts","../../src/lib/builder-store.service.ts","../../src/lib/components/entity-reference-config.component.ts","../../src/lib/components/rule-form.component.ts","../../src/lib/components/field-rules-list.component.ts","../../src/lib/components/referenced-field-config.component.ts","../../src/lib/components/field-inspector.component.ts","../../src/lib/components/field-inspector.component.html","../../src/lib/components/field-palette.component.ts","../../src/lib/components/tab-manager.component.ts","../../src/lib/components/entity-builder-tree-node.component.ts","../../src/lib/components/entity-builder-canvas.component.ts","../../src/lib/entity-builder.component.ts","../../src/lib/entity-builder.component.html","../../src/public-api.ts","../../src/ngx-dynamic-entity-builder.ts"],"sourcesContent":["/**\n * field-catalog.ts — re-exports shared field catalog from @dynamic-entity/core.\n * Single source of truth shared by both visual builder and renderer.\n */\nexport {\n FIELD_TYPE_CATALOG,\n getFieldTypeMeta,\n humanizeId,\n createFieldConfig,\n type FieldTypeMeta,\n type FlagValidator,\n type ParamValidator,\n} from '@dynamic-entity/core';\n","/**\n * Deep clone with a JSON fallback.\n *\n * `structuredClone` is not universally available (older browsers, and jsdom before v22),\n * so it must never be called unguarded — an unguarded call throws a ReferenceError and the\n * caller silently does nothing. Config and rule objects are JSON-safe, so the fallback is\n * lossless here.\n */\nexport function deepClone<T>(value: T): T {\n if (typeof structuredClone === 'function') return structuredClone(value);\n return JSON.parse(JSON.stringify(value)) as T;\n}\n","import { Injectable, computed, signal } from '@angular/core';\nimport type {\n AutoPatchMapping,\n DropdownOption,\n EntityFormConfig,\n EntityPermissions,\n EntityReferenceConfig,\n FormRule,\n NestedFieldConfig,\n NestedTabConfig,\n PatchOnTrueMapping,\n RichFieldType,\n} from '@dynamic-entity/core';\nimport { findTab, labelToId, normalizeConfigOptions, computeFieldDrift, createFieldSnapshot } from '@dynamic-entity/core';\nimport {\n createFieldConfig,\n getFieldTypeMeta,\n humanizeId,\n type FlagValidator,\n type ParamValidator,\n} from './field-catalog';\nimport { deepClone } from './clone';\n\nexport interface BuilderProblem {\n level: 'error' | 'warning';\n message: string;\n fieldId?: string;\n}\n\nconst clone = deepClone;\n\nconst ID_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * The regex the builder used to write into `pattern` to mean \"email\".\n *\n * Retained only to recognise configs authored before `FieldValidators.email` existed, so\n * they still show Email as ticked and do not leave a stray pattern behind when it is\n * un-ticked. Nothing writes it any more.\n */\nconst LEGACY_EMAIL_PATTERN = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$';\n\n@Injectable()\nexport class BuilderStore {\n private readonly _config = signal<EntityFormConfig>(this.emptyConfig());\n private readonly _selectedFieldId = signal<string | null>(null);\n private readonly _activeLanguage = signal<string>('en');\n /** Rules live beside the config: they are persisted per form, not inside `EntityFormConfig`. */\n private readonly _rules = signal<FormRule[]>([]);\n /**\n * Field ids the author owns — set by an explicit rename, or by loading a saved config\n * whose ids are already live data keys. Ids outside this set are still derived from the\n * field's label. Builder-session state, deliberately not part of the exported config.\n */\n private readonly manualIds = new Set<string>();\n\n private readonly _isDirty = signal<boolean>(false);\n\n /**\n * Roles of the person using the builder — distinct from `availableRoles`, which is the\n * vocabulary a schema may reference. Needed so the SYSTEM_DEFAULT_CAN_EDIT predicate can\n * be asked a real question; it was previously called with a hardcoded empty array, which\n * made any role-checking predicate answer false for everyone.\n */\n private readonly _userRoles = signal<string[]>([]);\n\n readonly config = this._config.asReadonly();\n readonly selectedFieldId = this._selectedFieldId.asReadonly();\n readonly activeLanguage = this._activeLanguage.asReadonly();\n readonly rules = this._rules.asReadonly();\n readonly isDirty = this._isDirty.asReadonly();\n readonly userRoles = this._userRoles.asReadonly();\n\n readonly tabs = computed<NestedTabConfig[]>(() => this._config().tabs ?? []);\n\n readonly fields = computed<NestedFieldConfig[]>(() => {\n return (this._config().tabs ?? []).flatMap(t => t.fields ?? []);\n });\n\n readonly selectedField = computed<NestedFieldConfig | null>(() => {\n const id = this._selectedFieldId();\n if (!id) return null;\n return this.findFieldInTabs(this._config().tabs, id);\n });\n\n readonly problems = computed<BuilderProblem[]>(() => this.validate(this._config()));\n readonly errors = computed<BuilderProblem[]>(() =>\n this.problems().filter(p => p.level === 'error'),\n );\n readonly isValid = computed<boolean>(() => this.errors().length === 0);\n\n // ─── Initialisation ─────────────────────────────────────────────────────────\n\n load(config: EntityFormConfig): void {\n // Check if any fields carry both inline options and listName before normalizing options\n const fieldsWithBoth = this.getAllFields(config.tabs ?? []).filter(\n f => Array.isArray(f.options) && f.options.length > 0 && typeof f.listName === 'string' && f.listName.trim() !== '',\n );\n for (const f of fieldsWithBoth) {\n console.warn(\n `[BuilderStore] Field \"${f.id}\" carries both inline options and listName \"${f.listName}\". ` +\n `Inline options win; listName was dropped.`,\n );\n }\n\n // The other boundary where a config enters the library (the renderer's ngOnChanges is\n // the first). Authoring must start from the canonical option shape, or the builder\n // would round-trip a legacy config straight back out unchanged.\n const next = clone(normalizeConfigOptions(config));\n next.tabs = next.tabs ?? [];\n if (next.tabs.length === 0) {\n next.tabs = [{ id: 'default', label: { en: 'Default' }, fields: [] }];\n }\n this._config.set(next);\n const firstField = this.getAllFields(next.tabs)[0];\n this._selectedFieldId.set(firstField?.id ?? null);\n this._activeLanguage.set(next.defaultLanguage ?? 'en');\n\n // Ids in a saved config are live data keys — records are already stored under them.\n // Editing a label must never rewrite one, so freeze every id the config arrived with.\n this.manualIds.clear();\n for (const field of this.getAllFields(next.tabs)) this.manualIds.add(field.id);\n this._isDirty.set(false);\n }\n\n reset(entity = ''): void {\n this._config.set(this.emptyConfig(entity));\n this._selectedFieldId.set(null);\n this._rules.set([]);\n this.manualIds.clear();\n this._isDirty.set(false);\n }\n\n resetDirty(): void {\n this._isDirty.set(false);\n }\n\n private emptyConfig(entity = ''): EntityFormConfig {\n return {\n entity,\n version: 1,\n defaultLanguage: 'en',\n tabs: [],\n };\n }\n\n // ─── Entity-level settings ──────────────────────────────────────────────────\n\n setEntityName(entity: string): void {\n this.mutate(draft => {\n draft.entity = entity.trim();\n });\n }\n\n setDefaultLanguage(language: string): void {\n this.mutate(draft => {\n draft.defaultLanguage = language;\n });\n }\n\n setMaskData(mask: boolean): void {\n this.mutate(draft => {\n draft.maskData = mask;\n });\n }\n\n setPermission(action: keyof EntityPermissions, roles: string[]): void {\n this.mutate(draft => {\n const permissions: EntityPermissions = { ...(draft.permissions ?? {}) };\n permissions[action] = roles;\n draft.permissions = permissions;\n });\n }\n\n setActiveLanguage(language: string): void {\n this._activeLanguage.set(language);\n }\n\n /** Roles of the person using the builder, for SYSTEM_DEFAULT_CAN_EDIT. */\n setUserRoles(roles: string[]): void {\n this._userRoles.set(roles ?? []);\n }\n\n // ─── Helper Traversal ───────────────────────────────────────────────────────\n\n private getAllFields(tabs: NestedTabConfig[] = []): NestedFieldConfig[] {\n const list: NestedFieldConfig[] = [];\n for (const t of tabs) {\n if (t.fields) list.push(...t.fields);\n if (t.children) list.push(...this.getAllFields(t.children));\n }\n return list;\n }\n\n /**\n * Every tab in the tree, flattened.\n *\n * The structural operations below used to iterate `draft.tabs` directly, which is only\n * the top level. A field on a sub-tab could be selected and edited but never removed,\n * duplicated, moved or reordered — the builder could author nested configs it was then\n * unable to restructure, which is the worst possible state for an authoring tool.\n */\n private flattenTabs(tabs: NestedTabConfig[] = []): NestedTabConfig[] {\n const list: NestedTabConfig[] = [];\n for (const t of tabs) {\n list.push(t);\n if (t.children) list.push(...this.flattenTabs(t.children));\n }\n return list;\n }\n\n /**\n * Every field id in the config, including `group`/`array` children.\n *\n * Id uniqueness is a whole-config invariant, not a per-tab one: rules, `showWhen`\n * conditions and `autoPatch` mappings all address fields by bare id, so two fields\n * sharing an id anywhere in the tree interfere with each other. Uniqueness checks must\n * therefore see deeper than `fields()`, which stops at a tab's own fields.\n */\n private allFieldIds(tabs: NestedTabConfig[] = []): Set<string> {\n const ids = new Set<string>();\n const walkFields = (fields: NestedFieldConfig[] | undefined) => {\n for (const f of fields ?? []) {\n ids.add(f.id);\n if (f.children?.length) walkFields(f.children);\n }\n };\n for (const tab of this.flattenTabs(tabs)) walkFields(tab.fields);\n return ids;\n }\n\n private findFieldInTabs(tabs: NestedTabConfig[] = [], id: string): NestedFieldConfig | null {\n for (const t of tabs) {\n if (t.fields) {\n const found = t.fields.find(f => f.id === id);\n if (found) return found;\n }\n if (t.children) {\n const found = this.findFieldInTabs(t.children, id);\n if (found) return found;\n }\n }\n return null;\n }\n\n // ─── Field CRUD ─────────────────────────────────────────────────────────────\n\n addField(type: RichFieldType, targetTabId?: string): string {\n const meta = getFieldTypeMeta(type);\n const prefix = meta?.idPrefix ?? 'field';\n const id = this.uniqueId(prefix, this.allFieldIds(this._config().tabs));\n\n this.mutate(draft => {\n const field = createFieldConfig(type, id, draft.defaultLanguage ?? 'en');\n const targetTab = targetTabId\n ? this.flattenTabs(draft.tabs).find(t => t.id === targetTabId)\n : draft.tabs[0];\n if (targetTab) {\n targetTab.fields = targetTab.fields ?? [];\n targetTab.fields.push(field);\n } else {\n draft.tabs.push({ id: 'main', label: { en: 'Main' }, fields: [field] });\n }\n });\n this._selectedFieldId.set(id);\n return id;\n }\n\n updateField(id: string, patch: Partial<NestedFieldConfig>): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, id);\n if (field) Object.assign(field, patch);\n });\n }\n\n /**\n * Rename a field explicitly, pinning the id so it is no longer derived from the label.\n *\n * Not reachable from the inspector — the id input is read-only by design. This exists for\n * programmatic callers that must match an id to an existing data key.\n */\n renameField(oldId: string, newId: string): void {\n const trimmed = newId.trim();\n if (!trimmed || trimmed === oldId) return;\n if (this.allFieldIds(this._config().tabs).has(trimmed)) return;\n if (!this.findFieldInTabs(this._config().tabs, oldId)) return;\n\n this.applyRename(oldId, trimmed);\n this.manualIds.delete(oldId);\n this.manualIds.add(trimmed);\n }\n\n /** Whether this field's id is pinned (loaded from storage or explicitly renamed). */\n hasManualId(id: string): boolean {\n return this.manualIds.has(id);\n }\n\n /**\n * Move a field to a new id and repoint every id-based reference in the config at it.\n *\n * Ids are the wiring between fields — rules, cascades, patches and `showWhen` all address\n * fields by id — so a rename that only touches `field.id` silently breaks that wiring.\n * That was survivable while renaming was a rare manual act; label-derived ids make it\n * routine, so the references move with it.\n */\n private applyRename(oldId: string, newId: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, oldId);\n if (!field) return;\n field.id = newId;\n\n const walkFields = (fields: NestedFieldConfig[] | undefined) => {\n for (const f of fields ?? []) {\n if (f.showWhen && oldId in f.showWhen) {\n const next: Record<string, unknown> = {};\n // Rebuild in place so condition order survives the rename.\n for (const [key, value] of Object.entries(f.showWhen)) {\n next[key === oldId ? newId : key] = value;\n }\n f.showWhen = next;\n }\n if (f.entityReference?.parentField === oldId) {\n f.entityReference = { ...f.entityReference, parentField: newId };\n }\n if (f.autoPatch) {\n // `source` names a field on the *linked* record, not this config — leave it.\n f.autoPatch = {\n ...f.autoPatch,\n mappings: f.autoPatch.mappings.map(m =>\n m.target === oldId ? { ...m, target: newId } : m,\n ),\n };\n }\n if (f.patchOnTrue) {\n f.patchOnTrue = f.patchOnTrue.map(m => ({\n from: m.from === oldId ? newId : m.from,\n to: m.to === oldId ? newId : m.to,\n }));\n }\n if (f.children?.length) walkFields(f.children);\n }\n };\n const walkTabs = (tabs: NestedTabConfig[] | undefined) => {\n for (const tab of tabs ?? []) {\n walkFields(tab.fields);\n walkTabs(tab.children);\n }\n };\n walkTabs(draft.tabs);\n });\n\n this._rules.update(rules =>\n rules.map(rule => ({\n ...rule,\n fieldId: rule.fieldId === oldId ? newId : rule.fieldId,\n targets: rule.targets.map(t =>\n t.type === 'field' && t.id === oldId ? { ...t, id: newId } : t,\n ),\n })),\n );\n\n if (this._selectedFieldId() === oldId) this._selectedFieldId.set(newId);\n }\n\n removeField(id: string): void {\n this.mutate(draft => {\n for (const tab of this.flattenTabs(draft.tabs)) {\n if (tab.fields) {\n tab.fields = tab.fields.filter(f => f.id !== id);\n }\n }\n });\n this.manualIds.delete(id);\n if (this._selectedFieldId() === id) this._selectedFieldId.set(null);\n }\n\n duplicateField(id: string): string | null {\n // Look the source up by id — not by current selection. The insert below searches by id\n // too, so falling back to the selected field could report a new id while inserting\n // nothing, or duplicate a field the caller never named.\n const source = this.findFieldInTabs(this._config().tabs, id);\n if (!source) return null;\n const meta = getFieldTypeMeta(source.type);\n const prefix = meta?.idPrefix ?? 'field';\n const newId = this.uniqueId(prefix, this.allFieldIds(this._config().tabs));\n\n this.mutate(draft => {\n for (const tab of this.flattenTabs(draft.tabs)) {\n const index = (tab.fields ?? []).findIndex(f => f.id === id);\n if (index !== -1) {\n const copy = clone(source);\n copy.id = newId;\n tab.fields!.splice(index + 1, 0, copy);\n break;\n }\n }\n });\n this._selectedFieldId.set(newId);\n return newId;\n }\n\n moveField(id: string, direction: -1 | 1): void {\n this.mutate(draft => {\n for (const tab of this.flattenTabs(draft.tabs)) {\n const fields = tab.fields ?? [];\n const from = fields.findIndex(f => f.id === id);\n if (from !== -1) {\n const to = from + direction;\n if (to < 0 || to >= fields.length) return;\n const [item] = fields.splice(from, 1);\n fields.splice(to, 0, item);\n return;\n }\n }\n });\n }\n\n /** Safe reorder for drag & drop within active tab or flat list */\n reorderField(fromIndex: number, toIndex: number, tabId?: string): void {\n this.mutate(draft => {\n const targetTab = tabId\n ? this.flattenTabs(draft.tabs).find(t => t.id === tabId)\n : draft.tabs[0];\n const fields = targetTab?.fields ?? [];\n if (\n fromIndex < 0 ||\n toIndex < 0 ||\n fromIndex >= fields.length ||\n toIndex >= fields.length\n ) {\n return;\n }\n const [item] = fields.splice(fromIndex, 1);\n fields.splice(toIndex, 0, item);\n });\n }\n\n selectField(id: string | null): void {\n this._selectedFieldId.set(id);\n }\n\n // ─── Localised text ─────────────────────────────────────────────────────────\n\n /**\n * Set a field's label, and derive the field's id from it: type \"Employee Count\", get\n * `employeeCount`. The inspector renders the id read-only, so this is the only way a\n * new field's id is set.\n *\n * Two things stop derivation: a config loaded from storage (its ids are live data keys\n * that records are already stored under — see `load`), and an explicit `renameField`\n * call, which remains available to programmatic callers.\n *\n * Only the config's default language drives the id; translating a label must not rename\n * anything.\n */\n setFieldLabel(id: string, language: string, value: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, id);\n if (field) field.label = { ...field.label, [language]: value };\n });\n\n if (language !== (this._config().defaultLanguage ?? 'en')) return;\n if (this.manualIds.has(id)) return;\n\n const derived = labelToId(value);\n if (!derived || derived === id) return;\n\n this.applyRename(id, this.availableId(derived, id));\n }\n\n /** `derived`, or `derived_2`, `derived_3`… if another field already holds it. */\n private availableId(derived: string, currentId: string): string {\n const taken = new Set([...this.allFieldIds(this._config().tabs)].filter(fid => fid !== currentId));\n if (!taken.has(derived)) return derived;\n\n let n = 2;\n while (taken.has(`${derived}_${n}`)) n += 1;\n return `${derived}_${n}`;\n }\n\n setFieldPlaceholder(id: string, language: string, value: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, id);\n if (!field) return;\n field.placeholder = { ...(field.placeholder ?? {}), [language]: value };\n });\n }\n\n // ─── Validators ─────────────────────────────────────────────────────────────\n\n toggleFlagValidator(id: string, validator: FlagValidator, on: boolean): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, id);\n if (!field) return;\n field.validators = field.validators ?? {};\n if (validator === 'required') {\n if (on) field.validators.required = true;\n else delete field.validators.required;\n } else if (validator === 'email') {\n // Writes its own flag, not `pattern`. Sharing `pattern` meant a field could not have\n // both an email check and a custom regex, setting a custom pattern made the Email box\n // appear ticked, and un-ticking Email deleted whatever pattern the author had written.\n if (on) field.validators.email = true;\n else delete field.validators.email;\n // Clear the legacy encoding either way, so a config touched here stops carrying both.\n if (field.validators.pattern === LEGACY_EMAIL_PATTERN) delete field.validators.pattern;\n }\n });\n }\n\n setParamValidator(id: string, validator: ParamValidator, value: number | null): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, id);\n if (!field) return;\n field.validators = field.validators ?? {};\n if (value === null || value === undefined || Number.isNaN(value)) {\n delete field.validators[validator];\n } else {\n field.validators[validator] = value;\n }\n });\n }\n\n getParamValidator(field: NestedFieldConfig, validator: ParamValidator): number | null {\n const val = field.validators?.[validator];\n return typeof val === 'number' ? val : null;\n }\n\n hasFlagValidator(field: NestedFieldConfig, validator: FlagValidator): boolean {\n if (validator === 'required') return !!field.validators?.required;\n if (validator === 'email') {\n // This used to report *any* pattern as email, so writing a custom regex silently\n // ticked the box. The legacy encoding is still recognised so a config authored by the\n // old builder keeps showing Email as ticked.\n return !!field.validators?.email || field.validators?.pattern === LEGACY_EMAIL_PATTERN;\n }\n return false;\n }\n\n // ─── Options (dropdown / multiSelect / radio) ────────────────────────────────\n\n /**\n * Where a choice field's options come from.\n *\n * `entity` is absent on purpose: in this model an entity reference is a field *type*\n * (`entity-ref`), not a data source a dropdown can switch to, so offering it here would mean\n * mutating the field's type — and rebuilding its control — from a source picker. The\n * exclusion that matters within a choice field is inline `options` vs `listName`.\n */\n fieldDataSource(field: NestedFieldConfig | undefined): 'none' | 'manual' | 'lookup' {\n if (!field) return 'none';\n // Presence, not emptiness: a source the author has picked but not filled in yet — no\n // options authored, no list name typed — must still read as that source, or the editor\n // for it disappears the moment they select it.\n if (Array.isArray(field.options)) return 'manual';\n if (typeof field.listName === 'string') return 'lookup';\n return 'none';\n }\n\n /**\n * Switch a choice field's data source, clearing the one it is leaving.\n *\n * The reference makes these mutually exclusive (doc §4.4) and it has to stay that way here:\n * `optionsFor` resolves inline options first, so a field left holding both would silently\n * ignore its list.\n */\n setFieldDataSource(fieldId: string, source: 'none' | 'manual' | 'lookup'): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n if (source === 'manual') {\n delete field.listName;\n field.options = field.options?.length ? field.options : [];\n } else if (source === 'lookup') {\n delete field.options;\n field.listName = field.listName ?? '';\n } else {\n delete field.options;\n delete field.listName;\n }\n });\n }\n\n /** Set the named list a choice field reads its options from. */\n setListName(fieldId: string, listName: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n const trimmed = listName.trim();\n if (trimmed) {\n field.listName = trimmed;\n // Belt and braces: inline options would win over the list at render time.\n delete field.options;\n } else {\n field.listName = '';\n }\n });\n }\n\n /** Link a field to a field defined in another entity configuration (Phase 8). */\n linkReferencedField(fieldId: string, sourceEntityKey: string, sourceField: NestedFieldConfig): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n field.isReferenced = true;\n field.referencedEntityKey = sourceEntityKey;\n field.referencedFieldId = sourceField.id;\n field.referencedSnapshot = createFieldSnapshot(sourceField);\n field.hasDrift = false;\n // Copy label, type, validators, options from source\n if (sourceField.label) field.label = clone(sourceField.label);\n if (sourceField.type) field.type = sourceField.type;\n if (sourceField.validators) field.validators = clone(sourceField.validators);\n if (sourceField.options) field.options = clone(sourceField.options);\n });\n }\n\n /** Unlink a referenced field back to an independent field. */\n unlinkReferencedField(fieldId: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n delete field.isReferenced;\n delete field.referencedEntityKey;\n delete field.referencedFieldId;\n delete field.referencedSnapshot;\n delete field.hasDrift;\n });\n }\n\n /** Sync a drifted referenced field with the updated source field definition. */\n syncReferencedField(fieldId: string, currentSourceField: NestedFieldConfig): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field || !field.isReferenced) return;\n field.referencedSnapshot = createFieldSnapshot(currentSourceField);\n field.hasDrift = false;\n if (currentSourceField.label) field.label = clone(currentSourceField.label);\n if (currentSourceField.type) field.type = currentSourceField.type;\n if (currentSourceField.validators) field.validators = clone(currentSourceField.validators);\n if (currentSourceField.options) field.options = clone(currentSourceField.options);\n });\n }\n\n /** Scan all referenced fields in the config and update their hasDrift state against current source configs. */\n checkDrift(sourceConfigs: Record<string, EntityFormConfig>): void {\n this.mutate(draft => {\n const scanFields = (fields: NestedFieldConfig[]) => {\n for (const f of fields) {\n if (f.isReferenced && f.referencedEntityKey && f.referencedFieldId) {\n const sourceConfig = sourceConfigs[f.referencedEntityKey];\n const sourceField = sourceConfig\n ? this.findFieldInTabs(sourceConfig.tabs ?? [], f.referencedFieldId)\n : undefined;\n f.hasDrift = computeFieldDrift(f, sourceField ?? undefined);\n }\n if (f.children?.length) scanFields(f.children);\n }\n };\n\n for (const tab of draft.tabs ?? []) {\n if (tab.fields?.length) scanFields(tab.fields);\n }\n });\n }\n\n addOption(fieldId: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n const options = field.options ?? [];\n const n = options.length + 1;\n const lang = draft.defaultLanguage ?? 'en';\n options.push({ [lang]: `Option ${n}` });\n field.options = options;\n // Authoring an inline option makes this a manual field — see `setFieldDataSource`.\n delete field.listName;\n });\n }\n\n /** Merge language keys into an option. `setOptionLabel` is the usual single-language path. */\n updateOption(fieldId: string, index: number, patch: DropdownOption): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n const option = field?.options?.[index];\n if (!option) return;\n field.options![index] = { ...option, ...patch };\n });\n }\n\n /**\n * Set an option's text for one language.\n *\n * An option is a language-keyed object and the displayed text **is** the stored value,\n * so this is the only way to edit one — there is no separate value to set.\n */\n setOptionLabel(fieldId: string, index: number, language: string, value: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n const option = field?.options?.[index];\n if (!option) return;\n field.options![index] = { ...option, [language]: value };\n });\n }\n\n removeOption(fieldId: string, index: number): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field?.options) return;\n field.options = field.options.filter((_, i) => i !== index);\n });\n }\n\n // ─── Entity reference / cascade ─────────────────────────────────────────────\n\n /** Merge a patch into a field's `entityReference` block, keeping it enabled. */\n updateEntityReference(fieldId: string, patch: Partial<EntityReferenceConfig>): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n const next: EntityReferenceConfig = {\n ...(field.entityReference ?? { enabled: true }),\n ...patch,\n enabled: true,\n };\n // Drop keys explicitly cleared to `undefined` so exported configs stay clean.\n for (const key of Object.keys(patch) as (keyof EntityReferenceConfig)[]) {\n if (patch[key] === undefined) delete next[key];\n }\n field.entityReference = next;\n });\n }\n\n // ─── autoPatch ──────────────────────────────────────────────────────────────\n\n addAutoPatchMapping(fieldId: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n const targetTab = field.autoPatch?.targetTab ?? draft.tabs[0]?.id ?? '';\n const mappings = [...(field.autoPatch?.mappings ?? []), { source: '', target: '' }];\n field.autoPatch = { targetTab, mappings };\n });\n }\n\n setAutoPatchTargetTab(fieldId: string, targetTab: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field?.autoPatch) return;\n field.autoPatch = { ...field.autoPatch, targetTab };\n });\n }\n\n updateAutoPatchMapping(fieldId: string, index: number, patch: Partial<AutoPatchMapping>): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field?.autoPatch?.mappings?.[index]) return;\n field.autoPatch = {\n ...field.autoPatch,\n mappings: field.autoPatch.mappings.map((m, i) => (i === index ? { ...m, ...patch } : m)),\n };\n });\n }\n\n /** Removing the last mapping drops `autoPatch` entirely — no empty config in the export. */\n removeAutoPatchMapping(fieldId: string, index: number): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field?.autoPatch) return;\n const mappings = field.autoPatch.mappings.filter((_, i) => i !== index);\n if (mappings.length === 0) delete field.autoPatch;\n else field.autoPatch = { ...field.autoPatch, mappings };\n });\n }\n\n // ─── patchOnTrue ────────────────────────────────────────────────────────────\n\n addPatchOnTrueMapping(fieldId: string): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n field.patchOnTrue = [...(field.patchOnTrue ?? []), { from: '', to: '' }];\n });\n }\n\n updatePatchOnTrueMapping(fieldId: string, index: number, patch: Partial<PatchOnTrueMapping>): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field?.patchOnTrue?.[index]) return;\n field.patchOnTrue = field.patchOnTrue.map((m, i) => (i === index ? { ...m, ...patch } : m));\n });\n }\n\n removePatchOnTrueMapping(fieldId: string, index: number): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field?.patchOnTrue) return;\n const mappings = field.patchOnTrue.filter((_, i) => i !== index);\n if (mappings.length === 0) delete field.patchOnTrue;\n else field.patchOnTrue = mappings;\n });\n }\n\n // ─── showWhen (static conditional visibility) ───────────────────────────────\n\n /** Replace a field's `showWhen` map; an empty map removes the condition. */\n setShowWhen(fieldId: string, showWhen: Record<string, unknown> | undefined): void {\n this.mutate(draft => {\n const field = this.findFieldInTabs(draft.tabs, fieldId);\n if (!field) return;\n if (!showWhen || Object.keys(showWhen).length === 0) delete field.showWhen;\n else field.showWhen = showWhen;\n });\n }\n\n // ─── Rules ──────────────────────────────────────────────────────────────────\n\n /** Rules for the field currently selected in the inspector. */\n readonly rulesForSelectedField = computed<FormRule[]>(() => {\n const id = this._selectedFieldId();\n if (!id) return [];\n return this._rules().filter(r => r.fieldId === id || r.targets.some(t => t.id === id));\n });\n\n loadRules(rules: FormRule[]): void {\n this._rules.set(clone(rules));\n }\n\n addRule(rule: FormRule): string {\n const id = rule.id?.trim() || this.uniqueId('rule', new Set(this._rules().map(r => r.id ?? '')));\n this._rules.update(rules => [...rules, { ...clone(rule), id }]);\n return id;\n }\n\n updateRule(id: string, patch: Partial<FormRule>): void {\n this._rules.update(rules => rules.map(r => (r.id === id ? { ...r, ...clone(patch), id } : r)));\n }\n\n removeRule(id: string): void {\n this._rules.update(rules => rules.filter(r => r.id !== id));\n }\n\n toggleRule(id: string, enabled: boolean): void {\n this.updateRule(id, { enabled });\n }\n\n /** Move a rule in priority order. Priorities are renumbered 1..n so they stay contiguous. */\n moveRule(id: string, direction: -1 | 1): void {\n this._rules.update(rules => {\n const next = [...rules];\n const from = next.findIndex(r => r.id === id);\n if (from === -1) return rules;\n const to = from + direction;\n if (to < 0 || to >= next.length) return rules;\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n return next.map((r, i) => ({ ...r, priority: i + 1 }));\n });\n }\n\n exportRules(): FormRule[] {\n return clone(this._rules());\n }\n\n // ─── Tabs ───────────────────────────────────────────────────────────────────\n\n addTab(): string {\n // Must be unique across the whole tree, not just the top level: a tab id is the record\n // storage path, so a new top-level tab colliding with an existing sub-tab would make two\n // tabs write to the same key and break findTab/getTabPath.\n const id = this.uniqueId('tab', new Set(this.allTabIds()));\n this.mutate(draft => {\n const tabs = draft.tabs ?? (draft.tabs = []);\n const lang = draft.defaultLanguage ?? 'en';\n tabs.push({ id, label: { [lang]: humanizeId(id) }, fields: [] });\n });\n return id;\n }\n\n /** Every tab id in the tree, at any depth. Tab ids must be globally unique — they are paths. */\n private allTabIds(): string[] {\n const ids: string[] = [];\n const collect = (tabs: NestedTabConfig[] | undefined) => {\n for (const t of tabs ?? []) {\n ids.push(t.id);\n collect(t.children);\n }\n };\n collect(this._config().tabs);\n return ids;\n }\n\n addSubTab(parentId: string): string {\n const id = this.uniqueId('tab', new Set(this.allTabIds()));\n this.mutate(draft => {\n const parent = findTab(draft.tabs, parentId);\n if (parent) {\n parent.children = parent.children ?? [];\n const lang = draft.defaultLanguage ?? 'en';\n parent.children.push({ id, label: { [lang]: humanizeId(id) }, fields: [] });\n }\n });\n return id;\n }\n\n setPrimaryTab(tabId: string): void {\n this.mutate(draft => {\n const markPrimary = (tabs: NestedTabConfig[]) => {\n for (const t of tabs) {\n t.isPrimaryTab = t.id === tabId;\n if (t.children) markPrimary(t.children);\n }\n };\n markPrimary(draft.tabs ?? []);\n });\n }\n\n updateTab(id: string, patch: Partial<NestedTabConfig>): void {\n this.mutate(draft => {\n const tab = findTab(draft.tabs, id);\n if (tab) Object.assign(tab, patch);\n });\n }\n\n setTabLabel(id: string, language: string, value: string): void {\n this.mutate(draft => {\n const tab = findTab(draft.tabs, id);\n if (tab) tab.label = { ...tab.label, [language]: value };\n });\n }\n\n removeTab(id: string): void {\n this.mutate(draft => {\n const removeRecursive = (tabs: NestedTabConfig[]): NestedTabConfig[] => {\n return tabs\n .filter(t => t.id !== id)\n .map(t => ({\n ...t,\n children: t.children ? removeRecursive(t.children) : undefined,\n }));\n };\n draft.tabs = removeRecursive(draft.tabs ?? []);\n });\n }\n\n moveTab(id: string, direction: -1 | 1): void {\n this.mutate(draft => {\n const tabs = draft.tabs ?? [];\n const from = tabs.findIndex(t => t.id === id);\n if (from === -1) return;\n const to = from + direction;\n if (to < 0 || to >= tabs.length) return;\n const [item] = tabs.splice(from, 1);\n tabs.splice(to, 0, item);\n });\n }\n\n // ─── Export ─────────────────────────────────────────────────────────────────\n\n exportConfig(): EntityFormConfig {\n return clone(this._config());\n }\n\n // ─── Internals ──────────────────────────────────────────────────────────────\n\n private mutate(fn: (draft: EntityFormConfig) => void): void {\n const draft = clone(this._config());\n draft.tabs = draft.tabs ?? [];\n fn(draft);\n this._config.set(draft);\n this._isDirty.set(true);\n }\n\n private uniqueId(prefix: string, taken: Set<string>): string {\n let n = 1;\n let candidate = `${prefix}_${n}`;\n while (taken.has(candidate)) {\n n += 1;\n candidate = `${prefix}_${n}`;\n }\n return candidate;\n }\n\n private validate(config: EntityFormConfig): BuilderProblem[] {\n const problems: BuilderProblem[] = [];\n\n if (!config.entity || !config.entity.trim()) {\n problems.push({ level: 'error', message: 'Entity name is required.' });\n } else if (!ID_PATTERN.test(config.entity)) {\n problems.push({\n level: 'error',\n message:\n 'Entity name must start with a letter or underscore and contain only letters, digits, and underscores.',\n });\n }\n\n const allFields = this.getAllFields(config.tabs);\n if (allFields.length === 0) {\n problems.push({ level: 'warning', message: 'This entity has no fields yet.' });\n }\n\n for (const field of allFields) {\n if (!field.id || !ID_PATTERN.test(field.id)) {\n problems.push({\n level: 'error',\n message: `Field id \"${field.id}\" is not a valid identifier.`,\n fieldId: field.id,\n });\n }\n\n const labels = field.label ?? {};\n const hasLabel = Object.values(labels).some(v => typeof v === 'string' && v.trim());\n if (!hasLabel) {\n problems.push({\n level: 'warning',\n message: `Field \"${field.id}\" has no label.`,\n fieldId: field.id,\n });\n }\n\n const meta = getFieldTypeMeta(field.type);\n // A field on the lookup source has no inline options by design — its options arrive from\n // the registry at runtime. Warn only about the missing list name.\n if (meta?.hasOptions && typeof field.listName === 'string') {\n if (!field.listName.trim()) {\n problems.push({\n level: 'warning',\n message: `Field \"${field.id}\" reads options from a named list but has no list name.`,\n fieldId: field.id,\n });\n }\n } else if (meta?.hasOptions && (!field.options || field.options.length === 0)) {\n problems.push({\n level: 'warning',\n message: `Field \"${field.id}\" is a ${field.type} but has no options.`,\n fieldId: field.id,\n });\n }\n }\n\n // Id uniqueness is a whole-config invariant, and it is counted over the entire field\n // tree rather than `allFields`, which stops at a tab's own fields. Two ids colliding\n // inside a group or array went unreported even though rules, showWhen conditions and\n // autoPatch mappings all address fields by bare id and would resolve to whichever one\n // the lookup happened to reach first.\n const idCounts = new Map<string, number>();\n const countIds = (fields: NestedFieldConfig[] | undefined) => {\n for (const f of fields ?? []) {\n idCounts.set(f.id, (idCounts.get(f.id) ?? 0) + 1);\n if (f.children?.length) countIds(f.children);\n }\n };\n for (const tab of this.flattenTabs(config.tabs)) countIds(tab.fields);\n\n for (const [id, count] of idCounts) {\n if (count > 1) {\n problems.push({ level: 'error', message: `Duplicate field id \"${id}\" (${count}×).`, fieldId: id });\n }\n }\n\n return problems;\n }\n}\n","import { Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { NestedFieldConfig } from '@dynamic-entity/core';\nimport { resolveLabel } from '@dynamic-entity/core';\nimport { BuilderStore } from '../builder-store.service';\n\n/**\n * EntityReferenceConfigComponent — authors the `entityReference` block of an entity-ref field:\n * registry key, display fields, static filters, and the parent→child cascade.\n *\n * Also authors `autoPatch`, since the mappings only make sense against the record the\n * selected reference returns.\n */\n@Component({\n selector: 'ngx-entity-reference-config',\n standalone: true,\n imports: [\n FormsModule,\n MatButtonModule,\n MatDividerModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatTooltipModule,\n ],\n template: `\n @if (field(); as f) {\n <div class=\"deb-entity-ref\">\n <span class=\"deb-section-title\">Entity reference</span>\n\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Registry key</mat-label>\n <input\n matInput\n data-testid=\"entity-ref-key\"\n [ngModel]=\"ref(f).linkedEntityKey ?? ''\"\n (ngModelChange)=\"patchRef(f, { linkedEntityKey: $event || undefined })\"\n />\n <mat-hint>Key the consumer registered a loader under. Defaults to the field id.</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Display fields</mat-label>\n <input\n matInput\n data-testid=\"entity-ref-display-fields\"\n [ngModel]=\"displayFieldsText(f)\"\n (ngModelChange)=\"setDisplayFields(f, $event)\"\n />\n <mat-hint>Comma-separated record paths used to build each option label.</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Static filters (JSON)</mat-label>\n <input\n matInput\n data-testid=\"entity-ref-filters\"\n [ngModel]=\"filtersText(f)\"\n (ngModelChange)=\"setFilters(f, $event)\"\n />\n @if (filtersError()) {\n <mat-hint class=\"deb-error-hint\">{{ filtersError() }}</mat-hint>\n } @else {\n <mat-hint>Passed to the loader, e.g. {\"isEmployee\": false}.</mat-hint>\n }\n </mat-form-field>\n\n <mat-divider></mat-divider>\n\n <!-- Cascade -->\n <span class=\"deb-section-title\">Cascade</span>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Parent field</mat-label>\n <mat-select\n data-testid=\"entity-ref-parent\"\n [ngModel]=\"ref(f).parentField ?? ''\"\n (ngModelChange)=\"patchRef(f, { parentField: $event || undefined })\"\n >\n <mat-option value=\"\">None — load all options</mat-option>\n @for (candidate of parentCandidates(); track candidate.id) {\n <mat-option [value]=\"candidate.id\">{{ fieldLabel(candidate) }} ({{ candidate.id }})</mat-option>\n }\n </mat-select>\n <mat-hint>This field's options reload whenever the parent changes.</mat-hint>\n </mat-form-field>\n\n @if (ref(f).parentField) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Lookup filter path</mat-label>\n <input\n matInput\n data-testid=\"entity-ref-lookup-filter\"\n [ngModel]=\"ref(f).lookupFilter ?? ''\"\n (ngModelChange)=\"patchRef(f, { lookupFilter: $event || undefined })\"\n />\n <mat-hint>Keep options whose record matches the parent value at this path.</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Lookup path (nested options)</mat-label>\n <input\n matInput\n data-testid=\"entity-ref-lookup-path\"\n [ngModel]=\"ref(f).lookupPath ?? ''\"\n (ngModelChange)=\"patchRef(f, { lookupPath: $event || undefined })\"\n />\n <mat-hint>Take options from this array on the selected parent's record instead.</mat-hint>\n </mat-form-field>\n }\n\n <mat-divider></mat-divider>\n\n <!-- autoPatch -->\n <div class=\"deb-row deb-row--split\">\n <span class=\"deb-section-title\">Auto-patch on select</span>\n <button\n mat-stroked-button\n type=\"button\"\n data-testid=\"add-auto-patch\"\n (click)=\"store.addAutoPatchMapping(f.id)\"\n >\n <mat-icon>add</mat-icon> Mapping\n </button>\n </div>\n\n @if (f.autoPatch) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Target tab</mat-label>\n <mat-select\n data-testid=\"auto-patch-tab\"\n [ngModel]=\"f.autoPatch.targetTab\"\n (ngModelChange)=\"store.setAutoPatchTargetTab(f.id, $event)\"\n >\n @for (tab of store.tabs(); track tab.id) {\n <mat-option [value]=\"tab.id\">{{ tabLabel(tab.id) }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n @for (mapping of f.autoPatch.mappings; track $index) {\n <div class=\"deb-option-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Source (linked record)</mat-label>\n <input\n matInput\n [ngModel]=\"mapping.source\"\n (ngModelChange)=\"store.updateAutoPatchMapping(f.id, $index, { source: $event })\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Target field</mat-label>\n <input\n matInput\n [ngModel]=\"mapping.target\"\n (ngModelChange)=\"store.updateAutoPatchMapping(f.id, $index, { target: $event })\"\n />\n </mat-form-field>\n <button\n mat-icon-button\n type=\"button\"\n color=\"warn\"\n matTooltip=\"Remove mapping\"\n (click)=\"store.removeAutoPatchMapping(f.id, $index)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n }\n } @else {\n <p class=\"deb-hint\">\n No auto-patch configured — selecting a reference will not copy any values.\n </p>\n }\n </div>\n }\n `,\n styles: [\n `\n .deb-entity-ref {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .deb-full {\n width: 100%;\n }\n .deb-row {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n .deb-row--split {\n justify-content: space-between;\n }\n .deb-option-row {\n display: flex;\n gap: 6px;\n align-items: center;\n }\n .deb-option-row > mat-form-field {\n flex: 1;\n }\n .deb-error-hint {\n color: #b91c1c;\n }\n `,\n ],\n})\nexport class EntityReferenceConfigComponent {\n protected readonly store = inject(BuilderStore);\n\n protected readonly field = this.store.selectedField;\n\n /** Sibling fields that can drive a cascade — anything but this field itself. */\n protected readonly parentCandidates = computed<NestedFieldConfig[]>(() => {\n const current = this.field();\n return this.store.fields().filter(f => f.id !== current?.id);\n });\n\n private readonly filtersParseError = signal<string | null>(null);\n protected readonly filtersError = this.filtersParseError.asReadonly();\n\n protected ref(field: NestedFieldConfig) {\n return field.entityReference ?? { enabled: true };\n }\n\n protected patchRef(field: NestedFieldConfig, patch: Record<string, unknown>): void {\n this.store.updateEntityReference(field.id, patch);\n }\n\n protected fieldLabel(field: NestedFieldConfig): string {\n return resolveLabel(field.label, this.store.activeLanguage());\n }\n\n protected tabLabel(tabId: string): string {\n const tab = this.store.tabs().find(t => t.id === tabId);\n return tab ? resolveLabel(tab.label, this.store.activeLanguage()) : tabId;\n }\n\n protected displayFieldsText(field: NestedFieldConfig): string {\n return (this.ref(field).displayFields ?? []).join(', ');\n }\n\n protected setDisplayFields(field: NestedFieldConfig, value: string): void {\n const parts = value\n .split(',')\n .map(s => s.trim())\n .filter(Boolean);\n this.patchRef(field, { displayFields: parts.length ? parts : undefined });\n }\n\n protected filtersText(field: NestedFieldConfig): string {\n const filters = this.ref(field).filters;\n return filters ? JSON.stringify(filters) : '';\n }\n\n /** Invalid JSON is reported inline and left unapplied rather than silently dropped. */\n protected setFilters(field: NestedFieldConfig, value: string): void {\n const trimmed = value.trim();\n if (!trimmed) {\n this.filtersParseError.set(null);\n this.patchRef(field, { filters: undefined });\n return;\n }\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n this.filtersParseError.set('Filters must be a JSON object.');\n return;\n }\n this.filtersParseError.set(null);\n this.patchRef(field, { filters: parsed as Record<string, unknown> });\n } catch {\n this.filtersParseError.set('Invalid JSON.');\n }\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\n\nimport type { FormRule, RuleOperator } from '@dynamic-entity/core';\n\n/**\n * RuleFormComponent — dialog/panel form for creating or editing a FormRule.\n */\n@Component({\n selector: 'ngx-rule-form',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSelectModule,\n ],\n template: `\n <div class=\"deb-rule-form\">\n <h3 class=\"deb-rule-form__title\">{{ rule.id ? 'Edit Rule' : 'New Form Rule' }}</h3>\n\n <!-- Trigger Field -->\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Trigger Field ID</mat-label>\n <input matInput [(ngModel)]=\"rule.fieldId\" placeholder=\"e.g. status\" />\n </mat-form-field>\n\n <!-- Conditions -->\n <div class=\"deb-rule-section\">\n <h4>Conditions</h4>\n @for (cond of rule.conditions; track $index) {\n <div class=\"deb-rule-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Operator</mat-label>\n <mat-select [(ngModel)]=\"cond.operator\">\n @for (op of operators; track op) {\n <mat-option [value]=\"op\">{{ op }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Value</mat-label>\n <input matInput [(ngModel)]=\"cond.value\" placeholder=\"Condition value\" />\n </mat-form-field>\n <button mat-icon-button color=\"warn\" type=\"button\" (click)=\"removeCondition($index)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n }\n <button mat-stroked-button type=\"button\" (click)=\"addCondition()\">\n <mat-icon>add</mat-icon> Add Condition\n </button>\n </div>\n\n <!-- Action -->\n <div class=\"deb-rule-section\">\n <h4>Action</h4>\n <div class=\"deb-rule-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Action Type</mat-label>\n <mat-select [(ngModel)]=\"rule.action.type\">\n <mat-option value=\"visibility\">Visibility (Show/Hide)</mat-option>\n <mat-option value=\"validation\">Validation Message</mat-option>\n <mat-option value=\"info\">Info Banner</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Value / Message</mat-label>\n <input matInput [(ngModel)]=\"rule.action.value\" placeholder=\"false to hide, or message text\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"deb-rule-form__actions\">\n <button mat-button type=\"button\" (click)=\"cancel.emit()\">Cancel</button>\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"save.emit(rule)\">Save Rule</button>\n </div>\n </div>\n `,\n styles: [\n `\n .deb-rule-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n background: #fafafa;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n padding: 16px;\n }\n .deb-rule-form__title {\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n }\n .deb-full {\n width: 100%;\n }\n .deb-rule-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .deb-rule-section h4 {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: #555;\n }\n .deb-rule-row {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n .deb-rule-row > * {\n flex: 1;\n }\n .deb-rule-form__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 8px;\n }\n `,\n ],\n})\nexport class RuleFormComponent {\n @Input() rule: FormRule = {\n formConfigId: 'form-1',\n fieldId: '',\n conditions: [{ operator: 'EQUAL', compareType: 'value', value: '' }],\n action: { type: 'visibility', value: false },\n targets: [],\n enabled: true,\n priority: 1,\n };\n\n @Output() save = new EventEmitter<FormRule>();\n @Output() cancel = new EventEmitter<void>();\n\n readonly operators: RuleOperator[] = [\n 'EQUAL',\n 'NOT_EQUAL',\n 'CONTAINS',\n 'NOT_CONTAINS',\n 'STARTS_WITH',\n 'ENDS_WITH',\n 'IS_EMPTY',\n 'IS_NOT_EMPTY',\n 'LESS_THAN',\n 'MORE_THAN',\n 'LESS_THAN_EQUAL',\n 'MORE_THAN_EQUAL',\n 'DATE_BEFORE',\n 'DATE_AFTER',\n 'IN',\n 'NOT_IN',\n 'HAS_ITEMS',\n 'VALUE_CHANGED',\n ];\n\n addCondition(): void {\n this.rule.conditions.push({ operator: 'EQUAL', compareType: 'value', value: '' });\n }\n\n removeCondition(index: number): void {\n this.rule.conditions.splice(index, 1);\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { FormRule } from '@dynamic-entity/core';\nimport { BuilderStore } from '../builder-store.service';\nimport { deepClone } from '../clone';\nimport { RuleFormComponent } from './rule-form.component';\n\n/**\n * FieldRulesListComponent — the rules attached to the selected field: view, reorder,\n * enable/disable, edit, delete. `RuleFormComponent` authors one rule; this owns the set.\n */\n@Component({\n selector: 'ngx-field-rules-list',\n standalone: true,\n imports: [MatButtonModule, MatIconModule, MatSlideToggleModule, MatTooltipModule, RuleFormComponent],\n template: `\n <div class=\"deb-rules\">\n <div class=\"deb-rules__head\">\n <span class=\"deb-section-title\">Rules</span>\n <button\n mat-stroked-button\n type=\"button\"\n data-testid=\"add-rule\"\n [disabled]=\"!store.selectedFieldId()\"\n (click)=\"startCreate()\"\n >\n <mat-icon>add</mat-icon> Rule\n </button>\n </div>\n\n @if (editing(); as draft) {\n <ngx-rule-form [rule]=\"draft\" (save)=\"commit($event)\" (cancel)=\"editing.set(null)\" />\n }\n\n @if (store.rulesForSelectedField().length === 0 && !editing()) {\n <p class=\"deb-hint\" data-testid=\"rules-empty\">No rules on this field.</p>\n }\n\n @for (rule of store.rulesForSelectedField(); track rule.id) {\n <div class=\"deb-rule-item\" [class.deb-rule-item--off]=\"!rule.enabled\" data-testid=\"rule-item\">\n <div class=\"deb-rule-item__body\">\n <span class=\"deb-rule-item__summary\">{{ summarize(rule) }}</span>\n <span class=\"deb-rule-item__meta\">\n priority {{ rule.priority }} · {{ rule.targets.length }} target(s)\n </span>\n </div>\n <div class=\"deb-rule-item__actions\">\n <mat-slide-toggle\n [checked]=\"rule.enabled\"\n matTooltip=\"Enable / disable\"\n (change)=\"store.toggleRule(rule.id!, $event.checked)\"\n />\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Move up\"\n [attr.data-testid]=\"'rule-up-' + rule.id\"\n (click)=\"store.moveRule(rule.id!, -1)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Move down\"\n [attr.data-testid]=\"'rule-down-' + rule.id\"\n (click)=\"store.moveRule(rule.id!, 1)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Edit rule\"\n [attr.data-testid]=\"'rule-edit-' + rule.id\"\n (click)=\"startEdit(rule)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n color=\"warn\"\n matTooltip=\"Delete rule\"\n [attr.data-testid]=\"'rule-delete-' + rule.id\"\n (click)=\"store.removeRule(rule.id!)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .deb-rules {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .deb-rules__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .deb-rule-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n padding: 8px 10px;\n }\n .deb-rule-item--off {\n opacity: 0.55;\n }\n .deb-rule-item__body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .deb-rule-item__summary {\n font-size: 13px;\n font-weight: 600;\n overflow-wrap: anywhere;\n }\n .deb-rule-item__meta {\n font-size: 11px;\n color: #6b7280;\n }\n .deb-rule-item__actions {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n }\n `,\n ],\n})\nexport class FieldRulesListComponent {\n protected readonly store = inject(BuilderStore);\n\n /** The rule currently open in the editor — a new draft or a copy of an existing rule. */\n protected readonly editing = signal<FormRule | null>(null);\n\n protected startCreate(): void {\n const fieldId = this.store.selectedFieldId();\n if (!fieldId) return;\n this.editing.set({\n formConfigId: this.store.config().entity || 'form-1',\n fieldId,\n conditions: [{ operator: 'EQUAL', compareType: 'value', value: '' }],\n action: { type: 'visibility', value: false },\n targets: [{ id: fieldId, type: 'field' }],\n enabled: true,\n priority: this.store.rules().length + 1,\n });\n }\n\n protected startEdit(rule: FormRule): void {\n this.editing.set(deepClone(rule));\n }\n\n protected commit(rule: FormRule): void {\n if (rule.id) this.store.updateRule(rule.id, rule);\n else this.store.addRule(rule);\n this.editing.set(null);\n }\n\n /** One-line human summary: `status EQUAL \"archived\" → hide`. */\n protected summarize(rule: FormRule): string {\n const cond = rule.conditions\n .map(c => {\n const rhs = c.compareType === 'field' ? c.compareToField : JSON.stringify(c.value ?? '');\n return `${c.operator} ${rhs ?? ''}`.trim();\n })\n .join(' AND ');\n\n const action =\n rule.action.type === 'visibility'\n ? rule.action.value === false || rule.action.value === 'false'\n ? 'hide'\n : 'show'\n : `${rule.action.type}: ${rule.action.value}`;\n\n return `${rule.fieldId} ${cond} → ${action}`;\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { ConfigSourceService } from 'ngx-dynamic-entity';\nimport type { NestedFieldConfig } from '@dynamic-entity/core';\nimport { BuilderStore } from '../builder-store.service';\n\n@Component({\n selector: 'ngx-referenced-field-config',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatDividerModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSlideToggleModule,\n ],\n template: `\n @if (field(); as f) {\n <div class=\"deb-referenced-field\" style=\"margin-top: 16px;\">\n <div class=\"deb-row\" style=\"justify-content: space-between; align-items: center; margin-bottom: 8px;\">\n <span class=\"deb-section-title\" style=\"margin:0;\">Referenced Field</span>\n <mat-slide-toggle\n data-testid=\"toggle-referenced\"\n [ngModel]=\"f.isReferenced ?? false\"\n (ngModelChange)=\"toggleReferenced(f, $event)\"\n >\n Link\n </mat-slide-toggle>\n </div>\n\n @if (f.isReferenced) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\" style=\"margin-bottom: 8px;\">\n <mat-label>Source Entity Key</mat-label>\n <input\n matInput\n data-testid=\"referenced-entity-key\"\n [ngModel]=\"f.referencedEntityKey ?? ''\"\n (ngModelChange)=\"updateEntityKey(f, $event)\"\n placeholder=\"e.g. individuals\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\" style=\"margin-bottom: 8px;\">\n <mat-label>Source Field ID</mat-label>\n <input\n matInput\n data-testid=\"referenced-field-id\"\n [ngModel]=\"f.referencedFieldId ?? ''\"\n (ngModelChange)=\"updateFieldId(f, $event)\"\n placeholder=\"e.g. firstName\"\n />\n </mat-form-field>\n\n @if (f.hasDrift) {\n <div class=\"deb-drift-banner\" data-testid=\"drift-banner\" style=\"background: #fff3e0; border: 1px solid #ffe0b2; padding: 8px 12px; border-radius: 4px; margin-top: 8px;\">\n <div class=\"deb-row\" style=\"gap: 8px; align-items: center; color: #e65100; font-weight: 500;\">\n <mat-icon style=\"font-size: 18px; width:18px; height:18px;\">warning</mat-icon>\n <span>Source field definition has drifted!</span>\n </div>\n <p style=\"margin: 4px 0 8px 0; font-size: 12px; color: #666;\">\n The upstream field configuration in \"{{ f.referencedEntityKey }}\" has evolved.\n </p>\n <button\n mat-flat-button\n color=\"warn\"\n type=\"button\"\n data-testid=\"sync-source-btn\"\n (click)=\"syncWithSource(f)\"\n >\n Sync with Source\n </button>\n </div>\n }\n }\n </div>\n }\n `,\n})\nexport class ReferencedFieldConfigComponent {\n protected readonly store = inject(BuilderStore);\n protected readonly configSource = inject(ConfigSourceService, { optional: true }) as ConfigSourceService | null;\n protected readonly field = computed(() => this.store.selectedField());\n\n protected toggleReferenced(field: NestedFieldConfig, enabled: boolean): void {\n if (enabled) {\n this.store.updateField(field.id, { isReferenced: true });\n } else {\n this.store.unlinkReferencedField(field.id);\n }\n }\n\n protected updateEntityKey(field: NestedFieldConfig, key: string): void {\n const trimmed = key.trim();\n this.store.updateField(field.id, { referencedEntityKey: trimmed || undefined });\n this.checkDriftForField(field.id);\n }\n\n protected updateFieldId(field: NestedFieldConfig, fieldId: string): void {\n const trimmed = fieldId.trim();\n this.store.updateField(field.id, { referencedFieldId: trimmed || undefined });\n this.checkDriftForField(field.id);\n }\n\n protected async syncWithSource(field: NestedFieldConfig): Promise<void> {\n if (!field.referencedEntityKey || !field.referencedFieldId || !this.configSource) return;\n const sourceConfig = await this.configSource.getConfig(field.referencedEntityKey);\n if (!sourceConfig) return;\n\n const sourceField = this.findField(sourceConfig.tabs ?? [], field.referencedFieldId);\n if (sourceField) {\n this.store.syncReferencedField(field.id, sourceField);\n }\n }\n\n /**\n * Both callers pass the id of the field they just edited. This used to ignore that\n * argument and read `store.selectedField()` instead, so whenever the edited field was not\n * the selected one it checked drift against the wrong field's source entity — or bailed\n * out entirely if nothing was selected.\n */\n private async checkDriftForField(fieldId: string): Promise<void> {\n const f = this.store.fields().find(field => field.id === fieldId);\n if (!f || !f.isReferenced || !f.referencedEntityKey || !f.referencedFieldId || !this.configSource) return;\n const sourceConfig = await this.configSource.getConfig(f.referencedEntityKey);\n if (sourceConfig) {\n this.store.checkDrift({ [f.referencedEntityKey]: sourceConfig });\n }\n }\n\n private findField(tabs: any[], id: string): NestedFieldConfig | undefined {\n for (const t of tabs) {\n for (const f of t.fields ?? []) {\n if (f.id === id) return f;\n if (f.children?.length) {\n const res = this.findFieldInList(f.children, id);\n if (res) return res;\n }\n }\n }\n return undefined;\n }\n\n private findFieldInList(fields: NestedFieldConfig[], id: string): NestedFieldConfig | undefined {\n for (const f of fields) {\n if (f.id === id) return f;\n if (f.children?.length) {\n const res = this.findFieldInList(f.children, id);\n if (res) return res;\n }\n }\n return undefined;\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { DropdownOption, NestedFieldConfig } from '@dynamic-entity/core';\nimport { resolveLabel, resolveOptionLabel } from '@dynamic-entity/core';\nimport { BuilderStore } from '../builder-store.service';\nimport { getFieldTypeMeta, type FieldTypeMeta } from '../field-catalog';\nimport { EntityReferenceConfigComponent } from './entity-reference-config.component';\nimport { FieldRulesListComponent } from './field-rules-list.component';\nimport { ReferencedFieldConfigComponent } from './referenced-field-config.component';\n\n/**\n * FieldInspectorComponent — edits every property of the currently selected field.\n */\n@Component({\n selector: 'ngx-field-inspector',\n standalone: true,\n imports: [\n FormsModule,\n MatButtonModule,\n MatCheckboxModule,\n MatDividerModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatTooltipModule,\n EntityReferenceConfigComponent,\n FieldRulesListComponent,\n ReferencedFieldConfigComponent,\n ],\n templateUrl: './field-inspector.component.html',\n styles: [\n `\n .deb-inspector {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .deb-inspector__empty {\n color: var(--deb-muted, #6b7280);\n text-align: center;\n padding: 24px 8px;\n }\n .deb-full {\n width: 100%;\n }\n .deb-row {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n .deb-row > * {\n flex: 1;\n }\n .deb-row--split {\n justify-content: space-between;\n }\n .deb-row--split > * {\n flex: 0 0 auto;\n }\n .deb-toggles {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px 12px;\n }\n .deb-option-row {\n display: flex;\n gap: 6px;\n align-items: center;\n }\n .deb-chip {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n background: var(--deb-accent-soft, #eef2ff);\n color: var(--deb-accent, #6366f1);\n font-size: 12px;\n font-weight: 600;\n }\n `,\n ],\n})\nexport class FieldInspectorComponent {\n protected readonly store = inject(BuilderStore);\n\n protected readonly field = this.store.selectedField;\n protected readonly meta = computed<FieldTypeMeta | undefined>(() => {\n const f = this.field();\n return f ? getFieldTypeMeta(f.type) : undefined;\n });\n\n protected lang(): string {\n return this.store.activeLanguage();\n }\n\n\n protected toNum(value: unknown): number | null {\n if (value === '' || value === null || value === undefined) return null;\n const n = Number(value);\n return Number.isNaN(n) ? null : n;\n }\n\n protected labelValue(field: NestedFieldConfig): string {\n return resolveLabel(field.label, this.lang());\n }\n\n protected placeholderValue(field: NestedFieldConfig): string {\n return resolveLabel(field.placeholder, this.lang());\n }\n\n protected optionLabel(option: DropdownOption): string {\n return resolveOptionLabel(option, this.lang());\n }\n\n // ─── showWhen editing ───────────────────────────────────────────────────────\n\n protected showWhenEntries(field: NestedFieldConfig): { key: string; display: string }[] {\n return Object.entries(field.showWhen ?? {}).map(([key, value]) => ({\n key,\n display: this.stringifyShowWhen(value),\n }));\n }\n\n protected addShowWhen(field: NestedFieldConfig): void {\n const next = { ...(field.showWhen ?? {}) };\n let key = 'field';\n let n = 1;\n while (key in next) key = `field_${++n}`;\n next[key] = true;\n this.store.setShowWhen(field.id, next);\n }\n\n protected renameShowWhen(field: NestedFieldConfig, oldKey: string, newKey: string): void {\n const trimmed = newKey.trim();\n if (!trimmed || trimmed === oldKey) return;\n const current = field.showWhen ?? {};\n if (trimmed in current) return;\n const next: Record<string, unknown> = {};\n // Rebuild in order so the row does not jump while the user is typing.\n for (const [k, v] of Object.entries(current)) next[k === oldKey ? trimmed : k] = v;\n this.store.setShowWhen(field.id, next);\n }\n\n protected setShowWhenValue(field: NestedFieldConfig, key: string, raw: string): void {\n this.store.setShowWhen(field.id, { ...(field.showWhen ?? {}), [key]: this.parseShowWhen(raw) });\n }\n\n protected removeShowWhen(field: NestedFieldConfig, key: string): void {\n const next = { ...(field.showWhen ?? {}) };\n delete next[key];\n this.store.setShowWhen(field.id, next);\n }\n\n /**\n * `showWhen` compares with `!==`, so the authored type has to survive the round trip:\n * \"true\"/\"false\" become booleans and numeric text becomes a number.\n */\n private parseShowWhen(raw: string): unknown {\n const trimmed = raw.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n if (trimmed !== '' && !Number.isNaN(Number(trimmed))) return Number(trimmed);\n return raw;\n }\n\n private stringifyShowWhen(value: unknown): string {\n if (value === null) return 'null';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n}\n","@if (field(); as f) {\n <div class=\"deb-inspector\">\n <!-- Identity -->\n <div class=\"deb-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Field id</mat-label>\n <input matInput data-testid=\"field-id\" [value]=\"f.id\" disabled />\n @if (store.hasManualId(f.id)) {\n <mat-hint>The stored data key for this saved field — fixed.</mat-hint>\n } @else {\n <mat-hint>Derived from the label. Used as the data key.</mat-hint>\n }\n </mat-form-field>\n <span class=\"deb-chip\">{{ meta()?.label || f.type }}</span>\n </div>\n\n <!-- Localised text (active language) -->\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Label ({{ lang() }})</mat-label>\n <input\n matInput\n [ngModel]=\"labelValue(f)\"\n (ngModelChange)=\"store.setFieldLabel(f.id, lang(), $event)\"\n />\n </mat-form-field>\n\n @if (meta()?.supportsPlaceholder) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Placeholder ({{ lang() }})</mat-label>\n <input\n matInput\n [ngModel]=\"placeholderValue(f)\"\n (ngModelChange)=\"store.setFieldPlaceholder(f.id, lang(), $event)\"\n />\n </mat-form-field>\n }\n\n @if (meta()?.supportsDefaultValue) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Default value</mat-label>\n <input\n matInput\n [ngModel]=\"f.defaultValue ?? ''\"\n (ngModelChange)=\"store.updateField(f.id, { defaultValue: $event })\"\n />\n </mat-form-field>\n }\n\n <!-- Entity reference, cascade, and autoPatch -->\n @if (meta()?.isEntityRef) {\n <mat-divider></mat-divider>\n <ngx-entity-reference-config />\n }\n\n <mat-divider></mat-divider>\n\n <!-- Validators -->\n @if (meta(); as m) {\n @if (m.flagValidators.length || m.paramValidators.length) {\n <span class=\"deb-section-title\">Validation</span>\n <div class=\"deb-toggles\">\n @for (v of m.flagValidators; track v) {\n <mat-checkbox\n [ngModel]=\"store.hasFlagValidator(f, v)\"\n (ngModelChange)=\"store.toggleFlagValidator(f.id, v, $event)\"\n >{{ v }}</mat-checkbox>\n }\n </div>\n @for (v of m.paramValidators; track v) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>{{ v }}</mat-label>\n <input\n matInput\n type=\"number\"\n [ngModel]=\"store.getParamValidator(f, v)\"\n (ngModelChange)=\"store.setParamValidator(f.id, v, toNum($event))\"\n />\n </mat-form-field>\n }\n }\n }\n\n <!-- Options (dropdown / radio / multiSelect) -->\n @if (meta()?.hasOptions) {\n <mat-divider></mat-divider>\n <span class=\"deb-section-title\">Data source</span>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Options come from</mat-label>\n <mat-select\n data-testid=\"data-source\"\n [ngModel]=\"store.fieldDataSource(f)\"\n (ngModelChange)=\"store.setFieldDataSource(f.id, $event)\"\n >\n <mat-option value=\"none\">Nothing yet</mat-option>\n <mat-option value=\"manual\">Options authored here</mat-option>\n <mat-option value=\"lookup\">A named list</mat-option>\n </mat-select>\n </mat-form-field>\n }\n\n <!-- Named lookup list -->\n @if (meta()?.hasOptions && store.fieldDataSource(f) === 'lookup') {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>List name</mat-label>\n <input\n matInput\n data-testid=\"list-name\"\n [ngModel]=\"f.listName ?? ''\"\n (ngModelChange)=\"store.setListName(f.id, $event)\"\n />\n </mat-form-field>\n <p class=\"deb-hint\">\n The consuming app resolves this name through its lookup registry. Options are not\n authored here.\n </p>\n }\n\n <!-- Inline options -->\n @if (meta()?.hasOptions && store.fieldDataSource(f) !== 'lookup') {\n <div class=\"deb-row\" style=\"justify-content: space-between;\">\n <span class=\"deb-section-title\">Options</span>\n <button mat-stroked-button type=\"button\" (click)=\"store.addOption(f.id)\">\n <mat-icon>add</mat-icon> Option\n </button>\n </div>\n @for (opt of f.options ?? []; track $index) {\n <div class=\"deb-option-row\" data-testid=\"option-row\">\n <!-- One input: the displayed text is the stored value. -->\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Option ({{ lang() }})</mat-label>\n <input\n matInput\n [attr.data-testid]=\"'option-' + $index\"\n [ngModel]=\"optionLabel(opt)\"\n (ngModelChange)=\"store.setOptionLabel(f.id, $index, lang(), $event)\"\n />\n </mat-form-field>\n <button mat-icon-button type=\"button\" color=\"warn\"\n (click)=\"store.removeOption(f.id, $index)\" matTooltip=\"Remove option\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n }\n @if (!(f.options ?? []).length) {\n <p class=\"deb-hint\">No options yet — add at least one.</p>\n }\n }\n\n <mat-divider></mat-divider>\n\n <!-- Flags -->\n <span class=\"deb-section-title\">Display</span>\n <div class=\"deb-toggles\">\n <mat-slide-toggle\n [ngModel]=\"f.visibility ?? true\"\n (ngModelChange)=\"store.updateField(f.id, { visibility: $event })\"\n >Visible</mat-slide-toggle>\n <mat-slide-toggle\n [ngModel]=\"f.table?.visible ?? false\"\n (ngModelChange)=\"store.updateField(f.id, { table: { visible: $event } })\"\n >Table column</mat-slide-toggle>\n <mat-slide-toggle\n [ngModel]=\"f.readonly ?? false\"\n (ngModelChange)=\"store.updateField(f.id, { readonly: $event })\"\n >Read-only</mat-slide-toggle>\n <mat-slide-toggle\n [ngModel]=\"f.disabled ?? false\"\n (ngModelChange)=\"store.updateField(f.id, { disabled: $event })\"\n >Disabled</mat-slide-toggle>\n <mat-slide-toggle\n [ngModel]=\"f.maskData ?? false\"\n (ngModelChange)=\"store.updateField(f.id, { maskData: $event })\"\n >Mask data (RBAC)</mat-slide-toggle>\n <mat-slide-toggle\n data-testid=\"toggle-critical\"\n [ngModel]=\"f.criticalField ?? false\"\n (ngModelChange)=\"store.updateField(f.id, { criticalField: $event })\"\n matTooltip=\"Renders locked; editing it announces a change against the session baseline.\"\n >Critical field</mat-slide-toggle>\n <mat-slide-toggle\n [ngModel]=\"f.showOnMinimize ?? false\"\n (ngModelChange)=\"store.updateField(f.id, { showOnMinimize: $event })\"\n matTooltip=\"Shown in the record editor's summary panel.\"\n >Show in summary</mat-slide-toggle>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Conditional visibility (static showWhen) -->\n <div class=\"deb-row deb-row--split\">\n <span class=\"deb-section-title\">Show when</span>\n <button mat-stroked-button type=\"button\" data-testid=\"add-show-when\" (click)=\"addShowWhen(f)\">\n <mat-icon>add</mat-icon> Condition\n </button>\n </div>\n @for (entry of showWhenEntries(f); track entry.key) {\n <div class=\"deb-option-row\" data-testid=\"option-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Field id</mat-label>\n <input matInput [ngModel]=\"entry.key\" (ngModelChange)=\"renameShowWhen(f, entry.key, $event)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Equals</mat-label>\n <input matInput [ngModel]=\"entry.display\" (ngModelChange)=\"setShowWhenValue(f, entry.key, $event)\" />\n </mat-form-field>\n <button mat-icon-button type=\"button\" color=\"warn\" matTooltip=\"Remove condition\"\n (click)=\"removeShowWhen(f, entry.key)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n }\n @if (!showWhenEntries(f).length) {\n <p class=\"deb-hint\">Always visible. Add a condition to show this field only for certain values.</p>\n }\n\n <!-- patchOnTrue (boolean/checkbox only) -->\n @if (f.type === 'boolean' || f.type === 'checkbox') {\n <mat-divider></mat-divider>\n <div class=\"deb-row deb-row--split\">\n <span class=\"deb-section-title\">Copy on true</span>\n <button mat-stroked-button type=\"button\" data-testid=\"add-patch-on-true\"\n (click)=\"store.addPatchOnTrueMapping(f.id)\">\n <mat-icon>add</mat-icon> Mapping\n </button>\n </div>\n @for (mapping of f.patchOnTrue ?? []; track $index) {\n <div class=\"deb-option-row\" data-testid=\"option-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>From field</mat-label>\n <input matInput [ngModel]=\"mapping.from\"\n (ngModelChange)=\"store.updatePatchOnTrueMapping(f.id, $index, { from: $event })\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>To field</mat-label>\n <input matInput [ngModel]=\"mapping.to\"\n (ngModelChange)=\"store.updatePatchOnTrueMapping(f.id, $index, { to: $event })\" />\n </mat-form-field>\n <button mat-icon-button type=\"button\" color=\"warn\" matTooltip=\"Remove mapping\"\n (click)=\"store.removePatchOnTrueMapping(f.id, $index)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n }\n @if (!(f.patchOnTrue ?? []).length) {\n <p class=\"deb-hint\">When this flips to true, copy one field's value into another.</p>\n }\n }\n\n <mat-divider></mat-divider>\n\n <!-- Rules attached to this field -->\n <ngx-field-rules-list />\n\n <mat-divider></mat-divider>\n\n <!-- Cross-entity field reference & drift management (Phase 8) -->\n <ngx-referenced-field-config />\n </div>\n} @else {\n <div class=\"deb-inspector__empty\">\n <mat-icon>touch_app</mat-icon>\n <p>Select a field to edit its properties.</p>\n </div>\n}\n","import { Component, EventEmitter, Output } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { RichFieldType } from '@dynamic-entity/core';\nimport { FIELD_TYPE_CATALOG, type FieldTypeMeta } from '../field-catalog';\n\n/**\n * FieldPaletteComponent — the list of buildable field types (Angular Material).\n */\n@Component({\n selector: 'ngx-field-palette',\n standalone: true,\n imports: [MatButtonModule, MatIconModule, MatTooltipModule],\n template: `\n <div class=\"deb-palette\">\n @for (meta of catalog; track meta.type) {\n <button\n mat-stroked-button\n type=\"button\"\n class=\"deb-palette__item\"\n [attr.data-testid]=\"'palette-' + meta.type\"\n [matTooltip]=\"meta.description\"\n (click)=\"pick.emit(meta.type)\"\n >\n <mat-icon>{{ meta.icon }}</mat-icon>\n <span>{{ meta.label }}</span>\n </button>\n }\n </div>\n `,\n styles: [\n `\n .deb-palette {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n }\n .deb-palette__item {\n justify-content: flex-start;\n overflow: hidden;\n border-radius: 8px !important;\n border: 1px solid var(--border, #e2e8f0) !important;\n padding: 8px 12px !important;\n font-family: var(--font-heading, inherit) !important;\n font-weight: 600 !important;\n font-size: 13px !important;\n transition: all 0.18s cubic-bezier(0.16, 1, 0.3, 1) !important;\n background: #ffffff !important;\n }\n .deb-palette__item:hover {\n border-color: #6366f1 !important;\n background: #f5f3ff !important;\n color: #4f46e5 !important;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15) !important;\n }\n .deb-palette__item mat-icon {\n color: #6366f1;\n margin-right: 6px;\n font-size: 18px;\n width: 18px;\n height: 18px;\n }\n .deb-palette__item span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n `,\n ],\n})\nexport class FieldPaletteComponent {\n readonly catalog: readonly FieldTypeMeta[] = FIELD_TYPE_CATALOG;\n\n @Output() pick = new EventEmitter<RichFieldType>();\n}\n","import { Component, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { NestedTabConfig } from '@dynamic-entity/core';\nimport { resolveLabel } from '@dynamic-entity/core';\nimport { SYSTEM_DEFAULT_CAN_EDIT } from 'ngx-dynamic-entity';\nimport { BuilderStore } from '../builder-store.service';\n\n/**\n * Re-exported so existing imports from this package keep working.\n *\n * This file used to declare its own `new InjectionToken('SYSTEM_DEFAULT_CAN_EDIT')` while\n * `ngx-dynamic-entity` exported another under the same name. InjectionToken identity is by\n * object reference, so a consumer providing the renderer's — the documented one — was\n * providing a token nothing injected, and the predicate silently never ran. One token now,\n * defined in the lower-level package that both depend on.\n */\nexport { SYSTEM_DEFAULT_CAN_EDIT };\n\n/**\n * TabManagerComponent — add / rename / reorder / remove tabs & sub-tabs with systemDefault protection.\n */\n@Component({\n selector: 'ngx-tab-manager',\n standalone: true,\n imports: [\n FormsModule,\n MatButtonModule,\n MatCheckboxModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSlideToggleModule,\n MatTooltipModule,\n ],\n template: `\n <div class=\"deb-tabs\">\n <div class=\"deb-tabs__head\">\n <span class=\"deb-section-title\">Tabs Manager</span>\n <button mat-stroked-button type=\"button\" (click)=\"store.addTab()\">\n <mat-icon>add</mat-icon> Add Tab\n </button>\n </div>\n\n @if (store.tabs().length === 0) {\n <p class=\"deb-hint\">No tabs — all fields render in a single section.</p>\n }\n\n @for (tab of store.tabs(); track tab.id; let i = $index, count = $count) {\n <div class=\"deb-tab-card\" [class.deb-tab-card--system]=\"tab.systemDefault\">\n <div class=\"deb-tabs__row\" [attr.data-testid]=\"'tab-row-' + tab.id\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\n <mat-label>{{ tab.id }} {{ tab.systemDefault ? '(System)' : '' }}</mat-label>\n <input\n matInput\n [disabled]=\"!canEditTab(tab)\"\n [ngModel]=\"tabLabel(tab)\"\n (ngModelChange)=\"store.setTabLabel(tab.id, lang(), $event)\"\n />\n </mat-form-field>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"i === 0 || !canEditTab(tab)\"\n (click)=\"store.moveTab(tab.id, -1)\"\n matTooltip=\"Move up\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"i === count - 1 || !canEditTab(tab)\"\n (click)=\"store.moveTab(tab.id, 1)\"\n matTooltip=\"Move down\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n color=\"warn\"\n [disabled]=\"!canEditTab(tab)\"\n (click)=\"store.removeTab(tab.id)\"\n matTooltip=\"Remove tab\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <!-- Tab settings row -->\n <div class=\"deb-tab-settings\">\n <mat-checkbox\n [disabled]=\"!canEditTab(tab)\"\n [ngModel]=\"tab.flatData\"\n (ngModelChange)=\"store.updateTab(tab.id, { flatData: $event })\"\n >\n Flat Data\n </mat-checkbox>\n <mat-checkbox\n [disabled]=\"!canEditTab(tab)\"\n [ngModel]=\"tab.isPrimaryTab\"\n (ngModelChange)=\"$event ? store.setPrimaryTab(tab.id) : store.updateTab(tab.id, { isPrimaryTab: false })\"\n >\n Primary Tab\n </mat-checkbox>\n <mat-checkbox\n [disabled]=\"!canEditTab(tab)\"\n [ngModel]=\"tab.maskData\"\n (ngModelChange)=\"store.updateTab(tab.id, { maskData: $event })\"\n >\n Mask Tab Data\n </mat-checkbox>\n <mat-checkbox\n [disabled]=\"!canEditTab(tab)\"\n [ngModel]=\"tab.systemDefault\"\n (ngModelChange)=\"store.updateTab(tab.id, { systemDefault: $event })\"\n >\n System Default\n </mat-checkbox>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"!canEditTab(tab)\"\n (click)=\"store.addSubTab(tab.id)\"\n >\n + Sub-tab\n </button>\n </div>\n\n <!-- Module tab configuration -->\n <div class=\"deb-tab-module\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\n <mat-label>Consumer Module Name (Optional)</mat-label>\n <input\n matInput\n placeholder=\"e.g. documents-view\"\n [disabled]=\"!canEditTab(tab)\"\n [ngModel]=\"tab.moduleName\"\n (ngModelChange)=\"store.updateTab(tab.id, { moduleName: $event || undefined })\"\n />\n </mat-form-field>\n </div>\n\n <!-- Sub-tabs recursive render (Level 2) -->\n @if (tab.children && tab.children.length > 0) {\n <div class=\"deb-subtabs\">\n <span class=\"deb-subtabs__title\">Sub-tabs:</span>\n @for (sub of tab.children; track sub.id) {\n <div class=\"deb-tabs__row deb-subtab-row\" [attr.data-testid]=\"'subtab-row-' + sub.id\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\n <mat-label>{{ sub.id }}</mat-label>\n <input\n matInput\n [disabled]=\"!canEditTab(sub)\"\n [ngModel]=\"tabLabel(sub)\"\n (ngModelChange)=\"store.setTabLabel(sub.id, lang(), $event)\"\n />\n </mat-form-field>\n <button\n mat-icon-button\n type=\"button\"\n color=\"warn\"\n [disabled]=\"!canEditTab(sub)\"\n (click)=\"store.removeTab(sub.id)\"\n matTooltip=\"Remove sub-tab\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n .deb-tabs__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n }\n .deb-tab-card {\n border: 1px solid var(--deb-border, #e5e7eb);\n border-radius: 8px;\n padding: 10px;\n margin-bottom: 10px;\n background: var(--deb-bg-surface, #ffffff);\n }\n .deb-tab-card--system {\n border-left: 4px solid var(--deb-accent, #6366f1);\n }\n .deb-tabs__row {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .deb-tab-settings {\n display: flex;\n flex-wrap: wrap;\n gap: 8px 16px;\n align-items: center;\n margin-top: 8px;\n font-size: 13px;\n }\n .deb-tab-module {\n margin-top: 8px;\n }\n .deb-subtabs {\n margin-top: 8px;\n padding-left: 16px;\n border-left: 2px dashed var(--deb-border, #e5e7eb);\n }\n .deb-subtabs__title {\n font-size: 12px;\n font-weight: 600;\n color: var(--deb-muted, #6b7280);\n }\n .deb-subtab-row {\n margin-top: 6px;\n }\n .deb-grow {\n flex: 1;\n }\n `,\n ],\n})\nexport class TabManagerComponent {\n protected readonly store = inject(BuilderStore);\n private readonly canEditSystemDefaultsFn = inject<(roles: string[]) => boolean>(SYSTEM_DEFAULT_CAN_EDIT, { optional: true });\n\n protected lang(): string {\n return this.store.activeLanguage();\n }\n\n protected tabLabel(tab: { label?: any }): string {\n return resolveLabel(tab.label, this.lang());\n }\n\n protected canEditTab(tab: NestedTabConfig): boolean {\n if (!tab.systemDefault) return true;\n if (this.canEditSystemDefaultsFn) {\n // The predicate's entire contract is (roles) => boolean. This passed a hardcoded []\n // regardless of who was using the builder, so any predicate that actually inspected\n // roles answered false for everyone and locked every system-default tab.\n return this.canEditSystemDefaultsFn(this.store.userRoles());\n }\n return true;\n }\n}\n","import { Component, Input, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { resolveLabel, type NestedFieldConfig } from '@dynamic-entity/core';\nimport { BuilderStore } from '../builder-store.service';\nimport { getFieldTypeMeta } from '../field-catalog';\n\n@Component({\n selector: 'ngx-entity-builder-tree-node',\n standalone: true,\n imports: [\n CommonModule,\n DragDropModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n ],\n template: `\n <div\n cdkDrag\n class=\"deb-field-row\"\n data-testid=\"builder-field-row\"\n [class.deb-field-row--active]=\"store.selectedFieldId() === field.id\"\n (click)=\"store.selectField(field.id)\"\n >\n <mat-icon class=\"deb-drag-handle\" cdkDragHandle title=\"Drag to reorder\">drag_indicator</mat-icon>\n <mat-icon class=\"deb-field-type\" [matTooltip]=\"fieldTypeLabel(field.type)\">{{ fieldTypeIcon(field.type) }}</mat-icon>\n <div class=\"deb-field-meta\">\n <div class=\"deb-row\" style=\"gap:6px\">\n <span class=\"deb-field-label\" [attr.data-testid]=\"'row-label-' + field.id\">{{ fieldLabel(field) }}</span>\n <span class=\"deb-type-badge\">{{ field.type }}</span>\n @if (field.isReferenced) {\n <mat-icon style=\"font-size: 16px; width: 16px; height: 16px; color: #1976d2;\" matTooltip=\"Referenced field (linked to {{ field.referencedEntityKey }})\">link</mat-icon>\n }\n @if (field.hasDrift) {\n <mat-icon style=\"font-size: 16px; width: 16px; height: 16px; color: #d32f2f;\" data-testid=\"drift-warning-icon\" matTooltip=\"Drift detected: source field has evolved\">sync_problem</mat-icon>\n }\n </div>\n <span class=\"deb-field-id\" [attr.data-testid]=\"'row-id-' + field.id\">{{ field.id }}</span>\n </div>\n @if (field.validators?.required) { <span class=\"deb-req\" title=\"Required\">*</span> }\n\n <button mat-icon-button type=\"button\" [disabled]=\"index === 0\"\n [attr.data-testid]=\"'row-up-' + field.id\"\n (click)=\"store.moveField(field.id, -1); $event.stopPropagation()\" matTooltip=\"Move up\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"index === totalCount - 1\"\n [attr.data-testid]=\"'row-down-' + field.id\"\n (click)=\"store.moveField(field.id, 1); $event.stopPropagation()\" matTooltip=\"Move down\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button mat-icon-button type=\"button\"\n [attr.data-testid]=\"'row-duplicate-' + field.id\"\n (click)=\"store.duplicateField(field.id); $event.stopPropagation()\" matTooltip=\"Duplicate\">\n <mat-icon>content_copy</mat-icon>\n </button>\n <button mat-icon-button type=\"button\" color=\"warn\"\n [attr.data-testid]=\"'row-delete-' + field.id\"\n (click)=\"store.removeField(field.id); $event.stopPropagation()\" matTooltip=\"Delete\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n @if (field.children && field.children.length > 0) {\n <div class=\"deb-tree-children\" style=\"padding-left: 20px; border-left: 2px solid rgba(0,0,0,0.08); margin-left: 12px; margin-top: 4px;\">\n @for (child of field.children; track child.id; let ci = $index, cCount = $count) {\n <ngx-entity-builder-tree-node\n [field]=\"child\"\n [index]=\"ci\"\n [totalCount]=\"cCount\"\n />\n }\n </div>\n }\n `,\n})\nexport class EntityBuilderTreeNodeComponent {\n protected readonly store = inject(BuilderStore);\n\n @Input({ required: true }) field!: NestedFieldConfig;\n @Input({ required: true }) index!: number;\n @Input({ required: true }) totalCount!: number;\n\n protected fieldTypeLabel(type: string): string {\n return getFieldTypeMeta(type)?.label ?? type;\n }\n\n protected fieldTypeIcon(type: string): string {\n return getFieldTypeMeta(type)?.icon ?? 'help_outline';\n }\n\n protected fieldLabel(field: { id: string; label?: any }): string {\n const lang = this.store.activeLanguage();\n return resolveLabel(field.label, lang) || field.id;\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { BuilderStore } from '../builder-store.service';\nimport { EntityBuilderTreeNodeComponent } from './entity-builder-tree-node.component';\n\n@Component({\n selector: 'ngx-entity-builder-canvas',\n standalone: true,\n imports: [\n CommonModule,\n DragDropModule,\n MatCardModule,\n MatIconModule,\n EntityBuilderTreeNodeComponent,\n ],\n template: `\n <mat-card class=\"deb-canvas\">\n <mat-card-header>\n <mat-card-title>Fields ({{ store.fields().length }})</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n @if (store.fields().length === 0) {\n <div class=\"deb-empty\">\n <mat-icon>widgets</mat-icon>\n <p>No fields yet. Pick a type from <strong>Add field</strong> to get started.</p>\n </div>\n }\n\n <div cdkDropList class=\"deb-field-list\" data-testid=\"builder-field-list\" (cdkDropListDropped)=\"onDrop($event)\">\n @for (f of store.fields(); track f.id; let i = $index, count = $count) {\n <ngx-entity-builder-tree-node\n [field]=\"f\"\n [index]=\"i\"\n [totalCount]=\"count\"\n />\n }\n </div>\n </mat-card-content>\n </mat-card>\n `,\n})\nexport class EntityBuilderCanvasComponent {\n protected readonly store = inject(BuilderStore);\n\n protected onDrop(event: CdkDragDrop<unknown>): void {\n this.store.reorderField(event.previousIndex, event.currentIndex);\n }\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n effect,\n inject,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n COMMON_MODULES,\n type CommonModuleEntry,\n type EntityFormConfig,\n type EntityPermissions,\n resolveLabel,\n} from '@dynamic-entity/core';\nimport { BuilderStore } from './builder-store.service';\nimport { FieldInspectorComponent } from './components/field-inspector.component';\nimport { FieldPaletteComponent } from './components/field-palette.component';\nimport { TabManagerComponent } from './components/tab-manager.component';\nimport { EntityBuilderCanvasComponent } from './components/entity-builder-canvas.component';\nimport { getFieldTypeMeta } from './field-catalog';\n\n/** RBAC actions surfaced in the settings panel. */\nconst RBAC_ACTIONS: (keyof EntityPermissions)[] = ['view', 'edit', 'delete'];\n\n/** Shared stable empty array — never allocate a fresh [] per change-detection (mat-select loops). */\nconst EMPTY_ROLES: readonly string[] = Object.freeze([]);\n\n/**\n * EntityBuilderComponent — the top-level visual builder for an EntityFormConfig.\n */\n@Component({\n selector: 'ngx-entity-builder',\n standalone: true,\n providers: [BuilderStore],\n imports: [\n FormsModule,\n DragDropModule,\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatExpansionModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatToolbarModule,\n MatTooltipModule,\n FieldPaletteComponent,\n TabManagerComponent,\n FieldInspectorComponent,\n EntityBuilderCanvasComponent,\n ],\n templateUrl: './entity-builder.component.html',\n styleUrl: './entity-builder.component.css',\n})\nexport class EntityBuilderComponent implements OnChanges {\n protected readonly store = inject(BuilderStore);\n\n /** Existing config to edit. When omitted, the builder starts blank. */\n @Input() config?: EntityFormConfig;\n /** Languages available for label/placeholder editing. First entry is the default. */\n @Input() languages: string[] = ['en'];\n /** Optional role list — enables multi-select role pickers for RBAC instead of free text. */\n @Input() availableRoles: string[] = [];\n /**\n * Roles of the person using the builder. Distinct from `availableRoles`, which is the\n * vocabulary a schema may reference. Passed to the `SYSTEM_DEFAULT_CAN_EDIT` predicate so\n * it can decide whether this user may edit system-default tabs.\n */\n @Input() userRoles: string[] = [];\n /** Optional common-module definitions for module tabs; defaults to the built-in list from core. */\n @Input() commonModules: readonly CommonModuleEntry[] = COMMON_MODULES;\n\n /** Emitted on every change to the working config. */\n @Output() configChange = new EventEmitter<EntityFormConfig>();\n /** Emitted when the user clicks Save. Carries a clean, deep-cloned config. */\n @Output() save = new EventEmitter<EntityFormConfig>();\n\n protected readonly rbacActions = RBAC_ACTIONS;\n\n constructor() {\n effect(() => this.configChange.emit(this.store.config()), { allowSignalWrites: true });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && changes['config'].currentValue !== changes['config'].previousValue) {\n if (this.config) this.store.load(this.config);\n else if (changes['config'].isFirstChange()) this.store.reset();\n }\n if (changes['languages'] && this.languages.length) {\n const active = this.store.activeLanguage();\n if (!this.languages.includes(active)) this.store.setActiveLanguage(this.languages[0]);\n }\n if (changes['userRoles']) {\n this.store.setUserRoles(this.userRoles);\n }\n }\n\n // ─── Field canvas ─────────────────────────────────────────────────────────\n\n protected onDrop(event: CdkDragDrop<unknown>): void {\n this.store.reorderField(event.previousIndex, event.currentIndex);\n }\n\n protected fieldTypeLabel(type: string): string {\n return getFieldTypeMeta(type)?.label ?? type;\n }\n\n protected fieldTypeIcon(type: string): string {\n return getFieldTypeMeta(type)?.icon ?? 'help_outline';\n }\n\n protected fieldLabel(field: { id: string; label?: any }): string {\n const lang = this.store.activeLanguage();\n return resolveLabel(field.label, lang) || field.id;\n }\n\n // ─── Toolbar actions ──────────────────────────────────────────────────────\n\n protected doSave(): void {\n this.save.emit(this.store.exportConfig());\n }\n\n protected get json(): string {\n return JSON.stringify(this.store.exportConfig(), null, 2);\n }\n\n protected copyJson(): void {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n void navigator.clipboard.writeText(this.json);\n }\n }\n\n // ─── RBAC settings ────────────────────────────────────────────────────────\n\n protected rolesFor(action: keyof EntityPermissions): readonly string[] {\n // Return the stored array (stable ref between mutations) or a shared empty — NOT a fresh [],\n // which would make the bound mat-select re-evaluate every CD and loop forever.\n return this.store.config().permissions?.[action] ?? EMPTY_ROLES;\n }\n\n protected setRoles(action: keyof EntityPermissions, roles: string[]): void {\n this.store.setPermission(action, roles);\n }\n\n /** Parse a comma-separated role string into a trimmed, de-duplicated array. */\n protected setRolesFromText(action: keyof EntityPermissions, text: string): void {\n const roles = Array.from(\n new Set(\n text\n .split(',')\n .map(r => r.trim())\n .filter(Boolean),\n ),\n );\n this.store.setPermission(action, roles);\n }\n}\n","<mat-toolbar class=\"deb-toolbar\" color=\"primary\">\n <mat-icon>dashboard_customize</mat-icon>\n <span class=\"deb-toolbar__title\">Entity Builder</span>\n <span class=\"deb-spacer\"></span>\n\n @if (store.problems().length) {\n <button\n mat-button\n type=\"button\"\n class=\"deb-problems\"\n [class.deb-problems--error]=\"!store.isValid()\"\n [matTooltip]=\"store.problems().length + ' issue(s) — hover items in the list'\"\n >\n <mat-icon>{{ store.isValid() ? 'warning' : 'error' }}</mat-icon>\n {{ store.errors().length }} / {{ store.problems().length }}\n </button>\n }\n\n <button mat-button type=\"button\" (click)=\"copyJson()\">\n <mat-icon>content_copy</mat-icon> Copy JSON\n </button>\n <button mat-flat-button color=\"accent\" type=\"button\" [disabled]=\"!store.isValid()\" (click)=\"doSave()\">\n <mat-icon>save</mat-icon> Save\n </button>\n</mat-toolbar>\n\n<div class=\"deb-body\">\n <!-- ─── Left: settings, palette, tabs ─── -->\n <div class=\"deb-col deb-col--left\">\n <mat-card>\n <mat-card-content>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>Entity name</mat-label>\n <input\n matInput\n [ngModel]=\"store.config().entity\"\n (ngModelChange)=\"store.setEntityName($event)\"\n placeholder=\"e.g. clients\"\n />\n </mat-form-field>\n\n <div class=\"deb-row\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-grow\">\n <mat-label>Editing language</mat-label>\n <mat-select\n [ngModel]=\"store.activeLanguage()\"\n (ngModelChange)=\"store.setActiveLanguage($event)\"\n >\n @for (l of languages; track l) {\n <mat-option [value]=\"l\">{{ l }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n\n <mat-slide-toggle\n [ngModel]=\"store.config().maskData ?? false\"\n (ngModelChange)=\"store.setMaskData($event)\"\n >Mask this entity (RBAC)</mat-slide-toggle>\n\n <mat-expansion-panel class=\"deb-rbac\">\n <mat-expansion-panel-header>\n <mat-panel-title>Permissions</mat-panel-title>\n </mat-expansion-panel-header>\n @for (action of rbacActions; track action) {\n @if (availableRoles.length) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>{{ action }} roles</mat-label>\n <mat-select multiple [ngModel]=\"rolesFor(action)\" (ngModelChange)=\"setRoles(action, $event)\">\n @for (role of availableRoles; track role) {\n <mat-option [value]=\"role\">{{ role }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n } @else {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"deb-full\">\n <mat-label>{{ action }} roles (comma-separated)</mat-label>\n <input\n matInput\n [ngModel]=\"rolesFor(action).join(', ')\"\n (ngModelChange)=\"setRolesFromText(action, $event)\"\n />\n </mat-form-field>\n }\n }\n <p class=\"deb-hint\">Empty = no restriction for that action.</p>\n </mat-expansion-panel>\n </mat-card-content>\n </mat-card>\n\n <mat-card>\n <mat-card-header><mat-card-title>Add field</mat-card-title></mat-card-header>\n <mat-card-content>\n <ngx-field-palette (pick)=\"store.addField($event)\"></ngx-field-palette>\n </mat-card-content>\n </mat-card>\n\n <mat-card>\n <mat-card-content>\n <ngx-tab-manager></ngx-tab-manager>\n </mat-card-content>\n </mat-card>\n </div>\n\n <!-- ─── Center: field canvas ─── -->\n <div class=\"deb-col deb-col--center\">\n <ngx-entity-builder-canvas />\n </div>\n\n <!-- ─── Right: inspector ─── -->\n <div class=\"deb-col deb-col--right\">\n <mat-card>\n <mat-card-header><mat-card-title>Field properties</mat-card-title></mat-card-header>\n <mat-card-content>\n <ngx-field-inspector></ngx-field-inspector>\n </mat-card-content>\n </mat-card>\n </div>\n</div>\n\n<!-- ─── Footer: JSON + optional live preview ─── -->\n<div class=\"deb-footer\">\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title><mat-icon>data_object</mat-icon> Config JSON</mat-panel-title>\n </mat-expansion-panel-header>\n <pre class=\"deb-json\">{{ json }}</pre>\n </mat-expansion-panel>\n\n <div class=\"deb-preview-slot\">\n <ng-content select=\"[ngxBuilderPreview]\"></ng-content>\n </div>\n</div>\n","// Main component\nexport * from './lib/entity-builder.component';\n\n// Sub-components (individually importable — reusability rule, mirrors ngx-dynamic-entity)\nexport * from './lib/components/field-palette.component';\nexport * from './lib/components/field-inspector.component';\nexport * from './lib/components/tab-manager.component';\nexport * from './lib/components/rule-form.component';\nexport * from './lib/components/field-rules-list.component';\nexport * from './lib/components/entity-reference-config.component';\nexport * from './lib/components/entity-builder-canvas.component';\nexport * from './lib/components/entity-builder-tree-node.component';\n\n// Store (provided per builder instance)\nexport * from './lib/builder-store.service';\n\n// Catalog + helpers\nexport * from './lib/field-catalog';\n\n// Re-export the core types a consumer of the builder needs\nexport type {\n EntityFormConfig,\n NestedTabConfig,\n NestedFieldConfig,\n RichFieldType,\n DropdownOption,\n EntityPermissions,\n EntityReferenceConfig,\n AutoPatchConfig,\n AutoPatchMapping,\n PatchOnTrueMapping,\n FormRule,\n RuleCondition,\n RuleAction,\n RuleOperator,\n} from '@dynamic-entity/core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i5","i6","i7","i8","i9","i3","i4","i2","i11","i1"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAGG;;ACHH;;;;;;;AAOG;AACG,SAAU,SAAS,CAAI,KAAQ,EAAA;IACnC,IAAI,OAAO,eAAe,KAAK,UAAU;AAAE,QAAA,OAAO,eAAe,CAAC,KAAK,CAAC;IACxE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM;AAC/C;;ACkBA,MAAM,KAAK,GAAG,SAAS;AAEvB,MAAM,UAAU,GAAG,0BAA0B;AAE7C;;;;;;AAMG;AACH,MAAM,oBAAoB,GAAG,mDAAmD;MAGnE,YAAY,CAAA;IACN,OAAO,GAAG,MAAM,CAAmB,IAAI,CAAC,WAAW,EAAE,CAAC;AACtD,IAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,CAAC;AAC9C,IAAA,eAAe,GAAG,MAAM,CAAS,IAAI,CAAC;;AAEtC,IAAA,MAAM,GAAG,MAAM,CAAa,EAAE,CAAC;AAChD;;;;AAIG;AACc,IAAA,SAAS,GAAG,IAAI,GAAG,EAAU;AAE7B,IAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,CAAC;AAElD;;;;;AAKG;AACc,IAAA,UAAU,GAAG,MAAM,CAAW,EAAE,CAAC;AAEzC,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAClC,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACpD,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AAClD,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAChC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AACpC,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAExC,IAAA,IAAI,GAAG,QAAQ,CAAoB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAEnE,IAAA,MAAM,GAAG,QAAQ,CAAsB,MAAK;QACnD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;AACjE,IAAA,CAAC,CAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAA2B,MAAK;AAC/D,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAClC,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,IAAI;AACpB,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AACtD,IAAA,CAAC,CAAC;AAEO,IAAA,QAAQ,GAAG,QAAQ,CAAmB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,MAAM,GAAG,QAAQ,CAAmB,MAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CACjD;AACQ,IAAA,OAAO,GAAG,QAAQ,CAAU,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;;AAItE,IAAA,IAAI,CAAC,MAAwB,EAAA;;QAE3B,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAChE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CACpH;AACD,QAAA,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE;YAC9B,OAAO,CAAC,IAAI,CACV,CAAA,sBAAA,EAAyB,CAAC,CAAC,EAAE,CAAA,4CAAA,EAA+C,CAAC,CAAC,QAAQ,CAAA,GAAA,CAAK;AACzF,gBAAA,CAAA,yCAAA,CAA2C,CAC9C;QACH;;;;QAKA,MAAM,IAAI,GAAG,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;QAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvE;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;;;AAItD,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9E,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEA,KAAK,CAAC,MAAM,GAAG,EAAE,EAAA;AACf,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC1C,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEQ,WAAW,CAAC,MAAM,GAAG,EAAE,EAAA;QAC7B,OAAO;YACL,MAAM;AACN,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,IAAI,EAAE,EAAE;SACT;IACH;;AAIA,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE;AAC9B,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,kBAAkB,CAAC,QAAgB,EAAA;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,KAAK,CAAC,eAAe,GAAG,QAAQ;AAClC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,IAAa,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACvB,QAAA,CAAC,CAAC;IACJ;IAEA,aAAa,CAAC,MAA+B,EAAE,KAAe,EAAA;AAC5D,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,WAAW,GAAsB,EAAE,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;AACvE,YAAA,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK;AAC3B,YAAA,KAAK,CAAC,WAAW,GAAG,WAAW;AACjC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,iBAAiB,CAAC,QAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;IACpC;;AAGA,IAAA,YAAY,CAAC,KAAe,EAAA;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC;;IAIQ,YAAY,CAAC,OAA0B,EAAE,EAAA;QAC/C,MAAM,IAAI,GAAwB,EAAE;AACpC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;YACpB,IAAI,CAAC,CAAC,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YACpC,IAAI,CAAC,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7D;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;;AAOG;IACK,WAAW,CAAC,OAA0B,EAAE,EAAA;QAC9C,MAAM,IAAI,GAAsB,EAAE;AAClC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5D;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;;AAOG;IACK,WAAW,CAAC,OAA0B,EAAE,EAAA;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;AAC7B,QAAA,MAAM,UAAU,GAAG,CAAC,MAAuC,KAAI;AAC7D,YAAA,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE;AAC5B,gBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACb,gBAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM;AAAE,oBAAA,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChD;AACF,QAAA,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AAAE,YAAA,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AAChE,QAAA,OAAO,GAAG;IACZ;AAEQ,IAAA,eAAe,CAAC,IAAA,GAA0B,EAAE,EAAE,EAAU,EAAA;AAC9D,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,CAAC,CAAC,MAAM,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7C,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;AACA,YAAA,IAAI,CAAC,CAAC,QAAQ,EAAE;AACd,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;AAClD,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,IAAI;IACb;;IAIA,QAAQ,CAAC,IAAmB,EAAE,WAAoB,EAAA;AAChD,QAAA,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,EAAE,QAAQ,IAAI,OAAO;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAEvE,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC;YACxE,MAAM,SAAS,GAAG;kBACd,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,WAAW;AAC7D,kBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE;AACzC,gBAAA,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9B;iBAAO;gBACL,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7B,QAAA,OAAO,EAAE;IACX;IAEA,WAAW,CAAC,EAAU,EAAE,KAAiC,EAAA;AACvD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAClD,YAAA,IAAI,KAAK;AAAE,gBAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;AACxC,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;AAKG;IACH,WAAW,CAAC,KAAa,EAAE,KAAa,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;AAC5B,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK;YAAE;AACnC,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE;AACxD,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE;AAEvD,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;AAChC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7B;;AAGA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B;AAEA;;;;;;;AAOG;IACK,WAAW,CAAC,KAAa,EAAE,KAAa,EAAA;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;AACrD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,KAAK,CAAC,EAAE,GAAG,KAAK;AAEhB,YAAA,MAAM,UAAU,GAAG,CAAC,MAAuC,KAAI;AAC7D,gBAAA,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE;oBAC5B,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE;wBACrC,MAAM,IAAI,GAA4B,EAAE;;AAExC,wBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE;AACrD,4BAAA,IAAI,CAAC,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK;wBAC3C;AACA,wBAAA,CAAC,CAAC,QAAQ,GAAG,IAAI;oBACnB;oBACA,IAAI,CAAC,CAAC,eAAe,EAAE,WAAW,KAAK,KAAK,EAAE;AAC5C,wBAAA,CAAC,CAAC,eAAe,GAAG,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE;oBAClE;AACA,oBAAA,IAAI,CAAC,CAAC,SAAS,EAAE;;wBAEf,CAAC,CAAC,SAAS,GAAG;4BACZ,GAAG,CAAC,CAAC,SAAS;AACd,4BAAA,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAClC,CAAC,CAAC,MAAM,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CACjD;yBACF;oBACH;AACA,oBAAA,IAAI,CAAC,CAAC,WAAW,EAAE;AACjB,wBAAA,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK;AACtC,4BAAA,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,IAAI;AACvC,4BAAA,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,EAAE;AAClC,yBAAA,CAAC,CAAC;oBACL;AACA,oBAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM;AAAE,wBAAA,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAChD;AACF,YAAA,CAAC;AACD,YAAA,MAAM,QAAQ,GAAG,CAAC,IAAmC,KAAI;AACvD,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE;AAC5B,oBAAA,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AACtB,oBAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACxB;AACF,YAAA,CAAC;AACD,YAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AACtB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IACtB,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;AACjB,YAAA,GAAG,IAAI;AACP,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,OAAO;AACtD,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IACzB,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAC/D;SACF,CAAC,CAAC,CACJ;AAED,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,KAAK;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;IACzE;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AAC9C,gBAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,oBAAA,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;gBAClD;YACF;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACrE;AAEA,IAAA,cAAc,CAAC,EAAU,EAAA;;;;AAIvB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AAC5D,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACxB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;AAC1C,QAAA,MAAM,MAAM,GAAG,IAAI,EAAE,QAAQ,IAAI,OAAO;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAE1E,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAC9C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC5D,gBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,oBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;AAC1B,oBAAA,IAAI,CAAC,EAAE,GAAG,KAAK;AACf,oBAAA,GAAG,CAAC,MAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;oBACtC;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,OAAO,KAAK;IACd;IAEA,SAAS,CAAC,EAAU,EAAE,SAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AAC9C,gBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE;AAC/B,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC/C,gBAAA,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE;AACf,oBAAA,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS;oBAC3B,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM;wBAAE;AACnC,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBACrC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;oBAC1B;gBACF;YACF;AACF,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,YAAY,CAAC,SAAiB,EAAE,OAAe,EAAE,KAAc,EAAA;AAC7D,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;YAClB,MAAM,SAAS,GAAG;kBACd,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK;AACvD,kBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAA,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI,EAAE;YACtC,IACE,SAAS,GAAG,CAAC;AACb,gBAAA,OAAO,GAAG,CAAC;gBACX,SAAS,IAAI,MAAM,CAAC,MAAM;AAC1B,gBAAA,OAAO,IAAI,MAAM,CAAC,MAAM,EACxB;gBACA;YACF;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,EAAiB,EAAA;AAC3B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B;;AAIA;;;;;;;;;;;AAWG;AACH,IAAA,aAAa,CAAC,EAAU,EAAE,QAAgB,EAAE,KAAa,EAAA;AACvD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAClD,YAAA,IAAI,KAAK;AAAE,gBAAA,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,GAAG,KAAK,EAAE;AAChE,QAAA,CAAC,CAAC;QAEF,IAAI,QAAQ,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,eAAe,IAAI,IAAI,CAAC;YAAE;AAC3D,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE;AAE5B,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,EAAE;YAAE;AAEhC,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrD;;IAGQ,WAAW,CAAC,OAAe,EAAE,SAAiB,EAAA;AACpD,QAAA,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;AAClG,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,OAAO;QAEvC,IAAI,CAAC,GAAG,CAAC;QACT,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;YAAE,CAAC,IAAI,CAAC;AAC3C,QAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,CAAC,EAAE;IAC1B;AAEA,IAAA,mBAAmB,CAAC,EAAU,EAAE,QAAgB,EAAE,KAAa,EAAA;AAC7D,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAClD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,KAAK,CAAC,WAAW,GAAG,EAAE,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG,KAAK,EAAE;AACzE,QAAA,CAAC,CAAC;IACJ;;AAIA,IAAA,mBAAmB,CAAC,EAAU,EAAE,SAAwB,EAAE,EAAW,EAAA;AACnE,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAClD,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE;AACzC,YAAA,IAAI,SAAS,KAAK,UAAU,EAAE;AAC5B,gBAAA,IAAI,EAAE;AAAE,oBAAA,KAAK,CAAC,UAAU,CAAC,QAAQ,GAAG,IAAI;;AACnC,oBAAA,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ;YACvC;AAAO,iBAAA,IAAI,SAAS,KAAK,OAAO,EAAE;;;;AAIhC,gBAAA,IAAI,EAAE;AAAE,oBAAA,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI;;AAChC,oBAAA,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK;;AAElC,gBAAA,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,KAAK,oBAAoB;AAAE,oBAAA,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO;YACxF;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,iBAAiB,CAAC,EAAU,EAAE,SAAyB,EAAE,KAAoB,EAAA;AAC3E,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAClD,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE;AACzC,YAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AAChE,gBAAA,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;YACpC;iBAAO;AACL,gBAAA,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,KAAK;YACrC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,iBAAiB,CAAC,KAAwB,EAAE,SAAyB,EAAA;QACnE,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;AACzC,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,IAAI;IAC7C;IAEA,gBAAgB,CAAC,KAAwB,EAAE,SAAwB,EAAA;QACjE,IAAI,SAAS,KAAK,UAAU;AAAE,YAAA,OAAO,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ;AACjE,QAAA,IAAI,SAAS,KAAK,OAAO,EAAE;;;;AAIzB,YAAA,OAAO,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,OAAO,KAAK,oBAAoB;QACxF;AACA,QAAA,OAAO,KAAK;IACd;;AAIA;;;;;;;AAOG;AACH,IAAA,eAAe,CAAC,KAAoC,EAAA;AAClD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,MAAM;;;;AAIzB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,QAAQ;AACjD,QAAA,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;AAAE,YAAA,OAAO,QAAQ;AACvD,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;AAMG;IACH,kBAAkB,CAAC,OAAe,EAAE,MAAoC,EAAA;AACtE,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,IAAI,MAAM,KAAK,QAAQ,EAAE;gBACvB,OAAO,KAAK,CAAC,QAAQ;AACrB,gBAAA,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,EAAE;YAC5D;AAAO,iBAAA,IAAI,MAAM,KAAK,QAAQ,EAAE;gBAC9B,OAAO,KAAK,CAAC,OAAO;gBACpB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE;YACvC;iBAAO;gBACL,OAAO,KAAK,CAAC,OAAO;gBACpB,OAAO,KAAK,CAAC,QAAQ;YACvB;AACF,QAAA,CAAC,CAAC;IACJ;;IAGA,WAAW,CAAC,OAAe,EAAE,QAAgB,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE;YAC/B,IAAI,OAAO,EAAE;AACX,gBAAA,KAAK,CAAC,QAAQ,GAAG,OAAO;;gBAExB,OAAO,KAAK,CAAC,OAAO;YACtB;iBAAO;AACL,gBAAA,KAAK,CAAC,QAAQ,GAAG,EAAE;YACrB;AACF,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,mBAAmB,CAAC,OAAe,EAAE,eAAuB,EAAE,WAA8B,EAAA;AAC1F,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,KAAK,CAAC,YAAY,GAAG,IAAI;AACzB,YAAA,KAAK,CAAC,mBAAmB,GAAG,eAAe;AAC3C,YAAA,KAAK,CAAC,iBAAiB,GAAG,WAAW,CAAC,EAAE;AACxC,YAAA,KAAK,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,WAAW,CAAC;AAC3D,YAAA,KAAK,CAAC,QAAQ,GAAG,KAAK;;YAEtB,IAAI,WAAW,CAAC,KAAK;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;YAC7D,IAAI,WAAW,CAAC,IAAI;AAAE,gBAAA,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI;YACnD,IAAI,WAAW,CAAC,UAAU;gBAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC;YAC5E,IAAI,WAAW,CAAC,OAAO;gBAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;AACrE,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,qBAAqB,CAAC,OAAe,EAAA;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,OAAO,KAAK,CAAC,YAAY;YACzB,OAAO,KAAK,CAAC,mBAAmB;YAChC,OAAO,KAAK,CAAC,iBAAiB;YAC9B,OAAO,KAAK,CAAC,kBAAkB;YAC/B,OAAO,KAAK,CAAC,QAAQ;AACvB,QAAA,CAAC,CAAC;IACJ;;IAGA,mBAAmB,CAAC,OAAe,EAAE,kBAAqC,EAAA;AACxE,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY;gBAAE;AACnC,YAAA,KAAK,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC;AAClE,YAAA,KAAK,CAAC,QAAQ,GAAG,KAAK;YACtB,IAAI,kBAAkB,CAAC,KAAK;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAC3E,IAAI,kBAAkB,CAAC,IAAI;AAAE,gBAAA,KAAK,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI;YACjE,IAAI,kBAAkB,CAAC,UAAU;gBAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC;YAC1F,IAAI,kBAAkB,CAAC,OAAO;gBAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC;AACnF,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,UAAU,CAAC,aAA+C,EAAA;AACxD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,UAAU,GAAG,CAAC,MAA2B,KAAI;AACjD,gBAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AACtB,oBAAA,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,iBAAiB,EAAE;wBAClE,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC;wBACzD,MAAM,WAAW,GAAG;AAClB,8BAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,iBAAiB;8BACjE,SAAS;wBACb,CAAC,CAAC,QAAQ,GAAG,iBAAiB,CAAC,CAAC,EAAE,WAAW,IAAI,SAAS,CAAC;oBAC7D;AACA,oBAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM;AAAE,wBAAA,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAChD;AACF,YAAA,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE;AAClC,gBAAA,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM;AAAE,oBAAA,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;YAChD;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,OAAe,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE;AACnC,YAAA,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;AAC5B,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI;AAC1C,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAA,OAAA,EAAU,CAAC,CAAA,CAAE,EAAE,CAAC;AACvC,YAAA,KAAK,CAAC,OAAO,GAAG,OAAO;;YAEvB,OAAO,KAAK,CAAC,QAAQ;AACvB,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,YAAY,CAAC,OAAe,EAAE,KAAa,EAAE,KAAqB,EAAA;AAChE,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YACvD,MAAM,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;AACtC,YAAA,IAAI,CAAC,MAAM;gBAAE;AACb,YAAA,KAAK,CAAC,OAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE;AACjD,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;AAKG;AACH,IAAA,cAAc,CAAC,OAAe,EAAE,KAAa,EAAE,QAAgB,EAAE,KAAa,EAAA;AAC5E,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YACvD,MAAM,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;AACtC,YAAA,IAAI,CAAC,MAAM;gBAAE;AACb,YAAA,KAAK,CAAC,OAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,QAAQ,GAAG,KAAK,EAAE;AAC1D,QAAA,CAAC,CAAC;IACJ;IAEA,YAAY,CAAC,OAAe,EAAE,KAAa,EAAA;AACzC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YACvD,IAAI,CAAC,KAAK,EAAE,OAAO;gBAAE;YACrB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AAC7D,QAAA,CAAC,CAAC;IACJ;;;IAKA,qBAAqB,CAAC,OAAe,EAAE,KAAqC,EAAA;AAC1E,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,MAAM,IAAI,GAA0B;gBAClC,IAAI,KAAK,CAAC,eAAe,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC/C,gBAAA,GAAG,KAAK;AACR,gBAAA,OAAO,EAAE,IAAI;aACd;;YAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAoC,EAAE;AACvE,gBAAA,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS;AAAE,oBAAA,OAAO,IAAI,CAAC,GAAG,CAAC;YAChD;AACA,YAAA,KAAK,CAAC,eAAe,GAAG,IAAI;AAC9B,QAAA,CAAC,CAAC;IACJ;;AAIA,IAAA,mBAAmB,CAAC,OAAe,EAAA;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;YACvE,MAAM,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACnF,KAAK,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAC3C,QAAA,CAAC,CAAC;IACJ;IAEA,qBAAqB,CAAC,OAAe,EAAE,SAAiB,EAAA;AACtD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YACvD,IAAI,CAAC,KAAK,EAAE,SAAS;gBAAE;YACvB,KAAK,CAAC,SAAS,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE;AACrD,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,sBAAsB,CAAC,OAAe,EAAE,KAAa,EAAE,KAAgC,EAAA;AACrF,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YACvD,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAC;gBAAE;YAC1C,KAAK,CAAC,SAAS,GAAG;gBAChB,GAAG,KAAK,CAAC,SAAS;AAClB,gBAAA,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;aACzF;AACH,QAAA,CAAC,CAAC;IACJ;;IAGA,sBAAsB,CAAC,OAAe,EAAE,KAAa,EAAA;AACnD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YACvD,IAAI,CAAC,KAAK,EAAE,SAAS;gBAAE;YACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AACvE,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,SAAS;;gBAC5C,KAAK,CAAC,SAAS,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE;AACzD,QAAA,CAAC,CAAC;IACJ;;AAIA,IAAA,qBAAqB,CAAC,OAAe,EAAA;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC1E,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,wBAAwB,CAAC,OAAe,EAAE,KAAa,EAAE,KAAkC,EAAA;AACzF,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAAC;gBAAE;AAClC,YAAA,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7F,QAAA,CAAC,CAAC;IACJ;IAEA,wBAAwB,CAAC,OAAe,EAAE,KAAa,EAAA;AACrD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YACvD,IAAI,CAAC,KAAK,EAAE,WAAW;gBAAE;AACzB,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AAChE,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,WAAW;;AAC9C,gBAAA,KAAK,CAAC,WAAW,GAAG,QAAQ;AACnC,QAAA,CAAC,CAAC;IACJ;;;IAKA,WAAW,CAAC,OAAe,EAAE,QAA6C,EAAA;AACxE,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACvD,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,QAAQ;;AACrE,gBAAA,KAAK,CAAC,QAAQ,GAAG,QAAQ;AAChC,QAAA,CAAC,CAAC;IACJ;;;AAKS,IAAA,qBAAqB,GAAG,QAAQ,CAAa,MAAK;AACzD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAClC,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,EAAE;AAClB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACxF,IAAA,CAAC,CAAC;AAEF,IAAA,SAAS,CAAC,KAAiB,EAAA;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B;AAEA,IAAA,OAAO,CAAC,IAAc,EAAA;AACpB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC/D,QAAA,OAAO,EAAE;IACX;IAEA,UAAU,CAAC,EAAU,EAAE,KAAwB,EAAA;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAChG;AAEA,IAAA,UAAU,CAAC,EAAU,EAAA;QACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D;IAEA,UAAU,CAAC,EAAU,EAAE,OAAgB,EAAA;QACrC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;IAClC;;IAGA,QAAQ,CAAC,EAAU,EAAE,SAAiB,EAAA;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAG;AACzB,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;AACvB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YAC7C,IAAI,IAAI,KAAK,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;AAC7B,YAAA,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS;YAC3B,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,KAAK;AAC7C,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxD,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC7B;;IAIA,MAAM,GAAA;;;;AAIJ,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;AAC5C,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAClE,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,EAAE;IACX;;IAGQ,SAAS,GAAA;QACf,MAAM,GAAG,GAAa,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,CAAC,IAAmC,KAAI;AACtD,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE;AAC1B,gBAAA,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACd,gBAAA,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YACrB;AACF,QAAA,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;AAC5B,QAAA,OAAO,GAAG;IACZ;AAEA,IAAA,SAAS,CAAC,QAAgB,EAAA;AACxB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;YAClB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;YAC5C,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE;AACvC,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI;gBAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAC7E;AACF,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,WAAW,GAAG,CAAC,IAAuB,KAAI;AAC9C,gBAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;oBACpB,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,KAAK,KAAK;oBAC/B,IAAI,CAAC,CAAC,QAAQ;AAAE,wBAAA,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACzC;AACF,YAAA,CAAC;AACD,YAAA,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,CAAC,EAAU,EAAE,KAA+B,EAAA;AACnD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;YAClB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AACnC,YAAA,IAAI,GAAG;AAAE,gBAAA,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,EAAU,EAAE,QAAgB,EAAE,KAAa,EAAA;AACrD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;YAClB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AACnC,YAAA,IAAI,GAAG;AAAE,gBAAA,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,GAAG,KAAK,EAAE;AAC1D,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,EAAU,EAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,eAAe,GAAG,CAAC,IAAuB,KAAuB;AACrE,gBAAA,OAAO;qBACJ,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;AACvB,qBAAA,GAAG,CAAC,CAAC,KAAK;AACT,oBAAA,GAAG,CAAC;AACJ,oBAAA,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,SAAS;AAC/D,iBAAA,CAAC,CAAC;AACP,YAAA,CAAC;YACD,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;AAChD,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,CAAC,EAAU,EAAE,SAAiB,EAAA;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAG;AAClB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE;AAC7B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YAC7C,IAAI,IAAI,KAAK,CAAC,CAAC;gBAAE;AACjB,YAAA,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS;YAC3B,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM;gBAAE;AACjC,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;AAC1B,QAAA,CAAC,CAAC;IACJ;;IAIA,YAAY,GAAA;AACV,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9B;;AAIQ,IAAA,MAAM,CAAC,EAAqC,EAAA;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE;QAC7B,EAAE,CAAC,KAAK,CAAC;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;IAEQ,QAAQ,CAAC,MAAc,EAAE,KAAkB,EAAA;QACjD,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,IAAI,SAAS,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAC,EAAE;AAChC,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YAC3B,CAAC,IAAI,CAAC;AACN,YAAA,SAAS,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAC,EAAE;QAC9B;AACA,QAAA,OAAO,SAAS;IAClB;AAEQ,IAAA,QAAQ,CAAC,MAAwB,EAAA;QACvC,MAAM,QAAQ,GAAqB,EAAE;AAErC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;QACxE;aAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC1C,QAAQ,CAAC,IAAI,CAAC;AACZ,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,OAAO,EACL,uGAAuG;AAC1G,aAAA,CAAC;QACJ;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;AAChD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC;QAChF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC3C,QAAQ,CAAC,IAAI,CAAC;AACZ,oBAAA,KAAK,EAAE,OAAO;AACd,oBAAA,OAAO,EAAE,CAAA,UAAA,EAAa,KAAK,CAAC,EAAE,CAAA,4BAAA,CAA8B;oBAC5D,OAAO,EAAE,KAAK,CAAC,EAAE;AAClB,iBAAA,CAAC;YACJ;AAEA,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACnF,IAAI,CAAC,QAAQ,EAAE;gBACb,QAAQ,CAAC,IAAI,CAAC;AACZ,oBAAA,KAAK,EAAE,SAAS;AAChB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,KAAK,CAAC,EAAE,CAAA,eAAA,CAAiB;oBAC5C,OAAO,EAAE,KAAK,CAAC,EAAE;AAClB,iBAAA,CAAC;YACJ;YAEA,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;;;YAGzC,IAAI,IAAI,EAAE,UAAU,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBAC1D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC1B,QAAQ,CAAC,IAAI,CAAC;AACZ,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,KAAK,CAAC,EAAE,CAAA,uDAAA,CAAyD;wBACpF,OAAO,EAAE,KAAK,CAAC,EAAE;AAClB,qBAAA,CAAC;gBACJ;YACF;AAAO,iBAAA,IAAI,IAAI,EAAE,UAAU,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;gBAC7E,QAAQ,CAAC,IAAI,CAAC;AACZ,oBAAA,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,UAAU,KAAK,CAAC,EAAE,CAAA,OAAA,EAAU,KAAK,CAAC,IAAI,CAAA,oBAAA,CAAsB;oBACrE,OAAO,EAAE,KAAK,CAAC,EAAE;AAClB,iBAAA,CAAC;YACJ;QACF;;;;;;AAOA,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAC1C,QAAA,MAAM,QAAQ,GAAG,CAAC,MAAuC,KAAI;AAC3D,YAAA,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE;gBAC5B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM;AAAE,oBAAA,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC9C;AACF,QAAA,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;AAAE,YAAA,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QAErE,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE;AAClC,YAAA,IAAI,KAAK,GAAG,CAAC,EAAE;gBACb,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAA,GAAA,EAAM,KAAK,CAAA,GAAA,CAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACpG;QACF;AAEA,QAAA,OAAO,QAAQ;IACjB;wGA1/BW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAZ,YAAY,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;AC5BD;;;;;;AAMG;MAsMU,8BAA8B,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAE5B,IAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;;AAGhC,IAAA,gBAAgB,GAAG,QAAQ,CAAsB,MAAK;AACvE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC;AAC9D,IAAA,CAAC,CAAC;AAEe,IAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI,CAAC;AAC7C,IAAA,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;AAE3D,IAAA,GAAG,CAAC,KAAwB,EAAA;QACpC,OAAO,KAAK,CAAC,eAAe,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACnD;IAEU,QAAQ,CAAC,KAAwB,EAAE,KAA8B,EAAA;QACzE,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC;IACnD;AAEU,IAAA,UAAU,CAAC,KAAwB,EAAA;AAC3C,QAAA,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;IAC/D;AAEU,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC;QACvD,OAAO,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,KAAK;IAC3E;AAEU,IAAA,iBAAiB,CAAC,KAAwB,EAAA;AAClD,QAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,aAAa,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;IACzD;IAEU,gBAAgB,CAAC,KAAwB,EAAE,KAAa,EAAA;QAChE,MAAM,KAAK,GAAG;aACX,KAAK,CAAC,GAAG;aACT,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;aACjB,MAAM,CAAC,OAAO,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;IAC3E;AAEU,IAAA,WAAW,CAAC,KAAwB,EAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO;AACvC,QAAA,OAAO,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE;IAC/C;;IAGU,UAAU,CAAC,KAAwB,EAAE,KAAa,EAAA;AAC1D,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;QAC5B,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAC5C;QACF;AACA,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAClC,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC1E,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,gCAAgC,CAAC;gBAC5D;YACF;AACA,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAiC,EAAE,CAAC;QACtE;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC;QAC7C;IACF;wGAnEW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvL/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsJT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhKC,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,kIAChB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,oBAAoB,8BACpB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAyLP,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBArM1C,SAAS;+BACE,6BAA6B,EAAA,UAAA,EAC3B,IAAI,EAAA,OAAA,EACP;wBACP,WAAW;wBACX,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,oBAAoB;wBACpB,gBAAgB;qBACjB,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsJT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,gTAAA,CAAA,EAAA;;;AC9KH;;AAEG;MA0HU,iBAAiB,CAAA;AACnB,IAAA,IAAI,GAAa;AACxB,QAAA,YAAY,EAAE,QAAQ;AACtB,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACpE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE;AAC5C,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,QAAQ,EAAE,CAAC;KACZ;AAES,IAAA,IAAI,GAAG,IAAI,YAAY,EAAY;AACnC,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAElC,IAAA,SAAS,GAAmB;QACnC,OAAO;QACP,WAAW;QACX,UAAU;QACV,cAAc;QACd,aAAa;QACb,WAAW;QACX,UAAU;QACV,cAAc;QACd,WAAW;QACX,WAAW;QACX,iBAAiB;QACjB,iBAAiB;QACjB,aAAa;QACb,YAAY;QACZ,IAAI;QACJ,QAAQ;QACR,WAAW;QACX,eAAe;KAChB;IAED,YAAY,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnF;AAEA,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC;wGAzCW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7GlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0gBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EArEC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA+GN,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAzH7B,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;qBAChB,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,0gBAAA,CAAA,EAAA;8BAiDQ,IAAI,EAAA,CAAA;sBAAZ;gBAUS,IAAI,EAAA,CAAA;sBAAb;gBACS,MAAM,EAAA,CAAA;sBAAf;;;ACzIH;;;AAGG;MAkIU,uBAAuB,CAAA;AACf,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;;AAG5B,IAAA,OAAO,GAAG,MAAM,CAAkB,IAAI,CAAC;IAEhD,WAAW,GAAA;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;AAC5C,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YACf,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,QAAQ;YACpD,OAAO;AACP,YAAA,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACpE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE;YAC5C,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzC,YAAA,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC;AACxC,SAAA,CAAC;IACJ;AAEU,IAAA,SAAS,CAAC,IAAc,EAAA;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC;AAEU,IAAA,MAAM,CAAC,IAAc,EAAA;QAC7B,IAAI,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;;AAC5C,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;;AAGU,IAAA,SAAS,CAAC,IAAc,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC;aACf,GAAG,CAAC,CAAC,IAAG;YACP,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,KAAK,OAAO,GAAG,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AACxF,YAAA,OAAO,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAA,CAAA,EAAI,GAAG,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE;AAC5C,QAAA,CAAC;aACA,IAAI,CAAC,OAAO,CAAC;QAEhB,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK;AACnB,cAAE,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK;AACrD,kBAAE;AACF,kBAAE;AACJ,cAAE,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;QAEjD,OAAO,CAAA,EAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE;IAC9C;wGA/CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7HxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8ET,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,okBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA/ES,eAAe,wUAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,+TAAE,iBAAiB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA8HxF,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAjInC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAC1F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8ET,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,okBAAA,CAAA,EAAA;;;MCRU,8BAA8B,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;IAC5B,YAAY,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAA+B;AAC5F,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAE3D,gBAAgB,CAAC,KAAwB,EAAE,OAAgB,EAAA;QACnE,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAC1D;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C;IACF;IAEU,eAAe,CAAC,KAAwB,EAAE,GAAW,EAAA;AAC7D,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC;AAC/E,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IACnC;IAEU,aAAa,CAAC,KAAwB,EAAE,OAAe,EAAA;AAC/D,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC;AAC7E,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IACnC;IAEU,MAAM,cAAc,CAAC,KAAwB,EAAA;AACrD,QAAA,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAClF,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC;AACjF,QAAA,IAAI,CAAC,YAAY;YAAE;AAEnB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,iBAAiB,CAAC;QACpF,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC;QACvD;IACF;AAEA;;;;;AAKG;IACK,MAAM,kBAAkB,CAAC,OAAe,EAAA;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC;QACjE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AACnG,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAC7E,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,GAAG,YAAY,EAAE,CAAC;QAClE;IACF;IAEQ,SAAS,CAAC,IAAW,EAAE,EAAU,EAAA;AACvC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;YACpB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE;AAC9B,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;AAAE,oBAAA,OAAO,CAAC;AACzB,gBAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE;AACtB,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;AAChD,oBAAA,IAAI,GAAG;AAAE,wBAAA,OAAO,GAAG;gBACrB;YACF;QACF;AACA,QAAA,OAAO,SAAS;IAClB;IAEQ,eAAe,CAAC,MAA2B,EAAE,EAAU,EAAA;AAC7D,QAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AACtB,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;AAAE,gBAAA,OAAO,CAAC;AACzB,YAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE;AACtB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;AAChD,gBAAA,IAAI,GAAG;AAAE,oBAAA,OAAO,GAAG;YACrB;QACF;AACA,QAAA,OAAO,SAAS;IAClB;wGAzEW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9D/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EArEC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,0WACd,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAgEX,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBA3E1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,oBAAoB;AACrB,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DT,EAAA,CAAA;AACF,iBAAA;;;ACpED;;AAEG;MAuEU,uBAAuB,CAAA;AACf,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAE5B,IAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;AAChC,IAAA,IAAI,GAAG,QAAQ,CAA4B,MAAK;AACjE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS;AACjD,IAAA,CAAC,CAAC;IAEQ,IAAI,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;IACpC;AAGU,IAAA,KAAK,CAAC,KAAc,EAAA;QAC5B,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AACtE,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AACvB,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;IACnC;AAEU,IAAA,UAAU,CAAC,KAAwB,EAAA;QAC3C,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C;AAEU,IAAA,gBAAgB,CAAC,KAAwB,EAAA;QACjD,OAAO,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrD;AAEU,IAAA,WAAW,CAAC,MAAsB,EAAA;QAC1C,OAAO,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAChD;;AAIU,IAAA,eAAe,CAAC,KAAwB,EAAA;QAChD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM;YACjE,GAAG;AACH,YAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AACvC,SAAA,CAAC,CAAC;IACL;AAEU,IAAA,WAAW,CAAC,KAAwB,EAAA;AAC5C,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;QAC1C,IAAI,GAAG,GAAG,OAAO;QACjB,IAAI,CAAC,GAAG,CAAC;QACT,OAAO,GAAG,IAAI,IAAI;AAAE,YAAA,GAAG,GAAG,CAAA,MAAA,EAAS,EAAE,CAAC,EAAE;AACxC,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;QAChB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC;IACxC;AAEU,IAAA,cAAc,CAAC,KAAwB,EAAE,MAAc,EAAE,MAAc,EAAA;AAC/E,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE;AAC7B,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM;YAAE;AACpC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE;QACpC,IAAI,OAAO,IAAI,OAAO;YAAE;QACxB,MAAM,IAAI,GAA4B,EAAE;;AAExC,QAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;AAAE,YAAA,IAAI,CAAC,CAAC,KAAK,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;QAClF,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC;IACxC;AAEU,IAAA,gBAAgB,CAAC,KAAwB,EAAE,GAAW,EAAE,GAAW,EAAA;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IACjG;IAEU,cAAc,CAAC,KAAwB,EAAE,GAAW,EAAA;AAC5D,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;AAC1C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC;IACxC;AAEA;;;AAGG;AACK,IAAA,aAAa,CAAC,GAAW,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE;QAC1B,IAAI,OAAO,KAAK,MAAM;AAAE,YAAA,OAAO,IAAI;QACnC,IAAI,OAAO,KAAK,OAAO;AAAE,YAAA,OAAO,KAAK;QACrC,IAAI,OAAO,KAAK,MAAM;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,OAAO,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC;AAC5E,QAAA,OAAO,GAAG;IACZ;AAEQ,IAAA,iBAAiB,CAAC,KAAc,EAAA;QACtC,IAAI,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,MAAM;QACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC3D,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;wGAxFW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5FpC,0qVAwQA,EAAA,MAAA,EAAA,CAAA,wmBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9OI,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,8BAA8B,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,uBAAuB,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,8BAA8B,EAAA,QAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,CAAA;;4FAsDrB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAtEnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP;wBACP,WAAW;wBACX,eAAe;wBACf,iBAAiB;wBACjB,gBAAgB;wBAChB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,oBAAoB;wBACpB,gBAAgB;wBAChB,8BAA8B;wBAC9B,uBAAuB;wBACvB,8BAA8B;AAC/B,qBAAA,EAAA,QAAA,EAAA,0qVAAA,EAAA,MAAA,EAAA,CAAA,wmBAAA,CAAA,EAAA;;;AEhCH;;AAEG;MA+DU,qBAAqB,CAAA;IACvB,OAAO,GAA6B,kBAAkB;AAErD,IAAA,IAAI,GAAG,IAAI,YAAY,EAAiB;wGAHvC,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1DtB;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uwBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjBS,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA2D/C,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA9DjC,SAAS;+BACE,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,QAAA,EACjD;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,uwBAAA,CAAA,EAAA;8BA6CS,IAAI,EAAA,CAAA;sBAAb;;;AClDH;;AAEG;MAkNU,mBAAmB,CAAA;AACX,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;IAC9B,uBAAuB,GAAG,MAAM,CAA+B,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAElH,IAAI,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;IACpC;AAEU,IAAA,QAAQ,CAAC,GAAoB,EAAA;QACrC,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C;AAEU,IAAA,UAAU,CAAC,GAAoB,EAAA;QACvC,IAAI,CAAC,GAAG,CAAC,aAAa;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;;;;YAIhC,OAAO,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC7D;AACA,QAAA,OAAO,IAAI;IACb;wGArBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApMpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8IT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uuBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAvJC,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,oBAAoB,8BACpB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAsMP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAjN/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP;wBACP,WAAW;wBACX,eAAe;wBACf,iBAAiB;wBACjB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,oBAAoB;wBACpB,gBAAgB;qBACjB,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8IT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,uuBAAA,CAAA,EAAA;;;MCvGU,8BAA8B,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAEpB,IAAA,KAAK;AACL,IAAA,KAAK;AACL,IAAA,UAAU;AAE3B,IAAA,cAAc,CAAC,IAAY,EAAA;QACnC,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI;IAC9C;AAEU,IAAA,aAAa,CAAC,IAAY,EAAA;QAClC,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,cAAc;IACvD;AAEU,IAAA,UAAU,CAAC,KAAkC,EAAA;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,QAAA,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE;IACpD;wGAlBW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5D/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEU,8BAA8B,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAlEvC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,mlBACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA8DP,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAtE1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,gBAAgB;AACjB,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DT,EAAA,CAAA;AACF,iBAAA;8BAI4B,KAAK,EAAA,CAAA;sBAA/B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,KAAK,EAAA,CAAA;sBAA/B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,UAAU,EAAA,CAAA;sBAApC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;MCzCd,4BAA4B,CAAA;AACpB,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAErC,IAAA,MAAM,CAAC,KAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;IAClE;wGALW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1B7B;;;;;;;;;;;;;;;;;;;;;;;;GAwBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA9BC,YAAY,8BACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,kDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,sLACb,8BAA8B,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA4BrB,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBApCxC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,cAAc;wBACd,aAAa;wBACb,aAAa;wBACb,8BAA8B;AAC/B,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA;AACF,iBAAA;;;ACND;AACA,MAAM,YAAY,GAAgC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;AAE5E;AACA,MAAM,WAAW,GAAsB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAExD;;AAEG;MA2BU,sBAAsB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;;AAGtC,IAAA,MAAM;;AAEN,IAAA,SAAS,GAAa,CAAC,IAAI,CAAC;;IAE5B,cAAc,GAAa,EAAE;AACtC;;;;AAIG;IACM,SAAS,GAAa,EAAE;;IAExB,aAAa,GAAiC,cAAc;;AAG3D,IAAA,YAAY,GAAG,IAAI,YAAY,EAAoB;;AAEnD,IAAA,IAAI,GAAG,IAAI,YAAY,EAAoB;IAElC,WAAW,GAAG,YAAY;AAE7C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACxF;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE;YAC3F,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACxC,iBAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAChE;QACA,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvF;AACA,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC;IACF;;AAIU,IAAA,MAAM,CAAC,KAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;IAClE;AAEU,IAAA,cAAc,CAAC,IAAY,EAAA;QACnC,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI;IAC9C;AAEU,IAAA,aAAa,CAAC,IAAY,EAAA;QAClC,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,cAAc;IACvD;AAEU,IAAA,UAAU,CAAC,KAAkC,EAAA;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,QAAA,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE;IACpD;;IAIU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;IAC3C;AAEA,IAAA,IAAc,IAAI,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D;IAEU,QAAQ,GAAA;QAChB,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,SAAS,EAAE;YAC3D,KAAK,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/C;IACF;;AAIU,IAAA,QAAQ,CAAC,MAA+B,EAAA;;;AAGhD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,WAAW;IACjE;IAEU,QAAQ,CAAC,MAA+B,EAAE,KAAe,EAAA;QACjE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;IACzC;;IAGU,gBAAgB,CAAC,MAA+B,EAAE,IAAY,EAAA;QACtE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,IAAI,GAAG,CACL;aACG,KAAK,CAAC,GAAG;aACT,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AACjB,aAAA,MAAM,CAAC,OAAO,CAAC,CACnB,CACF;QACD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;IACzC;wGArGW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,0QAvBtB,CAAC,YAAY,CAAC,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjD3B,+8JAqIA,EAAA,MAAA,EAAA,CAAA,0tGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlFI,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,cAAc,8BACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,kDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,iBAAiB,8BACjB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,0WACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,gBAAgB,+TAChB,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,uBAAuB,gEACvB,4BAA4B,EAAA,QAAA,EAAA,2BAAA,EAAA,CAAA,EAAA,CAAA;;4FAKnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA1BlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,SAAA,EACL,CAAC,YAAY,CAAC,EAAA,OAAA,EAChB;wBACP,WAAW;wBACX,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,iBAAiB;wBACjB,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,oBAAoB;wBACpB,gBAAgB;wBAChB,gBAAgB;wBAChB,qBAAqB;wBACrB,mBAAmB;wBACnB,uBAAuB;wBACvB,4BAA4B;AAC7B,qBAAA,EAAA,QAAA,EAAA,+8JAAA,EAAA,MAAA,EAAA,CAAA,0tGAAA,CAAA,EAAA;wDAQQ,MAAM,EAAA,CAAA;sBAAd;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,cAAc,EAAA,CAAA;sBAAtB;gBAMQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,aAAa,EAAA,CAAA;sBAArB;gBAGS,YAAY,EAAA,CAAA;sBAArB;gBAES,IAAI,EAAA,CAAA;sBAAb;;;AE7FH;;ACAA;;AAEG;;;;"}
|