@openmfp/ngx 0.14.10 → 0.15.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.
@@ -1 +1 @@
1
- {"version":3,"file":"openmfp-ngx.mjs","sources":["../../../projects/ngx/declarative-ui/table/utils/rules.engine.ts","../../../projects/ngx/declarative-ui/table/utils/resource-field-by-path.ts","../../../projects/ngx/declarative-ui/table/utils/field-definition.utils.ts","../../../projects/ngx/declarative-ui/resource-field/boolean-value/boolean-cell.constants.ts","../../../projects/ngx/declarative-ui/resource-field/boolean-value/boolean-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/boolean-value/boolean-value.component.html","../../../projects/ngx/declarative-ui/resource-field/link-value/link-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/link-value/link-value.component.html","../../../projects/ngx/declarative-ui/resource-field/secret-value/secret-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/secret-value/secret-value.component.html","../../../projects/ngx/declarative-ui/resource-field/tag-list-value/tag-list-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/tag-list-value/tag-list-value.component.html","../../../projects/ngx/declarative-ui/resource-field/resource-field.component.ts","../../../projects/ngx/declarative-ui/resource-field/resource-field.component.html","../../../projects/ngx/declarative-ui/table/utils/proccess-fields.ts","../../../projects/ngx/declarative-ui/table/declarative-table/declarative-table.component.ts","../../../projects/ngx/declarative-ui/table/declarative-table/declarative-table.component.html","../../../projects/ngx/declarative-ui/form/utils/set-property-by-path.ts","../../../projects/ngx/declarative-ui/form/declarative-form/declarative-form.component.ts","../../../projects/ngx/declarative-ui/form/declarative-form/declarative-form.component.html","../../../projects/ngx/declarative-ui/table-card/filter-tabs/filter-tabs.component.ts","../../../projects/ngx/declarative-ui/table-card/filter-tabs/filter-tabs.component.html","../../../projects/ngx/declarative-ui/table-card/declarative-table-card.component.ts","../../../projects/ngx/declarative-ui/table-card/declarative-table-card.component.html","../../../projects/ngx/declarative-ui/dashboard/i18n/dashboard-i18n.ts","../../../projects/ngx/declarative-ui/dashboard/i18n/dashboard-i18n.service.ts","../../../projects/ngx/declarative-ui/dashboard/models/dashboard.model.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/dashboard-card-registry.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/mount-angular-card.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/mount-sap-card.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/mount-wc-card.ts","../../../projects/ngx/declarative-ui/dashboard/card/dashboard-card.component.ts","../../../projects/ngx/declarative-ui/dashboard/card/dashboard-card.component.html","../../../projects/ngx/declarative-ui/dashboard/constants/breakpoints.ts","../../../projects/ngx/declarative-ui/dashboard/constants/constants.ts","../../../projects/ngx/declarative-ui/dashboard/discard-changes-dialog/discard-changes-dialog.component.ts","../../../projects/ngx/declarative-ui/dashboard/discard-changes-dialog/discard-changes-dialog.component.html","../../../projects/ngx/declarative-ui/dashboard/edit-cards-dialog/edit-cards-dialog.component.ts","../../../projects/ngx/declarative-ui/dashboard/edit-cards-dialog/edit-cards-dialog.component.html","../../../projects/ngx/declarative-ui/dashboard/section/dashboard-section.component.ts","../../../projects/ngx/declarative-ui/dashboard/section/dashboard-section.component.html","../../../projects/ngx/declarative-ui/dashboard/unsaved-changes-dialog/unsaved-changes-dialog.component.ts","../../../projects/ngx/declarative-ui/dashboard/unsaved-changes-dialog/unsaved-changes-dialog.component.html","../../../projects/ngx/declarative-ui/dashboard/dashboard/dashboard.component.ts","../../../projects/ngx/declarative-ui/dashboard/dashboard/dashboard.component.html","../../../projects/ngx/cards/visited-service-card/visited-service-card.component.ts","../../../projects/ngx/cards/visited-service-card/visited-service-card.component.html","../../../projects/ngx/cards/favorites/favorites.component.ts","../../../projects/ngx/cards/favorites/favorites.component.html","../../../projects/ngx/cards/service-status/service-status-card.component.ts","../../../projects/ngx/cards/service-status/service-status-card.component.html","../../../projects/ngx/cards/whats-new/whats-new.component.ts","../../../projects/ngx/cards/whats-new/whats-new.component.html","../../../projects/ngx/openmfp-ngx.ts"],"sourcesContent":["import { CssRule, RuleCondition, ValueRule } from '../../models';\n\nexport const parseStringValue = (value: string) => {\n if (value === 'true') {\n return true;\n }\n\n if (value === 'false') {\n return false;\n }\n\n if (!isNaN(Number(value))) {\n return Number(value);\n }\n\n return value;\n};\n\ninterface ConditionRule { if: { condition: RuleCondition; value: string } }\n\nexport const ruleResolver = (\n rule: ConditionRule,\n resourceValue: string,\n): boolean => {\n const parsedResouceValue = parseStringValue(resourceValue);\n const parsedConditionValue = parseStringValue(rule.if.value);\n\n switch (rule.if.condition) {\n case 'equals':\n return parsedResouceValue === parsedConditionValue;\n case 'notEquals':\n return parsedResouceValue !== parsedConditionValue;\n case 'greaterThan':\n return parsedResouceValue > parsedConditionValue;\n case 'greaterThanOrEqual':\n return parsedResouceValue >= parsedConditionValue;\n case 'lessThan':\n return parsedResouceValue < parsedConditionValue;\n case 'lessThanOrEqual':\n return parsedResouceValue <= parsedConditionValue;\n case 'contains':\n if (Array.isArray(parsedResouceValue)) {\n return parsedResouceValue.includes(parsedConditionValue);\n } else if (\n typeof parsedResouceValue === 'string' &&\n typeof parsedConditionValue === 'string'\n ) {\n return parsedResouceValue.includes(parsedConditionValue);\n }\n\n return false;\n }\n return false;\n};\n\nexport const evaluateCssRules = (\n value: string,\n rules?: CssRule[],\n): Partial<CSSStyleDeclaration> => {\n if (!rules) {\n return {};\n }\n\n return rules.reduce((acc, rule) => {\n const result = ruleResolver(rule, value);\n if (result) {\n return { ...acc, ...rule.styles };\n }\n return acc;\n }, {});\n};\n\nexport const evaluateValueRules = (\n value: string,\n rules?: ValueRule[],\n): string => {\n if (!rules) return value;\n for (const rule of rules) {\n if (ruleResolver(rule, value)) return rule.then;\n }\n return value;\n};\n","import { PropertyField, TransformType } from '../../models';\nimport { JSONPath } from 'jsonpath-plus';\n\nexport const getResourceValueByJsonPath = <T>(\n resource: T,\n field: {\n jsonPathExpression?: string;\n property?: string | string[];\n propertyField?: PropertyField;\n },\n) => {\n const property = field.jsonPathExpression || field.property;\n if (!property) {\n return undefined;\n }\n\n if (property instanceof Array) {\n console.error(\n `Property defined as an array: ${JSON.stringify(property)}, provide \"jsonPathExpression\" field to properly ready resource value`,\n );\n return undefined;\n }\n\n const prefix = property.startsWith('$.') ? '' : '$.';\n // jsonpath-plus's `JSONPath` is overloaded: by default `resultType: 'value'`\n // returns an array of matched values, but the TS overload defaults to\n // returning a `JSONPathClass` unless we pin `<T>` to the array shape.\n // The `json` parameter is typed as a concrete JSON-shape union; the generic\n // `T` of this function is unconstrained, so we cast at the boundary. The\n // returned array is `any[]` (matching jsonpath's old typing) so the\n // downstream `value[field.propertyField.key]` access keeps compiling.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryResult = JSONPath<any[]>({\n path: `${prefix}${property}`,\n json: resource as object,\n });\n const value = queryResult.length ? queryResult[0] : undefined;\n\n if (value && field.propertyField) {\n return executeTransform(\n value[field.propertyField.key],\n field.propertyField.transform,\n );\n }\n\n return value;\n};\n\nconst executeTransform = (\n value: string | undefined,\n transform: TransformType[] | undefined,\n): string | undefined => {\n if (value == null || transform == null || !transform.length) return value;\n\n return transform.reduce((acc, t) => {\n if (acc == null) return acc;\n\n switch (t) {\n case 'uppercase':\n return acc.toUpperCase();\n case 'lowercase':\n return acc.toLowerCase();\n case 'capitalize': {\n const str = String(acc);\n return str.length ? str.charAt(0).toUpperCase() + str.slice(1) : str;\n }\n case 'decode': {\n try {\n return decodeBase64(acc);\n } catch {\n return acc;\n }\n }\n case 'encode': {\n try {\n return encodeBase64(acc);\n } catch {\n return acc;\n }\n }\n default:\n return acc;\n }\n }, value);\n};\n\nexport const encodeBase64 = (str: string): string => {\n try {\n const utf8Bytes = new TextEncoder().encode(str);\n const binaryString = Array.from(utf8Bytes, (byte) =>\n String.fromCharCode(byte),\n ).join('');\n return btoa(binaryString);\n } catch (error) {\n console.error('Base64 encoding failed:', error);\n throw new Error('Failed to encode string to Base64');\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n const binaryString = atob(base64);\n const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n } catch (error) {\n console.error('Base64 decoding failed:', error);\n throw new Error('Failed to decode Base64 string');\n }\n};\n","import { FieldDefinition } from '../../models';\nimport { getResourceValueByJsonPath } from './resource-field-by-path';\n\nexport function getFieldValue<T>(\n field: FieldDefinition,\n resource: T | undefined,\n) {\n if (resource) {\n return getResourceValueByJsonPath<T>(resource, field) ?? field.value;\n }\n\n return field.value;\n}\n","export const ICON_DESIGN_POSITIVE = 'Positive';\nexport const ICON_DESIGN_NEGATIVE = 'Negative';\n\nexport const ICON_NAME_POSITIVE = 'accept';\nexport const ICON_NAME_NEGATIVE = 'decline';\n","import {\n ICON_DESIGN_NEGATIVE,\n ICON_DESIGN_POSITIVE,\n ICON_NAME_NEGATIVE,\n ICON_NAME_POSITIVE,\n} from './boolean-cell.constants';\nimport {\n CUSTOM_ELEMENTS_SCHEMA,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\n\nexport type IconDesignType = typeof ICON_DESIGN_POSITIVE | typeof ICON_DESIGN_NEGATIVE;\n\n@Component({\n selector: 'mfp-boolean-value',\n imports: [Icon],\n templateUrl: './boolean-value.component.html',\n styleUrl: './boolean-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class BooleanValue {\n boolValue = input.required<boolean>();\n testId = input<string>('boolean-value-icon');\n iconDesign = computed<IconDesignType>(() => {\n return this.boolValue() ? ICON_DESIGN_POSITIVE : ICON_DESIGN_NEGATIVE;\n });\n iconName = computed<string>(() => {\n return this.boolValue() ? ICON_NAME_POSITIVE : ICON_NAME_NEGATIVE;\n });\n}\n","<ui5-icon [attr.data-testid]=\"testId()\" [design]=\"iconDesign()\" [name]=\"iconName()\" />\n","import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { Link } from '@fundamental-ngx/ui5-webcomponents/link';\n\n@Component({\n selector: 'mfp-link-value',\n imports: [Link],\n templateUrl: './link-value.component.html',\n styleUrl: './link-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class LinkValue {\n urlValue = input.required<string>();\n testId = input<string>('link-value-link');\n\n public stopPropagation(event: Event) {\n event.stopPropagation();\n }\n}\n","<ui5-link\n target=\"_blank\"\n [attr.data-testid]=\"testId()\"\n [href]=\"urlValue()\"\n [tooltip]=\"urlValue()\"\n (click)=\"stopPropagation($event)\"\n>Link</ui5-link>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n@Component({\n selector: 'mfp-secret-value',\n imports: [],\n templateUrl: './secret-value.component.html',\n styleUrl: './secret-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [],\n})\nexport class SecretValue {\n value = input.required<string>();\n isVisible = input<boolean>(false);\n testId = input<string>('secret-value');\n maskedValue = computed(() => '*'.repeat(this.value()?.length || 8));\n}\n","<span class=\"secret-value\" [attr.data-testid]=\"testId()\" [class.masked]=\"!isVisible()\">\n @if (isVisible()) {\n {{ value() }}\n } @else {\n {{ maskedValue() }}\n }\n</span>\n","import { TagSettings } from '../../models';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { Tag } from '@fundamental-ngx/ui5-webcomponents/tag';\n\n@Component({\n selector: 'mfp-tag-list-value',\n imports: [Tag],\n templateUrl: './tag-list-value.component.html',\n styleUrl: './tag-list-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TagListValue {\n tags = input.required<string[]>();\n tagSettings = input<TagSettings>();\n testId = input<string>('tag-list-value');\n}\n","<span class=\"tag-list\" [attr.data-testid]=\"testId()\">\n @for (tag of tags(); track $index) {\n <ui5-tag\n [colorScheme]=\"tagSettings()?.colorScheme\"\n [design]=\"tagSettings()?.design ?? 'Neutral'\"\n [hideStateIcon]=\"true\"\n >{{ tag }}</ui5-tag>\n }\n</span>\n","import {\n FieldDefinition,\n GenericResource,\n ResourceFieldButtonClickEvent,\n} from '../models';\nimport { evaluateCssRules, evaluateValueRules } from '../table/utils/rules.engine';\nimport { getFieldValue } from '../table/utils/field-definition.utils';\nimport { BooleanValue } from './boolean-value/boolean-value.component';\nimport { LinkValue } from './link-value/link-value.component';\nimport { SecretValue } from './secret-value/secret-value.component';\nimport { TagListValue } from './tag-list-value/tag-list-value.component';\nimport {\n CUSTOM_ELEMENTS_SCHEMA,\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/AllIcons.js';\n\n@Component({\n selector: 'mfp-resource-field',\n imports: [Icon, BooleanValue, LinkValue, SecretValue, Button, TagListValue],\n templateUrl: './resource-field.component.html',\n styleUrl: './resource-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class ResourceField<T extends GenericResource, F extends FieldDefinition> {\n fieldDefinition = input.required<F>();\n resource = input<T>();\n readonly buttonClick = output<ResourceFieldButtonClickEvent<T>>();\n\n value = computed(() =>\n getFieldValue(this.fieldDefinition(), this.resource()),\n );\n\n uiSettings = computed(() => this.fieldDefinition().uiSettings);\n displayAs = computed(() => this.uiSettings()?.displayAs);\n withCopyButton = computed(() => this.uiSettings()?.withCopyButton);\n cssCustomization = computed(() => this.uiSettings()?.cssCustomization);\n tooltipIcon = computed(() => this.uiSettings()?.tooltipIcon);\n cssRules = computed(() =>\n evaluateCssRules(this.value(), this.uiSettings()?.cssRules),\n );\n cssStyles = computed(() => ({\n ...this.cssCustomization(),\n ...this.cssRules(),\n }));\n displayValue = computed(\n () => evaluateValueRules(this.value() ?? '', this.uiSettings()?.valueRules),\n );\n\n isBoolLike = computed(() => this.boolValue() !== undefined);\n isUrlValue = computed(() => this.checkValidUrl(this.stringValue()));\n testId = computed(() => `resource-field-${this.fieldDefinition().property}`);\n\n boolValue = computed(() => this.normalizeBoolean(this.value()));\n stringValue = computed(() => this.normalizeString(this.value()));\n tags = computed(() => this.normalizeTagsArray(this.value()));\n isVisible = signal(false);\n copySuccess = signal(false);\n\n toggleVisibility(e: Event): void {\n e.stopPropagation();\n this.isVisible.set(!this.isVisible());\n }\n\n private normalizeBoolean(value: unknown): boolean | undefined {\n const normalizedValue = value?.toString()?.toLowerCase();\n if (normalizedValue === 'true') {\n return true;\n }\n if (normalizedValue === 'false') {\n return false;\n }\n return undefined;\n }\n\n private normalizeString(value: unknown): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n return undefined;\n }\n\n return value;\n }\n\n private normalizeTagsArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(v => String(v).trim()).filter(v => v.length > 0);\n }\n if (typeof value === 'string') {\n const separator = this.uiSettings()?.tagSettings?.valueSeparator ?? ',';\n return value.split(separator).map(v => v.trim()).filter(v => v.length > 0);\n }\n return [];\n }\n\n private checkValidUrl(value: string | undefined): boolean {\n if (!value) {\n return false;\n }\n\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n }\n\n public copyValue(event: Event) {\n event.stopPropagation();\n navigator.clipboard.writeText(this.value() || '').then(() => {\n this.copySuccess.set(true);\n setTimeout(() => {\n this.copySuccess.set(false);\n }, 2000);\n });\n }\n\n protected buttonClicked(event: MouseEvent) {\n event.stopPropagation();\n this.buttonClick.emit({\n event,\n field: this.fieldDefinition(),\n resource: this.resource(),\n });\n }\n}\n","@let displayType = displayAs();\n<span [attr.data-testid]=\"testId()\" [style]=\"cssStyles()\">\n @if (displayType === 'secret') {\n <span class=\"secret-value-container\">\n <mfp-secret-value [isVisible]=\"isVisible()\" [testId]=\"testId() + '-secret'\" [value]=\"value()\" />\n <ui5-icon\n class=\"toggle-icon\"\n mode=\"Interactive\"\n [accessibleName]=\"isVisible() ? 'Hide value' : 'Show value'\"\n [attr.data-testid]=\"testId() + '-secret-toggle'\"\n [name]=\"isVisible() ? 'hide' : 'show'\"\n (click)=\"toggleVisibility($event)\"\n />\n </span>\n } @else if (displayType === 'boolIcon' && isBoolLike()) {\n <mfp-boolean-value [boolValue]=\"boolValue()!\" [testId]=\"testId() + '-boolean'\" />\n } @else if (displayType === 'link' && isUrlValue()) {\n <mfp-link-value [testId]=\"testId() + '-link'\" [urlValue]=\"stringValue()!\" />\n } @else if (displayType === 'tooltip') {\n <ui5-icon\n [accessibleName]=\"stringValue()!\"\n [attr.data-testid]=\"testId() + '-tooltip'\"\n [name]=\"tooltipIcon() ?? 'hint'\"\n [showTooltip]=\"true\"\n />\n } @else if (displayType === 'alert') {\n @if (!value()) {\n <ui5-icon\n design=\"Critical\"\n name=\"alert\"\n [accessibleName]=\"resource()?.accessibleName ?? ''\"\n [attr.data-testid]=\"testId() + '-icon'\"\n [showTooltip]=\"true\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n } @else if (displayType === 'img' && value()) {\n <img alt=\"Resource image\" class=\"image-cell\" [src]=\"value()\" />\n } @else if (displayType === 'button') {\n @let buttonSettings = uiSettings()?.buttonSettings;\n <ui5-button\n [attr.data-testid]=\"testId() + '-button'\"\n [accessibleName]=\"buttonSettings?.text || buttonSettings?.tooltip || buttonSettings?.icon || ''\"\n [design]=\"buttonSettings?.design\"\n [endIcon]=\"buttonSettings?.endIcon\"\n [icon]=\"buttonSettings?.icon\"\n [tooltip]=\"buttonSettings?.tooltip\"\n (click)=\"buttonClicked($event)\"\n >{{ buttonSettings?.text }}</ui5-button\n >&nbsp;\n } @else if (displayType === 'tag') {\n <mfp-tag-list-value\n [tagSettings]=\"uiSettings()?.tagSettings\"\n [tags]=\"tags()\"\n [testId]=\"testId() + '-tags'\"\n />\n } @else {\n {{ displayValue() }}\n }\n</span>\n\n@if (withCopyButton()) {\n <ui5-icon\n class=\"toggle-icon\"\n mode=\"Interactive\"\n [accessibleName]=\"copySuccess() ? 'Copied' : 'Copy value'\"\n [attr.data-testid]=\"testId() + '-copy'\"\n [design]=\"copySuccess() ? 'Positive' : 'Default'\"\n [name]=\"copySuccess() ? 'accept' : 'copy'\"\n (click)=\"copyValue($event)\"\n />\n}\n","import { TableFieldDefinition } from '../models';\n\ntype GroupBase = NonNullable<TableFieldDefinition['group']>;\ntype ProcessedGroup = GroupBase & {\n fields?: TableFieldDefinition[];\n};\n\nexport type ProcessedTableFieldDefinition = Omit<TableFieldDefinition, 'group'> & {\n group?: ProcessedGroup;\n};\n\nexport const processGroupFields = (\n fields: TableFieldDefinition[],\n): ProcessedTableFieldDefinition[] => {\n return combineGroupFields(fields);\n};\n\nconst collectGroupFields = (\n fields: TableFieldDefinition[],\n): Record<string, TableFieldDefinition[]> => {\n return fields.reduce(\n (acc, f): Record<string, TableFieldDefinition[]> => {\n if (!f.group?.name) {\n return acc;\n }\n\n const key = f.group.name;\n if (!acc[key]) {\n acc[key] = [];\n }\n\n // Strip group information from the field when adding to the fields array\n const { group, ...fieldWithoutGroup } = f;\n acc[key].push(fieldWithoutGroup);\n return acc;\n },\n {} as Record<string, TableFieldDefinition[]>,\n );\n};\n\nconst combineGroupFields = (fields: TableFieldDefinition[]): ProcessedTableFieldDefinition[] => {\n const seenGroup = new Set<string>();\n const groupFields = collectGroupFields(fields);\n const result: ProcessedTableFieldDefinition[] = [];\n\n fields.forEach((f) => {\n if (!f.group?.name) {\n result.push(f);\n return;\n }\n\n const key = f.group.name;\n if (seenGroup.has(key)) {\n return;\n }\n\n seenGroup.add(key);\n\n const grouped: ProcessedTableFieldDefinition = {\n ...f,\n group: {\n ...f.group,\n fields: groupFields[key],\n },\n };\n\n result.push(grouped);\n });\n\n return result;\n};\n","import { GenericResource } from '../../models';\nimport { ResourceField } from '../../resource-field/resource-field.component';\nimport { ResourceFieldButtonClickEvent, TableFieldDefinition } from '../models';\nimport { processGroupFields } from '../utils/proccess-fields';\nimport { getResourceValueByJsonPath } from '../utils/resource-field-by-path';\nimport {\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { IllustratedMessage } from '@fundamental-ngx/ui5-webcomponents-fiori';\nimport { Option } from '@fundamental-ngx/ui5-webcomponents/option';\nimport { Select } from '@fundamental-ngx/ui5-webcomponents/select';\nimport { Table } from '@fundamental-ngx/ui5-webcomponents/table';\nimport { TableCell } from '@fundamental-ngx/ui5-webcomponents/table-cell';\nimport { TableGrowing } from '@fundamental-ngx/ui5-webcomponents/table-growing';\nimport { TableHeaderCell } from '@fundamental-ngx/ui5-webcomponents/table-header-cell';\nimport { TableHeaderRow } from '@fundamental-ngx/ui5-webcomponents/table-header-row';\nimport { TableRow } from '@fundamental-ngx/ui5-webcomponents/table-row';\nimport '@ui5/webcomponents-fiori/dist/illustrations/NoData.js';\n\n@Component({\n selector: 'mfp-declarative-table',\n imports: [\n IllustratedMessage,\n Table,\n TableCell,\n TableHeaderCell,\n TableHeaderRow,\n TableRow,\n ResourceField,\n Select,\n Option,\n TableGrowing,\n ],\n templateUrl: './declarative-table.component.html',\n styleUrl: './declarative-table.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class DeclarativeTable<T extends GenericResource> {\n columns = input.required<TableFieldDefinition[]>();\n resources = input.required<T[]>();\n trackByPath = input<string>('id');\n\n totalItemsCount = input<number>();\n paginationLimit = input<number>(5);\n hasMore = input<boolean>(false);\n growMode = input<'Scroll' | 'Button'>('Button');\n loadMoreButtonText = input<string>('Load More');\n height = input<number>();\n\n readonly buttonClick = output<ResourceFieldButtonClickEvent<T>>();\n readonly tableRowClicked = output<T>();\n readonly loadMoreResources = output<void>();\n readonly paginationLimitChanged = output<number>();\n\n columnTrackBy = (column: TableFieldDefinition, index: number) =>\n column.property ?? column.value ?? index;\n rowTrackBy = (_index: number, item: T): unknown =>\n getResourceValueByJsonPath(item, { property: this.trackByPath() }) ??\n _index;\n viewColumns = computed(() => processGroupFields(this.columns()));\n}\n","<ui5-table\n data-testid=\"generic-table\"\n [style.height]=\"height() ? height() + 'px' : null\"\n [style.overflow-y]=\"'auto'\"\n>\n <ui5-table-header-row\n slot=\"headerRow\"\n [sticky]=\"growMode() === 'Scroll' && !!height()\"\n >\n @for (column of viewColumns(); track columnTrackBy(column, $index)) {\n @if (column.group) {\n <ui5-table-header-cell\n [attr.data-testid]=\"'generic-table-header-' + column.group.name\"\n [width]=\"column.uiSettings?.columnWidth ?? 'auto'\"\n >{{ column.group.label ?? column.group.name }}</ui5-table-header-cell\n >\n } @else {\n <ui5-table-header-cell\n [attr.data-testid]=\"'generic-table-header-' + column.property\"\n [width]=\"column.uiSettings?.columnWidth ?? 'auto'\"\n >{{ column.label }}</ui5-table-header-cell\n >\n }\n }\n </ui5-table-header-row>\n\n @for (item of resources(); let i = $index; track rowTrackBy($index, item)) {\n <ui5-table-row\n [attr.data-testid]=\"'generic-table-row-' + i\"\n [class.disabled]=\"item.isAvailable === false\"\n [interactive]=\"item.isAvailable !== false\"\n (click)=\"tableRowClicked.emit(item)\"\n >\n @for (column of viewColumns(); track columnTrackBy(column, $index)) {\n @if (column.group) {\n <ui5-table-cell\n [attr.data-testid]=\"'generic-table-cell-' + i + '-' + column.group.name\"\n >\n @let isMultiline = column.group.multiline ?? true;\n <div\n class=\"flex\"\n [style.alignItems]=\"isMultiline ? column.uiSettings?.align : null\"\n [style.flexDirection]=\"isMultiline ? 'column' : 'row'\"\n [style.justifyContent]=\"\n isMultiline ? null : column.uiSettings?.align\n \"\n >\n @for (\n field of column.group.fields;\n let last = $last;\n track columnTrackBy(field, $index)\n ) {\n <span\n class=\"group-value\"\n [attr.data-testid]=\"\n 'generic-table-cell-' +\n i +\n '-' +\n column.group.name +\n '-' +\n field.property\n \"\n >\n @if (field.label) {\n <span>{{ field.label }}: </span>\n }\n <mfp-resource-field\n [fieldDefinition]=\"field\"\n [resource]=\"item\"\n (buttonClick)=\"buttonClick.emit($event)\"\n />\n </span>\n @if (!last && column.group.delimiter) {\n <span class=\"delimiter\">{{ column.group.delimiter }}</span>\n }\n }\n </div>\n </ui5-table-cell>\n } @else {\n <ui5-table-cell\n [attr.data-testid]=\"'generic-table-cell-' + i + '-' + column.property\"\n >\n <div class=\"flex\" [style.justifyContent]=\"column.uiSettings?.align\">\n <mfp-resource-field\n [fieldDefinition]=\"column\"\n [resource]=\"item\"\n (buttonClick)=\"buttonClick.emit($event)\"\n />\n </div>\n </ui5-table-cell>\n }\n }\n </ui5-table-row>\n } @empty {\n <ui5-illustrated-message\n name=\"NoData\"\n slot=\"noData\"\n data-testid=\"generic-table-view-nodata\"\n >\n <span slot=\"title\">No Resources</span>\n <span slot=\"subtitle\">There are currently no items to show.</span>\n </ui5-illustrated-message>\n }\n\n @if (hasMore()) {\n <ui5-table-growing\n id=\"growing\"\n data-testid=\"generic-table-growing\"\n slot=\"features\"\n [mode]=\"growMode()\"\n [text]=\"loadMoreButtonText()\"\n (ui5LoadMore)=\"loadMoreResources.emit()\"\n />\n }\n</ui5-table>\n\n<!-- Pagination Control -->\n<div\n class=\"pagination-footer\"\n style=\"\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0rem 1rem;\n min-height: 3rem;\n border-top: 1px solid var(--sapList_BorderColor);\n \"\n>\n <div style=\"display: flex; align-items: center; gap: 1.5rem\">\n <div style=\"display: flex; align-items: center; gap: 0.5rem\">\n <span\n style=\"color: var(--sapTextColor); font-size: var(--sapFontSmallSize)\"\n >Items per load:</span\n >\n <ui5-select\n data-testid=\"generic-table-pagination-select\"\n style=\"width: 5rem\"\n [value]=\"paginationLimit().toString()\"\n (change)=\"paginationLimitChanged.emit(+$any($event)?.target?.value)\"\n >\n <ui5-option value=\"5\">5</ui5-option>\n <ui5-option value=\"10\">10</ui5-option>\n <ui5-option value=\"10\">20</ui5-option>\n <ui5-option value=\"50\">50</ui5-option>\n <ui5-option value=\"100\">100</ui5-option>\n </ui5-select>\n </div>\n\n <span\n style=\"color: var(--sapTextColor); font-size: var(--sapFontSmallSize)\"\n >\n Items loaded:\n <b>{{\n totalItemsCount() !== undefined\n ? resources().length + ' / ' + totalItemsCount()\n : resources().length\n }}</b>\n </span>\n </div>\n</div>\n","export function setPropertyByPath<T extends Record<string, unknown>>(\n object: T,\n path: string,\n value: unknown,\n): T {\n const segments = path.split('.').filter(Boolean);\n if (segments.length === 0) {\n return object;\n }\n\n let current: Record<string, unknown> = object;\n\n for (let i = 0; i < segments.length; i += 1) {\n const key = segments[i];\n if (i === segments.length - 1) {\n current[key] = value;\n break;\n }\n\n const existing = current[key];\n\n if (existing === undefined || existing === null || typeof existing !== 'object') {\n current[key] = {};\n }\n\n current = current[key] as Record<string, unknown>;\n }\n\n return object;\n}\n","import { GenericResource } from '../../models';\nimport {\n FormFieldChangeEvent,\n FormFieldDefinition,\n FormFieldErrors,\n} from '../models';\nimport { setPropertyByPath } from '../utils/set-property-by-path';\nimport {\n Component,\n ViewEncapsulation,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { Input } from '@fundamental-ngx/ui5-webcomponents/input';\nimport { Label } from '@fundamental-ngx/ui5-webcomponents/label';\nimport { Option } from '@fundamental-ngx/ui5-webcomponents/option';\nimport { Select } from '@fundamental-ngx/ui5-webcomponents/select';\n\n@Component({\n selector: 'mfp-declarative-form',\n imports: [ReactiveFormsModule, Input, Label, Select, Option],\n templateUrl: './declarative-form.component.html',\n styleUrl: './declarative-form.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class DeclarativeForm<T extends GenericResource> {\n readonly fields = input.required<FormFieldDefinition[]>();\n readonly initialValues = input<T>({} as T);\n readonly fieldErrors = input<FormFieldErrors>({});\n\n readonly fieldChange = output<FormFieldChangeEvent>();\n readonly formSubmit = output<T>();\n\n readonly form: FormGroup;\n\n private readonly fb = inject(FormBuilder);\n\n constructor() {\n this.form = this.fb.group({});\n\n effect(() => {\n this.rebuildControls(this.fields());\n });\n\n effect(() => {\n this.setInitialValues(this.initialValues());\n });\n\n effect(() => {\n const fields = this.fields();\n this.initialValues();\n\n for (const field of fields) {\n if (field.validation) {\n this.fieldChange.emit({\n fieldProperty: field.name,\n value: this.form.controls[field.name]?.value ?? '',\n });\n }\n }\n });\n }\n\n setFormControlValue($event: Event, field: FormFieldDefinition): void {\n const target = $event.target as\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n\n const control = this.form.controls[field.name];\n control.setValue(target.value);\n control.markAsTouched();\n control.markAsDirty();\n\n if (field.validation === 'onChange') {\n this.fieldChange.emit({\n fieldProperty: field.name,\n value: control.value,\n });\n }\n }\n\n getError(name: string): string | null {\n const control = this.form.controls[name];\n const error = this.fieldErrors()[name];\n\n return error && (control.dirty || control.touched) ? error : null;\n }\n\n getValueState(name: string): 'None' | 'Negative' {\n return this.getError(name) ? 'Negative' : 'None';\n }\n\n onFieldBlur(field: FormFieldDefinition): void {\n this.form.controls[field.name]?.markAsTouched();\n\n if (field.validation === 'onBlur') {\n this.fieldChange.emit({\n fieldProperty: field.name,\n value: this.form.controls[field.name]?.value,\n });\n }\n }\n\n submit(): void {\n this.formSubmit.emit(this.buildOutputValue());\n }\n\n clear(): void {\n this.form.reset();\n }\n\n private rebuildControls(fields: FormFieldDefinition[]): void {\n const existingControls = this.form.controls;\n const nextFieldNames = new Set(fields.map((field) => field.name));\n\n for (const field of fields) {\n const existingControl = existingControls[field.name];\n\n if (existingControl) {\n existingControl.clearValidators();\n existingControl.updateValueAndValidity({ emitEvent: false });\n continue;\n }\n\n this.form.addControl(field.name, new FormControl(''));\n }\n\n for (const controlName of Object.keys(existingControls)) {\n if (!nextFieldNames.has(controlName)) {\n this.form.removeControl(controlName);\n }\n }\n\n this.form.updateValueAndValidity({ emitEvent: false });\n }\n\n private setInitialValues(initialValues: T | null | undefined): void {\n if (!initialValues) {\n return;\n }\n\n this.form.patchValue(initialValues, { emitEvent: false });\n this.form.markAsPristine({ emitEvent: false });\n this.form.updateValueAndValidity({ emitEvent: false });\n }\n\n private buildOutputValue(): T {\n const result = {} as T;\n\n for (const key of Object.keys(this.form.controls)) {\n setPropertyByPath(result, key, this.form.controls[key].value);\n }\n\n return result;\n }\n}\n","<section class=\"form\" data-testid=\"generic-form\" [formGroup]=\"form\">\n @for (field of fields(); track field.name) {\n @let control = form.controls[field.name];\n <div\n class=\"inputs\"\n [attr.data-testid]=\"'generic-form-field-container-' + field.name\"\n >\n <ui5-label\n show-colon\n [attr.data-testid]=\"'generic-form-field-label-' + field.name\"\n [required]=\"field.required\"\n >{{ field.label }}</ui5-label\n >\n @if (field.values?.length) {\n <ui5-select\n class=\"input\"\n [attr.data-testid]=\"'generic-form-field-' + field.name\"\n [disabled]=\"field.disabled\"\n [required]=\"field.required\"\n [value]=\"control.value\"\n [valueState]=\"getValueState(field.name)\"\n (blur)=\"onFieldBlur(field)\"\n (change)=\"setFormControlValue($event, field)\"\n (input)=\"setFormControlValue($event, field)\"\n >\n @if (getError(field.name); as error) {\n <div slot=\"valueStateMessage\">{{ error }}</div>\n }\n @for (value of [''].concat(field.values ?? []); track value) {\n <ui5-option\n [attr.data-testid]=\"\n 'generic-form-field-' +\n field.name +\n '-option-' +\n (value || 'empty')\n \"\n [selected]=\"value === control.value\"\n [value]=\"value\"\n >{{ value }}</ui5-option\n >\n }\n </ui5-select>\n } @else {\n <ui5-input\n class=\"input\"\n [attr.data-testid]=\"'generic-form-field-' + field.name\"\n [disabled]=\"field.disabled\"\n [required]=\"field.required\"\n [value]=\"control.value\"\n [valueState]=\"getValueState(field.name)\"\n (blur)=\"onFieldBlur(field)\"\n (change)=\"setFormControlValue($event, field)\"\n (input)=\"setFormControlValue($event, field)\"\n >\n @if (getError(field.name); as error) {\n <div slot=\"valueStateMessage\">{{ error }}</div>\n }\n </ui5-input>\n }\n </div>\n }\n</section>\n","import { FieldFilterDefinition } from '../models/configs';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n OnDestroy,\n ViewEncapsulation,\n afterNextRender,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/navigation-left-arrow.js';\nimport '@ui5/webcomponents-icons/dist/navigation-right-arrow.js';\n\n/**\n * Horizontal filter-tab strip rendered above the table by\n * `<mfp-declarative-table-card>`. Internal to the table-card — not part of the\n * package public API.\n *\n * Renders one tab per {@link FieldFilterDefinition}. When the combined width\n * exceeds the host width, left/right chevron buttons appear and scroll the\n * strip by ~70% of the visible width per click; the native scrollbar is hidden.\n *\n * Initial active tab:\n * - The first `FieldFilterDefinition` with `default: true`, if any.\n * - Otherwise the first tab in the array.\n *\n * The component owns the active-tab state; the host only needs to listen to\n * `tabChanged` and apply the picked filter to its data layer. If the host\n * wants an \"All / no filter\" option it must author it as a regular tab — the\n * strip never auto-prepends one. The output type still allows `undefined` for\n * forward compatibility with hosts that want to clear the selection.\n */\n@Component({\n selector: 'mfp-filter-tabs',\n standalone: true,\n imports: [Icon],\n templateUrl: './filter-tabs.component.html',\n styleUrl: './filter-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class FilterTabs implements OnDestroy {\n tabs = input.required<FieldFilterDefinition[]>();\n readonly tabChanged = output<FieldFilterDefinition | undefined>();\n\n protected activeTab = signal<FieldFilterDefinition | undefined>(undefined);\n protected stripRef = viewChild<ElementRef<HTMLDivElement>>('strip');\n protected canScrollLeft = signal(false);\n protected canScrollRight = signal(false);\n\n private readonly injector = inject(Injector);\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n effect(() => {\n const tabs = this.tabs();\n const next = tabs.find((t) => t.default) ?? tabs[0];\n this.activeTab.set(next);\n afterNextRender(() => this.recomputeScrollState(), {\n injector: this.injector,\n });\n });\n\n afterNextRender(\n () => {\n const el = this.stripRef()?.nativeElement;\n if (!el) return;\n this.resizeObserver = new ResizeObserver(() =>\n this.recomputeScrollState(),\n );\n this.resizeObserver.observe(el);\n this.recomputeScrollState();\n },\n { injector: this.injector },\n );\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n /**\n * Reflects the carousel's current `scrollLeft` into signals that drive the\n * chevron buttons' visibility. Called on init, on user scroll, and after\n * any size change.\n */\n protected recomputeScrollState(): void {\n const el = this.stripRef()?.nativeElement;\n if (!el) {\n this.canScrollLeft.set(false);\n this.canScrollRight.set(false);\n return;\n }\n const { scrollLeft, scrollWidth, clientWidth } = el;\n // 1px tolerance — browsers occasionally report fractional pixel widths.\n this.canScrollLeft.set(scrollLeft > 1);\n this.canScrollRight.set(scrollLeft + clientWidth < scrollWidth - 1);\n }\n\n protected onScroll(): void {\n this.recomputeScrollState();\n }\n\n /**\n * Scrolls the strip by ~70% of its visible width so one filter overlaps\n * the previous viewport — matches the carousel idiom in SAP and Material.\n */\n protected scroll(direction: 'left' | 'right'): void {\n const el = this.stripRef()?.nativeElement;\n if (!el) return;\n const delta = el.clientWidth * 0.7 * (direction === 'right' ? 1 : -1);\n el.scrollBy({ left: delta, behavior: 'smooth' });\n }\n\n protected select(tab: FieldFilterDefinition): void {\n this.activeTab.set(tab);\n this.tabChanged.emit(tab);\n }\n}\n","<div class=\"filter-tabs\">\n @if (canScrollLeft()) {\n <button\n type=\"button\"\n class=\"filter-tabs__chevron filter-tabs__chevron--left\"\n aria-label=\"Scroll filters left\"\n (click)=\"scroll('left')\"\n >\n <ui5-icon name=\"navigation-left-arrow\" />\n </button>\n }\n <div\n #strip\n class=\"filter-tabs__strip\"\n role=\"tablist\"\n (scroll)=\"onScroll()\"\n >\n @for (tab of tabs(); track tab.property + ':' + tab.value) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"filter-tabs__tab\"\n [class.filter-tabs__tab--active]=\"activeTab() === tab\"\n [attr.aria-selected]=\"activeTab() === tab\"\n (click)=\"select(tab)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n @if (canScrollRight()) {\n <button\n type=\"button\"\n class=\"filter-tabs__chevron filter-tabs__chevron--right\"\n aria-label=\"Scroll filters right\"\n (click)=\"scroll('right')\"\n >\n <ui5-icon name=\"navigation-right-arrow\" />\n </button>\n }\n</div>\n","import { FormFieldChangeEvent, FormFieldDefinition } from '../form';\nimport { DeclarativeForm } from '../form/declarative-form/declarative-form.component';\nimport { GenericResource } from '../models';\nimport { DeclarativeTable } from '../table/declarative-table/declarative-table.component';\nimport {\n ResourceFieldButtonClickEvent,\n TableFieldDefinition,\n} from '../table/models';\nimport { getResourceValueByJsonPath } from '../table/utils/resource-field-by-path';\nimport { FilterTabs } from './filter-tabs/filter-tabs.component';\nimport {\n FieldFilterDefinition,\n TableCardConfig,\n TableCardFormState,\n} from './models/configs';\nimport {\n CUSTOM_ELEMENTS_SCHEMA,\n ChangeDetectionStrategy,\n Component,\n Injector,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Input } from '@fundamental-ngx/ui5-webcomponents/input';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/add.js';\nimport '@ui5/webcomponents-icons/dist/search.js';\nimport { debounceTime, filter, map, take } from 'rxjs';\n\ntype SearchState = 'collapsed' | 'expanded' | 'collapsing';\n\n@Component({\n selector: 'mfp-declarative-table-card',\n imports: [\n DeclarativeTable,\n DeclarativeForm,\n FilterTabs,\n ReactiveFormsModule,\n Dialog,\n Title,\n Button,\n Icon,\n Input,\n ],\n templateUrl: './declarative-table-card.component.html',\n styleUrl: './declarative-table-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class DeclarativeTableCard<T extends GenericResource> {\n resources = input.required<T[]>();\n\n config = input.required<TableCardConfig>();\n createFormState = input<TableCardFormState>({});\n editFormState = input<TableCardFormState>({});\n\n readonly actionButtonClick = output<ResourceFieldButtonClickEvent<T>>();\n readonly tableRowClicked = output<T>();\n readonly loadMoreResources = output<void>();\n readonly paginationLimitChanged = output<number>();\n\n readonly searchChanged = output<string>();\n readonly createFieldChange = output<FormFieldChangeEvent>();\n readonly editFieldChange = output<{\n resource: T;\n formChangeEvent: FormFieldChangeEvent;\n }>();\n readonly createSubmit = output<T>();\n readonly editSubmit = output<{\n resource: T;\n value: Record<string, unknown>;\n }>();\n readonly deleteSubmit = output<T>();\n readonly filterTabChanged = output<FieldFilterDefinition | undefined>();\n\n protected searchState = signal<SearchState>('collapsed');\n protected searchExpanded = computed(() => this.searchState() !== 'collapsed');\n protected searchCollapsing = computed(\n () => this.searchState() === 'collapsing',\n );\n protected searchControl = new FormControl('');\n protected searchInputRef = viewChild<Input>('searchInput');\n\n protected createDialogOpen = signal(false);\n protected editDialogOpen = signal(false);\n protected deleteDialogOpen = signal(false);\n\n protected pendingResource = signal<T | null>(null);\n\n protected tableConfig = computed(() => this.config().tableConfig);\n protected header = computed(() => this.config().header);\n protected headerTooltip = computed(() => this.config().headerTooltip);\n protected createFormConfig = computed(\n () => this.config().createResourceFormConfig,\n );\n protected editFormConfig = computed(\n () => this.config().editResourceFormConfig,\n );\n protected deleteConfirmationConfig = computed(\n () => this.config().deleteResourceConfirmationConfig,\n );\n protected createButtonConfig = computed(\n () => this.config().buttonSettings?.createButton,\n );\n protected searchButtonConfig = computed(\n () => this.config().buttonSettings?.searchButton,\n );\n protected effectiveColumns = computed(() => this.addActionsColumn());\n protected editInitialValue = computed(() => {\n const pendingResource = this.pendingResource();\n const editConfig = this.editFormConfig();\n if (!pendingResource || !editConfig) {\n return {};\n }\n\n return this.buildInitialValues(editConfig.fields, pendingResource);\n });\n\n protected searchConfig = computed(() => this.config().searchConfig);\n protected resourcesSearchable = computed(() => !!this.searchConfig());\n\n protected filterTabs = computed(() => {\n const tabs = this.searchConfig()?.filterTabs;\n if (!tabs?.length) return [];\n\n const initial = this.searchConfig()?.initialFilter;\n if (!initial) {\n return tabs;\n }\n\n const matches = tabs.some(\n (t) => t.property === initial.property && t.value === initial.value,\n );\n if (!matches) return tabs;\n\n return tabs.map((tab) =>\n tab.property === initial.property && tab.value === initial.value\n ? { ...tab, default: true }\n : tab.default\n ? { ...tab, default: false }\n : tab,\n );\n });\n\n protected hasFilterTabs = computed(() => this.filterTabs().length > 0);\n\n private readonly injector = inject(Injector);\n\n constructor() {\n this.searchControl.valueChanges\n .pipe(debounceTime(300), takeUntilDestroyed())\n .subscribe((value) => {\n this.searchChanged.emit(value ?? '');\n });\n\n toObservable(this.searchConfig)\n .pipe(\n map((config) => config?.initialSearch),\n filter((initial): initial is string => !!initial),\n takeUntilDestroyed(),\n )\n .subscribe((initial) => {\n this.searchControl.setValue(initial, { emitEvent: false });\n this.searchState.set('expanded');\n });\n }\n\n protected onFilterTabChanged(tab: FieldFilterDefinition | undefined): void {\n this.filterTabChanged.emit(tab);\n }\n\n toggleSearch(): void {\n if (this.searchState() === 'expanded') {\n this.collapseSearch();\n } else if (this.searchState() === 'collapsed') {\n this.searchState.set('expanded');\n afterNextRender(\n () => {\n this.searchInputRef()?.elementRef.nativeElement.focus();\n },\n { injector: this.injector },\n );\n }\n }\n\n onSearchBlur(): void {\n if (!this.searchControl.value) {\n this.collapseSearch();\n }\n }\n\n onSearchAnimationEnd(): void {\n if (this.searchCollapsing()) {\n this.searchState.set('collapsed');\n this.searchControl.setValue('', { emitEvent: false });\n }\n }\n\n private collapseSearch(): void {\n this.searchState.set('collapsing');\n }\n\n onButtonClick(event: ResourceFieldButtonClickEvent<T>): void {\n const action = event.field.uiSettings?.buttonSettings?.action;\n if (action === 'edit' && event.resource) {\n this.pendingResource.set(event.resource);\n this.editDialogOpen.set(true);\n return;\n }\n if (action === 'delete' && event.resource) {\n this.pendingResource.set(event.resource);\n this.deleteDialogOpen.set(true);\n return;\n }\n\n this.actionButtonClick.emit(event);\n }\n\n closeCreateDialog(): void {\n this.createDialogOpen.set(false);\n }\n\n closeEditDialog(): void {\n this.editDialogOpen.set(false);\n }\n\n closeDeleteDialog(): void {\n this.deleteDialogOpen.set(false);\n }\n\n onCreateFieldChange(event: FormFieldChangeEvent): void {\n this.createFieldChange.emit(event);\n }\n\n onEditFieldChange(event: FormFieldChangeEvent): void {\n const resource = this.pendingResource();\n\n if (resource) {\n this.editFieldChange.emit({ resource, formChangeEvent: event });\n }\n }\n\n onCreateSubmit(value: T): void {\n this.createSubmit.emit(value);\n }\n\n onEditSubmit(value: Record<string, unknown>): void {\n const resource = this.pendingResource();\n\n if (resource) {\n this.editSubmit.emit({ resource, value });\n }\n }\n\n onDeleteSubmit(): void {\n const resource = this.pendingResource();\n if (resource) this.deleteSubmit.emit(resource);\n }\n\n protected hasErrors(state: TableCardFormState): boolean {\n const errors = state.fieldErrors;\n return !!errors && Object.values(errors).some((val) => !!val);\n }\n\n private addActionsColumn(): TableFieldDefinition[] {\n const cols = this.tableConfig().fields;\n const buttonSettings = this.config().buttonSettings;\n const editButton = this.editFormConfig();\n const deleteButton = this.deleteConfirmationConfig();\n const actions: TableFieldDefinition[] = [];\n\n if (editButton) {\n actions.push({\n property: 'mfp_edit_action',\n uiSettings: {\n displayAs: 'button',\n align: 'end',\n buttonSettings: {\n icon: 'edit',\n design: 'Transparent',\n action: 'edit',\n tooltip: 'Edit',\n ...buttonSettings?.editButton,\n },\n },\n group: { name: 'actions', label: '', multiline: false },\n });\n }\n\n if (deleteButton) {\n actions.push({\n property: 'mfp_delete_action',\n uiSettings: {\n align: 'end',\n displayAs: 'button',\n buttonSettings: {\n icon: 'decline',\n design: 'Transparent',\n action: 'delete',\n tooltip: 'Delete',\n ...buttonSettings?.deleteButton,\n },\n },\n group: { name: 'actions', label: '', multiline: false },\n });\n }\n\n return cols.concat(actions);\n }\n\n private buildInitialValues(\n fields: FormFieldDefinition[],\n resource?: T,\n ): Record<string, unknown> {\n if (!resource) return {};\n\n return fields.reduce(\n (acc, field) => {\n if (typeof field.name === 'string') {\n acc[field.name] =\n getResourceValueByJsonPath(resource, { property: field.name }) ??\n '';\n }\n return acc;\n },\n {} as Record<string, unknown>,\n );\n }\n}\n","<div class=\"card\" data-testid=\"generic-table-card\">\n <div class=\"card__header\">\n <div class=\"card__title\">\n @if (header(); as header) {\n {{ header }}\n @if (headerTooltip(); as tooltip) {\n <ui5-icon\n class=\"card__info-icon\"\n name=\"hint\"\n [accessibleName]=\"tooltip\"\n [showTooltip]=\"true\"\n />\n }\n }\n </div>\n <div class=\"card__actions\">\n @if (resourcesSearchable()) {\n @if (searchExpanded()) {\n <ui5-input\n #searchInput\n data-testid=\"generic-table-card-search-input\"\n [class]=\"\n 'card__search-input card__search-input--' +\n (searchCollapsing() ? 'leave' : 'enter')\n \"\n [formControl]=\"searchControl\"\n (animationend)=\"onSearchAnimationEnd()\"\n (blur)=\"onSearchBlur()\"\n />\n }\n <ui5-button\n class=\"card__search-btn\"\n data-testid=\"generic-table-card-search-btn\"\n design=\"Transparent\"\n [accessibleName]=\"searchButtonConfig()?.tooltip ?? 'Search'\"\n [icon]=\"searchButtonConfig()?.icon ?? 'search'\"\n [tooltip]=\"searchButtonConfig()?.tooltip ?? 'Search'\"\n (click)=\"toggleSearch()\"\n />\n }\n @if (createFormConfig()) {\n <ui5-button\n class=\"card__create-btn\"\n data-testid=\"generic-table-card-create-btn\"\n [accessibleName]=\"createButtonConfig()?.text || createButtonConfig()?.tooltip || 'Create'\"\n [design]=\"createButtonConfig()?.design ?? 'Transparent'\"\n [icon]=\"createButtonConfig()?.icon ?? 'add'\"\n [tooltip]=\"createButtonConfig()?.tooltip\"\n (click)=\"createDialogOpen.set(true)\"\n >\n {{ createButtonConfig()?.text ?? '' }}\n </ui5-button>\n }\n </div>\n </div>\n\n @if (hasFilterTabs()) {\n <mfp-filter-tabs\n [tabs]=\"filterTabs()\"\n (tabChanged)=\"onFilterTabChanged($event)\"\n />\n }\n\n <div class=\"card__body\">\n @if (tableConfig(); as config) {\n <mfp-declarative-table\n [columns]=\"effectiveColumns()\"\n [growMode]=\"config.growMode ?? 'Button'\"\n [hasMore]=\"config.hasMore ?? false\"\n [height]=\"config.height\"\n [loadMoreButtonText]=\"config.loadMoreButtonText ?? 'Load More'\"\n [paginationLimit]=\"config.paginationLimit ?? 5\"\n [resources]=\"resources()\"\n [totalItemsCount]=\"config.totalItemsCount\"\n (buttonClick)=\"onButtonClick($event)\"\n (loadMoreResources)=\"loadMoreResources.emit()\"\n (paginationLimitChanged)=\"paginationLimitChanged.emit($event)\"\n (tableRowClicked)=\"tableRowClicked.emit($event)\"\n />\n }\n </div>\n</div>\n\n@if (createFormConfig(); as config) {\n <ui5-dialog\n data-testid=\"generic-table-card-create-dialog\"\n [accessibleName]=\"config.title ?? 'Create'\"\n [open]=\"createDialogOpen()\"\n (ui5BeforeClose)=\"createDialogOpen.set(false)\"\n >\n <div class=\"dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ config.title ?? 'Create' }}</ui5-title>\n </div>\n <div class=\"dialog__body\">\n <mfp-declarative-form\n #createForm\n [fieldErrors]=\"createFormState().fieldErrors ?? {}\"\n [fields]=\"config.fields\"\n (fieldChange)=\"onCreateFieldChange($event)\"\n (formSubmit)=\"onCreateSubmit($event)\"\n />\n </div>\n <div class=\"dialog__footer\" slot=\"footer\">\n <ui5-button\n data-testid=\"generic-table-card-create-confirm\"\n design=\"Emphasized\"\n [disabled]=\"hasErrors(createFormState())\"\n (click)=\"createForm.submit()\"\n >\n {{ config.confirmLabel ?? 'Save' }}\n </ui5-button>\n <ui5-button data-testid=\"generic-table-card-create-cancel\" design=\"Transparent\" (click)=\"closeCreateDialog()\">\n {{ config.cancelLabel ?? 'Cancel' }}\n </ui5-button>\n </div>\n </ui5-dialog>\n}\n\n@if (editFormConfig(); as config) {\n <ui5-dialog\n data-testid=\"generic-table-card-edit-dialog\"\n [accessibleName]=\"config.title ?? 'Edit'\"\n [open]=\"editDialogOpen()\"\n (ui5BeforeClose)=\"editDialogOpen.set(false)\"\n >\n <div class=\"dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ config.title ?? 'Edit' }}</ui5-title>\n </div>\n <div class=\"dialog__body\">\n <mfp-declarative-form\n #editForm\n [fieldErrors]=\"editFormState().fieldErrors ?? {}\"\n [fields]=\"config.fields\"\n [initialValues]=\"editInitialValue()\"\n (fieldChange)=\"onEditFieldChange($event)\"\n (formSubmit)=\"onEditSubmit($event)\"\n />\n </div>\n <div class=\"dialog__footer\" slot=\"footer\">\n <ui5-button\n data-testid=\"generic-table-card-edit-confirm\"\n design=\"Emphasized\"\n [disabled]=\"hasErrors(editFormState())\"\n (click)=\"editForm.submit()\"\n >\n {{ config.confirmLabel ?? 'Edit' }}\n </ui5-button>\n <ui5-button data-testid=\"generic-table-card-edit-cancel\" design=\"Transparent\" (click)=\"closeEditDialog()\">\n {{ config.cancelLabel ?? 'Cancel' }}\n </ui5-button>\n </div>\n </ui5-dialog>\n}\n\n@if (deleteConfirmationConfig(); as config) {\n <ui5-dialog\n data-testid=\"generic-table-card-delete-dialog\"\n [accessibleName]=\"config.title ?? 'Confirm Delete'\"\n [open]=\"deleteDialogOpen()\"\n (ui5BeforeClose)=\"deleteDialogOpen.set(false)\"\n >\n <div class=\"dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ config.title ?? 'Confirm Delete' }}</ui5-title>\n </div>\n @if (config.message) {\n <div class=\"dialog__body\">\n <p class=\"dialog__message\">{{ config.message }}</p>\n </div>\n }\n <div class=\"dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"generic-table-card-delete-confirm\" design=\"Negative\" (click)=\"onDeleteSubmit()\">\n {{ config.confirmLabel ?? 'Delete' }}\n </ui5-button>\n <ui5-button data-testid=\"generic-table-card-delete-cancel\" design=\"Transparent\" (click)=\"closeDeleteDialog()\">\n {{ config.cancelLabel ?? 'Cancel' }}\n </ui5-button>\n </div>\n </ui5-dialog>\n}\n","import de from './de.json';\nimport en from './en.json';\n\nexport type DashboardLanguage = 'en' | 'de';\n\nexport const DASHBOARD_I18N_KEYS = {\n UNSAVED_CHANGES: 'unsavedChanges',\n EDIT_CARDS: 'editCards',\n EDIT_VIEW: 'editView',\n ACTIONS: 'actions',\n SAVE: 'save',\n CANCEL: 'cancel',\n DISCARD: 'discard',\n DISCARD_CHANGES: 'discardChanges',\n DISCARD_CONFIRM_BODY: 'discardConfirmBody',\n UNSAVED_NAV_BODY: 'unsavedNavBody',\n NO_CARDS_AVAILABLE: 'noCardsAvailable',\n REMOVE_SECTION: 'removeSection',\n REMOVE_CARD: 'removeCard',\n RESIZABLE: 'resizable',\n} as const;\n\nexport type DashboardI18nKey =\n (typeof DASHBOARD_I18N_KEYS)[keyof typeof DASHBOARD_I18N_KEYS];\n\nexport const DASHBOARD_TRANSLATIONS: Record<\n DashboardLanguage,\n Record<DashboardI18nKey, string>\n> = {\n en,\n de,\n};\n","import {\n DASHBOARD_TRANSLATIONS,\n DashboardI18nKey,\n DashboardLanguage,\n} from './dashboard-i18n';\nimport { Injectable, signal } from '@angular/core';\n\n/**\n * Holds the dashboard's current language and resolves translation keys for\n * the dashboard chrome (toolbar buttons, dialogs, a11y labels). Provided at\n * the `Dashboard` component level so every nested dashboard component shares\n * the same language signal — child components inject the same instance and\n * react to language changes automatically because `getTranslation` reads the\n * signal on every call.\n */\n@Injectable()\nexport class DashboardI18nService {\n readonly language = signal<DashboardLanguage>('en');\n\n getTranslation(key: DashboardI18nKey): string {\n return DASHBOARD_TRANSLATIONS[this.language()][key] ?? key;\n }\n}\n","import { ButtonSettings } from '../../models/ui-definition';\n\n\n\n\nexport const CARD_TYPES = {\n WC: 'wc',\n ANGULAR: 'angular',\n SAP_UI: 'sap-ui',\n} as const;\n\nexport type CardsType = (typeof CARD_TYPES)[keyof typeof CARD_TYPES];\n\n/** Configuration for a single card placed in the dashboard grid or a section. */\nexport interface CardConfig {\n /** Unique identifier for this card. Used as a stable key for position persistence. */\n id: string;\n /** Column span (1–12). Defaults to 12 when omitted. */\n w?: number;\n /** Row span — number of CSS grid rows occupied (1 row = 10 px by default). Defaults to 100 when omitted. */\n h?: number;\n /** Starting column index (0-based). Omit to let the grid auto-place the card. */\n x?: number;\n /** Starting row index (0-based). Omit to let the grid auto-place the card. */\n y?: number;\n /** Maximum row span in edit mode. */\n maxH?: number;\n /** Maximum column span in edit mode. */\n maxW?: number;\n /** Minimum row span in edit mode. */\n minH?: number;\n /** Minimum column span in edit mode. */\n minW?: number;\n /** ID of the parent section. Omit to place the card in the loose-card grid. */\n sectionId?: string;\n /**\n * Custom-element tag name (for `'wc'`/omitted), Angular component selector (for `'angular'`),\n * or SAP UI5 component name (for `'sap-ui'`).\n */\n component: string;\n /**\n * Render strategy for the card.\n * - `'wc'` (default) — creates a custom element and sets `componentInputs` as DOM properties.\n * - `'angular'` — looks up the Angular registry; warns and renders nothing if not found.\n * - `'sap-ui'` — mounts via `window.sap.ui.require` + `ComponentContainer`.\n */\n type?: CardsType;\n /** Key/value pairs passed to the rendered card. Behaviour depends on `type`. */\n componentInputs?: Record<string, unknown>;\n /** Human-readable label shown in the \"Add Card\" dialog. */\n label?: string;\n}\n\nexport type MountCfg = Pick<\n CardConfig,\n 'type' | 'component' | 'componentInputs'\n>;\n\n/** Configuration for a named horizontal section that groups cards. */\nexport interface SectionConfig {\n /** Unique identifier for this section. */\n id: string;\n /** Column span (1–12). Defaults to 12 when omitted. */\n w?: number;\n /** Section heading displayed in the UI. */\n title?: string;\n /** When `false`, the section and its cards are excluded from edit mode. Defaults to `true` when omitted. */\n editable?: boolean;\n}\n\n/** Overrides for the two built-in dashboard toolbar buttons. */\nexport interface DashboardButtonsSettings {\n /** Partial override merged on top of the Edit View button defaults. */\n editViewButton?: Partial<ButtonSettings>;\n /** Partial override merged on top of the Edit Cards button defaults. */\n editCardsButton?: Partial<ButtonSettings>;\n}\n\n/** Top-level configuration for the `<mfp-dashboard>` component. */\nexport interface DashboardConfig {\n /** Dashboard title rendered in the toolbar. */\n title: string;\n /** Optional subtitle shown below the title. */\n description?: string;\n /** URL of the background image applied to the dashboard host element. */\n backgroundImageUrl?: string;\n /** Overrides for the built-in Edit View and Add Card toolbar buttons. */\n buttonsSettings?: DashboardButtonsSettings;\n /** Extra action buttons rendered in the toolbar alongside the built-in ones. */\n customActions?: ButtonSettings[];\n /** When `true`, shows the Edit View button in the toolbar, allowing the user to enter edit mode. */\n editable?: boolean;\n /** When `true`, the Edit View button is rendered before the custom actions instead of after. Defaults to `false`. */\n editButtonFirst?: boolean;\n}\n","import {\n Type,\n isDevMode,\n isStandalone,\n reflectComponentType,\n} from '@angular/core';\n\n\nexport interface RegisteredDashboardCardComponent {\n componentType: Type<unknown>;\n selector: string;\n inputs: ReadonlyMap<string, string>;\n}\n\nconst ELEMENT_SELECTOR_PATTERN = /^[a-z](?:[a-z0-9-]*)$/;\n\nconst dashboardCardRegistry = new Map<\n string,\n RegisteredDashboardCardComponent\n>();\n\nexport function addComponentToRegistry(componentTypes: Type<unknown>[]): void {\n for (const componentType of componentTypes) {\n const mirror = reflectComponentType(componentType);\n\n if (!mirror) {\n throw new Error(\n `Dashboard card registration failed: \"${getTypeName(componentType)}\" is not an Angular component.`,\n );\n }\n\n if (!isStandalone(componentType)) {\n throw new Error(\n `Dashboard card registration failed: \"${mirror.selector}\" must be a standalone Angular component.`,\n );\n }\n\n const selector = toElementSelector(mirror.selector, componentType);\n const existing = dashboardCardRegistry.get(selector);\n\n if (existing && existing.componentType !== componentType) {\n throw new Error(\n `Dashboard card registration failed: selector \"${selector}\" is already registered.`,\n );\n }\n\n dashboardCardRegistry.set(selector, {\n componentType,\n selector,\n inputs: createInputMap(mirror.inputs),\n });\n }\n}\n\nexport function getRegisteredDashboardCardComponent(\n selector: string,\n): RegisteredDashboardCardComponent | undefined {\n return dashboardCardRegistry.get(selector);\n}\n\nexport function resetDashboardCardRegistry(): void {\n dashboardCardRegistry.clear();\n}\n\nexport function warnForUnknownDashboardCardInput(\n selector: string,\n inputName: string,\n): void {\n if (!isDevMode()) return;\n\n console.warn(\n `Dashboard card \"${selector}\" ignores unknown Angular input \"${inputName}\".`,\n );\n}\n\nfunction createInputMap(\n inputs: readonly {\n readonly propName: string;\n readonly templateName: string;\n }[],\n): ReadonlyMap<string, string> {\n const bindings = new Map<string, string>();\n\n for (const input of inputs) {\n bindings.set(input.templateName, input.templateName);\n bindings.set(input.propName, input.templateName);\n }\n\n return bindings;\n}\n\nfunction toElementSelector(\n selector: string,\n componentType: Type<unknown>,\n): string {\n const normalized = selector.trim();\n\n if (!ELEMENT_SELECTOR_PATTERN.test(normalized)) {\n throw new Error(\n `Dashboard card registration failed: \"${getTypeName(componentType)}\" must use a single element selector. Received \"${selector}\".`,\n );\n }\n\n return normalized;\n}\n\nfunction getTypeName(componentType: Type<unknown>): string {\n return componentType.name.replace(/^_+/, '') || 'AnonymousComponent';\n}\n","import { MountCfg } from '../../models';\nimport {\n getRegisteredDashboardCardComponent,\n warnForUnknownDashboardCardInput,\n} from './dashboard-card-registry';\nimport { EffectCleanupRegisterFn, ViewContainerRef } from '@angular/core';\n\nexport function mountAngularCard(\n cfg: MountCfg,\n angularHost: ViewContainerRef,\n onCleanup: EffectCleanupRegisterFn,\n): void {\n const registeredComponent = getRegisteredDashboardCardComponent(\n cfg.component,\n );\n\n if (!registeredComponent) {\n console.warn(\n `[DashboardCard] Angular component \"${cfg.component}\" is not registered`,\n );\n return;\n }\n\n const componentRef = angularHost.createComponent(\n registeredComponent.componentType,\n );\n\n for (const [inputName, value] of Object.entries(cfg.componentInputs ?? {})) {\n const templateName = registeredComponent.inputs.get(inputName);\n\n if (!templateName) {\n warnForUnknownDashboardCardInput(cfg.component, inputName);\n continue;\n }\n\n componentRef.setInput(templateName, value);\n }\n\n componentRef.changeDetectorRef.detectChanges();\n\n onCleanup(() => {\n angularHost.clear();\n });\n}\n","import { MountCfg } from '../../models';\nimport { EffectCleanupRegisterFn, ViewContainerRef } from '@angular/core';\n\nexport type SapUiRequire = (\n deps: string[],\n cb: (\n ComponentContainer: new (cfg: {\n name: string;\n manifest: boolean;\n async: boolean;\n settings: Record<string, unknown>;\n }) => { placeAt(el: HTMLElement): void; destroy(): void },\n ) => void,\n) => void;\n\nexport function mountSapCard(\n cfg: MountCfg,\n container: ViewContainerRef,\n onCleanup: EffectCleanupRegisterFn,\n): void {\n const host = container.element.nativeElement;\n\n let sapContainer: { destroy(): void } | null = null;\n let isDestroyed = false;\n const sapRequire = (\n window as unknown as { sap?: { ui: { require: SapUiRequire } } }\n ).sap?.ui?.require;\n\n if (sapRequire) {\n sapRequire(['sap/ui/core/ComponentContainer'], (ComponentContainer) => {\n if (isDestroyed) return;\n\n const container = new ComponentContainer({\n name: cfg.component,\n manifest: true,\n async: true,\n settings: cfg.componentInputs ?? {},\n });\n\n container.placeAt(host);\n sapContainer = container;\n });\n } else {\n console.error('[DashboardCard] SAP UI5 is not available on window.sap');\n }\n\n onCleanup(() => {\n isDestroyed = true;\n sapContainer?.destroy();\n host.innerHTML = '';\n });\n}\n","import { MountCfg } from '../../models';\nimport {\n EffectCleanupRegisterFn,\n Renderer2,\n ViewContainerRef,\n} from '@angular/core';\n\nexport function mountWcCard(\n cfg: MountCfg,\n container: ViewContainerRef,\n onCleanup: EffectCleanupRegisterFn,\n renderer: Renderer2,\n): void {\n const host = container.element.nativeElement;\n const element = renderer.createElement(cfg.component);\n\n for (const [key, value] of Object.entries(cfg.componentInputs ?? {})) {\n renderer.setProperty(element, key, value);\n }\n\n renderer.appendChild(host, element);\n\n onCleanup(() => {\n host.innerHTML = '';\n });\n}\n","import { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport { CARD_TYPES, CardConfig } from '../models';\nimport { mountAngularCard, mountSapCard, mountWcCard } from './utils';\nimport {\n Component,\n Renderer2,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/resize-corner.js';\n\n@Component({\n selector: 'mfp-dashboard-card',\n imports: [Button, Icon],\n templateUrl: './dashboard-card.component.html',\n styleUrl: './dashboard-card.component.scss',\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n '[style.grid-column]': 'gridColumn()',\n '[style.grid-row]': 'gridRow()',\n },\n})\nexport class DashboardCard {\n card = input.required<CardConfig>();\n editMode = input<boolean>(false);\n readonly removeCard = output<void>();\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n protected readonly gridColumn = computed(() => {\n const width = this.card().w ?? 12;\n return this.createGridTrack(this.card().x, width);\n });\n protected readonly gridRow = computed(() => {\n const height = this.card().h ?? 100;\n return this.createGridTrack(this.card().y, height);\n });\n\n private host = viewChild('elementHost', { read: ViewContainerRef });\n private renderer = inject(Renderer2);\n\n private readonly mountCfg = computed(\n () => {\n const c = this.card();\n return {\n type: c.type,\n component: c.component,\n componentInputs: c.componentInputs,\n };\n },\n {\n equal: (a, b) =>\n a.type === b.type &&\n a.component === b.component &&\n JSON.stringify(a.componentInputs) === JSON.stringify(b.componentInputs),\n },\n );\n\n constructor() {\n effect((onCleanup) => {\n const host = this.host();\n const mountCfg = this.mountCfg();\n if (!host || !mountCfg.component) return;\n\n host.clear();\n host.element.nativeElement.innerHTML = '';\n\n switch (mountCfg.type) {\n case CARD_TYPES.SAP_UI:\n mountSapCard(mountCfg, host, onCleanup);\n break;\n case CARD_TYPES.ANGULAR:\n mountAngularCard(mountCfg, host, onCleanup);\n break;\n case CARD_TYPES.WC:\n default:\n mountWcCard(mountCfg, host, onCleanup, this.renderer);\n break;\n }\n });\n }\n\n private createGridTrack(start: number | undefined, span: number): string {\n if (start === undefined) {\n return `span ${span}`;\n }\n\n return `${start + 1} / span ${span}`;\n }\n}\n","@if (card().component) {\n <div class=\"component-card\" [attr.data-testid]=\"'dashboard-card-' + card().id\" [class.component-card--editing]=\"editMode()\">\n @if (editMode()) {\n <div class=\"remove-wrapper\">\n <ui5-button\n class=\"card__remove\"\n design=\"Default\"\n icon=\"decline\"\n [attr.data-testid]=\"'dashboard-card-' + card().id + '-remove'\"\n [accessibleName]=\"\n i18n.getTranslation(i18nKeys.REMOVE_CARD) +\n ': ' +\n (card().label || card().component)\n \"\n (click)=\"removeCard.emit()\"\n />\n </div>\n <ui5-icon\n aria-hidden=\"true\"\n class=\"card__resize-indicator\"\n name=\"resize-corner\"\n [accessibleName]=\"i18n.getTranslation(i18nKeys.RESIZABLE)\"\n />\n }\n <div\n class=\"component-host\"\n [style.pointer-events]=\"editMode() ? 'none' : 'auto'\"\n >\n <div #elementHost></div>\n </div>\n </div>\n} @else {\n <div class=\"card\" [attr.data-testid]=\"'dashboard-card-' + card().id\">\n <div\n class=\"card__body\"\n [style.pointer-events]=\"editMode() ? 'none' : 'auto'\"\n >\n <ng-content />\n </div>\n </div>\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// MUST MATCH: ./_breakpoints.scss\n//\n// These breakpoints are consumed by two systems that can't share a single\n// source of truth at compile time:\n//\n// 1. dashboard.component.ts — passed to Gridstack as\n// `gridOptions.columnOpts.breakpoints`. Gridstack picks the active\n// breakpoint by `w` (max-width). At each breakpoint, every grid item is\n// laid out using `c` columns.\n//\n// 2. dashboard.component.scss — used in a `@container` query so the\n// `.mfp-sections-container` CSS grid mirrors the same column count as\n// Gridstack at the same width.\n//\n// If you change either set of values, change BOTH files in the same commit.\n// The two are kept in sync by hand (no codegen). A SCSS-from-TS generator\n// would remove this hazard but is out of scope here.\n// ─────────────────────────────────────────────────────────────────────────────\nimport type { Breakpoint } from 'gridstack';\n\n/**\n * Layout strategy applied at each breakpoint when Gridstack changes column\n * count. See ColumnOptions in gridstack/dist/types.d.ts:27 for the full set.\n */\ntype LayoutStrategy = 'compact' | 'list' | 'none';\n\n/** Single source of truth for grid + section breakpoints (TypeScript half). */\nexport const DASHBOARD_BREAKPOINTS: readonly Readonly<Required<Pick<Breakpoint, 'w' | 'c'>> & { layout: LayoutStrategy }>[] = [\n { w: 4000, c: 14, layout: 'compact' },\n { w: 1439, c: 12, layout: 'compact' },\n { w: 1023, c: 8, layout: 'compact' },\n { w: 599, c: 1, layout: 'list' },\n] as const;\n","export const COMPACT_BREAKPOINT = 726;\nexport const CELL_HEIGHT = 10;\n","import { Component, ViewEncapsulation, inject, input, output } from '@angular/core';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/alert.js';\n\n/**\n * Confirmation popup shown when the user tries to abandon edit mode while\n * there are unsaved dashboard changes. Emits `confirm` when the user accepts\n * the discard, `cancelled` when they back out.\n */\n@Component({\n selector: 'mfp-discard-changes-dialog',\n imports: [Button, Dialog, Title],\n templateUrl: './discard-changes-dialog.component.html',\n styleUrl: './discard-changes-dialog.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class DiscardChangesDialog {\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n open = input<boolean>(false);\n\n readonly confirm = output<void>();\n readonly cancelled = output<void>();\n}\n","<ui5-dialog data-testid=\"dashboard-discard-changes-dialog\" state=\"Critical\" [open]=\"open()\" (ui5BeforeClose)=\"cancelled.emit()\">\n <div class=\"discard-changes-dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ i18n.getTranslation(i18nKeys.DISCARD_CHANGES) }}</ui5-title>\n </div>\n <div class=\"discard-changes-dialog__body\">\n {{ i18n.getTranslation(i18nKeys.DISCARD_CONFIRM_BODY) }}\n </div>\n <div class=\"discard-changes-dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"dashboard-discard-changes-confirm-btn\" design=\"Emphasized\" (click)=\"confirm.emit()\">{{ i18n.getTranslation(i18nKeys.DISCARD) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-discard-changes-cancel-btn\" design=\"Transparent\" (click)=\"cancelled.emit()\">{{ i18n.getTranslation(i18nKeys.CANCEL) }}</ui5-button>\n </div>\n</ui5-dialog>\n","import { CardConfig } from '../models';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport {\n Component,\n ElementRef,\n ViewEncapsulation,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { List } from '@fundamental-ngx/ui5-webcomponents/list';\nimport { ListItemCustom } from '@fundamental-ngx/ui5-webcomponents/list-item-custom';\nimport { Switch } from '@fundamental-ngx/ui5-webcomponents/switch';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n@Component({\n selector: 'mfp-edit-cards-dialog',\n imports: [Button, Dialog, List, ListItemCustom, Switch, Title],\n templateUrl: './edit-cards-dialog.component.html',\n styleUrl: './edit-cards-dialog.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class EditCardsDialog {\n private readonly host = inject(ElementRef<HTMLElement>);\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n availableCards = input<CardConfig[]>([]);\n addedCardsIds = input<Set<string>>(new Set());\n open = input<boolean>(false);\n\n readonly confirm = output<{ added: CardConfig[]; removed: string[] }>();\n readonly cancelled = output<void>();\n\n selectedIds = signal<Set<string>>(new Set());\n\n constructor() {\n effect(() => {\n if (this.open()) {\n const initial = new Set(\n this.availableCards()\n .filter((ac) => this.addedCardsIds().has(ac.id))\n .map((ac) => ac.id),\n );\n this.selectedIds.set(initial);\n }\n });\n }\n\n toggle(id: string): void {\n this.selectedIds.update((set) => {\n const next = new Set(set);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }\n\n /**\n * Tab moves focus across the switches directly, skipping the wrapping\n * ui5-li-custom rows. Past the last switch Tab goes to the first footer\n * button; before the first switch Shift+Tab goes to the last footer button.\n * The dialog's native focus trap takes care of cycling from the buttons\n * back into the list.\n */\n onSwitchKeydown(event: KeyboardEvent, _id: string): void {\n if (event.key !== 'Tab') {\n return;\n }\n const root: ParentNode =\n this.host.nativeElement.shadowRoot ?? this.host.nativeElement;\n const switches = Array.from(\n root.querySelectorAll('ui5-switch'),\n ) as HTMLElement[];\n const buttons = Array.from(\n root.querySelectorAll('ui5-button'),\n ) as HTMLElement[];\n const currentIndex = switches.indexOf(event.currentTarget as HTMLElement);\n if (currentIndex === -1) {\n return;\n }\n if (event.shiftKey) {\n const prev = switches[currentIndex - 1];\n if (prev) {\n event.preventDefault();\n event.stopPropagation();\n prev.focus();\n }\n // First switch: let Shift+Tab fall through so the dialog's focus trap\n // wraps to the last footer button.\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const next = switches[currentIndex + 1];\n if (next) {\n next.focus();\n return;\n }\n // Last switch: hand off to the first footer button.\n buttons[0]?.focus();\n }\n\n confirmSave(): void {\n const availableIds = new Set(this.availableCards().map((ac) => ac.id));\n const added = this.availableCards().filter(\n (ac) => this.selectedIds().has(ac.id) && !this.addedCardsIds().has(ac.id),\n );\n const removed = [...this.addedCardsIds()].filter(\n (id) => availableIds.has(id) && !this.selectedIds().has(id),\n );\n this.confirm.emit({ added, removed });\n }\n}\n","<ui5-dialog data-testid=\"dashboard-edit-cards-dialog\" class=\"edit-cards-dialog-container\" [open]=\"open()\" (ui5BeforeClose)=\"cancelled.emit()\">\n <div class=\"edit-cards-dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ i18n.getTranslation(i18nKeys.EDIT_CARDS) }}</ui5-title>\n </div>\n <div class=\"edit-cards-dialog\">\n <ui5-list\n selectionMode=\"None\"\n separators=\"Inner\"\n [noDataText]=\"i18n.getTranslation(i18nKeys.NO_CARDS_AVAILABLE)\"\n >\n @for (availableCard of availableCards(); track availableCard.id) {\n <ui5-li-custom\n [attr.data-testid]=\"'dashboard-edit-cards-row-' + availableCard.id\"\n class=\"edit-cards-dialog__list-item-container\"\n [accessibleName]=\"availableCard.label || availableCard.component\"\n >\n <div class=\"edit-cards-dialog__list-item\">\n <span>{{ availableCard.label || availableCard.component }}</span>\n <ui5-switch\n [attr.data-testid]=\"'dashboard-edit-cards-switch-' + availableCard.id\"\n [accessibleName]=\"availableCard.label || availableCard.component\"\n [checked]=\"selectedIds().has(availableCard.id)\"\n (keydown)=\"onSwitchKeydown($event, availableCard.id)\"\n (ui5Change)=\"toggle(availableCard.id)\"\n />\n </div>\n </ui5-li-custom>\n }\n </ui5-list>\n </div>\n <div class=\"edit-cards-dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"dashboard-edit-cards-save-btn\" design=\"Emphasized\" (click)=\"confirmSave()\">{{ i18n.getTranslation(i18nKeys.SAVE) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-edit-cards-cancel-btn\" design=\"Transparent\" (click)=\"cancelled.emit()\">{{ i18n.getTranslation(i18nKeys.CANCEL) }}</ui5-button>\n </div>\n</ui5-dialog>\n","import { DashboardCard } from '../card/dashboard-card.component';\nimport { CardConfig, SectionConfig } from '../models';\nimport { Component, ViewEncapsulation, inject, input, output } from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\n\n@Component({\n selector: 'mfp-dashboard-section',\n imports: [DashboardCard, Button],\n templateUrl: './dashboard-section.component.html',\n styleUrl: './dashboard-section.component.scss',\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Section width interpretation:\n // - `section.w` undefined OR equal to the active outer grid's column\n // count (12) → span the full outer row (`1 / -1`). This is what the\n // consumer means by \"full-width section\": fill whatever the dashboard\n // is showing right now (4 / 8 / 12 / 14 columns at sm/md/lg/xl).\n // - any other explicit `w` → span exactly that many outer columns.\n //\n // Without `1 / -1`, a `w: 12` section in an xl grid (14 cols) would only\n // cover 12 of 14 columns, leaving a dead 2-col gutter on the right and\n // squeezing the cards inside it relative to the outer grid's units.\n '[style.grid-column]':\n 'section().w === undefined || section().w === 12 ? \"1 / -1\" : \"span \" + section().w',\n },\n})\nexport class DashboardSection {\n section = input.required<SectionConfig>();\n cards = input<CardConfig[]>([]);\n /**\n * Optional override for the section's inner grid column count. Leave unset\n * (the default) to inherit the responsive defaults from CSS — the section\n * grid then mirrors the dashboard breakpoints (4/8/12/14 columns) via the\n * `mfp-dashboard` container query in dashboard-section.component.scss.\n * Pass an explicit number only when a section needs a fixed column count\n * regardless of width.\n */\n columns = input<number | undefined>(undefined);\n editMode = input<boolean>(false);\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n readonly removeSection = output<void>();\n readonly removeCard = output<string>();\n}\n","<div\n class=\"section\"\n [attr.data-testid]=\"'dashboard-section-' + section().id\"\n [class.section--edit]=\"editMode() && section().editable !== false\"\n>\n @if (editMode() && section().editable !== false) {\n <ui5-button\n class=\"section__remove\"\n design=\"Default\"\n icon=\"decline\"\n [attr.data-testid]=\"'dashboard-section-' + section().id + '-remove'\"\n [accessibleName]=\"\n i18n.getTranslation(i18nKeys.REMOVE_SECTION) +\n ': ' +\n (section().title || section().id)\n \"\n (click)=\"removeSection.emit()\"\n />\n }\n @if (section().title) {\n <div class=\"section__header\">\n <span class=\"section__title\" [attr.data-testid]=\"'dashboard-section-' + section().id + '-title'\">{{ section().title }}</span>\n </div>\n }\n <div class=\"section__grid\" [style.--cols]=\"columns() ?? null\">\n @for (card of cards(); track card.id) {\n <mfp-dashboard-card\n [card]=\"card\"\n [editMode]=\"editMode() && section().editable !== false\"\n (removeCard)=\"removeCard.emit($any(card.id))\"\n />\n }\n </div>\n</div>\n","import { Component, ViewEncapsulation, inject, input, output } from '@angular/core';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/alert.js';\n\n/**\n * Confirmation popup shown when the user attempts to navigate away from the\n * dashboard while there are unsaved edit-mode changes. The host (the\n * dashboard, an Angular CanDeactivate guard, a Luigi navigation listener,\n * etc.) is responsible for routing its intercepted navigation through this\n * dialog and acting on the emitted decision:\n * - `save` → persist changes, then proceed with navigation\n * - `discard` → revert changes, then proceed with navigation\n * - `cancelled` → abort navigation, stay on the page\n */\n@Component({\n selector: 'mfp-unsaved-changes-dialog',\n imports: [Button, Dialog, Title],\n templateUrl: './unsaved-changes-dialog.component.html',\n styleUrl: './unsaved-changes-dialog.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class UnsavedChangesDialog {\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n open = input<boolean>(false);\n\n readonly save = output<void>();\n readonly discard = output<void>();\n readonly cancelled = output<void>();\n}\n","<ui5-dialog data-testid=\"dashboard-unsaved-changes-dialog\" state=\"Critical\" [open]=\"open()\" (ui5BeforeClose)=\"cancelled.emit()\">\n <div class=\"unsaved-changes-dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ i18n.getTranslation(i18nKeys.UNSAVED_CHANGES) }}</ui5-title>\n </div>\n <div class=\"unsaved-changes-dialog__body\">\n {{ i18n.getTranslation(i18nKeys.UNSAVED_NAV_BODY) }}\n </div>\n <div class=\"unsaved-changes-dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"dashboard-unsaved-changes-save-btn\" design=\"Emphasized\" (click)=\"save.emit()\">{{ i18n.getTranslation(i18nKeys.SAVE) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-unsaved-changes-discard-btn\" design=\"Transparent\" (click)=\"discard.emit()\">{{ i18n.getTranslation(i18nKeys.DISCARD) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-unsaved-changes-cancel-btn\" design=\"Transparent\" (click)=\"cancelled.emit()\">{{ i18n.getTranslation(i18nKeys.CANCEL) }}</ui5-button>\n </div>\n</ui5-dialog>\n","import {\n Component,\n ElementRef,\n Injector,\n OnDestroy,\n OnInit,\n SecurityContext,\n Type,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Menu } from '@fundamental-ngx/ui5-webcomponents/menu';\nimport { MenuItem } from '@fundamental-ngx/ui5-webcomponents/menu-item';\nimport { MenuSeparator } from '@fundamental-ngx/ui5-webcomponents/menu-separator';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/action-settings.js';\nimport '@ui5/webcomponents-icons/dist/menu2.js';\nimport '@ui5/webcomponents-icons/dist/user-edit.js';\nimport { GridStackNode, GridStackOptions } from 'gridstack';\nimport {\n GridstackComponent,\n GridstackItemComponent,\n} from 'gridstack/dist/angular';\nimport { ButtonSettings } from '../../models';\nimport { DashboardCard } from '../card/dashboard-card.component';\nimport { addComponentToRegistry } from '../card/utils';\nimport {\n CELL_HEIGHT,\n COMPACT_BREAKPOINT,\n DASHBOARD_BREAKPOINTS,\n} from '../constants';\nimport { DiscardChangesDialog } from '../discard-changes-dialog/discard-changes-dialog.component';\nimport { EditCardsDialog } from '../edit-cards-dialog/edit-cards-dialog.component';\nimport {\n DASHBOARD_I18N_KEYS,\n DashboardI18nService,\n DashboardLanguage,\n} from '../i18n';\nimport { CardConfig, DashboardConfig, SectionConfig } from '../models';\nimport { DashboardSection } from '../section/dashboard-section.component';\nimport { UnsavedChangesDialog } from '../unsaved-changes-dialog/unsaved-changes-dialog.component';\n\ndocument.body.classList.add('ui5-content-density-compact');\n\n@Component({\n selector: 'mfp-dashboard',\n imports: [\n GridstackComponent,\n GridstackItemComponent,\n DiscardChangesDialog,\n EditCardsDialog,\n UnsavedChangesDialog,\n DashboardSection,\n DashboardCard,\n Button,\n Icon,\n Menu,\n MenuItem,\n MenuSeparator,\n Title,\n ],\n templateUrl: './dashboard.component.html',\n styleUrl: './dashboard.component.scss',\n providers: [DashboardI18nService],\n encapsulation: ViewEncapsulation.None,\n host: {\n '[style.background-image]':\n 'config().backgroundImageUrl ? \"url(\" + config().backgroundImageUrl + \")\" : null',\n '[style.background-size]':\n 'backgroundImageHeight() ? \"100% \" + backgroundImageHeight() + \"px\" : \"100% auto\"',\n },\n})\nexport class Dashboard implements OnInit, OnDestroy {\n static registerAngularComponents(componentTypes: Type<unknown>[]): void {\n addComponentToRegistry(componentTypes);\n }\n\n config = input.required<DashboardConfig>();\n sections = model<SectionConfig[]>([]);\n cards = model<CardConfig[]>([]);\n availableCards = input<CardConfig[]>([]);\n language = input<DashboardLanguage>('en');\n\n readonly saved = output<{ sections: SectionConfig[]; cards: CardConfig[] }>();\n readonly actionButtonClick = output<{\n event: MouseEvent;\n action: ButtonSettings;\n }>();\n readonly unsavedChangesChange = output<boolean>();\n\n editMode = signal(false);\n compactToolbar = signal(false);\n toolbarMenuOpen = signal(false);\n\n /** True once the user has dragged/resized any grid item while in edit mode. */\n private gridDirty = signal(false);\n\n protected backgroundImageHeight = signal<number | null>(null);\n\n /** JSON snapshots of sections/cards taken on entering edit mode, used to detect changes. */\n private sectionsSnapshotJson = '';\n private cardsSnapshotJson = '';\n\n /**\n * True when the user is in edit mode AND has made any change (sections/cards\n * mutated, or grid items moved/resized). Resets when entering edit mode and\n * after save/cancel.\n */\n hasUnsavedChanges = computed(() => {\n if (!this.editMode()) return false;\n if (this.gridDirty()) return true;\n return (\n JSON.stringify(this.sections()) !== this.sectionsSnapshotJson ||\n JSON.stringify(this.cards()) !== this.cardsSnapshotJson\n );\n });\n\n private sectionsSnapshot: SectionConfig[] = [];\n private cardsSnapshot: CardConfig[] = [];\n private gridStackItems = viewChild.required<GridstackComponent>('grid');\n private addCardBtn = viewChild<Button>('editCardsBtn');\n private resizeObserver?: ResizeObserver;\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly injector = inject(Injector);\n private readonly sanitizer = inject(DomSanitizer);\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n protected safeTitle = computed((): SafeHtml => {\n const clean =\n this.sanitizer.sanitize(SecurityContext.HTML, this.config().title) ?? '';\n return this.sanitizer.bypassSecurityTrustHtml(clean);\n });\n\n protected safeDescription = computed((): SafeHtml | null => {\n const desc = this.config().description;\n if (!desc) return null;\n\n const clean = this.sanitizer.sanitize(SecurityContext.HTML, desc) ?? '';\n return this.sanitizer.bypassSecurityTrustHtml(clean);\n });\n\n protected gridOptions = computed(\n (): GridStackOptions => ({\n cellHeight: CELL_HEIGHT,\n sizeToContent: true,\n disableResize: !this.editMode(),\n disableDrag: !this.editMode(),\n marginBottom: 0,\n marginLeft: 0,\n marginRight: 0,\n columnOpts: {\n // Source of truth: ../models/breakpoints.ts (paired with\n // ../models/_breakpoints.scss for the section grid's container queries).\n breakpoints: [...DASHBOARD_BREAKPOINTS],\n },\n }),\n );\n\n cardDialogOpen = signal(false);\n discardDialogOpen = signal(false);\n unsavedNavDialogOpen = signal(false);\n /** Callback that resumes the intercepted navigation once the user resolves the dialog. */\n private pendingNavigation: (() => void) | null = null;\n /** beforeunload handler kept on instance so add/removeEventListener pair up. */\n private readonly beforeUnloadHandler = (event: BeforeUnloadEvent): void => {\n if (this.hasUnsavedChanges()) {\n event.preventDefault();\n // Required by older browsers; the string itself is ignored — modern\n // browsers always render their own generic prompt.\n event.returnValue = '';\n }\n };\n customActions = computed(() => this.config().customActions ?? []);\n addedCardsIds = computed(() => new Set(this.cards().map((c) => c.id)));\n\n editViewButton = computed(() => ({\n icon: 'action-settings',\n design: 'Transparent' as const,\n tooltip: this.i18n.getTranslation(DASHBOARD_I18N_KEYS.EDIT_VIEW),\n text: '',\n ...this.config().buttonsSettings?.editViewButton,\n }));\n\n editCardsButton = computed(() => ({\n icon: '',\n design: 'Default' as const,\n tooltip: '',\n text: this.i18n.getTranslation(DASHBOARD_I18N_KEYS.EDIT_CARDS),\n ...this.config().buttonsSettings?.editCardsButton,\n }));\n\n sectionCards = computed(() => {\n const all = this.cards();\n return (sectionId: string) => all.filter((c) => c.sectionId === sectionId);\n });\n\n cardsPosition = new Map<\n string,\n { x?: number; y?: number; w?: number; h?: number }\n >();\n looseCards = linkedSignal(() => this.cards().filter((c) => !c.sectionId));\n\n private newGridStackNodes: GridStackNode[] = [];\n\n constructor() {\n effect(() => {\n this.unsavedChangesChange.emit(this.hasUnsavedChanges());\n });\n effect(() => {\n this.i18n.language.set(this.language());\n });\n effect((onCleanup) => {\n const url = this.config().backgroundImageUrl;\n this.backgroundImageHeight.set(null);\n if (!url) return;\n const img = new Image();\n img.onload = () => {\n this.backgroundImageHeight.set(img.naturalHeight);\n };\n img.src = url;\n onCleanup(() => {\n img.onload = null;\n });\n });\n }\n\n ngOnInit(): void {\n this.resizeObserver = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width ?? 0;\n this.compactToolbar.set(width < COMPACT_BREAKPOINT);\n });\n this.resizeObserver.observe(this.hostEl.nativeElement);\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\n }\n\n onMenuItemClick(actionId: string, event: Event): void {\n if (actionId === 'edit-view') {\n this.enterEditMode();\n return;\n }\n const action = this.customActions().find((a) => a.action === actionId);\n if (action) {\n this.actionButtonClick.emit({ event: event as MouseEvent, action });\n }\n }\n\n enterEditMode(): void {\n this.updateCardsPositions();\n\n this.sectionsSnapshot = [...this.sections()];\n this.cardsSnapshot = [...this.cards()];\n this.sectionsSnapshotJson = JSON.stringify(this.sections());\n this.cardsSnapshotJson = JSON.stringify(this.cards());\n this.gridDirty.set(false);\n this.editMode.set(true);\n afterNextRender(\n () => {\n this.addCardBtn()?.element.focus();\n },\n { injector: this.injector },\n );\n }\n\n saveEdit(): void {\n this.updateCardsPositions();\n\n const savedCards = this.cards().map((c) => {\n const pos = this.cardsPosition.get(c.id);\n return {\n ...c,\n x: pos?.x,\n y: pos?.y,\n w: pos?.w ?? c.w,\n h: pos?.h ?? c.h,\n };\n });\n this.gridDirty.set(false);\n this.editMode.set(false);\n\n this.cards.set(savedCards);\n this.saved.emit({\n sections: this.sections(),\n cards: savedCards,\n });\n }\n\n cancelEdit(): void {\n if (this.hasUnsavedChanges()) {\n this.discardDialogOpen.set(true);\n return;\n }\n this.discardEdit();\n }\n\n confirmDiscard(): void {\n this.discardDialogOpen.set(false);\n this.discardEdit();\n }\n\n cancelDiscard(): void {\n this.discardDialogOpen.set(false);\n }\n\n /**\n * Public framework-agnostic navigation guard. Consumer apps (Angular Router\n * CanDeactivate guard, Luigi navigation listener, plain `<a>` click handler,\n * window history listener — anything) call this before performing their\n * navigation:\n *\n * if (dashboard.requestNavigation(() => router.navigateByUrl(target))) {\n * // already navigated synchronously — clean state\n * } else {\n * // dashboard popped the unsaved-changes dialog; the navigation will\n * // resume from the user's choice (Save → proceed, Discard → proceed,\n * // Cancel → drop the request entirely).\n * }\n *\n * Returns `true` when navigation may proceed immediately (no unsaved\n * changes — `proceed` was invoked synchronously). Returns `false` when the\n * dialog has been opened and the caller must NOT navigate; the dashboard\n * will run the callback later if the user picks Save or Discard.\n *\n * If a previous navigation is already pending, that one is dropped in\n * favour of the new request — Cancel always means \"stay here\", so losing\n * the older queued navigation is the correct outcome.\n */\n requestNavigation(proceed: () => void): boolean {\n if (!this.hasUnsavedChanges()) {\n proceed();\n return true;\n }\n this.pendingNavigation = proceed;\n this.unsavedNavDialogOpen.set(true);\n return false;\n }\n\n /** Save → persist changes, close the dialog, then resume navigation. */\n onUnsavedNavSave(): void {\n this.unsavedNavDialogOpen.set(false);\n this.saveEdit();\n this.runPendingNavigation();\n }\n\n /** Discard → revert to snapshot, close the dialog, then resume navigation. */\n onUnsavedNavDiscard(): void {\n this.unsavedNavDialogOpen.set(false);\n this.discardEdit();\n this.runPendingNavigation();\n }\n\n /** Cancel → drop the queued navigation and stay in edit mode. */\n onUnsavedNavCancel(): void {\n this.unsavedNavDialogOpen.set(false);\n this.pendingNavigation = null;\n }\n\n private runPendingNavigation(): void {\n const pending = this.pendingNavigation;\n this.pendingNavigation = null;\n pending?.();\n }\n\n private discardEdit(): void {\n this.sections.set(this.sectionsSnapshot);\n this.cards.set(\n this.cardsSnapshot.map((c) => {\n const pos = this.cardsPosition.get(c.id);\n return { ...c, x: pos?.x, y: pos?.y };\n }),\n );\n this.cardDialogOpen.set(false);\n this.gridDirty.set(false);\n this.editMode.set(false);\n }\n\n removeSection(id: string): void {\n this.sections.update((list) => list.filter((s) => s.id !== id));\n this.cards.update((list) => list.filter((c) => c.sectionId !== id));\n }\n\n removeCard(id: string): void {\n const wasLooseCard = this.looseCards().some((c) => c.id === id);\n this.cardsPosition.delete(id);\n this.cards.update((list) => list.filter((c) => c.id !== id));\n\n if (wasLooseCard) {\n afterNextRender(\n () => {\n this.gridStackItems().grid?.compact('compact', false);\n },\n { injector: this.injector },\n );\n }\n }\n\n openCardPanel(): void {\n this.cardDialogOpen.set(true);\n }\n\n closeCardPanel(): void {\n this.cardDialogOpen.set(false);\n }\n\n onCardsEdited(event: { added: CardConfig[]; removed: string[] }): void {\n this.cards.update((list) => {\n const withoutRemoved = list.filter((c) => !event.removed.includes(c.id));\n return [...withoutRemoved, ...event.added.map((ac) => ({ ...ac }))];\n });\n this.closeCardPanel();\n }\n\n onGridChange(): void {\n if (this.editMode()) {\n this.gridDirty.set(true);\n }\n }\n\n private saveCardsPosition(items: GridStackNode[]): void {\n items.forEach((node) => {\n if (node.id) {\n this.cardsPosition.set(node.id, {\n x: node.x,\n y: node.y,\n w: node.w,\n h: node.h,\n });\n }\n });\n }\n\n private updateCardsPositions(): void {\n const gridStackNodes = this.gridStackItems()\n .gridstackItems?.toArray()\n .map((node) => node.options);\n\n if (gridStackNodes) {\n this.saveCardsPosition(gridStackNodes);\n }\n }\n}\n","<div class=\"mfp-dashboard\" data-testid=\"dashboard\">\n <div class=\"mfp-dashboard__topbar\">\n <div class=\"mfp-dashboard__topbar-row\">\n <div class=\"mfp-dashboard__header\">\n <div class=\"mfp-dashboard__title-row\">\n @if (config().title) {\n <ui5-title level=\"H3\" size=\"H3\" wrapping-type=\"Normal\" data-testid=\"dashboard-title\">\n <span [innerHTML]=\"safeTitle()\"></span>\n </ui5-title>\n }\n @if (hasUnsavedChanges()) {\n <div class=\"mfp-dashboard__unsaved-changes\" role=\"status\">\n <ui5-icon\n class=\"mfp-dashboard__unsaved-changes-icon\"\n name=\"user-edit\"\n [accessibleName]=\"i18n.getTranslation(i18nKeys.UNSAVED_CHANGES)\"\n />\n <span class=\"mfp-dashboard__unsaved-changes-text\">{{\n i18n.getTranslation(i18nKeys.UNSAVED_CHANGES)\n }}</span>\n </div>\n }\n </div>\n @if (config().description) {\n <ui5-title level=\"H5\" size=\"H5\" wrapping-type=\"Normal\" data-testid=\"dashboard-description\">\n <span\n class=\"mfp-dashboard__description\"\n [innerHTML]=\"safeDescription()\"\n ></span>\n </ui5-title>\n }\n </div>\n\n <div class=\"mfp-dashboard__toolbar\">\n @if (editMode()) {\n <ui5-button\n #editCardsBtn\n id=\"edit-cards-btn\"\n data-testid=\"dashboard-edit-cards-btn\"\n [accessibleName]=\"\n editCardsButton().text ||\n editCardsButton().tooltip ||\n i18n.getTranslation(i18nKeys.EDIT_CARDS)\n \"\n [design]=\"editCardsButton().design\"\n [icon]=\"editCardsButton().icon\"\n [tooltip]=\"editCardsButton().tooltip\"\n (click)=\"openCardPanel()\"\n >{{ editCardsButton().text }}</ui5-button\n >\n } @else if (compactToolbar()) {\n <ui5-button\n #menuBtn\n data-testid=\"dashboard-toolbar-menu-btn\"\n design=\"Transparent\"\n icon=\"menu2\"\n [accessibleName]=\"i18n.getTranslation(i18nKeys.ACTIONS)\"\n [tooltip]=\"i18n.getTranslation(i18nKeys.ACTIONS)\"\n (click)=\"toolbarMenuOpen.update((v) => !v)\"\n />\n <ui5-menu\n data-testid=\"dashboard-toolbar-menu\"\n [open]=\"toolbarMenuOpen()\"\n [opener]=\"menuBtn.element\"\n (ui5Close)=\"toolbarMenuOpen.set(false)\"\n (ui5ItemClick)=\"\n onMenuItemClick(\n $any($event).detail.item.dataset['action'],\n $event\n )\n \"\n (ui5Open)=\"toolbarMenuOpen.set(true)\"\n >\n @if (config().editButtonFirst && config().editable) {\n <ui5-menu-item\n data-action=\"edit-view\"\n data-testid=\"dashboard-action-edit-view\"\n [icon]=\"editViewButton().icon\"\n [text]=\"\n editViewButton().text ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n />\n @if (customActions().length) {\n <ui5-menu-separator />\n }\n }\n @for (action of customActions(); track action.action) {\n <ui5-menu-item\n [attr.data-action]=\"action.action\"\n [attr.data-testid]=\"'dashboard-action-' + action.action\"\n [icon]=\"action.icon ?? ''\"\n [text]=\"action.text ?? ''\"\n />\n }\n @if (!config().editButtonFirst && config().editable) {\n <ui5-menu-separator />\n <ui5-menu-item\n data-action=\"edit-view\"\n data-testid=\"dashboard-action-edit-view\"\n [icon]=\"editViewButton().icon\"\n [text]=\"\n editViewButton().text ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n />\n }\n </ui5-menu>\n } @else {\n @if (config().editButtonFirst && config().editable) {\n <ui5-button\n data-testid=\"dashboard-edit-view-btn\"\n [accessibleName]=\"\n editViewButton().text ||\n editViewButton().tooltip ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n [design]=\"editViewButton().design\"\n [icon]=\"editViewButton().icon\"\n [tooltip]=\"editViewButton().tooltip\"\n (click)=\"enterEditMode()\"\n >{{ editViewButton().text }}</ui5-button\n >\n }\n @for (action of customActions(); track action.action) {\n <ui5-button\n [attr.data-testid]=\"'dashboard-action-' + action.action\"\n [accessibleName]=\"action.text || action.tooltip || action.action\"\n [design]=\"action.design ?? 'Default'\"\n [endIcon]=\"action?.endIcon\"\n [icon]=\"action.icon ?? ''\"\n [tooltip]=\"action.tooltip ?? ''\"\n (click)=\"\n actionButtonClick.emit({ event: $event, action: action })\n \"\n >{{ action.text }}</ui5-button\n >\n }\n @if (!config().editButtonFirst && config().editable) {\n <ui5-button\n data-testid=\"dashboard-edit-view-btn\"\n [accessibleName]=\"\n editViewButton().text ||\n editViewButton().tooltip ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n [design]=\"editViewButton().design\"\n [icon]=\"editViewButton().icon\"\n [tooltip]=\"editViewButton().tooltip\"\n (click)=\"enterEditMode()\"\n >{{ editViewButton().text }}</ui5-button\n >\n }\n }\n </div>\n </div>\n\n <div class=\"mfp-dashboard__subheader\">\n <ng-content select=\"[slot=dashboard-subheader]\" />\n </div>\n </div>\n\n <div class=\"mfp-sections-container\">\n @for (section of sections(); track section.id) {\n <mfp-dashboard-section\n [cards]=\"sectionCards()(section.id)\"\n [editMode]=\"editMode()\"\n [section]=\"section\"\n (removeCard)=\"removeCard($event)\"\n (removeSection)=\"removeSection(section.id)\"\n />\n }\n </div>\n\n <gridstack\n #grid\n data-testid=\"dashboard-grid\"\n [options]=\"gridOptions()\"\n (addedCB)=\"onGridChange()\"\n (changeCB)=\"onGridChange()\"\n (removedCB)=\"onGridChange()\"\n >\n @for (card of looseCards(); track card.id) {\n <gridstack-item [options]=\"card\">\n <mfp-dashboard-card\n [card]=\"card\"\n [editMode]=\"editMode()\"\n (removeCard)=\"removeCard($any(card.id))\"\n />\n </gridstack-item>\n }\n </gridstack>\n\n</div>\n@if (editMode()) {\n <div class=\"mfp-dashboard__edit-bar\">\n <ui5-button data-testid=\"dashboard-save-btn\" design=\"Emphasized\" (click)=\"saveEdit()\">{{\n i18n.getTranslation(i18nKeys.SAVE)\n }}</ui5-button>\n <ui5-button data-testid=\"dashboard-cancel-btn\" design=\"Transparent\" (click)=\"cancelEdit()\">{{\n i18n.getTranslation(i18nKeys.CANCEL)\n }}</ui5-button>\n </div>\n}\n\n<mfp-edit-cards-dialog\n [addedCardsIds]=\"addedCardsIds()\"\n [availableCards]=\"availableCards()\"\n [open]=\"cardDialogOpen()\"\n (cancelled)=\"closeCardPanel()\"\n (confirm)=\"onCardsEdited($event)\"\n/>\n\n<mfp-discard-changes-dialog\n [open]=\"discardDialogOpen()\"\n (cancelled)=\"cancelDiscard()\"\n (confirm)=\"confirmDiscard()\"\n/>\n\n<mfp-unsaved-changes-dialog\n [open]=\"unsavedNavDialogOpen()\"\n (cancelled)=\"onUnsavedNavCancel()\"\n (discard)=\"onUnsavedNavDiscard()\"\n (save)=\"onUnsavedNavSave()\"\n/>\n","import { Component, ViewEncapsulation, input, output } from '@angular/core';\nimport { Card } from '@fundamental-ngx/ui5-webcomponents/card';\nimport { CardHeader } from '@fundamental-ngx/ui5-webcomponents/card-header';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/AllIcons.js';\n\n@Component({\n selector: 'mfp-visited-service-card',\n imports: [Card, CardHeader, Icon],\n templateUrl: './visited-service-card.component.html',\n styleUrl: './visited-service-card.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class VisitedServiceCard {\n serviceType = input.required<string>();\n serviceName = input.required<string>();\n serviceDescription = input.required<string>();\n serviceIcon = input.required<string>();\n path = input.required<string>();\n\n readonly cardClick = output<string>();\n}\n","<div\n class=\"visited-card-wrapper\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"cardClick.emit(path())\"\n (keydown.enter)=\"cardClick.emit(path())\"\n>\n <span class=\"visited-card__type-badge\">{{ serviceType() }}</span>\n <ui5-card class=\"visited-card\">\n <ui5-card-header\n slot=\"header\"\n [interactive]=\"true\"\n [subtitleText]=\"serviceDescription()\"\n [titleText]=\"serviceName()\"\n >\n <ui5-icon\n class=\"visited-card__icon\"\n slot=\"avatar\"\n [name]=\"serviceIcon()\"\n />\n </ui5-card-header>\n </ui5-card>\n</div>\n","import { Component, ViewEncapsulation } from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n@Component({\n selector: 'mfp-favorites',\n imports: [Button, Icon, Title],\n templateUrl: './favorites.component.html',\n styleUrl: './favorites.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class Favorites {\n readonly items = [\n { label: 'Create Account', icon: 'add', action: 'create-account' },\n { label: 'Start Approval', icon: 'workflow-tasks', action: 'start-approval' },\n { label: 'Add User to Account', icon: 'person-placeholder', action: 'add-user' },\n ];\n}\n","<div class=\"favorites\">\n <ui5-title class=\"favorites__title\" level=\"H5\">Favorites</ui5-title>\n <div class=\"favorites__list\">\n @for (item of items; track item.action) {\n <div class=\"favorites__item\">\n <ui5-icon class=\"favorites__icon\" [name]=\"item.icon\" />\n <span class=\"favorites__label\">{{ item.label }}</span>\n <ui5-button design=\"Transparent\" [icon]=\"item.icon\">{{ item.label }}</ui5-button>\n </div>\n }\n </div>\n</div>\n","import { Component, ViewEncapsulation } from '@angular/core';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n/** Possible health states for a service. */\nexport type ServiceStatusValue = 'operational' | 'degraded' | 'outage' | 'maintenance';\n\n/** A single service entry displayed in the service-status card. */\nexport interface ServiceStatusItem {\n /** Display name of the service. */\n name: string;\n /** SAP UI5 icon name used as the service icon. */\n icon: string;\n /** Current health status of the service. */\n status: ServiceStatusValue;\n}\n\n@Component({\n selector: 'mfp-service-status-card',\n imports: [Icon, Title],\n templateUrl: './service-status-card.component.html',\n styleUrl: './service-status-card.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ServiceStatusCard {\n readonly services: ServiceStatusItem[] = [\n { name: 'API Gateway', icon: 'connected', status: 'operational' },\n { name: 'Identity Service', icon: 'customer', status: 'operational' },\n { name: 'Database Cluster', icon: 'database', status: 'degraded' },\n { name: 'Message Queue', icon: 'email', status: 'operational' },\n { name: 'Object Storage', icon: 'storage', status: 'maintenance' },\n { name: 'Audit Log', icon: 'log', status: 'outage' },\n ];\n\n readonly statusConfig: Record<ServiceStatusValue, { label: string; icon: string; colorClass: string }> = {\n operational: { label: 'Operational', icon: 'status-positive', colorClass: 'status--operational' },\n degraded: { label: 'Degraded', icon: 'status-critical', colorClass: 'status--degraded' },\n outage: { label: 'Outage', icon: 'status-negative', colorClass: 'status--outage' },\n maintenance: { label: 'Maintenance', icon: 'status-inactive', colorClass: 'status--maintenance' },\n };\n}\n","<div class=\"service-status\">\n <ui5-title class=\"service-status__title\" level=\"H5\">Service Availability</ui5-title>\n <div class=\"service-status__list\">\n @for (service of services; track service.name) {\n <div class=\"service-status__item\">\n <ui5-icon class=\"service-status__icon\" [name]=\"service.icon\" />\n <span class=\"service-status__name\">{{ service.name }}</span>\n <div [class]=\"'service-status__status ' + statusConfig[service.status].colorClass\">\n <ui5-icon class=\"service-status__status-icon\" [name]=\"statusConfig[service.status].icon\" />\n <span class=\"service-status__status-label\">{{ statusConfig[service.status].label }}</span>\n </div>\n </div>\n }\n </div>\n</div>\n","import { Component, ViewEncapsulation } from '@angular/core';\nimport { List } from '@fundamental-ngx/ui5-webcomponents/list';\nimport { ListItemStandard } from '@fundamental-ngx/ui5-webcomponents/list-item-standard';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n@Component({\n selector: 'mfp-whats-new',\n imports: [List, ListItemStandard, Title],\n templateUrl: './whats-new.component.html',\n styleUrl: './whats-new.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class WhatsNew {\n readonly headlines = [\n {\n title: 'Kubernetes 1.32 Released',\n description: 'Improved scheduling, new APIs and graduated features.',\n icon: 'cloud',\n },\n {\n title: 'Angular 20 Signals Stable',\n description: 'Signal-based reactivity is now production-ready.',\n icon: 'developer-settings',\n },\n {\n title: 'WebAssembly WASI 2.0 Preview',\n description: 'System interface advances bring server-side WASM closer.',\n icon: 'technical-object',\n },\n {\n title: 'OpenTelemetry Hits 1.0',\n description: 'Unified observability standard lands in enterprise stacks.',\n icon: 'monitor-payments',\n },\n {\n title: 'Rust Enters Linux Kernel Mainstream',\n description: 'More subsystems accept Rust driver contributions.',\n icon: 'settings',\n },\n {\n title: 'TypeScript 5.8 Performance Boost',\n description: 'Declaration emit is up to 10x faster in large projects.',\n icon: 'accelerated',\n },\n ];\n}\n","<div class=\"whats-new\">\n <ui5-title class=\"whats-new__title\" level=\"H5\">What's New</ui5-title>\n <ui5-list class=\"whats-new__list\" separators=\"Inner\">\n @for (item of headlines; track item.title) {\n <ui5-li [description]=\"item.description\" [icon]=\"item.icon\">\n {{ item.title }}\n </ui5-li>\n }\n </ui5-list>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openmfp-ngx.mjs","sources":["../../../projects/ngx/declarative-ui/table/utils/rules.engine.ts","../../../projects/ngx/declarative-ui/table/utils/resource-field-by-path.ts","../../../projects/ngx/declarative-ui/table/utils/field-definition.utils.ts","../../../projects/ngx/declarative-ui/resource-field/boolean-value/boolean-cell.constants.ts","../../../projects/ngx/declarative-ui/resource-field/boolean-value/boolean-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/boolean-value/boolean-value.component.html","../../../projects/ngx/declarative-ui/resource-field/link-value/link-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/link-value/link-value.component.html","../../../projects/ngx/declarative-ui/resource-field/secret-value/secret-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/secret-value/secret-value.component.html","../../../projects/ngx/declarative-ui/resource-field/tag-list-value/tag-list-value.component.ts","../../../projects/ngx/declarative-ui/resource-field/tag-list-value/tag-list-value.component.html","../../../projects/ngx/declarative-ui/resource-field/resource-field.component.ts","../../../projects/ngx/declarative-ui/resource-field/resource-field.component.html","../../../projects/ngx/declarative-ui/table/utils/proccess-fields.ts","../../../projects/ngx/declarative-ui/table/declarative-table/declarative-table.component.ts","../../../projects/ngx/declarative-ui/table/declarative-table/declarative-table.component.html","../../../projects/ngx/declarative-ui/form/utils/set-property-by-path.ts","../../../projects/ngx/declarative-ui/form/declarative-form/form-collection-field/form-collection-field.component.ts","../../../projects/ngx/declarative-ui/form/declarative-form/form-collection-field/form-collection-field.component.html","../../../projects/ngx/declarative-ui/form/declarative-form/declarative-form.component.ts","../../../projects/ngx/declarative-ui/form/declarative-form/declarative-form.component.html","../../../projects/ngx/declarative-ui/table-card/filter-tabs/filter-tabs.component.ts","../../../projects/ngx/declarative-ui/table-card/filter-tabs/filter-tabs.component.html","../../../projects/ngx/declarative-ui/table-card/declarative-table-card.component.ts","../../../projects/ngx/declarative-ui/table-card/declarative-table-card.component.html","../../../projects/ngx/declarative-ui/dashboard/i18n/dashboard-i18n.ts","../../../projects/ngx/declarative-ui/dashboard/i18n/dashboard-i18n.service.ts","../../../projects/ngx/declarative-ui/dashboard/models/dashboard.model.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/dashboard-card-registry.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/mount-angular-card.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/mount-sap-card.ts","../../../projects/ngx/declarative-ui/dashboard/card/utils/mount-wc-card.ts","../../../projects/ngx/declarative-ui/dashboard/card/dashboard-card.component.ts","../../../projects/ngx/declarative-ui/dashboard/card/dashboard-card.component.html","../../../projects/ngx/declarative-ui/dashboard/constants/breakpoints.ts","../../../projects/ngx/declarative-ui/dashboard/constants/constants.ts","../../../projects/ngx/declarative-ui/dashboard/discard-changes-dialog/discard-changes-dialog.component.ts","../../../projects/ngx/declarative-ui/dashboard/discard-changes-dialog/discard-changes-dialog.component.html","../../../projects/ngx/declarative-ui/dashboard/edit-cards-dialog/edit-cards-dialog.component.ts","../../../projects/ngx/declarative-ui/dashboard/edit-cards-dialog/edit-cards-dialog.component.html","../../../projects/ngx/declarative-ui/dashboard/section/dashboard-section.component.ts","../../../projects/ngx/declarative-ui/dashboard/section/dashboard-section.component.html","../../../projects/ngx/declarative-ui/dashboard/unsaved-changes-dialog/unsaved-changes-dialog.component.ts","../../../projects/ngx/declarative-ui/dashboard/unsaved-changes-dialog/unsaved-changes-dialog.component.html","../../../projects/ngx/declarative-ui/dashboard/dashboard/dashboard.component.ts","../../../projects/ngx/declarative-ui/dashboard/dashboard/dashboard.component.html","../../../projects/ngx/cards/visited-service-card/visited-service-card.component.ts","../../../projects/ngx/cards/visited-service-card/visited-service-card.component.html","../../../projects/ngx/cards/favorites/favorites.component.ts","../../../projects/ngx/cards/favorites/favorites.component.html","../../../projects/ngx/cards/service-status/service-status-card.component.ts","../../../projects/ngx/cards/service-status/service-status-card.component.html","../../../projects/ngx/cards/whats-new/whats-new.component.ts","../../../projects/ngx/cards/whats-new/whats-new.component.html","../../../projects/ngx/openmfp-ngx.ts"],"sourcesContent":["import { CssRule, RuleCondition, ValueRule } from '../../models';\n\nexport const parseStringValue = (value: string) => {\n if (value === 'true') {\n return true;\n }\n\n if (value === 'false') {\n return false;\n }\n\n if (!isNaN(Number(value))) {\n return Number(value);\n }\n\n return value;\n};\n\ninterface ConditionRule { if: { condition: RuleCondition; value: string } }\n\nexport const ruleResolver = (\n rule: ConditionRule,\n resourceValue: string,\n): boolean => {\n const parsedResouceValue = parseStringValue(resourceValue);\n const parsedConditionValue = parseStringValue(rule.if.value);\n\n switch (rule.if.condition) {\n case 'equals':\n return parsedResouceValue === parsedConditionValue;\n case 'notEquals':\n return parsedResouceValue !== parsedConditionValue;\n case 'greaterThan':\n return parsedResouceValue > parsedConditionValue;\n case 'greaterThanOrEqual':\n return parsedResouceValue >= parsedConditionValue;\n case 'lessThan':\n return parsedResouceValue < parsedConditionValue;\n case 'lessThanOrEqual':\n return parsedResouceValue <= parsedConditionValue;\n case 'contains':\n if (Array.isArray(parsedResouceValue)) {\n return parsedResouceValue.includes(parsedConditionValue);\n } else if (\n typeof parsedResouceValue === 'string' &&\n typeof parsedConditionValue === 'string'\n ) {\n return parsedResouceValue.includes(parsedConditionValue);\n }\n\n return false;\n }\n return false;\n};\n\nexport const evaluateCssRules = (\n value: string,\n rules?: CssRule[],\n): Partial<CSSStyleDeclaration> => {\n if (!rules) {\n return {};\n }\n\n return rules.reduce((acc, rule) => {\n const result = ruleResolver(rule, value);\n if (result) {\n return { ...acc, ...rule.styles };\n }\n return acc;\n }, {});\n};\n\nexport const evaluateValueRules = (\n value: string,\n rules?: ValueRule[],\n): string => {\n if (!rules) return value;\n for (const rule of rules) {\n if (ruleResolver(rule, value)) return rule.then;\n }\n return value;\n};\n","import { PropertyField, TransformType } from '../../models';\nimport { JSONPath } from 'jsonpath-plus';\n\nexport const getResourceValueByJsonPath = <T>(\n resource: T,\n field: {\n jsonPathExpression?: string;\n property?: string | string[];\n propertyField?: PropertyField;\n },\n) => {\n const property = field.jsonPathExpression || field.property;\n if (!property) {\n return undefined;\n }\n\n if (property instanceof Array) {\n console.error(\n `Property defined as an array: ${JSON.stringify(property)}, provide \"jsonPathExpression\" field to properly ready resource value`,\n );\n return undefined;\n }\n\n const prefix = property.startsWith('$.') ? '' : '$.';\n // jsonpath-plus's `JSONPath` is overloaded: by default `resultType: 'value'`\n // returns an array of matched values, but the TS overload defaults to\n // returning a `JSONPathClass` unless we pin `<T>` to the array shape.\n // The `json` parameter is typed as a concrete JSON-shape union; the generic\n // `T` of this function is unconstrained, so we cast at the boundary. The\n // returned array is `any[]` (matching jsonpath's old typing) so the\n // downstream `value[field.propertyField.key]` access keeps compiling.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryResult = JSONPath<any[]>({\n path: `${prefix}${property}`,\n json: resource as object,\n });\n const value = queryResult.length ? queryResult[0] : undefined;\n\n if (value && field.propertyField) {\n return executeTransform(\n value[field.propertyField.key],\n field.propertyField.transform,\n );\n }\n\n return value;\n};\n\nconst executeTransform = (\n value: string | undefined,\n transform: TransformType[] | undefined,\n): string | undefined => {\n if (value == null || transform == null || !transform.length) return value;\n\n return transform.reduce((acc, t) => {\n if (acc == null) return acc;\n\n switch (t) {\n case 'uppercase':\n return acc.toUpperCase();\n case 'lowercase':\n return acc.toLowerCase();\n case 'capitalize': {\n const str = String(acc);\n return str.length ? str.charAt(0).toUpperCase() + str.slice(1) : str;\n }\n case 'decode': {\n try {\n return decodeBase64(acc);\n } catch {\n return acc;\n }\n }\n case 'encode': {\n try {\n return encodeBase64(acc);\n } catch {\n return acc;\n }\n }\n default:\n return acc;\n }\n }, value);\n};\n\nexport const encodeBase64 = (str: string): string => {\n try {\n const utf8Bytes = new TextEncoder().encode(str);\n const binaryString = Array.from(utf8Bytes, (byte) =>\n String.fromCharCode(byte),\n ).join('');\n return btoa(binaryString);\n } catch (error) {\n console.error('Base64 encoding failed:', error);\n throw new Error('Failed to encode string to Base64');\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n const binaryString = atob(base64);\n const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n } catch (error) {\n console.error('Base64 decoding failed:', error);\n throw new Error('Failed to decode Base64 string');\n }\n};\n","import { FieldDefinition } from '../../models';\nimport { getResourceValueByJsonPath } from './resource-field-by-path';\n\nexport function getFieldValue<T>(\n field: FieldDefinition,\n resource: T | undefined,\n) {\n if (resource) {\n return getResourceValueByJsonPath<T>(resource, field) ?? field.value;\n }\n\n return field.value;\n}\n","export const ICON_DESIGN_POSITIVE = 'Positive';\nexport const ICON_DESIGN_NEGATIVE = 'Negative';\n\nexport const ICON_NAME_POSITIVE = 'accept';\nexport const ICON_NAME_NEGATIVE = 'decline';\n","import {\n ICON_DESIGN_NEGATIVE,\n ICON_DESIGN_POSITIVE,\n ICON_NAME_NEGATIVE,\n ICON_NAME_POSITIVE,\n} from './boolean-cell.constants';\nimport {\n CUSTOM_ELEMENTS_SCHEMA,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\n\nexport type IconDesignType = typeof ICON_DESIGN_POSITIVE | typeof ICON_DESIGN_NEGATIVE;\n\n@Component({\n selector: 'mfp-boolean-value',\n imports: [Icon],\n templateUrl: './boolean-value.component.html',\n styleUrl: './boolean-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class BooleanValue {\n boolValue = input.required<boolean>();\n testId = input<string>('boolean-value-icon');\n iconDesign = computed<IconDesignType>(() => {\n return this.boolValue() ? ICON_DESIGN_POSITIVE : ICON_DESIGN_NEGATIVE;\n });\n iconName = computed<string>(() => {\n return this.boolValue() ? ICON_NAME_POSITIVE : ICON_NAME_NEGATIVE;\n });\n}\n","<ui5-icon [attr.data-testid]=\"testId()\" [design]=\"iconDesign()\" [name]=\"iconName()\" />\n","import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { Link } from '@fundamental-ngx/ui5-webcomponents/link';\n\n@Component({\n selector: 'mfp-link-value',\n imports: [Link],\n templateUrl: './link-value.component.html',\n styleUrl: './link-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class LinkValue {\n urlValue = input.required<string>();\n testId = input<string>('link-value-link');\n\n public stopPropagation(event: Event) {\n event.stopPropagation();\n }\n}\n","<ui5-link\n target=\"_blank\"\n [attr.data-testid]=\"testId()\"\n [href]=\"urlValue()\"\n [tooltip]=\"urlValue()\"\n (click)=\"stopPropagation($event)\"\n>Link</ui5-link>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n@Component({\n selector: 'mfp-secret-value',\n imports: [],\n templateUrl: './secret-value.component.html',\n styleUrl: './secret-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [],\n})\nexport class SecretValue {\n value = input.required<string>();\n isVisible = input<boolean>(false);\n testId = input<string>('secret-value');\n maskedValue = computed(() => '*'.repeat(this.value()?.length || 8));\n}\n","<span class=\"secret-value\" [attr.data-testid]=\"testId()\" [class.masked]=\"!isVisible()\">\n @if (isVisible()) {\n {{ value() }}\n } @else {\n {{ maskedValue() }}\n }\n</span>\n","import { TagSettings } from '../../models';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { Tag } from '@fundamental-ngx/ui5-webcomponents/tag';\n\n@Component({\n selector: 'mfp-tag-list-value',\n imports: [Tag],\n templateUrl: './tag-list-value.component.html',\n styleUrl: './tag-list-value.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TagListValue {\n tags = input.required<string[]>();\n tagSettings = input<TagSettings>();\n testId = input<string>('tag-list-value');\n}\n","<span class=\"tag-list\" [attr.data-testid]=\"testId()\">\n @for (tag of tags(); track $index) {\n <ui5-tag\n [colorScheme]=\"tagSettings()?.colorScheme\"\n [design]=\"tagSettings()?.design ?? 'Neutral'\"\n [hideStateIcon]=\"true\"\n >{{ tag }}</ui5-tag>\n }\n</span>\n","import {\n FieldDefinition,\n GenericResource,\n ResourceFieldButtonClickEvent,\n} from '../models';\nimport { evaluateCssRules, evaluateValueRules } from '../table/utils/rules.engine';\nimport { getFieldValue } from '../table/utils/field-definition.utils';\nimport { BooleanValue } from './boolean-value/boolean-value.component';\nimport { LinkValue } from './link-value/link-value.component';\nimport { SecretValue } from './secret-value/secret-value.component';\nimport { TagListValue } from './tag-list-value/tag-list-value.component';\nimport {\n CUSTOM_ELEMENTS_SCHEMA,\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/AllIcons.js';\n\n@Component({\n selector: 'mfp-resource-field',\n imports: [Icon, BooleanValue, LinkValue, SecretValue, Button, TagListValue],\n templateUrl: './resource-field.component.html',\n styleUrl: './resource-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class ResourceField<T extends GenericResource, F extends FieldDefinition> {\n fieldDefinition = input.required<F>();\n resource = input<T>();\n readonly buttonClick = output<ResourceFieldButtonClickEvent<T>>();\n\n value = computed(() =>\n getFieldValue(this.fieldDefinition(), this.resource()),\n );\n\n uiSettings = computed(() => this.fieldDefinition().uiSettings);\n displayAs = computed(() => this.uiSettings()?.displayAs);\n withCopyButton = computed(() => this.uiSettings()?.withCopyButton);\n cssCustomization = computed(() => this.uiSettings()?.cssCustomization);\n tooltipIcon = computed(() => this.uiSettings()?.tooltipIcon);\n cssRules = computed(() =>\n evaluateCssRules(this.value(), this.uiSettings()?.cssRules),\n );\n cssStyles = computed(() => ({\n ...this.cssCustomization(),\n ...this.cssRules(),\n }));\n displayValue = computed(\n () => evaluateValueRules(this.value() ?? '', this.uiSettings()?.valueRules),\n );\n\n isBoolLike = computed(() => this.boolValue() !== undefined);\n isUrlValue = computed(() => this.checkValidUrl(this.stringValue()));\n testId = computed(() => `resource-field-${this.fieldDefinition().property}`);\n\n boolValue = computed(() => this.normalizeBoolean(this.value()));\n stringValue = computed(() => this.normalizeString(this.value()));\n tags = computed(() => this.normalizeTagsArray(this.value()));\n isVisible = signal(false);\n copySuccess = signal(false);\n\n toggleVisibility(e: Event): void {\n e.stopPropagation();\n this.isVisible.set(!this.isVisible());\n }\n\n private normalizeBoolean(value: unknown): boolean | undefined {\n const normalizedValue = value?.toString()?.toLowerCase();\n if (normalizedValue === 'true') {\n return true;\n }\n if (normalizedValue === 'false') {\n return false;\n }\n return undefined;\n }\n\n private normalizeString(value: unknown): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n return undefined;\n }\n\n return value;\n }\n\n private normalizeTagsArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(v => String(v).trim()).filter(v => v.length > 0);\n }\n if (typeof value === 'string') {\n const separator = this.uiSettings()?.tagSettings?.valueSeparator ?? ',';\n return value.split(separator).map(v => v.trim()).filter(v => v.length > 0);\n }\n return [];\n }\n\n private checkValidUrl(value: string | undefined): boolean {\n if (!value) {\n return false;\n }\n\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n }\n\n public copyValue(event: Event) {\n event.stopPropagation();\n navigator.clipboard.writeText(this.value() || '').then(() => {\n this.copySuccess.set(true);\n setTimeout(() => {\n this.copySuccess.set(false);\n }, 2000);\n });\n }\n\n protected buttonClicked(event: MouseEvent) {\n event.stopPropagation();\n this.buttonClick.emit({\n event,\n field: this.fieldDefinition(),\n resource: this.resource(),\n });\n }\n}\n","@let displayType = displayAs();\n<span [attr.data-testid]=\"testId()\" [style]=\"cssStyles()\">\n @if (displayType === 'secret') {\n <span class=\"secret-value-container\">\n <mfp-secret-value [isVisible]=\"isVisible()\" [testId]=\"testId() + '-secret'\" [value]=\"value()\" />\n <ui5-icon\n class=\"toggle-icon\"\n mode=\"Interactive\"\n [accessibleName]=\"isVisible() ? 'Hide value' : 'Show value'\"\n [attr.data-testid]=\"testId() + '-secret-toggle'\"\n [name]=\"isVisible() ? 'hide' : 'show'\"\n (click)=\"toggleVisibility($event)\"\n />\n </span>\n } @else if (displayType === 'boolIcon' && isBoolLike()) {\n <mfp-boolean-value [boolValue]=\"boolValue()!\" [testId]=\"testId() + '-boolean'\" />\n } @else if (displayType === 'link' && isUrlValue()) {\n <mfp-link-value [testId]=\"testId() + '-link'\" [urlValue]=\"stringValue()!\" />\n } @else if (displayType === 'tooltip') {\n <ui5-icon\n [accessibleName]=\"stringValue()!\"\n [attr.data-testid]=\"testId() + '-tooltip'\"\n [name]=\"tooltipIcon() ?? 'hint'\"\n [showTooltip]=\"true\"\n />\n } @else if (displayType === 'alert') {\n @if (!value()) {\n <ui5-icon\n design=\"Critical\"\n name=\"alert\"\n [accessibleName]=\"resource()?.accessibleName ?? ''\"\n [attr.data-testid]=\"testId() + '-icon'\"\n [showTooltip]=\"true\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n } @else if (displayType === 'img' && value()) {\n <img alt=\"Resource image\" class=\"image-cell\" [src]=\"value()\" />\n } @else if (displayType === 'button') {\n @let buttonSettings = uiSettings()?.buttonSettings;\n <ui5-button\n [attr.data-testid]=\"testId() + '-button'\"\n [accessibleName]=\"buttonSettings?.text || buttonSettings?.tooltip || buttonSettings?.icon || ''\"\n [design]=\"buttonSettings?.design\"\n [endIcon]=\"buttonSettings?.endIcon\"\n [icon]=\"buttonSettings?.icon\"\n [tooltip]=\"buttonSettings?.tooltip\"\n (click)=\"buttonClicked($event)\"\n >{{ buttonSettings?.text }}</ui5-button\n >&nbsp;\n } @else if (displayType === 'tag') {\n <mfp-tag-list-value\n [tagSettings]=\"uiSettings()?.tagSettings\"\n [tags]=\"tags()\"\n [testId]=\"testId() + '-tags'\"\n />\n } @else {\n {{ displayValue() }}\n }\n</span>\n\n@if (withCopyButton()) {\n <ui5-icon\n class=\"toggle-icon\"\n mode=\"Interactive\"\n [accessibleName]=\"copySuccess() ? 'Copied' : 'Copy value'\"\n [attr.data-testid]=\"testId() + '-copy'\"\n [design]=\"copySuccess() ? 'Positive' : 'Default'\"\n [name]=\"copySuccess() ? 'accept' : 'copy'\"\n (click)=\"copyValue($event)\"\n />\n}\n","import { TableFieldDefinition } from '../models';\n\ntype GroupBase = NonNullable<TableFieldDefinition['group']>;\ntype ProcessedGroup = GroupBase & {\n fields?: TableFieldDefinition[];\n};\n\nexport type ProcessedTableFieldDefinition = Omit<TableFieldDefinition, 'group'> & {\n group?: ProcessedGroup;\n};\n\nexport const processGroupFields = (\n fields: TableFieldDefinition[],\n): ProcessedTableFieldDefinition[] => {\n return combineGroupFields(fields);\n};\n\nconst collectGroupFields = (\n fields: TableFieldDefinition[],\n): Record<string, TableFieldDefinition[]> => {\n return fields.reduce(\n (acc, f): Record<string, TableFieldDefinition[]> => {\n if (!f.group?.name) {\n return acc;\n }\n\n const key = f.group.name;\n if (!acc[key]) {\n acc[key] = [];\n }\n\n // Strip group information from the field when adding to the fields array\n const { group, ...fieldWithoutGroup } = f;\n acc[key].push(fieldWithoutGroup);\n return acc;\n },\n {} as Record<string, TableFieldDefinition[]>,\n );\n};\n\nconst combineGroupFields = (fields: TableFieldDefinition[]): ProcessedTableFieldDefinition[] => {\n const seenGroup = new Set<string>();\n const groupFields = collectGroupFields(fields);\n const result: ProcessedTableFieldDefinition[] = [];\n\n fields.forEach((f) => {\n if (!f.group?.name) {\n result.push(f);\n return;\n }\n\n const key = f.group.name;\n if (seenGroup.has(key)) {\n return;\n }\n\n seenGroup.add(key);\n\n const grouped: ProcessedTableFieldDefinition = {\n ...f,\n group: {\n ...f.group,\n fields: groupFields[key],\n },\n };\n\n result.push(grouped);\n });\n\n return result;\n};\n","import { GenericResource, ResourceFieldButtonClickEvent } from '../../models';\nimport { ResourceField } from '../../resource-field';\nimport { TableFieldDefinition } from '../models';\nimport { processGroupFields } from '../utils/proccess-fields';\nimport { getResourceValueByJsonPath } from '../utils/resource-field-by-path';\nimport {\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { IllustratedMessage } from '@fundamental-ngx/ui5-webcomponents-fiori';\nimport { Option } from '@fundamental-ngx/ui5-webcomponents/option';\nimport { Select } from '@fundamental-ngx/ui5-webcomponents/select';\nimport { Table } from '@fundamental-ngx/ui5-webcomponents/table';\nimport { TableCell } from '@fundamental-ngx/ui5-webcomponents/table-cell';\nimport { TableGrowing } from '@fundamental-ngx/ui5-webcomponents/table-growing';\nimport { TableHeaderCell } from '@fundamental-ngx/ui5-webcomponents/table-header-cell';\nimport { TableHeaderRow } from '@fundamental-ngx/ui5-webcomponents/table-header-row';\nimport { TableRow } from '@fundamental-ngx/ui5-webcomponents/table-row';\nimport '@ui5/webcomponents-fiori/dist/illustrations/NoData.js';\n\n@Component({\n selector: 'mfp-declarative-table',\n imports: [\n IllustratedMessage,\n Table,\n TableCell,\n TableHeaderCell,\n TableHeaderRow,\n TableRow,\n ResourceField,\n Select,\n Option,\n TableGrowing,\n ],\n templateUrl: './declarative-table.component.html',\n styleUrl: './declarative-table.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class DeclarativeTable<T extends GenericResource> {\n columns = input.required<TableFieldDefinition[]>();\n resources = input.required<T[]>();\n trackByPath = input<string>('id');\n\n totalItemsCount = input<number>();\n paginationLimit = input<number>(5);\n hasMore = input<boolean>(false);\n growMode = input<'Scroll' | 'Button'>('Button');\n loadMoreButtonText = input<string>('Load More');\n height = input<number>();\n\n readonly buttonClick = output<ResourceFieldButtonClickEvent<T>>();\n readonly tableRowClicked = output<T>();\n readonly loadMoreResources = output<void>();\n readonly paginationLimitChanged = output<number>();\n\n columnTrackBy = (column: TableFieldDefinition, index: number) =>\n column.property ?? column.value ?? index;\n rowTrackBy = (_index: number, item: T): unknown =>\n getResourceValueByJsonPath(item, { property: this.trackByPath() }) ??\n _index;\n viewColumns = computed(() => processGroupFields(this.columns()));\n}\n","<ui5-table\n data-testid=\"generic-table\"\n [style.height]=\"height() ? height() + 'px' : null\"\n [style.overflow-y]=\"'auto'\"\n>\n <ui5-table-header-row\n slot=\"headerRow\"\n [sticky]=\"growMode() === 'Scroll' && !!height()\"\n >\n @for (column of viewColumns(); track columnTrackBy(column, $index)) {\n @if (column.group) {\n <ui5-table-header-cell\n [attr.data-testid]=\"'generic-table-header-' + column.group.name\"\n [width]=\"column.uiSettings?.columnWidth ?? 'auto'\"\n >{{ column.group.label ?? column.group.name }}</ui5-table-header-cell\n >\n } @else {\n <ui5-table-header-cell\n [attr.data-testid]=\"'generic-table-header-' + column.property\"\n [width]=\"column.uiSettings?.columnWidth ?? 'auto'\"\n >{{ column.label }}</ui5-table-header-cell\n >\n }\n }\n </ui5-table-header-row>\n\n @for (item of resources(); let i = $index; track rowTrackBy($index, item)) {\n <ui5-table-row\n [attr.data-testid]=\"'generic-table-row-' + i\"\n [class.disabled]=\"item.isAvailable === false\"\n [interactive]=\"item.isAvailable !== false\"\n (click)=\"tableRowClicked.emit(item)\"\n >\n @for (column of viewColumns(); track columnTrackBy(column, $index)) {\n @if (column.group) {\n <ui5-table-cell\n [attr.data-testid]=\"'generic-table-cell-' + i + '-' + column.group.name\"\n >\n @let isMultiline = column.group.multiline ?? true;\n <div\n class=\"flex\"\n [style.alignItems]=\"isMultiline ? column.uiSettings?.align : null\"\n [style.flexDirection]=\"isMultiline ? 'column' : 'row'\"\n [style.justifyContent]=\"\n isMultiline ? null : column.uiSettings?.align\n \"\n >\n @for (\n field of column.group.fields;\n let last = $last;\n track columnTrackBy(field, $index)\n ) {\n <span\n class=\"group-value\"\n [attr.data-testid]=\"\n 'generic-table-cell-' +\n i +\n '-' +\n column.group.name +\n '-' +\n field.property\n \"\n >\n @if (field.label) {\n <span>{{ field.label }}: </span>\n }\n <mfp-resource-field\n [fieldDefinition]=\"field\"\n [resource]=\"item\"\n (buttonClick)=\"buttonClick.emit($event)\"\n />\n </span>\n @if (!last && column.group.delimiter) {\n <span class=\"delimiter\">{{ column.group.delimiter }}</span>\n }\n }\n </div>\n </ui5-table-cell>\n } @else {\n <ui5-table-cell\n [attr.data-testid]=\"'generic-table-cell-' + i + '-' + column.property\"\n >\n <div class=\"flex\" [style.justifyContent]=\"column.uiSettings?.align\">\n <mfp-resource-field\n [fieldDefinition]=\"column\"\n [resource]=\"item\"\n (buttonClick)=\"buttonClick.emit($event)\"\n />\n </div>\n </ui5-table-cell>\n }\n }\n </ui5-table-row>\n } @empty {\n <ui5-illustrated-message\n name=\"NoData\"\n slot=\"noData\"\n data-testid=\"generic-table-view-nodata\"\n >\n <span slot=\"title\">No Resources</span>\n <span slot=\"subtitle\">There are currently no items to show.</span>\n </ui5-illustrated-message>\n }\n\n @if (hasMore()) {\n <ui5-table-growing\n id=\"growing\"\n data-testid=\"generic-table-growing\"\n slot=\"features\"\n [mode]=\"growMode()\"\n [text]=\"loadMoreButtonText()\"\n (ui5LoadMore)=\"loadMoreResources.emit()\"\n />\n }\n</ui5-table>\n\n<!-- Pagination Control -->\n<div\n class=\"pagination-footer\"\n style=\"\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0rem 1rem;\n min-height: 3rem;\n border-top: 1px solid var(--sapList_BorderColor);\n \"\n>\n <div style=\"display: flex; align-items: center; gap: 1.5rem\">\n <div style=\"display: flex; align-items: center; gap: 0.5rem\">\n <span\n style=\"color: var(--sapTextColor); font-size: var(--sapFontSmallSize)\"\n >Items per load:</span\n >\n <ui5-select\n data-testid=\"generic-table-pagination-select\"\n style=\"width: 5rem\"\n [value]=\"paginationLimit().toString()\"\n (change)=\"paginationLimitChanged.emit(+$any($event)?.target?.value)\"\n >\n <ui5-option value=\"5\">5</ui5-option>\n <ui5-option value=\"10\">10</ui5-option>\n <ui5-option value=\"10\">20</ui5-option>\n <ui5-option value=\"50\">50</ui5-option>\n <ui5-option value=\"100\">100</ui5-option>\n </ui5-select>\n </div>\n\n <span\n style=\"color: var(--sapTextColor); font-size: var(--sapFontSmallSize)\"\n >\n Items loaded:\n <b>{{\n totalItemsCount() !== undefined\n ? resources().length + ' / ' + totalItemsCount()\n : resources().length\n }}</b>\n </span>\n </div>\n</div>\n","export function setPropertyByPath<T extends Record<string, unknown>>(\n object: T,\n path: string,\n value: unknown,\n): T {\n const segments = path.split('.').filter(Boolean);\n if (segments.length === 0) {\n return object;\n }\n\n let current: Record<string, unknown> = object;\n\n for (let i = 0; i < segments.length; i += 1) {\n const key = segments[i];\n if (i === segments.length - 1) {\n current[key] = value;\n break;\n }\n\n const existing = current[key];\n\n if (existing === undefined || existing === null || typeof existing !== 'object') {\n current[key] = {};\n }\n\n current = current[key] as Record<string, unknown>;\n }\n\n return object;\n}\n","import { FormFieldDefinition } from '../../models';\nimport { DeclarativeForm } from '../declarative-form.component';\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n forwardRef,\n input,\n linkedSignal,\n output,\n} from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/add.js';\nimport '@ui5/webcomponents-icons/dist/delete.js';\nimport '@ui5/webcomponents-icons/dist/navigation-down-arrow.js';\nimport '@ui5/webcomponents-icons/dist/navigation-right-arrow.js';\n\n/**\n * Internal collection editor rendered by `mfp-declarative-form` when a field\n * carries `propertyCollection` sub-fields.\n *\n * Each entry renders as a collapsible card whose expanded body is a nested\n * `<mfp-declarative-form>` bound to that entry. Live changes flow up\n * through the nested form's `(formValueChange)` output — no `viewChildren`\n * on the class, so this component can safely participate in the mutual\n * import cycle with `DeclarativeForm`.\n */\n@Component({\n selector: 'mfp-form-collection-field',\n standalone: true,\n // `DeclarativeForm` is imported via `forwardRef` because it also imports\n // this component — a strict module-init cycle. Angular resolves the\n // `forwardRef` when the template is instantiated, by which point both\n // classes are fully defined.\n imports: [Button, Icon, forwardRef(() => DeclarativeForm)],\n templateUrl: './form-collection-field.component.html',\n styleUrl: './form-collection-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class FormCollectionField {\n readonly fields = input.required<FormFieldDefinition[]>();\n readonly label = input.required<string>();\n\n readonly initialEntries = input<Record<string, unknown>[]>([]);\n readonly valueChange = output<Record<string, unknown>[]>();\n\n protected readonly entries = linkedSignal<Record<string, unknown>[]>(() => [\n ...(this.initialEntries() ?? []),\n ]);\n\n protected readonly expandedIndex = linkedSignal<\n Record<string, unknown>[],\n number | null\n >({\n source: this.initialEntries,\n computation: () => null,\n });\n\n previewFor(entry: Record<string, unknown>, index: number): string {\n for (const field of this.fields()) {\n const raw = entry[field.name];\n if (raw !== undefined && raw !== null && String(raw).trim() !== '') {\n return `${field.label ?? field.name}: ${String(raw)}`;\n }\n }\n const prefix = this.label().trim() || 'Item';\n return `${prefix} ${index + 1}`;\n }\n\n toggle(index: number): void {\n this.expandedIndex.set(this.expandedIndex() === index ? null : index);\n }\n\n add(): void {\n const next = [...this.entries(), {}];\n this.entries.set(next);\n this.expandedIndex.set(next.length - 1);\n this.valueChange.emit(next);\n }\n\n remove(index: number): void {\n const next = this.entries().filter((_, i) => i !== index);\n this.entries.set(next);\n const expandedIndex = this.expandedIndex() as number;\n if (expandedIndex === index) {\n this.expandedIndex.set(null);\n } else if (expandedIndex !== null && expandedIndex > index) {\n // Preserve the same expanded row after removing an earlier one.\n this.expandedIndex.set(expandedIndex - 1);\n }\n this.valueChange.emit(next);\n }\n\n onEntryValueChange(index: number, value: Record<string, unknown>): void {\n const next = this.entries().map((entry, i) =>\n i === index ? { ...value } : entry,\n );\n this.entries.set(next);\n this.valueChange.emit(next);\n }\n}\n","<div class=\"collection\" data-testid=\"collection-field\">\n @for (entry of entries(); track $index; let index = $index) {\n @let expanded = expandedIndex() === index;\n <div\n class=\"card\"\n [class.card--expanded]=\"expanded\"\n [attr.data-testid]=\"'collection-item-' + index\"\n >\n <button\n type=\"button\"\n class=\"card__header\"\n [attr.aria-expanded]=\"expanded\"\n [attr.data-testid]=\"'collection-item-' + index + '-toggle'\"\n (click)=\"toggle(index)\"\n >\n <ui5-icon\n class=\"card__chevron\"\n [name]=\"expanded ? 'navigation-down-arrow' : 'navigation-right-arrow'\"\n />\n <span class=\"card__preview\">{{ previewFor(entry, index) }}</span>\n <span class=\"card__spacer\"></span>\n <ui5-button\n class=\"card__action\"\n design=\"Transparent\"\n icon=\"delete\"\n accessibleName=\"Remove\"\n tooltip=\"Remove\"\n [attr.data-testid]=\"'collection-item-' + index + '-remove'\"\n (click)=\"remove(index); $event.stopPropagation()\"\n />\n </button>\n\n @if (expanded) {\n <div class=\"card__body\">\n <mfp-declarative-form\n [attr.data-testid]=\"'collection-item-' + index + '-form'\"\n [fields]=\"fields()\"\n [initialValues]=\"entry\"\n (formValueChange)=\"onEntryValueChange(index, $event)\"\n />\n </div>\n }\n </div>\n }\n\n <ui5-button\n class=\"collection__add\"\n design=\"Transparent\"\n icon=\"add\"\n accessibleName=\"Add\"\n data-testid=\"collection-add\"\n (click)=\"add()\"\n />\n</div>\n","import { GenericResource } from '../../models';\nimport {\n FormFieldChangeEvent,\n FormFieldDefinition,\n FormFieldErrors,\n} from '../models';\nimport { setPropertyByPath } from '../utils/set-property-by-path';\nimport { FormCollectionField } from './form-collection-field/form-collection-field.component';\nimport {\n Component,\n ViewEncapsulation,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport {\n FormArray,\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { Input } from '@fundamental-ngx/ui5-webcomponents/input';\nimport { Label } from '@fundamental-ngx/ui5-webcomponents/label';\nimport { Option } from '@fundamental-ngx/ui5-webcomponents/option';\nimport { Select } from '@fundamental-ngx/ui5-webcomponents/select';\n\n@Component({\n selector: 'mfp-declarative-form',\n imports: [\n ReactiveFormsModule,\n Input,\n Label,\n Select,\n Option,\n FormCollectionField,\n ],\n templateUrl: './declarative-form.component.html',\n styleUrl: './declarative-form.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class DeclarativeForm<T extends GenericResource> {\n readonly fields = input.required<FormFieldDefinition[]>();\n readonly initialValues = input<T>({} as T);\n readonly fieldErrors = input<FormFieldErrors>({});\n\n readonly fieldChange = output<FormFieldChangeEvent>();\n readonly formSubmit = output<T>();\n readonly formValueChange = output<Record<string, unknown>>();\n\n readonly form: FormGroup;\n\n protected readonly collectionSeeds = signal<\n Record<string, Record<string, unknown>[]>\n >({});\n\n private readonly fb = inject(FormBuilder);\n\n constructor() {\n this.form = this.fb.group({});\n\n effect(() => {\n this.rebuildControls(this.fields());\n });\n\n effect(() => {\n this.setInitialValues(this.initialValues());\n });\n\n effect(() => {\n const fields = this.fields();\n this.initialValues();\n\n for (const field of fields) {\n if (field.validation) {\n this.fieldChange.emit({\n fieldProperty: field.name,\n value: this.form.controls[field.name]?.value ?? '',\n });\n }\n }\n });\n }\n\n setFormControlValue($event: Event, field: FormFieldDefinition): void {\n const target = $event.target as\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n\n const control = this.form.controls[field.name];\n control.setValue(target.value);\n control.markAsTouched();\n control.markAsDirty();\n\n this.formValueChange.emit(this.form.value as Record<string, unknown>);\n\n if (field.validation === 'onChange') {\n this.fieldChange.emit({\n fieldProperty: field.name,\n value: control.value,\n });\n }\n }\n\n onCollectionValueChange(\n field: FormFieldDefinition,\n entries: Record<string, unknown>[],\n ): void {\n const array = this.form.controls[field.name] as FormArray | undefined;\n if (!array) return;\n\n while (array.length) array.removeAt(0);\n for (const entry of entries) {\n array.push(this.buildEntryGroup(entry));\n }\n array.markAsDirty();\n array.markAsTouched();\n\n if (field.validation === 'onChange' || field.validation === 'onBlur') {\n this.fieldChange.emit({\n fieldProperty: field.name,\n value: entries,\n });\n }\n }\n\n getError(name: string): string | null {\n const control = this.form.controls[name];\n const error = this.fieldErrors()[name];\n\n return error && (control.dirty || control.touched) ? error : null;\n }\n\n getValueState(name: string): 'None' | 'Negative' {\n return this.getError(name) ? 'Negative' : 'None';\n }\n\n onFieldBlur(field: FormFieldDefinition): void {\n this.form.controls[field.name]?.markAsTouched();\n\n if (field.validation === 'onBlur') {\n this.fieldChange.emit({\n fieldProperty: field.name,\n value: this.form.controls[field.name]?.value,\n });\n }\n }\n\n submit(): void {\n this.formSubmit.emit(this.buildOutputValue());\n }\n\n clear(): void {\n this.form.reset();\n }\n\n collectionEntries(field: FormFieldDefinition): Record<string, unknown>[] {\n return this.collectionSeeds()[field.name] ?? [];\n }\n\n private rebuildControls(fields: FormFieldDefinition[]): void {\n const existingControls = this.form.controls;\n const nextFieldNames = new Set(fields.map((field) => field.name));\n\n for (const field of fields) {\n const existingControl = existingControls[field.name];\n const wantsCollection = !!field.propertyCollection?.length;\n const existingIsCollection = existingControl instanceof FormArray;\n if (existingControl && wantsCollection !== existingIsCollection) {\n this.form.removeControl(field.name);\n } else if (existingControl) {\n existingControl.clearValidators();\n existingControl.updateValueAndValidity({ emitEvent: false });\n continue;\n }\n\n if (wantsCollection) {\n this.form.addControl(field.name, this.fb.array([]));\n } else {\n this.form.addControl(field.name, new FormControl(''));\n }\n }\n\n for (const controlName of Object.keys(existingControls)) {\n if (!nextFieldNames.has(controlName)) {\n this.form.removeControl(controlName);\n }\n }\n\n this.form.updateValueAndValidity({ emitEvent: false });\n }\n\n private setInitialValues(initialValues: T | null | undefined): void {\n if (!initialValues) {\n return;\n }\n\n const seeds: Record<string, Record<string, unknown>[]> = {};\n for (const field of this.fields()) {\n if (!field.propertyCollection?.length) continue;\n const raw = (initialValues as Record<string, unknown>)[field.name];\n const entries = Array.isArray(raw)\n ? (raw as Record<string, unknown>[])\n : [];\n\n const array = this.form.controls[field.name] as FormArray | undefined;\n if (array) {\n while (array.length) array.removeAt(0);\n for (const entry of entries) {\n array.push(this.buildEntryGroup(entry));\n }\n }\n seeds[field.name] = entries;\n }\n this.collectionSeeds.set(seeds);\n\n this.form.patchValue(initialValues, { emitEvent: false });\n this.form.markAsPristine({ emitEvent: false });\n this.form.updateValueAndValidity({ emitEvent: false });\n }\n\n private buildOutputValue(): T {\n const result = {} as T;\n\n for (const key of Object.keys(this.form.controls)) {\n const control = this.form.controls[key];\n let value: unknown = control.value;\n if (control instanceof FormArray) {\n value = control.controls.map(\n (group) => (group as FormGroup).controls['entry']?.value ?? {},\n );\n }\n setPropertyByPath(result, key, value);\n }\n\n return result;\n }\n\n private buildEntryGroup(entry: Record<string, unknown>): FormGroup {\n return this.fb.group({\n entry: new FormControl(entry),\n });\n }\n}\n","<section class=\"form\" data-testid=\"generic-form\" [formGroup]=\"form\">\n @for (field of fields(); track field.name) {\n @let control = form.controls[field.name];\n <div\n class=\"inputs\"\n [attr.data-testid]=\"'generic-form-field-container-' + field.name\"\n >\n <ui5-label\n show-colon\n [attr.data-testid]=\"'generic-form-field-label-' + field.name\"\n [required]=\"field.required\"\n >{{ field.label }}</ui5-label\n >\n @if (field.propertyCollection?.length) {\n <mfp-form-collection-field\n [attr.data-testid]=\"'generic-form-field-' + field.name\"\n [fields]=\"field.propertyCollection!\"\n [label]=\"field.label\"\n [initialEntries]=\"collectionEntries(field)\"\n (valueChange)=\"onCollectionValueChange(field, $event)\"\n />\n @if (getError(field.name); as error) {\n <div class=\"collection-error\" role=\"alert\">{{ error }}</div>\n }\n } @else if (field.values?.length) {\n <ui5-select\n class=\"input\"\n [attr.data-testid]=\"'generic-form-field-' + field.name\"\n [disabled]=\"field.disabled\"\n [required]=\"field.required\"\n [value]=\"control.value\"\n [valueState]=\"getValueState(field.name)\"\n (blur)=\"onFieldBlur(field)\"\n (change)=\"setFormControlValue($event, field)\"\n (input)=\"setFormControlValue($event, field)\"\n >\n @if (getError(field.name); as error) {\n <div slot=\"valueStateMessage\">{{ error }}</div>\n }\n @for (value of [''].concat(field.values ?? []); track value) {\n <ui5-option\n [attr.data-testid]=\"\n 'generic-form-field-' +\n field.name +\n '-option-' +\n (value || 'empty')\n \"\n [selected]=\"value === control.value\"\n [value]=\"value\"\n >{{ value }}</ui5-option\n >\n }\n </ui5-select>\n } @else {\n <ui5-input\n class=\"input\"\n [attr.data-testid]=\"'generic-form-field-' + field.name\"\n [disabled]=\"field.disabled\"\n [required]=\"field.required\"\n [value]=\"control.value\"\n [valueState]=\"getValueState(field.name)\"\n (blur)=\"onFieldBlur(field)\"\n (change)=\"setFormControlValue($event, field)\"\n (input)=\"setFormControlValue($event, field)\"\n >\n @if (getError(field.name); as error) {\n <div slot=\"valueStateMessage\">{{ error }}</div>\n }\n </ui5-input>\n }\n </div>\n }\n</section>\n","import { FieldFilterDefinition } from '../models/configs';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n OnDestroy,\n ViewEncapsulation,\n afterNextRender,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/navigation-left-arrow.js';\nimport '@ui5/webcomponents-icons/dist/navigation-right-arrow.js';\n\n/**\n * Horizontal filter-tab strip rendered above the table by\n * `<mfp-declarative-table-card>`. Internal to the table-card — not part of the\n * package public API.\n *\n * Renders one tab per {@link FieldFilterDefinition}. When the combined width\n * exceeds the host width, left/right chevron buttons appear and scroll the\n * strip by ~70% of the visible width per click; the native scrollbar is hidden.\n *\n * Initial active tab:\n * - The first `FieldFilterDefinition` with `default: true`, if any.\n * - Otherwise the first tab in the array.\n *\n * The component owns the active-tab state; the host only needs to listen to\n * `tabChanged` and apply the picked filter to its data layer. If the host\n * wants an \"All / no filter\" option it must author it as a regular tab — the\n * strip never auto-prepends one. The output type still allows `undefined` for\n * forward compatibility with hosts that want to clear the selection.\n */\n@Component({\n selector: 'mfp-filter-tabs',\n standalone: true,\n imports: [Icon],\n templateUrl: './filter-tabs.component.html',\n styleUrl: './filter-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class FilterTabs implements OnDestroy {\n tabs = input.required<FieldFilterDefinition[]>();\n readonly tabChanged = output<FieldFilterDefinition | undefined>();\n\n protected activeTab = signal<FieldFilterDefinition | undefined>(undefined);\n protected stripRef = viewChild<ElementRef<HTMLDivElement>>('strip');\n protected canScrollLeft = signal(false);\n protected canScrollRight = signal(false);\n\n private readonly injector = inject(Injector);\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n effect(() => {\n const tabs = this.tabs();\n const next = tabs.find((t) => t.default) ?? tabs[0];\n this.activeTab.set(next);\n afterNextRender(() => this.recomputeScrollState(), {\n injector: this.injector,\n });\n });\n\n afterNextRender(\n () => {\n const el = this.stripRef()?.nativeElement;\n if (!el) return;\n this.resizeObserver = new ResizeObserver(() =>\n this.recomputeScrollState(),\n );\n this.resizeObserver.observe(el);\n this.recomputeScrollState();\n },\n { injector: this.injector },\n );\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n /**\n * Reflects the carousel's current `scrollLeft` into signals that drive the\n * chevron buttons' visibility. Called on init, on user scroll, and after\n * any size change.\n */\n protected recomputeScrollState(): void {\n const el = this.stripRef()?.nativeElement;\n if (!el) {\n this.canScrollLeft.set(false);\n this.canScrollRight.set(false);\n return;\n }\n const { scrollLeft, scrollWidth, clientWidth } = el;\n // 1px tolerance — browsers occasionally report fractional pixel widths.\n this.canScrollLeft.set(scrollLeft > 1);\n this.canScrollRight.set(scrollLeft + clientWidth < scrollWidth - 1);\n }\n\n protected onScroll(): void {\n this.recomputeScrollState();\n }\n\n /**\n * Scrolls the strip by ~70% of its visible width so one filter overlaps\n * the previous viewport — matches the carousel idiom in SAP and Material.\n */\n protected scroll(direction: 'left' | 'right'): void {\n const el = this.stripRef()?.nativeElement;\n if (!el) return;\n const delta = el.clientWidth * 0.7 * (direction === 'right' ? 1 : -1);\n el.scrollBy({ left: delta, behavior: 'smooth' });\n }\n\n protected select(tab: FieldFilterDefinition): void {\n this.activeTab.set(tab);\n this.tabChanged.emit(tab);\n }\n}\n","<div class=\"filter-tabs\">\n @if (canScrollLeft()) {\n <button\n type=\"button\"\n class=\"filter-tabs__chevron filter-tabs__chevron--left\"\n aria-label=\"Scroll filters left\"\n (click)=\"scroll('left')\"\n >\n <ui5-icon name=\"navigation-left-arrow\" />\n </button>\n }\n <div\n #strip\n class=\"filter-tabs__strip\"\n role=\"tablist\"\n (scroll)=\"onScroll()\"\n >\n @for (tab of tabs(); track tab.property + ':' + tab.value) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"filter-tabs__tab\"\n [class.filter-tabs__tab--active]=\"activeTab() === tab\"\n [attr.aria-selected]=\"activeTab() === tab\"\n (click)=\"select(tab)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n @if (canScrollRight()) {\n <button\n type=\"button\"\n class=\"filter-tabs__chevron filter-tabs__chevron--right\"\n aria-label=\"Scroll filters right\"\n (click)=\"scroll('right')\"\n >\n <ui5-icon name=\"navigation-right-arrow\" />\n </button>\n }\n</div>\n","import { FormFieldChangeEvent, FormFieldDefinition } from '../form';\nimport { DeclarativeForm } from '../form/declarative-form/declarative-form.component';\nimport { GenericResource, ResourceFieldButtonClickEvent } from '../models';\nimport { DeclarativeTable } from '../table/declarative-table/declarative-table.component';\nimport { TableFieldDefinition } from '../table/models';\nimport { getResourceValueByJsonPath } from '../table/utils/resource-field-by-path';\nimport { FilterTabs } from './filter-tabs/filter-tabs.component';\nimport {\n FieldFilterDefinition,\n TableCardConfig,\n TableCardFormState,\n} from './models/configs';\nimport {\n CUSTOM_ELEMENTS_SCHEMA,\n ChangeDetectionStrategy,\n Component,\n Injector,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Input } from '@fundamental-ngx/ui5-webcomponents/input';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/add.js';\nimport '@ui5/webcomponents-icons/dist/search.js';\nimport { debounceTime, filter, map, take } from 'rxjs';\n\ntype SearchState = 'collapsed' | 'expanded' | 'collapsing';\n\n@Component({\n selector: 'mfp-declarative-table-card',\n imports: [\n DeclarativeTable,\n DeclarativeForm,\n FilterTabs,\n ReactiveFormsModule,\n Dialog,\n Title,\n Button,\n Icon,\n Input,\n ],\n templateUrl: './declarative-table-card.component.html',\n styleUrl: './declarative-table-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class DeclarativeTableCard<T extends GenericResource> {\n resources = input.required<T[]>();\n\n config = input.required<TableCardConfig>();\n createFormState = input<TableCardFormState>({});\n editFormState = input<TableCardFormState>({});\n\n readonly actionButtonClick = output<ResourceFieldButtonClickEvent<T>>();\n readonly tableRowClicked = output<T>();\n readonly loadMoreResources = output<void>();\n readonly paginationLimitChanged = output<number>();\n\n readonly searchChanged = output<string>();\n readonly createFieldChange = output<FormFieldChangeEvent>();\n readonly editFieldChange = output<{\n resource: T;\n formChangeEvent: FormFieldChangeEvent;\n }>();\n readonly createSubmit = output<T>();\n readonly editSubmit = output<{\n resource: T;\n value: Record<string, unknown>;\n }>();\n readonly deleteSubmit = output<T>();\n readonly filterTabChanged = output<FieldFilterDefinition | undefined>();\n\n protected searchState = signal<SearchState>('collapsed');\n protected searchExpanded = computed(() => this.searchState() !== 'collapsed');\n protected searchCollapsing = computed(\n () => this.searchState() === 'collapsing',\n );\n protected searchControl = new FormControl('');\n protected searchInputRef = viewChild<Input>('searchInput');\n\n protected createDialogOpen = signal(false);\n protected editDialogOpen = signal(false);\n protected deleteDialogOpen = signal(false);\n\n protected pendingResource = signal<T | null>(null);\n\n protected tableConfig = computed(() => this.config().tableConfig);\n protected header = computed(() => this.config().header);\n protected headerTooltip = computed(() => this.config().headerTooltip);\n protected createFormConfig = computed(\n () => this.config().createResourceFormConfig,\n );\n protected editFormConfig = computed(\n () => this.config().editResourceFormConfig,\n );\n protected deleteConfirmationConfig = computed(\n () => this.config().deleteResourceConfirmationConfig,\n );\n protected createButtonConfig = computed(\n () => this.config().buttonSettings?.createButton,\n );\n protected searchButtonConfig = computed(\n () => this.config().buttonSettings?.searchButton,\n );\n protected effectiveColumns = computed(() => this.addActionsColumn());\n protected editInitialValue = computed(() => {\n const pendingResource = this.pendingResource();\n const editConfig = this.editFormConfig();\n if (!pendingResource || !editConfig) {\n return {};\n }\n\n return this.buildInitialValues(editConfig.fields, pendingResource);\n });\n\n protected searchConfig = computed(() => this.config().searchConfig);\n protected resourcesSearchable = computed(() => !!this.searchConfig());\n\n protected filterTabs = computed(() => {\n const tabs = this.searchConfig()?.filterTabs;\n if (!tabs?.length) return [];\n\n const initial = this.searchConfig()?.initialFilter;\n if (!initial) {\n return tabs;\n }\n\n const matches = tabs.some(\n (t) => t.property === initial.property && t.value === initial.value,\n );\n if (!matches) return tabs;\n\n return tabs.map((tab) =>\n tab.property === initial.property && tab.value === initial.value\n ? { ...tab, default: true }\n : tab.default\n ? { ...tab, default: false }\n : tab,\n );\n });\n\n protected hasFilterTabs = computed(() => this.filterTabs().length > 0);\n\n private readonly injector = inject(Injector);\n\n constructor() {\n this.searchControl.valueChanges\n .pipe(debounceTime(300), takeUntilDestroyed())\n .subscribe((value) => {\n this.searchChanged.emit(value ?? '');\n });\n\n toObservable(this.searchConfig)\n .pipe(\n map((config) => config?.initialSearch),\n filter((initial): initial is string => !!initial),\n takeUntilDestroyed(),\n )\n .subscribe((initial) => {\n this.searchControl.setValue(initial, { emitEvent: false });\n this.searchState.set('expanded');\n });\n }\n\n protected onFilterTabChanged(tab: FieldFilterDefinition | undefined): void {\n this.filterTabChanged.emit(tab);\n }\n\n toggleSearch(): void {\n if (this.searchState() === 'expanded') {\n this.collapseSearch();\n } else if (this.searchState() === 'collapsed') {\n this.searchState.set('expanded');\n afterNextRender(\n () => {\n this.searchInputRef()?.elementRef.nativeElement.focus();\n },\n { injector: this.injector },\n );\n }\n }\n\n onSearchBlur(): void {\n if (!this.searchControl.value) {\n this.collapseSearch();\n }\n }\n\n onSearchAnimationEnd(): void {\n if (this.searchCollapsing()) {\n this.searchState.set('collapsed');\n this.searchControl.setValue('', { emitEvent: false });\n }\n }\n\n private collapseSearch(): void {\n this.searchState.set('collapsing');\n }\n\n onButtonClick(event: ResourceFieldButtonClickEvent<T>): void {\n const action = event.field.uiSettings?.buttonSettings?.action;\n if (action === 'edit' && event.resource) {\n this.pendingResource.set(event.resource);\n this.editDialogOpen.set(true);\n return;\n }\n if (action === 'delete' && event.resource) {\n this.pendingResource.set(event.resource);\n this.deleteDialogOpen.set(true);\n return;\n }\n\n this.actionButtonClick.emit(event);\n }\n\n closeCreateDialog(): void {\n this.createDialogOpen.set(false);\n }\n\n closeEditDialog(): void {\n this.editDialogOpen.set(false);\n }\n\n closeDeleteDialog(): void {\n this.deleteDialogOpen.set(false);\n }\n\n onCreateFieldChange(event: FormFieldChangeEvent): void {\n this.createFieldChange.emit(event);\n }\n\n onEditFieldChange(event: FormFieldChangeEvent): void {\n const resource = this.pendingResource();\n\n if (resource) {\n this.editFieldChange.emit({ resource, formChangeEvent: event });\n }\n }\n\n onCreateSubmit(value: T): void {\n this.createSubmit.emit(value);\n }\n\n onEditSubmit(value: Record<string, unknown>): void {\n const resource = this.pendingResource();\n\n if (resource) {\n this.editSubmit.emit({ resource, value });\n }\n }\n\n onDeleteSubmit(): void {\n const resource = this.pendingResource();\n if (resource) this.deleteSubmit.emit(resource);\n }\n\n protected hasErrors(state: TableCardFormState): boolean {\n const errors = state.fieldErrors;\n return !!errors && Object.values(errors).some((val) => !!val);\n }\n\n private addActionsColumn(): TableFieldDefinition[] {\n const cols = this.tableConfig().fields;\n const buttonSettings = this.config().buttonSettings;\n const editButton = this.editFormConfig();\n const deleteButton = this.deleteConfirmationConfig();\n const actions: TableFieldDefinition[] = [];\n\n if (editButton) {\n actions.push({\n property: 'mfp_edit_action',\n uiSettings: {\n displayAs: 'button',\n align: 'end',\n buttonSettings: {\n icon: 'edit',\n design: 'Transparent',\n action: 'edit',\n tooltip: 'Edit',\n ...buttonSettings?.editButton,\n },\n },\n group: { name: 'actions', label: '', multiline: false },\n });\n }\n\n if (deleteButton) {\n actions.push({\n property: 'mfp_delete_action',\n uiSettings: {\n align: 'end',\n displayAs: 'button',\n buttonSettings: {\n icon: 'decline',\n design: 'Transparent',\n action: 'delete',\n tooltip: 'Delete',\n ...buttonSettings?.deleteButton,\n },\n },\n group: { name: 'actions', label: '', multiline: false },\n });\n }\n\n return cols.concat(actions);\n }\n\n private buildInitialValues(\n fields: FormFieldDefinition[],\n resource?: T,\n ): Record<string, unknown> {\n if (!resource) return {};\n\n return fields.reduce(\n (acc, field) => {\n if (typeof field.name === 'string') {\n acc[field.name] =\n getResourceValueByJsonPath(resource, { property: field.name }) ??\n '';\n }\n return acc;\n },\n {} as Record<string, unknown>,\n );\n }\n}\n","<div class=\"card\" data-testid=\"generic-table-card\">\n <div class=\"card__header\">\n <div class=\"card__title\">\n @if (header(); as header) {\n {{ header }}\n @if (headerTooltip(); as tooltip) {\n <ui5-icon\n class=\"card__info-icon\"\n name=\"hint\"\n [accessibleName]=\"tooltip\"\n [showTooltip]=\"true\"\n />\n }\n }\n </div>\n <div class=\"card__actions\">\n @if (resourcesSearchable()) {\n @if (searchExpanded()) {\n <ui5-input\n #searchInput\n data-testid=\"generic-table-card-search-input\"\n [class]=\"\n 'card__search-input card__search-input--' +\n (searchCollapsing() ? 'leave' : 'enter')\n \"\n [formControl]=\"searchControl\"\n (animationend)=\"onSearchAnimationEnd()\"\n (blur)=\"onSearchBlur()\"\n />\n }\n <ui5-button\n class=\"card__search-btn\"\n data-testid=\"generic-table-card-search-btn\"\n design=\"Transparent\"\n [accessibleName]=\"searchButtonConfig()?.tooltip ?? 'Search'\"\n [icon]=\"searchButtonConfig()?.icon ?? 'search'\"\n [tooltip]=\"searchButtonConfig()?.tooltip ?? 'Search'\"\n (click)=\"toggleSearch()\"\n />\n }\n @if (createFormConfig()) {\n <ui5-button\n class=\"card__create-btn\"\n data-testid=\"generic-table-card-create-btn\"\n [accessibleName]=\"createButtonConfig()?.text || createButtonConfig()?.tooltip || 'Create'\"\n [design]=\"createButtonConfig()?.design ?? 'Transparent'\"\n [icon]=\"createButtonConfig()?.icon ?? 'add'\"\n [tooltip]=\"createButtonConfig()?.tooltip\"\n (click)=\"createDialogOpen.set(true)\"\n >\n {{ createButtonConfig()?.text ?? '' }}\n </ui5-button>\n }\n </div>\n </div>\n\n @if (hasFilterTabs()) {\n <mfp-filter-tabs\n [tabs]=\"filterTabs()\"\n (tabChanged)=\"onFilterTabChanged($event)\"\n />\n }\n\n <div class=\"card__body\">\n @if (tableConfig(); as config) {\n <mfp-declarative-table\n [columns]=\"effectiveColumns()\"\n [growMode]=\"config.growMode ?? 'Button'\"\n [hasMore]=\"config.hasMore ?? false\"\n [height]=\"config.height\"\n [loadMoreButtonText]=\"config.loadMoreButtonText ?? 'Load More'\"\n [paginationLimit]=\"config.paginationLimit ?? 5\"\n [resources]=\"resources()\"\n [totalItemsCount]=\"config.totalItemsCount\"\n (buttonClick)=\"onButtonClick($event)\"\n (loadMoreResources)=\"loadMoreResources.emit()\"\n (paginationLimitChanged)=\"paginationLimitChanged.emit($event)\"\n (tableRowClicked)=\"tableRowClicked.emit($event)\"\n />\n }\n </div>\n</div>\n\n@if (createFormConfig(); as config) {\n <ui5-dialog\n data-testid=\"generic-table-card-create-dialog\"\n [accessibleName]=\"config.title ?? 'Create'\"\n [open]=\"createDialogOpen()\"\n (ui5BeforeClose)=\"createDialogOpen.set(false)\"\n >\n <div class=\"dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ config.title ?? 'Create' }}</ui5-title>\n </div>\n <div class=\"dialog__body\">\n <mfp-declarative-form\n #createForm\n [fieldErrors]=\"createFormState().fieldErrors ?? {}\"\n [fields]=\"config.fields\"\n (fieldChange)=\"onCreateFieldChange($event)\"\n (formSubmit)=\"onCreateSubmit($event)\"\n />\n </div>\n <div class=\"dialog__footer\" slot=\"footer\">\n <ui5-button\n data-testid=\"generic-table-card-create-confirm\"\n design=\"Emphasized\"\n [disabled]=\"hasErrors(createFormState())\"\n (click)=\"createForm.submit()\"\n >\n {{ config.confirmLabel ?? 'Save' }}\n </ui5-button>\n <ui5-button data-testid=\"generic-table-card-create-cancel\" design=\"Transparent\" (click)=\"closeCreateDialog()\">\n {{ config.cancelLabel ?? 'Cancel' }}\n </ui5-button>\n </div>\n </ui5-dialog>\n}\n\n@if (editFormConfig(); as config) {\n <ui5-dialog\n data-testid=\"generic-table-card-edit-dialog\"\n [accessibleName]=\"config.title ?? 'Edit'\"\n [open]=\"editDialogOpen()\"\n (ui5BeforeClose)=\"editDialogOpen.set(false)\"\n >\n <div class=\"dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ config.title ?? 'Edit' }}</ui5-title>\n </div>\n <div class=\"dialog__body\">\n <mfp-declarative-form\n #editForm\n [fieldErrors]=\"editFormState().fieldErrors ?? {}\"\n [fields]=\"config.fields\"\n [initialValues]=\"editInitialValue()\"\n (fieldChange)=\"onEditFieldChange($event)\"\n (formSubmit)=\"onEditSubmit($event)\"\n />\n </div>\n <div class=\"dialog__footer\" slot=\"footer\">\n <ui5-button\n data-testid=\"generic-table-card-edit-confirm\"\n design=\"Emphasized\"\n [disabled]=\"hasErrors(editFormState())\"\n (click)=\"editForm.submit()\"\n >\n {{ config.confirmLabel ?? 'Edit' }}\n </ui5-button>\n <ui5-button data-testid=\"generic-table-card-edit-cancel\" design=\"Transparent\" (click)=\"closeEditDialog()\">\n {{ config.cancelLabel ?? 'Cancel' }}\n </ui5-button>\n </div>\n </ui5-dialog>\n}\n\n@if (deleteConfirmationConfig(); as config) {\n <ui5-dialog\n data-testid=\"generic-table-card-delete-dialog\"\n [accessibleName]=\"config.title ?? 'Confirm Delete'\"\n [open]=\"deleteDialogOpen()\"\n (ui5BeforeClose)=\"deleteDialogOpen.set(false)\"\n >\n <div class=\"dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ config.title ?? 'Confirm Delete' }}</ui5-title>\n </div>\n @if (config.message) {\n <div class=\"dialog__body\">\n <p class=\"dialog__message\">{{ config.message }}</p>\n </div>\n }\n <div class=\"dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"generic-table-card-delete-confirm\" design=\"Negative\" (click)=\"onDeleteSubmit()\">\n {{ config.confirmLabel ?? 'Delete' }}\n </ui5-button>\n <ui5-button data-testid=\"generic-table-card-delete-cancel\" design=\"Transparent\" (click)=\"closeDeleteDialog()\">\n {{ config.cancelLabel ?? 'Cancel' }}\n </ui5-button>\n </div>\n </ui5-dialog>\n}\n","import de from './de.json';\nimport en from './en.json';\n\nexport type DashboardLanguage = 'en' | 'de';\n\nexport const DASHBOARD_I18N_KEYS = {\n UNSAVED_CHANGES: 'unsavedChanges',\n EDIT_CARDS: 'editCards',\n EDIT_VIEW: 'editView',\n ACTIONS: 'actions',\n SAVE: 'save',\n CANCEL: 'cancel',\n DISCARD: 'discard',\n DISCARD_CHANGES: 'discardChanges',\n DISCARD_CONFIRM_BODY: 'discardConfirmBody',\n UNSAVED_NAV_BODY: 'unsavedNavBody',\n NO_CARDS_AVAILABLE: 'noCardsAvailable',\n REMOVE_SECTION: 'removeSection',\n REMOVE_CARD: 'removeCard',\n RESIZABLE: 'resizable',\n} as const;\n\nexport type DashboardI18nKey =\n (typeof DASHBOARD_I18N_KEYS)[keyof typeof DASHBOARD_I18N_KEYS];\n\nexport const DASHBOARD_TRANSLATIONS: Record<\n DashboardLanguage,\n Record<DashboardI18nKey, string>\n> = {\n en,\n de,\n};\n","import {\n DASHBOARD_TRANSLATIONS,\n DashboardI18nKey,\n DashboardLanguage,\n} from './dashboard-i18n';\nimport { Injectable, signal } from '@angular/core';\n\n/**\n * Holds the dashboard's current language and resolves translation keys for\n * the dashboard chrome (toolbar buttons, dialogs, a11y labels). Provided at\n * the `Dashboard` component level so every nested dashboard component shares\n * the same language signal — child components inject the same instance and\n * react to language changes automatically because `getTranslation` reads the\n * signal on every call.\n */\n@Injectable()\nexport class DashboardI18nService {\n readonly language = signal<DashboardLanguage>('en');\n\n getTranslation(key: DashboardI18nKey): string {\n return DASHBOARD_TRANSLATIONS[this.language()][key] ?? key;\n }\n}\n","import { ButtonSettings } from '../../models/ui-definition';\n\n\n\n\nexport const CARD_TYPES = {\n WC: 'wc',\n ANGULAR: 'angular',\n SAP_UI: 'sap-ui',\n} as const;\n\nexport type CardsType = (typeof CARD_TYPES)[keyof typeof CARD_TYPES];\n\n/** Configuration for a single card placed in the dashboard grid or a section. */\nexport interface CardConfig {\n /** Unique identifier for this card. Used as a stable key for position persistence. */\n id: string;\n /** Column span (1–12). Defaults to 12 when omitted. */\n w?: number;\n /** Row span — number of CSS grid rows occupied (1 row = 10 px by default). Defaults to 100 when omitted. */\n h?: number;\n /** Starting column index (0-based). Omit to let the grid auto-place the card. */\n x?: number;\n /** Starting row index (0-based). Omit to let the grid auto-place the card. */\n y?: number;\n /** Maximum row span in edit mode. */\n maxH?: number;\n /** Maximum column span in edit mode. */\n maxW?: number;\n /** Minimum row span in edit mode. */\n minH?: number;\n /** Minimum column span in edit mode. */\n minW?: number;\n /** ID of the parent section. Omit to place the card in the loose-card grid. */\n sectionId?: string;\n /**\n * Custom-element tag name (for `'wc'`/omitted), Angular component selector (for `'angular'`),\n * or SAP UI5 component name (for `'sap-ui'`).\n */\n component: string;\n /**\n * Render strategy for the card.\n * - `'wc'` (default) — creates a custom element and sets `componentInputs` as DOM properties.\n * - `'angular'` — looks up the Angular registry; warns and renders nothing if not found.\n * - `'sap-ui'` — mounts via `window.sap.ui.require` + `ComponentContainer`.\n */\n type?: CardsType;\n /** Key/value pairs passed to the rendered card. Behaviour depends on `type`. */\n componentInputs?: Record<string, unknown>;\n /** Human-readable label shown in the \"Add Card\" dialog. */\n label?: string;\n}\n\nexport type MountCfg = Pick<\n CardConfig,\n 'type' | 'component' | 'componentInputs'\n>;\n\n/** Configuration for a named horizontal section that groups cards. */\nexport interface SectionConfig {\n /** Unique identifier for this section. */\n id: string;\n /** Column span (1–12). Defaults to 12 when omitted. */\n w?: number;\n /** Section heading displayed in the UI. */\n title?: string;\n /** When `false`, the section and its cards are excluded from edit mode. Defaults to `true` when omitted. */\n editable?: boolean;\n}\n\n/** Overrides for the two built-in dashboard toolbar buttons. */\nexport interface DashboardButtonsSettings {\n /** Partial override merged on top of the Edit View button defaults. */\n editViewButton?: Partial<ButtonSettings>;\n /** Partial override merged on top of the Edit Cards button defaults. */\n editCardsButton?: Partial<ButtonSettings>;\n}\n\n/** Top-level configuration for the `<mfp-dashboard>` component. */\nexport interface DashboardConfig {\n /** Dashboard title rendered in the toolbar. */\n title: string;\n /** Optional subtitle shown below the title. */\n description?: string;\n /** URL of the background image applied to the dashboard host element. */\n backgroundImageUrl?: string;\n /** Overrides for the built-in Edit View and Add Card toolbar buttons. */\n buttonsSettings?: DashboardButtonsSettings;\n /** Extra action buttons rendered in the toolbar alongside the built-in ones. */\n customActions?: ButtonSettings[];\n /** When `true`, shows the Edit View button in the toolbar, allowing the user to enter edit mode. */\n editable?: boolean;\n /** When `true`, the Edit View button is rendered before the custom actions instead of after. Defaults to `false`. */\n editButtonFirst?: boolean;\n}\n","import {\n Type,\n isDevMode,\n isStandalone,\n reflectComponentType,\n} from '@angular/core';\n\n\nexport interface RegisteredDashboardCardComponent {\n componentType: Type<unknown>;\n selector: string;\n inputs: ReadonlyMap<string, string>;\n}\n\nconst ELEMENT_SELECTOR_PATTERN = /^[a-z](?:[a-z0-9-]*)$/;\n\nconst dashboardCardRegistry = new Map<\n string,\n RegisteredDashboardCardComponent\n>();\n\nexport function addComponentToRegistry(componentTypes: Type<unknown>[]): void {\n for (const componentType of componentTypes) {\n const mirror = reflectComponentType(componentType);\n\n if (!mirror) {\n throw new Error(\n `Dashboard card registration failed: \"${getTypeName(componentType)}\" is not an Angular component.`,\n );\n }\n\n if (!isStandalone(componentType)) {\n throw new Error(\n `Dashboard card registration failed: \"${mirror.selector}\" must be a standalone Angular component.`,\n );\n }\n\n const selector = toElementSelector(mirror.selector, componentType);\n const existing = dashboardCardRegistry.get(selector);\n\n if (existing && existing.componentType !== componentType) {\n throw new Error(\n `Dashboard card registration failed: selector \"${selector}\" is already registered.`,\n );\n }\n\n dashboardCardRegistry.set(selector, {\n componentType,\n selector,\n inputs: createInputMap(mirror.inputs),\n });\n }\n}\n\nexport function getRegisteredDashboardCardComponent(\n selector: string,\n): RegisteredDashboardCardComponent | undefined {\n return dashboardCardRegistry.get(selector);\n}\n\nexport function resetDashboardCardRegistry(): void {\n dashboardCardRegistry.clear();\n}\n\nexport function warnForUnknownDashboardCardInput(\n selector: string,\n inputName: string,\n): void {\n if (!isDevMode()) return;\n\n console.warn(\n `Dashboard card \"${selector}\" ignores unknown Angular input \"${inputName}\".`,\n );\n}\n\nfunction createInputMap(\n inputs: readonly {\n readonly propName: string;\n readonly templateName: string;\n }[],\n): ReadonlyMap<string, string> {\n const bindings = new Map<string, string>();\n\n for (const input of inputs) {\n bindings.set(input.templateName, input.templateName);\n bindings.set(input.propName, input.templateName);\n }\n\n return bindings;\n}\n\nfunction toElementSelector(\n selector: string,\n componentType: Type<unknown>,\n): string {\n const normalized = selector.trim();\n\n if (!ELEMENT_SELECTOR_PATTERN.test(normalized)) {\n throw new Error(\n `Dashboard card registration failed: \"${getTypeName(componentType)}\" must use a single element selector. Received \"${selector}\".`,\n );\n }\n\n return normalized;\n}\n\nfunction getTypeName(componentType: Type<unknown>): string {\n return componentType.name.replace(/^_+/, '') || 'AnonymousComponent';\n}\n","import { MountCfg } from '../../models';\nimport {\n getRegisteredDashboardCardComponent,\n warnForUnknownDashboardCardInput,\n} from './dashboard-card-registry';\nimport { EffectCleanupRegisterFn, ViewContainerRef } from '@angular/core';\n\nexport function mountAngularCard(\n cfg: MountCfg,\n angularHost: ViewContainerRef,\n onCleanup: EffectCleanupRegisterFn,\n): void {\n const registeredComponent = getRegisteredDashboardCardComponent(\n cfg.component,\n );\n\n if (!registeredComponent) {\n console.warn(\n `[DashboardCard] Angular component \"${cfg.component}\" is not registered`,\n );\n return;\n }\n\n const componentRef = angularHost.createComponent(\n registeredComponent.componentType,\n );\n\n for (const [inputName, value] of Object.entries(cfg.componentInputs ?? {})) {\n const templateName = registeredComponent.inputs.get(inputName);\n\n if (!templateName) {\n warnForUnknownDashboardCardInput(cfg.component, inputName);\n continue;\n }\n\n componentRef.setInput(templateName, value);\n }\n\n componentRef.changeDetectorRef.detectChanges();\n\n onCleanup(() => {\n angularHost.clear();\n });\n}\n","import { MountCfg } from '../../models';\nimport { EffectCleanupRegisterFn, ViewContainerRef } from '@angular/core';\n\nexport type SapUiRequire = (\n deps: string[],\n cb: (\n ComponentContainer: new (cfg: {\n name: string;\n manifest: boolean;\n async: boolean;\n settings: Record<string, unknown>;\n }) => { placeAt(el: HTMLElement): void; destroy(): void },\n ) => void,\n) => void;\n\nexport function mountSapCard(\n cfg: MountCfg,\n container: ViewContainerRef,\n onCleanup: EffectCleanupRegisterFn,\n): void {\n const host = container.element.nativeElement;\n\n let sapContainer: { destroy(): void } | null = null;\n let isDestroyed = false;\n const sapRequire = (\n window as unknown as { sap?: { ui: { require: SapUiRequire } } }\n ).sap?.ui?.require;\n\n if (sapRequire) {\n sapRequire(['sap/ui/core/ComponentContainer'], (ComponentContainer) => {\n if (isDestroyed) return;\n\n const container = new ComponentContainer({\n name: cfg.component,\n manifest: true,\n async: true,\n settings: cfg.componentInputs ?? {},\n });\n\n container.placeAt(host);\n sapContainer = container;\n });\n } else {\n console.error('[DashboardCard] SAP UI5 is not available on window.sap');\n }\n\n onCleanup(() => {\n isDestroyed = true;\n sapContainer?.destroy();\n host.innerHTML = '';\n });\n}\n","import { MountCfg } from '../../models';\nimport {\n EffectCleanupRegisterFn,\n Renderer2,\n ViewContainerRef,\n} from '@angular/core';\n\nexport function mountWcCard(\n cfg: MountCfg,\n container: ViewContainerRef,\n onCleanup: EffectCleanupRegisterFn,\n renderer: Renderer2,\n): void {\n const host = container.element.nativeElement;\n const element = renderer.createElement(cfg.component);\n\n for (const [key, value] of Object.entries(cfg.componentInputs ?? {})) {\n renderer.setProperty(element, key, value);\n }\n\n renderer.appendChild(host, element);\n\n onCleanup(() => {\n host.innerHTML = '';\n });\n}\n","import { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport { CARD_TYPES, CardConfig } from '../models';\nimport { mountAngularCard, mountSapCard, mountWcCard } from './utils';\nimport {\n Component,\n Renderer2,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/resize-corner.js';\n\n@Component({\n selector: 'mfp-dashboard-card',\n imports: [Button, Icon],\n templateUrl: './dashboard-card.component.html',\n styleUrl: './dashboard-card.component.scss',\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n '[style.grid-column]': 'gridColumn()',\n '[style.grid-row]': 'gridRow()',\n },\n})\nexport class DashboardCard {\n card = input.required<CardConfig>();\n editMode = input<boolean>(false);\n readonly removeCard = output<void>();\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n protected readonly gridColumn = computed(() => {\n const width = this.card().w ?? 12;\n return this.createGridTrack(this.card().x, width);\n });\n protected readonly gridRow = computed(() => {\n const height = this.card().h ?? 100;\n return this.createGridTrack(this.card().y, height);\n });\n\n private host = viewChild('elementHost', { read: ViewContainerRef });\n private renderer = inject(Renderer2);\n\n private readonly mountCfg = computed(\n () => {\n const c = this.card();\n return {\n type: c.type,\n component: c.component,\n componentInputs: c.componentInputs,\n };\n },\n {\n equal: (a, b) =>\n a.type === b.type &&\n a.component === b.component &&\n JSON.stringify(a.componentInputs) === JSON.stringify(b.componentInputs),\n },\n );\n\n constructor() {\n effect((onCleanup) => {\n const host = this.host();\n const mountCfg = this.mountCfg();\n if (!host || !mountCfg.component) return;\n\n host.clear();\n host.element.nativeElement.innerHTML = '';\n\n switch (mountCfg.type) {\n case CARD_TYPES.SAP_UI:\n mountSapCard(mountCfg, host, onCleanup);\n break;\n case CARD_TYPES.ANGULAR:\n mountAngularCard(mountCfg, host, onCleanup);\n break;\n case CARD_TYPES.WC:\n default:\n mountWcCard(mountCfg, host, onCleanup, this.renderer);\n break;\n }\n });\n }\n\n private createGridTrack(start: number | undefined, span: number): string {\n if (start === undefined) {\n return `span ${span}`;\n }\n\n return `${start + 1} / span ${span}`;\n }\n}\n","@if (card().component) {\n <div class=\"component-card\" [attr.data-testid]=\"'dashboard-card-' + card().id\" [class.component-card--editing]=\"editMode()\">\n @if (editMode()) {\n <div class=\"remove-wrapper\">\n <ui5-button\n class=\"card__remove\"\n design=\"Default\"\n icon=\"decline\"\n [attr.data-testid]=\"'dashboard-card-' + card().id + '-remove'\"\n [accessibleName]=\"\n i18n.getTranslation(i18nKeys.REMOVE_CARD) +\n ': ' +\n (card().label || card().component)\n \"\n (click)=\"removeCard.emit()\"\n />\n </div>\n <ui5-icon\n aria-hidden=\"true\"\n class=\"card__resize-indicator\"\n name=\"resize-corner\"\n [accessibleName]=\"i18n.getTranslation(i18nKeys.RESIZABLE)\"\n />\n }\n <div\n class=\"component-host\"\n [style.pointer-events]=\"editMode() ? 'none' : 'auto'\"\n >\n <div #elementHost></div>\n </div>\n </div>\n} @else {\n <div class=\"card\" [attr.data-testid]=\"'dashboard-card-' + card().id\">\n <div\n class=\"card__body\"\n [style.pointer-events]=\"editMode() ? 'none' : 'auto'\"\n >\n <ng-content />\n </div>\n </div>\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// MUST MATCH: ./_breakpoints.scss\n//\n// These breakpoints are consumed by two systems that can't share a single\n// source of truth at compile time:\n//\n// 1. dashboard.component.ts — passed to Gridstack as\n// `gridOptions.columnOpts.breakpoints`. Gridstack picks the active\n// breakpoint by `w` (max-width). At each breakpoint, every grid item is\n// laid out using `c` columns.\n//\n// 2. dashboard.component.scss — used in a `@container` query so the\n// `.mfp-sections-container` CSS grid mirrors the same column count as\n// Gridstack at the same width.\n//\n// If you change either set of values, change BOTH files in the same commit.\n// The two are kept in sync by hand (no codegen). A SCSS-from-TS generator\n// would remove this hazard but is out of scope here.\n// ─────────────────────────────────────────────────────────────────────────────\nimport type { Breakpoint } from 'gridstack';\n\n/**\n * Layout strategy applied at each breakpoint when Gridstack changes column\n * count. See ColumnOptions in gridstack/dist/types.d.ts:27 for the full set.\n */\ntype LayoutStrategy = 'compact' | 'list' | 'none';\n\n/** Single source of truth for grid + section breakpoints (TypeScript half). */\nexport const DASHBOARD_BREAKPOINTS: readonly Readonly<Required<Pick<Breakpoint, 'w' | 'c'>> & { layout: LayoutStrategy }>[] = [\n { w: 4000, c: 14, layout: 'compact' },\n { w: 1439, c: 12, layout: 'compact' },\n { w: 1023, c: 8, layout: 'compact' },\n { w: 599, c: 1, layout: 'list' },\n] as const;\n","export const COMPACT_BREAKPOINT = 726;\nexport const CELL_HEIGHT = 10;\n","import { Component, ViewEncapsulation, inject, input, output } from '@angular/core';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/alert.js';\n\n/**\n * Confirmation popup shown when the user tries to abandon edit mode while\n * there are unsaved dashboard changes. Emits `confirm` when the user accepts\n * the discard, `cancelled` when they back out.\n */\n@Component({\n selector: 'mfp-discard-changes-dialog',\n imports: [Button, Dialog, Title],\n templateUrl: './discard-changes-dialog.component.html',\n styleUrl: './discard-changes-dialog.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class DiscardChangesDialog {\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n open = input<boolean>(false);\n\n readonly confirm = output<void>();\n readonly cancelled = output<void>();\n}\n","<ui5-dialog data-testid=\"dashboard-discard-changes-dialog\" state=\"Critical\" [open]=\"open()\" (ui5BeforeClose)=\"cancelled.emit()\">\n <div class=\"discard-changes-dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ i18n.getTranslation(i18nKeys.DISCARD_CHANGES) }}</ui5-title>\n </div>\n <div class=\"discard-changes-dialog__body\">\n {{ i18n.getTranslation(i18nKeys.DISCARD_CONFIRM_BODY) }}\n </div>\n <div class=\"discard-changes-dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"dashboard-discard-changes-confirm-btn\" design=\"Emphasized\" (click)=\"confirm.emit()\">{{ i18n.getTranslation(i18nKeys.DISCARD) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-discard-changes-cancel-btn\" design=\"Transparent\" (click)=\"cancelled.emit()\">{{ i18n.getTranslation(i18nKeys.CANCEL) }}</ui5-button>\n </div>\n</ui5-dialog>\n","import { CardConfig } from '../models';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport {\n Component,\n ElementRef,\n ViewEncapsulation,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { List } from '@fundamental-ngx/ui5-webcomponents/list';\nimport { ListItemCustom } from '@fundamental-ngx/ui5-webcomponents/list-item-custom';\nimport { Switch } from '@fundamental-ngx/ui5-webcomponents/switch';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n@Component({\n selector: 'mfp-edit-cards-dialog',\n imports: [Button, Dialog, List, ListItemCustom, Switch, Title],\n templateUrl: './edit-cards-dialog.component.html',\n styleUrl: './edit-cards-dialog.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class EditCardsDialog {\n private readonly host = inject(ElementRef<HTMLElement>);\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n availableCards = input<CardConfig[]>([]);\n addedCardsIds = input<Set<string>>(new Set());\n open = input<boolean>(false);\n\n readonly confirm = output<{ added: CardConfig[]; removed: string[] }>();\n readonly cancelled = output<void>();\n\n selectedIds = signal<Set<string>>(new Set());\n\n constructor() {\n effect(() => {\n if (this.open()) {\n const initial = new Set(\n this.availableCards()\n .filter((ac) => this.addedCardsIds().has(ac.id))\n .map((ac) => ac.id),\n );\n this.selectedIds.set(initial);\n }\n });\n }\n\n toggle(id: string): void {\n this.selectedIds.update((set) => {\n const next = new Set(set);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }\n\n /**\n * Tab moves focus across the switches directly, skipping the wrapping\n * ui5-li-custom rows. Past the last switch Tab goes to the first footer\n * button; before the first switch Shift+Tab goes to the last footer button.\n * The dialog's native focus trap takes care of cycling from the buttons\n * back into the list.\n */\n onSwitchKeydown(event: KeyboardEvent, _id: string): void {\n if (event.key !== 'Tab') {\n return;\n }\n const root: ParentNode =\n this.host.nativeElement.shadowRoot ?? this.host.nativeElement;\n const switches = Array.from(\n root.querySelectorAll('ui5-switch'),\n ) as HTMLElement[];\n const buttons = Array.from(\n root.querySelectorAll('ui5-button'),\n ) as HTMLElement[];\n const currentIndex = switches.indexOf(event.currentTarget as HTMLElement);\n if (currentIndex === -1) {\n return;\n }\n if (event.shiftKey) {\n const prev = switches[currentIndex - 1];\n if (prev) {\n event.preventDefault();\n event.stopPropagation();\n prev.focus();\n }\n // First switch: let Shift+Tab fall through so the dialog's focus trap\n // wraps to the last footer button.\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const next = switches[currentIndex + 1];\n if (next) {\n next.focus();\n return;\n }\n // Last switch: hand off to the first footer button.\n buttons[0]?.focus();\n }\n\n confirmSave(): void {\n const availableIds = new Set(this.availableCards().map((ac) => ac.id));\n const added = this.availableCards().filter(\n (ac) => this.selectedIds().has(ac.id) && !this.addedCardsIds().has(ac.id),\n );\n const removed = [...this.addedCardsIds()].filter(\n (id) => availableIds.has(id) && !this.selectedIds().has(id),\n );\n this.confirm.emit({ added, removed });\n }\n}\n","<ui5-dialog data-testid=\"dashboard-edit-cards-dialog\" class=\"edit-cards-dialog-container\" [open]=\"open()\" (ui5BeforeClose)=\"cancelled.emit()\">\n <div class=\"edit-cards-dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ i18n.getTranslation(i18nKeys.EDIT_CARDS) }}</ui5-title>\n </div>\n <div class=\"edit-cards-dialog\">\n <ui5-list\n selectionMode=\"None\"\n separators=\"Inner\"\n [noDataText]=\"i18n.getTranslation(i18nKeys.NO_CARDS_AVAILABLE)\"\n >\n @for (availableCard of availableCards(); track availableCard.id) {\n <ui5-li-custom\n [attr.data-testid]=\"'dashboard-edit-cards-row-' + availableCard.id\"\n class=\"edit-cards-dialog__list-item-container\"\n [accessibleName]=\"availableCard.label || availableCard.component\"\n >\n <div class=\"edit-cards-dialog__list-item\">\n <span>{{ availableCard.label || availableCard.component }}</span>\n <ui5-switch\n [attr.data-testid]=\"'dashboard-edit-cards-switch-' + availableCard.id\"\n [accessibleName]=\"availableCard.label || availableCard.component\"\n [checked]=\"selectedIds().has(availableCard.id)\"\n (keydown)=\"onSwitchKeydown($event, availableCard.id)\"\n (ui5Change)=\"toggle(availableCard.id)\"\n />\n </div>\n </ui5-li-custom>\n }\n </ui5-list>\n </div>\n <div class=\"edit-cards-dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"dashboard-edit-cards-save-btn\" design=\"Emphasized\" (click)=\"confirmSave()\">{{ i18n.getTranslation(i18nKeys.SAVE) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-edit-cards-cancel-btn\" design=\"Transparent\" (click)=\"cancelled.emit()\">{{ i18n.getTranslation(i18nKeys.CANCEL) }}</ui5-button>\n </div>\n</ui5-dialog>\n","import { DashboardCard } from '../card/dashboard-card.component';\nimport { CardConfig, SectionConfig } from '../models';\nimport { Component, ViewEncapsulation, inject, input, output } from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\n\n@Component({\n selector: 'mfp-dashboard-section',\n imports: [DashboardCard, Button],\n templateUrl: './dashboard-section.component.html',\n styleUrl: './dashboard-section.component.scss',\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Section width interpretation:\n // - `section.w` undefined OR equal to the active outer grid's column\n // count (12) → span the full outer row (`1 / -1`). This is what the\n // consumer means by \"full-width section\": fill whatever the dashboard\n // is showing right now (4 / 8 / 12 / 14 columns at sm/md/lg/xl).\n // - any other explicit `w` → span exactly that many outer columns.\n //\n // Without `1 / -1`, a `w: 12` section in an xl grid (14 cols) would only\n // cover 12 of 14 columns, leaving a dead 2-col gutter on the right and\n // squeezing the cards inside it relative to the outer grid's units.\n '[style.grid-column]':\n 'section().w === undefined || section().w === 12 ? \"1 / -1\" : \"span \" + section().w',\n },\n})\nexport class DashboardSection {\n section = input.required<SectionConfig>();\n cards = input<CardConfig[]>([]);\n /**\n * Optional override for the section's inner grid column count. Leave unset\n * (the default) to inherit the responsive defaults from CSS — the section\n * grid then mirrors the dashboard breakpoints (4/8/12/14 columns) via the\n * `mfp-dashboard` container query in dashboard-section.component.scss.\n * Pass an explicit number only when a section needs a fixed column count\n * regardless of width.\n */\n columns = input<number | undefined>(undefined);\n editMode = input<boolean>(false);\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n readonly removeSection = output<void>();\n readonly removeCard = output<string>();\n}\n","<div\n class=\"section\"\n [attr.data-testid]=\"'dashboard-section-' + section().id\"\n [class.section--edit]=\"editMode() && section().editable !== false\"\n>\n @if (editMode() && section().editable !== false) {\n <ui5-button\n class=\"section__remove\"\n design=\"Default\"\n icon=\"decline\"\n [attr.data-testid]=\"'dashboard-section-' + section().id + '-remove'\"\n [accessibleName]=\"\n i18n.getTranslation(i18nKeys.REMOVE_SECTION) +\n ': ' +\n (section().title || section().id)\n \"\n (click)=\"removeSection.emit()\"\n />\n }\n @if (section().title) {\n <div class=\"section__header\">\n <span class=\"section__title\" [attr.data-testid]=\"'dashboard-section-' + section().id + '-title'\">{{ section().title }}</span>\n </div>\n }\n <div class=\"section__grid\" [style.--cols]=\"columns() ?? null\">\n @for (card of cards(); track card.id) {\n <mfp-dashboard-card\n [card]=\"card\"\n [editMode]=\"editMode() && section().editable !== false\"\n (removeCard)=\"removeCard.emit($any(card.id))\"\n />\n }\n </div>\n</div>\n","import { Component, ViewEncapsulation, inject, input, output } from '@angular/core';\nimport { DASHBOARD_I18N_KEYS, DashboardI18nService } from '../i18n';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Dialog } from '@fundamental-ngx/ui5-webcomponents/dialog';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/alert.js';\n\n/**\n * Confirmation popup shown when the user attempts to navigate away from the\n * dashboard while there are unsaved edit-mode changes. The host (the\n * dashboard, an Angular CanDeactivate guard, a Luigi navigation listener,\n * etc.) is responsible for routing its intercepted navigation through this\n * dialog and acting on the emitted decision:\n * - `save` → persist changes, then proceed with navigation\n * - `discard` → revert changes, then proceed with navigation\n * - `cancelled` → abort navigation, stay on the page\n */\n@Component({\n selector: 'mfp-unsaved-changes-dialog',\n imports: [Button, Dialog, Title],\n templateUrl: './unsaved-changes-dialog.component.html',\n styleUrl: './unsaved-changes-dialog.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class UnsavedChangesDialog {\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n open = input<boolean>(false);\n\n readonly save = output<void>();\n readonly discard = output<void>();\n readonly cancelled = output<void>();\n}\n","<ui5-dialog data-testid=\"dashboard-unsaved-changes-dialog\" state=\"Critical\" [open]=\"open()\" (ui5BeforeClose)=\"cancelled.emit()\">\n <div class=\"unsaved-changes-dialog__header\" slot=\"header\">\n <ui5-title level=\"H5\">{{ i18n.getTranslation(i18nKeys.UNSAVED_CHANGES) }}</ui5-title>\n </div>\n <div class=\"unsaved-changes-dialog__body\">\n {{ i18n.getTranslation(i18nKeys.UNSAVED_NAV_BODY) }}\n </div>\n <div class=\"unsaved-changes-dialog__footer\" slot=\"footer\">\n <ui5-button data-testid=\"dashboard-unsaved-changes-save-btn\" design=\"Emphasized\" (click)=\"save.emit()\">{{ i18n.getTranslation(i18nKeys.SAVE) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-unsaved-changes-discard-btn\" design=\"Transparent\" (click)=\"discard.emit()\">{{ i18n.getTranslation(i18nKeys.DISCARD) }}</ui5-button>\n <ui5-button data-testid=\"dashboard-unsaved-changes-cancel-btn\" design=\"Transparent\" (click)=\"cancelled.emit()\">{{ i18n.getTranslation(i18nKeys.CANCEL) }}</ui5-button>\n </div>\n</ui5-dialog>\n","import {\n Component,\n ElementRef,\n Injector,\n OnDestroy,\n OnInit,\n SecurityContext,\n Type,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Menu } from '@fundamental-ngx/ui5-webcomponents/menu';\nimport { MenuItem } from '@fundamental-ngx/ui5-webcomponents/menu-item';\nimport { MenuSeparator } from '@fundamental-ngx/ui5-webcomponents/menu-separator';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\nimport '@ui5/webcomponents-icons/dist/action-settings.js';\nimport '@ui5/webcomponents-icons/dist/menu2.js';\nimport '@ui5/webcomponents-icons/dist/user-edit.js';\nimport { GridStackNode, GridStackOptions } from 'gridstack';\nimport {\n GridstackComponent,\n GridstackItemComponent,\n} from 'gridstack/dist/angular';\nimport { ButtonSettings } from '../../models';\nimport { DashboardCard } from '../card/dashboard-card.component';\nimport { addComponentToRegistry } from '../card/utils';\nimport {\n CELL_HEIGHT,\n COMPACT_BREAKPOINT,\n DASHBOARD_BREAKPOINTS,\n} from '../constants';\nimport { DiscardChangesDialog } from '../discard-changes-dialog/discard-changes-dialog.component';\nimport { EditCardsDialog } from '../edit-cards-dialog/edit-cards-dialog.component';\nimport {\n DASHBOARD_I18N_KEYS,\n DashboardI18nService,\n DashboardLanguage,\n} from '../i18n';\nimport { CardConfig, DashboardConfig, SectionConfig } from '../models';\nimport { DashboardSection } from '../section/dashboard-section.component';\nimport { UnsavedChangesDialog } from '../unsaved-changes-dialog/unsaved-changes-dialog.component';\n\ndocument.body.classList.add('ui5-content-density-compact');\n\n@Component({\n selector: 'mfp-dashboard',\n imports: [\n GridstackComponent,\n GridstackItemComponent,\n DiscardChangesDialog,\n EditCardsDialog,\n UnsavedChangesDialog,\n DashboardSection,\n DashboardCard,\n Button,\n Icon,\n Menu,\n MenuItem,\n MenuSeparator,\n Title,\n ],\n templateUrl: './dashboard.component.html',\n styleUrl: './dashboard.component.scss',\n providers: [DashboardI18nService],\n encapsulation: ViewEncapsulation.None,\n host: {\n '[style.background-image]':\n 'config().backgroundImageUrl ? \"url(\" + config().backgroundImageUrl + \")\" : null',\n '[style.background-size]':\n 'backgroundImageHeight() ? \"100% \" + backgroundImageHeight() + \"px\" : \"100% auto\"',\n },\n})\nexport class Dashboard implements OnInit, OnDestroy {\n static registerAngularComponents(componentTypes: Type<unknown>[]): void {\n addComponentToRegistry(componentTypes);\n }\n\n config = input.required<DashboardConfig>();\n sections = model<SectionConfig[]>([]);\n cards = model<CardConfig[]>([]);\n availableCards = input<CardConfig[]>([]);\n language = input<DashboardLanguage>('en');\n\n readonly saved = output<{ sections: SectionConfig[]; cards: CardConfig[] }>();\n readonly actionButtonClick = output<{\n event: MouseEvent;\n action: ButtonSettings;\n }>();\n readonly unsavedChangesChange = output<boolean>();\n\n editMode = signal(false);\n compactToolbar = signal(false);\n toolbarMenuOpen = signal(false);\n\n /** True once the user has dragged/resized any grid item while in edit mode. */\n private gridDirty = signal(false);\n\n protected backgroundImageHeight = signal<number | null>(null);\n\n /** JSON snapshots of sections/cards taken on entering edit mode, used to detect changes. */\n private sectionsSnapshotJson = '';\n private cardsSnapshotJson = '';\n\n /**\n * True when the user is in edit mode AND has made any change (sections/cards\n * mutated, or grid items moved/resized). Resets when entering edit mode and\n * after save/cancel.\n */\n hasUnsavedChanges = computed(() => {\n if (!this.editMode()) return false;\n if (this.gridDirty()) return true;\n return (\n JSON.stringify(this.sections()) !== this.sectionsSnapshotJson ||\n JSON.stringify(this.cards()) !== this.cardsSnapshotJson\n );\n });\n\n private sectionsSnapshot: SectionConfig[] = [];\n private cardsSnapshot: CardConfig[] = [];\n private gridStackItems = viewChild.required<GridstackComponent>('grid');\n private addCardBtn = viewChild<Button>('editCardsBtn');\n private resizeObserver?: ResizeObserver;\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly injector = inject(Injector);\n private readonly sanitizer = inject(DomSanitizer);\n protected readonly i18n = inject(DashboardI18nService);\n protected readonly i18nKeys = DASHBOARD_I18N_KEYS;\n\n protected safeTitle = computed((): SafeHtml => {\n const clean =\n this.sanitizer.sanitize(SecurityContext.HTML, this.config().title) ?? '';\n return this.sanitizer.bypassSecurityTrustHtml(clean);\n });\n\n protected safeDescription = computed((): SafeHtml | null => {\n const desc = this.config().description;\n if (!desc) return null;\n\n const clean = this.sanitizer.sanitize(SecurityContext.HTML, desc) ?? '';\n return this.sanitizer.bypassSecurityTrustHtml(clean);\n });\n\n protected gridOptions = computed(\n (): GridStackOptions => ({\n cellHeight: CELL_HEIGHT,\n sizeToContent: true,\n disableResize: !this.editMode(),\n disableDrag: !this.editMode(),\n marginBottom: 0,\n marginLeft: 0,\n marginRight: 0,\n columnOpts: {\n // Source of truth: ../models/breakpoints.ts (paired with\n // ../models/_breakpoints.scss for the section grid's container queries).\n breakpoints: [...DASHBOARD_BREAKPOINTS],\n },\n }),\n );\n\n cardDialogOpen = signal(false);\n discardDialogOpen = signal(false);\n unsavedNavDialogOpen = signal(false);\n /** Callback that resumes the intercepted navigation once the user resolves the dialog. */\n private pendingNavigation: (() => void) | null = null;\n /** beforeunload handler kept on instance so add/removeEventListener pair up. */\n private readonly beforeUnloadHandler = (event: BeforeUnloadEvent): void => {\n if (this.hasUnsavedChanges()) {\n event.preventDefault();\n // Required by older browsers; the string itself is ignored — modern\n // browsers always render their own generic prompt.\n event.returnValue = '';\n }\n };\n customActions = computed(() => this.config().customActions ?? []);\n addedCardsIds = computed(() => new Set(this.cards().map((c) => c.id)));\n\n editViewButton = computed(() => ({\n icon: 'action-settings',\n design: 'Transparent' as const,\n tooltip: this.i18n.getTranslation(DASHBOARD_I18N_KEYS.EDIT_VIEW),\n text: '',\n ...this.config().buttonsSettings?.editViewButton,\n }));\n\n editCardsButton = computed(() => ({\n icon: '',\n design: 'Default' as const,\n tooltip: '',\n text: this.i18n.getTranslation(DASHBOARD_I18N_KEYS.EDIT_CARDS),\n ...this.config().buttonsSettings?.editCardsButton,\n }));\n\n sectionCards = computed(() => {\n const all = this.cards();\n return (sectionId: string) => all.filter((c) => c.sectionId === sectionId);\n });\n\n cardsPosition = new Map<\n string,\n { x?: number; y?: number; w?: number; h?: number }\n >();\n looseCards = linkedSignal(() => this.cards().filter((c) => !c.sectionId));\n\n private newGridStackNodes: GridStackNode[] = [];\n\n constructor() {\n effect(() => {\n this.unsavedChangesChange.emit(this.hasUnsavedChanges());\n });\n effect(() => {\n this.i18n.language.set(this.language());\n });\n effect((onCleanup) => {\n const url = this.config().backgroundImageUrl;\n this.backgroundImageHeight.set(null);\n if (!url) return;\n const img = new Image();\n img.onload = () => {\n this.backgroundImageHeight.set(img.naturalHeight);\n };\n img.src = url;\n onCleanup(() => {\n img.onload = null;\n });\n });\n }\n\n ngOnInit(): void {\n this.resizeObserver = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width ?? 0;\n this.compactToolbar.set(width < COMPACT_BREAKPOINT);\n });\n this.resizeObserver.observe(this.hostEl.nativeElement);\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\n }\n\n onMenuItemClick(actionId: string, event: Event): void {\n if (actionId === 'edit-view') {\n this.enterEditMode();\n return;\n }\n const action = this.customActions().find((a) => a.action === actionId);\n if (action) {\n this.actionButtonClick.emit({ event: event as MouseEvent, action });\n }\n }\n\n enterEditMode(): void {\n this.updateCardsPositions();\n\n this.sectionsSnapshot = [...this.sections()];\n this.cardsSnapshot = [...this.cards()];\n this.sectionsSnapshotJson = JSON.stringify(this.sections());\n this.cardsSnapshotJson = JSON.stringify(this.cards());\n this.gridDirty.set(false);\n this.editMode.set(true);\n afterNextRender(\n () => {\n this.addCardBtn()?.element.focus();\n },\n { injector: this.injector },\n );\n }\n\n saveEdit(): void {\n this.updateCardsPositions();\n\n const savedCards = this.cards().map((c) => {\n const pos = this.cardsPosition.get(c.id);\n return {\n ...c,\n x: pos?.x,\n y: pos?.y,\n w: pos?.w ?? c.w,\n h: pos?.h ?? c.h,\n };\n });\n this.gridDirty.set(false);\n this.editMode.set(false);\n\n this.cards.set(savedCards);\n this.saved.emit({\n sections: this.sections(),\n cards: savedCards,\n });\n }\n\n cancelEdit(): void {\n if (this.hasUnsavedChanges()) {\n this.discardDialogOpen.set(true);\n return;\n }\n this.discardEdit();\n }\n\n confirmDiscard(): void {\n this.discardDialogOpen.set(false);\n this.discardEdit();\n }\n\n cancelDiscard(): void {\n this.discardDialogOpen.set(false);\n }\n\n /**\n * Public framework-agnostic navigation guard. Consumer apps (Angular Router\n * CanDeactivate guard, Luigi navigation listener, plain `<a>` click handler,\n * window history listener — anything) call this before performing their\n * navigation:\n *\n * if (dashboard.requestNavigation(() => router.navigateByUrl(target))) {\n * // already navigated synchronously — clean state\n * } else {\n * // dashboard popped the unsaved-changes dialog; the navigation will\n * // resume from the user's choice (Save → proceed, Discard → proceed,\n * // Cancel → drop the request entirely).\n * }\n *\n * Returns `true` when navigation may proceed immediately (no unsaved\n * changes — `proceed` was invoked synchronously). Returns `false` when the\n * dialog has been opened and the caller must NOT navigate; the dashboard\n * will run the callback later if the user picks Save or Discard.\n *\n * If a previous navigation is already pending, that one is dropped in\n * favour of the new request — Cancel always means \"stay here\", so losing\n * the older queued navigation is the correct outcome.\n */\n requestNavigation(proceed: () => void): boolean {\n if (!this.hasUnsavedChanges()) {\n proceed();\n return true;\n }\n this.pendingNavigation = proceed;\n this.unsavedNavDialogOpen.set(true);\n return false;\n }\n\n /** Save → persist changes, close the dialog, then resume navigation. */\n onUnsavedNavSave(): void {\n this.unsavedNavDialogOpen.set(false);\n this.saveEdit();\n this.runPendingNavigation();\n }\n\n /** Discard → revert to snapshot, close the dialog, then resume navigation. */\n onUnsavedNavDiscard(): void {\n this.unsavedNavDialogOpen.set(false);\n this.discardEdit();\n this.runPendingNavigation();\n }\n\n /** Cancel → drop the queued navigation and stay in edit mode. */\n onUnsavedNavCancel(): void {\n this.unsavedNavDialogOpen.set(false);\n this.pendingNavigation = null;\n }\n\n private runPendingNavigation(): void {\n const pending = this.pendingNavigation;\n this.pendingNavigation = null;\n pending?.();\n }\n\n private discardEdit(): void {\n this.sections.set(this.sectionsSnapshot);\n this.cards.set(\n this.cardsSnapshot.map((c) => {\n const pos = this.cardsPosition.get(c.id);\n return { ...c, x: pos?.x, y: pos?.y };\n }),\n );\n this.cardDialogOpen.set(false);\n this.gridDirty.set(false);\n this.editMode.set(false);\n }\n\n removeSection(id: string): void {\n this.sections.update((list) => list.filter((s) => s.id !== id));\n this.cards.update((list) => list.filter((c) => c.sectionId !== id));\n }\n\n removeCard(id: string): void {\n const wasLooseCard = this.looseCards().some((c) => c.id === id);\n this.cardsPosition.delete(id);\n this.cards.update((list) => list.filter((c) => c.id !== id));\n\n if (wasLooseCard) {\n afterNextRender(\n () => {\n this.gridStackItems().grid?.compact('compact', false);\n },\n { injector: this.injector },\n );\n }\n }\n\n openCardPanel(): void {\n this.cardDialogOpen.set(true);\n }\n\n closeCardPanel(): void {\n this.cardDialogOpen.set(false);\n }\n\n onCardsEdited(event: { added: CardConfig[]; removed: string[] }): void {\n this.cards.update((list) => {\n const withoutRemoved = list.filter((c) => !event.removed.includes(c.id));\n return [...withoutRemoved, ...event.added.map((ac) => ({ ...ac }))];\n });\n this.closeCardPanel();\n }\n\n onGridChange(): void {\n if (this.editMode()) {\n this.gridDirty.set(true);\n }\n }\n\n private saveCardsPosition(items: GridStackNode[]): void {\n items.forEach((node) => {\n if (node.id) {\n this.cardsPosition.set(node.id, {\n x: node.x,\n y: node.y,\n w: node.w,\n h: node.h,\n });\n }\n });\n }\n\n private updateCardsPositions(): void {\n const gridStackNodes = this.gridStackItems()\n .gridstackItems?.toArray()\n .map((node) => node.options);\n\n if (gridStackNodes) {\n this.saveCardsPosition(gridStackNodes);\n }\n }\n}\n","<div class=\"mfp-dashboard\" data-testid=\"dashboard\">\n <div class=\"mfp-dashboard__topbar\">\n <div class=\"mfp-dashboard__topbar-row\">\n <div class=\"mfp-dashboard__header\">\n <div class=\"mfp-dashboard__title-row\">\n @if (config().title) {\n <ui5-title level=\"H3\" size=\"H3\" wrapping-type=\"Normal\" data-testid=\"dashboard-title\">\n <span [innerHTML]=\"safeTitle()\"></span>\n </ui5-title>\n }\n @if (hasUnsavedChanges()) {\n <div class=\"mfp-dashboard__unsaved-changes\" role=\"status\">\n <ui5-icon\n class=\"mfp-dashboard__unsaved-changes-icon\"\n name=\"user-edit\"\n [accessibleName]=\"i18n.getTranslation(i18nKeys.UNSAVED_CHANGES)\"\n />\n <span class=\"mfp-dashboard__unsaved-changes-text\">{{\n i18n.getTranslation(i18nKeys.UNSAVED_CHANGES)\n }}</span>\n </div>\n }\n </div>\n @if (config().description) {\n <ui5-title level=\"H5\" size=\"H5\" wrapping-type=\"Normal\" data-testid=\"dashboard-description\">\n <span\n class=\"mfp-dashboard__description\"\n [innerHTML]=\"safeDescription()\"\n ></span>\n </ui5-title>\n }\n </div>\n\n <div class=\"mfp-dashboard__toolbar\">\n @if (editMode()) {\n <ui5-button\n #editCardsBtn\n id=\"edit-cards-btn\"\n data-testid=\"dashboard-edit-cards-btn\"\n [accessibleName]=\"\n editCardsButton().text ||\n editCardsButton().tooltip ||\n i18n.getTranslation(i18nKeys.EDIT_CARDS)\n \"\n [design]=\"editCardsButton().design\"\n [icon]=\"editCardsButton().icon\"\n [tooltip]=\"editCardsButton().tooltip\"\n (click)=\"openCardPanel()\"\n >{{ editCardsButton().text }}</ui5-button\n >\n } @else if (compactToolbar()) {\n <ui5-button\n #menuBtn\n data-testid=\"dashboard-toolbar-menu-btn\"\n design=\"Transparent\"\n icon=\"menu2\"\n [accessibleName]=\"i18n.getTranslation(i18nKeys.ACTIONS)\"\n [tooltip]=\"i18n.getTranslation(i18nKeys.ACTIONS)\"\n (click)=\"toolbarMenuOpen.update((v) => !v)\"\n />\n <ui5-menu\n data-testid=\"dashboard-toolbar-menu\"\n [open]=\"toolbarMenuOpen()\"\n [opener]=\"menuBtn.element\"\n (ui5Close)=\"toolbarMenuOpen.set(false)\"\n (ui5ItemClick)=\"\n onMenuItemClick(\n $any($event).detail.item.dataset['action'],\n $event\n )\n \"\n (ui5Open)=\"toolbarMenuOpen.set(true)\"\n >\n @if (config().editButtonFirst && config().editable) {\n <ui5-menu-item\n data-action=\"edit-view\"\n data-testid=\"dashboard-action-edit-view\"\n [icon]=\"editViewButton().icon\"\n [text]=\"\n editViewButton().text ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n />\n @if (customActions().length) {\n <ui5-menu-separator />\n }\n }\n @for (action of customActions(); track action.action) {\n <ui5-menu-item\n [attr.data-action]=\"action.action\"\n [attr.data-testid]=\"'dashboard-action-' + action.action\"\n [icon]=\"action.icon ?? ''\"\n [text]=\"action.text ?? ''\"\n />\n }\n @if (!config().editButtonFirst && config().editable) {\n <ui5-menu-separator />\n <ui5-menu-item\n data-action=\"edit-view\"\n data-testid=\"dashboard-action-edit-view\"\n [icon]=\"editViewButton().icon\"\n [text]=\"\n editViewButton().text ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n />\n }\n </ui5-menu>\n } @else {\n @if (config().editButtonFirst && config().editable) {\n <ui5-button\n data-testid=\"dashboard-edit-view-btn\"\n [accessibleName]=\"\n editViewButton().text ||\n editViewButton().tooltip ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n [design]=\"editViewButton().design\"\n [icon]=\"editViewButton().icon\"\n [tooltip]=\"editViewButton().tooltip\"\n (click)=\"enterEditMode()\"\n >{{ editViewButton().text }}</ui5-button\n >\n }\n @for (action of customActions(); track action.action) {\n <ui5-button\n [attr.data-testid]=\"'dashboard-action-' + action.action\"\n [accessibleName]=\"action.text || action.tooltip || action.action\"\n [design]=\"action.design ?? 'Default'\"\n [endIcon]=\"action?.endIcon\"\n [icon]=\"action.icon ?? ''\"\n [tooltip]=\"action.tooltip ?? ''\"\n (click)=\"\n actionButtonClick.emit({ event: $event, action: action })\n \"\n >{{ action.text }}</ui5-button\n >\n }\n @if (!config().editButtonFirst && config().editable) {\n <ui5-button\n data-testid=\"dashboard-edit-view-btn\"\n [accessibleName]=\"\n editViewButton().text ||\n editViewButton().tooltip ||\n i18n.getTranslation(i18nKeys.EDIT_VIEW)\n \"\n [design]=\"editViewButton().design\"\n [icon]=\"editViewButton().icon\"\n [tooltip]=\"editViewButton().tooltip\"\n (click)=\"enterEditMode()\"\n >{{ editViewButton().text }}</ui5-button\n >\n }\n }\n </div>\n </div>\n\n <div class=\"mfp-dashboard__subheader\">\n <ng-content select=\"[slot=dashboard-subheader]\" />\n </div>\n </div>\n\n <div class=\"mfp-sections-container\">\n @for (section of sections(); track section.id) {\n <mfp-dashboard-section\n [cards]=\"sectionCards()(section.id)\"\n [editMode]=\"editMode()\"\n [section]=\"section\"\n (removeCard)=\"removeCard($event)\"\n (removeSection)=\"removeSection(section.id)\"\n />\n }\n </div>\n\n <gridstack\n #grid\n data-testid=\"dashboard-grid\"\n [options]=\"gridOptions()\"\n (addedCB)=\"onGridChange()\"\n (changeCB)=\"onGridChange()\"\n (removedCB)=\"onGridChange()\"\n >\n @for (card of looseCards(); track card.id) {\n <gridstack-item [options]=\"card\">\n <mfp-dashboard-card\n [card]=\"card\"\n [editMode]=\"editMode()\"\n (removeCard)=\"removeCard($any(card.id))\"\n />\n </gridstack-item>\n }\n </gridstack>\n\n</div>\n@if (editMode()) {\n <div class=\"mfp-dashboard__edit-bar\">\n <ui5-button data-testid=\"dashboard-save-btn\" design=\"Emphasized\" (click)=\"saveEdit()\">{{\n i18n.getTranslation(i18nKeys.SAVE)\n }}</ui5-button>\n <ui5-button data-testid=\"dashboard-cancel-btn\" design=\"Transparent\" (click)=\"cancelEdit()\">{{\n i18n.getTranslation(i18nKeys.CANCEL)\n }}</ui5-button>\n </div>\n}\n\n<mfp-edit-cards-dialog\n [addedCardsIds]=\"addedCardsIds()\"\n [availableCards]=\"availableCards()\"\n [open]=\"cardDialogOpen()\"\n (cancelled)=\"closeCardPanel()\"\n (confirm)=\"onCardsEdited($event)\"\n/>\n\n<mfp-discard-changes-dialog\n [open]=\"discardDialogOpen()\"\n (cancelled)=\"cancelDiscard()\"\n (confirm)=\"confirmDiscard()\"\n/>\n\n<mfp-unsaved-changes-dialog\n [open]=\"unsavedNavDialogOpen()\"\n (cancelled)=\"onUnsavedNavCancel()\"\n (discard)=\"onUnsavedNavDiscard()\"\n (save)=\"onUnsavedNavSave()\"\n/>\n","import { Component, ViewEncapsulation, input, output } from '@angular/core';\nimport { Card } from '@fundamental-ngx/ui5-webcomponents/card';\nimport { CardHeader } from '@fundamental-ngx/ui5-webcomponents/card-header';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport '@ui5/webcomponents-icons/dist/AllIcons.js';\n\n@Component({\n selector: 'mfp-visited-service-card',\n imports: [Card, CardHeader, Icon],\n templateUrl: './visited-service-card.component.html',\n styleUrl: './visited-service-card.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class VisitedServiceCard {\n serviceType = input.required<string>();\n serviceName = input.required<string>();\n serviceDescription = input.required<string>();\n serviceIcon = input.required<string>();\n path = input.required<string>();\n\n readonly cardClick = output<string>();\n}\n","<div\n class=\"visited-card-wrapper\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"cardClick.emit(path())\"\n (keydown.enter)=\"cardClick.emit(path())\"\n>\n <span class=\"visited-card__type-badge\">{{ serviceType() }}</span>\n <ui5-card class=\"visited-card\">\n <ui5-card-header\n slot=\"header\"\n [interactive]=\"true\"\n [subtitleText]=\"serviceDescription()\"\n [titleText]=\"serviceName()\"\n >\n <ui5-icon\n class=\"visited-card__icon\"\n slot=\"avatar\"\n [name]=\"serviceIcon()\"\n />\n </ui5-card-header>\n </ui5-card>\n</div>\n","import { Component, ViewEncapsulation } from '@angular/core';\nimport { Button } from '@fundamental-ngx/ui5-webcomponents/button';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n@Component({\n selector: 'mfp-favorites',\n imports: [Button, Icon, Title],\n templateUrl: './favorites.component.html',\n styleUrl: './favorites.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class Favorites {\n readonly items = [\n { label: 'Create Account', icon: 'add', action: 'create-account' },\n { label: 'Start Approval', icon: 'workflow-tasks', action: 'start-approval' },\n { label: 'Add User to Account', icon: 'person-placeholder', action: 'add-user' },\n ];\n}\n","<div class=\"favorites\">\n <ui5-title class=\"favorites__title\" level=\"H5\">Favorites</ui5-title>\n <div class=\"favorites__list\">\n @for (item of items; track item.action) {\n <div class=\"favorites__item\">\n <ui5-icon class=\"favorites__icon\" [name]=\"item.icon\" />\n <span class=\"favorites__label\">{{ item.label }}</span>\n <ui5-button design=\"Transparent\" [icon]=\"item.icon\">{{ item.label }}</ui5-button>\n </div>\n }\n </div>\n</div>\n","import { Component, ViewEncapsulation } from '@angular/core';\nimport { Icon } from '@fundamental-ngx/ui5-webcomponents/icon';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n/** Possible health states for a service. */\nexport type ServiceStatusValue = 'operational' | 'degraded' | 'outage' | 'maintenance';\n\n/** A single service entry displayed in the service-status card. */\nexport interface ServiceStatusItem {\n /** Display name of the service. */\n name: string;\n /** SAP UI5 icon name used as the service icon. */\n icon: string;\n /** Current health status of the service. */\n status: ServiceStatusValue;\n}\n\n@Component({\n selector: 'mfp-service-status-card',\n imports: [Icon, Title],\n templateUrl: './service-status-card.component.html',\n styleUrl: './service-status-card.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ServiceStatusCard {\n readonly services: ServiceStatusItem[] = [\n { name: 'API Gateway', icon: 'connected', status: 'operational' },\n { name: 'Identity Service', icon: 'customer', status: 'operational' },\n { name: 'Database Cluster', icon: 'database', status: 'degraded' },\n { name: 'Message Queue', icon: 'email', status: 'operational' },\n { name: 'Object Storage', icon: 'storage', status: 'maintenance' },\n { name: 'Audit Log', icon: 'log', status: 'outage' },\n ];\n\n readonly statusConfig: Record<ServiceStatusValue, { label: string; icon: string; colorClass: string }> = {\n operational: { label: 'Operational', icon: 'status-positive', colorClass: 'status--operational' },\n degraded: { label: 'Degraded', icon: 'status-critical', colorClass: 'status--degraded' },\n outage: { label: 'Outage', icon: 'status-negative', colorClass: 'status--outage' },\n maintenance: { label: 'Maintenance', icon: 'status-inactive', colorClass: 'status--maintenance' },\n };\n}\n","<div class=\"service-status\">\n <ui5-title class=\"service-status__title\" level=\"H5\">Service Availability</ui5-title>\n <div class=\"service-status__list\">\n @for (service of services; track service.name) {\n <div class=\"service-status__item\">\n <ui5-icon class=\"service-status__icon\" [name]=\"service.icon\" />\n <span class=\"service-status__name\">{{ service.name }}</span>\n <div [class]=\"'service-status__status ' + statusConfig[service.status].colorClass\">\n <ui5-icon class=\"service-status__status-icon\" [name]=\"statusConfig[service.status].icon\" />\n <span class=\"service-status__status-label\">{{ statusConfig[service.status].label }}</span>\n </div>\n </div>\n }\n </div>\n</div>\n","import { Component, ViewEncapsulation } from '@angular/core';\nimport { List } from '@fundamental-ngx/ui5-webcomponents/list';\nimport { ListItemStandard } from '@fundamental-ngx/ui5-webcomponents/list-item-standard';\nimport { Title } from '@fundamental-ngx/ui5-webcomponents/title';\n\n@Component({\n selector: 'mfp-whats-new',\n imports: [List, ListItemStandard, Title],\n templateUrl: './whats-new.component.html',\n styleUrl: './whats-new.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class WhatsNew {\n readonly headlines = [\n {\n title: 'Kubernetes 1.32 Released',\n description: 'Improved scheduling, new APIs and graduated features.',\n icon: 'cloud',\n },\n {\n title: 'Angular 20 Signals Stable',\n description: 'Signal-based reactivity is now production-ready.',\n icon: 'developer-settings',\n },\n {\n title: 'WebAssembly WASI 2.0 Preview',\n description: 'System interface advances bring server-side WASM closer.',\n icon: 'technical-object',\n },\n {\n title: 'OpenTelemetry Hits 1.0',\n description: 'Unified observability standard lands in enterprise stacks.',\n icon: 'monitor-payments',\n },\n {\n title: 'Rust Enters Linux Kernel Mainstream',\n description: 'More subsystems accept Rust driver contributions.',\n icon: 'settings',\n },\n {\n title: 'TypeScript 5.8 Performance Boost',\n description: 'Declaration emit is up to 10x faster in large projects.',\n icon: 'accelerated',\n },\n ];\n}\n","<div class=\"whats-new\">\n <ui5-title class=\"whats-new__title\" level=\"H5\">What's New</ui5-title>\n <ui5-list class=\"whats-new__list\" separators=\"Inner\">\n @for (item of headlines; track item.title) {\n <ui5-li [description]=\"item.description\" [icon]=\"item.icon\">\n {{ item.title }}\n </ui5-li>\n }\n </ui5-list>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,gBAAgB,GAAG,CAAC,KAAa,KAAI;AAChD,IAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AACpB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,KAAK,KAAK,OAAO,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AACzB,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;AAEA,IAAA,OAAO,KAAK;AACd,CAAC;AAIM,MAAM,YAAY,GAAG,CAC1B,IAAmB,EACnB,aAAqB,KACV;AACX,IAAA,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,aAAa,CAAC;IAC1D,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAE5D,IAAA,QAAQ,IAAI,CAAC,EAAE,CAAC,SAAS;AACvB,QAAA,KAAK,QAAQ;YACX,OAAO,kBAAkB,KAAK,oBAAoB;AACpD,QAAA,KAAK,WAAW;YACd,OAAO,kBAAkB,KAAK,oBAAoB;AACpD,QAAA,KAAK,aAAa;YAChB,OAAO,kBAAkB,GAAG,oBAAoB;AAClD,QAAA,KAAK,oBAAoB;YACvB,OAAO,kBAAkB,IAAI,oBAAoB;AACnD,QAAA,KAAK,UAAU;YACb,OAAO,kBAAkB,GAAG,oBAAoB;AAClD,QAAA,KAAK,iBAAiB;YACpB,OAAO,kBAAkB,IAAI,oBAAoB;AACnD,QAAA,KAAK,UAAU;AACb,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;AACrC,gBAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC1D;iBAAO,IACL,OAAO,kBAAkB,KAAK,QAAQ;AACtC,gBAAA,OAAO,oBAAoB,KAAK,QAAQ,EACxC;AACA,gBAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC1D;AAEA,YAAA,OAAO,KAAK;;AAEhB,IAAA,OAAO,KAAK;AACd,CAAC;AAEM,MAAM,gBAAgB,GAAG,CAC9B,KAAa,EACb,KAAiB,KACe;IAChC,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,EAAE;IACX;IAEA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;QAChC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;QACxC,IAAI,MAAM,EAAE;YACV,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QACnC;AACA,QAAA,OAAO,GAAG;IACZ,CAAC,EAAE,EAAE,CAAC;AACR,CAAC;AAEM,MAAM,kBAAkB,GAAG,CAChC,KAAa,EACb,KAAmB,KACT;AACV,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;AACxB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI;IACjD;AACA,IAAA,OAAO,KAAK;AACd,CAAC;;AC9EM,MAAM,0BAA0B,GAAG,CACxC,QAAW,EACX,KAIC,KACC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,QAAQ;IAC3D,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,IAAI,QAAQ,YAAY,KAAK,EAAE;AAC7B,QAAA,OAAO,CAAC,KAAK,CACX,CAAA,8BAAA,EAAiC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA,qEAAA,CAAuE,CACjI;AACD,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;;;;;;;;;IASpD,MAAM,WAAW,GAAG,QAAQ,CAAQ;AAClC,QAAA,IAAI,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAE;AAC5B,QAAA,IAAI,EAAE,QAAkB;AACzB,KAAA,CAAC;AACF,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;AAE7D,IAAA,IAAI,KAAK,IAAI,KAAK,CAAC,aAAa,EAAE;AAChC,QAAA,OAAO,gBAAgB,CACrB,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAC9B,KAAK,CAAC,aAAa,CAAC,SAAS,CAC9B;IACH;AAEA,IAAA,OAAO,KAAK;AACd,CAAC;AAED,MAAM,gBAAgB,GAAG,CACvB,KAAyB,EACzB,SAAsC,KAChB;IACtB,IAAI,KAAK,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM;AAAE,QAAA,OAAO,KAAK;IAEzE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;QACjC,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,OAAO,GAAG;QAE3B,QAAQ,CAAC;AACP,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,GAAG,CAAC,WAAW,EAAE;AAC1B,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,GAAG,CAAC,WAAW,EAAE;YAC1B,KAAK,YAAY,EAAE;AACjB,gBAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBACvB,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG;YACtE;YACA,KAAK,QAAQ,EAAE;AACb,gBAAA,IAAI;AACF,oBAAA,OAAO,YAAY,CAAC,GAAG,CAAC;gBAC1B;AAAE,gBAAA,MAAM;AACN,oBAAA,OAAO,GAAG;gBACZ;YACF;YACA,KAAK,QAAQ,EAAE;AACb,gBAAA,IAAI;AACF,oBAAA,OAAO,YAAY,CAAC,GAAG,CAAC;gBAC1B;AAAE,gBAAA,MAAM;AACN,oBAAA,OAAO,GAAG;gBACZ;YACF;AACA,YAAA;AACE,gBAAA,OAAO,GAAG;;IAEhB,CAAC,EAAE,KAAK,CAAC;AACX,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,GAAW,KAAY;AAClD,IAAA,IAAI;QACF,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAC9C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAC1B,CAAC,IAAI,CAAC,EAAE,CAAC;AACV,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;AAC/C,QAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;IACtD;AACF,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,MAAc,KAAY;AACrD,IAAA,IAAI;AACF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;IACxC;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;AAC/C,QAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;IACnD;AACF,CAAC;;ACzGK,SAAU,aAAa,CAC3B,KAAsB,EACtB,QAAuB,EAAA;IAEvB,IAAI,QAAQ,EAAE;QACZ,OAAO,0BAA0B,CAAI,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;IACtE;IAEA,OAAO,KAAK,CAAC,KAAK;AACpB;;ACZO,MAAM,oBAAoB,GAAG,UAAU;AACvC,MAAM,oBAAoB,GAAG,UAAU;AAEvC,MAAM,kBAAkB,GAAG,QAAQ;AACnC,MAAM,kBAAkB,GAAG,SAAS;;MCqB9B,YAAY,CAAA;AACvB,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAW;AACrC,IAAA,MAAM,GAAG,KAAK,CAAS,oBAAoB,6EAAC;AAC5C,IAAA,UAAU,GAAG,QAAQ,CAAiB,MAAK;AACzC,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,oBAAoB,GAAG,oBAAoB;AACvE,IAAA,CAAC,iFAAC;AACF,IAAA,QAAQ,GAAG,QAAQ,CAAS,MAAK;AAC/B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,kBAAkB,GAAG,kBAAkB;AACnE,IAAA,CAAC,+EAAC;wGARS,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBzB,gGACA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDkBY,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMH,YAAY,EAAA,UAAA,EAAA,CAAA;kBARxB,SAAS;+BACE,mBAAmB,EAAA,OAAA,EACpB,CAAC,IAAI,CAAC,EAAA,eAAA,EAGE,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,gGAAA,EAAA;;;MEZtB,SAAS,CAAA;AACpB,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;AACnC,IAAA,MAAM,GAAG,KAAK,CAAS,iBAAiB,6EAAC;AAElC,IAAA,eAAe,CAAC,KAAY,EAAA;QACjC,KAAK,CAAC,eAAe,EAAE;IACzB;wGANW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXtB,mLAOA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDFY,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMH,SAAS,EAAA,UAAA,EAAA,CAAA;kBARrB,SAAS;+BACE,gBAAgB,EAAA,OAAA,EACjB,CAAC,IAAI,CAAC,EAAA,eAAA,EAGE,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,mLAAA,EAAA;;;MEMtB,WAAW,CAAA;AACtB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;AAChC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,MAAM,GAAG,KAAK,CAAS,cAAc,6EAAC;IACtC,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,kFAAC;wGAJxD,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,8cCfxB,+LAOA,EAAA,MAAA,EAAA,CAAA,oHAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDQa,WAAW,EAAA,UAAA,EAAA,CAAA;kBARvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,WACnB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,WACtC,EAAE,EAAA,QAAA,EAAA,+LAAA,EAAA,MAAA,EAAA,CAAA,oHAAA,CAAA,EAAA;;;MEFA,YAAY,CAAA;AACvB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAY;IACjC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAe;AAClC,IAAA,MAAM,GAAG,KAAK,CAAS,gBAAgB,6EAAC;wGAH7B,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXzB,sSASA,EAAA,MAAA,EAAA,CAAA,4EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDHY,GAAG,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKF,YAAY,EAAA,UAAA,EAAA,CAAA;kBAPxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,WACrB,CAAC,GAAG,CAAC,EAAA,eAAA,EAGG,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sSAAA,EAAA,MAAA,EAAA,CAAA,4EAAA,CAAA,EAAA;;;MEyBpC,aAAa,CAAA;AACxB,IAAA,eAAe,GAAG,KAAK,CAAC,QAAQ,qFAAK;IACrC,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAK;IACZ,WAAW,GAAG,MAAM,EAAoC;AAEjE,IAAA,KAAK,GAAG,QAAQ,CAAC,MACf,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,4EACvD;AAED,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,iFAAC;AAC9D,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,gFAAC;AACxD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,cAAc,qFAAC;AAClE,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,gBAAgB,uFAAC;AACtE,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,kFAAC;IAC5D,QAAQ,GAAG,QAAQ,CAAC,MAClB,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC5D;AACD,IAAA,SAAS,GAAG,QAAQ,CAAC,OAAO;QAC1B,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAC1B,GAAG,IAAI,CAAC,QAAQ,EAAE;AACnB,KAAA,CAAC,gFAAC;IACH,YAAY,GAAG,QAAQ,CACrB,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC5E;AAED,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,SAAS,iFAAC;AAC3D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,iFAAC;AACnE,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,eAAA,EAAkB,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAA,CAAE,6EAAC;AAE5E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,gFAAC;AAC/D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,kFAAC;AAChE,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,2EAAC;AAC5D,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;AACzB,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;AAE3B,IAAA,gBAAgB,CAAC,CAAQ,EAAA;QACvB,CAAC,CAAC,eAAe,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACvC;AAEQ,IAAA,gBAAgB,CAAC,KAAc,EAAA;QACrC,MAAM,eAAe,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE;AACxD,QAAA,IAAI,eAAe,KAAK,MAAM,EAAE;AAC9B,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,eAAe,KAAK,OAAO,EAAE;AAC/B,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,SAAS;IAClB;AAEQ,IAAA,eAAe,CAAC,KAAc,EAAA;QACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AAC9C,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,kBAAkB,CAAC,KAAc,EAAA;AACvC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACnE;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,cAAc,IAAI,GAAG;AACvE,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5E;AACA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,aAAa,CAAC,KAAyB,EAAA;QAC7C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI;AACF,YAAA,IAAI,GAAG,CAAC,KAAK,CAAC;AACd,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEO,IAAA,SAAS,CAAC,KAAY,EAAA;QAC3B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAK;AAC1D,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAC7B,CAAC,EAAE,IAAI,CAAC;AACV,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,aAAa,CAAC,KAAiB,EAAA;QACvC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,KAAK;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE;AAC7B,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,SAAA,CAAC;IACJ;wGApGW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClC1B,2sFAwEA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7CY,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,SAAS,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,8UAAE,YAAY,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAO/D,aAAa,EAAA,UAAA,EAAA,CAAA;kBATzB,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,EAAA,eAAA,EAG1D,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,SAAS,EAAA,OAAA,EACjC,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,2sFAAA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA;;;AErB5B,MAAM,kBAAkB,GAAG,CAChC,MAA8B,KACK;AACnC,IAAA,OAAO,kBAAkB,CAAC,MAAM,CAAC;AACnC,CAAC;AAED,MAAM,kBAAkB,GAAG,CACzB,MAA8B,KACY;IAC1C,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,CAAC,KAA4C;AACjD,QAAA,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE;AAClB,YAAA,OAAO,GAAG;QACZ;AAEA,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI;AACxB,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACb,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;QACf;;QAGA,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,EAAE,GAAG,CAAC;QACzC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAChC,QAAA,OAAO,GAAG;IACZ,CAAC,EACD,EAA4C,CAC7C;AACH,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,MAA8B,KAAqC;AAC7F,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU;AACnC,IAAA,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAC9C,MAAM,MAAM,GAAoC,EAAE;AAElD,IAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACnB,QAAA,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE;AAClB,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACd;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI;AACxB,QAAA,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACtB;QACF;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAElB,QAAA,MAAM,OAAO,GAAkC;AAC7C,YAAA,GAAG,CAAC;AACJ,YAAA,KAAK,EAAE;gBACL,GAAG,CAAC,CAAC,KAAK;AACV,gBAAA,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;AACzB,aAAA;SACF;AAED,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AACtB,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,MAAM;AACf,CAAC;;MC7BY,gBAAgB,CAAA;AAC3B,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAA0B;AAClD,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAO;AACjC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,kFAAC;IAEjC,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACjC,IAAA,eAAe,GAAG,KAAK,CAAS,CAAC,sFAAC;AAClC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,QAAQ,GAAG,KAAK,CAAsB,QAAQ,+EAAC;AAC/C,IAAA,kBAAkB,GAAG,KAAK,CAAS,WAAW,yFAAC;IAC/C,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAEf,WAAW,GAAG,MAAM,EAAoC;IACxD,eAAe,GAAG,MAAM,EAAK;IAC7B,iBAAiB,GAAG,MAAM,EAAQ;IAClC,sBAAsB,GAAG,MAAM,EAAU;AAElD,IAAA,aAAa,GAAG,CAAC,MAA4B,EAAE,KAAa,KAC1D,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK;IAC1C,UAAU,GAAG,CAAC,MAAc,EAAE,IAAO,KACnC,0BAA0B,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;AAClE,QAAA,MAAM;AACR,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,kFAAC;wGAtBrD,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzC7B,41KAgKA,EAAA,MAAA,EAAA,CAAA,ocAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtII,kBAAkB,gOAClB,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,SAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,SAAS,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACT,eAAe,0OACf,cAAc,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,QAAQ,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,aAAa,kIACb,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,YAAY,EAAA,QAAA,EAAA,wCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAMH,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAlB5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB;wBACP,kBAAkB;wBAClB,KAAK;wBACL,SAAS;wBACT,eAAe;wBACf,cAAc;wBACd,QAAQ;wBACR,aAAa;wBACb,MAAM;wBACN,MAAM;wBACN,YAAY;qBACb,EAAA,aAAA,EAGc,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,41KAAA,EAAA,MAAA,EAAA,CAAA,ocAAA,CAAA,EAAA;;;SEvC5B,iBAAiB,CAC/B,MAAS,EACT,IAAY,EACZ,KAAc,EAAA;AAEd,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAChD,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,MAAM;IACf;IAEA,IAAI,OAAO,GAA4B,MAAM;AAE7C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AAC3C,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;YACpB;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;AAE7B,QAAA,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAC/E,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;QACnB;AAEA,QAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAA4B;IACnD;AAEA,IAAA,OAAO,MAAM;AACf;;ACXA;;;;;;;;;AASG;MAcU,mBAAmB,CAAA;AACrB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAyB;AAChD,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;AAEhC,IAAA,cAAc,GAAG,KAAK,CAA4B,EAAE,qFAAC;IACrD,WAAW,GAAG,MAAM,EAA6B;AAEvC,IAAA,OAAO,GAAG,YAAY,CAA4B,MAAM;AACzE,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;AACjC,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEiB,IAAA,aAAa,GAAG,YAAY,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EAI7C,MAAM,EAAE,IAAI,CAAC,cAAc;AAC3B,QAAA,WAAW,EAAE,MAAM,IAAI,GACvB;IAEF,UAAU,CAAC,KAA8B,EAAE,KAAa,EAAA;QACtD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAClE,gBAAA,OAAO,CAAA,EAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAA,EAAA,EAAK,MAAM,CAAC,GAAG,CAAC,EAAE;YACvD;QACF;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,MAAM;AAC5C,QAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,GAAG,CAAC,EAAE;IACjC;AAEA,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IACvE;IAEA,GAAG,GAAA;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACvC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AACzD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAY;AACpD,QAAA,IAAI,aAAa,KAAK,KAAK,EAAE;AAC3B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B;aAAO,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,GAAG,KAAK,EAAE;;YAE1D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;QAC3C;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;IAEA,kBAAkB,CAAC,KAAa,EAAE,KAA8B,EAAA;AAC9D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KACvC,CAAC,KAAK,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CACnC;AACD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;wGA5DW,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,8gBCzChC,gsDAsDA,EAAA,MAAA,EAAA,CAAA,qhCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MDnBY,MAAM,CAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAE,IAAI,yMAAmB,eAAe,CAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,eAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAM7C,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAb/B,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EAKP,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC,EAAA,eAAA,EAGzC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,gsDAAA,EAAA,MAAA,EAAA,CAAA,qhCAAA,CAAA,EAAA;;;MEI/B,eAAe,CAAA;AACjB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAyB;AAChD,IAAA,aAAa,GAAG,KAAK,CAAI,EAAO,oFAAC;AACjC,IAAA,WAAW,GAAG,KAAK,CAAkB,EAAE,kFAAC;IAExC,WAAW,GAAG,MAAM,EAAwB;IAC5C,UAAU,GAAG,MAAM,EAAK;IACxB,eAAe,GAAG,MAAM,EAA2B;AAEnD,IAAA,IAAI;AAEM,IAAA,eAAe,GAAG,MAAM,CAEzC,EAAE,sFAAC;AAEY,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AAEzC,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAE7B,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AACrC,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7C,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,CAAC,aAAa,EAAE;AAEpB,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,gBAAA,IAAI,KAAK,CAAC,UAAU,EAAE;AACpB,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;wBACpB,aAAa,EAAE,KAAK,CAAC,IAAI;AACzB,wBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE;AACnD,qBAAA,CAAC;gBACJ;YACF;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,mBAAmB,CAAC,MAAa,EAAE,KAA0B,EAAA;AAC3D,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAGD;AAErB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9C,QAAA,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B,OAAO,CAAC,aAAa,EAAE;QACvB,OAAO,CAAC,WAAW,EAAE;QAErB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAgC,CAAC;AAErE,QAAA,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE;AACnC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACpB,aAAa,EAAE,KAAK,CAAC,IAAI;gBACzB,KAAK,EAAE,OAAO,CAAC,KAAK;AACrB,aAAA,CAAC;QACJ;IACF;IAEA,uBAAuB,CACrB,KAA0B,EAC1B,OAAkC,EAAA;AAElC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAA0B;AACrE,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,OAAO,KAAK,CAAC,MAAM;AAAE,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC;QACA,KAAK,CAAC,WAAW,EAAE;QACnB,KAAK,CAAC,aAAa,EAAE;AAErB,QAAA,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE;AACpE,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACpB,aAAa,EAAE,KAAK,CAAC,IAAI;AACzB,gBAAA,KAAK,EAAE,OAAO;AACf,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC;AAEtC,QAAA,OAAO,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,IAAI;IACnE;AAEA,IAAA,aAAa,CAAC,IAAY,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,GAAG,MAAM;IAClD;AAEA,IAAA,WAAW,CAAC,KAA0B,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE;AAE/C,QAAA,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACpB,aAAa,EAAE,KAAK,CAAC,IAAI;AACzB,gBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK;AAC7C,aAAA,CAAC;QACJ;IACF;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC/C;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;IACnB;AAEA,IAAA,iBAAiB,CAAC,KAA0B,EAAA;QAC1C,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;IACjD;AAEQ,IAAA,eAAe,CAAC,MAA6B,EAAA;AACnD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ;AAC3C,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;AAEjE,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;YACpD,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,EAAE,MAAM;AAC1D,YAAA,MAAM,oBAAoB,GAAG,eAAe,YAAY,SAAS;AACjE,YAAA,IAAI,eAAe,IAAI,eAAe,KAAK,oBAAoB,EAAE;gBAC/D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;YACrC;iBAAO,IAAI,eAAe,EAAE;gBAC1B,eAAe,CAAC,eAAe,EAAE;gBACjC,eAAe,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC5D;YACF;YAEA,IAAI,eAAe,EAAE;AACnB,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrD;iBAAO;AACL,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;YACvD;QACF;QAEA,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;YACvD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;AACpC,gBAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;YACtC;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxD;AAEQ,IAAA,gBAAgB,CAAC,aAAmC,EAAA;QAC1D,IAAI,CAAC,aAAa,EAAE;YAClB;QACF;QAEA,MAAM,KAAK,GAA8C,EAAE;QAC3D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,MAAM;gBAAE;YACvC,MAAM,GAAG,GAAI,aAAyC,CAAC,KAAK,CAAC,IAAI,CAAC;AAClE,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG;AAC/B,kBAAG;kBACD,EAAE;AAEN,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAA0B;YACrE,IAAI,KAAK,EAAE;gBACT,OAAO,KAAK,CAAC,MAAM;AAAE,oBAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,gBAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;oBAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBACzC;YACF;AACA,YAAA,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO;QAC7B;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAE/B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxD;IAEQ,gBAAgB,GAAA;QACtB,MAAM,MAAM,GAAG,EAAO;AAEtB,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AACvC,YAAA,IAAI,KAAK,GAAY,OAAO,CAAC,KAAK;AAClC,YAAA,IAAI,OAAO,YAAY,SAAS,EAAE;gBAChC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAC1B,CAAC,KAAK,KAAM,KAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,CAC/D;YACH;AACA,YAAA,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;QACvC;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,eAAe,CAAC,KAA8B,EAAA;AACpD,QAAA,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AACnB,YAAA,KAAK,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC;AAC9B,SAAA,CAAC;IACJ;wGA1MW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3C5B,msFAyEA,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzCI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,WAAA,EAAA,UAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,MAAM,kKACN,mBAAmB,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAMV,eAAe,EAAA,UAAA,EAAA,CAAA;kBAd3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EACvB;wBACP,mBAAmB;wBACnB,KAAK;wBACL,KAAK;wBACL,MAAM;wBACN,MAAM;wBACN,mBAAmB;qBACpB,EAAA,aAAA,EAGc,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,msFAAA,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA;;;AErB5C;;;;;;;;;;;;;;;;;;AAkBG;MAUU,UAAU,CAAA;AACrB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAA2B;IACvC,UAAU,GAAG,MAAM,EAAqC;AAEvD,IAAA,SAAS,GAAG,MAAM,CAAoC,SAAS,gFAAC;AAChE,IAAA,QAAQ,GAAG,SAAS,CAA6B,OAAO,+EAAC;AACzD,IAAA,aAAa,GAAG,MAAM,CAAC,KAAK,oFAAC;AAC7B,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAEvB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACpC,IAAA,cAAc;AAEtB,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YACxB,eAAe,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,EAAE;gBACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,eAAe,CACb,MAAK;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AACzC,YAAA,IAAI,CAAC,EAAE;gBAAE;AACT,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MACvC,IAAI,CAAC,oBAAoB,EAAE,CAC5B;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,EAAE;QAC7B,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;IACH;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE;IACnC;AAEA;;;;AAIG;IACO,oBAAoB,GAAA;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;QACzC,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B;QACF;QACA,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE;;QAEnD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;IACrE;IAEU,QAAQ,GAAA;QAChB,IAAI,CAAC,oBAAoB,EAAE;IAC7B;AAEA;;;AAGG;AACO,IAAA,MAAM,CAAC,SAA2B,EAAA;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AACzC,QAAA,IAAI,CAAC,EAAE;YAAE;QACT,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,GAAG,GAAG,IAAI,SAAS,KAAK,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,QAAA,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClD;AAEU,IAAA,MAAM,CAAC,GAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B;wGA5EW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChDvB,+kCAyCA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDCY,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAMH,UAAU,EAAA,UAAA,EAAA,CAAA;kBATtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,IAAI,CAAC,EAAA,eAAA,EAGE,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,+kCAAA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA;gPAOiB,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEMvD,oBAAoB,CAAA;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAO;AAEjC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAmB;AAC1C,IAAA,eAAe,GAAG,KAAK,CAAqB,EAAE,sFAAC;AAC/C,IAAA,aAAa,GAAG,KAAK,CAAqB,EAAE,oFAAC;IAEpC,iBAAiB,GAAG,MAAM,EAAoC;IAC9D,eAAe,GAAG,MAAM,EAAK;IAC7B,iBAAiB,GAAG,MAAM,EAAQ;IAClC,sBAAsB,GAAG,MAAM,EAAU;IAEzC,aAAa,GAAG,MAAM,EAAU;IAChC,iBAAiB,GAAG,MAAM,EAAwB;IAClD,eAAe,GAAG,MAAM,EAG7B;IACK,YAAY,GAAG,MAAM,EAAK;IAC1B,UAAU,GAAG,MAAM,EAGxB;IACK,YAAY,GAAG,MAAM,EAAK;IAC1B,gBAAgB,GAAG,MAAM,EAAqC;AAE7D,IAAA,WAAW,GAAG,MAAM,CAAc,WAAW,kFAAC;AAC9C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,qFAAC;AACnE,IAAA,gBAAgB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,uFAC1C;AACS,IAAA,aAAa,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC;AACnC,IAAA,cAAc,GAAG,SAAS,CAAQ,aAAa,qFAAC;AAEhD,IAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,uFAAC;AAChC,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAC9B,IAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,uFAAC;AAEhC,IAAA,eAAe,GAAG,MAAM,CAAW,IAAI,sFAAC;AAExC,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,kFAAC;AACvD,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,6EAAC;AAC7C,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,oFAAC;AAC3D,IAAA,gBAAgB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,wBAAwB,uFAC7C;AACS,IAAA,cAAc,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,sBAAsB,qFAC3C;AACS,IAAA,wBAAwB,GAAG,QAAQ,CAC3C,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,gCAAgC,+FACrD;AACS,IAAA,kBAAkB,GAAG,QAAQ,CACrC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,YAAY,yFACjD;AACS,IAAA,kBAAkB,GAAG,QAAQ,CACrC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,YAAY,yFACjD;IACS,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC1D,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACzC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;AAC9C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE;AACxC,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE;AACnC,YAAA,OAAO,EAAE;QACX;QAEA,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC;AACpE,IAAA,CAAC,uFAAC;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,YAAY,mFAAC;AACzD,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,0FAAC;AAE3D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU;QAC5C,IAAI,CAAC,IAAI,EAAE,MAAM;AAAE,YAAA,OAAO,EAAE;QAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAClD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CACpE;AACD,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QAEzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAClB,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC;cACvD,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI;cACvB,GAAG,CAAC;kBACF,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK;kBACxB,GAAG,CACV;AACH,IAAA,CAAC,iFAAC;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,oFAAC;AAErD,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE5C,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,aAAa,CAAC;aAChB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,kBAAkB,EAAE;AAC5C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AACtC,QAAA,CAAC,CAAC;AAEJ,QAAA,YAAY,CAAC,IAAI,CAAC,YAAY;aAC3B,IAAI,CACH,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,aAAa,CAAC,EACtC,MAAM,CAAC,CAAC,OAAO,KAAwB,CAAC,CAAC,OAAO,CAAC,EACjD,kBAAkB,EAAE;AAErB,aAAA,SAAS,CAAC,CAAC,OAAO,KAAI;AACrB,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC1D,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,QAAA,CAAC,CAAC;IACN;AAEU,IAAA,kBAAkB,CAAC,GAAsC,EAAA;AACjE,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACjC;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE;YACrC,IAAI,CAAC,cAAc,EAAE;QACvB;AAAO,aAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;YAChC,eAAe,CACb,MAAK;gBACH,IAAI,CAAC,cAAc,EAAE,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE;YACzD,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;QACH;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YAC7B,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;AACjC,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACvD;IACF;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;IACpC;AAEA,IAAA,aAAa,CAAC,KAAuC,EAAA;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM;QAC7D,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;YACvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AACxC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B;QACF;QACA,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE;YACzC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AACxC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;YAC/B;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;AAEA,IAAA,mBAAmB,CAAC,KAA2B,EAAA;AAC7C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC;AAEA,IAAA,iBAAiB,CAAC,KAA2B,EAAA;AAC3C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;QAEvC,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;QACjE;IACF;AAEA,IAAA,cAAc,CAAC,KAAQ,EAAA;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,YAAY,CAAC,KAA8B,EAAA;AACzC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;QAEvC,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC3C;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;IAChD;AAEU,IAAA,SAAS,CAAC,KAAyB,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW;QAChC,OAAO,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC;IAC/D;IAEQ,gBAAgB,GAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM;QACtC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,cAAc;AACnD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE;AACxC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,EAAE;QACpD,MAAM,OAAO,GAA2B,EAAE;QAE1C,IAAI,UAAU,EAAE;YACd,OAAO,CAAC,IAAI,CAAC;AACX,gBAAA,QAAQ,EAAE,iBAAiB;AAC3B,gBAAA,UAAU,EAAE;AACV,oBAAA,SAAS,EAAE,QAAQ;AACnB,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,cAAc,EAAE;AACd,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,MAAM,EAAE,aAAa;AACrB,wBAAA,MAAM,EAAE,MAAM;AACd,wBAAA,OAAO,EAAE,MAAM;wBACf,GAAG,cAAc,EAAE,UAAU;AAC9B,qBAAA;AACF,iBAAA;AACD,gBAAA,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;AACxD,aAAA,CAAC;QACJ;QAEA,IAAI,YAAY,EAAE;YAChB,OAAO,CAAC,IAAI,CAAC;AACX,gBAAA,QAAQ,EAAE,mBAAmB;AAC7B,gBAAA,UAAU,EAAE;AACV,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,SAAS,EAAE,QAAQ;AACnB,oBAAA,cAAc,EAAE;AACd,wBAAA,IAAI,EAAE,SAAS;AACf,wBAAA,MAAM,EAAE,aAAa;AACrB,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,OAAO,EAAE,QAAQ;wBACjB,GAAG,cAAc,EAAE,YAAY;AAChC,qBAAA;AACF,iBAAA;AACD,gBAAA,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;AACxD,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B;IAEQ,kBAAkB,CACxB,MAA6B,EAC7B,QAAY,EAAA;AAEZ,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;QAExB,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,KAAK,KAAI;AACb,YAAA,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AAClC,gBAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBACb,0BAA0B,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AAC9D,wBAAA,EAAE;YACN;AACA,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAA6B,CAC9B;IACH;wGAtRW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,+pCC3DjC,+zMAmLA,EAAA,MAAA,EAAA,CAAA,k+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxII,gBAAgB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,eAAe,gLACf,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,MAAM,6ZACN,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,IAAI,oLACJ,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAQI,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAnBhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAAA,OAAA,EAC7B;wBACP,gBAAgB;wBAChB,eAAe;wBACf,UAAU;wBACV,mBAAmB;wBACnB,MAAM;wBACN,KAAK;wBACL,MAAM;wBACN,IAAI;wBACJ,KAAK;qBACN,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,SAAS,EAAA,OAAA,EACjC,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,+zMAAA,EAAA,MAAA,EAAA,CAAA,k+CAAA,CAAA,EAAA;6tCAkCW,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEtFpD,MAAM,mBAAmB,GAAG;AACjC,IAAA,eAAe,EAAE,gBAAgB;AACjC,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,SAAS,EAAE,UAAU;AACrB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,eAAe,EAAE,gBAAgB;AACjC,IAAA,oBAAoB,EAAE,oBAAoB;AAC1C,IAAA,gBAAgB,EAAE,gBAAgB;AAClC,IAAA,kBAAkB,EAAE,kBAAkB;AACtC,IAAA,cAAc,EAAE,eAAe;AAC/B,IAAA,WAAW,EAAE,YAAY;AACzB,IAAA,SAAS,EAAE,WAAW;CACd;AAKH,MAAM,sBAAsB,GAG/B;IACF,EAAE;IACF,EAAE;CACH;;ACxBD;;;;;;;AAOG;MAEU,oBAAoB,CAAA;AACtB,IAAA,QAAQ,GAAG,MAAM,CAAoB,IAAI,+EAAC;AAEnD,IAAA,cAAc,CAAC,GAAqB,EAAA;AAClC,QAAA,OAAO,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;IAC5D;wGALW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACVM,MAAM,UAAU,GAAG;AACxB,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,MAAM,EAAE,QAAQ;;;ACMlB,MAAM,wBAAwB,GAAG,uBAAuB;AAExD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAGlC;AAEG,SAAU,sBAAsB,CAAC,cAA+B,EAAA;AACpE,IAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,QAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,aAAa,CAAC;QAElD,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,KAAK,CACb,CAAA,qCAAA,EAAwC,WAAW,CAAC,aAAa,CAAC,CAAA,8BAAA,CAAgC,CACnG;QACH;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CACb,CAAA,qCAAA,EAAwC,MAAM,CAAC,QAAQ,CAAA,yCAAA,CAA2C,CACnG;QACH;QAEA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;QAClE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAEpD,IAAI,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,aAAa,EAAE;AACxD,YAAA,MAAM,IAAI,KAAK,CACb,iDAAiD,QAAQ,CAAA,wBAAA,CAA0B,CACpF;QACH;AAEA,QAAA,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE;YAClC,aAAa;YACb,QAAQ;AACR,YAAA,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;AACtC,SAAA,CAAC;IACJ;AACF;AAEM,SAAU,mCAAmC,CACjD,QAAgB,EAAA;AAEhB,IAAA,OAAO,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5C;SAEgB,0BAA0B,GAAA;IACxC,qBAAqB,CAAC,KAAK,EAAE;AAC/B;AAEM,SAAU,gCAAgC,CAC9C,QAAgB,EAChB,SAAiB,EAAA;IAEjB,IAAI,CAAC,SAAS,EAAE;QAAE;IAElB,OAAO,CAAC,IAAI,CACV,CAAA,gBAAA,EAAmB,QAAQ,CAAA,iCAAA,EAAoC,SAAS,CAAA,EAAA,CAAI,CAC7E;AACH;AAEA,SAAS,cAAc,CACrB,MAGG,EAAA;AAEH,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAE1C,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC;QACpD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;IAClD;AAEA,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,iBAAiB,CACxB,QAAgB,EAChB,aAA4B,EAAA;AAE5B,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE;IAElC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC9C,QAAA,MAAM,IAAI,KAAK,CACb,CAAA,qCAAA,EAAwC,WAAW,CAAC,aAAa,CAAC,CAAA,gDAAA,EAAmD,QAAQ,CAAA,EAAA,CAAI,CAClI;IACH;AAEA,IAAA,OAAO,UAAU;AACnB;AAEA,SAAS,WAAW,CAAC,aAA4B,EAAA;AAC/C,IAAA,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,oBAAoB;AACtE;;SCrGgB,gBAAgB,CAC9B,GAAa,EACb,WAA6B,EAC7B,SAAkC,EAAA;IAElC,MAAM,mBAAmB,GAAG,mCAAmC,CAC7D,GAAG,CAAC,SAAS,CACd;IAED,IAAI,CAAC,mBAAmB,EAAE;QACxB,OAAO,CAAC,IAAI,CACV,CAAA,mCAAA,EAAsC,GAAG,CAAC,SAAS,CAAA,mBAAA,CAAqB,CACzE;QACD;IACF;IAEA,MAAM,YAAY,GAAG,WAAW,CAAC,eAAe,CAC9C,mBAAmB,CAAC,aAAa,CAClC;AAED,IAAA,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE;QAC1E,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAE9D,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,gCAAgC,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;YAC1D;QACF;AAEA,QAAA,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;IAC5C;AAEA,IAAA,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE;IAE9C,SAAS,CAAC,MAAK;QACb,WAAW,CAAC,KAAK,EAAE;AACrB,IAAA,CAAC,CAAC;AACJ;;SC5BgB,YAAY,CAC1B,GAAa,EACb,SAA2B,EAC3B,SAAkC,EAAA;AAElC,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa;IAE5C,IAAI,YAAY,GAA+B,IAAI;IACnD,IAAI,WAAW,GAAG,KAAK;IACvB,MAAM,UAAU,GACd,MACD,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO;IAElB,IAAI,UAAU,EAAE;QACd,UAAU,CAAC,CAAC,gCAAgC,CAAC,EAAE,CAAC,kBAAkB,KAAI;AACpE,YAAA,IAAI,WAAW;gBAAE;AAEjB,YAAA,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC;gBACvC,IAAI,EAAE,GAAG,CAAC,SAAS;AACnB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,QAAQ,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE;AACpC,aAAA,CAAC;AAEF,YAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,YAAY,GAAG,SAAS;AAC1B,QAAA,CAAC,CAAC;IACJ;SAAO;AACL,QAAA,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC;IACzE;IAEA,SAAS,CAAC,MAAK;QACb,WAAW,GAAG,IAAI;QAClB,YAAY,EAAE,OAAO,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACrB,IAAA,CAAC,CAAC;AACJ;;AC5CM,SAAU,WAAW,CACzB,GAAa,EACb,SAA2B,EAC3B,SAAkC,EAClC,QAAmB,EAAA;AAEnB,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AAErD,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE;QACpE,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC;IAC3C;AAEA,IAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC;IAEnC,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACrB,IAAA,CAAC,CAAC;AACJ;;MCKa,aAAa,CAAA;AACxB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAc;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;IACvB,UAAU,GAAG,MAAM,EAAQ;AACjB,IAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACnC,QAAQ,GAAG,mBAAmB;AAC9B,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACjC,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC;AACnD,IAAA,CAAC,iFAAC;AACiB,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG;AACnC,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC;AACpD,IAAA,CAAC,8EAAC;IAEM,IAAI,GAAG,SAAS,CAAC,aAAa,4EAAI,IAAI,EAAE,gBAAgB,EAAA,CAAG;AAC3D,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAEnB,IAAA,QAAQ,GAAG,QAAQ,CAClC,MAAK;AACH,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;QACrB,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,eAAe,EAAE,CAAC,CAAC,eAAe;SACnC;AACH,IAAA,CAAC,gFAEC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KACV,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;AACjB,YAAA,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;AAC3B,YAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAE5E;AAED,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACnB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS;gBAAE;YAElC,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE;AAEzC,YAAA,QAAQ,QAAQ,CAAC,IAAI;gBACnB,KAAK,UAAU,CAAC,MAAM;AACpB,oBAAA,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC;oBACvC;gBACF,KAAK,UAAU,CAAC,OAAO;AACrB,oBAAA,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC;oBAC3C;gBACF,KAAK,UAAU,CAAC,EAAE;AAClB,gBAAA;oBACE,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACrD;;AAEN,QAAA,CAAC,CAAC;IACJ;IAEQ,eAAe,CAAC,KAAyB,EAAE,IAAY,EAAA;AAC7D,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE;QACvB;AAEA,QAAA,OAAO,GAAG,KAAK,GAAG,CAAC,CAAA,QAAA,EAAW,IAAI,EAAE;IACtC;wGAjEW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,oiBAewB,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7ClE,mvCAyCA,EAAA,MAAA,EAAA,CAAA,m2DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpBY,MAAM,8UAAE,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FASX,aAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAA,aAAA,EAGR,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,qBAAqB,EAAE,cAAc;AACrC,wBAAA,kBAAkB,EAAE,WAAW;AAChC,qBAAA,EAAA,QAAA,EAAA,mvCAAA,EAAA,MAAA,EAAA,CAAA,m2DAAA,CAAA,EAAA;AAiBwB,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,aAAa,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AElBpE;AACO,MAAM,qBAAqB,GAA4F;IAC5H,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;IACrC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;IACrC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;IACpC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;CACxB;;ACjCH,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,WAAW,GAAG,EAAE;;ACM7B;;;;AAIG;MAQU,oBAAoB,CAAA;AACZ,IAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACnC,QAAQ,GAAG,mBAAmB;AAEjD,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;IAEnB,OAAO,GAAG,MAAM,EAAQ;IACxB,SAAS,GAAG,MAAM,EAAQ;wGAPxB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,gRCnBjC,22BAYA,EAAA,MAAA,EAAA,CAAA,oSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDEY,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,6ZAAE,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAKpB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,4BAA4B,EAAA,OAAA,EAC7B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAA,aAAA,EAGjB,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,22BAAA,EAAA,MAAA,EAAA,CAAA,oSAAA,CAAA,EAAA;;;MES/B,eAAe,CAAA;AACT,IAAA,IAAI,GAAG,MAAM,EAAC,UAAuB,EAAC;AACpC,IAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACnC,QAAQ,GAAG,mBAAmB;AAEjD,IAAA,cAAc,GAAG,KAAK,CAAe,EAAE,qFAAC;AACxC,IAAA,aAAa,GAAG,KAAK,CAAc,IAAI,GAAG,EAAE,oFAAC;AAC7C,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;IAEnB,OAAO,GAAG,MAAM,EAA8C;IAC9D,SAAS,GAAG,MAAM,EAAQ;AAEnC,IAAA,WAAW,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,kFAAC;AAE5C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;gBACf,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,IAAI,CAAC,cAAc;AAChB,qBAAA,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;qBAC9C,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACtB;AACD,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;YAC/B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,CAAC,EAAU,EAAA;QACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAC9B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAChB,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACd;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;AAMG;IACH,eAAe,CAAC,KAAoB,EAAE,GAAW,EAAA;AAC/C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;YACvB;QACF;AACA,QAAA,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa;AAC/D,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CACnB;AAClB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CACnB;QAClB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,aAA4B,CAAC;AACzE,QAAA,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;YACvB;QACF;AACA,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;YACvC,IAAI,IAAI,EAAE;gBACR,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;gBACvB,IAAI,CAAC,KAAK,EAAE;YACd;;;YAGA;QACF;QACA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,KAAK,EAAE;YACZ;QACF;;AAEA,QAAA,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;IACrB;IAEA,WAAW,GAAA;QACT,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CACxC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAC1E;AACD,QAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,CAC9C,CAAC,EAAE,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAC5D;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACvC;wGA7FW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1B5B,m1DAmCA,EAAA,MAAA,EAAA,CAAA,ukBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDdY,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,OAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,yBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,qQAAE,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAKlD,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,WACxB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,EAAA,aAAA,EAG/C,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,m1DAAA,EAAA,MAAA,EAAA,CAAA,ukBAAA,CAAA,EAAA;;;MEG/B,gBAAgB,CAAA;AAC3B,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAAiB;AACzC,IAAA,KAAK,GAAG,KAAK,CAAe,EAAE,4EAAC;AAC/B;;;;;;;AAOG;AACH,IAAA,OAAO,GAAG,KAAK,CAAqB,SAAS,8EAAC;AAC9C,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AACb,IAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACnC,QAAQ,GAAG,mBAAmB;IACxC,aAAa,GAAG,MAAM,EAAQ;IAC9B,UAAU,GAAG,MAAM,EAAU;wGAhB3B,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,mBAAA,EAAA,wFAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3B7B,2nCAkCA,EAAA,MAAA,EAAA,CAAA,kkDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1BY,aAAa,sHAAE,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAmBpB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBArB5B,SAAS;+BACE,uBAAuB,EAAA,OAAA,EACxB,CAAC,aAAa,EAAE,MAAM,CAAC,EAAA,aAAA,EAGjB,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;;;;;;;;;;;AAWJ,wBAAA,qBAAqB,EACnB,oFAAoF;AACvF,qBAAA,EAAA,QAAA,EAAA,2nCAAA,EAAA,MAAA,EAAA,CAAA,kkDAAA,CAAA,EAAA;;;AElBH;;;;;;;;;AASG;MAQU,oBAAoB,CAAA;AACZ,IAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACnC,QAAQ,GAAG,mBAAmB;AAEjD,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;IAEnB,IAAI,GAAG,MAAM,EAAQ;IACrB,OAAO,GAAG,MAAM,EAAQ;IACxB,SAAS,GAAG,MAAM,EAAQ;wGARxB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,8RCxBjC,ghCAaA,EAAA,MAAA,EAAA,CAAA,oTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDMY,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,6ZAAE,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAKpB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,4BAA4B,EAAA,OAAA,EAC7B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAA,aAAA,EAGjB,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,ghCAAA,EAAA,MAAA,EAAA,CAAA,oTAAA,CAAA,EAAA;;;AEgC5C,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,6BAA6B,CAAC;MA8B7C,SAAS,CAAA;IACpB,OAAO,yBAAyB,CAAC,cAA+B,EAAA;QAC9D,sBAAsB,CAAC,cAAc,CAAC;IACxC;AAEA,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAmB;AAC1C,IAAA,QAAQ,GAAG,KAAK,CAAkB,EAAE,+EAAC;AACrC,IAAA,KAAK,GAAG,KAAK,CAAe,EAAE,4EAAC;AAC/B,IAAA,cAAc,GAAG,KAAK,CAAe,EAAE,qFAAC;AACxC,IAAA,QAAQ,GAAG,KAAK,CAAoB,IAAI,+EAAC;IAEhC,KAAK,GAAG,MAAM,EAAsD;IACpE,iBAAiB,GAAG,MAAM,EAG/B;IACK,oBAAoB,GAAG,MAAM,EAAW;AAEjD,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAC9B,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,sFAAC;;AAGvB,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;AAEvB,IAAA,qBAAqB,GAAG,MAAM,CAAgB,IAAI,4FAAC;;IAGrD,oBAAoB,GAAG,EAAE;IACzB,iBAAiB,GAAG,EAAE;AAE9B;;;;AAIG;AACH,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,KAAK;QAClC,IAAI,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,IAAI;AACjC,QAAA,QACE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,oBAAoB;AAC7D,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,iBAAiB;AAE3D,IAAA,CAAC,wFAAC;IAEM,gBAAgB,GAAoB,EAAE;IACtC,aAAa,GAAiB,EAAE;AAChC,IAAA,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAqB,MAAM,CAAC;AAC/D,IAAA,UAAU,GAAG,SAAS,CAAS,cAAc,iFAAC;AAC9C,IAAA,cAAc;AACL,IAAA,MAAM,GAAG,MAAM,EAAC,UAAuB,EAAC;AACxC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAC9B,IAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACnC,QAAQ,GAAG,mBAAmB;AAEvC,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAe;QAC5C,MAAM,KAAK,GACT,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;QAC1E,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACtD,IAAA,CAAC,gFAAC;AAEQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAsB;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW;AACtC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;AAEtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACtD,IAAA,CAAC,sFAAC;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAC9B,OAAyB;AACvB,QAAA,UAAU,EAAE,WAAW;AACvB,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;AAC/B,QAAA,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,YAAY,EAAE,CAAC;AACf,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,WAAW,EAAE,CAAC;AACd,QAAA,UAAU,EAAE;;;AAGV,YAAA,WAAW,EAAE,CAAC,GAAG,qBAAqB,CAAC;AACxC,SAAA;AACF,KAAA,CAAC,kFACH;AAED,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAC9B,IAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,wFAAC;AACjC,IAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,2FAAC;;IAE5B,iBAAiB,GAAwB,IAAI;;AAEpC,IAAA,mBAAmB,GAAG,CAAC,KAAwB,KAAU;AACxE,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC5B,KAAK,CAAC,cAAc,EAAE;;;AAGtB,YAAA,KAAK,CAAC,WAAW,GAAG,EAAE;QACxB;AACF,IAAA,CAAC;AACD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,IAAI,EAAE,oFAAC;IACjE,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEtE,IAAA,cAAc,GAAG,QAAQ,CAAC,OAAO;AAC/B,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,MAAM,EAAE,aAAsB;QAC9B,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,SAAS,CAAC;AAChE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,cAAc;AACjD,KAAA,CAAC,qFAAC;AAEH,IAAA,eAAe,GAAG,QAAQ,CAAC,OAAO;AAChC,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,MAAM,EAAE,SAAkB;AAC1B,QAAA,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,UAAU,CAAC;AAC9D,QAAA,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,eAAe;AAClD,KAAA,CAAC,sFAAC;AAEH,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;QACxB,OAAO,CAAC,SAAiB,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;AAC5E,IAAA,CAAC,mFAAC;AAEF,IAAA,aAAa,GAAG,IAAI,GAAG,EAGpB;IACH,UAAU,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAEjE,iBAAiB,GAAoB,EAAE;AAE/C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1D,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzC,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,kBAAkB;AAC5C,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,YAAA,IAAI,CAAC,GAAG;gBAAE;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,YAAA,GAAG,CAAC,MAAM,GAAG,MAAK;gBAChB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC;AACnD,YAAA,CAAC;AACD,YAAA,GAAG,CAAC,GAAG,GAAG,GAAG;YACb,SAAS,CAAC,MAAK;AACb,gBAAA,GAAG,CAAC,MAAM,GAAG,IAAI;AACnB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACnD,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC;YAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,GAAG,kBAAkB,CAAC;AACrD,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QACtD,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC;IACnE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE;QACjC,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC;IACtE;IAEA,eAAe,CAAC,QAAgB,EAAE,KAAY,EAAA;AAC5C,QAAA,IAAI,QAAQ,KAAK,WAAW,EAAE;YAC5B,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;QACtE,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAmB,EAAE,MAAM,EAAE,CAAC;QACrE;IACF;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,oBAAoB,EAAE;QAE3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC3D,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,eAAe,CACb,MAAK;YACH,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE;QACpC,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;IACH;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,oBAAoB,EAAE;AAE3B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACxC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO;AACL,gBAAA,GAAG,CAAC;gBACJ,CAAC,EAAE,GAAG,EAAE,CAAC;gBACT,CAAC,EAAE,GAAG,EAAE,CAAC;AACT,gBAAA,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAChB,gBAAA,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;aACjB;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAExB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACd,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,KAAK,EAAE,UAAU;AAClB,SAAA,CAAC;IACJ;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC;QACF;QACA,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;IACnC;AAEA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACH,IAAA,iBAAiB,CAAC,OAAmB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC7B,YAAA,OAAO,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,CAAC,iBAAiB,GAAG,OAAO;AAChC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,OAAO,KAAK;IACd;;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE;QACf,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;IAGA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;IAC/B;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,OAAO,IAAI;IACb;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC3B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,YAAA,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;QACvC,CAAC,CAAC,CACH;AACD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;AAEA,IAAA,aAAa,CAAC,EAAU,EAAA;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;IACrE;AAEA,IAAA,UAAU,CAAC,EAAU,EAAA;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5D,IAAI,YAAY,EAAE;YAChB,eAAe,CACb,MAAK;AACH,gBAAA,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;YACvD,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;QACH;IACF;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC;AAEA,IAAA,aAAa,CAAC,KAAiD,EAAA;QAC7D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;YACzB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACrE,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,EAAE;IACvB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B;IACF;AAEQ,IAAA,iBAAiB,CAAC,KAAsB,EAAA;AAC9C,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,IAAI,IAAI,CAAC,EAAE,EAAE;gBACX,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;oBAC9B,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,CAAC,EAAE,IAAI,CAAC,CAAC;AACV,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc;aACvC,cAAc,EAAE,OAAO;aACvB,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC;QAE9B,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC;QACxC;IACF;wGApXW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,wBAAA,EAAA,qFAAA,EAAA,uBAAA,EAAA,wFAAA,EAAA,EAAA,EAAA,SAAA,EATT,CAAC,oBAAoB,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3EnC,igQAiOA,EAAA,MAAA,EAAA,CAAA,s5NAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtKI,kBAAkB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,aAAA,EAAA,YAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,oBAAoB,4HACpB,eAAe,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,oBAAoB,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,gBAAgB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,aAAa,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,eAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,QAAQ,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,aAAa,qHACb,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAaI,SAAS,EAAA,UAAA,EAAA,CAAA;kBA5BrB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB;wBACP,kBAAkB;wBAClB,sBAAsB;wBACtB,oBAAoB;wBACpB,eAAe;wBACf,oBAAoB;wBACpB,gBAAgB;wBAChB,aAAa;wBACb,MAAM;wBACN,IAAI;wBACJ,IAAI;wBACJ,QAAQ;wBACR,aAAa;wBACb,KAAK;AACN,qBAAA,EAAA,SAAA,EAGU,CAAC,oBAAoB,CAAC,iBAClB,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,0BAA0B,EACxB,iFAAiF;AACnF,wBAAA,yBAAyB,EACvB,kFAAkF;AACrF,qBAAA,EAAA,QAAA,EAAA,igQAAA,EAAA,MAAA,EAAA,CAAA,s5NAAA,CAAA,EAAA;AAiD+D,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,MAAM,oEAC/B,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEvH1C,kBAAkB,CAAA;AAC7B,IAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,iFAAU;AACtC,IAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,iFAAU;AACtC,IAAA,kBAAkB,GAAG,KAAK,CAAC,QAAQ,wFAAU;AAC7C,IAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,iFAAU;AACtC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAU;IAEtB,SAAS,GAAG,MAAM,EAAU;wGAP1B,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,kzBCb/B,mmBAuBA,EAAA,MAAA,EAAA,CAAA,qcAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDfY,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,2MAAE,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAKrB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;+BACE,0BAA0B,EAAA,OAAA,EAC3B,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAA,aAAA,EAGlB,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,mmBAAA,EAAA,MAAA,EAAA,CAAA,qcAAA,CAAA,EAAA;;;MEC/B,SAAS,CAAA;AACX,IAAA,KAAK,GAAG;QACf,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE;QAClE,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE;QAC7E,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE;KACjF;wGALU,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,SAAS,yECZtB,+eAYA,EAAA,MAAA,EAAA,CAAA,m0BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDLY,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,IAAI,oLAAE,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAKlB,SAAS,EAAA,UAAA,EAAA,CAAA;kBAPrB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAA,aAAA,EAGf,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,+eAAA,EAAA,MAAA,EAAA,CAAA,m0BAAA,CAAA,EAAA;;;MEc/B,iBAAiB,CAAA;AACnB,IAAA,QAAQ,GAAwB;QACvC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE;QACjE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE;QACrE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;QAClE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE;QAC/D,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE;QAClE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE;KACrD;AAEQ,IAAA,YAAY,GAAoF;AACvG,QAAA,WAAW,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE;AACjG,QAAA,QAAQ,EAAK,EAAE,KAAK,EAAE,UAAU,EAAK,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,kBAAkB,EAAE;AAC9F,QAAA,MAAM,EAAO,EAAE,KAAK,EAAE,QAAQ,EAAO,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,EAAE;AAC5F,QAAA,WAAW,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE;KAClG;wGAfU,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,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxB9B,swBAeA,EAAA,MAAA,EAAA,CAAA,ujDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDIY,IAAI,oLAAE,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAKV,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;+BACE,yBAAyB,EAAA,OAAA,EAC1B,CAAC,IAAI,EAAE,KAAK,CAAC,EAAA,aAAA,EAGP,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,swBAAA,EAAA,MAAA,EAAA,CAAA,ujDAAA,CAAA,EAAA;;;MEV/B,QAAQ,CAAA;AACV,IAAA,SAAS,GAAG;AACnB,QAAA;AACE,YAAA,KAAK,EAAE,0BAA0B;AACjC,YAAA,WAAW,EAAE,uDAAuD;AACpE,YAAA,IAAI,EAAE,OAAO;AACd,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,2BAA2B;AAClC,YAAA,WAAW,EAAE,kDAAkD;AAC/D,YAAA,IAAI,EAAE,oBAAoB;AAC3B,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,8BAA8B;AACrC,YAAA,WAAW,EAAE,0DAA0D;AACvE,YAAA,IAAI,EAAE,kBAAkB;AACzB,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,wBAAwB;AAC/B,YAAA,WAAW,EAAE,4DAA4D;AACzE,YAAA,IAAI,EAAE,kBAAkB;AACzB,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,qCAAqC;AAC5C,YAAA,WAAW,EAAE,mDAAmD;AAChE,YAAA,IAAI,EAAE,UAAU;AACjB,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,kCAAkC;AACzC,YAAA,WAAW,EAAE,yDAAyD;AACtE,YAAA,IAAI,EAAE,aAAa;AACpB,SAAA;KACF;wGAhCU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,QAAQ,yECZrB,0WAUA,EAAA,MAAA,EAAA,CAAA,6bAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDHY,IAAI,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,2VAAE,KAAK,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA;;4FAK5B,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAA,aAAA,EAGzB,iBAAiB,CAAC,SAAS,EAAA,QAAA,EAAA,0WAAA,EAAA,MAAA,EAAA,CAAA,6bAAA,CAAA,EAAA;;;AEV5C;;AAEG;;;;"}