@daxiangme/form-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/property-editor-presets.ts","../src/component-registry.ts","../src/bulk-operations.ts","../src/canvas-projection.ts","../src/container-appearance.ts","../src/expression.ts","../src/validation.ts","../src/document-advanced.ts","../src/data-model.ts","../src/types.ts","../src/designer-document.ts","../src/event-flow.ts","../src/field-behavior.ts","../src/i18n.ts","../src/number-format.ts","../src/overlay-module.ts","../src/submission.ts","../src/subtable-projection.ts"],"sourcesContent":["import type { DesignerPropertyOption } from './types'\n\n/** 属性面板共用的标准间距预设,单位为 px。 */\nexport const DESIGNER_SPACING_PRESETS = numberOptions([0, 4, 8, 12, 16, 24, 32, 48], (value) =>\n value === 0 ? '无间距 · 0 px' : `${spacingName(value)} · ${value} px`,\n)\n\n/** 属性面板共用的标准字号预设,单位为 px。 */\nexport const DESIGNER_FONT_SIZE_PRESETS = numberOptions(\n [12, 14, 16, 18, 20, 24, 28, 32, 36, 48],\n (value) => `${value} px`,\n)\n\n/** 子表和引用列表共用的分页数量预设。 */\nexport const DESIGNER_PAGE_SIZE_PRESETS = numberOptions(\n [5, 10, 20, 50, 100],\n (value) => `${value} 条/页`,\n)\n\n/** 子表初始记录数量预设。 */\nexport const DESIGNER_INITIAL_COUNT_PRESETS = numberOptions([0, 1, 2, 3, 5, 10, 20], (value) =>\n value === 0 ? '不预置' : `${value} 条`,\n)\n\n/** 文本和意见控件共用的长度预设。 */\nexport const DESIGNER_LENGTH_PRESETS = numberOptions(\n [50, 100, 255, 500, 1000, 2000, 5000, 10000],\n (value) => `${value} 字符`,\n)\n\n/** 多选控件共用的数量上限预设。 */\nexport const DESIGNER_SELECTION_COUNT_PRESETS = numberOptions(\n [1, 3, 5, 10, 20, 50, 100],\n (value) => `${value} 项`,\n)\n\n/** 支持 0 表示不限制的多选数量预设。 */\nexport const DESIGNER_OPTIONAL_SELECTION_COUNT_PRESETS: DesignerPropertyOption[] = [\n { label: '不限', value: 0 },\n ...DESIGNER_SELECTION_COUNT_PRESETS,\n]\n\n/** 文件大小预设,单位为 MB。 */\nexport const DESIGNER_FILE_SIZE_PRESETS = numberOptions(\n [1, 5, 10, 20, 50, 100, 200, 500, 1024],\n (value) => `${value} MB`,\n)\n\n/** 浏览器定位超时预设,存储值继续使用毫秒。 */\nexport const DESIGNER_TIMEOUT_PRESETS = numberOptions([3000, 5000, 10000, 30000, 60000], (value) =>\n value < 60000 ? `${value / 1000} 秒` : '60 秒',\n)\n\n/** PC 端 24 栅格跨度预设。 */\nexport const DESIGNER_PC_SPAN_PRESETS: DesignerPropertyOption[] = [\n { label: '1/4 · 6/24', value: 6 },\n { label: '1/3 · 8/24', value: 8 },\n { label: '1/2 · 12/24', value: 12 },\n { label: '2/3 · 16/24', value: 16 },\n { label: '3/4 · 18/24', value: 18 },\n { label: '整行 · 24/24', value: 24 },\n]\n\n/** 移动端 24 栅格跨度预设。 */\nexport const DESIGNER_MOBILE_SPAN_PRESETS: DesignerPropertyOption[] = [\n { label: '半行 · 12/24', value: 12 },\n { label: '整行 · 24/24', value: 24 },\n]\n\n/** 数字字段的货币代码;运行时再映射为展示符号。 */\nexport const DESIGNER_CURRENCY_PRESETS: DesignerPropertyOption[] = [\n { label: '无货币', value: '' },\n { label: 'CNY · 人民币', value: 'CNY' },\n { label: 'USD · 美元', value: 'USD' },\n { label: 'EUR · 欧元', value: 'EUR' },\n { label: 'GBP · 英镑', value: 'GBP' },\n { label: 'JPY · 日元', value: 'JPY' },\n { label: 'HKD · 港币', value: 'HKD' },\n { label: 'TWD · 新台币', value: 'TWD' },\n]\n\n/** 附件类型编辑器支持的已知扩展名和快捷分组。 */\nexport const DESIGNER_FILE_TYPE_OPTIONS: Array<{\n label: string\n extensions: string[]\n group: boolean\n}> = [\n { label: '图片', extensions: ['.jpg', '.jpeg', '.png', '.gif', '.webp'], group: true },\n { label: '文档', extensions: ['.doc', '.docx', '.txt', '.rtf'], group: true },\n { label: '表格', extensions: ['.xls', '.xlsx', '.csv'], group: true },\n { label: '演示', extensions: ['.ppt', '.pptx'], group: true },\n { label: 'PDF', extensions: ['.pdf'], group: true },\n { label: '压缩包', extensions: ['.zip', '.rar', '.7z'], group: true },\n ...[\n '.jpg',\n '.jpeg',\n '.png',\n '.gif',\n '.webp',\n '.doc',\n '.docx',\n '.txt',\n '.rtf',\n '.xls',\n '.xlsx',\n '.csv',\n '.ppt',\n '.pptx',\n '.pdf',\n '.zip',\n '.rar',\n '.7z',\n ].map((extension) => ({ label: extension.toUpperCase(), extensions: [extension], group: false })),\n]\n\n/**\n * 根据日期组件的当前语义返回合法显示格式。\n *\n * @param sourceValue 日期类型或日期范围类型。\n * @returns 可供属性编辑器展示的受控格式。\n */\nexport function designerDateFormatOptions(sourceValue: unknown): DesignerPropertyOption[] {\n if (sourceValue === 'datetime' || sourceValue === 'DATETIME') {\n return [\n { label: '年-月-日 时:分', value: 'YYYY-MM-DD HH:mm' },\n { label: '年-月-日 时:分:秒', value: 'YYYY-MM-DD HH:mm:ss' },\n { label: '年/月/日 时:分', value: 'YYYY/MM/DD HH:mm' },\n ]\n }\n if (sourceValue === 'month') {\n return [\n { label: '年-月', value: 'YYYY-MM' },\n { label: '年/月', value: 'YYYY/MM' },\n { label: '年月', value: 'YYYY年MM月' },\n ]\n }\n if (sourceValue === 'year') return [{ label: '年份', value: 'YYYY' }]\n return [\n { label: '年-月-日', value: 'YYYY-MM-DD' },\n { label: '年/月/日', value: 'YYYY/MM/DD' },\n { label: '年月日', value: 'YYYY年MM月DD日' },\n ]\n}\n\n/**\n * 为预设选择追加合法的历史当前值,避免打开旧草稿时出现空白或自动迁移。\n *\n * @param options 当前编辑器允许产生的预设选项。\n * @param current 文档中已经存在的值。\n * @param formatCurrent 历史值显示函数。\n * @returns 保留原选项顺序并在必要时前置“当前值”的新数组。\n */\nexport function includeDesignerCurrentOption(\n options: readonly DesignerPropertyOption[],\n current: unknown,\n formatCurrent: (value: string | number | boolean) => string = (value) => String(value),\n): DesignerPropertyOption[] {\n if (!['string', 'number', 'boolean'].includes(typeof current)) return [...options]\n const primitive = current as string | number | boolean\n if (options.some((option) => option.value === primitive)) return [...options]\n return [{ label: `当前值 · ${formatCurrent(primitive)}`, value: primitive }, ...options]\n}\n\n/**\n * 生成数值型受控选项。\n *\n * @param values 数值集合。\n * @param labeler 显示文案函数。\n * @returns Element Plus 可直接消费的稳定选项。\n */\nexport function numberOptions(\n values: number[],\n labeler: (value: number) => string,\n): DesignerPropertyOption[] {\n return values.map((value) => ({ value, label: labeler(value) }))\n}\n\nfunction spacingName(value: number): string {\n if (value <= 4) return '极紧凑'\n if (value <= 8) return '紧凑'\n if (value <= 16) return '标准'\n if (value <= 24) return '宽松'\n return '大间距'\n}\n","import type {\n DesignerComponentGroup,\n DesignerComponentRegistration,\n DesignerPropertyEditor,\n DesignerPropertyDefinition,\n DesignerPropertyOption,\n DesignerSemanticType,\n} from './types'\nimport {\n DESIGNER_CURRENCY_PRESETS,\n DESIGNER_FILE_SIZE_PRESETS,\n DESIGNER_FONT_SIZE_PRESETS,\n DESIGNER_INITIAL_COUNT_PRESETS,\n DESIGNER_LENGTH_PRESETS,\n DESIGNER_OPTIONAL_SELECTION_COUNT_PRESETS,\n DESIGNER_PAGE_SIZE_PRESETS,\n DESIGNER_SELECTION_COUNT_PRESETS,\n DESIGNER_SPACING_PRESETS,\n DESIGNER_TIMEOUT_PRESETS,\n numberOptions,\n} from './property-editor-presets'\n\nconst TEXT_OPTIONS: DesignerPropertyDefinition[] = [\n property('placeholder', '占位提示', 'BASIC', 'TEXT'),\n property('clearable', '允许清空', 'DISPLAY', 'BOOLEAN'),\n property('maxLength', '最大长度', 'DATA', presetNumberEditor(DESIGNER_LENGTH_PRESETS, 0, 10000)),\n]\nconst STATIC_OPTIONS: DesignerPropertyDefinition[] = [\n property('options', '选项', 'DATA', 'OPTIONS'),\n property('placeholder', '占位提示', 'BASIC', 'TEXT'),\n property('clearable', '允许清空', 'DISPLAY', 'BOOLEAN'),\n]\nconst DIRECTORY_OPTIONS: DesignerPropertyDefinition[] = [\n property('selectionMode', '选择模式', 'DATA', 'SELECT', {\n options: selectOptions(['SINGLE', 'MULTIPLE'], ['单选', '多选']),\n }),\n property(\n 'maxSelections',\n '最多选择',\n 'DATA',\n presetNumberEditor(DESIGNER_SELECTION_COUNT_PRESETS, 1, 100, {\n visibleWhen: (configuration) => configuration.selectionMode === 'MULTIPLE',\n }),\n ),\n property('buttonText', '按钮文字', 'DISPLAY', 'TEXT'),\n property('scope', '数据范围', 'CAPABILITY', 'SELECT', {\n options: selectOptions(['CURRENT_TENANT', 'CURRENT_ORGANIZATION'], ['当前租户', '当前组织']),\n }),\n]\nconst CONDITIONAL_REASON =\n '静态 Core 未接入业务 Adapter;可以完成设计配置,运行预览不会请求远程数据'\nconst CONTAINER_APPEARANCE_PROPERTIES: DesignerPropertyDefinition[] = [\n property('surfaceStyle', '容器样式', 'DISPLAY', {\n type: 'SELECT',\n options: [\n ...selectOptions(\n ['INHERIT', 'NONE', 'BORDERED', 'SHADOW'],\n ['跟随表单', '无', '边框', '阴影'],\n ),\n { label: '填充(旧配置)', value: 'FILLED', disabled: true } satisfies DesignerPropertyOption,\n ],\n }),\n property('surfaceRadius', '容器圆角', 'DISPLAY', {\n type: 'SELECT',\n options: selectOptions(\n ['INHERIT', 'THEME', 'NONE', 'SMALL', 'BASE', 'LARGE'],\n ['跟随表单', '跟随系统', '直角', '小', '标准', '大'],\n ),\n }),\n]\n\n/** 45 类独立表单组件的完整静态注册表。 */\nexport const DESIGNER_COMPONENTS: readonly DesignerComponentRegistration[] = Object.freeze([\n container(\n 'group',\n '分组',\n 'ri:layout-row-line',\n 'LAYOUT',\n true,\n 'SURFACE',\n {\n title: '分组',\n collapsible: false,\n defaultCollapsed: false,\n surfaceStyle: 'INHERIT',\n surfaceRadius: 'INHERIT',\n columns: 2,\n columnGap: 16,\n },\n [\n property('title', '分组标题', 'BASIC', 'TEXT'),\n property('collapsible', '允许折叠', 'DISPLAY', 'BOOLEAN'),\n property('defaultCollapsed', '默认折叠', 'DISPLAY', {\n type: 'BOOLEAN',\n visibleWhen: (configuration) => configuration.collapsible === true,\n }),\n property(\n 'columns',\n '默认列数',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions([1, 2, 3, 4], (value) => `${value} 列`),\n 1,\n 4,\n ),\n ),\n property(\n 'columnGap',\n '列间距',\n 'DISPLAY',\n presetNumberEditor(DESIGNER_SPACING_PRESETS, 0, 48, { unit: 'px' }),\n ),\n ],\n ),\n container(\n 'tabs',\n '标签页',\n 'ri:folder-line',\n 'LAYOUT',\n true,\n 'SURFACE',\n {\n tabsType: '',\n tabs: ['标签页 1', '标签页 2'],\n surfaceStyle: 'INHERIT',\n surfaceRadius: 'INHERIT',\n },\n [\n property('tabsType', '标签样式', 'DISPLAY', 'SELECT', {\n options: selectOptions(['', 'card', 'border-card'], ['简洁', '卡片', '边框卡片']),\n }),\n property('tabs', '标签页', 'DATA', 'OPTIONS'),\n ],\n ),\n container(\n 'row-subtable',\n '行子表',\n 'ri:table-line',\n 'SUBTABLE',\n true,\n 'SURFACE',\n {\n title: '行子表',\n allowCreate: true,\n allowDelete: true,\n allowCopy: true,\n showIndex: true,\n pagination: false,\n pageSize: 10,\n initialRows: 0,\n relationCode: '',\n surfaceStyle: 'INHERIT',\n surfaceRadius: 'INHERIT',\n },\n [\n property('title', '子表标题', 'BASIC', 'TEXT'),\n property('allowCreate', '允许新增行', 'CAPABILITY', 'BOOLEAN'),\n property('allowDelete', '允许删除行', 'CAPABILITY', 'BOOLEAN'),\n property('allowCopy', '允许复制行', 'CAPABILITY', 'BOOLEAN'),\n property('showIndex', '显示序号', 'DISPLAY', 'BOOLEAN'),\n property('pagination', '启用分页', 'DISPLAY', 'BOOLEAN'),\n property(\n 'pageSize',\n '每页行数',\n 'DISPLAY',\n presetNumberEditor(DESIGNER_PAGE_SIZE_PRESETS, 1, 100, {\n visibleWhen: (configuration) => configuration.pagination === true,\n }),\n ),\n property(\n 'initialRows',\n '初始行数',\n 'DATA',\n presetNumberEditor(DESIGNER_INITIAL_COUNT_PRESETS, 0, 20),\n ),\n ],\n 'AVAILABLE',\n '',\n 3,\n ),\n container(\n 'block-subtable',\n '块子表',\n 'ri:layout-grid-line',\n 'SUBTABLE',\n true,\n 'SURFACE',\n {\n title: '块子表',\n allowCreate: true,\n allowDelete: true,\n allowCopy: true,\n initialRows: 0,\n deepEditMode: 'INLINE',\n relationCode: '',\n surfaceStyle: 'INHERIT',\n surfaceRadius: 'INHERIT',\n },\n [\n property('title', '子表标题', 'BASIC', 'TEXT'),\n property('allowCreate', '允许新增', 'CAPABILITY', 'BOOLEAN'),\n property('allowDelete', '允许删除', 'CAPABILITY', 'BOOLEAN'),\n property('allowCopy', '允许复制', 'CAPABILITY', 'BOOLEAN'),\n property(\n 'initialRows',\n '初始块数',\n 'DATA',\n presetNumberEditor(DESIGNER_INITIAL_COUNT_PRESETS, 0, 20),\n ),\n property('deepEditMode', '编辑方式', 'DISPLAY', 'SELECT', {\n options: selectOptions(['INLINE', 'DIALOG'], ['行内', '弹窗']),\n }),\n ],\n 'AVAILABLE',\n '',\n 3,\n ),\n container(\n 'title',\n '标题',\n 'ri:heading',\n 'AUXILIARY',\n false,\n 'NONE',\n {\n text: '标题',\n level: 3,\n fontSize: 20,\n fontColor: '',\n fontWeight: 'semibold',\n align: 'left',\n },\n [\n property('text', '标题文字', 'BASIC', 'TEXT'),\n property(\n 'level',\n '标题级别',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions([1, 2, 3, 4, 5, 6], (value) => `H${value}`),\n 1,\n 6,\n ),\n ),\n property(\n 'fontSize',\n '字号',\n 'DISPLAY',\n presetNumberEditor(DESIGNER_FONT_SIZE_PRESETS, 12, 48, { unit: 'px' }),\n ),\n property('fontColor', '文字颜色', 'DISPLAY', 'COLOR'),\n property('fontWeight', '字重', 'DISPLAY', 'SELECT', {\n options: selectOptions(\n ['normal', 'medium', 'semibold', 'bold'],\n ['常规', '中等', '半粗', '粗体'],\n ),\n }),\n property('align', '对齐', 'DISPLAY', 'SELECT', {\n options: selectOptions(['left', 'center', 'right'], ['左', '中', '右']),\n }),\n ],\n ),\n container(\n 'divider',\n '分隔线',\n 'ri:separator',\n 'AUXILIARY',\n false,\n 'NONE',\n { text: '', position: 'left', borderStyle: 'solid' },\n [\n property('text', '分隔文字', 'BASIC', 'TEXT'),\n property('position', '文字位置', 'DISPLAY', 'SELECT', {\n options: selectOptions(['left', 'center', 'right'], ['左', '中', '右']),\n }),\n property('borderStyle', '线条样式', 'DISPLAY', 'SELECT', {\n options: selectOptions(['solid', 'dashed', 'dotted'], ['实线', '虚线', '点线']),\n }),\n ],\n ),\n container(\n 'alert',\n '提示',\n 'ri:alert-line',\n 'AUXILIARY',\n false,\n 'NONE',\n { title: '提示内容', type: 'info', effect: 'light', showIcon: true, closable: false },\n [\n property('title', '提示内容', 'BASIC', 'TEXTAREA'),\n property('type', '提示类型', 'DISPLAY', 'SELECT', {\n options: selectOptions(\n ['success', 'warning', 'info', 'error'],\n ['成功', '警告', '信息', '错误'],\n ),\n }),\n property('effect', '显示效果', 'DISPLAY', 'SELECT', {\n options: selectOptions(['light', 'dark'], ['浅色', '深色']),\n }),\n property('showIcon', '显示图标', 'DISPLAY', 'BOOLEAN'),\n property('closable', '允许关闭', 'CAPABILITY', 'BOOLEAN'),\n ],\n ),\n container(\n 'button',\n '按钮',\n 'ri:cursor-line',\n 'AUXILIARY',\n false,\n 'NONE',\n {\n text: '按钮',\n buttonType: 'primary',\n plain: false,\n round: false,\n disabled: false,\n align: 'left',\n },\n [\n property('text', '按钮文字', 'BASIC', 'TEXT'),\n property('buttonType', '按钮类型', 'DISPLAY', 'SELECT', {\n options: selectOptions(\n ['primary', 'success', 'warning', 'danger', 'info'],\n ['主要', '成功', '警告', '危险', '信息'],\n ),\n }),\n property('plain', '朴素按钮', 'DISPLAY', 'BOOLEAN'),\n property('round', '圆角按钮', 'DISPLAY', 'BOOLEAN'),\n property('disabled', '禁用', 'CAPABILITY', 'BOOLEAN'),\n property('align', '对齐', 'DISPLAY', 'SELECT', {\n options: selectOptions(['left', 'center', 'right'], ['左', '中', '右']),\n }),\n ],\n ),\n unavailableContainer(\n 'captcha',\n '验证码',\n 'ri:shield-check-line',\n '当前部署未配置短信或邮箱验证码渠道',\n ),\n container(\n 'iframe',\n '外部页面',\n 'ri:window-line',\n 'AUXILIARY',\n false,\n 'NONE',\n {\n title: '外部页面',\n url: '',\n height: 480,\n allowForms: true,\n allowPopups: false,\n allowScripts: false,\n },\n [\n property('title', '无障碍标题', 'BASIC', 'TEXT'),\n property('url', 'HTTPS 地址', 'DATA', { type: 'URL', maxLength: 2048 }),\n property(\n 'height',\n '高度',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions([160, 240, 320, 480, 600, 800, 1000, 1200], (value) => `${value} px`),\n 160,\n 1200,\n { unit: 'px' },\n ),\n ),\n property('allowForms', '允许表单提交', 'CAPABILITY', 'BOOLEAN'),\n property('allowPopups', '允许弹窗', 'CAPABILITY', 'BOOLEAN'),\n property('allowScripts', '允许脚本', 'CAPABILITY', 'BOOLEAN'),\n ],\n 'CONDITIONAL',\n '静态 Core 不加载任意外部 URL',\n ),\n\n field(\n 'text',\n '单行文本',\n 'ri:input-field',\n 'BASIC',\n 'STRING',\n {\n placeholder: '请输入',\n clearable: true,\n minLength: 0,\n maxLength: 255,\n prefix: '',\n suffix: '',\n trim: true,\n },\n [\n ...TEXT_OPTIONS,\n property(\n 'minLength',\n '最小长度',\n 'DATA',\n presetNumberEditor([{ label: '不限制', value: 0 }, ...DESIGNER_LENGTH_PRESETS], 0, 10000),\n ),\n property('prefix', '前缀', 'DISPLAY', 'TEXT'),\n property('suffix', '后缀', 'DISPLAY', 'TEXT'),\n property('trim', '去除首尾空格', 'DATA', 'BOOLEAN'),\n ],\n ),\n field(\n 'textarea',\n '多行文本',\n 'ri:align-left',\n 'BASIC',\n 'LONG_TEXT',\n { placeholder: '请输入', rows: 4, autosize: false, showWordLimit: true, maxLength: 2000 },\n [\n ...TEXT_OPTIONS,\n property(\n 'rows',\n '行数',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions([2, 3, 4, 5, 6, 8, 10, 12, 16, 20], (value) => `${value} 行`),\n 2,\n 20,\n ),\n ),\n property('autosize', '自动高度', 'DISPLAY', 'BOOLEAN'),\n property('showWordLimit', '显示字数', 'DISPLAY', 'BOOLEAN'),\n ],\n 24,\n ),\n field(\n 'select',\n '下拉选择',\n 'ri:list-check-3',\n 'BASIC',\n 'STRING',\n { options: defaultOptions(), clearable: true, filterable: true, placeholder: '请选择' },\n [...STATIC_OPTIONS, property('filterable', '允许搜索', 'DISPLAY', 'BOOLEAN')],\n ),\n field(\n 'multi-select',\n '多选下拉',\n 'ri:list-check',\n 'BASIC',\n 'ARRAY',\n {\n options: defaultOptions(),\n clearable: true,\n filterable: true,\n maxSelections: 0,\n collapseTags: true,\n placeholder: '请选择',\n },\n [\n ...STATIC_OPTIONS,\n property('filterable', '允许搜索', 'DISPLAY', 'BOOLEAN'),\n property(\n 'maxSelections',\n '最多选择',\n 'DATA',\n presetNumberEditor(DESIGNER_OPTIONAL_SELECTION_COUNT_PRESETS, 0, 100),\n ),\n property('collapseTags', '折叠标签', 'DISPLAY', 'BOOLEAN'),\n ],\n ),\n field(\n 'checkbox',\n '复选框',\n 'ri:checkbox-multiple-line',\n 'BASIC',\n 'ARRAY',\n {\n options: defaultOptions(),\n optionStyle: 'DEFAULT',\n minimumSelections: 0,\n maximumSelections: 0,\n },\n [\n property('options', '选项', 'DATA', 'OPTIONS'),\n property('optionStyle', '样式', 'DISPLAY', 'SELECT', {\n options: selectOptions(['DEFAULT', 'BUTTON'], ['普通', '按钮']),\n }),\n property(\n 'minimumSelections',\n '最少选择',\n 'DATA',\n presetNumberEditor(\n [{ label: '不限制', value: 0 }, ...DESIGNER_SELECTION_COUNT_PRESETS],\n 0,\n 100,\n ),\n ),\n property(\n 'maximumSelections',\n '最多选择',\n 'DATA',\n presetNumberEditor(DESIGNER_OPTIONAL_SELECTION_COUNT_PRESETS, 0, 100),\n ),\n ],\n ),\n field(\n 'radio',\n '单选框',\n 'ri:radio-button-line',\n 'BASIC',\n 'STRING',\n { options: defaultOptions(), optionStyle: 'DEFAULT', clearable: false },\n [\n property('options', '选项', 'DATA', 'OPTIONS'),\n property('optionStyle', '样式', 'DISPLAY', 'SELECT', {\n options: selectOptions(['DEFAULT', 'BUTTON'], ['普通', '按钮']),\n }),\n property('clearable', '允许清空', 'DISPLAY', 'BOOLEAN'),\n ],\n ),\n field(\n 'date',\n '日期',\n 'ri:calendar-line',\n 'BASIC',\n 'DATE',\n { dateType: 'date', format: 'YYYY-MM-DD', clearable: true, defaultNow: false },\n [\n property('dateType', '日期类型', 'DATA', 'SELECT', {\n options: selectOptions(\n ['date', 'datetime', 'month', 'year'],\n ['日期', '日期时间', '月份', '年份'],\n ),\n }),\n property('format', '显示格式', 'DISPLAY', { type: 'DATE_FORMAT', sourceKey: 'dateType' }),\n property('clearable', '允许清空', 'DISPLAY', 'BOOLEAN'),\n property('defaultNow', '默认当前时间', 'DATA', 'BOOLEAN'),\n ],\n ),\n field(\n 'serial-number',\n '流水号',\n 'ri:sort-number-asc',\n 'BASIC',\n 'STRING',\n { generationTiming: 'ON_CREATE', showCode: false, codeType: 'BARCODE' },\n [\n property('generationTiming', '生成时机', 'DATA', 'SELECT', {\n options: selectOptions(['ON_CREATE', 'ON_SUBMIT'], ['创建时', '提交时']),\n }),\n property('showCode', '显示条码', 'DISPLAY', 'BOOLEAN'),\n property('codeType', '条码类型', 'DISPLAY', 'SELECT', {\n options: selectOptions(['BARCODE', 'QRCODE'], ['条形码', '二维码']),\n visibleWhen: (configuration) => configuration.showCode === true,\n }),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n ),\n field(\n 'file',\n '文件',\n 'ri:attachment-2',\n 'BASIC',\n 'FILE',\n {\n maxCount: 5,\n maxSizeMb: 20,\n accept: '',\n displayMode: 'BUTTON',\n allowReadOnlyDownload: true,\n assetPolicyRef: '',\n },\n [\n property(\n 'maxCount',\n '最大文件数',\n 'DATA',\n presetNumberEditor(DESIGNER_SELECTION_COUNT_PRESETS, 1, 100),\n ),\n property(\n 'maxSizeMb',\n '单文件大小',\n 'DATA',\n presetNumberEditor(DESIGNER_FILE_SIZE_PRESETS, 1, 1024, { unit: 'MB' }),\n ),\n property('accept', '允许附件类型', 'DATA', {\n type: 'FILE_TYPES',\n legacyValuePolicy: 'PRESERVE',\n }),\n property('displayMode', '展示方式', 'DISPLAY', 'SELECT', {\n options: selectOptions(['BUTTON', 'DRAG'], ['按钮', '拖放']),\n }),\n property('allowReadOnlyDownload', '只读允许下载', 'CAPABILITY', 'BOOLEAN'),\n property('assetPolicyRef', '文件策略', 'CAPABILITY', {\n type: 'RESOURCE_REFERENCE',\n resourceType: 'ASSET_POLICY',\n unavailableReason: '文件策略 Adapter 尚未接入',\n }),\n ],\n 24,\n ),\n field(\n 'number',\n '数字',\n 'ri:hashtag',\n 'BASIC',\n 'NUMBER',\n {\n minimum: null,\n maximum: null,\n step: 1,\n precision: 0,\n controls: false,\n controlsPosition: 'RIGHT',\n currencyPrefix: '',\n thousandsSeparator: false,\n uppercaseRmb: false,\n },\n [\n property('minimum', '最小值', 'DATA', 'NUMBER'),\n property('maximum', '最大值', 'DATA', 'NUMBER'),\n property('step', '步长', 'DATA', 'NUMBER', { minimum: 0 }),\n property(\n 'precision',\n '精度',\n 'DATA',\n presetNumberEditor(\n numberOptions([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], (value) => `${value} 位`),\n 0,\n 10,\n ),\n ),\n property('controls', '显示步进按钮', 'DISPLAY', 'BOOLEAN'),\n property('controlsPosition', '按钮位置', 'DISPLAY', 'SELECT', {\n options: selectOptions(['DEFAULT', 'RIGHT'], ['两侧', '右侧']),\n visibleWhen: (configuration) => configuration.controls === true,\n }),\n property('currencyPrefix', '货币', 'DISPLAY', {\n type: 'SELECT',\n options: DESIGNER_CURRENCY_PRESETS,\n legacyValuePolicy: 'PRESERVE',\n }),\n property('thousandsSeparator', '千分位', 'DISPLAY', 'BOOLEAN'),\n property('uppercaseRmb', '人民币大写', 'DISPLAY', 'BOOLEAN'),\n ],\n ),\n field(\n 'switch',\n '开关',\n 'ri:toggle-line',\n 'BASIC',\n 'BOOLEAN',\n {\n activeValue: true,\n inactiveValue: false,\n activeText: '',\n inactiveText: '',\n activeColor: '',\n inactiveColor: '',\n },\n [\n property('activeText', '开启文字', 'DISPLAY', 'TEXT'),\n property('inactiveText', '关闭文字', 'DISPLAY', 'TEXT'),\n property('activeColor', '开启颜色', 'DISPLAY', 'COLOR'),\n property('inactiveColor', '关闭颜色', 'DISPLAY', 'COLOR'),\n ],\n ),\n field(\n 'rate',\n '评分',\n 'ri:star-line',\n 'BASIC',\n 'NUMBER',\n { max: 5, allowHalf: false, showText: false },\n [\n property(\n 'max',\n '最大分值',\n 'DATA',\n presetNumberEditor(\n numberOptions([3, 5, 7, 10, 20], (value) => `${value} 分`),\n 1,\n 20,\n ),\n ),\n property('allowHalf', '允许半星', 'DATA', 'BOOLEAN'),\n property('showText', '显示分值', 'DISPLAY', 'BOOLEAN'),\n ],\n ),\n field(\n 'steps',\n '步骤',\n 'ri:list-ordered-2',\n 'BASIC',\n 'NUMBER',\n {\n options: stepOptions(),\n direction: 'horizontal',\n simple: true,\n finishStatus: 'success',\n showDescription: true,\n },\n [\n property('options', '步骤', 'DATA', 'OPTIONS'),\n property('direction', '方向', 'DISPLAY', 'SELECT', {\n options: selectOptions(['horizontal', 'vertical'], ['水平', '垂直']),\n }),\n property('simple', '简洁模式', 'DISPLAY', 'BOOLEAN'),\n property('showDescription', '显示说明', 'DISPLAY', 'BOOLEAN'),\n ],\n 24,\n ),\n field(\n 'rich-text',\n '富文本',\n 'ri:text',\n 'BASIC',\n 'LONG_TEXT',\n { minHeight: 180, maxHeight: 600, toolbarPreset: 'STANDARD', allowImages: false },\n [\n property(\n 'minHeight',\n '最小高度',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions([120, 160, 180, 240, 320, 480, 600, 800, 1000], (value) => `${value} px`),\n 120,\n 1000,\n { unit: 'px' },\n ),\n ),\n property(\n 'maxHeight',\n '最大高度',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions(\n [120, 160, 180, 240, 320, 480, 600, 800, 1000, 1200, 1600],\n (value) => `${value} px`,\n ),\n 120,\n 1600,\n { unit: 'px' },\n ),\n ),\n property('toolbarPreset', '工具栏', 'CAPABILITY', 'SELECT', {\n options: selectOptions(['BASIC', 'STANDARD', 'FULL'], ['基础', '标准', '完整']),\n }),\n property('allowImages', '允许图片', 'CAPABILITY', 'BOOLEAN'),\n ],\n 24,\n ),\n field('hidden', '隐藏字段', 'ri:eye-off-line', 'BASIC', 'STRING', { submit: true }, [\n property('submit', '提交字段', 'DATA', 'BOOLEAN'),\n ]),\n\n directoryField('user', '用户', 'ri:user-line'),\n directoryField('role', '角色', 'ri:admin-line'),\n directoryField('organization', '组织', 'ri:organization-chart', [\n property('cascade', '组织级联', 'DISPLAY', 'BOOLEAN'),\n ]),\n directoryField('post', '岗位', 'ri:briefcase-line'),\n field(\n 'custom-data',\n '自定义数据',\n 'ri:braces-line',\n 'ADVANCED',\n 'OBJECT',\n { selectionMode: 'SINGLE', maxSelections: 20, buttonText: '选择数据', displayColumns: [] },\n [\n ...DIRECTORY_OPTIONS.filter((item) => item.key !== 'scope'),\n property('displayColumns', '展示列', 'DATA', 'OPTIONS'),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n ),\n field(\n 'date-range',\n '日期范围',\n 'ri:calendar-event-line',\n 'ADVANCED',\n 'ARRAY',\n {\n rangeType: 'DATE',\n format: 'YYYY-MM-DD',\n separator: '至',\n statisticsEnabled: false,\n statisticsUnit: 'DAY',\n },\n [\n property('rangeType', '范围类型', 'DATA', 'SELECT', {\n options: selectOptions(['DATE', 'DATETIME'], ['日期', '日期时间']),\n }),\n property('format', '显示格式', 'DISPLAY', { type: 'DATE_FORMAT', sourceKey: 'rangeType' }),\n property('separator', '分隔符', 'DISPLAY', {\n type: 'SEGMENTED',\n options: selectOptions(['至', '~', '—'], ['至', '~', '—']),\n legacyValuePolicy: 'PRESERVE',\n }),\n property('statisticsEnabled', '计算时长', 'CAPABILITY', 'BOOLEAN'),\n property('statisticsUnit', '统计单位', 'CAPABILITY', 'SELECT', {\n options: selectOptions(['DAY', 'HOUR', 'MINUTE'], ['天', '小时', '分钟']),\n visibleWhen: (configuration) => configuration.statisticsEnabled === true,\n }),\n ],\n ),\n field(\n 'date-multiple',\n '多日期',\n 'ri:calendar-schedule-line',\n 'ADVANCED',\n 'ARRAY',\n { format: 'YYYY-MM-DD', maximumSelections: 20 },\n [\n property('format', '显示格式', 'DISPLAY', { type: 'DATE_FORMAT', sourceKey: 'dateType' }),\n property(\n 'maximumSelections',\n '最多日期数',\n 'DATA',\n presetNumberEditor(DESIGNER_SELECTION_COUNT_PRESETS, 1, 100),\n ),\n ],\n ),\n field(\n 'signature',\n '手写签名',\n 'ri:quill-pen-line',\n 'ADVANCED',\n 'FILE',\n { lineWidth: 2, penColor: '#111827', allowPersonalSignatureReuse: false },\n [\n property(\n 'lineWidth',\n '笔画宽度',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions([1, 2, 3, 4, 6, 8, 10, 12], (value) => `${value} px`),\n 1,\n 12,\n {\n unit: 'px',\n },\n ),\n ),\n property('penColor', '笔画颜色', 'DISPLAY', 'COLOR'),\n property('allowPersonalSignatureReuse', '允许复用个人签名', 'CAPABILITY', 'BOOLEAN'),\n ],\n 24,\n ),\n field(\n 'opinion',\n '审批意见',\n 'ri:chat-quote-line',\n 'ADVANCED',\n 'OBJECT',\n {\n mode: 'OPINION',\n rows: 4,\n maxLength: 2000,\n opinionRequired: false,\n signatureRequired: false,\n allowRepeatSignature: false,\n },\n [\n property('mode', '意见模式', 'DATA', 'SELECT', {\n options: selectOptions(['OPINION', 'SIGNATURE', 'COMBINED'], ['意见', '签名', '意见+签名']),\n }),\n property(\n 'rows',\n '输入行数',\n 'DISPLAY',\n presetNumberEditor(\n numberOptions([2, 3, 4, 5, 6, 8, 10, 12], (value) => `${value} 行`),\n 2,\n 12,\n ),\n ),\n property(\n 'maxLength',\n '最大长度',\n 'DATA',\n presetNumberEditor(DESIGNER_LENGTH_PRESETS, 1, 10000),\n ),\n property('opinionRequired', '意见必填', 'DATA', 'BOOLEAN'),\n property('signatureRequired', '签名必填', 'DATA', 'BOOLEAN'),\n ],\n 24,\n ),\n referenceField('process-reference', '流程引用', 'ri:flow-chart'),\n field(\n 'region',\n '区域',\n 'ri:map-2-line',\n 'ADVANCED',\n 'ARRAY',\n {\n checkStrictly: false,\n multiple: false,\n maximumLevel: 3,\n showFullPath: true,\n separator: ' / ',\n },\n [\n property('checkStrictly', '任意层级可选', 'DATA', 'BOOLEAN'),\n property('multiple', '允许多选', 'DATA', 'BOOLEAN'),\n property(\n 'maximumLevel',\n '最大层级',\n 'DATA',\n presetNumberEditor(\n numberOptions([1, 2, 3, 4, 5], (value) => `${value} 级`),\n 1,\n 5,\n ),\n ),\n property('showFullPath', '显示完整路径', 'DISPLAY', 'BOOLEAN'),\n property('separator', '路径分隔符', 'DISPLAY', {\n type: 'SEGMENTED',\n options: selectOptions([' / ', ' > ', ' - '], ['/', '>', '-']),\n legacyValuePolicy: 'PRESERVE',\n visibleWhen: (configuration) => configuration.showFullPath === true,\n }),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n ),\n field(\n 'dictionary-tree',\n '字典树',\n 'ri:node-tree',\n 'ADVANCED',\n 'ARRAY',\n { dictionaryKey: '', checkStrictly: false, multiple: false },\n [\n property('dictionaryKey', '业务字典', 'DATA', {\n type: 'RESOURCE_REFERENCE',\n resourceType: 'DICTIONARY',\n unavailableReason: '静态 Core 未接入业务字典 Adapter;已有字典编码保持只读',\n }),\n property('checkStrictly', '父子不联动', 'DATA', 'BOOLEAN'),\n property('multiple', '允许多选', 'DATA', 'BOOLEAN'),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n ),\n unavailableField(\n 'online-document',\n '在线文档',\n 'ri:file-word-2-line',\n '当前部署未配置 Web Office 服务',\n ),\n referenceField('form-reference', '表单引用', 'ri:file-list-3-line'),\n field(\n 'scan-code',\n '扫码',\n 'ri:qr-scan-2-line',\n 'ADVANCED',\n 'STRING',\n { allowManualInput: true, allowModification: true, displayMode: 'INPUT', formats: ['qr_code'] },\n [\n property('allowManualInput', '允许手工输入', 'CAPABILITY', 'BOOLEAN'),\n property('allowModification', '允许修改结果', 'CAPABILITY', 'BOOLEAN'),\n property('displayMode', '显示方式', 'DISPLAY', 'SELECT', {\n options: selectOptions(['INPUT', 'LABEL', 'HIDDEN'], ['输入框', '文字', '隐藏']),\n }),\n ],\n 12,\n 'CONDITIONAL',\n '静态 Core 不申请摄像头权限',\n ),\n field(\n 'ocr',\n 'OCR',\n 'ri:scan-line',\n 'ADVANCED',\n 'OBJECT',\n { recognitionType: 'BASIC_GENERAL', retainOriginal: true, allowResultEditing: true },\n [\n property('recognitionType', '识别类型', 'CAPABILITY', 'SELECT', {\n options: selectOptions(\n ['BASIC_GENERAL', 'ID_CARD', 'BANK_CARD', 'BUSINESS_LICENSE', 'INVOICE'],\n ['通用文字', '身份证', '银行卡', '营业执照', '发票'],\n ),\n }),\n property('retainOriginal', '保留原图', 'DATA', 'BOOLEAN'),\n property('allowResultEditing', '允许修改结果', 'CAPABILITY', 'BOOLEAN'),\n ],\n 24,\n 'CONDITIONAL',\n '静态 Core 不调用百度 OCR',\n ),\n field(\n 'position',\n '定位',\n 'ri:map-pin-line',\n 'ADVANCED',\n 'OBJECT',\n { enableHighAccuracy: true, timeout: 10000 },\n [\n property('enableHighAccuracy', '高精度定位', 'CAPABILITY', 'BOOLEAN'),\n property(\n 'timeout',\n '定位超时',\n 'CAPABILITY',\n presetNumberEditor(DESIGNER_TIMEOUT_PRESETS, 1000, 60000, { unit: '秒' }),\n ),\n ],\n 12,\n 'CONDITIONAL',\n '静态 Core 不申请浏览器定位权限',\n ),\n\n field(\n 'dynamic-select',\n '动态选择',\n 'ri:database-2-line',\n 'DYNAMIC',\n 'ARRAY',\n { options: defaultOptions(), multiple: false, multipleLimit: 20, clearable: true },\n [\n property('options', '静态演示选项', 'DATA', 'OPTIONS'),\n property('multiple', '允许多选', 'DATA', 'BOOLEAN'),\n property(\n 'multipleLimit',\n '最多选择',\n 'DATA',\n presetNumberEditor(DESIGNER_SELECTION_COUNT_PRESETS, 1, 100, {\n visibleWhen: (configuration) => configuration.multiple === true,\n }),\n ),\n property('clearable', '允许清空', 'DISPLAY', 'BOOLEAN'),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n ),\n field(\n 'dynamic-cascade',\n '动态级联',\n 'ri:git-merge-line',\n 'DYNAMIC',\n 'ARRAY',\n {\n options: cascadeOptions(),\n multiple: false,\n checkStrictly: false,\n showAllLevels: true,\n separator: ' / ',\n },\n [\n property('options', '静态演示选项', 'DATA', 'OPTIONS'),\n property('multiple', '允许多选', 'DATA', 'BOOLEAN'),\n property('checkStrictly', '父子不联动', 'DATA', 'BOOLEAN'),\n property('showAllLevels', '显示完整路径', 'DISPLAY', 'BOOLEAN'),\n property('separator', '路径分隔符', 'DISPLAY', {\n type: 'SEGMENTED',\n options: selectOptions([' / ', ' > ', ' - '], ['/', '>', '-']),\n legacyValuePolicy: 'PRESERVE',\n visibleWhen: (configuration) => configuration.showAllLevels === true,\n }),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n ),\n field(\n 'data-dialog',\n '数据对话框',\n 'ri:table-view',\n 'DYNAMIC',\n 'OBJECT',\n {\n options: defaultOptions(),\n selectionMode: 'SINGLE',\n maxSelections: 20,\n buttonText: '选择数据',\n },\n [\n property('options', '静态演示数据', 'DATA', 'OPTIONS'),\n property('selectionMode', '选择模式', 'DATA', 'SELECT', {\n options: selectOptions(['SINGLE', 'MULTIPLE'], ['单选', '多选']),\n }),\n property(\n 'maxSelections',\n '最多选择',\n 'DATA',\n presetNumberEditor(DESIGNER_SELECTION_COUNT_PRESETS, 1, 100, {\n visibleWhen: (configuration) => configuration.selectionMode === 'MULTIPLE',\n }),\n ),\n property('buttonText', '按钮文字', 'DISPLAY', 'TEXT'),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n ),\n])\n\nif (DESIGNER_COMPONENTS.length !== 45) {\n throw new Error(`独立表单设计器必须注册 45 类组件,当前为 ${DESIGNER_COMPONENTS.length} 类`)\n}\n\n/** 按稳定组件编码读取注册项。 */\nexport function findDesignerComponent(\n componentType: string,\n): DesignerComponentRegistration | undefined {\n return DESIGNER_COMPONENTS.find((item) => item.componentType === componentType)\n}\n\n/** 按语义类型返回允许切换的字段组件。 */\nexport function compatibleDesignerComponents(\n semanticType: DesignerSemanticType,\n): DesignerComponentRegistration[] {\n return DESIGNER_COMPONENTS.filter(\n (item) => item.nodeKind === 'FIELD' && item.compatibleSemanticTypes.includes(semanticType),\n )\n}\n\nfunction field(\n componentType: string,\n name: string,\n icon: string,\n group: DesignerComponentGroup,\n semanticType: DesignerSemanticType,\n defaultConfiguration: Record<string, unknown>,\n properties: DesignerPropertyDefinition[],\n defaultSpan = 12,\n availability: DesignerComponentRegistration['availability'] = 'AVAILABLE',\n unavailableReason = '',\n): DesignerComponentRegistration {\n return registration({\n componentType,\n name,\n icon,\n group,\n nodeKind: 'FIELD',\n semanticType,\n compatibleSemanticTypes: compatibleTypes(semanticType),\n defaultConfiguration,\n defaultSpan,\n defaultShowLabel: componentType !== 'steps' && componentType !== 'hidden',\n detailLabelPolicy: componentType === 'steps' ? 'HIDE' : 'INHERIT',\n containerAppearance: 'NONE',\n availability,\n unavailableReason,\n acceptsChildren: false,\n supportedEvents: ['CHANGE', 'BLUR', 'FOCUS'],\n properties,\n })\n}\n\nfunction directoryField(\n componentType: string,\n name: string,\n icon: string,\n extra: DesignerPropertyDefinition[] = [],\n): DesignerComponentRegistration {\n return field(\n componentType,\n name,\n icon,\n 'ADVANCED',\n 'REFERENCE',\n {\n selectionMode: 'SINGLE',\n maxSelections: 20,\n scope: 'CURRENT_TENANT',\n buttonText: `选择${name}`,\n },\n [...DIRECTORY_OPTIONS, ...extra],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n )\n}\n\nfunction referenceField(\n componentType: string,\n name: string,\n icon: string,\n): DesignerComponentRegistration {\n return field(\n componentType,\n name,\n icon,\n 'ADVANCED',\n 'REFERENCE',\n { selectionMode: 'SINGLE', maxSelections: 20, pageSize: 20, buttonText: `选择${name}` },\n [\n property('selectionMode', '选择模式', 'DATA', 'SELECT', {\n options: selectOptions(['SINGLE', 'MULTIPLE'], ['单选', '多选']),\n }),\n property(\n 'maxSelections',\n '最多选择',\n 'DATA',\n presetNumberEditor(DESIGNER_SELECTION_COUNT_PRESETS, 1, 100, {\n visibleWhen: (configuration) => configuration.selectionMode === 'MULTIPLE',\n }),\n ),\n property(\n 'pageSize',\n '每页数量',\n 'DATA',\n presetNumberEditor(DESIGNER_PAGE_SIZE_PRESETS, 5, 100),\n ),\n property('buttonText', '按钮文字', 'DISPLAY', 'TEXT'),\n ],\n 12,\n 'CONDITIONAL',\n CONDITIONAL_REASON,\n )\n}\n\nfunction container(\n componentType: string,\n name: string,\n icon: string,\n group: DesignerComponentGroup,\n acceptsChildren: boolean,\n containerAppearance: DesignerComponentRegistration['containerAppearance'],\n defaultConfiguration: Record<string, unknown>,\n properties: DesignerPropertyDefinition[],\n availability: DesignerComponentRegistration['availability'] = 'AVAILABLE',\n unavailableReason = '',\n configurationVersion = containerAppearance === 'SURFACE' ? 2 : 1,\n): DesignerComponentRegistration {\n return registration(\n {\n componentType,\n name,\n icon,\n group,\n nodeKind: 'CONTAINER',\n semanticType: 'OBJECT',\n compatibleSemanticTypes: [],\n defaultConfiguration,\n defaultSpan: 24,\n defaultShowLabel: false,\n detailLabelPolicy: 'HIDE',\n containerAppearance,\n availability,\n unavailableReason,\n acceptsChildren,\n supportedEvents: componentType === 'button' ? ['CLICK'] : [],\n properties:\n containerAppearance === 'SURFACE'\n ? [...CONTAINER_APPEARANCE_PROPERTIES, ...properties]\n : properties,\n },\n configurationVersion,\n )\n}\n\nfunction unavailableField(\n componentType: string,\n name: string,\n icon: string,\n reason: string,\n): DesignerComponentRegistration {\n return field(\n componentType,\n name,\n icon,\n 'ADVANCED',\n 'FILE',\n { readonly: true },\n [],\n 24,\n 'UNAVAILABLE',\n reason,\n )\n}\n\nfunction unavailableContainer(\n componentType: string,\n name: string,\n icon: string,\n reason: string,\n): DesignerComponentRegistration {\n return container(\n componentType,\n name,\n icon,\n 'AUXILIARY',\n false,\n 'NONE',\n {},\n [],\n 'UNAVAILABLE',\n reason,\n )\n}\n\nfunction registration(\n source: Omit<DesignerComponentRegistration, 'configurationVersion'>,\n configurationVersion = 1,\n): DesignerComponentRegistration {\n return { ...source, configurationVersion }\n}\n\nfunction property(\n key: string,\n label: string,\n section: DesignerPropertyDefinition['section'],\n editor: DesignerPropertyEditor['type'] | DesignerPropertyEditor,\n extra: LegacyPropertyExtra = {},\n): DesignerPropertyDefinition {\n return {\n key,\n label,\n section,\n description: extra.description,\n editor: typeof editor === 'string' ? legacyPropertyEditor(editor, extra) : editor,\n }\n}\n\ninterface LegacyPropertyExtra {\n description?: string\n minimum?: number\n maximum?: number\n step?: number\n options?: DesignerPropertyOption[]\n visibleWhen?: (configuration: Readonly<Record<string, unknown>>) => boolean\n maxLength?: number\n unit?: string\n}\n\nfunction legacyPropertyEditor(\n type: DesignerPropertyEditor['type'],\n extra: LegacyPropertyExtra,\n): DesignerPropertyEditor {\n const shared = {\n visibleWhen: extra.visibleWhen,\n legacyValuePolicy: 'PRESERVE' as const,\n }\n if (type === 'TEXT') return { type, maxLength: extra.maxLength, ...shared }\n if (type === 'TEXTAREA') return { type, maxLength: extra.maxLength, ...shared }\n if (type === 'NUMBER') {\n return {\n type,\n minimum: extra.minimum,\n maximum: extra.maximum,\n step: extra.step,\n unit: extra.unit,\n ...shared,\n }\n }\n if (type === 'SELECT' || type === 'SEGMENTED') {\n return { type, options: extra.options ?? [], ...shared, legacyValuePolicy: 'REJECT' }\n }\n if (type === 'PRESET_NUMBER') {\n return {\n type,\n options: extra.options ?? [],\n minimum: extra.minimum,\n maximum: extra.maximum,\n unit: extra.unit,\n ...shared,\n }\n }\n if (type === 'DATE_FORMAT') return { type, sourceKey: 'dateType', ...shared }\n if (type === 'RESOURCE_REFERENCE') {\n return {\n type,\n resourceType: 'FORM',\n unavailableReason: '资源 Adapter 尚未接入',\n ...shared,\n }\n }\n if (type === 'GRID_SPAN') return { type, device: 'desktop', ...shared }\n if (type === 'GRID_OFFSET') return { type, spanKey: 'span', ...shared }\n if (type === 'URL') return { type, maxLength: extra.maxLength, ...shared }\n return { type, ...shared }\n}\n\nfunction selectOptions(\n values: Array<string | number | boolean>,\n labels: string[],\n): Array<{ label: string; value: string | number | boolean }> {\n return values.map((value, index) => ({ value, label: labels[index] ?? String(value) }))\n}\n\nfunction presetNumberEditor(\n options: DesignerPropertyOption[],\n minimum: number,\n maximum: number,\n extra: Pick<\n Extract<DesignerPropertyEditor, { type: 'PRESET_NUMBER' }>,\n 'unit' | 'visibleWhen'\n > = {},\n): DesignerPropertyEditor {\n return {\n type: 'PRESET_NUMBER',\n options,\n minimum,\n maximum,\n unit: extra.unit,\n visibleWhen: extra.visibleWhen,\n legacyValuePolicy: 'PRESERVE',\n }\n}\n\nfunction defaultOptions(): Array<{ label: string; value: string }> {\n return [\n { label: '选项一', value: 'option-1' },\n { label: '选项二', value: 'option-2' },\n { label: '选项三', value: 'option-3' },\n ]\n}\n\nfunction stepOptions(): Array<{ label: string; value: number }> {\n return [\n { label: '步骤一', value: 0 },\n { label: '步骤二', value: 1 },\n { label: '步骤三', value: 2 },\n ]\n}\n\nfunction cascadeOptions(): Array<{\n label: string\n value: string\n children?: Array<{ label: string; value: string }>\n}> {\n return [\n {\n label: '分类一',\n value: 'category-1',\n children: [\n { label: '子项一', value: 'category-1-1' },\n { label: '子项二', value: 'category-1-2' },\n ],\n },\n ]\n}\n\nfunction compatibleTypes(semanticType: DesignerSemanticType): DesignerSemanticType[] {\n if (semanticType === 'STRING') return ['STRING', 'REFERENCE']\n if (semanticType === 'LONG_TEXT') return ['LONG_TEXT', 'STRING']\n if (semanticType === 'NUMBER') return ['NUMBER']\n if (semanticType === 'BOOLEAN') return ['BOOLEAN']\n if (semanticType === 'DATE') return ['DATE', 'DATE_TIME']\n if (semanticType === 'DATE_TIME') return ['DATE_TIME', 'DATE']\n if (semanticType === 'FILE') return ['FILE']\n if (semanticType === 'REFERENCE') return ['REFERENCE', 'STRING', 'ARRAY', 'OBJECT']\n if (semanticType === 'ARRAY') return ['ARRAY', 'REFERENCE']\n return [semanticType]\n}\n","import { findDesignerComponent } from './component-registry'\nimport type { DesignerDocument, DesignerField, DesignerLayoutNode } from './types'\n\n/** 当前容器快捷栅格的影响预览。 */\nexport interface DesignerQuickGridPreview {\n targetLabel: string\n affectedNodeIds: string[]\n skippedCount: number\n}\n\n/** 计算当前节点所在容器的直接普通字段,不进入嵌套布局或子表。 */\nexport function previewDesignerQuickGrid(\n document: DesignerDocument,\n selectedNodeId: string,\n): DesignerQuickGridPreview {\n const target = resolveTargetCollection(document.uiSchema.root, selectedNodeId)\n const affectedNodeIds: string[] = []\n let skippedCount = 0\n for (const node of target.nodes) {\n if (node.nodeType !== 'FIELD' || node.layout.pc.span === 24) {\n skippedCount += 1\n continue\n }\n const field = document.dataSchema.fields.find((item) => item.id === node.fieldId)\n const registration = field ? findDesignerComponent(field.componentType) : undefined\n if (\n !field ||\n !registration ||\n registration.group === 'AUXILIARY' ||\n registration.group === 'SUBTABLE'\n ) {\n skippedCount += 1\n continue\n }\n affectedNodeIds.push(node.id)\n }\n return { targetLabel: target.label, affectedNodeIds, skippedCount }\n}\n\n/** 将预览中的直接字段设为统一 PC 跨度并清零偏移;移动布局保持不变。 */\nexport function applyDesignerQuickGrid(\n document: DesignerDocument,\n selectedNodeId: string,\n span: 24 | 12 | 8 | 6,\n): number {\n const preview = previewDesignerQuickGrid(document, selectedNodeId)\n if (preview.affectedNodeIds.length === 0) return 0\n const ids = new Set(preview.affectedNodeIds)\n const visit = (nodes: DesignerLayoutNode[]): void => {\n for (const node of nodes) {\n if (ids.has(node.id)) {\n node.layout.pc = { ...node.layout.pc, span, offset: 0 }\n }\n if (node.nodeType === 'CONTAINER') node.slots.forEach((slot) => visit(slot.children))\n }\n }\n visit(document.uiSchema.root)\n document.uiSchema.overlays.forEach((overlay) => visit(overlay.root))\n return ids.size\n}\n\n/** 返回允许批量设置默认值的语义字段。 */\nexport function collectDesignerBatchDefaultFields(document: DesignerDocument): DesignerField[] {\n return document.dataSchema.fields.filter((field) => {\n if (field.primaryKey || field.systemField || ['FILE', 'OBJECT'].includes(field.semanticType))\n return false\n const registration = findDesignerComponent(field.componentType)\n if (!registration || registration.availability !== 'AVAILABLE') return false\n if (field.semanticType === 'REFERENCE' && registration.group !== 'BASIC') return false\n return true\n })\n}\n\n/** 将勾选字段的默认值作为一个文档变更写入。 */\nexport function applyDesignerBatchDefaults(\n document: DesignerDocument,\n values: Record<string, unknown>,\n): number {\n const allowed = new Set(collectDesignerBatchDefaultFields(document).map((field) => field.id))\n let changed = 0\n for (const field of document.dataSchema.fields) {\n if (!allowed.has(field.id) || !(field.id in values)) continue\n field.defaultValue = cloneValue(values[field.id])\n changed += 1\n }\n return changed\n}\n\nfunction resolveTargetCollection(\n root: DesignerLayoutNode[],\n selectedNodeId: string,\n): { nodes: DesignerLayoutNode[]; label: string } {\n if (!selectedNodeId) return { nodes: root, label: '主表根画布' }\n const visit = (\n nodes: DesignerLayoutNode[],\n parentLabel: string,\n ): { nodes: DesignerLayoutNode[]; label: string } | undefined => {\n for (const node of nodes) {\n if (node.id === selectedNodeId) {\n if (node.nodeType === 'CONTAINER' && node.slots[0]) {\n const registration = findDesignerComponent(node.componentType)\n return { nodes: node.slots[0].children, label: registration?.name ?? '当前容器' }\n }\n return { nodes, label: parentLabel }\n }\n if (node.nodeType !== 'CONTAINER') continue\n const registration = findDesignerComponent(node.componentType)\n for (const slot of node.slots) {\n const found = visit(slot.children, `${registration?.name ?? '容器'} · ${slot.label}`)\n if (found) return found\n }\n }\n return undefined\n }\n return visit(root, '主表根画布') ?? { nodes: root, label: '主表根画布' }\n}\n\nfunction cloneValue(value: unknown): unknown {\n return value === undefined ? undefined : (JSON.parse(JSON.stringify(value)) as unknown)\n}\n","import type {\n DesignerCanvasCell,\n DesignerCanvasGap,\n DesignerCanvasProjection,\n DesignerDevice,\n DesignerLayoutNode,\n} from './types'\n\nconst GRID_COLUMNS = 24\n\n/**\n * 将顺序布局节点投影为只读 24 栅格行。\n *\n * 投影只负责设计态定位和空白落点,权威顺序、跨度与偏移仍保存在 UI Schema 中。\n *\n * @param nodes 当前根或命名插槽中的顺序节点。\n * @param device 当前设计设备。\n * @returns 可供画布渲染的节点单元、空白单元和总行数。\n */\nexport function projectDesignerCanvas(\n nodes: DesignerLayoutNode[],\n device: DesignerDevice,\n): DesignerCanvasProjection {\n const cells: DesignerCanvasCell[] = []\n const gaps: DesignerCanvasGap[] = []\n let row = 0\n let cursor = 0\n\n for (const [index, node] of nodes.entries()) {\n const grid = node.layout[device === 'mobile' ? 'mobile' : 'pc']\n const span = clampGridValue(grid.span, 1, GRID_COLUMNS)\n const offset = clampGridValue(grid.offset, 0, GRID_COLUMNS - 1)\n\n // 当前行剩余空间不足时换行;偏移在新行重新解释,避免节点溢出 24 栅格。\n if (cursor > 0 && cursor + offset + span > GRID_COLUMNS) {\n appendTrailingGap(gaps, row, cursor, index)\n row += 1\n cursor = 0\n }\n\n const start = Math.min(GRID_COLUMNS - span, cursor + offset)\n if (start > cursor) gaps.push({ index, row, start: cursor, span: start - cursor })\n cells.push({ nodeId: node.id, index, row, start, span })\n cursor = start + span\n\n if (cursor >= GRID_COLUMNS) {\n row += 1\n cursor = 0\n }\n }\n\n if (nodes.length === 0) return { cells, gaps, rowCount: 1 }\n if (cursor > 0) appendTrailingGap(gaps, row, cursor, nodes.length)\n return { cells, gaps, rowCount: Math.max(1, row + (cursor > 0 ? 1 : 0)) }\n}\n\nfunction appendTrailingGap(\n gaps: DesignerCanvasGap[],\n row: number,\n cursor: number,\n index: number,\n): void {\n if (cursor >= GRID_COLUMNS) return\n gaps.push({ index, row, start: cursor, span: GRID_COLUMNS - cursor })\n}\n\nfunction clampGridValue(value: number, minimum: number, maximum: number): number {\n if (!Number.isFinite(value)) return minimum\n return Math.max(minimum, Math.min(maximum, Math.trunc(value)))\n}\n","import { findDesignerComponent } from './component-registry'\nimport type {\n DesignerAppearance,\n DesignerContainerAppearanceDimension,\n DesignerContainerNode,\n DesignerContainerRadiusOverride,\n DesignerContainerStyleOverride,\n DesignerDocument,\n DesignerLayoutNode,\n DesignerRadiusPreset,\n} from './types'\n\n/** 设计与运行渲染器共同消费的容器外观解析结果。 */\nexport interface DesignerResolvedContainerAppearance {\n style: Exclude<DesignerContainerStyleOverride, 'INHERIT'>\n radius: DesignerRadiusPreset\n styleSource: 'FORM' | 'COMPONENT'\n radiusSource: 'FORM' | 'COMPONENT'\n}\n\n/**\n * 解析显式容器最终生效的表面样式和圆角。\n *\n * 非表面组件不会获得容器外观类;非法值由文档诊断拒绝,这里只提供渲染期保守回退。\n */\nexport function resolveDesignerContainerAppearance(\n appearance: DesignerAppearance,\n node: DesignerContainerNode,\n): DesignerResolvedContainerAppearance | undefined {\n const registration = findDesignerComponent(node.componentType)\n if (registration?.containerAppearance !== 'SURFACE') return undefined\n\n const styleOverride = normalizedStyleOverride(node.configuration.surfaceStyle)\n const radiusOverride = normalizedRadiusOverride(node.configuration.surfaceRadius)\n return {\n style: styleOverride === 'INHERIT' ? appearance.containerStyle : styleOverride,\n radius: radiusOverride === 'INHERIT' ? appearance.containerRadius : radiusOverride,\n styleSource: styleOverride === 'INHERIT' ? 'FORM' : 'COMPONENT',\n radiusSource: radiusOverride === 'INHERIT' ? 'FORM' : 'COMPONENT',\n }\n}\n\n/** 返回字段控件圆角对应的公共主题工具类。 */\nexport function designerControlRadiusClass(radius: DesignerRadiusPreset): string {\n return `daxiang-form-control-radius-${radius.toLowerCase()}`\n}\n\n/** 返回弹窗外壳圆角对应的公共主题工具类;旧内存态缺省时继续跟随系统。 */\nexport function designerDialogRadiusClass(radius: DesignerRadiusPreset | undefined): string {\n return `daxiang-form-dialog-radius-${(radius ?? 'THEME').toLowerCase()}`\n}\n\n/** 返回容器表面和圆角对应的公共主题工具类。 */\nexport function designerContainerAppearanceClasses(\n resolved: DesignerResolvedContainerAppearance | undefined,\n): string[] {\n if (!resolved) return []\n return [\n 'daxiang-form-container-surface',\n `is-surface-${resolved.style.toLowerCase()}`,\n `daxiang-form-container-radius-${resolved.radius.toLowerCase()}`,\n ]\n}\n\n/** 统计当前文档中支持表面外观的显式容器数量。 */\nexport function countDesignerSurfaceContainers(document: DesignerDocument): number {\n let count = 0\n visitSurfaceContainers(document.uiSchema.root, () => {\n count += 1\n })\n return count\n}\n\n/**\n * 将指定外观维度批量恢复为继承表单默认值。\n *\n * @returns 实际发生配置变化的容器数量。\n */\nexport function applyDesignerContainerAppearanceInheritance(\n document: DesignerDocument,\n dimensions: readonly DesignerContainerAppearanceDimension[],\n): number {\n const selected = new Set(dimensions)\n let changed = 0\n visitSurfaceContainers(document.uiSchema.root, (node) => {\n let nodeChanged = false\n const configuration = { ...node.configuration }\n if (selected.has('STYLE') && configuration.surfaceStyle !== 'INHERIT') {\n configuration.surfaceStyle = 'INHERIT'\n nodeChanged = true\n }\n if (selected.has('RADIUS') && configuration.surfaceRadius !== 'INHERIT') {\n configuration.surfaceRadius = 'INHERIT'\n nodeChanged = true\n }\n if (!nodeChanged) return\n node.configuration = configuration\n changed += 1\n })\n return changed\n}\n\nfunction visitSurfaceContainers(\n nodes: DesignerLayoutNode[],\n visitor: (node: DesignerContainerNode) => void,\n): void {\n for (const node of nodes) {\n if (node.nodeType !== 'CONTAINER') continue\n if (findDesignerComponent(node.componentType)?.containerAppearance === 'SURFACE') visitor(node)\n for (const slot of node.slots) visitSurfaceContainers(slot.children, visitor)\n }\n}\n\nfunction normalizedStyleOverride(value: unknown): DesignerContainerStyleOverride {\n return ['INHERIT', 'NONE', 'BORDERED', 'SHADOW', 'FILLED'].includes(String(value))\n ? (value as DesignerContainerStyleOverride)\n : 'INHERIT'\n}\n\nfunction normalizedRadiusOverride(value: unknown): DesignerContainerRadiusOverride {\n return ['INHERIT', 'THEME', 'NONE', 'SMALL', 'BASE', 'LARGE'].includes(String(value))\n ? (value as DesignerContainerRadiusOverride)\n : 'INHERIT'\n}\n","import type {\n DesignerDiagnostic,\n DesignerDocument,\n DesignerExpression,\n DesignerExpressionFunction,\n DesignerExpressionRuntimeContext,\n DesignerField,\n} from './types'\n\nconst MAX_EXPRESSION_DEPTH = 20\nconst MAX_EXPRESSION_NODES = 200\n\n/** 计算声明式表达式;未知函数、越界深度或非法数值运算会失败关闭。 */\nexport function evaluateDesignerExpression(\n expression: DesignerExpression,\n runtime: DesignerExpressionRuntimeContext,\n): unknown {\n let visited = 0\n const evaluate = (node: DesignerExpression, depth: number): unknown => {\n visited += 1\n if (depth > MAX_EXPRESSION_DEPTH || visited > MAX_EXPRESSION_NODES) {\n throw new Error('表达式复杂度超过限制')\n }\n if (node.kind === 'LITERAL') return node.value\n if (node.kind === 'FIELD') {\n return node.scope === 'CURRENT_ROW'\n ? runtime.currentRow?.[node.fieldId]\n : runtime.fields[node.fieldId]\n }\n if (node.kind === 'VARIABLE') return runtime.variables[node.variableCode]\n if (node.kind === 'CONTEXT') return runtime.context[node.key]\n const values = node.arguments.map((argument) => evaluate(argument, depth + 1))\n return evaluateCall(node.function, values)\n }\n return evaluate(expression, 0)\n}\n\n/** 将表达式结果按布尔条件解释;异常和非布尔结果一律视为不成立。 */\nexport function evaluateDesignerCondition(\n expression: DesignerExpression | undefined,\n runtime: DesignerExpressionRuntimeContext,\n): boolean {\n if (!expression) return true\n try {\n return evaluateDesignerExpression(expression, runtime) === true\n } catch {\n return false\n }\n}\n\n/** 收集表达式直接读取的字段主键。 */\nexport function collectDesignerExpressionFieldIds(expression: DesignerExpression): Set<string> {\n const result = new Set<string>()\n const visit = (node: DesignerExpression): void => {\n if (node.kind === 'FIELD') result.add(node.fieldId)\n if (node.kind === 'CALL') node.arguments.forEach(visit)\n }\n visit(expression)\n return result\n}\n\n/** 诊断表达式节点、字段/变量引用、作用域和复杂度。 */\nexport function diagnoseDesignerExpression(\n expression: unknown,\n document: DesignerDocument,\n path: string,\n options: { allowCurrentRow: boolean } = { allowCurrentRow: false },\n): DesignerDiagnostic[] {\n const diagnostics: DesignerDiagnostic[] = []\n const fieldIds = new Set(\n Array.isArray(document.dataSchema?.fields)\n ? document.dataSchema.fields.map((field) => field.id)\n : [],\n )\n const fieldsById = new Map(\n Array.isArray(document.dataSchema?.fields)\n ? document.dataSchema.fields.map((field) => [field.id, field] as const)\n : [],\n )\n const variableCodes = new Set(\n Array.isArray(document.variables) ? document.variables.map((variable) => variable.code) : [],\n )\n let visited = 0\n const visit = (node: unknown, nodePath: string, depth: number): void => {\n visited += 1\n if (depth > MAX_EXPRESSION_DEPTH || visited > MAX_EXPRESSION_NODES) {\n diagnostics.push(error('EXPRESSION_COMPLEXITY', '表达式复杂度超过限制', nodePath))\n return\n }\n if (!isRecord(node) || typeof node.kind !== 'string') {\n diagnostics.push(error('EXPRESSION_NODE', '表达式节点必须是带 kind 的对象', nodePath))\n return\n }\n if (node.kind === 'LITERAL') {\n unknownKeys(node, ['kind', 'value'], nodePath, diagnostics)\n if (!isLiteral(node.value))\n diagnostics.push(error('EXPRESSION_LITERAL', '字面量类型不受支持', nodePath))\n return\n }\n if (node.kind === 'FIELD') {\n unknownKeys(node, ['kind', 'fieldId', 'scope'], nodePath, diagnostics)\n if (typeof node.fieldId !== 'string' || !fieldIds.has(node.fieldId)) {\n diagnostics.push(\n error('EXPRESSION_FIELD', '表达式引用了不存在的字段', `${nodePath}.fieldId`),\n )\n }\n if (!['ROOT', 'CURRENT_ROW'].includes(String(node.scope))) {\n diagnostics.push(error('EXPRESSION_SCOPE', '字段表达式作用域不正确', `${nodePath}.scope`))\n } else if (node.scope === 'CURRENT_ROW' && !options.allowCurrentRow) {\n diagnostics.push(\n error('EXPRESSION_SCOPE', '当前上下文不允许读取子表当前行', `${nodePath}.scope`),\n )\n } else {\n const field = fieldsById.get(String(node.fieldId))\n const rootEntityCode = document.dataSchema?.rootEntity?.code\n if (\n field &&\n rootEntityCode &&\n node.scope === 'CURRENT_ROW' &&\n field.entityCode === rootEntityCode\n ) {\n diagnostics.push(\n error('EXPRESSION_SCOPE', '当前行作用域只能读取子实体字段', `${nodePath}.scope`),\n )\n }\n if (\n field &&\n rootEntityCode &&\n node.scope === 'ROOT' &&\n field.entityCode !== rootEntityCode\n ) {\n diagnostics.push(\n error('EXPRESSION_SCOPE', '主表作用域不能读取子实体字段', `${nodePath}.scope`),\n )\n }\n }\n return\n }\n if (node.kind === 'VARIABLE') {\n unknownKeys(node, ['kind', 'variableCode'], nodePath, diagnostics)\n if (typeof node.variableCode !== 'string' || !variableCodes.has(node.variableCode)) {\n diagnostics.push(\n error('EXPRESSION_VARIABLE', '表达式引用了不存在的表单变量', `${nodePath}.variableCode`),\n )\n }\n return\n }\n if (node.kind === 'CONTEXT') {\n unknownKeys(node, ['kind', 'key'], nodePath, diagnostics)\n if (\n !['RUNTIME_MODE', 'DEVICE', 'CURRENT_USER_ID', 'CURRENT_TENANT_ID', 'NOW'].includes(\n String(node.key),\n )\n ) {\n diagnostics.push(error('EXPRESSION_CONTEXT', '表达式上下文键不受支持', `${nodePath}.key`))\n }\n return\n }\n if (node.kind === 'CALL') {\n unknownKeys(node, ['kind', 'function', 'arguments'], nodePath, diagnostics)\n if (!isDesignerExpressionFunction(node.function)) {\n diagnostics.push(error('EXPRESSION_FUNCTION', '表达式函数不受支持', `${nodePath}.function`))\n }\n if (!Array.isArray(node.arguments)) {\n diagnostics.push(\n error('EXPRESSION_ARGUMENTS', '表达式参数必须是数组', `${nodePath}.arguments`),\n )\n return\n }\n if (\n isDesignerExpressionFunction(node.function) &&\n !validFunctionArgumentCount(node.function, node.arguments.length)\n ) {\n diagnostics.push(\n error('EXPRESSION_ARITY', '表达式函数参数数量不正确', `${nodePath}.arguments`),\n )\n }\n node.arguments.forEach((argument, index) =>\n visit(argument, `${nodePath}.arguments[${index}]`, depth + 1),\n )\n return\n }\n diagnostics.push(error('EXPRESSION_KIND', `不支持表达式节点 ${node.kind}`, `${nodePath}.kind`))\n }\n visit(expression, path, 0)\n return diagnostics\n}\n\n/** 诊断字段计算依赖,并返回可安全执行的拓扑顺序。 */\nexport function resolveDesignerFieldEvaluationOrder(document: DesignerDocument): {\n orderedFields: DesignerField[]\n diagnostics: DesignerDiagnostic[]\n} {\n const fieldsWithRules = document.dataSchema.fields.filter(\n (field) => field.behavior.valueRules.length > 0,\n )\n const byId = new Map(fieldsWithRules.map((field) => [field.id, field]))\n const dependencies = new Map<string, Set<string>>()\n for (const field of fieldsWithRules) {\n const fieldDependencies = new Set<string>()\n for (const rule of field.behavior.valueRules) {\n for (const fieldId of collectDesignerExpressionFieldIds(rule.expression)) {\n if (byId.has(fieldId)) fieldDependencies.add(fieldId)\n }\n if (rule.condition) {\n for (const fieldId of collectDesignerExpressionFieldIds(rule.condition)) {\n if (byId.has(fieldId)) fieldDependencies.add(fieldId)\n }\n }\n }\n dependencies.set(field.id, fieldDependencies)\n }\n const orderedFields: DesignerField[] = []\n const diagnostics: DesignerDiagnostic[] = []\n const visiting = new Set<string>()\n const visited = new Set<string>()\n const visit = (fieldId: string, trail: string[]): void => {\n if (visited.has(fieldId)) return\n if (visiting.has(fieldId)) {\n diagnostics.push(\n error(\n 'FIELD_VALUE_RULE_CYCLE',\n `字段计算存在循环依赖:${[...trail, fieldId].join(' → ')}`,\n '$.dataSchema.fields',\n ),\n )\n return\n }\n visiting.add(fieldId)\n for (const dependency of dependencies.get(fieldId) ?? []) visit(dependency, [...trail, fieldId])\n visiting.delete(fieldId)\n visited.add(fieldId)\n const field = byId.get(fieldId)\n if (field) orderedFields.push(field)\n }\n fieldsWithRules.forEach((field) => visit(field.id, []))\n return { orderedFields, diagnostics }\n}\n\nfunction evaluateCall(name: DesignerExpressionFunction, values: unknown[]): unknown {\n if (name === 'AND') return values.every(Boolean)\n if (name === 'OR') return values.some(Boolean)\n if (name === 'NOT') return !values[0]\n if (name === 'EQ') return values[0] === values[1]\n if (name === 'NE') return values[0] !== values[1]\n if (name === 'GT') return comparable(values[0]) > comparable(values[1])\n if (name === 'GTE') return comparable(values[0]) >= comparable(values[1])\n if (name === 'LT') return comparable(values[0]) < comparable(values[1])\n if (name === 'LTE') return comparable(values[0]) <= comparable(values[1])\n if (name === 'EMPTY') return isEmpty(values[0])\n if (name === 'NOT_EMPTY') return !isEmpty(values[0])\n if (name === 'IN') return Array.isArray(values[1]) && values[1].includes(values[0])\n if (name === 'CONTAINS') {\n return typeof values[0] === 'string'\n ? values[0].includes(String(values[1] ?? ''))\n : Array.isArray(values[0]) && values[0].includes(values[1])\n }\n if (name === 'ADD') return numeric(values[0]) + numeric(values[1])\n if (name === 'SUBTRACT') return numeric(values[0]) - numeric(values[1])\n if (name === 'MULTIPLY') return numeric(values[0]) * numeric(values[1])\n if (name === 'DIVIDE') {\n const divisor = numeric(values[1])\n if (divisor === 0) throw new Error('除数不能为零')\n return numeric(values[0]) / divisor\n }\n if (name === 'CONCAT') return values.map((value) => String(value ?? '')).join('')\n if (name === 'COALESCE') return values.find((value) => !isEmpty(value)) ?? null\n if (name === 'LENGTH')\n return typeof values[0] === 'string' || Array.isArray(values[0]) ? values[0].length : 0\n if (name === 'IF') return values[0] ? values[1] : values[2]\n throw new Error(`不支持表达式函数 ${name}`)\n}\n\nfunction numeric(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) throw new Error('表达式数值参数不正确')\n return value\n}\n\nfunction comparable(value: unknown): number | string {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string') return value\n throw new Error('表达式比较参数不正确')\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n )\n}\n\nfunction isLiteral(value: unknown): boolean {\n return value === null || ['string', 'number', 'boolean'].includes(typeof value)\n}\n\nfunction isDesignerExpressionFunction(value: unknown): boolean {\n return [\n 'AND',\n 'OR',\n 'NOT',\n 'EQ',\n 'NE',\n 'GT',\n 'GTE',\n 'LT',\n 'LTE',\n 'EMPTY',\n 'NOT_EMPTY',\n 'IN',\n 'CONTAINS',\n 'ADD',\n 'SUBTRACT',\n 'MULTIPLY',\n 'DIVIDE',\n 'CONCAT',\n 'COALESCE',\n 'LENGTH',\n 'IF',\n ].includes(String(value))\n}\n\nfunction validFunctionArgumentCount(value: unknown, count: number): boolean {\n if (['NOT', 'EMPTY', 'NOT_EMPTY', 'LENGTH'].includes(String(value))) return count === 1\n if (value === 'IF') return count === 3\n if (['AND', 'OR', 'CONCAT', 'COALESCE'].includes(String(value))) return count >= 2 && count <= 8\n return count === 2\n}\n\nfunction unknownKeys(\n source: Record<string, unknown>,\n allowedKeys: string[],\n path: string,\n diagnostics: DesignerDiagnostic[],\n): void {\n const allowed = new Set(allowedKeys)\n for (const key of Object.keys(source)) {\n if (!allowed.has(key))\n diagnostics.push(error('EXPRESSION_UNKNOWN_PROPERTY', `不支持属性 ${key}`, `${path}.${key}`))\n }\n}\n\nfunction error(code: string, message: string, path: string): DesignerDiagnostic {\n return { severity: 'ERROR', code, message, path }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import {\n collectDesignerExpressionFieldIds,\n evaluateDesignerCondition,\n evaluateDesignerExpression,\n resolveDesignerFieldEvaluationOrder,\n} from './expression'\nimport type {\n DesignerDocument,\n DesignerExpression,\n DesignerExpressionRuntimeContext,\n DesignerField,\n DesignerFieldFeedback,\n DesignerFieldValueRule,\n DesignerLinkageConfirmationAdapter,\n DesignerRemoteValidationAdapter,\n DesignerResolvedFieldState,\n DesignerRuntimeValueStore,\n DesignerValidationResult,\n DesignerValidationRule,\n} from './types'\n\n/** 为根字段、模块字段或子表行生成互不冲突的反馈键。 */\nexport function createDesignerFieldFeedbackKey(\n fieldId: string,\n context: { viewCode?: string; containerId?: string; rowId?: string } = {},\n): string {\n return [\n context.viewCode ?? 'main',\n context.containerId ?? 'root',\n context.rowId ?? 'root',\n fieldId,\n ].join(':')\n}\n\n/** 将同一字段的一组验证结果折叠为错误与警告双通道。 */\nexport function projectDesignerFieldFeedback(\n results: DesignerValidationResult[],\n): DesignerFieldFeedback | undefined {\n const error = results.find((item) => item.severity === 'ERROR')?.message\n const warning = results.find((item) => item.severity === 'WARNING')?.message\n return error || warning ? { error, warning } : undefined\n}\n\n/** 根据静态配置和条件规则计算字段最终显示、必填及禁用状态。 */\nexport function resolveDesignerFieldState(\n field: DesignerField,\n runtime: DesignerExpressionRuntimeContext,\n): DesignerResolvedFieldState {\n const state: DesignerResolvedFieldState = {\n visible: field.componentType !== 'hidden' && !field.display.hidden,\n required: field.required,\n disabled:\n field.display.readonly || field.behavior.valueRules.some((rule) => rule.mode === 'FORMULA'),\n }\n for (const rule of field.behavior.stateRules) {\n const value = evaluateDesignerCondition(rule.condition, runtime)\n ? rule.valueWhenTrue\n : (rule.valueWhenFalse ?? stateTargetValue(state, rule.target))\n if (rule.target === 'VISIBLE') state.visible = value\n if (rule.target === 'REQUIRED') state.required = value\n if (rule.target === 'DISABLED') state.disabled = value\n }\n if (field.behavior.valueRules.some((rule) => rule.mode === 'FORMULA')) state.disabled = true\n return state\n}\n\n/** 按依赖拓扑执行字段计算与联动,并直接更新当前运行值副本。 */\nexport async function applyDesignerValueRules(\n document: DesignerDocument,\n valueStore: DesignerRuntimeValueStore,\n runtime: Omit<DesignerExpressionRuntimeContext, 'fields'>,\n options: {\n phase?: 'INITIALIZE' | 'CHANGE'\n changedFieldIds?: Iterable<string>\n confirmationAdapter?: DesignerLinkageConfirmationAdapter\n } = {},\n): Promise<string[]> {\n const { orderedFields, diagnostics } = resolveDesignerFieldEvaluationOrder(document)\n if (diagnostics.length > 0) return diagnostics.map((item) => item.message)\n const failures: string[] = []\n const phase = options.phase ?? 'INITIALIZE'\n const dirtyFieldIds = new Set(options.changedFieldIds ?? [])\n for (const field of orderedFields) {\n if (field.entityCode !== document.dataSchema.rootEntity.code) continue\n for (const rule of field.behavior.valueRules) {\n if (!shouldExecuteValueRule(rule, phase, dirtyFieldIds)) continue\n const context: DesignerExpressionRuntimeContext = { ...runtime, fields: valueStore.fields }\n if (rule.condition && !evaluateDesignerCondition(rule.condition, context)) continue\n try {\n const nextValue = cloneValue(evaluateDesignerExpression(rule.expression, context))\n const currentValue = valueStore.fields[field.id]\n const writeDecision = allowsValueRuleWrite(\n rule,\n field,\n currentValue,\n nextValue,\n phase,\n options.confirmationAdapter,\n failures,\n )\n if (!(typeof writeDecision === 'boolean' ? writeDecision : await writeDecision)) {\n continue\n }\n if (!valuesEqual(currentValue, nextValue)) {\n valueStore.fields[field.id] = nextValue\n dirtyFieldIds.add(field.id)\n }\n } catch (error) {\n failures.push(`${field.label}:${error instanceof Error ? error.message : '计算失败'}`)\n }\n }\n }\n return failures\n}\n\n/** 按依赖拓扑执行一个子实体当前行的计算规则,并把结果写回该行值副本。 */\nexport async function applyDesignerCurrentRowValueRules(\n document: DesignerDocument,\n rowValues: Record<string, unknown>,\n entityCode: string,\n runtime: Omit<DesignerExpressionRuntimeContext, 'currentRow'>,\n options: {\n phase?: 'INITIALIZE' | 'CHANGE'\n changedFieldIds?: Iterable<string>\n confirmationAdapter?: DesignerLinkageConfirmationAdapter\n } = {},\n): Promise<string[]> {\n const { orderedFields, diagnostics } = resolveDesignerFieldEvaluationOrder(document)\n if (diagnostics.length > 0) return diagnostics.map((item) => item.message)\n const failures: string[] = []\n const phase = options.phase ?? 'INITIALIZE'\n const dirtyFieldIds = new Set(options.changedFieldIds ?? [])\n for (const field of orderedFields) {\n if (field.entityCode !== entityCode) continue\n for (const rule of field.behavior.valueRules) {\n if (!shouldExecuteValueRule(rule, phase, dirtyFieldIds)) continue\n const context: DesignerExpressionRuntimeContext = { ...runtime, currentRow: rowValues }\n if (rule.condition && !evaluateDesignerCondition(rule.condition, context)) continue\n try {\n const nextValue = cloneValue(evaluateDesignerExpression(rule.expression, context))\n const currentValue = rowValues[field.id]\n const writeDecision = allowsValueRuleWrite(\n rule,\n field,\n currentValue,\n nextValue,\n phase,\n options.confirmationAdapter,\n failures,\n )\n if (!(typeof writeDecision === 'boolean' ? writeDecision : await writeDecision)) {\n continue\n }\n if (!valuesEqual(currentValue, nextValue)) {\n rowValues[field.id] = nextValue\n dirtyFieldIds.add(field.id)\n }\n } catch (error) {\n failures.push(`${field.label}:${error instanceof Error ? error.message : '计算失败'}`)\n }\n }\n }\n return failures\n}\n\nfunction shouldExecuteValueRule(\n rule: DesignerFieldValueRule,\n phase: 'INITIALIZE' | 'CHANGE',\n dirtyFieldIds: Set<string>,\n): boolean {\n if (phase === 'INITIALIZE') return true\n const dependencies = collectDesignerExpressionFieldIds(rule.expression)\n if (rule.condition) {\n for (const fieldId of collectDesignerExpressionFieldIds(rule.condition))\n dependencies.add(fieldId)\n }\n return [...dependencies].some((fieldId) => dirtyFieldIds.has(fieldId))\n}\n\nfunction allowsValueRuleWrite(\n rule: DesignerFieldValueRule,\n field: DesignerField,\n currentValue: unknown,\n nextValue: unknown,\n phase: 'INITIALIZE' | 'CHANGE',\n confirmationAdapter: DesignerLinkageConfirmationAdapter | undefined,\n failures: string[],\n): boolean | Promise<boolean> {\n if (rule.mode === 'FORMULA' || isEmpty(currentValue)) return true\n if (rule.overwritePolicy === 'ALWAYS') return true\n if (rule.overwritePolicy === 'EMPTY_ONLY' || phase === 'INITIALIZE') return false\n if (!confirmationAdapter) {\n failures.push(`${field.label}:当前 Host 未提供联动确认能力,已保留原值`)\n return false\n }\n return confirmationAdapter\n .confirmOverwrite({\n fieldId: field.id,\n fieldLabel: field.label,\n currentValue,\n nextValue,\n })\n .catch(() => {\n failures.push(`${field.label}:联动覆盖确认失败,已保留原值`)\n return false\n })\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true\n try {\n return JSON.stringify(left) === JSON.stringify(right)\n } catch {\n return false\n }\n}\n\n/** 按触发时机验证一个字段;必填验证与规则验证互相独立。 */\nexport async function validateDesignerField(\n field: DesignerField,\n value: unknown,\n trigger: DesignerValidationRule['trigger'],\n runtime: DesignerExpressionRuntimeContext,\n options: {\n state?: DesignerResolvedFieldState\n remoteAdapter?: DesignerRemoteValidationAdapter\n collectionRows?: number\n } = {},\n): Promise<DesignerValidationResult[]> {\n const state = options.state ?? resolveDesignerFieldState(field, runtime)\n if (!state.visible || state.disabled) return []\n const results: DesignerValidationResult[] = []\n if (state.required && isEmpty(value)) {\n results.push({\n fieldId: field.id,\n ruleId: 'required',\n severity: 'ERROR',\n message: field.validation.message || `${field.label}为必填项`,\n })\n }\n for (const rule of field.behavior.validationRules) {\n if (!rule.enabled || rule.trigger !== trigger) continue\n if (isEmpty(value) && rule.type !== 'SUBTABLE') continue\n if (rule.condition && !evaluateDesignerCondition(rule.condition, runtime)) continue\n const failure = await validateRule(field, rule, value, runtime, options)\n if (failure) {\n results.push({\n fieldId: field.id,\n ruleId: rule.id,\n severity: rule.severity,\n message: rule.message || failure,\n })\n }\n }\n return results\n}\n\n/** 校验安全正则文本,拒绝回溯风险结构、反向引用和超长模式。 */\nexport function isSafeDesignerRegularExpression(pattern: string): boolean {\n if (!pattern || pattern.length > 200) return false\n if (/\\\\[1-9]|\\(\\?<([=!])|\\(\\?>|\\(\\?\\(/.test(pattern)) return false\n if (/\\([^)]*[+*][^)]*\\)[+*{]/.test(pattern)) return false\n try {\n void new RegExp(pattern)\n return true\n } catch {\n return false\n }\n}\n\nasync function validateRule(\n field: DesignerField,\n rule: DesignerValidationRule,\n value: unknown,\n runtime: DesignerExpressionRuntimeContext,\n options: {\n remoteAdapter?: DesignerRemoteValidationAdapter\n collectionRows?: number\n },\n): Promise<string> {\n const configuration = rule.configuration as unknown as Record<string, unknown>\n if (rule.type === 'LENGTH') {\n const length = valueLength(value)\n const minimum = finiteNumber(configuration.minimum)\n const maximum = finiteNumber(configuration.maximum)\n if (minimum !== undefined && length < minimum) return `长度不能少于 ${minimum}`\n if (maximum !== undefined && length > maximum) return `长度不能超过 ${maximum}`\n }\n if (rule.type === 'RANGE') {\n const number = finiteNumber(value)\n if (number === undefined) return '请输入有效数值'\n const minimum = finiteNumber(configuration.minimum)\n const maximum = finiteNumber(configuration.maximum)\n if (minimum !== undefined && number < minimum) return `不能小于 ${minimum}`\n if (maximum !== undefined && number > maximum) return `不能大于 ${maximum}`\n }\n if (rule.type === 'PRECISION') {\n const scale = finiteNumber(configuration.scale)\n if (scale !== undefined && decimalPlaces(value) > scale) return `小数位数不能超过 ${scale}`\n }\n if (rule.type === 'FORMAT') {\n const text = String(value)\n const format = String(configuration.format ?? '')\n if (format === 'EMAIL' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(text)) return '邮箱格式不正确'\n if (format === 'PHONE' && !/^\\+?[0-9][0-9\\s-]{5,19}$/.test(text)) return '电话号码格式不正确'\n if (format === 'IDENTIFIER' && !/^[A-Za-z][A-Za-z0-9_]{0,63}$/.test(text))\n return '编码格式不正确'\n }\n if (rule.type === 'REGEX') {\n const pattern = String(configuration.pattern ?? '')\n if (!isSafeDesignerRegularExpression(pattern)) return '正则表达式不安全或无效'\n if (!new RegExp(pattern).test(String(value))) return '输入内容格式不正确'\n }\n if (rule.type === 'DATE') {\n const timestamp = Date.parse(String(value))\n if (!Number.isFinite(timestamp)) return '日期格式不正确'\n const minimum = Date.parse(String(configuration.minimum ?? ''))\n const maximum = Date.parse(String(configuration.maximum ?? ''))\n if (Number.isFinite(minimum) && timestamp < minimum) return '日期早于允许范围'\n if (Number.isFinite(maximum) && timestamp > maximum) return '日期晚于允许范围'\n }\n if (rule.type === 'SELECTION') {\n const count = Array.isArray(value) ? value.length : 1\n const minimum = finiteNumber(configuration.minimum)\n const maximum = finiteNumber(configuration.maximum)\n if (minimum !== undefined && count < minimum) return `至少选择 ${minimum} 项`\n if (maximum !== undefined && count > maximum) return `最多选择 ${maximum} 项`\n }\n if (rule.type === 'FILE') {\n const files = Array.isArray(value) ? value : [value]\n const maximumCount = finiteNumber(configuration.maximumCount)\n if (maximumCount !== undefined && files.length > maximumCount)\n return `最多上传 ${maximumCount} 个文件`\n const maximumSizeMb = finiteNumber(configuration.maximumSizeMb)\n if (\n maximumSizeMb !== undefined &&\n files.some((file) => {\n if (!isRecord(file)) return false\n const size = finiteNumber(file.size)\n return size !== undefined && size > maximumSizeMb * 1024 * 1024\n })\n ) {\n return `单个文件不能超过 ${maximumSizeMb} MB`\n }\n const accept = String(configuration.accept ?? '').trim()\n if (accept && files.some((file) => !matchesAcceptedFile(file, accept)))\n return '文件类型不符合要求'\n }\n if (rule.type === 'COMPARE_FIELD') {\n const targetFieldId = String(configuration.fieldId ?? '')\n const operator = String(configuration.operator ?? 'EQ')\n const target = runtime.fields[targetFieldId]\n const valid = compare(value, target, operator)\n if (!valid) return `与${field.label}关联的字段比较未通过`\n }\n if (rule.type === 'EXPRESSION') {\n const expression = configuration.expression\n if (!isRecord(expression)) return '验证表达式缺失'\n try {\n if (\n evaluateDesignerExpression(expression as unknown as DesignerExpression, runtime) !== true\n ) {\n return '表达式验证未通过'\n }\n } catch {\n return '表达式验证执行失败'\n }\n }\n if (rule.type === 'SUBTABLE') {\n const rows = options.collectionRows ?? 0\n const minimumRows = finiteNumber(configuration.minimumRows)\n const maximumRows = finiteNumber(configuration.maximumRows)\n if (minimumRows !== undefined && rows < minimumRows) return `子表至少需要 ${minimumRows} 行`\n if (maximumRows !== undefined && rows > maximumRows) return `子表最多允许 ${maximumRows} 行`\n }\n if (rule.type === 'REMOTE') {\n const provider = String(configuration.provider ?? '')\n const validatorId = String(configuration.validatorId ?? '')\n if (!provider || !validatorId) return '远程验证来源未配置'\n if (!options.remoteAdapter) return '当前 Host 未提供远程验证能力'\n try {\n const result = await options.remoteAdapter.validate({\n provider,\n validatorId,\n value,\n fieldId: field.id,\n })\n if (!result.valid) return result.message || '远程验证未通过'\n } catch {\n return '远程验证执行失败'\n }\n }\n return ''\n}\n\nfunction stateTargetValue(\n state: DesignerResolvedFieldState,\n target: DesignerFieldStateRuleTarget,\n): boolean {\n if (target === 'VISIBLE') return state.visible\n if (target === 'REQUIRED') return state.required\n return state.disabled\n}\n\ntype DesignerFieldStateRuleTarget = 'VISIBLE' | 'REQUIRED' | 'DISABLED'\n\nfunction compare(left: unknown, right: unknown, operator: string): boolean {\n if (operator === 'EQ') return left === right\n if (operator === 'NE') return left !== right\n if (typeof left !== 'number' || typeof right !== 'number') return false\n if (operator === 'GT') return left > right\n if (operator === 'GTE') return left >= right\n if (operator === 'LT') return left < right\n if (operator === 'LTE') return left <= right\n return false\n}\n\nfunction valueLength(value: unknown): number {\n if (typeof value === 'string' || Array.isArray(value)) return value.length\n return String(value ?? '').length\n}\n\nfunction decimalPlaces(value: unknown): number {\n const text = String(value)\n const dot = text.indexOf('.')\n return dot < 0 ? 0 : text.length - dot - 1\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n )\n}\n\nfunction matchesAcceptedFile(value: unknown, accept: string): boolean {\n if (!isRecord(value)) return false\n const name = typeof value.name === 'string' ? value.name.toLowerCase() : ''\n const mimeType = typeof value.type === 'string' ? value.type.toLowerCase() : ''\n return accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n .some((item) => {\n if (item.startsWith('.')) return name.endsWith(item)\n if (item.endsWith('/*')) return mimeType.startsWith(item.slice(0, -1))\n return mimeType === item\n })\n}\n\nfunction cloneValue(value: unknown): unknown {\n if (value === undefined || value === null) return value\n if (typeof globalThis.structuredClone === 'function') {\n try {\n return globalThis.structuredClone(value)\n } catch {\n // 文件句柄等宿主对象无法结构化克隆时,保留原值交由控件自身管理。\n }\n }\n return value\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { findDesignerComponent } from './component-registry'\nimport { diagnoseDesignerExpression, resolveDesignerFieldEvaluationOrder } from './expression'\nimport { isSafeDesignerRegularExpression } from './validation'\nimport type {\n DesignerActionBar,\n DesignerDiagnostic,\n DesignerDocument,\n DesignerEventActionType,\n DesignerFieldBehavior,\n DesignerLayoutNode,\n DesignerSubmitPolicy,\n} from './types'\n\n/** 新文档默认动作栏:只显示底部右侧提交按钮。 */\nexport const DEFAULT_DESIGNER_ACTION_BAR: DesignerActionBar = {\n visible: true,\n position: 'BOTTOM',\n align: 'RIGHT',\n buttons: [\n { action: 'SUBMIT', label: '提交', enabled: true },\n { action: 'RESET', label: '重置', enabled: false },\n { action: 'PRINT', label: '打印', enabled: false },\n ],\n}\n\n/** 新旧文档共用的默认提交策略;普通隐藏字段默认仍参与提交。 */\nexport const DEFAULT_DESIGNER_SUBMIT_POLICY: DesignerSubmitPolicy = {\n ignoreHiddenFields: false,\n}\n\n/** 创建字段高级行为默认值。 */\nexport function createDefaultDesignerFieldBehavior(): DesignerFieldBehavior {\n return {\n stateRules: [],\n valueRules: [],\n validationRules: [],\n submitBehavior: 'AUTO',\n eventBindings: {},\n }\n}\n\n/**\n * 在克隆后的文档中补齐高级协议默认值。\n *\n * 旧文档动作栏保持隐藏以维持历史视觉;旧基础校验转换为稳定规则,但不会修改调用方原对象。\n */\nexport function normalizeDesignerAdvancedDocument(source: Record<string, unknown>): void {\n const uiSchema = isRecord(source.uiSchema) ? source.uiSchema : undefined\n if (uiSchema && !('overlays' in uiSchema)) uiSchema.overlays = []\n if (uiSchema && Array.isArray(uiSchema.overlays)) {\n for (const overlay of uiSchema.overlays) {\n if (!isRecord(overlay)) continue\n if (!('radius' in overlay)) overlay.radius = 'THEME'\n if (!('maxHeightPreset' in overlay)) overlay.maxHeightPreset = 'VIEWPORT'\n }\n }\n if (!('submitPolicy' in source)) source.submitPolicy = { ...DEFAULT_DESIGNER_SUBMIT_POLICY }\n if (!('actionBar' in source)) {\n source.actionBar = { ...DEFAULT_DESIGNER_ACTION_BAR, visible: false, buttons: [] }\n }\n if (!('variables' in source)) source.variables = []\n if (!('dataSources' in source)) source.dataSources = []\n if (!('eventFlows' in source)) source.eventFlows = []\n if (!('i18n' in source)) {\n source.i18n = { enabled: false, defaultLocale: 'zh-CN', locales: ['zh-CN'], entries: [] }\n }\n const dataSchema = isRecord(source.dataSchema) ? source.dataSchema : undefined\n if (!dataSchema || !Array.isArray(dataSchema.fields)) return\n for (const rawField of dataSchema.fields) {\n if (!isRecord(rawField)) continue\n if (!('behavior' in rawField)) {\n rawField.behavior = createDefaultDesignerFieldBehavior()\n migrateLegacyValidation(rawField)\n continue\n }\n if (!isRecord(rawField.behavior)) continue\n const behavior = rawField.behavior\n if (!('stateRules' in behavior)) behavior.stateRules = []\n if (!('valueRules' in behavior)) behavior.valueRules = []\n if (Array.isArray(behavior.valueRules)) {\n for (const valueRule of behavior.valueRules) {\n if (\n isRecord(valueRule) &&\n valueRule.mode === 'LINKAGE' &&\n !('overwritePolicy' in valueRule)\n ) {\n valueRule.overwritePolicy = 'ALWAYS'\n }\n }\n }\n if (!('validationRules' in behavior)) behavior.validationRules = []\n if (!('submitBehavior' in behavior)) behavior.submitBehavior = 'AUTO'\n else if (!['AUTO', 'INCLUDE', 'EXCLUDE'].includes(String(behavior.submitBehavior))) {\n // 非法显式值由诊断层处理,不能静默改写。\n }\n if (!('eventBindings' in behavior)) behavior.eventBindings = {}\n }\n}\n\n/** 诊断高级协议的白名单、引用、表达式和受控枚举。 */\nexport function diagnoseDesignerAdvancedDocument(document: DesignerDocument): DesignerDiagnostic[] {\n const result: DesignerDiagnostic[] = []\n const source = document as unknown as Record<string, unknown>\n unknownKeys(\n source,\n [\n 'documentVersion',\n 'id',\n 'name',\n 'description',\n 'dataSchema',\n 'uiSchema',\n 'appearance',\n 'submitPolicy',\n 'actionBar',\n 'variables',\n 'dataSources',\n 'eventFlows',\n 'i18n',\n 'actions',\n 'extensions',\n ],\n '$',\n 'DOCUMENT_UNKNOWN_PROPERTY',\n result,\n )\n diagnoseSubmitPolicy(document, result)\n diagnoseActionBar(document, result)\n diagnoseVariables(document, result)\n diagnoseDataSources(document, result)\n diagnoseI18n(document, result)\n diagnoseLegacyActions(source.actions, result)\n const dataSchema = isRecord(source.dataSchema) ? source.dataSchema : undefined\n const uiSchema = isRecord(source.uiSchema) ? source.uiSchema : undefined\n const hasFields = Array.isArray(dataSchema?.fields)\n const hasOverlays = Array.isArray(uiSchema?.overlays)\n if (uiSchema) diagnoseOverlays(document, result)\n if (hasFields) diagnoseFieldBehaviors(document, result)\n if (\n hasFields &&\n hasOverlays &&\n Array.isArray(document.variables) &&\n Array.isArray(document.dataSources) &&\n Array.isArray(document.eventFlows)\n ) {\n diagnoseEventFlows(document, result)\n result.push(...resolveDesignerFieldEvaluationOrder(document).diagnostics)\n }\n return result\n}\n\nfunction migrateLegacyValidation(field: Record<string, unknown>): void {\n const behavior = field.behavior as DesignerFieldBehavior\n const validation = isRecord(field.validation) ? field.validation : undefined\n const fieldId = typeof field.id === 'string' ? field.id : 'unknown'\n if (!validation) return\n if (validation.minimumLength !== undefined || validation.maximumLength !== undefined) {\n behavior.validationRules.push({\n id: `legacy-${fieldId}-length`,\n name: '历史长度校验',\n type: 'LENGTH',\n enabled: true,\n trigger: 'SUBMIT',\n severity: 'ERROR',\n message: typeof validation.message === 'string' ? validation.message : '',\n configuration: {\n minimum: finiteNumberOrUndefined(validation.minimumLength),\n maximum: finiteNumberOrUndefined(validation.maximumLength),\n },\n })\n }\n if (validation.minimum !== undefined || validation.maximum !== undefined) {\n behavior.validationRules.push({\n id: `legacy-${fieldId}-range`,\n name: '历史范围校验',\n type: 'RANGE',\n enabled: true,\n trigger: 'SUBMIT',\n severity: 'ERROR',\n message: typeof validation.message === 'string' ? validation.message : '',\n configuration: {\n minimum: finiteNumberOrUndefined(validation.minimum),\n maximum: finiteNumberOrUndefined(validation.maximum),\n },\n })\n }\n if (typeof validation.pattern === 'string' && validation.pattern) {\n behavior.validationRules.push({\n id: `legacy-${fieldId}-pattern`,\n name: '历史格式校验',\n type: 'REGEX',\n enabled: true,\n trigger: 'SUBMIT',\n severity: 'ERROR',\n message: typeof validation.message === 'string' ? validation.message : '',\n configuration: { pattern: validation.pattern },\n })\n }\n}\n\nfunction diagnoseSubmitPolicy(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n if (!isRecord(document.submitPolicy)) {\n result.push(error('SUBMIT_POLICY', '提交策略必须是对象', '$.submitPolicy'))\n return\n }\n unknownKeys(\n document.submitPolicy,\n ['ignoreHiddenFields'],\n '$.submitPolicy',\n 'SUBMIT_POLICY_UNKNOWN_PROPERTY',\n result,\n )\n if (typeof document.submitPolicy.ignoreHiddenFields !== 'boolean') {\n result.push(\n error(\n 'SUBMIT_POLICY_VALUE',\n '隐藏字段提交策略必须是布尔值',\n '$.submitPolicy.ignoreHiddenFields',\n ),\n )\n }\n}\n\nfunction diagnoseActionBar(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n const actionBar = document.actionBar\n if (!isRecord(actionBar)) {\n result.push(error('ACTION_BAR', '动作栏配置必须是对象', '$.actionBar'))\n return\n }\n unknownKeys(\n actionBar,\n ['visible', 'position', 'align', 'buttons'],\n '$.actionBar',\n 'ACTION_BAR_UNKNOWN_PROPERTY',\n result,\n )\n if (typeof actionBar.visible !== 'boolean')\n result.push(error('ACTION_BAR_VALUE', '动作栏显示配置不正确', '$.actionBar.visible'))\n if (!['TOP', 'BOTTOM', 'BOTH'].includes(String(actionBar.position)))\n result.push(error('ACTION_BAR_VALUE', '动作栏位置不正确', '$.actionBar.position'))\n if (!['LEFT', 'CENTER', 'RIGHT'].includes(String(actionBar.align)))\n result.push(error('ACTION_BAR_VALUE', '动作栏对齐不正确', '$.actionBar.align'))\n if (!Array.isArray(actionBar.buttons)) {\n result.push(error('ACTION_BAR_BUTTONS', '动作栏按钮必须是数组', '$.actionBar.buttons'))\n return\n }\n actionBar.buttons.forEach((button, index) => {\n const path = `$.actionBar.buttons[${index}]`\n if (!isRecord(button))\n return void result.push(error('ACTION_BAR_BUTTON', '动作栏按钮必须是对象', path))\n unknownKeys(\n button,\n ['action', 'label', 'enabled'],\n path,\n 'ACTION_BAR_BUTTON_UNKNOWN_PROPERTY',\n result,\n )\n if (\n !['SUBMIT', 'RESET', 'PRINT'].includes(String(button.action)) ||\n typeof button.label !== 'string' ||\n typeof button.enabled !== 'boolean'\n ) {\n result.push(error('ACTION_BAR_BUTTON_VALUE', '动作栏按钮配置不正确', path))\n }\n })\n}\n\nfunction diagnoseVariables(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n if (!Array.isArray(document.variables)) {\n result.push(error('VARIABLES', '变量定义必须是数组', '$.variables'))\n return\n }\n const codes = new Set<string>()\n document.variables.forEach((variable, index) => {\n const path = `$.variables[${index}]`\n if (!isRecord(variable)) return void result.push(error('VARIABLE', '变量必须是对象', path))\n unknownKeys(\n variable,\n ['id', 'code', 'name', 'valueType', 'initialValue'],\n path,\n 'VARIABLE_UNKNOWN_PROPERTY',\n result,\n )\n if (!identifier(variable.code) || codes.has(variable.code))\n result.push(error('VARIABLE_CODE', '变量编码为空、重复或格式不正确', `${path}.code`))\n else codes.add(variable.code)\n if (\n typeof variable.id !== 'string' ||\n !variable.id ||\n typeof variable.name !== 'string' ||\n !variable.name\n )\n result.push(error('VARIABLE_IDENTITY', '变量标识和名称不能为空', path))\n if (!['STRING', 'NUMBER', 'BOOLEAN', 'DATE', 'OBJECT'].includes(String(variable.valueType)))\n result.push(error('VARIABLE_TYPE', '变量类型不正确', `${path}.valueType`))\n })\n}\n\nfunction diagnoseDataSources(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n if (!Array.isArray(document.dataSources)) {\n result.push(error('DATA_SOURCES', '数据源定义必须是数组', '$.dataSources'))\n return\n }\n const codes = new Set<string>()\n const fieldIds = new Set(\n Array.isArray(document.dataSchema?.fields)\n ? document.dataSchema.fields.map((field) => field.id)\n : [],\n )\n const variableCodes = new Set(\n (Array.isArray(document.variables) ? document.variables : []).map((variable) => variable.code),\n )\n document.dataSources.forEach((dataSource, index) => {\n const path = `$.dataSources[${index}]`\n if (!isRecord(dataSource))\n return void result.push(error('DATA_SOURCE', '数据源必须是对象', path))\n unknownKeys(\n dataSource,\n [\n 'id',\n 'code',\n 'name',\n 'provider',\n 'sourceId',\n 'sourceRevision',\n 'inputMappings',\n 'outputMappings',\n ],\n path,\n 'DATA_SOURCE_UNKNOWN_PROPERTY',\n result,\n )\n if (!identifier(dataSource.code) || codes.has(dataSource.code))\n result.push(error('DATA_SOURCE_CODE', '数据源编码为空、重复或格式不正确', `${path}.code`))\n else codes.add(dataSource.code)\n for (const key of ['id', 'name', 'provider', 'sourceId'] as const) {\n if (typeof dataSource[key] !== 'string' || !dataSource[key])\n result.push(error('DATA_SOURCE_IDENTITY', `${key} 不能为空`, `${path}.${key}`))\n }\n if (\n dataSource.sourceRevision !== undefined &&\n (!Number.isInteger(dataSource.sourceRevision) || dataSource.sourceRevision < 0)\n ) {\n result.push(error('DATA_SOURCE_REVISION', '来源版本必须是非负整数', `${path}.sourceRevision`))\n }\n diagnoseMappings(\n dataSource.inputMappings,\n `${path}.inputMappings`,\n 'INPUT',\n fieldIds,\n variableCodes,\n result,\n )\n diagnoseMappings(\n dataSource.outputMappings,\n `${path}.outputMappings`,\n 'OUTPUT',\n fieldIds,\n variableCodes,\n result,\n )\n })\n}\n\nfunction diagnoseMappings(\n source: unknown,\n path: string,\n direction: 'INPUT' | 'OUTPUT',\n fieldIds: Set<string>,\n variableCodes: Set<string>,\n result: DesignerDiagnostic[],\n): void {\n if (!Array.isArray(source))\n return void result.push(error('DATA_SOURCE_MAPPING', '映射必须是数组', path))\n source.forEach((mapping, index) => {\n const itemPath = `${path}[${index}]`\n if (!isRecord(mapping))\n return void result.push(error('DATA_SOURCE_MAPPING', '映射项必须是对象', itemPath))\n unknownKeys(\n mapping,\n ['source', 'target'],\n itemPath,\n 'DATA_SOURCE_MAPPING_UNKNOWN_PROPERTY',\n result,\n )\n if (\n typeof mapping.source !== 'string' ||\n !mapping.source ||\n typeof mapping.target !== 'string' ||\n !mapping.target\n )\n result.push(error('DATA_SOURCE_MAPPING_VALUE', '映射来源和目标不能为空', itemPath))\n if (typeof mapping.source !== 'string' || typeof mapping.target !== 'string') return\n const reference = direction === 'INPUT' ? mapping.source : mapping.target\n const adapterKey = direction === 'INPUT' ? mapping.target : mapping.source\n if (!identifier(adapterKey)) {\n result.push(\n error(\n 'DATA_SOURCE_MAPPING_KEY',\n 'Adapter 映射名称必须使用受控编码',\n `${itemPath}.${direction === 'INPUT' ? 'target' : 'source'}`,\n ),\n )\n }\n const referenceType = reference.startsWith('field:')\n ? 'FIELD'\n : reference.startsWith('variable:')\n ? 'VARIABLE'\n : 'UNKNOWN'\n const referenceCode = reference.slice(reference.indexOf(':') + 1)\n if (referenceType === 'UNKNOWN') {\n result.push(\n error(\n 'DATA_SOURCE_MAPPING_REFERENCE',\n '映射必须使用 field:字段ID 或 variable:变量编码',\n `${itemPath}.${direction === 'INPUT' ? 'source' : 'target'}`,\n ),\n )\n } else if (\n (referenceType === 'FIELD' && !fieldIds.has(referenceCode)) ||\n (referenceType === 'VARIABLE' && !variableCodes.has(referenceCode))\n ) {\n result.push(\n error(\n 'DATA_SOURCE_MAPPING_REFERENCE',\n '映射引用的字段或变量不存在',\n `${itemPath}.${direction === 'INPUT' ? 'source' : 'target'}`,\n ),\n )\n }\n })\n}\n\nfunction diagnoseI18n(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n const i18n = document.i18n\n if (!isRecord(i18n)) return void result.push(error('I18N', '国际化配置必须是对象', '$.i18n'))\n unknownKeys(\n i18n,\n ['enabled', 'defaultLocale', 'locales', 'entries'],\n '$.i18n',\n 'I18N_UNKNOWN_PROPERTY',\n result,\n )\n if (\n typeof i18n.enabled !== 'boolean' ||\n !locale(i18n.defaultLocale) ||\n !Array.isArray(i18n.locales) ||\n !Array.isArray(i18n.entries)\n )\n result.push(error('I18N_VALUE', '国际化配置类型不正确', '$.i18n'))\n if (Array.isArray(i18n.locales) && i18n.locales.some((item) => !locale(item)))\n result.push(error('I18N_LOCALE', '语言标签必须符合 BCP 47 基本格式', '$.i18n.locales'))\n if (Array.isArray(i18n.locales) && new Set(i18n.locales).size !== i18n.locales.length) {\n result.push(error('I18N_LOCALE_DUPLICATE', '语言列表不能包含重复项', '$.i18n.locales'))\n }\n if (Array.isArray(i18n.locales) && !i18n.locales.includes(i18n.defaultLocale)) {\n result.push(error('I18N_DEFAULT_LOCALE', '默认语言必须存在于语言列表', '$.i18n.defaultLocale'))\n }\n const keys = new Set<string>()\n if (Array.isArray(i18n.entries))\n i18n.entries.forEach((entry, index) => {\n const path = `$.i18n.entries[${index}]`\n if (!isRecord(entry))\n return void result.push(error('I18N_ENTRY', '国际化词条必须是对象', path))\n unknownKeys(entry, ['key', 'values'], path, 'I18N_ENTRY_UNKNOWN_PROPERTY', result)\n if (!identifier(entry.key) || keys.has(entry.key))\n result.push(error('I18N_ENTRY_KEY', '词条 key 为空、重复或格式不正确', `${path}.key`))\n else keys.add(entry.key)\n if (\n !isRecord(entry.values) ||\n Object.values(entry.values).some((value) => typeof value !== 'string')\n )\n result.push(error('I18N_ENTRY_VALUE', '词条翻译必须是文本映射', `${path}.values`))\n else if (\n Array.isArray(i18n.locales) &&\n Object.keys(entry.values).some((entryLocale) => !i18n.locales.includes(entryLocale))\n ) {\n result.push(error('I18N_ENTRY_LOCALE', '词条包含未启用的语言', `${path}.values`))\n }\n })\n}\n\nfunction diagnoseLegacyActions(source: unknown, result: DesignerDiagnostic[]): void {\n if (!Array.isArray(source)) return\n const codes = new Set<string>()\n source.forEach((action, index) => {\n const path = `$.actions[${index}]`\n if (!isRecord(action)) return void result.push(error('ACTION', '声明式动作必须是对象', path))\n unknownKeys(\n action,\n ['code', 'name', 'handlerType', 'target'],\n path,\n 'ACTION_UNKNOWN_PROPERTY',\n result,\n )\n if (!identifier(action.code) || codes.has(action.code)) {\n result.push(error('ACTION_CODE', '动作编码为空、重复或格式不正确', `${path}.code`))\n } else codes.add(action.code)\n if (typeof action.name !== 'string' || !action.name) {\n result.push(error('ACTION_NAME', '动作名称不能为空', `${path}.name`))\n }\n if (!['SAVE', 'RESET', 'DELETE', 'PRINT', 'NAVIGATE'].includes(String(action.handlerType))) {\n result.push(error('ACTION_HANDLER', '动作处理类型不受支持', `${path}.handlerType`))\n }\n if (\n action.handlerType === 'NAVIGATE' &&\n (typeof action.target !== 'string' || !identifier(action.target))\n ) {\n result.push(error('ACTION_TARGET', '导航动作只能引用受控资源编码', `${path}.target`))\n }\n })\n}\n\nfunction diagnoseOverlays(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n if (!Array.isArray(document.uiSchema.overlays))\n return void result.push(error('OVERLAYS', '弹层模块必须是数组', '$.uiSchema.overlays'))\n const codes = new Set<string>()\n document.uiSchema.overlays.forEach((overlay, index) => {\n const path = `$.uiSchema.overlays[${index}]`\n if (!isRecord(overlay)) return void result.push(error('OVERLAY', '弹层模块必须是对象', path))\n unknownKeys(\n overlay,\n ['id', 'code', 'name', 'kind', 'dataContext', 'width', 'radius', 'maxHeightPreset', 'root'],\n path,\n 'OVERLAY_UNKNOWN_PROPERTY',\n result,\n )\n if (!identifier(overlay.code) || codes.has(overlay.code))\n result.push(error('OVERLAY_CODE', '模块编码为空、重复或格式不正确', `${path}.code`))\n else codes.add(overlay.code)\n if (\n typeof overlay.id !== 'string' ||\n !overlay.id ||\n typeof overlay.name !== 'string' ||\n !overlay.name\n )\n result.push(error('OVERLAY_IDENTITY', '模块标识和名称不能为空', path))\n if (!['DIALOG', 'DRAWER'].includes(String(overlay.kind)))\n result.push(error('OVERLAY_KIND', '模块类型不正确', `${path}.kind`))\n if (!['FORM_DRAFT', 'SUBTABLE_ROW_DRAFT'].includes(String(overlay.dataContext)))\n result.push(error('OVERLAY_CONTEXT', '模块数据上下文不正确', `${path}.dataContext`))\n if (\n typeof overlay.width !== 'number' ||\n !Number.isFinite(overlay.width) ||\n overlay.width < 320 ||\n overlay.width > 1200\n )\n result.push(error('OVERLAY_WIDTH', '模块宽度必须为 320~1200', `${path}.width`))\n if (!['THEME', 'NONE', 'SMALL', 'BASE', 'LARGE'].includes(String(overlay.radius))) {\n result.push(error('OVERLAY_RADIUS', '弹窗圆角档位不正确', `${path}.radius`))\n }\n if (\n !['COMPACT', 'STANDARD', 'SPACIOUS', 'VIEWPORT'].includes(String(overlay.maxHeightPreset))\n ) {\n result.push(\n error('OVERLAY_MAX_HEIGHT', '弹窗运行最大高度档位不正确', `${path}.maxHeightPreset`),\n )\n }\n if (!Array.isArray(overlay.root))\n result.push(error('OVERLAY_ROOT', '模块布局必须是数组', `${path}.root`))\n })\n}\n\nfunction diagnoseFieldBehaviors(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n const flowCodes = new Set(\n (Array.isArray(document.eventFlows) ? document.eventFlows : []).map((flow) => flow.code),\n )\n document.dataSchema.fields.forEach((field, index) => {\n const path = `$.dataSchema.fields[${index}].behavior`\n const behavior = field.behavior\n if (!isRecord(behavior))\n return void result.push(error('FIELD_BEHAVIOR', '字段行为必须是对象', path))\n unknownKeys(\n behavior,\n ['stateRules', 'valueRules', 'validationRules', 'submitBehavior', 'eventBindings'],\n path,\n 'FIELD_BEHAVIOR_UNKNOWN_PROPERTY',\n result,\n )\n if (!['AUTO', 'INCLUDE', 'EXCLUDE'].includes(String(behavior.submitBehavior)))\n result.push(error('FIELD_SUBMIT_BEHAVIOR', '字段提交行为不正确', `${path}.submitBehavior`))\n diagnoseStateRules(\n behavior.stateRules,\n document,\n `${path}.stateRules`,\n field.entityCode !== document.dataSchema.rootEntity.code,\n result,\n )\n diagnoseValueRules(\n behavior.valueRules,\n document,\n `${path}.valueRules`,\n field.entityCode !== document.dataSchema.rootEntity.code,\n result,\n )\n diagnoseValidationRules(\n behavior.validationRules,\n document,\n `${path}.validationRules`,\n field.entityCode !== document.dataSchema.rootEntity.code,\n result,\n )\n if (!isRecord(behavior.eventBindings))\n result.push(error('FIELD_EVENT_BINDINGS', '字段事件绑定必须是对象', `${path}.eventBindings`))\n else {\n const registration = findDesignerComponent(field.componentType)\n const allowed = new Set(\n registration?.supportedEvents ?? defaultSupportedEvents(field.componentType),\n )\n for (const [event, flowCode] of Object.entries(behavior.eventBindings)) {\n if (!allowed.has(event as never))\n result.push(\n error(\n 'FIELD_EVENT_UNSUPPORTED',\n `${registration?.name ?? field.label}不支持 ${event} 事件`,\n `${path}.eventBindings.${event}`,\n ),\n )\n if (typeof flowCode !== 'string' || !flowCodes.has(flowCode))\n result.push(\n error(\n 'FIELD_EVENT_FLOW',\n '字段事件引用了不存在的事件流',\n `${path}.eventBindings.${event}`,\n ),\n )\n }\n }\n })\n}\n\nfunction diagnoseStateRules(\n source: unknown,\n document: DesignerDocument,\n path: string,\n allowCurrentRow: boolean,\n result: DesignerDiagnostic[],\n): void {\n if (!Array.isArray(source))\n return void result.push(error('STATE_RULES', '字段状态规则必须是数组', path))\n source.forEach((rule, index) => {\n const itemPath = `${path}[${index}]`\n if (!isRecord(rule))\n return void result.push(error('STATE_RULE', '字段状态规则必须是对象', itemPath))\n unknownKeys(\n rule,\n ['id', 'target', 'condition', 'valueWhenTrue', 'valueWhenFalse'],\n itemPath,\n 'STATE_RULE_UNKNOWN_PROPERTY',\n result,\n )\n if (\n !['VISIBLE', 'REQUIRED', 'DISABLED'].includes(String(rule.target)) ||\n typeof rule.id !== 'string' ||\n typeof rule.valueWhenTrue !== 'boolean' ||\n (rule.valueWhenFalse !== undefined && typeof rule.valueWhenFalse !== 'boolean')\n )\n result.push(error('STATE_RULE_VALUE', '字段状态规则配置不正确', itemPath))\n result.push(\n ...diagnoseDesignerExpression(rule.condition, document, `${itemPath}.condition`, {\n allowCurrentRow,\n }),\n )\n })\n}\n\nfunction diagnoseValueRules(\n source: unknown,\n document: DesignerDocument,\n path: string,\n allowCurrentRow: boolean,\n result: DesignerDiagnostic[],\n): void {\n if (!Array.isArray(source))\n return void result.push(error('VALUE_RULES', '字段值规则必须是数组', path))\n source.forEach((rule, index) => {\n const itemPath = `${path}[${index}]`\n if (!isRecord(rule))\n return void result.push(error('VALUE_RULE', '字段值规则必须是对象', itemPath))\n const allowedKeys =\n rule.mode === 'LINKAGE'\n ? ['id', 'mode', 'expression', 'condition', 'overwritePolicy']\n : ['id', 'mode', 'expression', 'condition']\n unknownKeys(rule, allowedKeys, itemPath, 'VALUE_RULE_UNKNOWN_PROPERTY', result)\n if (!['FORMULA', 'LINKAGE'].includes(String(rule.mode)) || typeof rule.id !== 'string')\n result.push(error('VALUE_RULE_VALUE', '字段值规则配置不正确', itemPath))\n if (\n rule.mode === 'LINKAGE' &&\n !['ALWAYS', 'EMPTY_ONLY', 'CONFIRM'].includes(String(rule.overwritePolicy))\n ) {\n result.push(\n error('VALUE_RULE_OVERWRITE_POLICY', '联动覆盖策略不正确', `${itemPath}.overwritePolicy`),\n )\n }\n result.push(\n ...diagnoseDesignerExpression(rule.expression, document, `${itemPath}.expression`, {\n allowCurrentRow,\n }),\n )\n if (rule.condition !== undefined)\n result.push(\n ...diagnoseDesignerExpression(rule.condition, document, `${itemPath}.condition`, {\n allowCurrentRow,\n }),\n )\n })\n}\n\nfunction diagnoseValidationRules(\n source: unknown,\n document: DesignerDocument,\n path: string,\n allowCurrentRow: boolean,\n result: DesignerDiagnostic[],\n): void {\n if (!Array.isArray(source))\n return void result.push(error('VALIDATION_RULES', '验证规则必须是数组', path))\n source.forEach((rule, index) => {\n const itemPath = `${path}[${index}]`\n if (!isRecord(rule))\n return void result.push(error('VALIDATION_RULE', '验证规则必须是对象', itemPath))\n unknownKeys(\n rule,\n [\n 'id',\n 'name',\n 'type',\n 'enabled',\n 'trigger',\n 'severity',\n 'message',\n 'condition',\n 'configuration',\n ],\n itemPath,\n 'VALIDATION_RULE_UNKNOWN_PROPERTY',\n result,\n )\n if (\n typeof rule.id !== 'string' ||\n !rule.id ||\n typeof rule.name !== 'string' ||\n typeof rule.enabled !== 'boolean' ||\n !['CHANGE', 'BLUR', 'SUBMIT'].includes(String(rule.trigger)) ||\n !['ERROR', 'WARNING'].includes(String(rule.severity)) ||\n typeof rule.message !== 'string' ||\n !isRecord(rule.configuration)\n )\n result.push(error('VALIDATION_RULE_VALUE', '验证规则配置不正确', itemPath))\n if (\n ![\n 'LENGTH',\n 'RANGE',\n 'PRECISION',\n 'FORMAT',\n 'REGEX',\n 'DATE',\n 'SELECTION',\n 'FILE',\n 'COMPARE_FIELD',\n 'EXPRESSION',\n 'SUBTABLE',\n 'REMOTE',\n ].includes(String(rule.type))\n )\n result.push(error('VALIDATION_RULE_TYPE', '验证规则类型不受支持', `${itemPath}.type`))\n if (rule.condition !== undefined)\n result.push(\n ...diagnoseDesignerExpression(rule.condition, document, `${itemPath}.condition`, {\n allowCurrentRow,\n }),\n )\n if (\n rule.type === 'REGEX' &&\n isRecord(rule.configuration) &&\n !isSafeDesignerRegularExpression(String(rule.configuration.pattern ?? ''))\n )\n result.push(\n error('VALIDATION_REGEX', '正则表达式不安全或无效', `${itemPath}.configuration.pattern`),\n )\n if (isRecord(rule.configuration)) {\n diagnoseValidationConfiguration(\n String(rule.type),\n rule.configuration,\n document,\n `${itemPath}.configuration`,\n allowCurrentRow,\n result,\n )\n }\n })\n}\n\nfunction diagnoseValidationConfiguration(\n type: string,\n configuration: Record<string, unknown>,\n document: DesignerDocument,\n path: string,\n allowCurrentRow: boolean,\n result: DesignerDiagnostic[],\n): void {\n const allowed: Record<string, string[]> = {\n LENGTH: ['minimum', 'maximum'],\n RANGE: ['minimum', 'maximum'],\n PRECISION: ['scale'],\n FORMAT: ['format'],\n REGEX: ['pattern'],\n DATE: ['minimum', 'maximum'],\n SELECTION: ['minimum', 'maximum'],\n FILE: ['maximumCount', 'maximumSizeMb', 'accept'],\n COMPARE_FIELD: ['fieldId', 'operator'],\n EXPRESSION: ['expression'],\n SUBTABLE: ['containerId', 'minimumRows', 'maximumRows'],\n REMOTE: ['provider', 'validatorId'],\n }\n const keys = allowed[type]\n if (!keys) return\n unknownKeys(configuration, keys, path, 'VALIDATION_CONFIGURATION_UNKNOWN_PROPERTY', result)\n if (type === 'RANGE') diagnoseFiniteRange(configuration, path, result)\n if (['LENGTH', 'SELECTION'].includes(type)) {\n diagnoseIntegerRange(configuration, path, 0, result)\n }\n if (type === 'PRECISION') {\n diagnoseIntegerAtLeast(configuration.scale, 0, `${path}.scale`, result)\n }\n if (type === 'FILE') {\n if (configuration.maximumCount !== undefined) {\n diagnoseIntegerAtLeast(configuration.maximumCount, 1, `${path}.maximumCount`, result)\n }\n if (\n configuration.maximumSizeMb !== undefined &&\n (typeof configuration.maximumSizeMb !== 'number' ||\n !Number.isFinite(configuration.maximumSizeMb) ||\n configuration.maximumSizeMb <= 0)\n ) {\n result.push(\n error('VALIDATION_CONFIGURATION_VALUE', '文件大小上限必须大于 0', `${path}.maximumSizeMb`),\n )\n }\n if (configuration.accept !== undefined && typeof configuration.accept !== 'string') {\n result.push(\n error('VALIDATION_CONFIGURATION_VALUE', '文件类型限制必须是文本', `${path}.accept`),\n )\n }\n }\n if (type === 'SUBTABLE') {\n diagnoseIntegerRange(\n { minimum: configuration.minimumRows, maximum: configuration.maximumRows },\n path,\n 0,\n result,\n { minimum: 'minimumRows', maximum: 'maximumRows' },\n )\n }\n if (type === 'DATE') diagnoseDateRange(configuration, path, result)\n if (\n type === 'FORMAT' &&\n !['EMAIL', 'PHONE', 'IDENTIFIER'].includes(String(configuration.format))\n ) {\n result.push(error('VALIDATION_CONFIGURATION_VALUE', '常用格式类型不正确', `${path}.format`))\n }\n if (type === 'COMPARE_FIELD') {\n const fieldIds = new Set(document.dataSchema.fields.map((field) => field.id))\n if (!fieldIds.has(String(configuration.fieldId))) {\n result.push(error('VALIDATION_CONFIGURATION_REFERENCE', '比较字段不存在', `${path}.fieldId`))\n }\n if (\n configuration.operator !== undefined &&\n !['EQ', 'NE', 'GT', 'GTE', 'LT', 'LTE'].includes(String(configuration.operator))\n ) {\n result.push(error('VALIDATION_CONFIGURATION_VALUE', '比较操作符不正确', `${path}.operator`))\n }\n }\n if (type === 'EXPRESSION') {\n result.push(\n ...diagnoseDesignerExpression(configuration.expression, document, `${path}.expression`, {\n allowCurrentRow,\n }),\n )\n }\n if (type === 'SUBTABLE') {\n const nodes = collectNodes([\n document.uiSchema.root,\n ...document.uiSchema.overlays.map((overlay) => overlay.root),\n ])\n const node = nodes.get(String(configuration.containerId))\n if (\n node?.nodeType !== 'CONTAINER' ||\n !['row-subtable', 'block-subtable'].includes(node.componentType)\n ) {\n result.push(\n error('VALIDATION_CONFIGURATION_REFERENCE', '子表容器不存在', `${path}.containerId`),\n )\n }\n }\n if (\n type === 'REMOTE' &&\n (typeof configuration.provider !== 'string' ||\n !configuration.provider ||\n typeof configuration.validatorId !== 'string' ||\n !configuration.validatorId)\n ) {\n result.push(error('VALIDATION_CONFIGURATION_VALUE', '远程验证来源不能为空', path))\n }\n}\n\nfunction diagnoseFiniteRange(\n configuration: Record<string, unknown>,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n for (const key of ['minimum', 'maximum'] as const) {\n const value = configuration[key]\n if (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value))) {\n result.push(\n error('VALIDATION_CONFIGURATION_VALUE', `${key} 必须是有限数字`, `${path}.${key}`),\n )\n }\n }\n if (\n typeof configuration.minimum === 'number' &&\n Number.isFinite(configuration.minimum) &&\n typeof configuration.maximum === 'number' &&\n Number.isFinite(configuration.maximum) &&\n configuration.minimum > configuration.maximum\n ) {\n result.push(error('VALIDATION_CONFIGURATION_RANGE', '最小值不能大于最大值', path))\n }\n}\n\nfunction diagnoseIntegerRange(\n configuration: Record<string, unknown>,\n path: string,\n minimumAllowed: number,\n result: DesignerDiagnostic[],\n keys: { minimum: string; maximum: string } = { minimum: 'minimum', maximum: 'maximum' },\n): void {\n const minimum = configuration.minimum\n const maximum = configuration.maximum\n if (minimum !== undefined) {\n diagnoseIntegerAtLeast(minimum, minimumAllowed, `${path}.${keys.minimum}`, result)\n }\n if (maximum !== undefined) {\n diagnoseIntegerAtLeast(maximum, minimumAllowed, `${path}.${keys.maximum}`, result)\n }\n if (typeof minimum === 'number' && typeof maximum === 'number' && minimum > maximum) {\n result.push(error('VALIDATION_CONFIGURATION_RANGE', '最小值不能大于最大值', path))\n }\n}\n\nfunction diagnoseIntegerAtLeast(\n value: unknown,\n minimum: number,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < minimum) {\n result.push(error('VALIDATION_CONFIGURATION_VALUE', `必须是不小于 ${minimum} 的整数`, path))\n }\n}\n\nfunction diagnoseDateRange(\n configuration: Record<string, unknown>,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n const minimum = configuration.minimum\n const maximum = configuration.maximum\n const minimumTime = minimum === undefined ? undefined : Date.parse(String(minimum))\n const maximumTime = maximum === undefined ? undefined : Date.parse(String(maximum))\n if (minimum !== undefined && !Number.isFinite(minimumTime)) {\n result.push(error('VALIDATION_CONFIGURATION_VALUE', '最早日期格式不正确', `${path}.minimum`))\n }\n if (maximum !== undefined && !Number.isFinite(maximumTime)) {\n result.push(error('VALIDATION_CONFIGURATION_VALUE', '最晚日期格式不正确', `${path}.maximum`))\n }\n if (\n minimumTime !== undefined &&\n maximumTime !== undefined &&\n Number.isFinite(minimumTime) &&\n Number.isFinite(maximumTime) &&\n minimumTime > maximumTime\n ) {\n result.push(error('VALIDATION_CONFIGURATION_RANGE', '最早日期不能晚于最晚日期', path))\n }\n}\n\nfunction diagnoseEventFlows(document: DesignerDocument, result: DesignerDiagnostic[]): void {\n if (!Array.isArray(document.eventFlows)) {\n result.push(error('EVENT_FLOWS', '事件流必须是数组', '$.eventFlows'))\n return\n }\n const codes = new Set<string>()\n const moduleCodes = new Set(document.uiSchema.overlays.map((module) => module.code))\n const dataSourceCodes = new Set(document.dataSources.map((source) => source.code))\n const fieldIds = new Set(document.dataSchema.fields.map((field) => field.id))\n const variableCodes = new Set(document.variables.map((variable) => variable.code))\n const roots = [\n document.uiSchema.root,\n ...document.uiSchema.overlays.map((overlay) => overlay.root),\n ]\n const nodeMap = collectNodes(roots)\n const nodeIds = new Set(nodeMap.keys())\n const currentRowNodeIds = collectCurrentRowNodeIds(roots)\n const fieldsById = new Map(document.dataSchema.fields.map((field) => [field.id, field]))\n document.eventFlows.forEach((flow, index) => {\n const path = `$.eventFlows[${index}]`\n if (!isRecord(flow)) return void result.push(error('EVENT_FLOW', '事件流必须是对象', path))\n unknownKeys(\n flow,\n ['id', 'code', 'name', 'trigger', 'enabled', 'steps'],\n path,\n 'EVENT_FLOW_UNKNOWN_PROPERTY',\n result,\n )\n if (!identifier(flow.code) || codes.has(flow.code))\n result.push(error('EVENT_FLOW_CODE', '事件流编码为空、重复或格式不正确', `${path}.code`))\n else codes.add(flow.code)\n if (\n typeof flow.id !== 'string' ||\n !flow.id ||\n typeof flow.name !== 'string' ||\n !flow.name ||\n typeof flow.enabled !== 'boolean'\n )\n result.push(error('EVENT_FLOW_IDENTITY', '事件流标识、名称或启用状态不正确', path))\n if (!isRecord(flow.trigger))\n result.push(error('EVENT_FLOW_TRIGGER', '事件触发器必须是对象', `${path}.trigger`))\n else if (flow.trigger.scope === 'FORM') {\n unknownKeys(\n flow.trigger,\n ['scope', 'event'],\n `${path}.trigger`,\n 'EVENT_TRIGGER_UNKNOWN_PROPERTY',\n result,\n )\n if (\n !['INITIALIZED', 'BEFORE_SUBMIT', 'AFTER_SUBMIT', 'RESET'].includes(\n String(flow.trigger.event),\n )\n )\n result.push(error('EVENT_FLOW_TRIGGER', '表单事件不受支持', `${path}.trigger.event`))\n } else if (flow.trigger.scope === 'COMPONENT') {\n unknownKeys(\n flow.trigger,\n ['scope', 'event', 'nodeId'],\n `${path}.trigger`,\n 'EVENT_TRIGGER_UNKNOWN_PROPERTY',\n result,\n )\n if (\n !['CHANGE', 'BLUR', 'FOCUS', 'CLICK'].includes(String(flow.trigger.event)) ||\n typeof flow.trigger.nodeId !== 'string' ||\n !nodeIds.has(flow.trigger.nodeId)\n )\n result.push(error('EVENT_FLOW_TRIGGER', '组件事件或节点引用不正确', `${path}.trigger`))\n else {\n const node = nodeMap.get(flow.trigger.nodeId)\n const componentType =\n node?.nodeType === 'FIELD'\n ? fieldsById.get(node.fieldId)?.componentType\n : node?.componentType\n const registration = componentType ? findDesignerComponent(componentType) : undefined\n if (!registration?.supportedEvents?.includes(flow.trigger.event as never)) {\n result.push(\n error(\n 'EVENT_FLOW_TRIGGER_UNSUPPORTED',\n '当前组件不支持所选事件',\n `${path}.trigger.event`,\n ),\n )\n }\n }\n } else result.push(error('EVENT_FLOW_TRIGGER', '事件触发范围不正确', `${path}.trigger.scope`))\n diagnoseEventSteps(\n flow.steps,\n document,\n `${path}.steps`,\n 0,\n flow.trigger.scope === 'COMPONENT' && currentRowNodeIds.has(flow.trigger.nodeId),\n {\n moduleCodes,\n dataSourceCodes,\n fieldIds,\n variableCodes,\n stepIds: new Set<string>(),\n branchIds: new Set<string>(),\n },\n result,\n )\n })\n}\n\nfunction diagnoseEventSteps(\n source: unknown,\n document: DesignerDocument,\n path: string,\n depth: number,\n allowCurrentRow: boolean,\n references: {\n moduleCodes: Set<string>\n dataSourceCodes: Set<string>\n fieldIds: Set<string>\n variableCodes: Set<string>\n stepIds: Set<string>\n branchIds: Set<string>\n },\n result: DesignerDiagnostic[],\n): void {\n if (!Array.isArray(source))\n return void result.push(error('EVENT_STEPS', '事件步骤必须是数组', path))\n if (depth > 20) return void result.push(error('EVENT_DEPTH', '事件流嵌套深度超过限制', path))\n source.forEach((step, index) => {\n const itemPath = `${path}[${index}]`\n if (!isRecord(step))\n return void result.push(error('EVENT_STEP', '事件步骤必须是对象', itemPath))\n if (step.stepType === 'ACTION') {\n unknownKeys(\n step,\n [\n 'id',\n 'stepType',\n 'name',\n 'actionType',\n 'configuration',\n 'guard',\n 'guardFailure',\n 'onError',\n ],\n itemPath,\n 'EVENT_ACTION_UNKNOWN_PROPERTY',\n result,\n )\n if (typeof step.id !== 'string' || !step.id || references.stepIds.has(step.id)) {\n result.push(error('EVENT_STEP_ID', '事件步骤标识为空、重复或格式不正确', `${itemPath}.id`))\n } else references.stepIds.add(step.id)\n if (\n typeof step.name !== 'string' ||\n !step.name ||\n !eventActionType(step.actionType) ||\n !isRecord(step.configuration) ||\n !['SKIP', 'BLOCK'].includes(String(step.guardFailure)) ||\n !['STOP', 'CONTINUE'].includes(String(step.onError))\n )\n result.push(error('EVENT_ACTION_VALUE', '事件动作配置不正确', itemPath))\n if (step.guard !== undefined)\n result.push(\n ...diagnoseDesignerExpression(step.guard, document, `${itemPath}.guard`, {\n allowCurrentRow,\n }),\n )\n if (isRecord(step.configuration))\n diagnoseEventActionConfiguration(\n step.actionType as DesignerEventActionType,\n step.configuration,\n document,\n itemPath,\n allowCurrentRow,\n references,\n result,\n )\n return\n }\n if (step.stepType === 'CONDITION') {\n unknownKeys(\n step,\n ['id', 'stepType', 'name', 'branches', 'elseSteps'],\n itemPath,\n 'EVENT_CONDITION_UNKNOWN_PROPERTY',\n result,\n )\n if (!Array.isArray(step.branches) || !Array.isArray(step.elseSteps))\n return void result.push(error('EVENT_CONDITION_VALUE', '条件分支配置不正确', itemPath))\n if (typeof step.id !== 'string' || !step.id || references.stepIds.has(step.id)) {\n result.push(error('EVENT_STEP_ID', '事件步骤标识为空、重复或格式不正确', `${itemPath}.id`))\n } else references.stepIds.add(step.id)\n if (typeof step.name !== 'string' || !step.name) {\n result.push(error('EVENT_CONDITION_NAME', '条件步骤名称不能为空', `${itemPath}.name`))\n }\n step.branches.forEach((branch, branchIndex) => {\n const branchPath = `${itemPath}.branches[${branchIndex}]`\n if (!isRecord(branch))\n return void result.push(error('EVENT_BRANCH', '条件分支必须是对象', branchPath))\n unknownKeys(\n branch,\n ['id', 'name', 'condition', 'steps'],\n branchPath,\n 'EVENT_BRANCH_UNKNOWN_PROPERTY',\n result,\n )\n if (typeof branch.id !== 'string' || !branch.id || references.branchIds.has(branch.id)) {\n result.push(\n error('EVENT_BRANCH_ID', '条件分支标识为空、重复或格式不正确', `${branchPath}.id`),\n )\n } else references.branchIds.add(branch.id)\n if (typeof branch.name !== 'string' || !branch.name) {\n result.push(error('EVENT_BRANCH_NAME', '条件分支名称不能为空', `${branchPath}.name`))\n }\n result.push(\n ...diagnoseDesignerExpression(branch.condition, document, `${branchPath}.condition`, {\n allowCurrentRow,\n }),\n )\n diagnoseEventSteps(\n branch.steps,\n document,\n `${branchPath}.steps`,\n depth + 1,\n allowCurrentRow,\n references,\n result,\n )\n })\n diagnoseEventSteps(\n step.elseSteps,\n document,\n `${itemPath}.elseSteps`,\n depth + 1,\n allowCurrentRow,\n references,\n result,\n )\n return\n }\n result.push(error('EVENT_STEP_TYPE', '事件步骤类型不受支持', `${itemPath}.stepType`))\n })\n}\n\nfunction diagnoseEventActionConfiguration(\n type: DesignerEventActionType,\n configuration: Record<string, unknown>,\n document: DesignerDocument,\n path: string,\n allowCurrentRow: boolean,\n references: {\n moduleCodes: Set<string>\n dataSourceCodes: Set<string>\n fieldIds: Set<string>\n variableCodes: Set<string>\n stepIds: Set<string>\n branchIds: Set<string>\n },\n result: DesignerDiagnostic[],\n): void {\n const allowed: Record<DesignerEventActionType, string[]> = {\n SET_FIELD: ['fieldId', 'value', 'expression'],\n CLEAR_FIELD: ['fieldId'],\n COPY_FIELD: ['sourceFieldId', 'targetFieldId'],\n SET_VARIABLE: ['variableCode', 'value', 'expression'],\n VALIDATE: [],\n SUBMIT: [],\n RESET: [],\n PRINT: [],\n MESSAGE: ['message', 'level'],\n OPEN_MODULE: ['moduleCode'],\n CONFIRM_MODULE: ['moduleCode'],\n CANCEL_MODULE: ['moduleCode'],\n NAVIGATE_RESOURCE: ['resourceCode', 'openInNewPage'],\n REFRESH_DATA_SOURCE: ['dataSourceCode'],\n HOST_ACTION: ['actionCode'],\n }\n unknownKeys(\n configuration,\n allowed[type],\n `${path}.configuration`,\n 'EVENT_ACTION_CONFIGURATION_UNKNOWN_PROPERTY',\n result,\n )\n const requiredFieldReferences =\n type === 'COPY_FIELD'\n ? ['sourceFieldId', 'targetFieldId']\n : ['SET_FIELD', 'CLEAR_FIELD'].includes(type)\n ? ['fieldId']\n : []\n for (const key of requiredFieldReferences)\n if (!references.fieldIds.has(String(configuration[key])))\n result.push(\n error('EVENT_ACTION_FIELD', '动作引用了不存在的字段', `${path}.configuration.${key}`),\n )\n if (type === 'SET_VARIABLE' && !references.variableCodes.has(String(configuration.variableCode)))\n result.push(\n error(\n 'EVENT_ACTION_VARIABLE',\n '动作引用了不存在的变量',\n `${path}.configuration.variableCode`,\n ),\n )\n if (\n ['OPEN_MODULE', 'CONFIRM_MODULE', 'CANCEL_MODULE'].includes(type) &&\n !references.moduleCodes.has(String(configuration.moduleCode))\n )\n result.push(\n error('EVENT_ACTION_MODULE', '动作引用了不存在的模块', `${path}.configuration.moduleCode`),\n )\n if (\n type === 'REFRESH_DATA_SOURCE' &&\n !references.dataSourceCodes.has(String(configuration.dataSourceCode))\n )\n result.push(\n error(\n 'EVENT_ACTION_DATA_SOURCE',\n '动作引用了不存在的数据源',\n `${path}.configuration.dataSourceCode`,\n ),\n )\n if (['SET_FIELD', 'SET_VARIABLE'].includes(type) && configuration.expression !== undefined) {\n result.push(\n ...diagnoseDesignerExpression(\n configuration.expression,\n document,\n `${path}.configuration.expression`,\n {\n allowCurrentRow,\n },\n ),\n )\n }\n if (\n type === 'MESSAGE' &&\n (typeof configuration.message !== 'string' ||\n !configuration.message ||\n !['SUCCESS', 'INFO', 'WARNING', 'ERROR'].includes(String(configuration.level)))\n ) {\n result.push(error('EVENT_ACTION_MESSAGE', '消息内容或级别不正确', `${path}.configuration`))\n }\n if (\n type === 'NAVIGATE_RESOURCE' &&\n (!identifier(configuration.resourceCode) ||\n (configuration.openInNewPage !== undefined &&\n typeof configuration.openInNewPage !== 'boolean'))\n ) {\n result.push(\n error('EVENT_ACTION_RESOURCE', '导航资源编码或打开方式不正确', `${path}.configuration`),\n )\n }\n if (type === 'HOST_ACTION' && !identifier(configuration.actionCode)) {\n result.push(\n error('EVENT_ACTION_HOST', 'Host 动作编码不正确', `${path}.configuration.actionCode`),\n )\n }\n}\n\nfunction collectNodes(roots: DesignerLayoutNode[][]): Map<string, DesignerLayoutNode> {\n const result = new Map<string, DesignerLayoutNode>()\n const visit = (nodes: DesignerLayoutNode[]): void =>\n nodes.forEach((node) => {\n result.set(node.id, node)\n if (node.nodeType === 'CONTAINER') node.slots.forEach((slot) => visit(slot.children))\n })\n roots.forEach(visit)\n return result\n}\n\nfunction collectCurrentRowNodeIds(roots: DesignerLayoutNode[][]): Set<string> {\n const result = new Set<string>()\n const visit = (nodes: DesignerLayoutNode[], insideSubtable: boolean): void =>\n nodes.forEach((node) => {\n const currentInsideSubtable =\n insideSubtable ||\n (node.nodeType === 'CONTAINER' &&\n ['row-subtable', 'block-subtable'].includes(node.componentType))\n if (insideSubtable) result.add(node.id)\n if (node.nodeType === 'CONTAINER') {\n node.slots.forEach((slot) => visit(slot.children, currentInsideSubtable))\n }\n })\n roots.forEach((root) => visit(root, false))\n return result\n}\n\nfunction defaultSupportedEvents(componentType: string): Set<'CHANGE' | 'BLUR' | 'FOCUS' | 'CLICK'> {\n if (componentType === 'button') return new Set(['CLICK'])\n return new Set(['CHANGE', 'BLUR', 'FOCUS'])\n}\n\nfunction eventActionType(value: unknown): boolean {\n return [\n 'SET_FIELD',\n 'CLEAR_FIELD',\n 'COPY_FIELD',\n 'SET_VARIABLE',\n 'VALIDATE',\n 'SUBMIT',\n 'RESET',\n 'PRINT',\n 'MESSAGE',\n 'OPEN_MODULE',\n 'CONFIRM_MODULE',\n 'CANCEL_MODULE',\n 'NAVIGATE_RESOURCE',\n 'REFRESH_DATA_SOURCE',\n 'HOST_ACTION',\n ].includes(String(value))\n}\n\nfunction identifier(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z][A-Za-z0-9_]{0,63}$/.test(value)\n}\n\nfunction locale(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z]{2,8}(?:-[A-Za-z0-9]{1,8})*$/.test(value)\n}\n\nfunction unknownKeys(\n source: Record<string, unknown>,\n allowedKeys: Iterable<string>,\n path: string,\n code: string,\n result: DesignerDiagnostic[],\n): void {\n const allowed = new Set(allowedKeys)\n for (const key of Object.keys(source))\n if (!allowed.has(key)) result.push(error(code, `不支持属性 ${key}`, `${path}.${key}`))\n}\n\nfunction error(code: string, message: string, path: string): DesignerDiagnostic {\n return { severity: 'ERROR', code, message, path }\n}\n\nfunction finiteNumberOrUndefined(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { findDesignerComponent } from './component-registry'\nimport { createDefaultDesignerFieldBehavior } from './document-advanced'\nimport type {\n DesignerDataEntity,\n DesignerDiagnostic,\n DesignerDocument,\n DesignerField,\n DesignerFieldNode,\n DesignerInitialDataModel,\n DesignerInitialEntity,\n DesignerInitialField,\n DesignerLayoutNode,\n DesignerOneToManyRelation,\n DesignerRelationPatch,\n DesignerRootEntityPatch,\n DesignerSourceMetadataIndex,\n} from './types'\n\n/** Core 允许持久化的语义编码格式,不接受数据库表达式或路径。 */\nexport const DESIGNER_IDENTIFIER_PATTERN = /^[A-Za-z][A-Za-z0-9_]{0,63}$/\n\nconst SUBTABLE_COMPONENT_TYPES = new Set(['row-subtable', 'block-subtable'])\n\n/** 首次参数初始化和来源索引构建的结果。 */\nexport interface DesignerDataModelPreparation {\n document: DesignerDocument\n sourceMetadata: DesignerSourceMetadataIndex\n diagnostics: DesignerDiagnostic[]\n initialized: boolean\n}\n\n/** 创建只包含本地主实体的数据模型目录。 */\nexport function createLocalDesignerDataSchema(name: string): DesignerDocument['dataSchema'] {\n return {\n rootEntity: {\n id: createProtocolId('entity'),\n code: 'main',\n name: name || '主实体',\n },\n relations: [],\n fields: [],\n }\n}\n\n/**\n * 规范化旧草稿的数据模型身份和一级子表关系。\n *\n * 该函数只补缺失值;已经存在但非法的值交给文档诊断失败关闭,避免静默修复用户输入。\n */\nexport function normalizeDesignerDataModel(document: DesignerDocument): void {\n const schema = document.dataSchema as DesignerDocument['dataSchema'] | undefined\n if (!schema || !Array.isArray(schema.fields)) return\n const rawSchema = schema as unknown as Record<string, unknown>\n if (!('rootEntity' in rawSchema)) {\n schema.rootEntity = createLocalDesignerDataSchema(document.name).rootEntity\n }\n if (!('relations' in rawSchema)) schema.relations = []\n const relations = Array.isArray(schema.relations) ? schema.relations : []\n const validRelations = relations.filter(isOneToManyRelation)\n validRelations.forEach((relation) => {\n if (!relation.loadMode) relation.loadMode = 'SYNC'\n })\n if (!isDataEntity(schema.rootEntity)) return\n schema.fields.forEach((field, index) => {\n if (!field.entityCode) field.entityCode = schema.rootEntity.code\n if (typeof field.primaryKey !== 'boolean') field.primaryKey = false\n if (typeof field.systemField !== 'boolean') field.systemField = false\n if (!Number.isFinite(field.displayOrder)) field.displayOrder = index\n })\n\n const relationCodes = new Set(validRelations.map((relation) => relation.code))\n const entityCodes = new Set([\n schema.rootEntity.code,\n ...validRelations.map((relation) => relation.childEntity.code),\n ])\n let relationSerial = 1\n walkNodes(document.uiSchema.root, (node) => {\n if (node.nodeType !== 'CONTAINER' || !SUBTABLE_COMPONENT_TYPES.has(node.componentType)) return\n const configuredCode =\n typeof node.configuration.relationCode === 'string' &&\n DESIGNER_IDENTIFIER_PATTERN.test(node.configuration.relationCode)\n ? node.configuration.relationCode\n : ''\n let relation = configuredCode\n ? validRelations.find((item) => item.code === configuredCode)\n : undefined\n // v3 已经属于新协议;缺失或非法关系必须由诊断失败关闭,不能再按旧草稿规则静默重建。\n if (!relation && node.configurationVersion >= 3) return\n if (!relation) {\n const relationCode =\n configuredCode || nextRelationCode(schema.rootEntity.code, relationCodes, relationSerial)\n while (relationCodes.has(`${schema.rootEntity.code}_detail_${relationSerial}`))\n relationSerial += 1\n const childCode = nextChildEntityCode(entityCodes, relationSerial)\n relation = {\n id: createProtocolId('relation'),\n code: relationCode,\n name: relationTitle(node) || `明细关系 ${relationSerial}`,\n parentEntityId: schema.rootEntity.id,\n childEntity: {\n id: createProtocolId('entity'),\n code: childCode,\n name: relationTitle(node) || `明细实体 ${relationSerial}`,\n },\n loadMode: 'SYNC',\n }\n relations.push(relation)\n validRelations.push(relation)\n relationCodes.add(relation.code)\n entityCodes.add(relation.childEntity.code)\n relationSerial += 1\n }\n node.configuration.relationCode = relation.code\n if (node.configurationVersion < 3) node.configurationVersion = 3\n for (const slot of node.slots) {\n for (const child of slot.children) {\n if (child.nodeType !== 'FIELD') continue\n const field = schema.fields.find((item) => item.id === child.fieldId)\n if (field) field.entityCode = relation.childEntity.code\n }\n }\n })\n}\n\n/**\n * 以首次复制语义应用 Host 参数,并建立非持久化物理来源索引。\n *\n * 已存在字段、布局、关系或外部来源身份时不会覆盖当前文档;参数变化也不会形成命令历史。\n */\nexport function prepareDesignerDataModel(\n source: DesignerDocument,\n initialDataModel?: DesignerInitialDataModel,\n): DesignerDataModelPreparation {\n const document = cloneDocument(source)\n normalizeDesignerDataModel(document)\n if (!initialDataModel) {\n return {\n document,\n sourceMetadata: emptySourceMetadata(),\n diagnostics: [],\n initialized: false,\n }\n }\n const diagnostics = diagnoseInitialDataModel(initialDataModel)\n if (diagnostics.some((item) => item.severity === 'ERROR')) {\n return {\n document,\n sourceMetadata: emptySourceMetadata(),\n diagnostics,\n initialized: false,\n }\n }\n const canInitialize =\n !document.dataSchema.source &&\n document.dataSchema.fields.length === 0 &&\n document.dataSchema.relations.length === 0 &&\n document.uiSchema.root.length === 0\n if (canInitialize) applyInitialDataModel(document, initialDataModel)\n const sourceMetadata = buildSourceMetadataIndex(document, initialDataModel)\n return { document, sourceMetadata, diagnostics, initialized: canInitialize }\n}\n\n/** 为新建子表建立独立的一级一对多关系,并将稳定 relationCode 写入节点配置。 */\nexport function ensureDesignerSubtableRelation(\n document: DesignerDocument,\n node: Extract<DesignerLayoutNode, { nodeType: 'CONTAINER' }>,\n): DesignerOneToManyRelation | undefined {\n if (!SUBTABLE_COMPONENT_TYPES.has(node.componentType)) return undefined\n const configuredCode =\n typeof node.configuration.relationCode === 'string' ? node.configuration.relationCode : ''\n const existing = document.dataSchema.relations.find(\n (relation) => relation.code === configuredCode,\n )\n if (existing) {\n node.configurationVersion = 3\n return existing\n }\n const relationSerial = nextRelationSerial(document)\n const relationCodes = new Set(document.dataSchema.relations.map((relation) => relation.code))\n const entityCodes = new Set([\n document.dataSchema.rootEntity.code,\n ...document.dataSchema.relations.map((relation) => relation.childEntity.code),\n ])\n const relation: DesignerOneToManyRelation = {\n id: createProtocolId('relation'),\n code: nextRelationCode(document.dataSchema.rootEntity.code, relationCodes, relationSerial),\n name: relationTitle(node) || `明细关系 ${relationSerial}`,\n parentEntityId: document.dataSchema.rootEntity.id,\n childEntity: {\n id: createProtocolId('entity'),\n code: nextChildEntityCode(entityCodes, relationSerial),\n name: relationTitle(node) || `明细实体 ${relationSerial}`,\n },\n loadMode: 'SYNC',\n }\n document.dataSchema.relations.push(relation)\n node.configuration = { ...node.configuration, relationCode: relation.code }\n node.configurationVersion = 3\n return relation\n}\n\n/** 复制子表时生成新的本地关系和子实体,禁止两个可写子表共享同一关系。 */\nexport function duplicateDesignerSubtableRelation(\n document: DesignerDocument,\n source: Extract<DesignerLayoutNode, { nodeType: 'CONTAINER' }>,\n copy: Extract<DesignerLayoutNode, { nodeType: 'CONTAINER' }>,\n): void {\n if (!SUBTABLE_COMPONENT_TYPES.has(copy.componentType)) return\n const sourceCode =\n typeof source.configuration.relationCode === 'string' ? source.configuration.relationCode : ''\n const sourceRelation = document.dataSchema.relations.find(\n (relation) => relation.code === sourceCode,\n )\n copy.configuration = { ...copy.configuration, relationCode: '' }\n const relation = ensureDesignerSubtableRelation(document, copy)\n if (!relation) return\n if (sourceRelation) {\n relation.name = `${sourceRelation.name}副本`\n relation.childEntity.name = `${sourceRelation.childEntity.name}副本`\n }\n for (const slot of copy.slots) {\n for (const child of slot.children) {\n if (child.nodeType !== 'FIELD') continue\n const field = document.dataSchema.fields.find((item) => item.id === child.fieldId)\n if (!field) continue\n field.entityCode = relation.childEntity.code\n field.bindingStatus = 'UNBOUND'\n field.primaryKey = false\n field.systemField = false\n delete field.binding\n }\n }\n}\n\n/** 返回目标落点对应的数据实体编码。 */\nexport function resolveDesignerTargetEntityCode(\n document: DesignerDocument,\n containerId: string | null,\n): string | undefined {\n if (!containerId) return document.dataSchema.rootEntity.code\n const container = findNode(document.uiSchema.root, containerId)\n if (!container || container.nodeType !== 'CONTAINER') return undefined\n if (!SUBTABLE_COMPONENT_TYPES.has(container.componentType))\n return document.dataSchema.rootEntity.code\n const relationCode =\n typeof container.configuration.relationCode === 'string'\n ? container.configuration.relationCode\n : ''\n return document.dataSchema.relations.find((relation) => relation.code === relationCode)\n ?.childEntity.code\n}\n\n/** 校验字段从当前实体作用域移动到目标作用域是否被允许。 */\nexport function designerFieldScopeDropRejection(\n document: DesignerDocument,\n field: DesignerField,\n targetContainerId: string | null,\n): string {\n const targetEntityCode = resolveDesignerTargetEntityCode(document, targetContainerId)\n if (!targetEntityCode) return '目标子表尚未绑定有效关系'\n if (field.entityCode === targetEntityCode) return ''\n return `字段属于实体 ${field.entityCode},不能放入实体 ${targetEntityCode} 的布局`\n}\n\n/** 收集已经在画布中放置的一级子表关系编码。 */\nexport function collectPlacedRelationCodes(nodes: DesignerLayoutNode[]): Set<string> {\n const result = new Set<string>()\n walkNodes(nodes, (node) => {\n if (node.nodeType !== 'CONTAINER' || !SUBTABLE_COMPONENT_TYPES.has(node.componentType)) return\n if (typeof node.configuration.relationCode === 'string')\n result.add(node.configuration.relationCode)\n })\n return result\n}\n\n/** 查找已放置的关系容器。 */\nexport function findSubtableNodeByRelationCode(\n nodes: DesignerLayoutNode[],\n relationCode: string,\n): Extract<DesignerLayoutNode, { nodeType: 'CONTAINER' }> | undefined {\n for (const node of nodes) {\n if (node.nodeType === 'CONTAINER') {\n if (\n SUBTABLE_COMPONENT_TYPES.has(node.componentType) &&\n node.configuration.relationCode === relationCode\n ) {\n return node\n }\n for (const slot of node.slots) {\n const found = findSubtableNodeByRelationCode(slot.children, relationCode)\n if (found) return found\n }\n }\n }\n return undefined\n}\n\n/** 将未放置字段放入其所属主实体或已存在的子表容器。 */\nexport function placeDesignerDataField(\n document: DesignerDocument,\n fieldId: string,\n): DesignerFieldNode | undefined {\n if (isFieldPlaced(document.uiSchema.root, fieldId)) return undefined\n const field = document.dataSchema.fields.find((item) => item.id === fieldId)\n if (!field) return undefined\n const registration = findDesignerComponent(field.componentType)\n if (\n !registration ||\n registration.nodeKind !== 'FIELD' ||\n registration.availability === 'UNAVAILABLE'\n ) {\n return undefined\n }\n const node: DesignerFieldNode = {\n nodeType: 'FIELD',\n id: createProtocolId('node'),\n fieldId: field.id,\n layout: {\n pc: {\n span: registration.defaultSpan,\n offset: 0,\n showLabel: registration.defaultShowLabel,\n labelPosition: 'INHERIT',\n },\n mobile: {\n span: 24,\n offset: 0,\n showLabel: registration.defaultShowLabel,\n labelPosition: 'INHERIT',\n },\n },\n }\n if (field.entityCode === document.dataSchema.rootEntity.code) {\n document.uiSchema.root.push(node)\n return node\n }\n const relation = document.dataSchema.relations.find(\n (item) => item.childEntity.code === field.entityCode,\n )\n const container = relation\n ? findSubtableNodeByRelationCode(document.uiSchema.root, relation.code)\n : undefined\n const content = container?.slots.find((slot) => slot.slotCode === 'content')\n if (!content) return undefined\n content.children.push(node)\n return node\n}\n\n/** 以一个事务修改主实体身份,并同步主实体字段作用域。 */\nexport function updateDesignerRootEntity(\n document: DesignerDocument,\n patch: DesignerRootEntityPatch,\n): string {\n const root = document.dataSchema.rootEntity\n const nextCode = patch.code ?? root.code\n if (!DESIGNER_IDENTIFIER_PATTERN.test(nextCode)) return '主实体编码格式不正确'\n if (document.dataSchema.relations.some((relation) => relation.childEntity.code === nextCode)) {\n return '主实体编码不能与子实体编码重复'\n }\n if (patch.name !== undefined && !patch.name.trim()) return '主实体名称不能为空'\n const previousCode = root.code\n root.code = nextCode\n if (patch.name !== undefined) root.name = patch.name.trim()\n if (previousCode !== nextCode) {\n document.dataSchema.fields.forEach((field) => {\n if (field.entityCode === previousCode) field.entityCode = nextCode\n })\n }\n return ''\n}\n\n/** 以一个事务修改一级子表关系及子实体身份,并同步引用和字段作用域。 */\nexport function updateDesignerRelation(\n document: DesignerDocument,\n currentCode: string,\n patch: DesignerRelationPatch,\n): string {\n const relation = document.dataSchema.relations.find((item) => item.code === currentCode)\n if (!relation) return '当前子表关系不存在'\n const nextRelationCode = patch.code ?? relation.code\n const nextChildCode = patch.childEntityCode ?? relation.childEntity.code\n if (!DESIGNER_IDENTIFIER_PATTERN.test(nextRelationCode)) return '关系编码格式不正确'\n if (!DESIGNER_IDENTIFIER_PATTERN.test(nextChildCode)) return '子实体编码格式不正确'\n if (\n document.dataSchema.relations.some(\n (item) => item.id !== relation.id && item.code === nextRelationCode,\n )\n ) {\n return '关系编码不能重复'\n }\n if (\n nextChildCode === document.dataSchema.rootEntity.code ||\n document.dataSchema.relations.some(\n (item) => item.id !== relation.id && item.childEntity.code === nextChildCode,\n )\n ) {\n return '子实体编码不能与其他实体重复'\n }\n if (patch.name !== undefined && !patch.name.trim()) return '关系名称不能为空'\n if (patch.childEntityName !== undefined && !patch.childEntityName.trim())\n return '子实体名称不能为空'\n const previousRelationCode = relation.code\n const previousChildCode = relation.childEntity.code\n relation.code = nextRelationCode\n relation.childEntity.code = nextChildCode\n if (patch.name !== undefined) relation.name = patch.name.trim()\n if (patch.childEntityName !== undefined) relation.childEntity.name = patch.childEntityName.trim()\n walkNodes(document.uiSchema.root, (node) => {\n if (\n node.nodeType === 'CONTAINER' &&\n SUBTABLE_COMPONENT_TYPES.has(node.componentType) &&\n node.configuration.relationCode === previousRelationCode\n ) {\n node.configuration.relationCode = nextRelationCode\n }\n })\n if (previousChildCode !== nextChildCode) {\n document.dataSchema.fields.forEach((field) => {\n if (field.entityCode === previousChildCode) field.entityCode = nextChildCode\n })\n }\n return ''\n}\n\n/** 对持久化数据模型目录执行实体、关系和字段作用域诊断。 */\nexport function diagnoseDesignerDataModel(document: DesignerDocument): DesignerDiagnostic[] {\n const diagnostics: DesignerDiagnostic[] = []\n const schema = document.dataSchema\n pushUnknownProperties(\n schema.rootEntity,\n ['id', 'code', 'name'],\n '$.dataSchema.rootEntity',\n diagnostics,\n )\n diagnoseEntity(schema.rootEntity, '$.dataSchema.rootEntity', diagnostics)\n if (schema.source) {\n pushUnknownProperties(\n schema.source,\n ['provider', 'sourceId', 'sourceRevision'],\n '$.dataSchema.source',\n diagnostics,\n )\n if (!schema.source.provider || !schema.source.sourceId) {\n diagnostics.push(error('DATA_MODEL_SOURCE', '数据模型来源身份不完整', '$.dataSchema.source'))\n }\n if (\n schema.source.sourceRevision !== undefined &&\n (!Number.isInteger(schema.source.sourceRevision) || schema.source.sourceRevision < 0)\n ) {\n diagnostics.push(\n error(\n 'DATA_MODEL_SOURCE_REVISION',\n '来源版本必须是非负整数',\n '$.dataSchema.source.sourceRevision',\n ),\n )\n }\n }\n const relationIds = new Set<string>()\n const relationCodes = new Set<string>()\n const entityIds = new Set<string>([schema.rootEntity.id])\n const entityCodes = new Set<string>([schema.rootEntity.code])\n for (const [index, rawRelation] of schema.relations.entries()) {\n const path = `$.dataSchema.relations[${index}]`\n if (!isOneToManyRelation(rawRelation)) {\n diagnostics.push(error('RELATION_TYPE', '一级子表关系必须是完整对象', path))\n continue\n }\n const relation = rawRelation\n pushUnknownProperties(\n relation,\n ['id', 'code', 'name', 'parentEntityId', 'childEntity', 'loadMode'],\n path,\n diagnostics,\n )\n pushUnknownProperties(\n relation.childEntity,\n ['id', 'code', 'name'],\n `${path}.childEntity`,\n diagnostics,\n )\n if (!relation.id || relationIds.has(relation.id))\n diagnostics.push(error('RELATION_ID', '关系主键为空或重复', `${path}.id`))\n else relationIds.add(relation.id)\n if (!DESIGNER_IDENTIFIER_PATTERN.test(relation.code) || relationCodes.has(relation.code)) {\n diagnostics.push(error('RELATION_CODE', '关系编码格式不正确或重复', `${path}.code`))\n } else relationCodes.add(relation.code)\n if (!relation.name) diagnostics.push(error('RELATION_NAME', '关系名称不能为空', `${path}.name`))\n if (relation.parentEntityId !== schema.rootEntity.id) {\n diagnostics.push(\n error('RELATION_PARENT', '一级子表的父实体必须是主实体', `${path}.parentEntityId`),\n )\n }\n diagnoseEntity(relation.childEntity, `${path}.childEntity`, diagnostics)\n if (entityIds.has(relation.childEntity.id)) {\n diagnostics.push(error('ENTITY_ID_DUPLICATE', '实体主键不能重复', `${path}.childEntity.id`))\n } else entityIds.add(relation.childEntity.id)\n if (entityCodes.has(relation.childEntity.code)) {\n diagnostics.push(\n error('ENTITY_CODE_DUPLICATE', '实体编码不能重复', `${path}.childEntity.code`),\n )\n } else entityCodes.add(relation.childEntity.code)\n if (!['SYNC', 'ASYNC'].includes(relation.loadMode)) {\n diagnostics.push(error('RELATION_LOAD_MODE', '关系加载方式不正确', `${path}.loadMode`))\n }\n }\n for (const [index, field] of schema.fields.entries()) {\n if (!entityCodes.has(field.entityCode)) {\n diagnostics.push(\n error(\n 'FIELD_ENTITY_REFERENCE',\n '字段引用了不存在的语义实体',\n `$.dataSchema.fields[${index}].entityCode`,\n ),\n )\n }\n }\n diagnoseLayoutDataScopes(document, diagnostics)\n return diagnostics\n}\n\nfunction applyInitialDataModel(\n document: DesignerDocument,\n initial: DesignerInitialDataModel,\n): void {\n document.dataSchema = {\n source: {\n provider: initial.provider,\n sourceId: initial.sourceId,\n sourceRevision: initial.sourceRevision,\n },\n rootEntity: toDataEntity(initial.rootEntity),\n relations: initial.relations.map((relation) => ({\n id: relation.relationId,\n code: relation.relationCode,\n name: relation.relationName,\n parentEntityId: relation.parentEntityId,\n childEntity: toDataEntity(relation.childEntity),\n loadMode: relation.loadMode ?? 'SYNC',\n })),\n fields: [],\n }\n document.dataSchema.fields.push(\n ...createInitialFields(document, initial.rootEntity),\n ...initial.relations.flatMap((relation) => createInitialFields(document, relation.childEntity)),\n )\n}\n\nfunction createInitialFields(\n document: DesignerDocument,\n entity: DesignerInitialEntity,\n): DesignerField[] {\n return [...entity.fields]\n .sort((left, right) => (left.displayOrder ?? 0) - (right.displayOrder ?? 0))\n .map((field, index) => createInitialField(document, entity, field, index))\n}\n\nfunction createInitialField(\n document: DesignerDocument,\n entity: DesignerInitialEntity,\n initial: DesignerInitialField,\n index: number,\n): DesignerField {\n const registration = findDesignerComponent(initial.defaultComponentType)!\n return {\n id: createProtocolId('field'),\n entityCode: entity.entityCode,\n key: initial.fieldCode,\n label: initial.fieldName,\n semanticType: initial.semanticType,\n componentType: registration.componentType,\n configurationVersion: registration.configurationVersion,\n configuration: cloneRecord(registration.defaultConfiguration),\n defaultValue: defaultValueFor(initial.semanticType),\n helpText: '',\n required: initial.required === true,\n validation: {},\n behavior: createDefaultDesignerFieldBehavior(),\n display: {\n placeholder: '',\n hidden: registration.componentType === 'hidden',\n readonly:\n initial.readonly === true || initial.primaryKey === true || initial.systemField === true,\n },\n bindingStatus: 'BOUND',\n primaryKey: initial.primaryKey === true,\n systemField: initial.systemField === true,\n displayOrder: initial.displayOrder ?? index,\n binding: {\n provider: document.dataSchema.source!.provider,\n sourceId: document.dataSchema.source!.sourceId,\n sourceRevision: document.dataSchema.source!.sourceRevision,\n fieldId: initial.fieldId,\n fieldPath: `${entity.entityCode}.${initial.fieldCode}`,\n sourceDataType: initial.sourceDataType,\n },\n }\n}\n\nfunction buildSourceMetadataIndex(\n document: DesignerDocument,\n initial: DesignerInitialDataModel,\n): DesignerSourceMetadataIndex {\n if (\n document.dataSchema.source?.provider !== initial.provider ||\n document.dataSchema.source.sourceId !== initial.sourceId\n ) {\n return emptySourceMetadata()\n }\n const index: DesignerSourceMetadataIndex = {\n provider: initial.provider,\n sourceId: initial.sourceId,\n sourceRevision: initial.sourceRevision,\n entities: {},\n fields: {},\n relations: {},\n }\n const initialEntities = [\n initial.rootEntity,\n ...initial.relations.map((relation) => relation.childEntity),\n ]\n for (const entity of initialEntities) {\n const dataEntity =\n document.dataSchema.rootEntity.id === entity.entityId\n ? document.dataSchema.rootEntity\n : document.dataSchema.relations.find(\n (relation) => relation.childEntity.id === entity.entityId,\n )?.childEntity\n if (dataEntity) index.entities[dataEntity.id] = { physicalTableName: entity.physicalTableName }\n for (const initialField of entity.fields) {\n const field = document.dataSchema.fields.find(\n (item) => item.binding?.fieldId === initialField.fieldId,\n )\n if (field) index.fields[field.id] = { physicalColumnName: initialField.physicalColumnName }\n }\n }\n for (const initialRelation of initial.relations) {\n const relation = document.dataSchema.relations.find(\n (item) => item.id === initialRelation.relationId,\n )\n if (relation) {\n index.relations[relation.id] = {\n keyMappings: (initialRelation.keyMappings ?? []).map((mapping) => ({ ...mapping })),\n }\n }\n }\n return index\n}\n\nfunction diagnoseInitialDataModel(initial: DesignerInitialDataModel): DesignerDiagnostic[] {\n const diagnostics: DesignerDiagnostic[] = []\n if (!isPlainRecord(initial)) {\n return [error('INITIAL_TYPE', '首次数据模型参数必须是对象', '$.initialDataModel')]\n }\n if (\n typeof initial.provider !== 'string' ||\n !initial.provider ||\n typeof initial.sourceId !== 'string' ||\n !initial.sourceId\n ) {\n diagnostics.push(error('INITIAL_SOURCE', '首次数据模型参数缺少来源身份', '$.initialDataModel'))\n }\n if (\n initial.sourceRevision !== undefined &&\n (!Number.isInteger(initial.sourceRevision) || initial.sourceRevision < 0)\n ) {\n diagnostics.push(\n error(\n 'INITIAL_SOURCE_REVISION',\n '首次来源版本必须是非负整数',\n '$.initialDataModel.sourceRevision',\n ),\n )\n }\n if (!isInitialEntityShape(initial.rootEntity)) {\n diagnostics.push(\n error('INITIAL_ROOT_ENTITY', '首次主实体结构不完整', '$.initialDataModel.rootEntity'),\n )\n return diagnostics\n }\n if (!Array.isArray(initial.relations)) {\n diagnostics.push(\n error('INITIAL_RELATIONS', '首次关系目录必须是数组', '$.initialDataModel.relations'),\n )\n return diagnostics\n }\n const entityIds = new Set<string>()\n const entityCodes = new Set<string>()\n const fieldIds = new Set<string>()\n diagnoseInitialEntity(\n initial.rootEntity,\n '$.initialDataModel.rootEntity',\n diagnostics,\n entityIds,\n entityCodes,\n fieldIds,\n )\n const relationIds = new Set<string>()\n const relationCodes = new Set<string>()\n initial.relations.forEach((relation, index) => {\n const path = `$.initialDataModel.relations[${index}]`\n if (!isInitialRelationShape(relation)) {\n diagnostics.push(error('INITIAL_RELATION_TYPE', '首次一级关系结构不完整', path))\n return\n }\n if (!relation.relationId || relationIds.has(relation.relationId)) {\n diagnostics.push(error('INITIAL_RELATION_ID', '关系主键为空或重复', `${path}.relationId`))\n } else relationIds.add(relation.relationId)\n if (\n !DESIGNER_IDENTIFIER_PATTERN.test(relation.relationCode) ||\n relationCodes.has(relation.relationCode)\n ) {\n diagnostics.push(\n error('INITIAL_RELATION_CODE', '关系编码格式不正确或重复', `${path}.relationCode`),\n )\n } else relationCodes.add(relation.relationCode)\n if (!relation.relationName)\n diagnostics.push(error('INITIAL_RELATION_NAME', '关系名称不能为空', `${path}.relationName`))\n if (relation.parentEntityId !== initial.rootEntity.entityId) {\n diagnostics.push(\n error('INITIAL_RELATION_PARENT', '只允许主实体到一级子实体关系', `${path}.parentEntityId`),\n )\n }\n diagnoseInitialEntity(\n relation.childEntity,\n `${path}.childEntity`,\n diagnostics,\n entityIds,\n entityCodes,\n fieldIds,\n )\n if (relation.loadMode !== undefined && !['SYNC', 'ASYNC'].includes(relation.loadMode)) {\n diagnostics.push(\n error('INITIAL_RELATION_LOAD_MODE', '关系加载方式不正确', `${path}.loadMode`),\n )\n }\n const parentFieldIds = new Set(initial.rootEntity.fields.map((field) => field.fieldId))\n const childFieldIds = new Set(relation.childEntity.fields.map((field) => field.fieldId))\n const keyMappings = Array.isArray(relation.keyMappings) ? relation.keyMappings : []\n if (relation.keyMappings !== undefined && !Array.isArray(relation.keyMappings)) {\n diagnostics.push(\n error('INITIAL_RELATION_KEY_MAPPINGS', '关系键映射必须是数组', `${path}.keyMappings`),\n )\n }\n keyMappings.forEach((mapping, mappingIndex) => {\n const mappingPath = `${path}.keyMappings[${mappingIndex}]`\n if (!isPlainRecord(mapping)) {\n diagnostics.push(error('INITIAL_RELATION_KEY_MAPPING', '关系键映射必须是对象', mappingPath))\n return\n }\n if (!parentFieldIds.has(mapping.parentFieldId)) {\n diagnostics.push(\n error(\n 'INITIAL_RELATION_PARENT_FIELD',\n '键映射引用了不存在的主实体字段',\n `${mappingPath}.parentFieldId`,\n ),\n )\n }\n if (!childFieldIds.has(mapping.childFieldId)) {\n diagnostics.push(\n error(\n 'INITIAL_RELATION_CHILD_FIELD',\n '键映射引用了不存在的子实体字段',\n `${mappingPath}.childFieldId`,\n ),\n )\n }\n })\n })\n return diagnostics\n}\n\nfunction diagnoseInitialEntity(\n entity: DesignerInitialEntity,\n path: string,\n diagnostics: DesignerDiagnostic[],\n entityIds: Set<string>,\n entityCodes: Set<string>,\n fieldIds: Set<string>,\n): void {\n if (!entity.entityId || entityIds.has(entity.entityId))\n diagnostics.push(error('INITIAL_ENTITY_ID', '实体主键为空或重复', `${path}.entityId`))\n else entityIds.add(entity.entityId)\n if (!DESIGNER_IDENTIFIER_PATTERN.test(entity.entityCode) || entityCodes.has(entity.entityCode)) {\n diagnostics.push(error('INITIAL_ENTITY_CODE', '实体编码格式不正确或重复', `${path}.entityCode`))\n } else entityCodes.add(entity.entityCode)\n if (!entity.entityName)\n diagnostics.push(error('INITIAL_ENTITY_NAME', '实体名称不能为空', `${path}.entityName`))\n const fieldCodes = new Set<string>()\n entity.fields.forEach((field, index) => {\n const fieldPath = `${path}.fields[${index}]`\n if (!isPlainRecord(field)) {\n diagnostics.push(error('INITIAL_FIELD_TYPE', '首次字段描述必须是对象', fieldPath))\n return\n }\n if (!field.fieldId || fieldIds.has(field.fieldId))\n diagnostics.push(\n error('INITIAL_FIELD_ID', '字段主键为空或跨实体重复', `${fieldPath}.fieldId`),\n )\n else fieldIds.add(field.fieldId)\n if (!DESIGNER_IDENTIFIER_PATTERN.test(field.fieldCode) || fieldCodes.has(field.fieldCode)) {\n diagnostics.push(\n error('INITIAL_FIELD_CODE', '同一实体字段编码格式不正确或重复', `${fieldPath}.fieldCode`),\n )\n } else fieldCodes.add(field.fieldCode)\n const registration = findDesignerComponent(field.defaultComponentType)\n if (\n !registration ||\n registration.nodeKind !== 'FIELD' ||\n registration.availability === 'UNAVAILABLE' ||\n !registration.compatibleSemanticTypes.includes(field.semanticType)\n ) {\n diagnostics.push(\n error(\n 'INITIAL_FIELD_COMPONENT',\n '字段默认控件未注册、不可用或语义不兼容',\n `${fieldPath}.defaultComponentType`,\n ),\n )\n }\n })\n}\n\nfunction diagnoseLayoutDataScopes(\n document: DesignerDocument,\n diagnostics: DesignerDiagnostic[],\n): void {\n const relationUsage = new Set<string>()\n const relations = document.dataSchema.relations.filter(isOneToManyRelation)\n const visit = (nodes: DesignerLayoutNode[], entityCode: string, path: string): void => {\n nodes.forEach((node, index) => {\n const nodePath = `${path}[${index}]`\n if (node.nodeType === 'FIELD') {\n const field = document.dataSchema.fields.find((item) => item.id === node.fieldId)\n if (field && field.entityCode !== entityCode) {\n diagnostics.push(\n error(\n 'FIELD_ENTITY_SCOPE',\n `字段属于 ${field.entityCode},当前布局作用域为 ${entityCode}`,\n nodePath,\n ),\n )\n }\n return\n }\n if (SUBTABLE_COMPONENT_TYPES.has(node.componentType)) {\n const relationCode =\n typeof node.configuration.relationCode === 'string' ? node.configuration.relationCode : ''\n const relation = relations.find((item) => item.code === relationCode)\n if (!relation) {\n diagnostics.push(\n error(\n 'SUBTABLE_RELATION_REFERENCE',\n '子表引用了不存在的关系',\n `${nodePath}.configuration.relationCode`,\n ),\n )\n return\n }\n if (relationUsage.has(relation.code)) {\n diagnostics.push(\n error(\n 'SUBTABLE_RELATION_DUPLICATE',\n '同一关系不能绑定两个可写子表',\n `${nodePath}.configuration.relationCode`,\n ),\n )\n }\n relationUsage.add(relation.code)\n node.slots.forEach((slot, slotIndex) =>\n visit(\n slot.children,\n relation.childEntity.code,\n `${nodePath}.slots[${slotIndex}].children`,\n ),\n )\n return\n }\n node.slots.forEach((slot, slotIndex) =>\n visit(slot.children, entityCode, `${nodePath}.slots[${slotIndex}].children`),\n )\n })\n }\n visit(document.uiSchema.root, document.dataSchema.rootEntity.code, '$.uiSchema.root')\n}\n\nfunction diagnoseEntity(\n entity: DesignerDataEntity,\n path: string,\n diagnostics: DesignerDiagnostic[],\n): void {\n if (!entity?.id) diagnostics.push(error('ENTITY_ID', '实体主键不能为空', `${path}.id`))\n if (!entity?.name) diagnostics.push(error('ENTITY_NAME', '实体名称不能为空', `${path}.name`))\n if (!DESIGNER_IDENTIFIER_PATTERN.test(entity?.code ?? '')) {\n diagnostics.push(\n error('ENTITY_CODE', '实体编码必须以字母开头且只能包含字母、数字和下划线', `${path}.code`),\n )\n }\n}\n\nfunction nextRelationSerial(document: DesignerDocument): number {\n const used = new Set(document.dataSchema.relations.map((relation) => relation.childEntity.code))\n let serial = 1\n while (used.has(`detail_${serial}`)) serial += 1\n return serial\n}\n\nfunction nextRelationCode(rootCode: string, used: Set<string>, start: number): string {\n let serial = Math.max(1, start)\n let code = `${rootCode}_detail_${serial}`\n while (used.has(code)) {\n serial += 1\n code = `${rootCode}_detail_${serial}`\n }\n return code\n}\n\nfunction nextChildEntityCode(used: Set<string>, start: number): string {\n let serial = Math.max(1, start)\n let code = `detail_${serial}`\n while (used.has(code)) {\n serial += 1\n code = `detail_${serial}`\n }\n return code\n}\n\nfunction relationTitle(node: Extract<DesignerLayoutNode, { nodeType: 'CONTAINER' }>): string {\n return typeof node.configuration.title === 'string' ? node.configuration.title.trim() : ''\n}\n\nfunction toDataEntity(entity: DesignerInitialEntity): DesignerDataEntity {\n return { id: entity.entityId, code: entity.entityCode, name: entity.entityName }\n}\n\nfunction findNode(nodes: DesignerLayoutNode[], nodeId: string): DesignerLayoutNode | undefined {\n for (const node of nodes) {\n if (node.id === nodeId) return node\n if (node.nodeType !== 'CONTAINER') continue\n for (const slot of node.slots) {\n const found = findNode(slot.children, nodeId)\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction isFieldPlaced(nodes: DesignerLayoutNode[], fieldId: string): boolean {\n return nodes.some((node) => {\n if (node.nodeType === 'FIELD') return node.fieldId === fieldId\n return node.slots.some((slot) => isFieldPlaced(slot.children, fieldId))\n })\n}\n\nfunction walkNodes(nodes: DesignerLayoutNode[], visitor: (node: DesignerLayoutNode) => void): void {\n for (const node of nodes) {\n visitor(node)\n if (node.nodeType === 'CONTAINER') {\n node.slots.forEach((slot) => walkNodes(slot.children, visitor))\n }\n }\n}\n\nfunction defaultValueFor(type: DesignerField['semanticType']): unknown {\n if (type === 'ARRAY') return []\n if (type === 'BOOLEAN') return false\n if (type === 'NUMBER' || type === 'OBJECT') return null\n return ''\n}\n\nfunction emptySourceMetadata(): DesignerSourceMetadataIndex {\n return { provider: '', sourceId: '', entities: {}, fields: {}, relations: {} }\n}\n\nfunction error(code: string, message: string, path: string): DesignerDiagnostic {\n return { severity: 'ERROR', code, message, path }\n}\n\nfunction pushUnknownProperties(\n source: object,\n allowed: string[],\n path: string,\n diagnostics: DesignerDiagnostic[],\n): void {\n const allowedKeys = new Set(allowed)\n Object.keys(source).forEach((key) => {\n if (!allowedKeys.has(key)) {\n diagnostics.push(\n error('DATA_MODEL_UNKNOWN_PROPERTY', `数据模型不允许属性 ${key}`, `${path}.${key}`),\n )\n }\n })\n}\n\nfunction isDataEntity(value: unknown): value is DesignerDataEntity {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const entity = value as Record<string, unknown>\n return (\n typeof entity.id === 'string' &&\n typeof entity.code === 'string' &&\n typeof entity.name === 'string'\n )\n}\n\nfunction isInitialEntityShape(value: unknown): value is DesignerInitialEntity {\n return isPlainRecord(value) && Array.isArray(value.fields)\n}\n\nfunction isInitialRelationShape(\n value: unknown,\n): value is DesignerInitialDataModel['relations'][number] {\n return isPlainRecord(value) && isInitialEntityShape(value.childEntity)\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isOneToManyRelation(value: unknown): value is DesignerOneToManyRelation {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const relation = value as Record<string, unknown>\n return (\n typeof relation.id === 'string' &&\n typeof relation.code === 'string' &&\n typeof relation.name === 'string' &&\n typeof relation.parentEntityId === 'string' &&\n isDataEntity(relation.childEntity)\n )\n}\n\nfunction cloneRecord(source: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return JSON.parse(JSON.stringify(source)) as Record<string, unknown>\n}\n\nfunction cloneDocument(document: DesignerDocument): DesignerDocument {\n return JSON.parse(JSON.stringify(document)) as DesignerDocument\n}\n\nfunction createProtocolId(prefix: string): string {\n const random =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID().replaceAll('-', '')\n : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`\n return `${prefix}-${random}`\n}\n","/** 设计器文档当前稳定版本。 */\nexport const DESIGNER_DOCUMENT_VERSION = '1.0' as const\n\n/** 设计器字段的语义数据类型,不包含任何数据库方言。 */\nexport type DesignerSemanticType =\n | 'STRING'\n | 'LONG_TEXT'\n | 'NUMBER'\n | 'BOOLEAN'\n | 'DATE'\n | 'DATE_TIME'\n | 'FILE'\n | 'REFERENCE'\n | 'OBJECT'\n | 'ARRAY'\n\n/** 本地字段与未来权威字段来源之间的绑定状态。 */\nexport type DesignerBindingStatus = 'UNBOUND' | 'BOUND' | 'STALE' | 'INCOMPATIBLE' | 'MISSING'\n\n/** 设计器组件在静态 Core 中的能力状态。 */\nexport type DesignerComponentAvailability = 'AVAILABLE' | 'CONDITIONAL' | 'UNAVAILABLE'\n\n/** 组件面板的稳定分类。 */\nexport type DesignerComponentGroup =\n 'LAYOUT' | 'BASIC' | 'ADVANCED' | 'DYNAMIC' | 'SUBTABLE' | 'AUXILIARY'\n\n/** 设计器与静态运行预览共用的模式。 */\nexport type DesignerRuntimeMode = 'DESIGN' | 'CREATE' | 'EDIT' | 'READ_ONLY' | 'DETAIL'\n\n/** 设计器当前设备。移动端只复用同一份 Schema。 */\nexport type DesignerDevice = 'desktop' | 'mobile'\n\n/**\n * 静态预览中的子表行。\n *\n * `rowId` 只标识当前预览副本中的一行;`values` 使用字段 ID 作为键,避免字段编码调整后串行数据。\n */\nexport interface DesignerSubtableRow {\n rowId: string\n values: Record<string, unknown>\n}\n\n/**\n * 子表各展示形态共用的只读列投影。\n *\n * 列标识来自布局节点,字段身份来自 Data Schema;该投影不进入设计文档,也不持有可变节点引用。\n */\nexport interface DesignerSubtableColumn {\n columnId: string\n fieldId: string\n fieldKey: string\n label: string\n componentType: string\n semanticType: DesignerSemanticType\n}\n\n/**\n * 静态运行预览的值仓库。\n *\n * 普通字段与集合值分开保存;集合以子表容器节点 ID 为键,整个仓库只属于预览副本,不允许写回设计文档。\n */\nexport interface DesignerRuntimeValueStore {\n fields: Record<string, unknown>\n collections: Record<string, DesignerSubtableRow[]>\n}\n\n/** 表达式读取字段时的受控数据作用域。 */\nexport type DesignerExpressionFieldScope = 'ROOT' | 'CURRENT_ROW'\n\n/** 表达式可读取的受控上下文值。 */\nexport type DesignerExpressionContextKey =\n 'RUNTIME_MODE' | 'DEVICE' | 'CURRENT_USER_ID' | 'CURRENT_TENANT_ID' | 'NOW'\n\n/** 声明式表达式 AST;Core 不持久化或执行自由脚本。 */\nexport type DesignerExpression =\n | { kind: 'LITERAL'; value: string | number | boolean | null }\n | { kind: 'FIELD'; fieldId: string; scope: DesignerExpressionFieldScope }\n | { kind: 'VARIABLE'; variableCode: string }\n | { kind: 'CONTEXT'; key: DesignerExpressionContextKey }\n | {\n kind: 'CALL'\n function: DesignerExpressionFunction\n arguments: DesignerExpression[]\n }\n\n/** 表达式解释器允许的纯函数目录。 */\nexport type DesignerExpressionFunction =\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'EQ'\n | 'NE'\n | 'GT'\n | 'GTE'\n | 'LT'\n | 'LTE'\n | 'EMPTY'\n | 'NOT_EMPTY'\n | 'IN'\n | 'CONTAINS'\n | 'ADD'\n | 'SUBTRACT'\n | 'MULTIPLY'\n | 'DIVIDE'\n | 'CONCAT'\n | 'COALESCE'\n | 'LENGTH'\n | 'IF'\n\n/** 字段运行状态规则。 */\nexport interface DesignerFieldStateRule {\n id: string\n target: 'VISIBLE' | 'REQUIRED' | 'DISABLED'\n condition: DesignerExpression\n valueWhenTrue: boolean\n valueWhenFalse?: boolean\n}\n\n/** 联动规则覆盖已有目标值时采用的受控策略。 */\nexport type DesignerLinkageOverwritePolicy = 'ALWAYS' | 'EMPTY_ONLY' | 'CONFIRM'\n\n/** 确定性重算并使目标字段保持只读的计算公式。 */\nexport interface DesignerFormulaValueRule {\n id: string\n mode: 'FORMULA'\n expression: DesignerExpression\n condition?: DesignerExpression\n}\n\n/** 仅在依赖字段变化后执行的数据联动。 */\nexport interface DesignerLinkageValueRule {\n id: string\n mode: 'LINKAGE'\n expression: DesignerExpression\n condition?: DesignerExpression\n overwritePolicy: DesignerLinkageOverwritePolicy\n}\n\n/** 字段计算或赋值联动规则。 */\nexport type DesignerFieldValueRule = DesignerFormulaValueRule | DesignerLinkageValueRule\n\n/** 字段验证规则类型。必填仍由字段 required 或状态规则独立决定。 */\nexport type DesignerValidationRuleType =\n | 'LENGTH'\n | 'RANGE'\n | 'PRECISION'\n | 'FORMAT'\n | 'REGEX'\n | 'DATE'\n | 'SELECTION'\n | 'FILE'\n | 'COMPARE_FIELD'\n | 'EXPRESSION'\n | 'SUBTABLE'\n | 'REMOTE'\n\n/** 验证规则通用字段;规则参数由具体类型收紧。 */\nexport interface DesignerValidationRuleBase {\n id: string\n name: string\n enabled: boolean\n trigger: 'CHANGE' | 'BLUR' | 'SUBMIT'\n severity: 'ERROR' | 'WARNING'\n message: string\n condition?: DesignerExpression\n}\n\n/** 最小值与最大值区间配置。 */\nexport interface DesignerValidationRangeConfiguration {\n minimum?: number\n maximum?: number\n}\n\n/** 跨字段比较允许的受控操作符。 */\nexport type DesignerValidationComparisonOperator = 'EQ' | 'NE' | 'GT' | 'GTE' | 'LT' | 'LTE'\n\n/** 各验证规则类型对应的严格参数。 */\nexport interface DesignerValidationConfigurationMap {\n LENGTH: DesignerValidationRangeConfiguration\n RANGE: DesignerValidationRangeConfiguration\n PRECISION: { scale: number }\n FORMAT: { format: 'EMAIL' | 'PHONE' | 'IDENTIFIER' }\n REGEX: { pattern: string }\n DATE: { minimum?: string; maximum?: string }\n SELECTION: DesignerValidationRangeConfiguration\n FILE: { maximumCount?: number; maximumSizeMb?: number; accept?: string }\n COMPARE_FIELD: { fieldId: string; operator: DesignerValidationComparisonOperator }\n EXPRESSION: { expression: DesignerExpression }\n SUBTABLE: { containerId: string; minimumRows?: number; maximumRows?: number }\n REMOTE: { provider: string; validatorId: string }\n}\n\n/** 声明式字段验证规则判别联合,JSON 外形保持 `type + configuration`。 */\nexport type DesignerValidationRule = {\n [Type in DesignerValidationRuleType]: DesignerValidationRuleBase & {\n type: Type\n configuration: DesignerValidationConfigurationMap[Type]\n }\n}[DesignerValidationRuleType]\n\n/** 字段是否进入最终提交数据。 */\nexport type DesignerFieldSubmitBehavior = 'AUTO' | 'INCLUDE' | 'EXCLUDE'\n\n/** 组件可绑定的运行事件。 */\nexport type DesignerComponentEvent = 'CHANGE' | 'BLUR' | 'FOCUS' | 'CLICK'\n\n/** 字段行为配置。 */\nexport interface DesignerFieldBehavior {\n stateRules: DesignerFieldStateRule[]\n valueRules: DesignerFieldValueRule[]\n validationRules: DesignerValidationRule[]\n submitBehavior: DesignerFieldSubmitBehavior\n eventBindings: Partial<Record<DesignerComponentEvent, string>>\n}\n\n/** 静态选项的稳定结构。 */\nexport interface DesignerOption {\n label: string\n value: string | number | boolean\n disabled?: boolean\n children?: DesignerOption[]\n}\n\n/** 可选外部字段绑定引用;Core 只保存稳定引用,不解释业务来源。 */\nexport interface DesignerFieldBinding {\n provider: string\n sourceId: string\n fieldId: string\n fieldPath: string\n sourceDataType: string\n sourceRevision?: number\n}\n\n/** 设计文档保存的外部数据模型身份;不包含物理表、物理列或键映射。 */\nexport interface DesignerDataModelSource {\n provider: string\n sourceId: string\n sourceRevision?: number\n}\n\n/** 设计文档中的语义实体身份。 */\nexport interface DesignerDataEntity {\n id: string\n code: string\n name: string\n}\n\n/** 当前 Core 支持的主实体到一级子实体一对多关系。 */\nexport interface DesignerOneToManyRelation {\n id: string\n code: string\n name: string\n parentEntityId: string\n childEntity: DesignerDataEntity\n loadMode: 'SYNC' | 'ASYNC'\n}\n\n/** 字段基础校验。专属校验继续存放在版本化组件配置中。 */\nexport interface DesignerFieldValidation {\n minimumLength?: number\n maximumLength?: number\n minimum?: number\n maximum?: number\n pattern?: string\n message?: string\n}\n\n/** 字段展示配置。 */\nexport interface DesignerFieldDisplay {\n placeholder: string\n hidden: boolean\n readonly: boolean\n}\n\n/** 数据 Schema 中的本地语义字段。 */\nexport interface DesignerField {\n id: string\n /** 字段所属语义实体编码;根级字段必须属于主实体,子表列必须属于对应子实体。 */\n entityCode: string\n key: string\n label: string\n semanticType: DesignerSemanticType\n componentType: string\n configurationVersion: number\n configuration: Record<string, unknown>\n defaultValue: unknown\n helpText: string\n required: boolean\n validation: DesignerFieldValidation\n /** 条件状态、计算联动、独立验证、提交投影和事件绑定。 */\n behavior: DesignerFieldBehavior\n display: DesignerFieldDisplay\n bindingStatus: DesignerBindingStatus\n primaryKey: boolean\n systemField: boolean\n displayOrder: number\n binding?: DesignerFieldBinding\n}\n\n/** 文档内持久化的数据模型目录。 */\nexport interface DesignerDataSchema {\n source?: DesignerDataModelSource\n rootEntity: DesignerDataEntity\n relations: DesignerOneToManyRelation[]\n fields: DesignerField[]\n}\n\n/** 单端 24 栅格配置。 */\nexport interface DesignerDeviceGrid {\n span: number\n offset: number\n showLabel: boolean\n labelPosition: 'INHERIT' | 'TOP' | 'LEFT' | 'RIGHT'\n}\n\n/** PC 与移动端共用字段树时的响应式布局。 */\nexport interface DesignerResponsiveGrid {\n pc: DesignerDeviceGrid\n mobile: DesignerDeviceGrid\n}\n\n/** 引用数据字段的 UI 节点。 */\nexport interface DesignerFieldNode {\n nodeType: 'FIELD'\n id: string\n fieldId: string\n layout: DesignerResponsiveGrid\n}\n\n/** 容器中的稳定命名插槽。 */\nexport interface DesignerLayoutSlot {\n id: string\n slotCode: string\n label: string\n children: DesignerLayoutNode[]\n}\n\n/** 显式布局或辅助组件节点。 */\nexport interface DesignerContainerNode {\n nodeType: 'CONTAINER'\n id: string\n componentType: string\n configurationVersion: number\n configuration: Record<string, unknown>\n layout: DesignerResponsiveGrid\n slots: DesignerLayoutSlot[]\n /** 容器或辅助组件仅保存注册表允许的事件绑定。 */\n eventBindings?: Partial<Record<DesignerComponentEvent, string>>\n}\n\n/** 设计器 UI Schema 节点。 */\nexport type DesignerLayoutNode = DesignerFieldNode | DesignerContainerNode\n\n/** 表单字段控件和显式容器共用的受控圆角档位。 */\nexport type DesignerRadiusPreset = 'THEME' | 'NONE' | 'SMALL' | 'BASE' | 'LARGE'\n\n/** 表单显式布局容器允许使用的表面样式。 */\nexport type DesignerContainerStyle = 'NONE' | 'BORDERED' | 'SHADOW'\n\n/** 容器节点对表单默认表面样式的覆盖值。 */\nexport type DesignerContainerStyleOverride = 'INHERIT' | DesignerContainerStyle | 'FILLED'\n\n/** 容器节点对表单默认圆角的覆盖值。 */\nexport type DesignerContainerRadiusOverride = 'INHERIT' | DesignerRadiusPreset\n\n/** 批量恢复容器外观继承时可独立处理的配置维度。 */\nexport type DesignerContainerAppearanceDimension = 'STYLE' | 'RADIUS'\n\n/** 表单整体外观配置。 */\nexport interface DesignerAppearance {\n labelPosition: 'TOP' | 'LEFT' | 'RIGHT'\n labelWidth: number\n labelSuffix: string\n labelAlign: 'LEFT' | 'RIGHT'\n defaultPlaceholder: string\n gridGutter: number\n /** 字段栅格的纵向行距,单位为 px,合法范围为 0~64。 */\n rowGap: number\n defaultPcSpan: number\n defaultMobileSpan: number\n readonlyDisplayMode: 'CONTROL' | 'TEXT'\n size: 'SMALL' | 'DEFAULT' | 'LARGE'\n /** 普通字段控件统一使用的圆角;THEME 表示继续跟随系统主题。 */\n controlRadius: DesignerRadiusPreset\n /** 支持表面的显式布局容器在未覆盖时使用的默认样式。 */\n containerStyle: DesignerContainerStyle\n /** 支持表面的显式布局容器在未覆盖时使用的默认圆角。 */\n containerRadius: DesignerRadiusPreset\n}\n\n/** 表单提交时对普通隐藏字段的统一处理策略。 */\nexport interface DesignerSubmitPolicy {\n ignoreHiddenFields: boolean\n}\n\n/** 运行态动作栏中的受控按钮。 */\nexport interface DesignerActionBarButton {\n action: 'SUBMIT' | 'RESET' | 'PRINT'\n label: string\n enabled: boolean\n}\n\n/** 表单运行态动作栏配置。 */\nexport interface DesignerActionBar {\n visible: boolean\n position: 'TOP' | 'BOTTOM' | 'BOTH'\n align: 'LEFT' | 'CENTER' | 'RIGHT'\n buttons: DesignerActionBarButton[]\n}\n\n/** 表单持久化变量定义;运行值不写入设计文档。 */\nexport interface DesignerVariableDefinition {\n id: string\n code: string\n name: string\n valueType: 'STRING' | 'NUMBER' | 'BOOLEAN' | 'DATE' | 'OBJECT'\n initialValue: string | number | boolean | null\n}\n\n/** 数据源输入或输出映射。 */\nexport interface DesignerDataSourceMapping {\n source: string\n target: string\n}\n\n/** Core 只保存稳定来源身份和映射,不保存 URL、SQL、请求头或凭据。 */\nexport interface DesignerDataSourceDefinition {\n id: string\n code: string\n name: string\n provider: string\n sourceId: string\n sourceRevision?: number\n inputMappings: DesignerDataSourceMapping[]\n outputMappings: DesignerDataSourceMapping[]\n}\n\n/** 表单生命周期事件。 */\nexport type DesignerFormEvent = 'INITIALIZED' | 'BEFORE_SUBMIT' | 'AFTER_SUBMIT' | 'RESET'\n\n/** 声明式动作步骤类型。 */\nexport type DesignerEventActionType =\n | 'SET_FIELD'\n | 'CLEAR_FIELD'\n | 'COPY_FIELD'\n | 'SET_VARIABLE'\n | 'VALIDATE'\n | 'SUBMIT'\n | 'RESET'\n | 'PRINT'\n | 'MESSAGE'\n | 'OPEN_MODULE'\n | 'CONFIRM_MODULE'\n | 'CANCEL_MODULE'\n | 'NAVIGATE_RESOURCE'\n | 'REFRESH_DATA_SOURCE'\n | 'HOST_ACTION'\n\n/** 事件动作的错误处理策略。 */\nexport type DesignerEventErrorPolicy = 'STOP' | 'CONTINUE'\n\n/** 引导式事件流中的单个动作。 */\nexport interface DesignerEventActionStep {\n id: string\n stepType: 'ACTION'\n name: string\n actionType: DesignerEventActionType\n configuration: Record<string, unknown>\n guard?: DesignerExpression\n guardFailure: 'SKIP' | 'BLOCK'\n onError: DesignerEventErrorPolicy\n}\n\n/** 条件分支。 */\nexport interface DesignerEventConditionBranch {\n id: string\n name: string\n condition: DesignerExpression\n steps: DesignerEventStep[]\n}\n\n/** 引导式事件流中的条件节点。 */\nexport interface DesignerEventConditionStep {\n id: string\n stepType: 'CONDITION'\n name: string\n branches: DesignerEventConditionBranch[]\n elseSteps: DesignerEventStep[]\n}\n\n/** 事件流递归步骤。 */\nexport type DesignerEventStep = DesignerEventActionStep | DesignerEventConditionStep\n\n/** 可由字段、容器或表单生命周期引用的声明式事件流。 */\nexport interface DesignerEventFlow {\n id: string\n code: string\n name: string\n trigger:\n | { scope: 'FORM'; event: DesignerFormEvent }\n | { scope: 'COMPONENT'; event: DesignerComponentEvent; nodeId: string }\n enabled: boolean\n steps: DesignerEventStep[]\n}\n\n/** 弹层模块类型。 */\nexport type DesignerOverlayKind = 'DIALOG' | 'DRAWER'\n\n/** 弹层模块的数据草稿来源。 */\nexport type DesignerOverlayDataContext = 'FORM_DRAFT' | 'SUBTABLE_ROW_DRAFT'\n\n/** 弹窗在运行态允许使用的最大高度档位。 */\nexport type DesignerOverlayMaxHeightPreset = 'COMPACT' | 'STANDARD' | 'SPACIOUS' | 'VIEWPORT'\n\n/** 主体之外可被事件打开的弹窗或抽屉视图。 */\nexport interface DesignerOverlayModule {\n id: string\n code: string\n name: string\n kind: DesignerOverlayKind\n dataContext: DesignerOverlayDataContext\n width: number\n /** 弹窗使用的受控圆角档位;抽屉保留该值但不渲染圆角。 */\n radius: DesignerRadiusPreset\n /** 弹窗运行最大高度;抽屉保留该值但继续占满可用高度。 */\n maxHeightPreset: DesignerOverlayMaxHeightPreset\n root: DesignerLayoutNode[]\n}\n\n/** 国际化词条。 */\nexport interface DesignerI18nEntry {\n key: string\n values: Record<string, string>\n}\n\n/** 表单国际化配置。 */\nexport interface DesignerI18nConfiguration {\n enabled: boolean\n defaultLocale: string\n locales: string[]\n entries: DesignerI18nEntry[]\n}\n\n/** 可设计视图集合。主体 root 保持旧协议位置,弹层作为增量集合。 */\nexport interface DesignerUiSchema {\n root: DesignerLayoutNode[]\n overlays: DesignerOverlayModule[]\n}\n\n/** 独立设计器完整文档。 */\nexport interface DesignerDocument {\n documentVersion: typeof DESIGNER_DOCUMENT_VERSION\n id: string\n name: string\n description: string\n dataSchema: DesignerDataSchema\n uiSchema: DesignerUiSchema\n appearance: DesignerAppearance\n submitPolicy: DesignerSubmitPolicy\n actionBar: DesignerActionBar\n variables: DesignerVariableDefinition[]\n dataSources: DesignerDataSourceDefinition[]\n eventFlows: DesignerEventFlow[]\n i18n: DesignerI18nConfiguration\n actions: DesignerAction[]\n extensions: Record<string, unknown>\n}\n\n/** Core 仅保存声明式动作引用,不接受自由脚本。 */\nexport interface DesignerAction {\n code: string\n name: string\n handlerType: 'SAVE' | 'RESET' | 'DELETE' | 'PRINT' | 'NAVIGATE'\n target?: string\n}\n\n/** 属性编辑器中的稳定原子选项。 */\nexport interface DesignerPropertyOption {\n label: string\n value: string | number | boolean\n disabled?: boolean\n}\n\n/** 属性编辑器的共享行为;历史值策略只影响编辑显示,不会改写文档。 */\nexport interface DesignerPropertyEditorBase {\n visibleWhen?: (configuration: Readonly<Record<string, unknown>>) => boolean\n legacyValuePolicy?: 'PRESERVE' | 'REJECT'\n /** 为需要保留的旧枚举值提供可理解的显示名称,避免属性面板暴露内部编码。 */\n legacyValueLabels?: Readonly<Record<string, string>>\n}\n\n/**\n * 组件注册项使用的业务语义属性编辑器。\n *\n * 判别联合把受控选项、单位、范围和专属能力集中在注册表,属性面板只解释该接口,\n * 不再根据字段 key 或 JavaScript 值类型猜测应该使用哪一种输入控件。\n */\nexport type DesignerPropertyEditor =\n | (DesignerPropertyEditorBase & {\n type: 'TEXT'\n maxLength?: number\n })\n | (DesignerPropertyEditorBase & {\n type: 'TEXTAREA'\n rows?: number\n maxLength?: number\n })\n | (DesignerPropertyEditorBase & {\n type: 'NUMBER'\n minimum?: number\n maximum?: number\n step?: number\n unit?: string\n })\n | (DesignerPropertyEditorBase & { type: 'BOOLEAN' })\n | (DesignerPropertyEditorBase & {\n type: 'SELECT' | 'SEGMENTED'\n options: DesignerPropertyOption[]\n })\n | (DesignerPropertyEditorBase & {\n type: 'PRESET_NUMBER'\n options: DesignerPropertyOption[]\n minimum?: number\n maximum?: number\n unit?: string\n })\n | (DesignerPropertyEditorBase & { type: 'COLOR' })\n | (DesignerPropertyEditorBase & { type: 'OPTIONS' })\n | (DesignerPropertyEditorBase & {\n type: 'DATE_FORMAT'\n sourceKey: string\n })\n | (DesignerPropertyEditorBase & { type: 'FILE_TYPES' })\n | (DesignerPropertyEditorBase & {\n type: 'URL'\n maxLength?: number\n })\n | (DesignerPropertyEditorBase & {\n type: 'RESOURCE_REFERENCE'\n resourceType: 'DICTIONARY' | 'PROCESS' | 'FORM' | 'ASSET_POLICY'\n unavailableReason: string\n })\n | (DesignerPropertyEditorBase & {\n type: 'GRID_SPAN'\n device: DesignerDevice\n })\n | (DesignerPropertyEditorBase & {\n type: 'GRID_OFFSET'\n spanKey: string\n })\n | (DesignerPropertyEditorBase & {\n type: 'IDENTIFIER'\n maxLength?: number\n })\n\n/** 注册项贡献给属性工作台的结构化属性。 */\nexport interface DesignerPropertyDefinition {\n key: string\n label: string\n section: 'BASIC' | 'DATA' | 'DISPLAY' | 'CAPABILITY'\n editor: DesignerPropertyEditor\n description?: string\n}\n\n/** 组件注册项是组件目录、节点工厂、属性和渲染行为的唯一真源。 */\nexport interface DesignerComponentRegistration {\n componentType: string\n name: string\n icon: string\n group: DesignerComponentGroup\n nodeKind: 'FIELD' | 'CONTAINER'\n semanticType: DesignerSemanticType\n compatibleSemanticTypes: DesignerSemanticType[]\n configurationVersion: number\n defaultConfiguration: Readonly<Record<string, unknown>>\n defaultSpan: number\n /** 新建节点的外层字段标签默认状态;已有文档继续使用节点自身布局值。 */\n defaultShowLabel: boolean\n /** 详情态外层标签策略;自描述组件可以隐藏重复标签,但不改写布局配置。 */\n detailLabelPolicy: 'INHERIT' | 'HIDE'\n /** 只有 SURFACE 容器才允许继承或覆盖表单级容器外观。 */\n containerAppearance: 'NONE' | 'SURFACE'\n availability: DesignerComponentAvailability\n unavailableReason: string\n acceptsChildren: boolean\n /** 注册项显式声明可绑定事件;未声明时不显示事件入口。 */\n supportedEvents?: DesignerComponentEvent[]\n properties: DesignerPropertyDefinition[]\n}\n\n/** 运行表达式时由 Host 提供的只读上下文。 */\nexport interface DesignerExpressionRuntimeContext {\n fields: Record<string, unknown>\n currentRow?: Record<string, unknown>\n variables: Record<string, unknown>\n context: Partial<Record<DesignerExpressionContextKey, unknown>>\n}\n\n/** 字段解释后的运行状态。 */\nexport interface DesignerResolvedFieldState {\n visible: boolean\n required: boolean\n disabled: boolean\n}\n\n/** 单条运行验证结果。 */\nexport interface DesignerValidationResult {\n fieldId: string\n ruleId: string\n severity: 'ERROR' | 'WARNING'\n message: string\n}\n\n/** 字段下方分别展示的错误与非阻断警告。 */\nexport interface DesignerFieldFeedback {\n error?: string\n warning?: string\n}\n\n/** 提交投影结果。 */\nexport interface DesignerSubmissionProjection {\n fields: Record<string, unknown>\n collections: Record<string, DesignerSubtableRow[]>\n excludedFieldIds: string[]\n}\n\n/** 宿主注入给远程能力的稳定运行上下文,不包含认证凭据或传输配置。 */\nexport interface FormRuntimeAdapterContext {\n applicationCode?: string\n resourceCode?: string\n formId?: string\n recordToken?: string\n moduleCode?: string\n rowKey?: string\n extension?: Readonly<Record<string, unknown>>\n}\n\n/** 文件上传完成后供运行表单展示的资源元数据。 */\nexport interface FormAssetReference {\n assetId: string\n name: string\n size: number\n contentType?: string\n downloadUrl?: string\n}\n\n/** 文件上传请求;Schema 只保存约束,真实文件和宿主上下文只存在于本次调用。 */\nexport interface FormAssetUploadRequest {\n file: File\n fieldId: string\n fieldCode: string\n policyRef?: string\n context: FormRuntimeAdapterContext\n}\n\n/** 文件元数据批量解析请求。 */\nexport interface FormAssetResolveRequest {\n assetIds: string[]\n fieldId: string\n fieldCode: string\n context: FormRuntimeAdapterContext\n}\n\n/** 文件下载请求。 */\nexport interface FormAssetDownloadRequest {\n assetId: string\n fieldId: string\n fieldCode: string\n context: FormRuntimeAdapterContext\n}\n\n/** 文件下载结果;宿主可以返回可访问 URL 或需要浏览器保存的 Blob。 */\nexport type FormAssetDownloadResult =\n | { kind: 'URL'; url: string; fileName?: string }\n | { kind: 'BLOB'; blob: Blob; fileName: string; contentType?: string }\n\n/** 文件上传、元数据解析与下载端口。物理删除不属于字段编辑语义。 */\nexport interface FormAssetAdapter {\n upload: (request: FormAssetUploadRequest) => Promise<FormAssetReference>\n resolve: (request: FormAssetResolveRequest) => Promise<FormAssetReference[]>\n download: (request: FormAssetDownloadRequest) => Promise<FormAssetDownloadResult>\n}\n\n/** 受控远程验证 Adapter。 */\nexport interface DesignerRemoteValidationAdapter {\n validate: (request: {\n provider: string\n validatorId: string\n value: unknown\n fieldId: string\n }) => Promise<{ valid: boolean; message?: string }>\n}\n\n/** 受控数据源运行 Adapter。 */\nexport interface DesignerDataSourceAdapter {\n execute: (\n definition: DesignerDataSourceDefinition,\n input: Record<string, unknown>,\n ) => Promise<Record<string, unknown>>\n}\n\n/** Host 动作与同应用资源导航 Adapter。 */\nexport interface DesignerHostActionAdapter {\n execute: (actionCode: string, input: Record<string, unknown>) => Promise<void>\n navigateResource: (resourceCode: string, openInNewPage: boolean) => Promise<void>\n}\n\n/** 同应用资源导航端口。 */\nexport interface FormNavigationAdapter {\n navigate: (request: {\n resourceCode: string\n openInNewPage: boolean\n context: FormRuntimeAdapterContext\n }) => Promise<void>\n}\n\n/** 人员、组织、角色和岗位等目录选择端口。 */\nexport interface FormDirectoryAdapter {\n query: (request: {\n subjectType: string\n keyword: string\n pageNo: number\n pageSize: number\n context: FormRuntimeAdapterContext\n }) => Promise<{\n items: Array<{ id: string; label: string; description?: string }>\n totalCount: number\n }>\n}\n\n/** OCR 识别端口。 */\nexport interface FormOcrAdapter {\n recognize: (request: {\n file: File\n fieldId: string\n fieldCode: string\n provider?: string\n context: FormRuntimeAdapterContext\n }) => Promise<Record<string, unknown>>\n}\n\n/** 扫码端口。 */\nexport interface FormScanAdapter {\n scan: (request: { context: FormRuntimeAdapterContext }) => Promise<{ text: string }>\n}\n\n/** 定位端口。 */\nexport interface FormLocationAdapter {\n locate: (request: {\n context: FormRuntimeAdapterContext\n }) => Promise<{ longitude: number; latitude: number; address?: string }>\n}\n\n/** 联动覆盖已有字段值前由 Host 提供的受控确认 Adapter。 */\nexport interface DesignerLinkageConfirmationAdapter {\n confirmOverwrite: (request: {\n fieldId: string\n fieldLabel: string\n currentValue: unknown\n nextValue: unknown\n }) => Promise<boolean>\n}\n\n/** 静态运行预览可选 Adapter 集合;缺少能力时必须失败关闭。 */\nexport interface DesignerRuntimeAdapters {\n asset?: FormAssetAdapter\n remoteValidation?: DesignerRemoteValidationAdapter\n dataSource?: DesignerDataSourceAdapter\n hostAction?: DesignerHostActionAdapter\n linkageConfirmation?: DesignerLinkageConfirmationAdapter\n navigation?: FormNavigationAdapter\n directory?: FormDirectoryAdapter\n ocr?: FormOcrAdapter\n scan?: FormScanAdapter\n location?: FormLocationAdapter\n}\n\n/** 对外公开的运行 Adapter 集合别名。 */\nexport type FormRuntimeAdapters = DesignerRuntimeAdapters\n\n/** 文档诊断级别。 */\nexport type DesignerDiagnosticSeverity = 'ERROR' | 'WARNING'\n\n/** 设计文档的可定位诊断。 */\nexport interface DesignerDiagnostic {\n severity: DesignerDiagnosticSeverity\n code: string\n message: string\n path: string\n}\n\n/** 文档解码结果。错误诊断存在时不返回文档。 */\nexport interface DesignerDocumentDecodeResult {\n document?: DesignerDocument\n diagnostics: DesignerDiagnostic[]\n}\n\n/** 画布中可接收新节点的稳定目标。 */\nexport interface DesignerDropTarget {\n containerId: string | null\n slotCode: string\n index: number\n placement?: 'BEFORE' | 'AFTER' | 'INSIDE' | 'GRID'\n columnStart?: number\n}\n\n/** 设计态拖放会话;该状态只服务当前交互,不进入设计文档。 */\nexport interface DesignerDragSession {\n active: boolean\n source: 'PALETTE' | 'CANVAS' | null\n sourceNodeId: string\n target?: DesignerDropTarget\n accepted: boolean\n rejectionReason: string\n}\n\n/** Sortable 在设计器内部暴露的最小移动上下文,避免工作台依赖第三方完整事件类型。 */\nexport interface DesignerSortableMoveEvent {\n dragged: HTMLElement\n related: HTMLElement\n to: HTMLElement\n willInsertAfter?: boolean\n}\n\n/** 24 栅格投影中的字段或布局节点单元。 */\nexport interface DesignerCanvasCell {\n nodeId: string\n index: number\n row: number\n start: number\n span: number\n}\n\n/** 24 栅格投影中的空白可放置单元。 */\nexport interface DesignerCanvasGap {\n index: number\n row: number\n start: number\n span: number\n}\n\n/** 设计态只读栅格投影,不作为第二份 Schema 持久化。 */\nexport interface DesignerCanvasProjection {\n cells: DesignerCanvasCell[]\n gaps: DesignerCanvasGap[]\n rowCount: number\n}\n\n/** 大纲使用的只读投影节点。 */\nexport interface DesignerOutlineItem {\n id: string\n label: string\n typeLabel: string\n children: DesignerOutlineItem[]\n}\n\n/** Host 首次向独立 Core 注入的字段描述。 */\nexport interface DesignerInitialField {\n fieldId: string\n fieldCode: string\n fieldName: string\n sourceDataType: string\n semanticType: DesignerSemanticType\n defaultComponentType: string\n physicalColumnName?: string\n required?: boolean\n readonly?: boolean\n primaryKey?: boolean\n systemField?: boolean\n displayOrder?: number\n}\n\n/** Host 首次向独立 Core 注入的实体描述。 */\nexport interface DesignerInitialEntity {\n entityId: string\n entityCode: string\n entityName: string\n physicalTableName?: string\n fields: DesignerInitialField[]\n}\n\n/** Host 首次向独立 Core 注入的一级一对多关系。 */\nexport interface DesignerInitialOneToManyRelation {\n relationId: string\n relationCode: string\n relationName: string\n parentEntityId: string\n childEntity: DesignerInitialEntity\n loadMode?: 'SYNC' | 'ASYNC'\n keyMappings?: Array<{ parentFieldId: string; childFieldId: string }>\n}\n\n/** Host 首次初始化 Core 时使用的数据模型参数。 */\nexport interface DesignerInitialDataModel {\n provider: string\n sourceId: string\n sourceRevision?: number\n rootEntity: DesignerInitialEntity\n relations: DesignerInitialOneToManyRelation[]\n}\n\n/** 物理来源信息只存在于当前 Core 会话,绝不进入设计文档。 */\nexport interface DesignerSourceMetadataIndex {\n provider: string\n sourceId: string\n sourceRevision?: number\n entities: Record<string, { physicalTableName?: string }>\n fields: Record<string, { physicalColumnName?: string }>\n relations: Record<\n string,\n {\n keyMappings: Array<{ parentFieldId: string; childFieldId: string }>\n }\n >\n}\n\n/** 字段页一次生成主表和子表布局时的受控请求。 */\nexport interface DesignerGenerateLayoutRequest {\n fieldIds: string[]\n relations: Array<{\n relationCode: string\n componentType: 'row-subtable' | 'block-subtable'\n }>\n}\n\n/** 主实体可修改的语义身份属性。 */\nexport type DesignerRootEntityPatch = Partial<Pick<DesignerDataEntity, 'name' | 'code'>>\n\n/** 一级子表关系可修改的语义身份属性。 */\nexport interface DesignerRelationPatch {\n name?: string\n code?: string\n childEntityName?: string\n childEntityCode?: string\n}\n","import { findDesignerComponent } from './component-registry'\nimport {\n createLocalDesignerDataSchema,\n diagnoseDesignerDataModel,\n duplicateDesignerSubtableRelation,\n ensureDesignerSubtableRelation,\n normalizeDesignerDataModel,\n placeDesignerDataField,\n resolveDesignerTargetEntityCode,\n} from './data-model'\nimport {\n createDefaultDesignerFieldBehavior,\n DEFAULT_DESIGNER_ACTION_BAR,\n DEFAULT_DESIGNER_SUBMIT_POLICY,\n diagnoseDesignerAdvancedDocument,\n normalizeDesignerAdvancedDocument,\n} from './document-advanced'\nimport {\n DESIGNER_DOCUMENT_VERSION,\n type DesignerComponentRegistration,\n type DesignerContainerNode,\n type DesignerDiagnostic,\n type DesignerDeviceGrid,\n type DesignerDocument,\n type DesignerDocumentDecodeResult,\n type DesignerDropTarget,\n type DesignerField,\n type DesignerFieldNode,\n type DesignerGenerateLayoutRequest,\n type DesignerLayoutNode,\n type DesignerLayoutSlot,\n type DesignerOutlineItem,\n type DesignerPropertyDefinition,\n type DesignerResponsiveGrid,\n} from './types'\n\nconst DEFAULT_APPEARANCE: DesignerDocument['appearance'] = {\n labelPosition: 'LEFT',\n labelWidth: 100,\n labelSuffix: '',\n labelAlign: 'RIGHT',\n defaultPlaceholder: '',\n gridGutter: 16,\n rowGap: 8,\n defaultPcSpan: 12,\n defaultMobileSpan: 24,\n readonlyDisplayMode: 'CONTROL',\n size: 'DEFAULT',\n controlRadius: 'THEME',\n containerStyle: 'NONE',\n containerRadius: 'BASE',\n}\n\nconst SURFACE_CONTAINER_COMPONENT_TYPES = new Set([\n 'group',\n 'tabs',\n 'row-subtable',\n 'block-subtable',\n])\n\n/** 创建一份不含业务绑定的空设计文档。 */\nexport function createEmptyDesignerDocument(\n documentId: string,\n name = '自定义表单设计',\n): DesignerDocument {\n return {\n documentVersion: DESIGNER_DOCUMENT_VERSION,\n id: documentId,\n name,\n description: '',\n dataSchema: createLocalDesignerDataSchema(name),\n uiSchema: { root: [], overlays: [] },\n appearance: deepClone(DEFAULT_APPEARANCE),\n submitPolicy: deepClone(DEFAULT_DESIGNER_SUBMIT_POLICY),\n actionBar: deepClone(DEFAULT_DESIGNER_ACTION_BAR),\n variables: [],\n dataSources: [],\n eventFlows: [],\n i18n: { enabled: false, defaultLocale: 'zh-CN', locales: ['zh-CN'], entries: [] },\n actions: [],\n extensions: {},\n }\n}\n\n/** 创建首次打开时用于产品验收的扁平栅格示例。 */\nexport function createDemoDesignerDocument(documentId: string): DesignerDocument {\n const document = createEmptyDesignerDocument(documentId)\n const samples: Array<[string, string, Partial<Record<string, unknown>>]> = [\n ['text', '申请主题', { placeholder: '请输入申请主题' }],\n ['select', '申请类型', {}],\n ['textarea', '申请说明', { rows: 4 }],\n ['number', '申请金额', { precision: 2, currencyPrefix: '¥', thousandsSeparator: true }],\n ['date', '期望完成日期', {}],\n ['file', '相关附件', {}],\n ]\n for (const [componentType, label, configuration] of samples) {\n const created = createNodeFromComponent(document, componentType, { label, configuration })\n if (created) document.uiSchema.root.push(created)\n }\n return document\n}\n\n/** 根据注册项原子创建本地字段或容器节点。 */\nexport function createNodeFromComponent(\n document: DesignerDocument,\n componentType: string,\n overrides: { label?: string; configuration?: Record<string, unknown>; entityCode?: string } = {},\n): DesignerLayoutNode | undefined {\n const registration = findDesignerComponent(componentType)\n if (!registration || registration.availability === 'UNAVAILABLE') return undefined\n if (registration.nodeKind === 'CONTAINER') {\n const node = createContainerNode(registration, overrides.configuration)\n ensureDesignerSubtableRelation(document, node)\n return node\n }\n const field = createDesignerField(document, registration, overrides)\n document.dataSchema.fields.push(field)\n return createFieldNode(field, registration.defaultSpan, registration.defaultShowLabel)\n}\n\n/** 在指定根或命名插槽中插入节点。 */\nexport function insertDesignerNode(\n document: DesignerDocument,\n node: DesignerLayoutNode,\n target: DesignerDropTarget,\n): boolean {\n if (locateNode(document.uiSchema.root, node.id)) return false\n if (detachedDesignerNodeDropRejection(document, node, target)) return false\n const collection = resolveDropCollection(document, target)\n if (!collection) return false\n collection.splice(target.index, 0, node)\n positionDesignerNodeAtColumn(collection, node.id, target.columnStart)\n return true\n}\n\n/** 原子移动现有节点,并阻止容器移动到自身后代。 */\nexport function moveDesignerNode(\n document: DesignerDocument,\n nodeId: string,\n target: DesignerDropTarget,\n): boolean {\n const located = locateNode(document.uiSchema.root, nodeId)\n if (!located) return false\n if (designerNodeDropRejection(document, nodeId, target)) return false\n const targetCollection = resolveDropCollection(document, target)\n if (!targetCollection) return false\n const [node] = located.collection.splice(located.index, 1)\n if (!node) return false\n let targetIndex = Math.max(0, Math.min(target.index, targetCollection.length))\n if (targetCollection === located.collection && located.index < target.index) targetIndex -= 1\n targetCollection.splice(Math.max(0, targetIndex), 0, node)\n positionDesignerNodeAtColumn(targetCollection, node.id, target.columnStart)\n return true\n}\n\n/**\n * 判断现有节点是否可以进入指定容器。\n *\n * @param nodes 当前完整布局树。\n * @param nodeId 被移动节点标识。\n * @param targetContainerId 目标容器标识;根布局传空值。\n * @returns 不会形成自身后代循环时返回 `true`。\n */\nexport function canMoveDesignerNode(\n nodes: DesignerLayoutNode[],\n nodeId: string,\n targetContainerId: string | null,\n): boolean {\n if (!targetContainerId) return true\n const located = locateNode(nodes, nodeId)\n return Boolean(located && !nodeContainsContainer(located.node, targetContainerId))\n}\n\n/**\n * 校验组件目录中的新组件能否放入目标容器。\n *\n * @param document 当前设计文档。\n * @param componentType 待创建的稳定组件编码。\n * @param target 包含目标容器、命名插槽、索引和可选栅格列的完整落点。\n * @returns 空字符串表示允许,否则返回可直接展示的拒绝原因。\n */\nexport function designerComponentDropRejection(\n document: DesignerDocument,\n componentType: string,\n target: DesignerDropTarget,\n): string {\n const registration = findDesignerComponent(componentType)\n if (!registration) return `组件 ${componentType} 未注册`\n if (registration.availability === 'UNAVAILABLE') return registration.unavailableReason\n const targetRejection = dropTargetRejection(document, target)\n if (targetRejection) return targetRejection\n return targetContainerDropRejection(\n document,\n target.containerId,\n registration.nodeKind,\n componentType,\n false,\n 0,\n undefined,\n )\n}\n\n/**\n * 校验现有设计节点能否移动到目标容器。\n *\n * @param document 当前设计文档。\n * @param nodeId 待移动节点标识。\n * @param target 包含目标容器、命名插槽、索引和可选栅格列的完整落点。\n * @returns 空字符串表示允许,否则返回可直接展示的拒绝原因。\n */\nexport function designerNodeDropRejection(\n document: DesignerDocument,\n nodeId: string,\n target: DesignerDropTarget,\n): string {\n const located = locateNode(document.uiSchema.root, nodeId)\n if (!located) return '拖动节点不存在'\n const targetRejection = dropTargetRejection(document, target)\n if (targetRejection) return targetRejection\n const sourceNode = located.node\n if (target.containerId && nodeContainsContainer(sourceNode, target.containerId)) {\n return '不能把布局移动到自身或其后代'\n }\n if (sourceNode.nodeType === 'CONTAINER') {\n const registration = findDesignerComponent(sourceNode.componentType)\n if (!registration || registration.nodeKind !== 'CONTAINER') return '拖动布局组件未注册'\n if (registration.availability === 'UNAVAILABLE') return registration.unavailableReason\n return targetContainerDropRejection(\n document,\n target.containerId,\n 'CONTAINER',\n sourceNode.componentType,\n false,\n nodeSubtreeDepth(sourceNode),\n undefined,\n )\n }\n const fieldId = sourceNode.fieldId\n const field = document.dataSchema.fields.find((item) => item.id === fieldId)\n if (!field) return '字段定义不存在'\n const registration = findDesignerComponent(field.componentType)\n if (!registration || registration.nodeKind !== 'FIELD') return '拖动字段组件未注册'\n if (registration.availability === 'UNAVAILABLE') return registration.unavailableReason\n return targetContainerDropRejection(\n document,\n target.containerId,\n 'FIELD',\n field.componentType,\n field.display.hidden,\n 0,\n field.entityCode,\n )\n}\n\n/** 从布局移除节点;字段仍保留在字段页以支持重新放置。 */\nexport function removeDesignerNode(\n document: DesignerDocument,\n nodeId: string,\n): DesignerLayoutNode | undefined {\n return removeNodeFromCollection(document.uiSchema.root, nodeId)\n}\n\n/** 将未放置字段重新加入根布局。 */\nexport function restoreDesignerFieldNode(\n document: DesignerDocument,\n fieldId: string,\n): DesignerFieldNode | undefined {\n return placeDesignerDataField(document, fieldId)\n}\n\n/** 为尚未放置的一级关系创建行子表或块子表容器。 */\nexport function createDesignerRelationContainer(\n document: DesignerDocument,\n relationCode: string,\n componentType: 'row-subtable' | 'block-subtable',\n): DesignerContainerNode | undefined {\n const relation = document.dataSchema.relations.find((item) => item.code === relationCode)\n if (!relation) return undefined\n const alreadyPlaced = findRelationContainer(document.uiSchema.root, relationCode)\n if (alreadyPlaced) return alreadyPlaced\n const node = createNodeFromComponent(document, componentType, {\n configuration: { relationCode, title: relation.childEntity.name },\n })\n if (node?.nodeType !== 'CONTAINER') return undefined\n document.uiSchema.root.push(node)\n return node\n}\n\n/**\n * 将字段页选择的主实体字段和一级子关系作为一个布局事务写入文档。\n *\n * 已放置字段和关系会被跳过;主键、系统字段不会被自动生成成普通可写控件。\n */\nexport function generateDesignerDataModelLayout(\n document: DesignerDocument,\n request: DesignerGenerateLayoutRequest,\n): { createdNodeIds: string[]; skippedFieldIds: string[] } {\n const createdNodeIds: string[] = []\n const skippedFieldIds: string[] = []\n for (const selection of request.relations) {\n const alreadyPlaced = findRelationContainer(document.uiSchema.root, selection.relationCode)\n const node = createDesignerRelationContainer(\n document,\n selection.relationCode,\n selection.componentType,\n )\n if (node && !alreadyPlaced) createdNodeIds.push(node.id)\n }\n for (const fieldId of request.fieldIds) {\n const field = document.dataSchema.fields.find((item) => item.id === fieldId)\n if (!field || field.primaryKey || field.systemField) {\n skippedFieldIds.push(fieldId)\n continue\n }\n const node = placeDesignerDataField(document, fieldId)\n if (node) createdNodeIds.push(node.id)\n else skippedFieldIds.push(fieldId)\n }\n return { createdNodeIds: [...new Set(createdNodeIds)], skippedFieldIds }\n}\n\n/** 永久删除未放置字段,防止布局中出现悬空引用。 */\nexport function deleteUnplacedDesignerField(document: DesignerDocument, fieldId: string): boolean {\n if (collectPlacedFieldIds(document.uiSchema.root).has(fieldId)) return false\n const index = document.dataSchema.fields.findIndex((item) => item.id === fieldId)\n if (index < 0 || document.dataSchema.fields[index]?.bindingStatus !== 'UNBOUND') return false\n document.dataSchema.fields.splice(index, 1)\n return true\n}\n\n/** 复制节点及其字段引用,确保复制后的数据字段保持独立。 */\nexport function duplicateDesignerNode(\n document: DesignerDocument,\n nodeId: string,\n): DesignerLayoutNode | undefined {\n const located = locateNode(document.uiSchema.root, nodeId)\n if (!located) return undefined\n const copy = cloneNodeWithFields(document, located.node)\n located.collection.splice(located.index + 1, 0, copy)\n return copy\n}\n\n/** 查找当前布局中的节点。 */\nexport function findDesignerNode(\n nodes: DesignerLayoutNode[],\n nodeId: string,\n): DesignerLayoutNode | undefined {\n return locateNode(nodes, nodeId)?.node\n}\n\n/** 返回当前文档已经放置到布局中的字段主键。 */\nexport function collectPlacedFieldIds(nodes: DesignerLayoutNode[]): Set<string> {\n const result = new Set<string>()\n walkNodes(nodes, (node) => {\n if (node.nodeType === 'FIELD') result.add(node.fieldId)\n })\n return result\n}\n\n/** 将布局树投影成大纲数据。 */\nexport function createDesignerOutline(document: DesignerDocument): DesignerOutlineItem[] {\n const fields = new Map(document.dataSchema.fields.map((field) => [field.id, field]))\n const project = (node: DesignerLayoutNode): DesignerOutlineItem => {\n if (node.nodeType === 'FIELD') {\n const field = fields.get(node.fieldId)\n const registration = field ? findDesignerComponent(field.componentType) : undefined\n return {\n id: node.id,\n label: field?.label ?? '失效字段',\n typeLabel: registration?.name ?? '未知组件',\n children: [],\n }\n }\n const registration = findDesignerComponent(node.componentType)\n return {\n id: node.id,\n label: containerLabel(node, registration),\n typeLabel: registration?.name ?? node.componentType,\n children: node.slots.flatMap((slot) => slot.children.map(project)),\n }\n }\n return document.uiSchema.root.map(project)\n}\n\n/** 同步标签页配置与 typed slots,保留仍然存在的标签内容。 */\nexport function synchronizeContainerSlots(node: DesignerContainerNode): void {\n if (node.componentType !== 'tabs') return\n const configured = normalizeOptions(node.configuration.tabs)\n const labels = configured.length > 0 ? configured.map((item) => item.label) : ['标签页 1']\n const current = [...node.slots]\n node.slots = labels.map((label, index) => ({\n id: current[index]?.id ?? createDesignerId('slot'),\n slotCode: current[index]?.slotCode ?? `tab-${index + 1}`,\n label,\n children: current[index]?.children ?? [],\n }))\n}\n\n/** 对未知输入进行解码和完整结构诊断。 */\nexport function decodeDesignerDocument(source: unknown): DesignerDocumentDecodeResult {\n if (!isRecord(source)) {\n return { diagnostics: [diagnostic('ERROR', 'DOCUMENT_TYPE', '导入内容必须是 JSON 对象', '$')] }\n }\n try {\n const normalized = normalizeDesignerDocument(source)\n const diagnostics = diagnoseDesignerDocumentInternal(normalized)\n if (diagnostics.some((item) => item.severity === 'ERROR')) return { diagnostics }\n return { document: normalized, diagnostics }\n } catch {\n return {\n diagnostics: [\n diagnostic('ERROR', 'DOCUMENT_CLONE', '导入内容必须是可序列化的 JSON 数据', '$'),\n ],\n }\n }\n}\n\n/**\n * 校验未知文档输入的版本、字段、组件、布局、typed slots 和引用完整性。\n *\n * 该入口承担导入边界,任何非法结构都必须返回诊断而不能把类型异常抛给工作台。\n */\nexport function diagnoseDesignerDocument(source: unknown): DesignerDiagnostic[] {\n try {\n return diagnoseDesignerDocumentInternal(\n isRecord(source) ? normalizeDesignerDocument(source) : source,\n )\n } catch {\n return [diagnostic('ERROR', 'DOCUMENT_DIAGNOSTIC', '导入内容结构异常,无法完成安全诊断', '$')]\n }\n}\n\nfunction diagnoseDesignerDocumentInternal(source: unknown): DesignerDiagnostic[] {\n const result: DesignerDiagnostic[] = []\n if (!isRecord(source)) {\n result.push(diagnostic('ERROR', 'DOCUMENT_TYPE', '设计文档必须是对象', '$'))\n return result\n }\n if (source.documentVersion !== DESIGNER_DOCUMENT_VERSION) {\n result.push(\n diagnostic(\n 'ERROR',\n 'DOCUMENT_VERSION',\n `仅支持 ${DESIGNER_DOCUMENT_VERSION} 版本文档`,\n '$.documentVersion',\n ),\n )\n }\n if (\n typeof source.id !== 'string' ||\n !source.id ||\n typeof source.name !== 'string' ||\n !source.name\n ) {\n result.push(diagnostic('ERROR', 'DOCUMENT_IDENTITY', '文档标识和名称不能为空', '$'))\n }\n if (typeof source.description !== 'string') {\n result.push(diagnostic('ERROR', 'DOCUMENT_DESCRIPTION', '文档说明必须是文本', '$.description'))\n }\n const dataSchema = isRecord(source.dataSchema) ? source.dataSchema : undefined\n const uiSchema = isRecord(source.uiSchema) ? source.uiSchema : undefined\n const fields = dataSchema && Array.isArray(dataSchema.fields) ? dataSchema.fields : undefined\n const root = uiSchema && Array.isArray(uiSchema.root) ? uiSchema.root : undefined\n if (!fields || !root)\n result.push(diagnostic('ERROR', 'DOCUMENT_SCHEMA', '文档缺少 dataSchema 或 uiSchema', '$'))\n if (uiSchema) {\n diagnoseUnknownProperties(\n uiSchema,\n ['root', 'overlays'],\n '$.uiSchema',\n 'UI_SCHEMA_UNKNOWN_PROPERTY',\n result,\n )\n if (!Array.isArray(uiSchema.overlays)) {\n result.push(\n diagnostic('ERROR', 'UI_SCHEMA_OVERLAYS', '弹层模块必须是数组', '$.uiSchema.overlays'),\n )\n }\n }\n if (dataSchema) {\n diagnoseUnknownProperties(\n dataSchema,\n ['source', 'rootEntity', 'relations', 'fields'],\n '$.dataSchema',\n 'DATA_SCHEMA_UNKNOWN_PROPERTY',\n result,\n )\n if (!isRecord(dataSchema.rootEntity)) {\n result.push(\n diagnostic('ERROR', 'ROOT_ENTITY', '数据模型缺少主实体', '$.dataSchema.rootEntity'),\n )\n }\n if (!Array.isArray(dataSchema.relations)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'RELATION_CATALOG',\n '一级子表关系目录必须是数组',\n '$.dataSchema.relations',\n ),\n )\n }\n }\n if (!isRecord(source.appearance)) {\n result.push(diagnostic('ERROR', 'DOCUMENT_APPEARANCE', '文档缺少表单外观配置', '$.appearance'))\n } else {\n diagnoseAppearance(source.appearance, '$.appearance', result)\n }\n if (!Array.isArray(source.actions))\n result.push(diagnostic('ERROR', 'DOCUMENT_ACTIONS', '声明式动作必须是数组', '$.actions'))\n if (!isRecord(source.extensions))\n result.push(diagnostic('ERROR', 'DOCUMENT_EXTENSIONS', '扩展配置必须是对象', '$.extensions'))\n const fieldIds = new Set<string>()\n const fieldKeys = new Set<string>()\n const fieldMap = new Map<string, DesignerField>()\n for (const [index, rawField] of (fields ?? []).entries()) {\n const path = `$.dataSchema.fields[${index}]`\n if (!isRecord(rawField)) {\n result.push(diagnostic('ERROR', 'FIELD_TYPE', '字段定义必须是对象', path))\n continue\n }\n const field = rawField as unknown as DesignerField\n diagnoseUnknownProperties(\n rawField,\n [\n 'id',\n 'entityCode',\n 'key',\n 'label',\n 'semanticType',\n 'componentType',\n 'configurationVersion',\n 'configuration',\n 'defaultValue',\n 'helpText',\n 'required',\n 'validation',\n 'behavior',\n 'display',\n 'bindingStatus',\n 'primaryKey',\n 'systemField',\n 'displayOrder',\n 'binding',\n ],\n path,\n 'FIELD_UNKNOWN_PROPERTY',\n result,\n )\n if (typeof field.id !== 'string' || !field.id || fieldIds.has(field.id)) {\n result.push(diagnostic('ERROR', 'FIELD_ID', '字段主键为空或重复', `${path}.id`))\n } else {\n fieldIds.add(field.id)\n fieldMap.set(field.id, field)\n }\n const scopedFieldKey = `${field.entityCode}\\u0000${field.key}`\n if (typeof field.key !== 'string' || !field.key || fieldKeys.has(scopedFieldKey)) {\n result.push(diagnostic('ERROR', 'FIELD_KEY', '字段编码为空或重复', `${path}.key`))\n } else {\n fieldKeys.add(scopedFieldKey)\n }\n if (typeof field.entityCode !== 'string' || !field.entityCode) {\n result.push(\n diagnostic('ERROR', 'FIELD_ENTITY', '字段所属实体编码不能为空', `${path}.entityCode`),\n )\n }\n if (typeof field.label !== 'string' || !field.label) {\n result.push(diagnostic('ERROR', 'FIELD_LABEL', '字段名称不能为空', `${path}.label`))\n }\n if (typeof field.helpText !== 'string' || typeof field.required !== 'boolean') {\n result.push(diagnostic('ERROR', 'FIELD_METADATA', '字段帮助文字或必填配置类型不正确', path))\n }\n if (\n !['UNBOUND', 'BOUND', 'STALE', 'INCOMPATIBLE', 'MISSING'].includes(\n String(field.bindingStatus),\n )\n ) {\n result.push(\n diagnostic('ERROR', 'FIELD_BINDING_STATUS', '字段绑定状态不正确', `${path}.bindingStatus`),\n )\n }\n if (field.binding !== undefined) diagnoseFieldBinding(field.binding, `${path}.binding`, result)\n if (typeof field.primaryKey !== 'boolean' || typeof field.systemField !== 'boolean') {\n result.push(\n diagnostic('ERROR', 'FIELD_SOURCE_FLAGS', '字段主键或系统字段标识类型不正确', path),\n )\n }\n if (!Number.isFinite(field.displayOrder)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'FIELD_DISPLAY_ORDER',\n '字段显示顺序必须是有限数字',\n `${path}.displayOrder`,\n ),\n )\n }\n const hasConfiguration = isRecord(field.configuration)\n if (!hasConfiguration)\n result.push(\n diagnostic('ERROR', 'FIELD_CONFIGURATION', '字段配置必须是对象', `${path}.configuration`),\n )\n const display = isRecord(field.display) ? field.display : undefined\n if (!display) {\n result.push(diagnostic('ERROR', 'FIELD_DISPLAY', '字段展示配置必须是对象', `${path}.display`))\n } else {\n diagnoseFieldDisplay(display, `${path}.display`, result)\n }\n if (!isRecord(field.validation)) {\n result.push(\n diagnostic('ERROR', 'FIELD_VALIDATION', '字段校验配置必须是对象', `${path}.validation`),\n )\n } else {\n diagnoseFieldValidation(field.validation, `${path}.validation`, result)\n }\n const registration =\n typeof field.componentType === 'string'\n ? findDesignerComponent(field.componentType)\n : undefined\n if (!registration || registration.nodeKind !== 'FIELD') {\n result.push(\n diagnostic(\n 'ERROR',\n 'FIELD_COMPONENT',\n `字段组件 ${field.componentType} 未注册`,\n `${path}.componentType`,\n ),\n )\n continue\n }\n if (hasConfiguration) {\n diagnoseComponentConfiguration(\n registration,\n field.configuration,\n `${path}.configuration`,\n result,\n )\n }\n if (field.configurationVersion !== registration.configurationVersion) {\n result.push(\n diagnostic(\n 'ERROR',\n 'FIELD_CONFIGURATION_VERSION',\n `${registration.name}配置版本不兼容`,\n `${path}.configurationVersion`,\n ),\n )\n }\n if (!registration.compatibleSemanticTypes.includes(field.semanticType)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'FIELD_SEMANTIC_TYPE',\n `${registration.name}不兼容 ${field.semanticType}`,\n `${path}.semanticType`,\n ),\n )\n }\n if (registration.availability !== 'AVAILABLE') {\n result.push(diagnostic('WARNING', 'FIELD_CAPABILITY', registration.unavailableReason, path))\n }\n if (field.componentType === 'hidden' && display?.hidden !== true) {\n result.push(\n diagnostic(\n 'ERROR',\n 'HIDDEN_COMPONENT_VISIBILITY',\n '隐藏字段组件必须保持隐藏展示状态',\n `${path}.display.hidden`,\n ),\n )\n }\n }\n const nodeIds = new Set<string>()\n if (root)\n diagnoseNodes(root, '$.uiSchema.root', fieldIds, fieldMap, nodeIds, result, 0, new WeakSet())\n if (uiSchema && Array.isArray(uiSchema.overlays)) {\n for (const [index, overlay] of uiSchema.overlays.entries()) {\n if (!isRecord(overlay) || !Array.isArray(overlay.root)) continue\n diagnoseNodes(\n overlay.root,\n `$.uiSchema.overlays[${index}].root`,\n fieldIds,\n fieldMap,\n nodeIds,\n result,\n 0,\n new WeakSet(),\n )\n }\n }\n if (\n fields &&\n root &&\n dataSchema &&\n isRecord(dataSchema.rootEntity) &&\n Array.isArray(dataSchema.relations)\n ) {\n result.push(...diagnoseDesignerDataModel(source as unknown as DesignerDocument))\n }\n result.push(...diagnoseDesignerAdvancedDocument(source as unknown as DesignerDocument))\n return result\n}\n\n/** 使用 JSON 往返克隆设计文档,确保 Core 状态不携带 Vue 代理。 */\nexport function cloneDesignerDocument(document: DesignerDocument): DesignerDocument {\n return deepClone(document)\n}\n\n/** 生成稳定排序的设计文档快照。 */\nexport function serializeDesignerDocument(document: DesignerDocument): string {\n return JSON.stringify(document)\n}\n\n/** 生成 Core 内部唯一标识;结果不承担数据库主键语义。 */\nexport function createDesignerId(prefix: string): string {\n const random =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID().replaceAll('-', '')\n : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`\n return `${prefix}-${random}`\n}\n\nfunction createDesignerField(\n document: DesignerDocument,\n registration: DesignerComponentRegistration,\n overrides: { label?: string; configuration?: Record<string, unknown>; entityCode?: string },\n): DesignerField {\n const entityCode = overrides.entityCode ?? document.dataSchema.rootEntity.code\n const serial = nextFieldSerial(document, registration.componentType, entityCode)\n return {\n id: createDesignerId('field'),\n entityCode,\n key: `${registration.componentType.replaceAll('-', '_')}_${serial}`,\n label: overrides.label ?? `${registration.name}${serial}`,\n semanticType: registration.semanticType,\n componentType: registration.componentType,\n configurationVersion: registration.configurationVersion,\n configuration: { ...deepClone(registration.defaultConfiguration), ...overrides.configuration },\n defaultValue: defaultValueFor(registration.semanticType),\n helpText: '',\n required: false,\n validation: {},\n behavior: createDefaultDesignerFieldBehavior(),\n display: { placeholder: '', hidden: registration.componentType === 'hidden', readonly: false },\n bindingStatus: 'UNBOUND',\n primaryKey: false,\n systemField: false,\n displayOrder: document.dataSchema.fields.length,\n }\n}\n\nfunction createFieldNode(\n field: DesignerField,\n defaultSpan: number,\n defaultShowLabel: boolean,\n): DesignerFieldNode {\n return {\n nodeType: 'FIELD',\n id: createDesignerId('node'),\n fieldId: field.id,\n layout: createResponsiveGrid(defaultSpan, defaultShowLabel),\n }\n}\n\nfunction createContainerNode(\n registration: DesignerComponentRegistration,\n configuration: Record<string, unknown> | undefined,\n): DesignerContainerNode {\n const node: DesignerContainerNode = {\n nodeType: 'CONTAINER',\n id: createDesignerId('node'),\n componentType: registration.componentType,\n configurationVersion: registration.configurationVersion,\n configuration: { ...deepClone(registration.defaultConfiguration), ...configuration },\n layout: createResponsiveGrid(24, registration.defaultShowLabel),\n slots: createDefaultSlots(registration),\n }\n synchronizeContainerSlots(node)\n return node\n}\n\nfunction createDefaultSlots(registration: DesignerComponentRegistration): DesignerLayoutSlot[] {\n if (!registration.acceptsChildren) return []\n if (registration.componentType === 'tabs') {\n return [1, 2].map((index) => ({\n id: createDesignerId('slot'),\n slotCode: `tab-${index}`,\n label: `标签页 ${index}`,\n children: [],\n }))\n }\n return [{ id: createDesignerId('slot'), slotCode: 'content', label: '内容', children: [] }]\n}\n\nfunction createResponsiveGrid(pcSpan: number, showLabel: boolean): DesignerResponsiveGrid {\n return {\n pc: { span: pcSpan, offset: 0, showLabel, labelPosition: 'INHERIT' },\n mobile: { span: 24, offset: 0, showLabel, labelPosition: 'INHERIT' },\n }\n}\n\nfunction positionDesignerNodeAtColumn(\n collection: DesignerLayoutNode[],\n nodeId: string,\n columnStart: number | undefined,\n): void {\n if (columnStart === undefined) return\n const nodeIndex = collection.findIndex((item) => item.id === nodeId)\n const node = collection[nodeIndex]\n if (!node || nodeIndex < 0) return\n const desiredStart = Math.max(0, Math.min(23, Math.trunc(columnStart)))\n const span = Math.max(1, Math.min(24, node.layout.pc.span))\n let cursor = 0\n for (const previous of collection.slice(0, nodeIndex)) {\n const previousSpan = Math.max(1, Math.min(24, previous.layout.pc.span))\n const previousOffset = Math.max(0, Math.min(23, previous.layout.pc.offset))\n if (cursor > 0 && cursor + previousOffset + previousSpan > 24) cursor = 0\n cursor = Math.min(24, cursor + previousOffset + previousSpan)\n if (cursor >= 24) cursor = 0\n }\n node.layout.pc.offset = Math.max(0, Math.min(24 - span, desiredStart - cursor))\n}\n\nfunction defaultValueFor(type: DesignerField['semanticType']): unknown {\n if (type === 'ARRAY') return []\n if (type === 'BOOLEAN') return false\n if (type === 'NUMBER') return null\n if (type === 'OBJECT') return null\n return ''\n}\n\nfunction nextFieldSerial(\n document: DesignerDocument,\n componentType: string,\n entityCode: string,\n): number {\n const prefix = componentType.replaceAll('-', '_')\n let serial = 1\n while (\n document.dataSchema.fields.some(\n (field) => field.entityCode === entityCode && field.key === `${prefix}_${serial}`,\n )\n )\n serial += 1\n return serial\n}\n\nfunction findContainerSlot(\n nodes: DesignerLayoutNode[],\n containerId: string,\n slotCode: string,\n): DesignerLayoutSlot | undefined {\n for (const node of nodes) {\n if (node.nodeType !== 'CONTAINER') continue\n if (node.id === containerId) return node.slots.find((slot) => slot.slotCode === slotCode)\n for (const slot of node.slots) {\n const found = findContainerSlot(slot.children, containerId, slotCode)\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction findRelationContainer(\n nodes: DesignerLayoutNode[],\n relationCode: string,\n): DesignerContainerNode | undefined {\n for (const node of nodes) {\n if (node.nodeType !== 'CONTAINER') continue\n if (\n ['row-subtable', 'block-subtable'].includes(node.componentType) &&\n node.configuration.relationCode === relationCode\n ) {\n return node\n }\n for (const slot of node.slots) {\n const found = findRelationContainer(slot.children, relationCode)\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction locateNode(\n nodes: DesignerLayoutNode[],\n nodeId: string,\n): { node: DesignerLayoutNode; collection: DesignerLayoutNode[]; index: number } | undefined {\n const index = nodes.findIndex((node) => node.id === nodeId)\n if (index >= 0) return { node: nodes[index]!, collection: nodes, index }\n for (const node of nodes) {\n if (node.nodeType !== 'CONTAINER') continue\n for (const slot of node.slots) {\n const found = locateNode(slot.children, nodeId)\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction removeNodeFromCollection(\n nodes: DesignerLayoutNode[],\n nodeId: string,\n): DesignerLayoutNode | undefined {\n const found = locateNode(nodes, nodeId)\n if (!found) return undefined\n return found.collection.splice(found.index, 1)[0]\n}\n\nfunction cloneNodeWithFields(\n document: DesignerDocument,\n node: DesignerLayoutNode,\n): DesignerLayoutNode {\n if (node.nodeType === 'FIELD') {\n const source = document.dataSchema.fields.find((field) => field.id === node.fieldId)\n if (!source) return { ...deepClone(node), id: createDesignerId('node') }\n const copy = deepClone(source)\n copy.id = createDesignerId('field')\n copy.key = uniqueFieldKey(document, source.entityCode, `${source.key}_copy`)\n copy.label = `${source.label}副本`\n document.dataSchema.fields.push(copy)\n return { ...deepClone(node), id: createDesignerId('node'), fieldId: copy.id }\n }\n const copy = deepClone(node)\n copy.id = createDesignerId('node')\n copy.slots = copy.slots.map((slot) => ({\n ...slot,\n id: createDesignerId('slot'),\n children: slot.children.map((child) => cloneNodeWithFields(document, child)),\n }))\n if (typeof copy.configuration.title === 'string')\n copy.configuration.title = `${copy.configuration.title}副本`\n duplicateDesignerSubtableRelation(document, node, copy)\n return copy\n}\n\nfunction uniqueFieldKey(document: DesignerDocument, entityCode: string, preferred: string): string {\n let key = preferred\n let serial = 2\n while (\n document.dataSchema.fields.some((field) => field.entityCode === entityCode && field.key === key)\n ) {\n key = `${preferred}_${serial}`\n serial += 1\n }\n return key\n}\n\nfunction walkNodes(nodes: DesignerLayoutNode[], visitor: (node: DesignerLayoutNode) => void): void {\n for (const node of nodes) {\n visitor(node)\n if (node.nodeType === 'CONTAINER') {\n for (const slot of node.slots) walkNodes(slot.children, visitor)\n }\n }\n}\n\nfunction nodeContainsContainer(node: DesignerLayoutNode, containerId: string): boolean {\n if (node.nodeType !== 'CONTAINER') return false\n if (node.id === containerId) return true\n return node.slots.some((slot) =>\n slot.children.some((child) => nodeContainsContainer(child, containerId)),\n )\n}\n\n/** 返回节点自身以下的最大相对层级,叶子节点为 0。 */\nfunction nodeSubtreeDepth(node: DesignerLayoutNode): number {\n if (node.nodeType !== 'CONTAINER') return 0\n return node.slots.reduce(\n (maximum, slot) =>\n Math.max(maximum, ...slot.children.map((child) => 1 + nodeSubtreeDepth(child)), 0),\n 0,\n )\n}\n\n/** 查找节点在根布局中的零基层级。 */\nfunction findNodeDepth(nodes: DesignerLayoutNode[], nodeId: string, depth = 0): number | undefined {\n for (const node of nodes) {\n if (node.id === nodeId) return depth\n if (node.nodeType !== 'CONTAINER') continue\n for (const slot of node.slots) {\n const found = findNodeDepth(slot.children, nodeId, depth + 1)\n if (found !== undefined) return found\n }\n }\n return undefined\n}\n\nfunction diagnoseNodes(\n nodes: unknown,\n path: string,\n fieldIds: Set<string>,\n fieldMap: Map<string, DesignerField>,\n nodeIds: Set<string>,\n result: DesignerDiagnostic[],\n depth: number,\n seenNodes: WeakSet<object>,\n): void {\n if (!Array.isArray(nodes)) {\n result.push(diagnostic('ERROR', 'LAYOUT_COLLECTION', '布局 children 必须是数组', path))\n return\n }\n if (depth > 6) result.push(diagnostic('ERROR', 'LAYOUT_DEPTH', '布局嵌套不能超过 6 层', path))\n for (const [index, rawNode] of nodes.entries()) {\n const nodePath = `${path}[${index}]`\n if (!isRecord(rawNode)) {\n result.push(diagnostic('ERROR', 'NODE_TYPE', '布局节点必须是对象', nodePath))\n continue\n }\n if (seenNodes.has(rawNode)) {\n result.push(diagnostic('ERROR', 'NODE_CYCLE', '布局节点不能形成循环引用', nodePath))\n continue\n }\n seenNodes.add(rawNode)\n const node = rawNode as unknown as DesignerLayoutNode\n if (typeof node.id !== 'string' || !node.id || nodeIds.has(node.id)) {\n result.push(diagnostic('ERROR', 'NODE_ID', '布局节点主键为空或重复', `${nodePath}.id`))\n } else {\n nodeIds.add(node.id)\n }\n if (node.nodeType === 'FIELD') {\n diagnoseUnknownProperties(\n rawNode,\n ['nodeType', 'id', 'fieldId', 'layout'],\n nodePath,\n 'FIELD_NODE_UNKNOWN_PROPERTY',\n result,\n )\n if (typeof node.fieldId !== 'string' || !fieldIds.has(node.fieldId))\n result.push(\n diagnostic('ERROR', 'FIELD_REFERENCE', '布局引用了不存在的字段', `${nodePath}.fieldId`),\n )\n diagnoseGrid(node.layout, `${nodePath}.layout`, result)\n continue\n }\n if (node.nodeType !== 'CONTAINER') {\n result.push(\n diagnostic(\n 'ERROR',\n 'NODE_TYPE',\n '布局节点类型只能是 FIELD 或 CONTAINER',\n `${nodePath}.nodeType`,\n ),\n )\n continue\n }\n diagnoseUnknownProperties(\n rawNode,\n [\n 'nodeType',\n 'id',\n 'componentType',\n 'configurationVersion',\n 'configuration',\n 'layout',\n 'slots',\n 'eventBindings',\n ],\n nodePath,\n 'CONTAINER_NODE_UNKNOWN_PROPERTY',\n result,\n )\n const registration =\n typeof node.componentType === 'string' ? findDesignerComponent(node.componentType) : undefined\n if (!registration || registration.nodeKind !== 'CONTAINER') {\n result.push(\n diagnostic(\n 'ERROR',\n 'CONTAINER_COMPONENT',\n `布局组件 ${node.componentType} 未注册`,\n `${nodePath}.componentType`,\n ),\n )\n } else {\n if (node.configurationVersion !== registration.configurationVersion) {\n result.push(\n diagnostic(\n 'ERROR',\n 'CONTAINER_CONFIGURATION_VERSION',\n `${registration.name}配置版本不兼容`,\n `${nodePath}.configurationVersion`,\n ),\n )\n }\n if (registration.availability !== 'AVAILABLE') {\n result.push(\n diagnostic('WARNING', 'CONTAINER_CAPABILITY', registration.unavailableReason, nodePath),\n )\n }\n if (!isRecord(node.configuration)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'CONTAINER_CONFIGURATION',\n `${registration.name}配置必须是对象`,\n `${nodePath}.configuration`,\n ),\n )\n } else {\n diagnoseComponentConfiguration(\n registration,\n node.configuration,\n `${nodePath}.configuration`,\n result,\n )\n }\n if (!Array.isArray(node.slots)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'CONTAINER_SLOTS',\n `${registration.name}命名插槽必须是数组`,\n `${nodePath}.slots`,\n ),\n )\n }\n }\n diagnoseGrid(node.layout, `${nodePath}.layout`, result)\n const slots = Array.isArray(node.slots) ? node.slots : []\n const slotCodes = new Set<string>()\n const slotIds = new Set<string>()\n if (registration?.nodeKind === 'CONTAINER') {\n if (!registration.acceptsChildren && slots.length > 0) {\n result.push(\n diagnostic(\n 'ERROR',\n 'LEAF_CONTAINER_SLOT',\n `${registration.name}不能携带命名插槽或子节点`,\n `${nodePath}.slots`,\n ),\n )\n } else if (registration.acceptsChildren && node.componentType !== 'tabs') {\n if (slots.length !== 1 || slots[0]?.slotCode !== 'content') {\n result.push(\n diagnostic(\n 'ERROR',\n 'CONTENT_CONTAINER_SLOT',\n `${registration.name}必须且只能包含一个 content 命名插槽`,\n `${nodePath}.slots`,\n ),\n )\n }\n } else if (node.componentType === 'tabs' && slots.length === 0) {\n result.push(\n diagnostic('ERROR', 'TABS_SLOT', '标签页至少需要一个命名插槽', `${nodePath}.slots`),\n )\n }\n }\n for (const [slotIndex, rawSlot] of slots.entries()) {\n const slotPath = `${nodePath}.slots[${slotIndex}]`\n if (!isRecord(rawSlot)) {\n result.push(diagnostic('ERROR', 'SLOT_TYPE', '命名插槽必须是对象', slotPath))\n continue\n }\n const slot = rawSlot as unknown as DesignerLayoutSlot\n if (typeof slot.id !== 'string' || !slot.id || slotIds.has(slot.id))\n result.push(diagnostic('ERROR', 'SLOT_ID', '命名插槽主键为空或重复', `${slotPath}.id`))\n else slotIds.add(slot.id)\n if (typeof slot.label !== 'string')\n result.push(\n diagnostic('ERROR', 'SLOT_LABEL', '命名插槽标签必须是文本', `${slotPath}.label`),\n )\n if (typeof slot.slotCode !== 'string' || !slot.slotCode)\n result.push(diagnostic('ERROR', 'SLOT_CODE', '命名插槽编码不能为空', slotPath))\n else if (slotCodes.has(slot.slotCode))\n result.push(\n diagnostic(\n 'ERROR',\n 'SLOT_CODE_DUPLICATE',\n '同一容器内命名插槽编码不能重复',\n `${nodePath}.slots[${slotIndex}].slotCode`,\n ),\n )\n else slotCodes.add(slot.slotCode)\n diagnoseUnknownProperties(\n rawSlot,\n ['id', 'slotCode', 'label', 'children'],\n slotPath,\n 'SLOT_UNKNOWN_PROPERTY',\n result,\n )\n if (!Array.isArray(slot.children)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'SLOT_CHILDREN',\n '命名插槽 children 必须是数组',\n `${slotPath}.children`,\n ),\n )\n continue\n }\n if (['row-subtable', 'block-subtable'].includes(node.componentType)) {\n const columnFieldIds = new Set<string>()\n for (const [childIndex, rawChild] of slot.children.entries()) {\n const childPath = `${nodePath}.slots[${slotIndex}].children[${childIndex}]`\n if (!isRecord(rawChild)) {\n result.push(\n diagnostic('ERROR', 'SUBTABLE_CHILD_TYPE', '子表子节点必须是对象', childPath),\n )\n continue\n }\n const child = rawChild as unknown as DesignerLayoutNode\n if (child.nodeType !== 'FIELD') {\n result.push(diagnostic('ERROR', 'SUBTABLE_CHILD', '子表只能包含字段节点', childPath))\n continue\n }\n if (columnFieldIds.has(child.fieldId)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'SUBTABLE_COLUMN_DUPLICATE',\n '同一子表不能重复引用同一个字段列',\n `${childPath}.fieldId`,\n ),\n )\n }\n columnFieldIds.add(child.fieldId)\n const childField = fieldMap.get(child.fieldId)\n const childDisplay =\n childField && isRecord(childField.display) ? childField.display : undefined\n if (childDisplay?.hidden === true || childField?.componentType === 'hidden') {\n result.push(\n diagnostic(\n 'WARNING',\n 'SUBTABLE_HIDDEN_FIELD',\n '隐藏字段保留在设计结构中,但不会作为运行子表列展示',\n childPath,\n ),\n )\n }\n }\n }\n diagnoseNodes(\n slot.children,\n `${nodePath}.slots[${slotIndex}].children`,\n fieldIds,\n fieldMap,\n nodeIds,\n result,\n depth + 1,\n seenNodes,\n )\n }\n }\n}\n\n/** 对尚未进入布局树的节点执行与移动操作一致的落点约束。 */\nfunction detachedDesignerNodeDropRejection(\n document: DesignerDocument,\n node: DesignerLayoutNode,\n target: DesignerDropTarget,\n): string {\n const targetRejection = dropTargetRejection(document, target)\n if (targetRejection) return targetRejection\n if (node.nodeType === 'CONTAINER') {\n const registration = findDesignerComponent(node.componentType)\n if (!registration || registration.nodeKind !== 'CONTAINER') return '待插入布局组件未注册'\n if (registration.availability === 'UNAVAILABLE') return registration.unavailableReason\n return targetContainerDropRejection(\n document,\n target.containerId,\n 'CONTAINER',\n node.componentType,\n false,\n nodeSubtreeDepth(node),\n undefined,\n )\n }\n const field = document.dataSchema.fields.find((item) => item.id === node.fieldId)\n if (!field) return '待插入节点引用的字段不存在'\n const registration = findDesignerComponent(field.componentType)\n if (!registration || registration.nodeKind !== 'FIELD') return '待插入字段组件未注册'\n if (registration.availability === 'UNAVAILABLE') return registration.unavailableReason\n return targetContainerDropRejection(\n document,\n target.containerId,\n 'FIELD',\n field.componentType,\n field.display.hidden,\n 0,\n field.entityCode,\n )\n}\n\n/** 校验目标插槽、索引和空白栅格坐标,写入口不会再依赖 UI 预检查。 */\nfunction dropTargetRejection(document: DesignerDocument, target: DesignerDropTarget): string {\n if (!Number.isInteger(target.index)) return '目标位置索引无效'\n if (\n target.columnStart !== undefined &&\n (!Number.isInteger(target.columnStart) || target.columnStart < 0 || target.columnStart > 23)\n ) {\n return '目标栅格起始列必须为 0~23 的整数'\n }\n const collection = resolveDropCollection(document, target)\n if (!collection) return target.containerId ? '目标命名插槽不存在' : '根布局目标无效'\n if (target.index < 0 || target.index > collection.length) return '目标位置超出可插入范围'\n return ''\n}\n\n/** 解析经过 DropPolicy 校验的真实写入集合。 */\nfunction resolveDropCollection(\n document: DesignerDocument,\n target: DesignerDropTarget,\n): DesignerLayoutNode[] | undefined {\n if (!target.containerId) return target.slotCode === 'root' ? document.uiSchema.root : undefined\n return findContainerSlot(document.uiSchema.root, target.containerId, target.slotCode)?.children\n}\n\n/** 对根布局或显式容器执行统一落点约束。 */\nfunction targetContainerDropRejection(\n document: DesignerDocument,\n targetContainerId: string | null,\n sourceKind: DesignerComponentRegistration['nodeKind'],\n sourceComponentType: string,\n sourceHidden: boolean,\n sourceSubtreeDepth: number,\n sourceEntityCode: string | undefined,\n): string {\n const targetDepth = targetContainerId\n ? findNodeDepth(document.uiSchema.root, targetContainerId)\n : -1\n if (targetContainerId && targetDepth === undefined) return '目标容器不存在'\n if ((targetDepth ?? -1) + 1 + sourceSubtreeDepth > 6) return '布局嵌套不能超过 6 层'\n if (sourceKind === 'FIELD' && sourceEntityCode) {\n const targetEntityCode = resolveDesignerTargetEntityCode(document, targetContainerId)\n if (!targetEntityCode) return '目标子表尚未绑定有效关系'\n if (sourceEntityCode !== targetEntityCode) {\n return `字段属于实体 ${sourceEntityCode},不能放入实体 ${targetEntityCode} 的布局`\n }\n }\n if (!targetContainerId) return ''\n const target = findDesignerNode(document.uiSchema.root, targetContainerId)\n if (!target || target.nodeType !== 'CONTAINER') return '目标容器不存在'\n const targetRegistration = findDesignerComponent(target.componentType)\n if (!targetRegistration?.acceptsChildren)\n return `${targetRegistration?.name ?? '目标组件'}不接受子节点`\n if (!['row-subtable', 'block-subtable'].includes(target.componentType)) return ''\n if (sourceKind !== 'FIELD') return '子表只能接收字段,不能嵌套布局组件'\n if (sourceHidden || sourceComponentType === 'hidden') return '隐藏字段不能作为子表可见列'\n return ''\n}\n\n/** 按当前注册版本的白名单、控件类型和约束诊断组件配置。 */\nfunction diagnoseComponentConfiguration(\n registration: DesignerComponentRegistration,\n configuration: Record<string, unknown>,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n const definitions = new Map(registration.properties.map((item) => [item.key, item]))\n const allowedKeys = new Set([\n ...Object.keys(registration.defaultConfiguration),\n ...definitions.keys(),\n ])\n diagnoseUnknownProperties(\n configuration,\n allowedKeys,\n path,\n 'COMPONENT_CONFIGURATION_UNKNOWN_PROPERTY',\n result,\n )\n for (const [key, value] of Object.entries(configuration)) {\n if (!allowedKeys.has(key)) continue\n const definition = definitions.get(key)\n if (definition) {\n diagnosePropertyValue(\n registration,\n definition,\n value,\n registration.defaultConfiguration[key] === null,\n `${path}.${key}`,\n result,\n )\n continue\n }\n diagnoseInferredConfigurationValue(\n registration,\n key,\n registration.defaultConfiguration[key],\n value,\n `${path}.${key}`,\n result,\n )\n }\n diagnoseRelatedConfigurationValues(registration, configuration, path, result)\n}\n\nfunction diagnosePropertyValue(\n registration: DesignerComponentRegistration,\n definition: DesignerPropertyDefinition,\n value: unknown,\n nullable: boolean,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n if (value === null && nullable) return\n const editor = definition.editor\n if (editor.type === 'IDENTIFIER') {\n if (typeof value !== 'string' || !/^[A-Za-z][A-Za-z0-9_]{0,63}$/.test(value)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_IDENTIFIER',\n `${registration.name}的“${definition.label}”必须以字母开头且只能包含字母、数字和下划线`,\n path,\n ),\n )\n }\n return\n }\n if (\n ['TEXT', 'TEXTAREA', 'COLOR', 'DATE_FORMAT', 'FILE_TYPES', 'RESOURCE_REFERENCE'].includes(\n editor.type,\n )\n ) {\n if (typeof value !== 'string')\n pushConfigurationTypeDiagnostic(registration, definition.label, path, result)\n return\n }\n if (editor.type === 'URL') {\n if (typeof value !== 'string') {\n pushConfigurationTypeDiagnostic(registration, definition.label, path, result)\n return\n }\n if (value && !isHttpsUrl(value)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_HTTPS_URL',\n `${registration.name}的“${definition.label}”只允许完整 HTTPS 地址`,\n path,\n ),\n )\n }\n return\n }\n if (editor.type === 'BOOLEAN') {\n if (typeof value !== 'boolean')\n pushConfigurationTypeDiagnostic(registration, definition.label, path, result)\n return\n }\n if (\n editor.type === 'NUMBER' ||\n editor.type === 'PRESET_NUMBER' ||\n editor.type === 'GRID_SPAN' ||\n editor.type === 'GRID_OFFSET'\n ) {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n pushConfigurationTypeDiagnostic(registration, definition.label, path, result)\n return\n }\n const minimum = 'minimum' in editor ? editor.minimum : undefined\n const maximum = 'maximum' in editor ? editor.maximum : undefined\n if ((minimum !== undefined && value < minimum) || (maximum !== undefined && value > maximum)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_RANGE',\n `${registration.name}的“${definition.label}”超出允许范围`,\n path,\n ),\n )\n }\n return\n }\n if (editor.type === 'SELECT' || editor.type === 'SEGMENTED') {\n const optionValues = editor.options.map((item) => item.value)\n if (\n !optionValues.some((optionValue) => optionValue === value) &&\n editor.legacyValuePolicy !== 'PRESERVE'\n ) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_ENUM',\n `${registration.name}的“${definition.label}”不是受支持的选项`,\n path,\n ),\n )\n }\n return\n }\n if (editor.type === 'OPTIONS') {\n diagnoseConfigurationOptions(registration, definition.label, value, path, result, new WeakSet())\n }\n}\n\n/** 复验同一组件内部的成对配置,避免各属性单独合法但组合后失去业务语义。 */\nfunction diagnoseRelatedConfigurationValues(\n registration: DesignerComponentRegistration,\n configuration: Record<string, unknown>,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n diagnoseOrderedConfigurationPair(\n registration,\n configuration,\n 'minimum',\n 'maximum',\n '最小值',\n '最大值',\n path,\n result,\n )\n diagnoseOrderedConfigurationPair(\n registration,\n configuration,\n 'minHeight',\n 'maxHeight',\n '最小高度',\n '最大高度',\n path,\n result,\n )\n diagnoseOrderedConfigurationPair(\n registration,\n configuration,\n 'minLength',\n 'maxLength',\n '最小长度',\n '最大长度',\n path,\n result,\n )\n const minimumSelections = configuration.minimumSelections\n const maximumSelections = configuration.maximumSelections\n if (\n isFiniteNumber(minimumSelections) &&\n isFiniteNumber(maximumSelections) &&\n maximumSelections > 0 &&\n minimumSelections > maximumSelections\n ) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_RELATION',\n `${registration.name}的最少选择不能大于最多选择`,\n `${path}.minimumSelections`,\n ),\n )\n }\n}\n\nfunction diagnoseOrderedConfigurationPair(\n registration: DesignerComponentRegistration,\n configuration: Record<string, unknown>,\n minimumKey: string,\n maximumKey: string,\n minimumLabel: string,\n maximumLabel: string,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n const minimum = configuration[minimumKey]\n const maximum = configuration[maximumKey]\n if (!isFiniteNumber(minimum) || !isFiniteNumber(maximum) || minimum <= maximum) return\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_RELATION',\n `${registration.name}的${minimumLabel}不能大于${maximumLabel}`,\n `${path}.${minimumKey}`,\n ),\n )\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value)\n}\n\nfunction isHttpsUrl(value: string): boolean {\n try {\n return new URL(value).protocol === 'https:'\n } catch {\n return false\n }\n}\n\nfunction diagnoseConfigurationOptions(\n registration: DesignerComponentRegistration,\n label: string,\n source: unknown,\n path: string,\n result: DesignerDiagnostic[],\n seen: WeakSet<object>,\n): void {\n if (!Array.isArray(source)) {\n pushConfigurationTypeDiagnostic(registration, label, path, result)\n return\n }\n if (seen.has(source)) {\n result.push(\n diagnostic('ERROR', 'COMPONENT_CONFIGURATION_CYCLE', `${label}不能形成循环引用`, path),\n )\n return\n }\n seen.add(source)\n for (const [index, item] of source.entries()) {\n const itemPath = `${path}[${index}]`\n if (['string', 'number', 'boolean'].includes(typeof item)) continue\n if (!isRecord(item)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_OPTION',\n `${registration.name}的“${label}”包含无效选项`,\n itemPath,\n ),\n )\n continue\n }\n diagnoseUnknownProperties(\n item,\n ['label', 'value', 'description', 'disabled', 'children'],\n itemPath,\n 'COMPONENT_CONFIGURATION_OPTION_UNKNOWN_PROPERTY',\n result,\n )\n if (\n typeof item.label !== 'string' ||\n !['string', 'number', 'boolean'].includes(typeof item.value)\n ) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_OPTION',\n `${registration.name}的“${label}”选项必须包含文本标签和标量值`,\n itemPath,\n ),\n )\n }\n if (\n item.description !== undefined &&\n item.description !== null &&\n typeof item.description !== 'string'\n ) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_OPTION',\n '选项说明必须是文本',\n `${itemPath}.description`,\n ),\n )\n }\n if (item.disabled !== undefined && typeof item.disabled !== 'boolean') {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_OPTION',\n '选项禁用状态必须是布尔值',\n `${itemPath}.disabled`,\n ),\n )\n }\n if (item.children !== undefined) {\n diagnoseConfigurationOptions(\n registration,\n label,\n item.children,\n `${itemPath}.children`,\n result,\n seen,\n )\n }\n }\n}\n\nfunction diagnoseInferredConfigurationValue(\n registration: DesignerComponentRegistration,\n key: string,\n expected: unknown,\n value: unknown,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n const matches = Array.isArray(expected)\n ? Array.isArray(value)\n : expected === null\n ? value === null\n : typeof value === typeof expected\n if (!matches || (typeof value === 'number' && !Number.isFinite(value))) {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_TYPE',\n `${registration.name}的“${key}”类型不正确`,\n path,\n ),\n )\n }\n}\n\nfunction pushConfigurationTypeDiagnostic(\n registration: DesignerComponentRegistration,\n label: string,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n result.push(\n diagnostic(\n 'ERROR',\n 'COMPONENT_CONFIGURATION_TYPE',\n `${registration.name}的“${label}”类型不正确`,\n path,\n ),\n )\n}\n\nfunction diagnoseFieldDisplay(\n display: Record<string, unknown>,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n diagnoseUnknownProperties(\n display,\n ['placeholder', 'hidden', 'readonly'],\n path,\n 'FIELD_DISPLAY_UNKNOWN_PROPERTY',\n result,\n )\n if (\n typeof display.hidden !== 'boolean' ||\n typeof display.readonly !== 'boolean' ||\n typeof display.placeholder !== 'string'\n ) {\n result.push(diagnostic('ERROR', 'FIELD_DISPLAY_VALUE', '字段展示配置类型不正确', path))\n }\n}\n\nfunction diagnoseFieldValidation(\n validation: Record<string, unknown>,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n diagnoseUnknownProperties(\n validation,\n ['minimumLength', 'maximumLength', 'minimum', 'maximum', 'pattern', 'message'],\n path,\n 'FIELD_VALIDATION_UNKNOWN_PROPERTY',\n result,\n )\n for (const key of ['minimumLength', 'maximumLength'] as const) {\n const value = validation[key]\n if (value !== undefined && (!Number.isInteger(value) || (value as number) < 0)) {\n result.push(\n diagnostic('ERROR', 'FIELD_VALIDATION_NUMBER', `${key} 必须是非负整数`, `${path}.${key}`),\n )\n }\n }\n for (const key of ['minimum', 'maximum'] as const) {\n const value = validation[key]\n if (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value))) {\n result.push(\n diagnostic('ERROR', 'FIELD_VALIDATION_NUMBER', `${key} 必须是有限数值`, `${path}.${key}`),\n )\n }\n }\n for (const key of ['pattern', 'message'] as const) {\n const value = validation[key]\n if (value !== undefined && typeof value !== 'string') {\n result.push(\n diagnostic('ERROR', 'FIELD_VALIDATION_TEXT', `${key} 必须是文本`, `${path}.${key}`),\n )\n }\n }\n}\n\nfunction diagnoseFieldBinding(source: unknown, path: string, result: DesignerDiagnostic[]): void {\n if (!isRecord(source)) {\n result.push(diagnostic('ERROR', 'FIELD_BINDING', '字段绑定必须是对象', path))\n return\n }\n diagnoseUnknownProperties(\n source,\n ['provider', 'sourceId', 'fieldId', 'fieldPath', 'sourceDataType', 'sourceRevision'],\n path,\n 'FIELD_BINDING_UNKNOWN_PROPERTY',\n result,\n )\n for (const key of ['provider', 'sourceId', 'fieldId', 'fieldPath', 'sourceDataType'] as const) {\n if (typeof source[key] !== 'string' || !source[key]) {\n result.push(\n diagnostic('ERROR', 'FIELD_BINDING_VALUE', '字段绑定标识不能为空', `${path}.${key}`),\n )\n }\n }\n if (source.sourceRevision !== undefined && !Number.isInteger(source.sourceRevision)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'FIELD_BINDING_VALUE',\n '字段来源版本必须是整数',\n `${path}.sourceRevision`,\n ),\n )\n }\n}\n\nfunction diagnoseUnknownProperties(\n source: Record<string, unknown>,\n allowedKeys: Iterable<string>,\n path: string,\n code: string,\n result: DesignerDiagnostic[],\n): void {\n const allowed = new Set(allowedKeys)\n for (const key of Object.keys(source)) {\n if (allowed.has(key)) continue\n result.push(diagnostic('ERROR', code, `不支持属性 ${key}`, `${path}.${key}`))\n }\n}\n\n/** 校验表单级外观配置,避免合法 JSON 在渲染阶段才因异常类型失败。 */\nfunction diagnoseAppearance(\n appearance: Record<string, unknown>,\n path: string,\n result: DesignerDiagnostic[],\n): void {\n diagnoseUnknownProperties(\n appearance,\n [\n 'labelPosition',\n 'labelWidth',\n 'labelSuffix',\n 'labelAlign',\n 'defaultPlaceholder',\n 'gridGutter',\n 'rowGap',\n 'defaultPcSpan',\n 'defaultMobileSpan',\n 'readonlyDisplayMode',\n 'size',\n 'controlRadius',\n 'containerStyle',\n 'containerRadius',\n ],\n path,\n 'APPEARANCE_UNKNOWN_PROPERTY',\n result,\n )\n if (!['TOP', 'LEFT', 'RIGHT'].includes(String(appearance.labelPosition)))\n result.push(\n diagnostic('ERROR', 'APPEARANCE_LABEL_POSITION', '标签位置不正确', `${path}.labelPosition`),\n )\n if (!['LEFT', 'RIGHT'].includes(String(appearance.labelAlign)))\n result.push(\n diagnostic('ERROR', 'APPEARANCE_LABEL_ALIGN', '标签对齐方式不正确', `${path}.labelAlign`),\n )\n if (!['CONTROL', 'TEXT'].includes(String(appearance.readonlyDisplayMode)))\n result.push(\n diagnostic(\n 'ERROR',\n 'APPEARANCE_READONLY_MODE',\n '只读展示方式不正确',\n `${path}.readonlyDisplayMode`,\n ),\n )\n if (!['SMALL', 'DEFAULT', 'LARGE'].includes(String(appearance.size)))\n result.push(diagnostic('ERROR', 'APPEARANCE_SIZE', '控件尺寸不正确', `${path}.size`))\n if (!['THEME', 'NONE', 'SMALL', 'BASE', 'LARGE'].includes(String(appearance.controlRadius)))\n result.push(\n diagnostic('ERROR', 'APPEARANCE_CONTROL_RADIUS', '控件圆角不正确', `${path}.controlRadius`),\n )\n if (!['NONE', 'BORDERED', 'SHADOW'].includes(String(appearance.containerStyle)))\n result.push(\n diagnostic(\n 'ERROR',\n 'APPEARANCE_CONTAINER_STYLE',\n '默认容器样式不正确',\n `${path}.containerStyle`,\n ),\n )\n if (!['THEME', 'NONE', 'SMALL', 'BASE', 'LARGE'].includes(String(appearance.containerRadius)))\n result.push(\n diagnostic(\n 'ERROR',\n 'APPEARANCE_CONTAINER_RADIUS',\n '默认容器圆角不正确',\n `${path}.containerRadius`,\n ),\n )\n for (const [key, minimum, maximum] of [\n ['labelWidth', 0, 320],\n ['gridGutter', 0, 64],\n ['rowGap', 0, 64],\n ['defaultPcSpan', 1, 24],\n ['defaultMobileSpan', 1, 24],\n ] as const) {\n const value = appearance[key]\n if (\n typeof value !== 'number' ||\n !Number.isFinite(value) ||\n value < minimum ||\n value > maximum\n ) {\n result.push(\n diagnostic('ERROR', 'APPEARANCE_NUMBER', `${key} 数值范围不正确`, `${path}.${key}`),\n )\n }\n }\n if (\n typeof appearance.labelSuffix !== 'string' ||\n typeof appearance.defaultPlaceholder !== 'string'\n )\n result.push(diagnostic('ERROR', 'APPEARANCE_TEXT', '表单外观文本配置类型不正确', path))\n}\n\nfunction diagnoseGrid(layout: unknown, path: string, result: DesignerDiagnostic[]): void {\n if (!isRecord(layout)) {\n result.push(diagnostic('ERROR', 'GRID_TYPE', '响应式栅格配置必须是对象', path))\n return\n }\n diagnoseUnknownProperties(layout, ['pc', 'mobile'], path, 'GRID_UNKNOWN_PROPERTY', result)\n for (const device of ['pc', 'mobile'] as const) {\n const rawGrid = layout[device]\n if (!isRecord(rawGrid)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'GRID_DEVICE_TYPE',\n `${device} 栅格配置必须是对象`,\n `${path}.${device}`,\n ),\n )\n continue\n }\n diagnoseUnknownProperties(\n rawGrid,\n ['span', 'offset', 'showLabel', 'labelPosition'],\n `${path}.${device}`,\n 'GRID_DEVICE_UNKNOWN_PROPERTY',\n result,\n )\n const grid = rawGrid as unknown as DesignerDeviceGrid\n const validSpan = Number.isInteger(grid.span) && grid.span >= 1 && grid.span <= 24\n const validOffset = Number.isInteger(grid.offset) && grid.offset >= 0 && grid.offset <= 23\n if (!validSpan) {\n result.push(\n diagnostic(\n 'ERROR',\n 'GRID_SPAN',\n `${device} 跨度必须为 1~24 的整数`,\n `${path}.${device}.span`,\n ),\n )\n }\n if (!validOffset) {\n result.push(\n diagnostic(\n 'ERROR',\n 'GRID_OFFSET',\n `${device} 偏移必须为 0~23 的整数`,\n `${path}.${device}.offset`,\n ),\n )\n }\n if (validSpan && validOffset && grid.span + grid.offset > 24) {\n result.push(\n diagnostic(\n 'ERROR',\n 'GRID_RANGE',\n `${device} 偏移与跨度之和不能超过 24`,\n `${path}.${device}`,\n ),\n )\n }\n if (typeof grid.showLabel !== 'boolean') {\n result.push(\n diagnostic(\n 'ERROR',\n 'GRID_SHOW_LABEL',\n `${device} 标签显示状态必须是布尔值`,\n `${path}.${device}.showLabel`,\n ),\n )\n }\n if (!['INHERIT', 'TOP', 'LEFT', 'RIGHT'].includes(String(grid.labelPosition))) {\n result.push(\n diagnostic(\n 'ERROR',\n 'GRID_LABEL_POSITION',\n `${device} 标签位置不正确`,\n `${path}.${device}.labelPosition`,\n ),\n )\n }\n }\n}\n\nfunction containerLabel(\n node: DesignerContainerNode,\n registration: DesignerComponentRegistration | undefined,\n): string {\n const title = node.configuration.title ?? node.configuration.text\n return typeof title === 'string' && title.trim()\n ? title\n : (registration?.name ?? node.componentType)\n}\n\nfunction normalizeOptions(source: unknown): Array<{ label: string; value: unknown }> {\n if (!Array.isArray(source)) return []\n return source.map((item, index) => {\n if (isRecord(item))\n return { label: String(item.label ?? `标签页 ${index + 1}`), value: item.value }\n return { label: String(item), value: item }\n })\n}\n\nfunction diagnostic(\n severity: DesignerDiagnostic['severity'],\n code: string,\n message: string,\n path: string,\n): DesignerDiagnostic {\n return { severity, code, message, path }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * 规范化设计文档的兼容默认值,并保证不修改调用方持有的原始对象。\n *\n * 旧文档缺少的新外观字段按原视觉补齐,并将四类表面容器的 v1 配置迁移为 v2。\n * 已存在但非法的值保持原样,由诊断层失败关闭;原始 localStorage 只会在用户保存时被替换。\n */\nfunction normalizeDesignerDocument(source: unknown): DesignerDocument {\n const normalized = deepClone(source) as unknown\n if (!isRecord(normalized)) return normalized as DesignerDocument\n normalizeDesignerAdvancedDocument(normalized)\n normalizeDesignerAppearance(normalized.appearance)\n if (isRecord(normalized.uiSchema) && Array.isArray(normalized.uiSchema.root)) {\n normalizeSurfaceContainerConfigurations(normalized.uiSchema.root)\n if (isRecord(normalized.dataSchema) && Array.isArray(normalized.dataSchema.fields)) {\n normalizeDesignerDataModel(normalized as unknown as DesignerDocument)\n }\n }\n return normalized as unknown as DesignerDocument\n}\n\nfunction normalizeDesignerAppearance(source: unknown): void {\n if (!isRecord(source)) return\n if (!('rowGap' in source)) source.rowGap = DEFAULT_APPEARANCE.rowGap\n if (!('controlRadius' in source)) source.controlRadius = 'THEME'\n if (!('containerStyle' in source)) source.containerStyle = 'NONE'\n // 旧文档没有容器圆角概念,继续跟随系统才能保持首次加载的原视觉。\n if (!('containerRadius' in source)) source.containerRadius = 'THEME'\n}\n\nfunction normalizeSurfaceContainerConfigurations(nodes: unknown[]): void {\n for (const source of nodes) {\n if (!isRecord(source) || source.nodeType !== 'CONTAINER') continue\n if (\n source.configurationVersion === 1 &&\n SURFACE_CONTAINER_COMPONENT_TYPES.has(String(source.componentType)) &&\n isRecord(source.configuration)\n ) {\n // v1 分组原有样式继续保留;Tabs 与子表过去没有外层样式,统一补为 NONE。\n if (!('surfaceStyle' in source.configuration)) source.configuration.surfaceStyle = 'NONE'\n if (!('surfaceRadius' in source.configuration)) source.configuration.surfaceRadius = 'THEME'\n source.configurationVersion = 2\n }\n if (!Array.isArray(source.slots)) continue\n for (const slot of source.slots) {\n if (isRecord(slot) && Array.isArray(slot.children))\n normalizeSurfaceContainerConfigurations(slot.children)\n }\n }\n}\n\nfunction deepClone<T>(source: T): T {\n return JSON.parse(JSON.stringify(source)) as T\n}\n","import { evaluateDesignerCondition, evaluateDesignerExpression } from './expression'\nimport type {\n DesignerDataSourceDefinition,\n DesignerDocument,\n DesignerEventActionStep,\n DesignerEventFlow,\n DesignerEventStep,\n DesignerExpression,\n DesignerExpressionRuntimeContext,\n DesignerRuntimeAdapters,\n DesignerRuntimeValueStore,\n} from './types'\n\nconst MAX_EVENT_DEPTH = 20\nconst MAX_EVENT_STEPS = 200\n\n/** 事件流运行 Host;所有可能产生外部副作用的能力均由显式回调或 Adapter 提供。 */\nexport interface DesignerEventRuntimeHost {\n document: DesignerDocument\n valueStore: DesignerRuntimeValueStore\n variables: Record<string, unknown>\n currentRow?: Record<string, unknown>\n expressionContext: DesignerExpressionRuntimeContext['context']\n adapters?: DesignerRuntimeAdapters\n validate?: () => Promise<boolean>\n submit?: () => Promise<void>\n reset?: () => void\n print?: () => void\n message?: (message: string, level: 'SUCCESS' | 'INFO' | 'WARNING' | 'ERROR') => void\n openModule?: (moduleCode: string) => void\n confirmModule?: (moduleCode: string) => void\n cancelModule?: (moduleCode: string) => void\n}\n\n/** 事件流执行结果。 */\nexport interface DesignerEventExecutionResult {\n completed: boolean\n blocked: boolean\n executedStepIds: string[]\n errors: string[]\n}\n\n/**\n * 执行声明式事件流。\n *\n * 运行器限制最大深度、步骤数量和同一流重复进入;未提供的外部能力失败关闭。\n */\nexport async function executeDesignerEventFlow(\n flow: DesignerEventFlow,\n host: DesignerEventRuntimeHost,\n activeFlowIds: Set<string> = new Set(),\n): Promise<DesignerEventExecutionResult> {\n if (!flow.enabled) return { completed: true, blocked: false, executedStepIds: [], errors: [] }\n if (activeFlowIds.has(flow.id)) {\n return {\n completed: false,\n blocked: true,\n executedStepIds: [],\n errors: ['事件流发生重复进入,已终止执行'],\n }\n }\n activeFlowIds.add(flow.id)\n const result: DesignerEventExecutionResult = {\n completed: false,\n blocked: false,\n executedStepIds: [],\n errors: [],\n }\n let visited = 0\n const runtime = (): DesignerExpressionRuntimeContext => ({\n fields: host.valueStore.fields,\n variables: host.variables,\n context: host.expressionContext,\n currentRow: host.currentRow,\n })\n const executeSteps = async (steps: DesignerEventStep[], depth: number): Promise<boolean> => {\n if (depth > MAX_EVENT_DEPTH) throw new Error('事件流嵌套深度超过限制')\n for (const step of steps) {\n visited += 1\n if (visited > MAX_EVENT_STEPS) throw new Error('事件流步骤数量超过限制')\n result.executedStepIds.push(step.id)\n if (step.stepType === 'CONDITION') {\n const branch = step.branches.find((item) =>\n evaluateDesignerCondition(item.condition, runtime()),\n )\n const continued = await executeSteps(branch?.steps ?? step.elseSteps, depth + 1)\n if (!continued) return false\n continue\n }\n if (step.guard && !evaluateDesignerCondition(step.guard, runtime())) {\n if (step.guardFailure === 'SKIP') continue\n result.blocked = true\n result.errors.push(`${step.name}的执行条件未满足`)\n return false\n }\n try {\n await executeAction(step, host, runtime())\n } catch (error) {\n result.errors.push(`${step.name}:${error instanceof Error ? error.message : '执行失败'}`)\n if (step.onError === 'STOP') {\n result.blocked = true\n return false\n }\n }\n }\n return true\n }\n try {\n result.completed = await executeSteps(flow.steps, 0)\n } catch (error) {\n result.blocked = true\n result.errors.push(error instanceof Error ? error.message : '事件流执行失败')\n } finally {\n activeFlowIds.delete(flow.id)\n }\n return result\n}\n\nasync function executeAction(\n step: DesignerEventActionStep,\n host: DesignerEventRuntimeHost,\n runtime: DesignerExpressionRuntimeContext,\n): Promise<void> {\n const configuration = step.configuration\n if (step.actionType === 'SET_FIELD') {\n const fieldId = requiredText(configuration.fieldId, '目标字段')\n assignFieldValue(host, fieldId, cloneValue(resolveActionValue(configuration, runtime)))\n return\n }\n if (step.actionType === 'CLEAR_FIELD') {\n const fieldId = requiredText(configuration.fieldId, '目标字段')\n assignFieldValue(host, fieldId, null)\n return\n }\n if (step.actionType === 'COPY_FIELD') {\n const sourceFieldId = requiredText(configuration.sourceFieldId, '来源字段')\n const targetFieldId = requiredText(configuration.targetFieldId, '目标字段')\n assignFieldValue(host, targetFieldId, cloneValue(readFieldValue(host, sourceFieldId)))\n return\n }\n if (step.actionType === 'SET_VARIABLE') {\n const variableCode = requiredText(configuration.variableCode, '变量编码')\n host.variables[variableCode] = cloneValue(resolveActionValue(configuration, runtime))\n return\n }\n if (step.actionType === 'VALIDATE') {\n if (!host.validate) throw new Error('当前 Host 未提供表单验证能力')\n if (!(await host.validate())) throw new Error('表单验证未通过')\n return\n }\n if (step.actionType === 'SUBMIT') {\n if (!host.submit) throw new Error('当前 Host 未提供提交能力')\n await host.submit()\n return\n }\n if (step.actionType === 'RESET') {\n if (!host.reset) throw new Error('当前 Host 未提供重置能力')\n host.reset()\n return\n }\n if (step.actionType === 'PRINT') {\n if (!host.print) throw new Error('当前 Host 未提供打印能力')\n host.print()\n return\n }\n if (step.actionType === 'MESSAGE') {\n if (!host.message) throw new Error('当前 Host 未提供消息能力')\n host.message(requiredText(configuration.message, '消息内容'), messageLevel(configuration.level))\n return\n }\n if (step.actionType === 'OPEN_MODULE') {\n if (!host.openModule) throw new Error('当前 Host 未提供模块打开能力')\n host.openModule(requiredText(configuration.moduleCode, '模块编码'))\n return\n }\n if (step.actionType === 'CONFIRM_MODULE') {\n if (!host.confirmModule) throw new Error('当前 Host 未提供模块确认能力')\n host.confirmModule(requiredText(configuration.moduleCode, '模块编码'))\n return\n }\n if (step.actionType === 'CANCEL_MODULE') {\n if (!host.cancelModule) throw new Error('当前 Host 未提供模块取消能力')\n host.cancelModule(requiredText(configuration.moduleCode, '模块编码'))\n return\n }\n if (step.actionType === 'NAVIGATE_RESOURCE') {\n const adapter = host.adapters?.hostAction\n if (!adapter) throw new Error('当前 Host 未提供同应用资源导航能力')\n await adapter.navigateResource(\n requiredText(configuration.resourceCode, '资源编码'),\n configuration.openInNewPage === true,\n )\n return\n }\n if (step.actionType === 'REFRESH_DATA_SOURCE') {\n const adapter = host.adapters?.dataSource\n if (!adapter) throw new Error('当前 Host 未提供数据源能力')\n const definition = resolveDataSource(host.document, configuration.dataSourceCode)\n const output = await adapter.execute(definition, resolveMappedInput(definition, runtime))\n for (const mapping of definition.outputMappings) {\n if (mapping.target.startsWith('field:')) {\n assignFieldValue(\n host,\n mapping.target.slice('field:'.length),\n cloneValue(output[mapping.source]),\n )\n } else if (mapping.target.startsWith('variable:')) {\n host.variables[mapping.target.slice('variable:'.length)] = cloneValue(\n output[mapping.source],\n )\n }\n }\n return\n }\n if (step.actionType === 'HOST_ACTION') {\n const adapter = host.adapters?.hostAction\n if (!adapter) throw new Error('当前 Host 未提供业务动作能力')\n await adapter.execute(requiredText(configuration.actionCode, '动作编码'), {\n fields: cloneValue(host.valueStore.fields),\n variables: cloneValue(host.variables),\n })\n }\n}\n\nfunction readFieldValue(host: DesignerEventRuntimeHost, fieldId: string): unknown {\n return host.currentRow && fieldId in host.currentRow\n ? host.currentRow[fieldId]\n : host.valueStore.fields[fieldId]\n}\n\nfunction assignFieldValue(host: DesignerEventRuntimeHost, fieldId: string, value: unknown): void {\n if (host.currentRow && fieldId in host.currentRow) host.currentRow[fieldId] = value\n else host.valueStore.fields[fieldId] = value\n}\n\nfunction resolveActionValue(\n configuration: Record<string, unknown>,\n runtime: DesignerExpressionRuntimeContext,\n): unknown {\n const expression = configuration.expression\n if (isRecord(expression))\n return evaluateDesignerExpression(expression as unknown as DesignerExpression, runtime)\n return configuration.value ?? null\n}\n\nfunction resolveDataSource(\n document: DesignerDocument,\n code: unknown,\n): DesignerDataSourceDefinition {\n const sourceCode = requiredText(code, '数据源编码')\n const definition = document.dataSources.find((item) => item.code === sourceCode)\n if (!definition) throw new Error(`数据源 ${sourceCode} 不存在`)\n return definition\n}\n\nfunction resolveMappedInput(\n definition: DesignerDataSourceDefinition,\n runtime: DesignerExpressionRuntimeContext,\n): Record<string, unknown> {\n const input: Record<string, unknown> = {}\n for (const mapping of definition.inputMappings) {\n if (mapping.source.startsWith('field:'))\n input[mapping.target] = runtime.fields[mapping.source.slice(6)]\n else if (mapping.source.startsWith('variable:')) {\n input[mapping.target] = runtime.variables[mapping.source.slice(9)]\n }\n }\n return input\n}\n\nfunction requiredText(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label}未配置`)\n return value.trim()\n}\n\nfunction messageLevel(value: unknown): 'SUCCESS' | 'INFO' | 'WARNING' | 'ERROR' {\n return ['SUCCESS', 'INFO', 'WARNING', 'ERROR'].includes(String(value))\n ? (value as 'SUCCESS' | 'INFO' | 'WARNING' | 'ERROR')\n : 'INFO'\n}\n\nfunction cloneValue<T>(value: T): T {\n if (value === undefined || value === null) return value\n if (typeof globalThis.structuredClone === 'function') {\n try {\n return globalThis.structuredClone(value)\n } catch {\n // 文件句柄等宿主对象无法结构化克隆时使用保守递归策略。\n }\n }\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T\n if (typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n cloneValue(item),\n ]),\n ) as T\n }\n return value\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { findDesignerComponent } from './component-registry'\nimport { diagnoseDesignerAdvancedDocument } from './document-advanced'\nimport type {\n DesignerDiagnosticSeverity,\n DesignerDocument,\n DesignerEventActionType,\n DesignerEventFlow,\n DesignerEventStep,\n DesignerField,\n DesignerFieldBehavior,\n DesignerFieldStateRule,\n DesignerFieldValueRule,\n DesignerLinkageOverwritePolicy,\n DesignerValidationConfigurationMap,\n DesignerValidationRule,\n DesignerValidationRuleType,\n} from './types'\n\n/** 高级配置编辑器只消费能力状态,不持有 Adapter 实例。 */\nexport interface DesignerFieldBehaviorCapabilities {\n remoteValidation: boolean\n dataSource: boolean\n navigation: boolean\n hostAction: boolean\n linkageConfirmation: boolean\n}\n\n/** 字段验证目录中的可创建规则。 */\nexport interface DesignerValidationCatalogItem {\n type: DesignerValidationRuleType\n label: string\n description: string\n available: boolean\n unavailableReason: string\n}\n\n/** 高级配置保存前可定位到页签与规则的诊断。 */\nexport interface DesignerFieldBehaviorDiagnostic {\n severity: DesignerDiagnosticSeverity\n code: string\n message: string\n path: string\n tab: 'state' | 'value' | 'validation' | 'submit'\n ruleId?: string\n}\n\n/** 事件动作目录项的运行能力状态。 */\nexport interface DesignerEventActionAvailability {\n type: DesignerEventActionType\n available: boolean\n unavailableReason: string\n}\n\nconst VALIDATION_META: Record<\n DesignerValidationRuleType,\n Pick<DesignerValidationCatalogItem, 'label' | 'description'>\n> = {\n LENGTH: { label: '长度', description: '限制文本最短与最长长度' },\n RANGE: { label: '数值范围', description: '限制数值最小值与最大值' },\n PRECISION: { label: '小数精度', description: '限制数值允许的小数位数' },\n FORMAT: { label: '常用格式', description: '校验邮箱、电话号码或稳定编码' },\n REGEX: { label: '安全正则', description: '使用受控安全正则校验文本格式' },\n DATE: { label: '日期范围', description: '限制最早与最晚日期时间' },\n SELECTION: { label: '选择数量', description: '限制集合最少与最多选择项' },\n FILE: { label: '文件约束', description: '限制文件数量、大小和类型' },\n COMPARE_FIELD: { label: '跨字段比较', description: '与同一表单作用域内的字段比较' },\n EXPRESSION: { label: '表达式', description: '使用受控布尔表达式判定数据' },\n SUBTABLE: { label: '子表行数', description: '限制关联子表最少与最多行数' },\n REMOTE: { label: '远程验证', description: '交由 Host 提供的验证 Adapter 执行' },\n}\n\n/**\n * 生成当前字段可创建的验证规则目录。\n *\n * 历史远程规则由编辑器额外保留;目录在缺少 Adapter 时只提供禁用说明,禁止新建。\n */\nexport function resolveDesignerValidationCatalog(\n document: DesignerDocument,\n field: DesignerField,\n capabilities: DesignerFieldBehaviorCapabilities,\n): DesignerValidationCatalogItem[] {\n const supported = new Set<DesignerValidationRuleType>(['COMPARE_FIELD', 'EXPRESSION'])\n const registration = findDesignerComponent(field.componentType)\n const semanticType = registration?.semanticType ?? field.semanticType\n if (['STRING', 'LONG_TEXT', 'REFERENCE'].includes(semanticType)) {\n supported.add('LENGTH')\n supported.add('FORMAT')\n supported.add('REGEX')\n }\n if (semanticType === 'NUMBER') {\n supported.add('RANGE')\n supported.add('PRECISION')\n }\n if (['DATE', 'DATE_TIME'].includes(semanticType)) supported.add('DATE')\n if (isCollectionField(field)) supported.add('SELECTION')\n if (semanticType === 'FILE') supported.add('FILE')\n if (hasSubtable(document)) supported.add('SUBTABLE')\n supported.add('REMOTE')\n\n return [...supported].map((type) => {\n const requiresRemoteAdapter = type === 'REMOTE'\n return {\n type,\n ...VALIDATION_META[type],\n available: !requiresRemoteAdapter || capabilities.remoteValidation,\n unavailableReason:\n requiresRemoteAdapter && !capabilities.remoteValidation\n ? '当前 Host 未提供远程验证 Adapter,历史规则会保留但不能新建'\n : '',\n }\n })\n}\n\n/** 创建合法且可立即编辑的字段状态规则。 */\nexport function createDesignerStateRule(\n document: DesignerDocument,\n field: DesignerField,\n): DesignerFieldStateRule {\n return {\n id: createBehaviorId('state'),\n target: 'VISIBLE',\n condition: defaultCondition(document, field),\n valueWhenTrue: true,\n }\n}\n\n/** 创建公式或联动默认规则;联动显式携带覆盖策略。 */\nexport function createDesignerValueRule(\n mode: DesignerFieldValueRule['mode'] = 'FORMULA',\n): DesignerFieldValueRule {\n if (mode === 'LINKAGE') {\n return {\n id: createBehaviorId('linkage'),\n mode,\n expression: { kind: 'LITERAL', value: null },\n overwritePolicy: 'ALWAYS',\n }\n }\n return {\n id: createBehaviorId('formula'),\n mode,\n expression: { kind: 'LITERAL', value: null },\n }\n}\n\n/** 创建当前类型的严格验证规则默认值。 */\nexport function createDesignerValidationRule(\n type: DesignerValidationRuleType,\n document: DesignerDocument,\n field: DesignerField,\n sequence: number,\n): DesignerValidationRule {\n const base = {\n id: createBehaviorId('validation'),\n name: `${VALIDATION_META[type].label}${sequence}`,\n enabled: true,\n trigger: 'SUBMIT' as const,\n severity: 'ERROR' as const,\n message: '',\n }\n const configuration = createValidationConfiguration(type, document, field)\n return { ...base, type, configuration } as DesignerValidationRule\n}\n\n/** 将字段状态规则转换为列表摘要。 */\nexport function summarizeDesignerStateRule(rule: DesignerFieldStateRule): string {\n const target = { VISIBLE: '显示', REQUIRED: '必填', DISABLED: '禁用' }[rule.target]\n return `条件成立时${rule.valueWhenTrue ? '' : '不'}${target}`\n}\n\n/** 将公式或联动转换为列表摘要。 */\nexport function summarizeDesignerValueRule(rule: DesignerFieldValueRule): string {\n if (rule.mode === 'FORMULA') return '依赖变化后自动重算,目标字段只读'\n const policy: Record<DesignerLinkageOverwritePolicy, string> = {\n ALWAYS: '始终覆盖',\n EMPTY_ONLY: '仅空值写入',\n CONFIRM: '覆盖前确认',\n }\n return `依赖变化时联动 · ${policy[rule.overwritePolicy]}`\n}\n\n/** 将验证规则转换为列表摘要。 */\nexport function summarizeDesignerValidationRule(rule: DesignerValidationRule): string {\n const status = rule.enabled ? '启用' : '停用'\n const severity = rule.severity === 'ERROR' ? '阻断错误' : '字段警告'\n return `${VALIDATION_META[rule.type].label} · ${status} · ${severity}`\n}\n\n/**\n * 使用行为与事件流草稿构造临时文档并返回字段级诊断。\n *\n * 文档诊断负责严格 Schema、表达式、循环与引用;本模块补充产品级重复名称和 Adapter 能力诊断。\n */\nexport function diagnoseDesignerFieldBehaviorDraft(input: {\n document: DesignerDocument\n fieldId: string\n behavior: DesignerFieldBehavior\n eventFlows: DesignerEventFlow[]\n capabilities: DesignerFieldBehaviorCapabilities\n}): DesignerFieldBehaviorDiagnostic[] {\n const document = cloneValue(input.document)\n document.eventFlows = cloneValue(input.eventFlows)\n const fieldIndex = document.dataSchema.fields.findIndex((field) => field.id === input.fieldId)\n const field = document.dataSchema.fields[fieldIndex]\n if (!field) {\n return [\n diagnostic('ERROR', 'FIELD_MISSING', '当前字段已不存在', '$.dataSchema.fields', 'state'),\n ]\n }\n field.behavior = cloneValue(input.behavior)\n const fieldPath = `$.dataSchema.fields[${fieldIndex}].behavior`\n const result = diagnoseDesignerAdvancedDocument(document)\n .filter((item) => item.path.startsWith(fieldPath) || item.path.startsWith('$.eventFlows'))\n .map((item) => toFieldDiagnostic(item, field, input.behavior))\n appendDuplicateRuleNames(input.behavior, result)\n appendCapabilityDiagnostics(input, result)\n return deduplicateDiagnostics(result)\n}\n\n/** 根据运行能力输出事件动作的可新增状态。 */\nexport function resolveDesignerEventActionAvailability(\n type: DesignerEventActionType,\n capabilities: DesignerFieldBehaviorCapabilities,\n): DesignerEventActionAvailability {\n if (type === 'NAVIGATE_RESOURCE' && !capabilities.navigation) {\n return { type, available: false, unavailableReason: '当前 Host 未提供同应用导航 Adapter' }\n }\n if (type === 'REFRESH_DATA_SOURCE' && !capabilities.dataSource) {\n return { type, available: false, unavailableReason: '当前 Host 未提供数据源 Adapter' }\n }\n if (type === 'HOST_ACTION' && !capabilities.hostAction) {\n return { type, available: false, unavailableReason: '当前 Host 未提供 Host 动作 Adapter' }\n }\n return { type, available: true, unavailableReason: '' }\n}\n\nfunction createValidationConfiguration<Type extends DesignerValidationRuleType>(\n type: Type,\n document: DesignerDocument,\n field: DesignerField,\n): DesignerValidationConfigurationMap[Type] {\n const comparisonField = document.dataSchema.fields.find(\n (candidate) => candidate.id !== field.id && candidate.entityCode === field.entityCode,\n )\n const subtableId = findFirstSubtableId(document)\n const configurations: DesignerValidationConfigurationMap = {\n LENGTH: {},\n RANGE: {},\n PRECISION: { scale: 2 },\n FORMAT: { format: 'EMAIL' },\n REGEX: { pattern: '.*' },\n DATE: {},\n SELECTION: {},\n FILE: {},\n COMPARE_FIELD: { fieldId: comparisonField?.id ?? '', operator: 'EQ' },\n EXPRESSION: { expression: defaultCondition(document, field) },\n SUBTABLE: { containerId: subtableId },\n REMOTE: { provider: '', validatorId: '' },\n }\n return configurations[type]\n}\n\nfunction defaultCondition(document: DesignerDocument, field: DesignerField) {\n const candidate =\n document.dataSchema.fields.find((item) => item.entityCode === field.entityCode)?.id ?? field.id\n return {\n kind: 'CALL' as const,\n function: 'NOT_EMPTY' as const,\n arguments: [\n {\n kind: 'FIELD' as const,\n fieldId: candidate,\n scope:\n field.entityCode === document.dataSchema.rootEntity.code\n ? ('ROOT' as const)\n : ('CURRENT_ROW' as const),\n },\n ],\n }\n}\n\nfunction isCollectionField(field: DesignerField): boolean {\n return (\n field.semanticType === 'ARRAY' ||\n ['checkbox', 'multi-select', 'date-multiple'].includes(field.componentType) ||\n field.configuration.multiple === true ||\n field.configuration.selectionMode === 'MULTIPLE'\n )\n}\n\nfunction hasSubtable(document: DesignerDocument): boolean {\n return Boolean(findFirstSubtableId(document))\n}\n\nfunction findFirstSubtableId(document: DesignerDocument): string {\n const roots = [\n document.uiSchema.root,\n ...document.uiSchema.overlays.map((overlay) => overlay.root),\n ]\n for (const root of roots) {\n const found = findSubtableInNodes(root)\n if (found) return found\n }\n return ''\n}\n\nfunction findSubtableInNodes(nodes: DesignerDocument['uiSchema']['root']): string {\n for (const node of nodes) {\n if (\n node.nodeType === 'CONTAINER' &&\n ['row-subtable', 'block-subtable'].includes(node.componentType)\n ) {\n return node.id\n }\n if (node.nodeType === 'CONTAINER') {\n for (const slot of node.slots) {\n const nested = findSubtableInNodes(slot.children)\n if (nested) return nested\n }\n }\n }\n return ''\n}\n\nfunction appendDuplicateRuleNames(\n behavior: DesignerFieldBehavior,\n result: DesignerFieldBehaviorDiagnostic[],\n): void {\n const firstByName = new Map<string, string>()\n for (const rule of behavior.validationRules) {\n const normalized = rule.name.trim().toLocaleLowerCase()\n if (!normalized) {\n result.push(\n diagnostic(\n 'ERROR',\n 'VALIDATION_RULE_NAME',\n '验证规则名称不能为空',\n '',\n 'validation',\n rule.id,\n ),\n )\n continue\n }\n if (firstByName.has(normalized)) {\n result.push(\n diagnostic(\n 'ERROR',\n 'VALIDATION_RULE_DUPLICATE_NAME',\n '验证规则名称不能重复',\n '',\n 'validation',\n rule.id,\n ),\n )\n continue\n }\n firstByName.set(normalized, rule.id)\n }\n}\n\nfunction appendCapabilityDiagnostics(\n input: {\n behavior: DesignerFieldBehavior\n eventFlows: DesignerEventFlow[]\n capabilities: DesignerFieldBehaviorCapabilities\n },\n result: DesignerFieldBehaviorDiagnostic[],\n): void {\n for (const rule of input.behavior.validationRules) {\n if (rule.type === 'REMOTE' && !input.capabilities.remoteValidation) {\n result.push(\n diagnostic(\n 'WARNING',\n 'REMOTE_VALIDATION_ADAPTER_MISSING',\n '当前 Host 未提供远程验证 Adapter;历史规则会保留并在运行时失败关闭',\n '',\n 'validation',\n rule.id,\n ),\n )\n }\n }\n for (const rule of input.behavior.valueRules) {\n if (\n rule.mode === 'LINKAGE' &&\n rule.overwritePolicy === 'CONFIRM' &&\n !input.capabilities.linkageConfirmation\n ) {\n result.push(\n diagnostic(\n 'WARNING',\n 'LINKAGE_CONFIRM_ADAPTER_MISSING',\n '当前 Host 未提供联动确认 Adapter;已有值不会被覆盖',\n '',\n 'value',\n rule.id,\n ),\n )\n }\n }\n const boundCodes = new Set(Object.values(input.behavior.eventBindings).filter(Boolean))\n for (const flow of input.eventFlows.filter((item) => boundCodes.has(item.code))) {\n visitEventSteps(flow.steps, (step) => {\n if (step.stepType !== 'ACTION') return\n const availability = resolveDesignerEventActionAvailability(\n step.actionType,\n input.capabilities,\n )\n if (!availability.available) {\n result.push(\n diagnostic(\n 'WARNING',\n 'EVENT_ACTION_ADAPTER_MISSING',\n `${availability.unavailableReason};历史步骤会保留并在运行时失败关闭`,\n '',\n 'submit',\n ),\n )\n }\n })\n }\n}\n\nfunction visitEventSteps(\n steps: DesignerEventStep[],\n visit: (step: DesignerEventStep) => void,\n): void {\n for (const step of steps) {\n visit(step)\n if (step.stepType === 'CONDITION') {\n step.branches.forEach((branch) => visitEventSteps(branch.steps, visit))\n visitEventSteps(step.elseSteps, visit)\n }\n }\n}\n\nfunction toFieldDiagnostic(\n item: { severity: DesignerDiagnosticSeverity; code: string; message: string; path: string },\n field: DesignerField,\n behavior: DesignerFieldBehavior,\n): DesignerFieldBehaviorDiagnostic {\n const tab = diagnosticTab(item.path)\n const indexMatch = item.path.match(/\\.(stateRules|valueRules|validationRules)\\[(\\d+)]/)\n const collection = indexMatch?.[1]\n const index = Number(indexMatch?.[2] ?? -1)\n const ruleId =\n collection === 'stateRules'\n ? behavior.stateRules[index]?.id\n : collection === 'valueRules'\n ? behavior.valueRules[index]?.id\n : collection === 'validationRules'\n ? behavior.validationRules[index]?.id\n : undefined\n return { ...item, message: `${field.label}:${item.message}`, tab, ruleId }\n}\n\nfunction diagnosticTab(path: string): DesignerFieldBehaviorDiagnostic['tab'] {\n if (path.includes('.valueRules')) return 'value'\n if (path.includes('.validationRules')) return 'validation'\n if (path.includes('.eventBindings') || path.startsWith('$.eventFlows')) return 'submit'\n return 'state'\n}\n\nfunction diagnostic(\n severity: DesignerDiagnosticSeverity,\n code: string,\n message: string,\n path: string,\n tab: DesignerFieldBehaviorDiagnostic['tab'],\n ruleId?: string,\n): DesignerFieldBehaviorDiagnostic {\n return { severity, code, message, path, tab, ruleId }\n}\n\nfunction deduplicateDiagnostics(\n diagnostics: DesignerFieldBehaviorDiagnostic[],\n): DesignerFieldBehaviorDiagnostic[] {\n const seen = new Set<string>()\n return diagnostics.filter((item) => {\n const key = `${item.severity}:${item.code}:${item.path}:${item.ruleId ?? ''}`\n if (seen.has(key)) return false\n seen.add(key)\n return true\n })\n}\n\nfunction createBehaviorId(prefix: string): string {\n return `${prefix}-${crypto.randomUUID().replaceAll('-', '')}`\n}\n\nfunction cloneValue<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n","import type { DesignerI18nConfiguration } from './types'\n\n/**\n * 按当前语言、默认语言和原文的固定顺序解释设计器国际化词条。\n *\n * 空翻译不会遮蔽后续回退值,未启用国际化时直接返回原文。\n */\nexport function resolveDesignerLocalizedText(\n configuration: DesignerI18nConfiguration,\n key: string,\n locale: string,\n fallback: string,\n): string {\n if (!configuration.enabled) return fallback\n const entry = configuration.entries.find((item) => item.key === key)\n if (!entry) return fallback\n const localized = entry.values[locale]?.trim()\n if (localized) return localized\n const defaultText = entry.values[configuration.defaultLocale]?.trim()\n return defaultText || fallback\n}\n\n/** 生成字段标签约定使用的稳定词条 key。 */\nexport function designerFieldLabelI18nKey(fieldKey: string): string {\n return `field_${sanitizeKeyPart(fieldKey)}_label`\n}\n\n/** 生成字段帮助文字约定使用的稳定词条 key。 */\nexport function designerFieldHelpI18nKey(fieldKey: string): string {\n return `field_${sanitizeKeyPart(fieldKey)}_help`\n}\n\n/** 生成动作栏按钮约定使用的稳定词条 key。 */\nexport function designerActionI18nKey(action: string): string {\n return `action_${sanitizeKeyPart(action.toLowerCase())}_label`\n}\n\n/** 生成弹层模块名称约定使用的稳定词条 key。 */\nexport function designerModuleI18nKey(moduleCode: string): string {\n return `module_${sanitizeKeyPart(moduleCode)}_name`\n}\n\nfunction sanitizeKeyPart(value: string): string {\n const normalized = value.replace(/[^A-Za-z0-9_]/g, '_')\n return /^[A-Za-z]/.test(normalized) ? normalized : `key_${normalized}`\n}\n","/** 数字字段格式化所需的受控配置。 */\nexport interface DesignerNumberFormatConfiguration {\n precision?: unknown\n currencyPrefix?: unknown\n thousandsSeparator?: unknown\n uppercaseRmb?: unknown\n}\n\n/**\n * 将数字字段值格式化为设计、只读与详情共用的展示文本。\n *\n * @param value 原始数字值。\n * @param configuration 数字组件的受控格式配置。\n * @returns 包含精度、千分位、货币前缀和可选人民币大写的展示文本。\n */\nexport function formatDesignerNumber(\n value: number,\n configuration: DesignerNumberFormatConfiguration,\n): string {\n if (!Number.isFinite(value)) return '—'\n const precision = resolveDesignerNumberPrecision(configuration)\n const displayValue = Number(value.toFixed(precision))\n const formatted =\n configuration.thousandsSeparator === true\n ? displayValue.toLocaleString('zh-CN', {\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n })\n : displayValue.toFixed(precision)\n const configuredCurrency =\n typeof configuration.currencyPrefix === 'string' ? configuration.currencyPrefix : ''\n const prefix = DESIGNER_CURRENCY_SYMBOLS[configuredCurrency] ?? configuredCurrency\n const uppercase =\n configuration.uppercaseRmb === true ? `(${formatDesignerRmbUppercase(displayValue)})` : ''\n return `${prefix}${formatted}${uppercase}`\n}\n\n/**\n * 解析数字输入与展示共同使用的有效精度。\n *\n * @param configuration 数字组件的受控格式配置。\n * @returns 0~10 之间的整数;人民币大写只影响附加文本,不改变字段输入和主显示精度。\n */\nexport function resolveDesignerNumberPrecision(\n configuration: DesignerNumberFormatConfiguration,\n): number {\n return normalizePrecision(configuration.precision)\n}\n\n/**\n * 将数字转换为人民币大写文本。\n *\n * @param value 待转换金额。\n * @returns 人民币大写文本;超出受控范围时返回明确说明。\n */\nexport function formatDesignerRmbUppercase(value: number): string {\n if (!Number.isFinite(value) || Math.abs(value) > 9999999999999.99) return '超出大写金额范围'\n const negative = value < 0 ? '负' : ''\n const totalFen = Math.round(Math.abs(value) * 100)\n const integer = Math.floor(totalFen / 100)\n const jiao = Math.floor((totalFen % 100) / 10)\n const fen = totalFen % 10\n const integerText = integer === 0 ? '零' : formatRmbInteger(integer)\n if (jiao === 0 && fen === 0) return `${negative}${integerText}元整`\n const fractionText = `${jiao > 0 ? `${RMB_DIGITS[jiao]}角` : integer > 0 && fen > 0 ? '零' : ''}${\n fen > 0 ? `${RMB_DIGITS[fen]}分` : ''\n }`\n return `${negative}${integerText}元${fractionText}`\n}\n\nconst RMB_DIGITS = '零壹贰叁肆伍陆柒捌玖'\nconst RMB_GROUP_UNITS = ['', '万', '亿', '兆']\nconst RMB_POSITION_UNITS = ['', '拾', '佰', '仟']\nconst DESIGNER_CURRENCY_SYMBOLS: Record<string, string> = {\n CNY: '¥',\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n HKD: 'HK$',\n TWD: 'NT$',\n}\n\n/**\n * 将非负整数转换为人民币整数部分。\n *\n * @param value 非负整数。\n * @returns 不包含“元”的人民币整数文本。\n */\nfunction formatRmbInteger(value: number): string {\n const groups: number[] = []\n let remaining = value\n while (remaining > 0) {\n groups.push(remaining % 10000)\n remaining = Math.floor(remaining / 10000)\n }\n let result = ''\n let pendingZero = false\n for (let index = groups.length - 1; index >= 0; index -= 1) {\n const group = groups[index] ?? 0\n if (group === 0) {\n if (result) pendingZero = true\n continue\n }\n if (result && (pendingZero || group < 1000)) result += RMB_DIGITS[0]\n result += `${formatRmbGroup(group)}${RMB_GROUP_UNITS[index] ?? ''}`\n pendingZero = false\n }\n return result\n}\n\n/**\n * 格式化单个四位人民币数字分组。\n *\n * @param value 0~9999 的整数。\n * @returns 分组内的大写文本。\n */\nfunction formatRmbGroup(value: number): string {\n let result = ''\n let pendingZero = false\n for (let position = 3; position >= 0; position -= 1) {\n const digit = Math.floor(value / 10 ** position) % 10\n if (digit === 0) {\n if (result) pendingZero = true\n continue\n }\n if (pendingZero) result += RMB_DIGITS[0]\n result += `${RMB_DIGITS[digit]}${RMB_POSITION_UNITS[position]}`\n pendingZero = false\n }\n return result\n}\n\n/**\n * 规范化受控的小数精度。\n *\n * @param value 原始配置值。\n * @returns 0~10 之间的整数精度。\n */\nfunction normalizePrecision(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return 0\n return Math.max(0, Math.min(10, Math.trunc(value)))\n}\n","import { createDesignerId } from './designer-document'\nimport type {\n DesignerDocument,\n DesignerLayoutNode,\n DesignerOverlayMaxHeightPreset,\n DesignerOverlayModule,\n} from './types'\n\n/** 主体视图使用的稳定内部编码。 */\nexport const DESIGNER_MAIN_VIEW_CODE = 'main'\n\nconst DESIGNER_OVERLAY_MAX_HEIGHTS: Readonly<Record<DesignerOverlayMaxHeightPreset, string>> = {\n COMPACT: '60vh',\n STANDARD: '72vh',\n SPACIOUS: '84vh',\n VIEWPORT: 'calc(100vh - var(--daxiang-form-space-4) * 2)',\n}\n\n/** 将稳定高度档位解析为公共弹窗能够消费的 CSS 最大高度。 */\nexport function resolveDesignerOverlayMaxHeight(preset: DesignerOverlayMaxHeightPreset): string {\n return DESIGNER_OVERLAY_MAX_HEIGHTS[preset]\n}\n\n/** 创建一个空弹层模块。 */\nexport function createDesignerOverlayModule(\n document: DesignerDocument,\n kind: DesignerOverlayModule['kind'],\n): DesignerOverlayModule {\n const serial = nextModuleSerial(document)\n return {\n id: createDesignerId('module'),\n code: `module_${serial}`,\n name: kind === 'DIALOG' ? `弹窗${serial}` : `抽屉${serial}`,\n kind,\n dataContext: 'FORM_DRAFT',\n width: kind === 'DIALOG' ? 720 : 480,\n radius: 'THEME',\n maxHeightPreset: 'VIEWPORT',\n root: [],\n }\n}\n\n/** 复制模块及其视图节点;字段身份继续复用,节点身份全部重新生成。 */\nexport function duplicateDesignerOverlayModule(\n document: DesignerDocument,\n moduleCode: string,\n): DesignerOverlayModule | undefined {\n const source = document.uiSchema.overlays.find((module) => module.code === moduleCode)\n if (!source) return undefined\n const copy = cloneValue(source)\n const serial = nextModuleSerial(document)\n copy.id = createDesignerId('module')\n copy.code = `module_${serial}`\n copy.name = `${source.name}副本`\n regenerateNodeIds(copy.root)\n document.uiSchema.overlays.push(copy)\n return copy\n}\n\n/** 删除弹层模块;字段定义和其他视图保持不变。 */\nexport function removeDesignerOverlayModule(\n document: DesignerDocument,\n moduleCode: string,\n): boolean {\n const index = document.uiSchema.overlays.findIndex((module) => module.code === moduleCode)\n if (index < 0) return false\n document.uiSchema.overlays.splice(index, 1)\n for (const flow of document.eventFlows) removeModuleActions(flow.steps, moduleCode)\n return true\n}\n\n/** 返回主体或指定模块的布局根节点。 */\nexport function resolveDesignerViewRoot(\n document: DesignerDocument,\n viewCode: string,\n): DesignerLayoutNode[] {\n return viewCode === DESIGNER_MAIN_VIEW_CODE\n ? document.uiSchema.root\n : (document.uiSchema.overlays.find((module) => module.code === viewCode)?.root ??\n document.uiSchema.root)\n}\n\n/**\n * 在指定视图上下文中复用现有根布局算法。\n *\n * mutation 完成后始终恢复主表 root 引用,防止模块视图意外替换主体。\n */\nexport function mutateDesignerView(\n document: DesignerDocument,\n viewCode: string,\n mutation: (document: DesignerDocument) => void,\n): void {\n if (viewCode === DESIGNER_MAIN_VIEW_CODE) {\n mutation(document)\n return\n }\n const module = document.uiSchema.overlays.find((item) => item.code === viewCode)\n if (!module) return\n const mainRoot = document.uiSchema.root\n document.uiSchema.root = module.root\n try {\n mutation(document)\n module.root = document.uiSchema.root\n } finally {\n document.uiSchema.root = mainRoot\n }\n}\n\nfunction nextModuleSerial(document: DesignerDocument): number {\n const used = new Set(\n document.uiSchema.overlays\n .map((module) => /^module_(\\d+)$/.exec(module.code)?.[1])\n .filter(Boolean)\n .map(Number),\n )\n let serial = 1\n while (used.has(serial)) serial += 1\n return serial\n}\n\nfunction regenerateNodeIds(nodes: DesignerLayoutNode[]): void {\n for (const node of nodes) {\n node.id = createDesignerId('node')\n if (node.nodeType === 'CONTAINER') {\n for (const slot of node.slots) {\n slot.id = createDesignerId('slot')\n regenerateNodeIds(slot.children)\n }\n }\n }\n}\n\nfunction removeModuleActions(\n nodes: import('./types').DesignerEventStep[],\n moduleCode: string,\n): void {\n for (let index = nodes.length - 1; index >= 0; index -= 1) {\n const step = nodes[index]!\n if (\n step.stepType === 'ACTION' &&\n ['OPEN_MODULE', 'CONFIRM_MODULE', 'CANCEL_MODULE'].includes(step.actionType) &&\n step.configuration.moduleCode === moduleCode\n ) {\n nodes.splice(index, 1)\n continue\n }\n if (step.stepType === 'CONDITION') {\n step.branches.forEach((branch) => removeModuleActions(branch.steps, moduleCode))\n removeModuleActions(step.elseSteps, moduleCode)\n }\n }\n}\n\nfunction cloneValue<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n","import type {\n DesignerDocument,\n DesignerLayoutNode,\n DesignerResolvedFieldState,\n DesignerRuntimeValueStore,\n DesignerSubmissionProjection,\n} from './types'\n\n/**\n * 根据表单策略、字段覆盖和最终运行状态生成提交投影。\n *\n * 技术隐藏字段始终保留;其他字段的 EXCLUDE 优先于全局策略。该函数只返回新对象,不修改预览值仓库。\n */\nexport function projectDesignerSubmission(\n document: DesignerDocument,\n valueStore: DesignerRuntimeValueStore,\n fieldStates: Record<string, DesignerResolvedFieldState>,\n options: { dirtyOverlayModuleIds?: string[] } = {},\n): DesignerSubmissionProjection {\n if ((options.dirtyOverlayModuleIds?.length ?? 0) > 0) {\n throw new Error('仍有未确认的弹层模块草稿,不能提交表单')\n }\n const excludedFieldIds: string[] = []\n const includedFieldIds = new Set<string>()\n for (const field of document.dataSchema.fields) {\n const technicalHidden = field.componentType === 'hidden'\n const state = fieldStates[field.id]\n const hidden = state ? !state.visible : field.display.hidden\n const behavior = field.behavior.submitBehavior\n const excluded = technicalHidden\n ? false\n : behavior === 'EXCLUDE' ||\n (behavior !== 'INCLUDE' && document.submitPolicy.ignoreHiddenFields && hidden)\n if (excluded) excludedFieldIds.push(field.id)\n else includedFieldIds.add(field.id)\n }\n const fields = Object.fromEntries(\n Object.entries(valueStore.fields)\n .filter(([fieldId]) => includedFieldIds.has(fieldId))\n .map(([fieldId, value]) => [fieldId, cloneValue(value)]),\n )\n const collectionFieldIds = collectCollectionFieldIds(document.uiSchema.root)\n for (const overlay of document.uiSchema.overlays) {\n mergeCollectionFieldIds(collectionFieldIds, collectCollectionFieldIds(overlay.root))\n }\n const collections = Object.fromEntries(\n Object.entries(valueStore.collections).map(([containerId, rows]) => {\n const allowed = collectionFieldIds.get(containerId) ?? includedFieldIds\n return [\n containerId,\n rows.map((row) => ({\n rowId: row.rowId,\n values: Object.fromEntries(\n Object.entries(row.values)\n .filter(([fieldId]) => allowed.has(fieldId) && includedFieldIds.has(fieldId))\n .map(([fieldId, value]) => [fieldId, cloneValue(value)]),\n ),\n })),\n ]\n }),\n )\n return { fields, collections, excludedFieldIds }\n}\n\nfunction collectCollectionFieldIds(nodes: DesignerLayoutNode[]): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>()\n const visit = (children: DesignerLayoutNode[]): void => {\n for (const node of children) {\n if (node.nodeType !== 'CONTAINER') continue\n if (['row-subtable', 'block-subtable'].includes(node.componentType)) {\n const fieldIds = new Set<string>()\n for (const slot of node.slots) {\n for (const child of slot.children) {\n if (child.nodeType === 'FIELD') fieldIds.add(child.fieldId)\n }\n }\n result.set(node.id, fieldIds)\n continue\n }\n node.slots.forEach((slot) => visit(slot.children))\n }\n }\n visit(nodes)\n return result\n}\n\nfunction mergeCollectionFieldIds(\n target: Map<string, Set<string>>,\n source: Map<string, Set<string>>,\n): void {\n for (const [containerId, fieldIds] of source) target.set(containerId, fieldIds)\n}\n\nfunction cloneValue<T>(value: T): T {\n if (value === undefined || value === null) return value\n if (typeof globalThis.structuredClone === 'function') {\n try {\n return globalThis.structuredClone(value)\n } catch {\n // 文件句柄等宿主对象无法结构化克隆时使用保守递归策略。\n }\n }\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T\n if (typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n cloneValue(item),\n ]),\n ) as T\n }\n return value\n}\n","import type {\n DesignerContainerNode,\n DesignerField,\n DesignerSubtableColumn,\n DesignerSubtableRow,\n} from './types'\n\n/** 子表栅格可选区域;序号列和操作列必须与数据列一起生成同一模板。 */\nexport interface DesignerSubtableGridOptions {\n showIndex?: boolean\n showActions?: boolean\n indexWidth?: number\n actionWidth?: number\n}\n\n/** 子表表头、编辑行和详情行共用的 CSS Grid 布局结果。 */\nexport interface DesignerSubtableGridLayout {\n template: string\n minimumWidth: string\n}\n\n/** 子表列投影的设计态与运行态可见性选项。 */\nexport interface DesignerSubtableProjectionOptions {\n /** 设计态可保留历史隐藏字段以便用户修复;运行态必须保持关闭。 */\n includeHidden?: boolean\n}\n\n/**\n * 将容器的命名插槽投影为稳定子表列。\n *\n * 只有字段节点可以形成数据列;布局节点由 DropPolicy 拒绝,历史异常节点在投影阶段失败关闭,\n * 不会被伪装为可编辑文本列。缺失字段仍保留列身份并标记为失效,方便设计态定位问题。\n *\n * @param container 子表容器节点。\n * @param fields 文档中的本地字段集合。\n * @param slotCode 可选命名插槽;省略时使用首个插槽。\n * @param options 设计态或运行态的可见性选项。\n * @returns 不持有可变节点引用的稳定列投影。\n */\nexport function projectDesignerSubtableColumns(\n container: DesignerContainerNode,\n fields: readonly DesignerField[],\n slotCode?: string,\n options: DesignerSubtableProjectionOptions = {},\n): DesignerSubtableColumn[] {\n if (container.slots.length !== 1 || container.slots[0]?.slotCode !== 'content') return []\n const slot = slotCode\n ? container.slots.find((item) => item.slotCode === slotCode)\n : container.slots[0]\n const fieldMap = new Map(fields.map((field) => [field.id, field]))\n const columnFieldIds = new Set<string>()\n\n for (const node of slot?.children ?? []) {\n if (node.nodeType !== 'FIELD' || columnFieldIds.has(node.fieldId)) return []\n columnFieldIds.add(node.fieldId)\n }\n\n return (slot?.children ?? []).flatMap((node) => {\n if (node.nodeType !== 'FIELD') return []\n const field = fieldMap.get(node.fieldId)\n if (!options.includeHidden && (field?.display.hidden || field?.componentType === 'hidden'))\n return []\n return [\n {\n columnId: node.id,\n fieldId: node.fieldId,\n fieldKey: field?.key ?? node.fieldId,\n label: field?.label ?? '失效字段',\n componentType: field?.componentType ?? 'unknown',\n semanticType: field?.semanticType ?? 'STRING',\n },\n ]\n })\n}\n\n/**\n * 为子表所有呈现模式生成同一个列模板和最小宽度。\n *\n * @param columns 稳定列投影。\n * @param options 序号列、操作列及其宽度配置。\n * @returns 可直接绑定到表格滚动内容和每一行的布局参数。\n */\nexport function createDesignerSubtableGridLayout(\n columns: readonly DesignerSubtableColumn[],\n options: DesignerSubtableGridOptions = {},\n): DesignerSubtableGridLayout {\n const indexWidth = normalizeFixedWidth(options.indexWidth, 56)\n const actionWidth = normalizeFixedWidth(options.actionWidth, 120)\n const dataTracks = columns.map((column) => `minmax(${columnMinimumWidth(column)}px, 1fr)`)\n const tracks = [\n ...(options.showIndex ? [`${indexWidth}px`] : []),\n ...dataTracks,\n ...(options.showActions ? [`${actionWidth}px`] : []),\n ]\n const minimumWidth =\n (options.showIndex ? indexWidth : 0) +\n columns.reduce((total, column) => total + columnMinimumWidth(column), 0) +\n (options.showActions ? actionWidth : 0)\n\n return {\n template: tracks.length > 0 ? tracks.join(' ') : 'minmax(160px, 1fr)',\n minimumWidth: `${Math.max(minimumWidth, 160)}px`,\n }\n}\n\n/**\n * 按当前列结构创建一条只存在于预览副本中的空白子表行。\n *\n * @param columns 当前子表列投影。\n * @param seedValues 可选初始值;未声明列不会被擅自写入。\n * @returns 具有全新行身份和值容器的子表行。\n */\nexport function createDesignerSubtableRow(\n columns: readonly DesignerSubtableColumn[],\n seedValues: Readonly<Record<string, unknown>> = {},\n): DesignerSubtableRow {\n return {\n rowId: createRuntimeRowId(),\n values: Object.fromEntries(\n columns.map((column) => [column.fieldId, cloneRuntimeValue(seedValues[column.fieldId])]),\n ),\n }\n}\n\n/**\n * 深复制一条子表行并分配新身份,避免复制后的字段值与源行共享可变引用。\n *\n * @param source 源子表行。\n * @returns 可独立编辑的新子表行。\n */\nexport function cloneDesignerSubtableRow(source: DesignerSubtableRow): DesignerSubtableRow {\n return {\n rowId: createRuntimeRowId(),\n values: cloneRuntimeValue(source.values) as Record<string, unknown>,\n }\n}\n\n/** 根据控件的实际输入宽度给出列下限,避免日期范围、文件等控件被过度压缩。 */\nfunction columnMinimumWidth(column: DesignerSubtableColumn): number {\n if (\n ['date-range', 'date-multiple', 'file', 'signature', 'rich-text'].includes(column.componentType)\n ) {\n return 220\n }\n if (['LONG_TEXT', 'ARRAY', 'OBJECT'].includes(column.semanticType)) return 200\n if (['DATE', 'DATE_TIME'].includes(column.semanticType)) return 180\n return 160\n}\n\n/** 固定列宽仅接受合理正数,避免异常配置破坏整个表格投影。 */\nfunction normalizeFixedWidth(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback\n}\n\n/** 生成仅用于当前浏览器预览会话的稳定行身份。 */\nfunction createRuntimeRowId(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') return globalThis.crypto.randomUUID()\n return `row-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\n}\n\n/** 优先使用浏览器结构化克隆;无法克隆的宿主对象保留引用,避免破坏文件等本地值。 */\nfunction cloneRuntimeValue<T>(value: T): T {\n if (value === undefined || value === null) return value\n if (typeof globalThis.structuredClone === 'function') {\n try {\n return globalThis.structuredClone(value)\n } catch {\n // 文件句柄等宿主对象可能无法结构化克隆,继续使用保守递归策略。\n }\n }\n if (Array.isArray(value)) return value.map((item) => cloneRuntimeValue(item)) as T\n if (value instanceof Date) return new Date(value.getTime()) as T\n if (Object.getPrototypeOf(value) === Object.prototype) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n cloneRuntimeValue(item),\n ]),\n ) as T\n }\n return value\n}\n"],"names":["DESIGNER_SPACING_PRESETS","numberOptions","value","spacingName","DESIGNER_FONT_SIZE_PRESETS","DESIGNER_PAGE_SIZE_PRESETS","DESIGNER_INITIAL_COUNT_PRESETS","DESIGNER_LENGTH_PRESETS","DESIGNER_SELECTION_COUNT_PRESETS","DESIGNER_OPTIONAL_SELECTION_COUNT_PRESETS","DESIGNER_FILE_SIZE_PRESETS","DESIGNER_TIMEOUT_PRESETS","DESIGNER_PC_SPAN_PRESETS","DESIGNER_MOBILE_SPAN_PRESETS","DESIGNER_CURRENCY_PRESETS","DESIGNER_FILE_TYPE_OPTIONS","extension","designerDateFormatOptions","sourceValue","includeDesignerCurrentOption","options","current","formatCurrent","primitive","option","values","labeler","TEXT_OPTIONS","property","presetNumberEditor","STATIC_OPTIONS","DIRECTORY_OPTIONS","selectOptions","configuration","CONDITIONAL_REASON","CONTAINER_APPEARANCE_PROPERTIES","DESIGNER_COMPONENTS","container","unavailableContainer","field","defaultOptions","stepOptions","directoryField","item","referenceField","unavailableField","cascadeOptions","findDesignerComponent","componentType","compatibleDesignerComponents","semanticType","name","icon","group","defaultConfiguration","properties","defaultSpan","availability","unavailableReason","registration","compatibleTypes","extra","acceptsChildren","containerAppearance","configurationVersion","reason","source","key","label","section","editor","legacyPropertyEditor","type","shared","labels","index","minimum","maximum","previewDesignerQuickGrid","document","selectedNodeId","target","resolveTargetCollection","affectedNodeIds","skippedCount","node","applyDesignerQuickGrid","span","preview","ids","visit","nodes","slot","overlay","collectDesignerBatchDefaultFields","applyDesignerBatchDefaults","allowed","changed","cloneValue","root","parentLabel","found","GRID_COLUMNS","projectDesignerCanvas","device","cells","gaps","row","cursor","grid","clampGridValue","offset","appendTrailingGap","start","resolveDesignerContainerAppearance","appearance","styleOverride","normalizedStyleOverride","radiusOverride","normalizedRadiusOverride","designerControlRadiusClass","radius","designerDialogRadiusClass","designerContainerAppearanceClasses","resolved","countDesignerSurfaceContainers","count","visitSurfaceContainers","applyDesignerContainerAppearanceInheritance","dimensions","selected","nodeChanged","visitor","MAX_EXPRESSION_DEPTH","MAX_EXPRESSION_NODES","evaluateDesignerExpression","expression","runtime","visited","evaluate","depth","argument","evaluateCall","evaluateDesignerCondition","collectDesignerExpressionFieldIds","result","diagnoseDesignerExpression","path","diagnostics","fieldIds","fieldsById","variableCodes","variable","nodePath","error","isRecord","unknownKeys","isLiteral","rootEntityCode","isDesignerExpressionFunction","validFunctionArgumentCount","resolveDesignerFieldEvaluationOrder","fieldsWithRules","byId","dependencies","fieldDependencies","rule","fieldId","orderedFields","visiting","trail","dependency","comparable","isEmpty","numeric","divisor","allowedKeys","code","message","createDesignerFieldFeedbackKey","context","projectDesignerFieldFeedback","results","warning","resolveDesignerFieldState","state","stateTargetValue","applyDesignerValueRules","valueStore","failures","phase","dirtyFieldIds","shouldExecuteValueRule","nextValue","currentValue","writeDecision","allowsValueRuleWrite","valuesEqual","applyDesignerCurrentRowValueRules","rowValues","entityCode","confirmationAdapter","left","right","validateDesignerField","trigger","failure","validateRule","isSafeDesignerRegularExpression","pattern","length","valueLength","finiteNumber","number","scale","decimalPlaces","text","format","timestamp","files","maximumCount","maximumSizeMb","file","size","accept","matchesAcceptedFile","targetFieldId","operator","compare","rows","minimumRows","maximumRows","provider","validatorId","dot","mimeType","DEFAULT_DESIGNER_ACTION_BAR","DEFAULT_DESIGNER_SUBMIT_POLICY","createDefaultDesignerFieldBehavior","normalizeDesignerAdvancedDocument","uiSchema","dataSchema","rawField","migrateLegacyValidation","behavior","valueRule","diagnoseDesignerAdvancedDocument","diagnoseSubmitPolicy","diagnoseActionBar","diagnoseVariables","diagnoseDataSources","diagnoseI18n","diagnoseLegacyActions","hasFields","hasOverlays","diagnoseOverlays","diagnoseFieldBehaviors","diagnoseEventFlows","validation","finiteNumberOrUndefined","actionBar","button","codes","identifier","dataSource","diagnoseMappings","direction","mapping","itemPath","reference","adapterKey","referenceType","referenceCode","i18n","locale","keys","entry","entryLocale","action","flowCodes","flow","diagnoseStateRules","diagnoseValueRules","diagnoseValidationRules","defaultSupportedEvents","event","flowCode","allowCurrentRow","diagnoseValidationConfiguration","diagnoseFiniteRange","diagnoseIntegerRange","diagnoseIntegerAtLeast","diagnoseDateRange","collectNodes","minimumAllowed","minimumTime","maximumTime","moduleCodes","module","dataSourceCodes","roots","nodeMap","nodeIds","currentRowNodeIds","collectCurrentRowNodeIds","diagnoseEventSteps","references","step","eventActionType","diagnoseEventActionConfiguration","branch","branchIndex","branchPath","requiredFieldReferences","insideSubtable","currentInsideSubtable","DESIGNER_IDENTIFIER_PATTERN","SUBTABLE_COMPONENT_TYPES","createLocalDesignerDataSchema","createProtocolId","normalizeDesignerDataModel","schema","rawSchema","relations","validRelations","isOneToManyRelation","relation","isDataEntity","relationCodes","entityCodes","relationSerial","walkNodes","configuredCode","relationCode","nextRelationCode","childCode","nextChildEntityCode","relationTitle","child","prepareDesignerDataModel","initialDataModel","cloneDocument","emptySourceMetadata","diagnoseInitialDataModel","canInitialize","applyInitialDataModel","sourceMetadata","buildSourceMetadataIndex","ensureDesignerSubtableRelation","existing","nextRelationSerial","duplicateDesignerSubtableRelation","copy","sourceCode","sourceRelation","resolveDesignerTargetEntityCode","containerId","findNode","designerFieldScopeDropRejection","targetContainerId","targetEntityCode","collectPlacedRelationCodes","findSubtableNodeByRelationCode","placeDesignerDataField","isFieldPlaced","content","updateDesignerRootEntity","patch","nextCode","previousCode","updateDesignerRelation","currentCode","nextChildCode","previousRelationCode","previousChildCode","diagnoseDesignerDataModel","pushUnknownProperties","diagnoseEntity","relationIds","entityIds","rawRelation","diagnoseLayoutDataScopes","initial","toDataEntity","createInitialFields","entity","createInitialField","cloneRecord","defaultValueFor","initialEntities","dataEntity","initialField","initialRelation","isPlainRecord","isInitialEntityShape","diagnoseInitialEntity","isInitialRelationShape","parentFieldIds","childFieldIds","keyMappings","mappingIndex","mappingPath","fieldCodes","fieldPath","relationUsage","slotIndex","used","serial","rootCode","nodeId","prefix","random","DESIGNER_DOCUMENT_VERSION","DEFAULT_APPEARANCE","SURFACE_CONTAINER_COMPONENT_TYPES","createEmptyDesignerDocument","documentId","deepClone","createDemoDesignerDocument","samples","created","createNodeFromComponent","overrides","createContainerNode","createDesignerField","createFieldNode","insertDesignerNode","locateNode","detachedDesignerNodeDropRejection","collection","resolveDropCollection","positionDesignerNodeAtColumn","moveDesignerNode","located","designerNodeDropRejection","targetCollection","targetIndex","canMoveDesignerNode","nodeContainsContainer","designerComponentDropRejection","targetRejection","dropTargetRejection","targetContainerDropRejection","sourceNode","nodeSubtreeDepth","removeDesignerNode","removeNodeFromCollection","restoreDesignerFieldNode","createDesignerRelationContainer","alreadyPlaced","findRelationContainer","generateDesignerDataModelLayout","request","createdNodeIds","skippedFieldIds","selection","deleteUnplacedDesignerField","collectPlacedFieldIds","duplicateDesignerNode","cloneNodeWithFields","findDesignerNode","createDesignerOutline","fields","project","containerLabel","synchronizeContainerSlots","configured","normalizeOptions","createDesignerId","decodeDesignerDocument","diagnostic","normalized","normalizeDesignerDocument","diagnoseDesignerDocumentInternal","diagnoseDesignerDocument","diagnoseUnknownProperties","diagnoseAppearance","fieldKeys","fieldMap","scopedFieldKey","diagnoseFieldBinding","hasConfiguration","display","diagnoseFieldDisplay","diagnoseFieldValidation","diagnoseComponentConfiguration","diagnoseNodes","cloneDesignerDocument","serializeDesignerDocument","nextFieldSerial","defaultShowLabel","createResponsiveGrid","createDefaultSlots","pcSpan","showLabel","columnStart","nodeIndex","desiredStart","previous","previousSpan","previousOffset","findContainerSlot","slotCode","uniqueFieldKey","preferred","findNodeDepth","seenNodes","rawNode","diagnoseGrid","slots","slotCodes","slotIds","rawSlot","slotPath","columnFieldIds","childIndex","rawChild","childPath","childField","sourceKind","sourceComponentType","sourceHidden","sourceSubtreeDepth","sourceEntityCode","targetDepth","targetRegistration","definitions","definition","diagnosePropertyValue","diagnoseInferredConfigurationValue","diagnoseRelatedConfigurationValues","nullable","pushConfigurationTypeDiagnostic","isHttpsUrl","optionValue","diagnoseConfigurationOptions","diagnoseOrderedConfigurationPair","minimumSelections","maximumSelections","isFiniteNumber","minimumKey","maximumKey","minimumLabel","maximumLabel","seen","expected","layout","rawGrid","validSpan","validOffset","title","severity","normalizeDesignerAppearance","normalizeSurfaceContainerConfigurations","MAX_EVENT_DEPTH","MAX_EVENT_STEPS","executeDesignerEventFlow","host","activeFlowIds","executeSteps","steps","executeAction","requiredText","assignFieldValue","resolveActionValue","sourceFieldId","readFieldValue","variableCode","messageLevel","adapter","resolveDataSource","output","resolveMappedInput","input","VALIDATION_META","resolveDesignerValidationCatalog","capabilities","supported","isCollectionField","hasSubtable","requiresRemoteAdapter","createDesignerStateRule","createBehaviorId","defaultCondition","createDesignerValueRule","mode","createDesignerValidationRule","sequence","base","createValidationConfiguration","summarizeDesignerStateRule","summarizeDesignerValueRule","summarizeDesignerValidationRule","status","diagnoseDesignerFieldBehaviorDraft","fieldIndex","toFieldDiagnostic","appendDuplicateRuleNames","appendCapabilityDiagnostics","deduplicateDiagnostics","resolveDesignerEventActionAvailability","comparisonField","candidate","subtableId","findFirstSubtableId","findSubtableInNodes","nested","firstByName","boundCodes","visitEventSteps","tab","diagnosticTab","indexMatch","ruleId","resolveDesignerLocalizedText","fallback","localized","designerFieldLabelI18nKey","fieldKey","sanitizeKeyPart","designerFieldHelpI18nKey","designerActionI18nKey","designerModuleI18nKey","moduleCode","formatDesignerNumber","precision","resolveDesignerNumberPrecision","displayValue","formatted","configuredCurrency","DESIGNER_CURRENCY_SYMBOLS","uppercase","formatDesignerRmbUppercase","normalizePrecision","negative","totalFen","integer","jiao","fen","integerText","formatRmbInteger","fractionText","RMB_DIGITS","RMB_GROUP_UNITS","RMB_POSITION_UNITS","groups","remaining","pendingZero","formatRmbGroup","position","digit","DESIGNER_MAIN_VIEW_CODE","DESIGNER_OVERLAY_MAX_HEIGHTS","resolveDesignerOverlayMaxHeight","preset","createDesignerOverlayModule","kind","nextModuleSerial","duplicateDesignerOverlayModule","regenerateNodeIds","removeDesignerOverlayModule","removeModuleActions","resolveDesignerViewRoot","viewCode","mutateDesignerView","mutation","mainRoot","projectDesignerSubmission","fieldStates","excludedFieldIds","includedFieldIds","technicalHidden","hidden","collectionFieldIds","collectCollectionFieldIds","mergeCollectionFieldIds","collections","children","projectDesignerSubtableColumns","createDesignerSubtableGridLayout","columns","indexWidth","normalizeFixedWidth","actionWidth","dataTracks","column","columnMinimumWidth","tracks","minimumWidth","total","createDesignerSubtableRow","seedValues","createRuntimeRowId","cloneRuntimeValue","cloneDesignerSubtableRow"],"mappings":"AAGO,MAAMA,KAA2BC;AAAA,EAAc,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EAAG,CAACC,MACpFA,MAAU,IAAI,eAAe,GAAGC,GAAYD,CAAK,CAAC,MAAMA,CAAK;AAC/D,GAGaE,KAA6BH;AAAA,EACxC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EACvC,CAACC,MAAU,GAAGA,CAAK;AACrB,GAGaG,KAA6BJ;AAAA,EACxC,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG;AAAA,EACnB,CAACC,MAAU,GAAGA,CAAK;AACrB,GAGaI,KAAiCL;AAAA,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AAAA,EAAG,CAACC,MACpFA,MAAU,IAAI,QAAQ,GAAGA,CAAK;AAChC,GAGaK,KAA0BN;AAAA,EACrC,CAAC,IAAI,KAAK,KAAK,KAAK,KAAM,KAAM,KAAM,GAAK;AAAA,EAC3C,CAACC,MAAU,GAAGA,CAAK;AACrB,GAGaM,IAAmCP;AAAA,EAC9C,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG;AAAA,EACzB,CAACC,MAAU,GAAGA,CAAK;AACrB,GAGaO,KAAsE;AAAA,EACjF,EAAE,OAAO,MAAM,OAAO,EAAA;AAAA,EACtB,GAAGD;AACL,GAGaE,KAA6BT;AAAA,EACxC,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI;AAAA,EACtC,CAACC,MAAU,GAAGA,CAAK;AACrB,GAGaS,KAA2BV;AAAA,EAAc,CAAC,KAAM,KAAM,KAAO,KAAO,GAAK;AAAA,EAAG,CAACC,MACxFA,IAAQ,MAAQ,GAAGA,IAAQ,GAAI,OAAO;AACxC,GAGaU,KAAqD;AAAA,EAChE,EAAE,OAAO,cAAc,OAAO,EAAA;AAAA,EAC9B,EAAE,OAAO,cAAc,OAAO,EAAA;AAAA,EAC9B,EAAE,OAAO,eAAe,OAAO,GAAA;AAAA,EAC/B,EAAE,OAAO,eAAe,OAAO,GAAA;AAAA,EAC/B,EAAE,OAAO,eAAe,OAAO,GAAA;AAAA,EAC/B,EAAE,OAAO,cAAc,OAAO,GAAA;AAChC,GAGaC,KAAyD;AAAA,EACpE,EAAE,OAAO,cAAc,OAAO,GAAA;AAAA,EAC9B,EAAE,OAAO,cAAc,OAAO,GAAA;AAChC,GAGaC,KAAsD;AAAA,EACjE,EAAE,OAAO,OAAO,OAAO,GAAA;AAAA,EACvB,EAAE,OAAO,aAAa,OAAO,MAAA;AAAA,EAC7B,EAAE,OAAO,YAAY,OAAO,MAAA;AAAA,EAC5B,EAAE,OAAO,YAAY,OAAO,MAAA;AAAA,EAC5B,EAAE,OAAO,YAAY,OAAO,MAAA;AAAA,EAC5B,EAAE,OAAO,YAAY,OAAO,MAAA;AAAA,EAC5B,EAAE,OAAO,YAAY,OAAO,MAAA;AAAA,EAC5B,EAAE,OAAO,aAAa,OAAO,MAAA;AAC/B,GAGaC,KAIR;AAAA,EACH,EAAE,OAAO,MAAM,YAAY,CAAC,QAAQ,SAAS,QAAQ,QAAQ,OAAO,GAAG,OAAO,GAAA;AAAA,EAC9E,EAAE,OAAO,MAAM,YAAY,CAAC,QAAQ,SAAS,QAAQ,MAAM,GAAG,OAAO,GAAA;AAAA,EACrE,EAAE,OAAO,MAAM,YAAY,CAAC,QAAQ,SAAS,MAAM,GAAG,OAAO,GAAA;AAAA,EAC7D,EAAE,OAAO,MAAM,YAAY,CAAC,QAAQ,OAAO,GAAG,OAAO,GAAA;AAAA,EACrD,EAAE,OAAO,OAAO,YAAY,CAAC,MAAM,GAAG,OAAO,GAAA;AAAA,EAC7C,EAAE,OAAO,OAAO,YAAY,CAAC,QAAQ,QAAQ,KAAK,GAAG,OAAO,GAAA;AAAA,EAC5D,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,IAAI,CAACC,OAAe,EAAE,OAAOA,EAAU,eAAe,YAAY,CAACA,CAAS,GAAG,OAAO,KAAQ;AAClG;AAQO,SAASC,GAA0BC,GAAgD;AACxF,SAAIA,MAAgB,cAAcA,MAAgB,aACzC;AAAA,IACL,EAAE,OAAO,aAAa,OAAO,mBAAA;AAAA,IAC7B,EAAE,OAAO,eAAe,OAAO,sBAAA;AAAA,IAC/B,EAAE,OAAO,aAAa,OAAO,mBAAA;AAAA,EAAmB,IAGhDA,MAAgB,UACX;AAAA,IACL,EAAE,OAAO,OAAO,OAAO,UAAA;AAAA,IACvB,EAAE,OAAO,OAAO,OAAO,UAAA;AAAA,IACvB,EAAE,OAAO,MAAM,OAAO,WAAA;AAAA,EAAW,IAGjCA,MAAgB,SAAe,CAAC,EAAE,OAAO,MAAM,OAAO,QAAQ,IAC3D;AAAA,IACL,EAAE,OAAO,SAAS,OAAO,aAAA;AAAA,IACzB,EAAE,OAAO,SAAS,OAAO,aAAA;AAAA,IACzB,EAAE,OAAO,OAAO,OAAO,cAAA;AAAA,EAAc;AAEzC;AAUO,SAASC,GACdC,GACAC,GACAC,IAA8D,CAACpB,MAAU,OAAOA,CAAK,GAC3D;AAC1B,MAAI,CAAC,CAAC,UAAU,UAAU,SAAS,EAAE,SAAS,OAAOmB,CAAO,EAAG,QAAO,CAAC,GAAGD,CAAO;AACjF,QAAMG,IAAYF;AAClB,SAAID,EAAQ,KAAK,CAACI,MAAWA,EAAO,UAAUD,CAAS,IAAU,CAAC,GAAGH,CAAO,IACrE,CAAC,EAAE,OAAO,SAASE,EAAcC,CAAS,CAAC,IAAI,OAAOA,EAAA,GAAa,GAAGH,CAAO;AACtF;AASO,SAASnB,EACdwB,GACAC,GAC0B;AAC1B,SAAOD,EAAO,IAAI,CAACvB,OAAW,EAAE,OAAAA,GAAO,OAAOwB,EAAQxB,CAAK,EAAA,EAAI;AACjE;AAEA,SAASC,GAAYD,GAAuB;AAC1C,SAAIA,KAAS,IAAU,QACnBA,KAAS,IAAU,OACnBA,KAAS,KAAW,OACpBA,KAAS,KAAW,OACjB;AACT;ACjKA,MAAMyB,KAA6C;AAAA,EACjDC,EAAS,eAAe,QAAQ,SAAS,MAAM;AAAA,EAC/CA,EAAS,aAAa,QAAQ,WAAW,SAAS;AAAA,EAClDA,EAAS,aAAa,QAAQ,QAAQC,EAAmBtB,IAAyB,GAAG,GAAK,CAAC;AAC7F,GACMuB,KAA+C;AAAA,EACnDF,EAAS,WAAW,MAAM,QAAQ,SAAS;AAAA,EAC3CA,EAAS,eAAe,QAAQ,SAAS,MAAM;AAAA,EAC/CA,EAAS,aAAa,QAAQ,WAAW,SAAS;AACpD,GACMG,KAAkD;AAAA,EACtDH,EAAS,iBAAiB,QAAQ,QAAQ,UAAU;AAAA,IAClD,SAASI,EAAc,CAAC,UAAU,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,EAAA,CAC5D;AAAA,EACDJ;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACAC,EAAmBrB,GAAkC,GAAG,KAAK;AAAA,MAC3D,aAAa,CAACyB,MAAkBA,EAAc,kBAAkB;AAAA,IAAA,CACjE;AAAA,EAAA;AAAA,EAEHL,EAAS,cAAc,QAAQ,WAAW,MAAM;AAAA,EAChDA,EAAS,SAAS,QAAQ,cAAc,UAAU;AAAA,IAChD,SAASI,EAAc,CAAC,kBAAkB,sBAAsB,GAAG,CAAC,QAAQ,MAAM,CAAC;AAAA,EAAA,CACpF;AACH,GACME,IACJ,+CACIC,KAAgE;AAAA,EACpEP,EAAS,gBAAgB,QAAQ,WAAW;AAAA,IAC1C,MAAM;AAAA,IACN,SAAS;AAAA,MACP,GAAGI;AAAA,QACD,CAAC,WAAW,QAAQ,YAAY,QAAQ;AAAA,QACxC,CAAC,QAAQ,KAAK,MAAM,IAAI;AAAA,MAAA;AAAA,MAE1B,EAAE,OAAO,WAAW,OAAO,UAAU,UAAU,GAAA;AAAA,IAAK;AAAA,EACtD,CACD;AAAA,EACDJ,EAAS,iBAAiB,QAAQ,WAAW;AAAA,IAC3C,MAAM;AAAA,IACN,SAASI;AAAA,MACP,CAAC,WAAW,SAAS,QAAQ,SAAS,QAAQ,OAAO;AAAA,MACrD,CAAC,QAAQ,QAAQ,MAAM,KAAK,MAAM,GAAG;AAAA,IAAA;AAAA,EACvC,CACD;AACH,GAGaI,KAAgE,OAAO,OAAO;AAAA,EACzFC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,SAAS;AAAA,MACT,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACET,EAAS,SAAS,QAAQ,SAAS,MAAM;AAAA,MACzCA,EAAS,eAAe,QAAQ,WAAW,SAAS;AAAA,MACpDA,EAAS,oBAAoB,QAAQ,WAAW;AAAA,QAC9C,MAAM;AAAA,QACN,aAAa,CAACK,MAAkBA,EAAc,gBAAgB;AAAA,MAAA,CAC/D;AAAA,MACDL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAACC,MAAU,GAAGA,CAAK,IAAI;AAAA,UACnD;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEF0B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmB7B,IAA0B,GAAG,IAAI,EAAE,MAAM,MAAM;AAAA,MAAA;AAAA,IACpE;AAAA,EACF;AAAA,EAEFqC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,MAAM,CAAC,SAAS,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,eAAe;AAAA,IAAA;AAAA,IAEjB;AAAA,MACET,EAAS,YAAY,QAAQ,WAAW,UAAU;AAAA,QAChD,SAASI,EAAc,CAAC,IAAI,QAAQ,aAAa,GAAG,CAAC,MAAM,MAAM,MAAM,CAAC;AAAA,MAAA,CACzE;AAAA,MACDJ,EAAS,QAAQ,OAAO,QAAQ,SAAS;AAAA,IAAA;AAAA,EAC3C;AAAA,EAEFS;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,aAAa;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,eAAe;AAAA,IAAA;AAAA,IAEjB;AAAA,MACET,EAAS,SAAS,QAAQ,SAAS,MAAM;AAAA,MACzCA,EAAS,eAAe,SAAS,cAAc,SAAS;AAAA,MACxDA,EAAS,eAAe,SAAS,cAAc,SAAS;AAAA,MACxDA,EAAS,aAAa,SAAS,cAAc,SAAS;AAAA,MACtDA,EAAS,aAAa,QAAQ,WAAW,SAAS;AAAA,MAClDA,EAAS,cAAc,QAAQ,WAAW,SAAS;AAAA,MACnDA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBxB,IAA4B,GAAG,KAAK;AAAA,UACrD,aAAa,CAAC4B,MAAkBA,EAAc,eAAe;AAAA,QAAA,CAC9D;AAAA,MAAA;AAAA,MAEHL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBvB,IAAgC,GAAG,EAAE;AAAA,MAAA;AAAA,IAC1D;AAAA,IAEF;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF+B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,eAAe;AAAA,IAAA;AAAA,IAEjB;AAAA,MACET,EAAS,SAAS,QAAQ,SAAS,MAAM;AAAA,MACzCA,EAAS,eAAe,QAAQ,cAAc,SAAS;AAAA,MACvDA,EAAS,eAAe,QAAQ,cAAc,SAAS;AAAA,MACvDA,EAAS,aAAa,QAAQ,cAAc,SAAS;AAAA,MACrDA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBvB,IAAgC,GAAG,EAAE;AAAA,MAAA;AAAA,MAE1DsB,EAAS,gBAAgB,QAAQ,WAAW,UAAU;AAAA,QACpD,SAASI,EAAc,CAAC,UAAU,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CAC1D;AAAA,IAAA;AAAA,IAEH;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,IAAA;AAAA,IAET;AAAA,MACET,EAAS,QAAQ,QAAQ,SAAS,MAAM;AAAA,MACxCA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAACC,MAAU,IAAIA,CAAK,EAAE;AAAA,UACxD;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEF0B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBzB,IAA4B,IAAI,IAAI,EAAE,MAAM,MAAM;AAAA,MAAA;AAAA,MAEvEwB,EAAS,aAAa,QAAQ,WAAW,OAAO;AAAA,MAChDA,EAAS,cAAc,MAAM,WAAW,UAAU;AAAA,QAChD,SAASI;AAAA,UACP,CAAC,UAAU,UAAU,YAAY,MAAM;AAAA,UACvC,CAAC,MAAM,MAAM,MAAM,IAAI;AAAA,QAAA;AAAA,MACzB,CACD;AAAA,MACDJ,EAAS,SAAS,MAAM,WAAW,UAAU;AAAA,QAC3C,SAASI,EAAc,CAAC,QAAQ,UAAU,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,MAAA,CACpE;AAAA,IAAA;AAAA,EACH;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,MAAM,IAAI,UAAU,QAAQ,aAAa,QAAA;AAAA,IAC3C;AAAA,MACET,EAAS,QAAQ,QAAQ,SAAS,MAAM;AAAA,MACxCA,EAAS,YAAY,QAAQ,WAAW,UAAU;AAAA,QAChD,SAASI,EAAc,CAAC,QAAQ,UAAU,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,MAAA,CACpE;AAAA,MACDJ,EAAS,eAAe,QAAQ,WAAW,UAAU;AAAA,QACnD,SAASI,EAAc,CAAC,SAAS,UAAU,QAAQ,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,MAAA,CACzE;AAAA,IAAA;AAAA,EACH;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,OAAO,QAAQ,MAAM,QAAQ,QAAQ,SAAS,UAAU,IAAM,UAAU,GAAA;AAAA,IAC1E;AAAA,MACET,EAAS,SAAS,QAAQ,SAAS,UAAU;AAAA,MAC7CA,EAAS,QAAQ,QAAQ,WAAW,UAAU;AAAA,QAC5C,SAASI;AAAA,UACP,CAAC,WAAW,WAAW,QAAQ,OAAO;AAAA,UACtC,CAAC,MAAM,MAAM,MAAM,IAAI;AAAA,QAAA;AAAA,MACzB,CACD;AAAA,MACDJ,EAAS,UAAU,QAAQ,WAAW,UAAU;AAAA,QAC9C,SAASI,EAAc,CAAC,SAAS,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CACvD;AAAA,MACDJ,EAAS,YAAY,QAAQ,WAAW,SAAS;AAAA,MACjDA,EAAS,YAAY,QAAQ,cAAc,SAAS;AAAA,IAAA;AAAA,EACtD;AAAA,EAEFS;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,IAAA;AAAA,IAET;AAAA,MACET,EAAS,QAAQ,QAAQ,SAAS,MAAM;AAAA,MACxCA,EAAS,cAAc,QAAQ,WAAW,UAAU;AAAA,QAClD,SAASI;AAAA,UACP,CAAC,WAAW,WAAW,WAAW,UAAU,MAAM;AAAA,UAClD,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,QAAA;AAAA,MAC/B,CACD;AAAA,MACDJ,EAAS,SAAS,QAAQ,WAAW,SAAS;AAAA,MAC9CA,EAAS,SAAS,QAAQ,WAAW,SAAS;AAAA,MAC9CA,EAAS,YAAY,MAAM,cAAc,SAAS;AAAA,MAClDA,EAAS,SAAS,MAAM,WAAW,UAAU;AAAA,QAC3C,SAASI,EAAc,CAAC,QAAQ,UAAU,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,MAAA,CACpE;AAAA,IAAA;AAAA,EACH;AAAA,EAEFM;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEFD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc;AAAA,IAAA;AAAA,IAEhB;AAAA,MACET,EAAS,SAAS,SAAS,SAAS,MAAM;AAAA,MAC1CA,EAAS,OAAO,YAAY,QAAQ,EAAE,MAAM,OAAO,WAAW,MAAM;AAAA,MACpEA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAM,IAAI,GAAG,CAACC,MAAU,GAAGA,CAAK,KAAK;AAAA,UAClF;AAAA,UACA;AAAA,UACA,EAAE,MAAM,KAAA;AAAA,QAAK;AAAA,MACf;AAAA,MAEF0B,EAAS,cAAc,UAAU,cAAc,SAAS;AAAA,MACxDA,EAAS,eAAe,QAAQ,cAAc,SAAS;AAAA,MACvDA,EAAS,gBAAgB,QAAQ,cAAc,SAAS;AAAA,IAAA;AAAA,IAE1D;AAAA,IACA;AAAA,EAAA;AAAA,EAGFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER;AAAA,MACE,GAAGZ;AAAA,MACHC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmB,CAAC,EAAE,OAAO,OAAO,OAAO,EAAA,GAAK,GAAGtB,EAAuB,GAAG,GAAG,GAAK;AAAA,MAAA;AAAA,MAEvFqB,EAAS,UAAU,MAAM,WAAW,MAAM;AAAA,MAC1CA,EAAS,UAAU,MAAM,WAAW,MAAM;AAAA,MAC1CA,EAAS,QAAQ,UAAU,QAAQ,SAAS;AAAA,IAAA;AAAA,EAC9C;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,aAAa,OAAO,MAAM,GAAG,UAAU,IAAO,eAAe,IAAM,WAAW,IAAA;AAAA,IAChF;AAAA,MACE,GAAGZ;AAAA,MACHC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,CAACC,MAAU,GAAGA,CAAK,IAAI;AAAA,UACzE;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEF0B,EAAS,YAAY,QAAQ,WAAW,SAAS;AAAA,MACjDA,EAAS,iBAAiB,QAAQ,WAAW,SAAS;AAAA,IAAA;AAAA,IAExD;AAAA,EAAA;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,SAASC,EAAA,GAAkB,WAAW,IAAM,YAAY,IAAM,aAAa,MAAA;AAAA,IAC7E,CAAC,GAAGV,IAAgBF,EAAS,cAAc,QAAQ,WAAW,SAAS,CAAC;AAAA,EAAA;AAAA,EAE1EW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASC,EAAA;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,GAAGV;AAAA,MACHF,EAAS,cAAc,QAAQ,WAAW,SAAS;AAAA,MACnDA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBpB,IAA2C,GAAG,GAAG;AAAA,MAAA;AAAA,MAEtEmB,EAAS,gBAAgB,QAAQ,WAAW,SAAS;AAAA,IAAA;AAAA,EACvD;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASC,EAAA;AAAA,MACT,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,IAAA;AAAA,IAErB;AAAA,MACEZ,EAAS,WAAW,MAAM,QAAQ,SAAS;AAAA,MAC3CA,EAAS,eAAe,MAAM,WAAW,UAAU;AAAA,QACjD,SAASI,EAAc,CAAC,WAAW,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CAC3D;AAAA,MACDJ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE,CAAC,EAAE,OAAO,OAAO,OAAO,EAAA,GAAK,GAAGrB,CAAgC;AAAA,UAChE;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEFoB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBpB,IAA2C,GAAG,GAAG;AAAA,MAAA;AAAA,IACtE;AAAA,EACF;AAAA,EAEF8B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,SAASC,EAAA,GAAkB,aAAa,WAAW,WAAW,GAAA;AAAA,IAChE;AAAA,MACEZ,EAAS,WAAW,MAAM,QAAQ,SAAS;AAAA,MAC3CA,EAAS,eAAe,MAAM,WAAW,UAAU;AAAA,QACjD,SAASI,EAAc,CAAC,WAAW,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CAC3D;AAAA,MACDJ,EAAS,aAAa,QAAQ,WAAW,SAAS;AAAA,IAAA;AAAA,EACpD;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,UAAU,QAAQ,QAAQ,cAAc,WAAW,IAAM,YAAY,GAAA;AAAA,IACvE;AAAA,MACEX,EAAS,YAAY,QAAQ,QAAQ,UAAU;AAAA,QAC7C,SAASI;AAAA,UACP,CAAC,QAAQ,YAAY,SAAS,MAAM;AAAA,UACpC,CAAC,MAAM,QAAQ,MAAM,IAAI;AAAA,QAAA;AAAA,MAC3B,CACD;AAAA,MACDJ,EAAS,UAAU,QAAQ,WAAW,EAAE,MAAM,eAAe,WAAW,YAAY;AAAA,MACpFA,EAAS,aAAa,QAAQ,WAAW,SAAS;AAAA,MAClDA,EAAS,cAAc,UAAU,QAAQ,SAAS;AAAA,IAAA;AAAA,EACpD;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,kBAAkB,aAAa,UAAU,IAAO,UAAU,UAAA;AAAA,IAC5D;AAAA,MACEX,EAAS,oBAAoB,QAAQ,QAAQ,UAAU;AAAA,QACrD,SAASI,EAAc,CAAC,aAAa,WAAW,GAAG,CAAC,OAAO,KAAK,CAAC;AAAA,MAAA,CAClE;AAAA,MACDJ,EAAS,YAAY,QAAQ,WAAW,SAAS;AAAA,MACjDA,EAAS,YAAY,QAAQ,WAAW,UAAU;AAAA,QAChD,SAASI,EAAc,CAAC,WAAW,QAAQ,GAAG,CAAC,OAAO,KAAK,CAAC;AAAA,QAC5D,aAAa,CAACC,MAAkBA,EAAc,aAAa;AAAA,MAAA,CAC5D;AAAA,IAAA;AAAA,IAEH;AAAA,IACA;AAAA,IACAC;AAAA,EAAA;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,uBAAuB;AAAA,MACvB,gBAAgB;AAAA,IAAA;AAAA,IAElB;AAAA,MACEX;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBrB,GAAkC,GAAG,GAAG;AAAA,MAAA;AAAA,MAE7DoB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBnB,IAA4B,GAAG,MAAM,EAAE,MAAM,MAAM;AAAA,MAAA;AAAA,MAExEkB,EAAS,UAAU,UAAU,QAAQ;AAAA,QACnC,MAAM;AAAA,QACN,mBAAmB;AAAA,MAAA,CACpB;AAAA,MACDA,EAAS,eAAe,QAAQ,WAAW,UAAU;AAAA,QACnD,SAASI,EAAc,CAAC,UAAU,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CACxD;AAAA,MACDJ,EAAS,yBAAyB,UAAU,cAAc,SAAS;AAAA,MACnEA,EAAS,kBAAkB,QAAQ,cAAc;AAAA,QAC/C,MAAM;AAAA,QACN,cAAc;AAAA,QACd,mBAAmB;AAAA,MAAA,CACpB;AAAA,IAAA;AAAA,IAEH;AAAA,EAAA;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,cAAc;AAAA,IAAA;AAAA,IAEhB;AAAA,MACEX,EAAS,WAAW,OAAO,QAAQ,QAAQ;AAAA,MAC3CA,EAAS,WAAW,OAAO,QAAQ,QAAQ;AAAA,MAC3CA,EAAS,QAAQ,MAAM,QAAQ,UAAU,EAAE,SAAS,GAAG;AAAA,MACvDA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,CAACC,MAAU,GAAGA,CAAK,IAAI;AAAA,UACzE;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEF0B,EAAS,YAAY,UAAU,WAAW,SAAS;AAAA,MACnDA,EAAS,oBAAoB,QAAQ,WAAW,UAAU;AAAA,QACxD,SAASI,EAAc,CAAC,WAAW,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,QACzD,aAAa,CAACC,MAAkBA,EAAc,aAAa;AAAA,MAAA,CAC5D;AAAA,MACDL,EAAS,kBAAkB,MAAM,WAAW;AAAA,QAC1C,MAAM;AAAA,QACN,SAASd;AAAA,QACT,mBAAmB;AAAA,MAAA,CACpB;AAAA,MACDc,EAAS,sBAAsB,OAAO,WAAW,SAAS;AAAA,MAC1DA,EAAS,gBAAgB,SAAS,WAAW,SAAS;AAAA,IAAA;AAAA,EACxD;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,IAAA;AAAA,IAEjB;AAAA,MACEX,EAAS,cAAc,QAAQ,WAAW,MAAM;AAAA,MAChDA,EAAS,gBAAgB,QAAQ,WAAW,MAAM;AAAA,MAClDA,EAAS,eAAe,QAAQ,WAAW,OAAO;AAAA,MAClDA,EAAS,iBAAiB,QAAQ,WAAW,OAAO;AAAA,IAAA;AAAA,EACtD;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,KAAK,GAAG,WAAW,IAAO,UAAU,GAAA;AAAA,IACtC;AAAA,MACEX;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,CAACC,MAAU,GAAGA,CAAK,IAAI;AAAA,UACxD;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEF0B,EAAS,aAAa,QAAQ,QAAQ,SAAS;AAAA,MAC/CA,EAAS,YAAY,QAAQ,WAAW,SAAS;AAAA,IAAA;AAAA,EACnD;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASE,GAAA;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,iBAAiB;AAAA,IAAA;AAAA,IAEnB;AAAA,MACEb,EAAS,WAAW,MAAM,QAAQ,SAAS;AAAA,MAC3CA,EAAS,aAAa,MAAM,WAAW,UAAU;AAAA,QAC/C,SAASI,EAAc,CAAC,cAAc,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CAChE;AAAA,MACDJ,EAAS,UAAU,QAAQ,WAAW,SAAS;AAAA,MAC/CA,EAAS,mBAAmB,QAAQ,WAAW,SAAS;AAAA,IAAA;AAAA,IAE1D;AAAA,EAAA;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,WAAW,KAAK,WAAW,KAAK,eAAe,YAAY,aAAa,GAAA;AAAA,IAC1E;AAAA,MACEX;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAI,GAAG,CAACC,MAAU,GAAGA,CAAK,KAAK;AAAA,UACtF;AAAA,UACA;AAAA,UACA,EAAE,MAAM,KAAA;AAAA,QAAK;AAAA,MACf;AAAA,MAEF0B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B;AAAA,YACE,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAM,MAAM,IAAI;AAAA,YACzD,CAACC,MAAU,GAAGA,CAAK;AAAA,UAAA;AAAA,UAErB;AAAA,UACA;AAAA,UACA,EAAE,MAAM,KAAA;AAAA,QAAK;AAAA,MACf;AAAA,MAEF0B,EAAS,iBAAiB,OAAO,cAAc,UAAU;AAAA,QACvD,SAASI,EAAc,CAAC,SAAS,YAAY,MAAM,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,MAAA,CACzE;AAAA,MACDJ,EAAS,eAAe,QAAQ,cAAc,SAAS;AAAA,IAAA;AAAA,IAEzD;AAAA,EAAA;AAAA,EAEFW,EAAM,UAAU,QAAQ,mBAAmB,SAAS,UAAU,EAAE,QAAQ,MAAQ;AAAA,IAC9EX,EAAS,UAAU,QAAQ,QAAQ,SAAS;AAAA,EAAA,CAC7C;AAAA,EAEDc,GAAe,QAAQ,MAAM,cAAc;AAAA,EAC3CA,GAAe,QAAQ,MAAM,eAAe;AAAA,EAC5CA,GAAe,gBAAgB,MAAM,yBAAyB;AAAA,IAC5Dd,EAAS,WAAW,QAAQ,WAAW,SAAS;AAAA,EAAA,CACjD;AAAA,EACDc,GAAe,QAAQ,MAAM,mBAAmB;AAAA,EAChDH;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,eAAe,UAAU,eAAe,IAAI,YAAY,QAAQ,gBAAgB,GAAC;AAAA,IACnF;AAAA,MACE,GAAGR,GAAkB,OAAO,CAACY,MAASA,EAAK,QAAQ,OAAO;AAAA,MAC1Df,EAAS,kBAAkB,OAAO,QAAQ,SAAS;AAAA,IAAA;AAAA,IAErD;AAAA,IACA;AAAA,IACAM;AAAA,EAAA;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,IAAA;AAAA,IAElB;AAAA,MACEX,EAAS,aAAa,QAAQ,QAAQ,UAAU;AAAA,QAC9C,SAASI,EAAc,CAAC,QAAQ,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,MAAA,CAC5D;AAAA,MACDJ,EAAS,UAAU,QAAQ,WAAW,EAAE,MAAM,eAAe,WAAW,aAAa;AAAA,MACrFA,EAAS,aAAa,OAAO,WAAW;AAAA,QACtC,MAAM;AAAA,QACN,SAASI,EAAc,CAAC,KAAK,KAAK,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,QACvD,mBAAmB;AAAA,MAAA,CACpB;AAAA,MACDJ,EAAS,qBAAqB,QAAQ,cAAc,SAAS;AAAA,MAC7DA,EAAS,kBAAkB,QAAQ,cAAc,UAAU;AAAA,QACzD,SAASI,EAAc,CAAC,OAAO,QAAQ,QAAQ,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC;AAAA,QACnE,aAAa,CAACC,MAAkBA,EAAc,sBAAsB;AAAA,MAAA,CACrE;AAAA,IAAA;AAAA,EACH;AAAA,EAEFM;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,cAAc,mBAAmB,GAAA;AAAA,IAC3C;AAAA,MACEX,EAAS,UAAU,QAAQ,WAAW,EAAE,MAAM,eAAe,WAAW,YAAY;AAAA,MACpFA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBrB,GAAkC,GAAG,GAAG;AAAA,MAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEF+B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,WAAW,GAAG,UAAU,WAAW,6BAA6B,GAAA;AAAA,IAClE;AAAA,MACEX;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,CAACC,MAAU,GAAGA,CAAK,KAAK;AAAA,UAClE;AAAA,UACA;AAAA,UACA;AAAA,YACE,MAAM;AAAA,UAAA;AAAA,QACR;AAAA,MACF;AAAA,MAEF0B,EAAS,YAAY,QAAQ,WAAW,OAAO;AAAA,MAC/CA,EAAS,+BAA+B,YAAY,cAAc,SAAS;AAAA,IAAA;AAAA,IAE7E;AAAA,EAAA;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,sBAAsB;AAAA,IAAA;AAAA,IAExB;AAAA,MACEX,EAAS,QAAQ,QAAQ,QAAQ,UAAU;AAAA,QACzC,SAASI,EAAc,CAAC,WAAW,aAAa,UAAU,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC;AAAA,MAAA,CACnF;AAAA,MACDJ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,CAACC,MAAU,GAAGA,CAAK,IAAI;AAAA,UACjE;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEF0B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBtB,IAAyB,GAAG,GAAK;AAAA,MAAA;AAAA,MAEtDqB,EAAS,mBAAmB,QAAQ,QAAQ,SAAS;AAAA,MACrDA,EAAS,qBAAqB,QAAQ,QAAQ,SAAS;AAAA,IAAA;AAAA,IAEzD;AAAA,EAAA;AAAA,EAEFgB,GAAe,qBAAqB,QAAQ,eAAe;AAAA,EAC3DL;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe;AAAA,MACf,UAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc;AAAA,MACd,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACEX,EAAS,iBAAiB,UAAU,QAAQ,SAAS;AAAA,MACrDA,EAAS,YAAY,QAAQ,QAAQ,SAAS;AAAA,MAC9CA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,UACE5B,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAACC,MAAU,GAAGA,CAAK,IAAI;AAAA,UACtD;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,MAEF0B,EAAS,gBAAgB,UAAU,WAAW,SAAS;AAAA,MACvDA,EAAS,aAAa,SAAS,WAAW;AAAA,QACxC,MAAM;AAAA,QACN,SAASI,EAAc,CAAC,OAAO,OAAO,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,QAC7D,mBAAmB;AAAA,QACnB,aAAa,CAACC,MAAkBA,EAAc,iBAAiB;AAAA,MAAA,CAChE;AAAA,IAAA;AAAA,IAEH;AAAA,IACA;AAAA,IACAC;AAAA,EAAA;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,eAAe,IAAI,eAAe,IAAO,UAAU,GAAA;AAAA,IACrD;AAAA,MACEX,EAAS,iBAAiB,QAAQ,QAAQ;AAAA,QACxC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,mBAAmB;AAAA,MAAA,CACpB;AAAA,MACDA,EAAS,iBAAiB,SAAS,QAAQ,SAAS;AAAA,MACpDA,EAAS,YAAY,QAAQ,QAAQ,SAAS;AAAA,IAAA;AAAA,IAEhD;AAAA,IACA;AAAA,IACAM;AAAA,EAAA;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEFD,GAAe,kBAAkB,QAAQ,qBAAqB;AAAA,EAC9DL;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,kBAAkB,IAAM,mBAAmB,IAAM,aAAa,SAAS,SAAS,CAAC,SAAS,EAAA;AAAA,IAC5F;AAAA,MACEX,EAAS,oBAAoB,UAAU,cAAc,SAAS;AAAA,MAC9DA,EAAS,qBAAqB,UAAU,cAAc,SAAS;AAAA,MAC/DA,EAAS,eAAe,QAAQ,WAAW,UAAU;AAAA,QACnD,SAASI,EAAc,CAAC,SAAS,SAAS,QAAQ,GAAG,CAAC,OAAO,MAAM,IAAI,CAAC;AAAA,MAAA,CACzE;AAAA,IAAA;AAAA,IAEH;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEFO;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,iBAAiB,iBAAiB,gBAAgB,IAAM,oBAAoB,GAAA;AAAA,IAC9E;AAAA,MACEX,EAAS,mBAAmB,QAAQ,cAAc,UAAU;AAAA,QAC1D,SAASI;AAAA,UACP,CAAC,iBAAiB,WAAW,aAAa,oBAAoB,SAAS;AAAA,UACvE,CAAC,QAAQ,OAAO,OAAO,QAAQ,IAAI;AAAA,QAAA;AAAA,MACrC,CACD;AAAA,MACDJ,EAAS,kBAAkB,QAAQ,QAAQ,SAAS;AAAA,MACpDA,EAAS,sBAAsB,UAAU,cAAc,SAAS;AAAA,IAAA;AAAA,IAElE;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEFW;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,oBAAoB,IAAM,SAAS,IAAA;AAAA,IACrC;AAAA,MACEX,EAAS,sBAAsB,SAAS,cAAc,SAAS;AAAA,MAC/DA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBlB,IAA0B,KAAM,KAAO,EAAE,MAAM,KAAK;AAAA,MAAA;AAAA,IACzE;AAAA,IAEF;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAGF4B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,SAASC,EAAA,GAAkB,UAAU,IAAO,eAAe,IAAI,WAAW,GAAA;AAAA,IAC5E;AAAA,MACEZ,EAAS,WAAW,UAAU,QAAQ,SAAS;AAAA,MAC/CA,EAAS,YAAY,QAAQ,QAAQ,SAAS;AAAA,MAC9CA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBrB,GAAkC,GAAG,KAAK;AAAA,UAC3D,aAAa,CAACyB,MAAkBA,EAAc,aAAa;AAAA,QAAA,CAC5D;AAAA,MAAA;AAAA,MAEHL,EAAS,aAAa,QAAQ,WAAW,SAAS;AAAA,IAAA;AAAA,IAEpD;AAAA,IACA;AAAA,IACAM;AAAA,EAAA;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASO,GAAA;AAAA,MACT,UAAU;AAAA,MACV,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACElB,EAAS,WAAW,UAAU,QAAQ,SAAS;AAAA,MAC/CA,EAAS,YAAY,QAAQ,QAAQ,SAAS;AAAA,MAC9CA,EAAS,iBAAiB,SAAS,QAAQ,SAAS;AAAA,MACpDA,EAAS,iBAAiB,UAAU,WAAW,SAAS;AAAA,MACxDA,EAAS,aAAa,SAAS,WAAW;AAAA,QACxC,MAAM;AAAA,QACN,SAASI,EAAc,CAAC,OAAO,OAAO,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,QAC7D,mBAAmB;AAAA,QACnB,aAAa,CAACC,MAAkBA,EAAc,kBAAkB;AAAA,MAAA,CACjE;AAAA,IAAA;AAAA,IAEH;AAAA,IACA;AAAA,IACAC;AAAA,EAAA;AAAA,EAEFK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASC,EAAA;AAAA,MACT,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,IAEd;AAAA,MACEZ,EAAS,WAAW,UAAU,QAAQ,SAAS;AAAA,MAC/CA,EAAS,iBAAiB,QAAQ,QAAQ,UAAU;AAAA,QAClD,SAASI,EAAc,CAAC,UAAU,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CAC5D;AAAA,MACDJ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBrB,GAAkC,GAAG,KAAK;AAAA,UAC3D,aAAa,CAACyB,MAAkBA,EAAc,kBAAkB;AAAA,QAAA,CACjE;AAAA,MAAA;AAAA,MAEHL,EAAS,cAAc,QAAQ,WAAW,MAAM;AAAA,IAAA;AAAA,IAElD;AAAA,IACA;AAAA,IACAM;AAAA,EAAA;AAEJ,CAAC;AAED,IAAIE,GAAoB,WAAW;AACjC,QAAM,IAAI,MAAM,0BAA0BA,GAAoB,MAAM,IAAI;AAInE,SAASW,EACdC,GAC2C;AAC3C,SAAOZ,GAAoB,KAAK,CAACO,MAASA,EAAK,kBAAkBK,CAAa;AAChF;AAGO,SAASC,GACdC,GACiC;AACjC,SAAOd,GAAoB;AAAA,IACzB,CAACO,MAASA,EAAK,aAAa,WAAWA,EAAK,wBAAwB,SAASO,CAAY;AAAA,EAAA;AAE7F;AAEA,SAASX,EACPS,GACAG,GACAC,GACAC,GACAH,GACAI,GACAC,GACAC,IAAc,IACdC,IAA8D,aAC9DC,IAAoB,IACW;AAC/B,SAAOC,GAAa;AAAA,IAClB,eAAAX;AAAA,IACA,MAAAG;AAAA,IACA,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,UAAU;AAAA,IACV,cAAAH;AAAA,IACA,yBAAyBU,GAAgBV,CAAY;AAAA,IACrD,sBAAAI;AAAA,IACA,aAAAE;AAAA,IACA,kBAAkBR,MAAkB,WAAWA,MAAkB;AAAA,IACjE,mBAAmBA,MAAkB,UAAU,SAAS;AAAA,IACxD,qBAAqB;AAAA,IACrB,cAAAS;AAAA,IACA,mBAAAC;AAAA,IACA,iBAAiB;AAAA,IACjB,iBAAiB,CAAC,UAAU,QAAQ,OAAO;AAAA,IAC3C,YAAAH;AAAA,EAAA,CACD;AACH;AAEA,SAASb,GACPM,GACAG,GACAC,GACAS,IAAsC,CAAA,GACP;AAC/B,SAAOtB;AAAA,IACLS;AAAA,IACAG;AAAA,IACAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe;AAAA,MACf,eAAe;AAAA,MACf,OAAO;AAAA,MACP,YAAY,KAAKD,CAAI;AAAA,IAAA;AAAA,IAEvB,CAAC,GAAGpB,IAAmB,GAAG8B,CAAK;AAAA,IAC/B;AAAA,IACA;AAAA,IACA3B;AAAA,EAAA;AAEJ;AAEA,SAASU,GACPI,GACAG,GACAC,GAC+B;AAC/B,SAAOb;AAAA,IACLS;AAAA,IACAG;AAAA,IACAC;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,eAAe,UAAU,eAAe,IAAI,UAAU,IAAI,YAAY,KAAKD,CAAI,GAAA;AAAA,IACjF;AAAA,MACEvB,EAAS,iBAAiB,QAAQ,QAAQ,UAAU;AAAA,QAClD,SAASI,EAAc,CAAC,UAAU,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC;AAAA,MAAA,CAC5D;AAAA,MACDJ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBrB,GAAkC,GAAG,KAAK;AAAA,UAC3D,aAAa,CAACyB,MAAkBA,EAAc,kBAAkB;AAAA,QAAA,CACjE;AAAA,MAAA;AAAA,MAEHL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAC,EAAmBxB,IAA4B,GAAG,GAAG;AAAA,MAAA;AAAA,MAEvDuB,EAAS,cAAc,QAAQ,WAAW,MAAM;AAAA,IAAA;AAAA,IAElD;AAAA,IACA;AAAA,IACAM;AAAA,EAAA;AAEJ;AAEA,SAASG,EACPW,GACAG,GACAC,GACAC,GACAS,GACAC,GACAT,GACAC,GACAE,IAA8D,aAC9DC,IAAoB,IACpBM,IAAuBD,MAAwB,YAAY,IAAI,GAChC;AAC/B,SAAOJ;AAAA,IACL;AAAA,MACE,eAAAX;AAAA,MACA,MAAAG;AAAA,MACA,MAAAC;AAAA,MACA,OAAAC;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,MACd,yBAAyB,CAAA;AAAA,MACzB,sBAAAC;AAAA,MACA,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,qBAAAS;AAAA,MACA,cAAAN;AAAA,MACA,mBAAAC;AAAA,MACA,iBAAAI;AAAA,MACA,iBAAiBd,MAAkB,WAAW,CAAC,OAAO,IAAI,CAAA;AAAA,MAC1D,YACEe,MAAwB,YACpB,CAAC,GAAG5B,IAAiC,GAAGoB,CAAU,IAClDA;AAAA,IAAA;AAAA,IAERS;AAAA,EAAA;AAEJ;AAEA,SAASnB,GACPG,GACAG,GACAC,GACAa,GAC+B;AAC/B,SAAO1B;AAAA,IACLS;AAAA,IACAG;AAAA,IACAC;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,UAAU,GAAA;AAAA,IACZ,CAAA;AAAA,IACA;AAAA,IACA;AAAA,IACAa;AAAA,EAAA;AAEJ;AAEA,SAAS3B,GACPU,GACAG,GACAC,GACAa,GAC+B;AAC/B,SAAO5B;AAAA,IACLW;AAAA,IACAG;AAAA,IACAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA;AAAA,IACAa;AAAA,EAAA;AAEJ;AAEA,SAASN,GACPO,GACAF,IAAuB,GACQ;AAC/B,SAAO,EAAE,GAAGE,GAAQ,sBAAAF,EAAA;AACtB;AAEA,SAASpC,EACPuC,GACAC,GACAC,GACAC,GACAT,IAA6B,IACD;AAC5B,SAAO;AAAA,IACL,KAAAM;AAAA,IACA,OAAAC;AAAA,IACA,SAAAC;AAAA,IACA,aAAaR,EAAM;AAAA,IACnB,QAAQ,OAAOS,KAAW,WAAWC,GAAqBD,GAAQT,CAAK,IAAIS;AAAA,EAAA;AAE/E;AAaA,SAASC,GACPC,GACAX,GACwB;AACxB,QAAMY,IAAS;AAAA,IACb,aAAaZ,EAAM;AAAA,IACnB,mBAAmB;AAAA,EAAA;AAErB,SAAIW,MAAS,SAAe,EAAE,MAAAA,GAAM,WAAWX,EAAM,WAAW,GAAGY,EAAA,IAC/DD,MAAS,aAAmB,EAAE,MAAAA,GAAM,WAAWX,EAAM,WAAW,GAAGY,EAAA,IACnED,MAAS,WACJ;AAAA,IACL,MAAAA;AAAA,IACA,SAASX,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAMA,EAAM;AAAA,IACZ,MAAMA,EAAM;AAAA,IACZ,GAAGY;AAAA,EAAA,IAGHD,MAAS,YAAYA,MAAS,cACzB,EAAE,MAAAA,GAAM,SAASX,EAAM,WAAW,CAAA,GAAI,GAAGY,GAAQ,mBAAmB,SAAA,IAEzED,MAAS,kBACJ;AAAA,IACL,MAAAA;AAAA,IACA,SAASX,EAAM,WAAW,CAAA;AAAA,IAC1B,SAASA,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAMA,EAAM;AAAA,IACZ,GAAGY;AAAA,EAAA,IAGHD,MAAS,gBAAsB,EAAE,MAAAA,GAAM,WAAW,YAAY,GAAGC,EAAA,IACjED,MAAS,uBACJ;AAAA,IACL,MAAAA;AAAA,IACA,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,GAAGC;AAAA,EAAA,IAGHD,MAAS,cAAoB,EAAE,MAAAA,GAAM,QAAQ,WAAW,GAAGC,EAAA,IAC3DD,MAAS,gBAAsB,EAAE,MAAAA,GAAM,SAAS,QAAQ,GAAGC,EAAA,IAC3DD,MAAS,QAAc,EAAE,MAAAA,GAAM,WAAWX,EAAM,WAAW,GAAGY,EAAA,IAC3D,EAAE,MAAAD,GAAM,GAAGC,EAAA;AACpB;AAEA,SAASzC,EACPP,GACAiD,GAC4D;AAC5D,SAAOjD,EAAO,IAAI,CAACvB,GAAOyE,OAAW,EAAE,OAAAzE,GAAO,OAAOwE,EAAOC,CAAK,KAAK,OAAOzE,CAAK,IAAI;AACxF;AAEA,SAAS2B,EACPT,GACAwD,GACAC,GACAhB,IAGI,CAAA,GACoB;AACxB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAAzC;AAAA,IACA,SAAAwD;AAAA,IACA,SAAAC;AAAA,IACA,MAAMhB,EAAM;AAAA,IACZ,aAAaA,EAAM;AAAA,IACnB,mBAAmB;AAAA,EAAA;AAEvB;AAEA,SAASrB,IAA0D;AACjE,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,OAAO,WAAA;AAAA,IACvB,EAAE,OAAO,OAAO,OAAO,WAAA;AAAA,IACvB,EAAE,OAAO,OAAO,OAAO,WAAA;AAAA,EAAW;AAEtC;AAEA,SAASC,KAAuD;AAC9D,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,OAAO,EAAA;AAAA,IACvB,EAAE,OAAO,OAAO,OAAO,EAAA;AAAA,IACvB,EAAE,OAAO,OAAO,OAAO,EAAA;AAAA,EAAE;AAE7B;AAEA,SAASK,KAIN;AACD,SAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,QACR,EAAE,OAAO,OAAO,OAAO,eAAA;AAAA,QACvB,EAAE,OAAO,OAAO,OAAO,eAAA;AAAA,MAAe;AAAA,IACxC;AAAA,EACF;AAEJ;AAEA,SAASc,GAAgBV,GAA4D;AACnF,SAAIA,MAAiB,WAAiB,CAAC,UAAU,WAAW,IACxDA,MAAiB,cAAoB,CAAC,aAAa,QAAQ,IAC3DA,MAAiB,WAAiB,CAAC,QAAQ,IAC3CA,MAAiB,YAAkB,CAAC,SAAS,IAC7CA,MAAiB,SAAe,CAAC,QAAQ,WAAW,IACpDA,MAAiB,cAAoB,CAAC,aAAa,MAAM,IACzDA,MAAiB,SAAe,CAAC,MAAM,IACvCA,MAAiB,cAAoB,CAAC,aAAa,UAAU,SAAS,QAAQ,IAC9EA,MAAiB,UAAgB,CAAC,SAAS,WAAW,IACnD,CAACA,CAAY;AACtB;AC35CO,SAAS4B,GACdC,GACAC,GAC0B;AAC1B,QAAMC,IAASC,GAAwBH,EAAS,SAAS,MAAMC,CAAc,GACvEG,IAA4B,CAAA;AAClC,MAAIC,IAAe;AACnB,aAAWC,KAAQJ,EAAO,OAAO;AAC/B,QAAII,EAAK,aAAa,WAAWA,EAAK,OAAO,GAAG,SAAS,IAAI;AAC3D,MAAAD,KAAgB;AAChB;AAAA,IACF;AACA,UAAM7C,IAAQwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,OAAO0C,EAAK,OAAO,GAC1E1B,IAAepB,IAAQQ,EAAsBR,EAAM,aAAa,IAAI;AAC1E,QACE,CAACA,KACD,CAACoB,KACDA,EAAa,UAAU,eACvBA,EAAa,UAAU,YACvB;AACA,MAAAyB,KAAgB;AAChB;AAAA,IACF;AACA,IAAAD,EAAgB,KAAKE,EAAK,EAAE;AAAA,EAC9B;AACA,SAAO,EAAE,aAAaJ,EAAO,OAAO,iBAAAE,GAAiB,cAAAC,EAAA;AACvD;AAGO,SAASE,GACdP,GACAC,GACAO,GACQ;AACR,QAAMC,IAAUV,GAAyBC,GAAUC,CAAc;AACjE,MAAIQ,EAAQ,gBAAgB,WAAW,EAAG,QAAO;AACjD,QAAMC,IAAM,IAAI,IAAID,EAAQ,eAAe,GACrCE,IAAQ,CAACC,MAAsC;AACnD,eAAWN,KAAQM;AACjB,MAAIF,EAAI,IAAIJ,EAAK,EAAE,MACjBA,EAAK,OAAO,KAAK,EAAE,GAAGA,EAAK,OAAO,IAAI,MAAAE,GAAM,QAAQ,EAAA,IAElDF,EAAK,aAAa,eAAaA,EAAK,MAAM,QAAQ,CAACO,MAASF,EAAME,EAAK,QAAQ,CAAC;AAAA,EAExF;AACA,SAAAF,EAAMX,EAAS,SAAS,IAAI,GAC5BA,EAAS,SAAS,SAAS,QAAQ,CAACc,MAAYH,EAAMG,EAAQ,IAAI,CAAC,GAC5DJ,EAAI;AACb;AAGO,SAASK,GAAkCf,GAA6C;AAC7F,SAAOA,EAAS,WAAW,OAAO,OAAO,CAACxC,MAAU;AAClD,QAAIA,EAAM,cAAcA,EAAM,eAAe,CAAC,QAAQ,QAAQ,EAAE,SAASA,EAAM,YAAY;AACzF,aAAO;AACT,UAAMoB,IAAeZ,EAAsBR,EAAM,aAAa;AAE9D,WADI,GAACoB,KAAgBA,EAAa,iBAAiB,eAC/CpB,EAAM,iBAAiB,eAAeoB,EAAa,UAAU;AAAA,EAEnE,CAAC;AACH;AAGO,SAASoC,GACdhB,GACAtD,GACQ;AACR,QAAMuE,IAAU,IAAI,IAAIF,GAAkCf,CAAQ,EAAE,IAAI,CAACxC,MAAUA,EAAM,EAAE,CAAC;AAC5F,MAAI0D,IAAU;AACd,aAAW1D,KAASwC,EAAS,WAAW;AACtC,IAAI,CAACiB,EAAQ,IAAIzD,EAAM,EAAE,KAAK,EAAEA,EAAM,MAAMd,OAC5Cc,EAAM,eAAe2D,GAAWzE,EAAOc,EAAM,EAAE,CAAC,GAChD0D,KAAW;AAEb,SAAOA;AACT;AAEA,SAASf,GACPiB,GACAnB,GACgD;AAChD,MAAI,CAACA,EAAgB,QAAO,EAAE,OAAOmB,GAAM,OAAO,QAAA;AAClD,QAAMT,IAAQ,CACZC,GACAS,MAC+D;AAC/D,eAAWf,KAAQM,GAAO;AACxB,UAAIN,EAAK,OAAOL,GAAgB;AAC9B,YAAIK,EAAK,aAAa,eAAeA,EAAK,MAAM,CAAC,GAAG;AAClD,gBAAM1B,IAAeZ,EAAsBsC,EAAK,aAAa;AAC7D,iBAAO,EAAE,OAAOA,EAAK,MAAM,CAAC,EAAE,UAAU,OAAO1B,GAAc,QAAQ,OAAA;AAAA,QACvE;AACA,eAAO,EAAE,OAAAgC,GAAO,OAAOS,EAAA;AAAA,MACzB;AACA,UAAIf,EAAK,aAAa,YAAa;AACnC,YAAM1B,IAAeZ,EAAsBsC,EAAK,aAAa;AAC7D,iBAAWO,KAAQP,EAAK,OAAO;AAC7B,cAAMgB,IAAQX,EAAME,EAAK,UAAU,GAAGjC,GAAc,QAAQ,IAAI,MAAMiC,EAAK,KAAK,EAAE;AAClF,YAAIS,EAAO,QAAOA;AAAA,MACpB;AAAA,IACF;AAAA,EAEF;AACA,SAAOX,EAAMS,GAAM,OAAO,KAAK,EAAE,OAAOA,GAAM,OAAO,QAAA;AACvD;AAEA,SAASD,GAAWhG,GAAyB;AAC3C,SAAOA,MAAU,SAAY,SAAa,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC;AAC5E;AC/GA,MAAMoG,IAAe;AAWd,SAASC,GACdZ,GACAa,GAC0B;AAC1B,QAAMC,IAA8B,CAAA,GAC9BC,IAA4B,CAAA;AAClC,MAAIC,IAAM,GACNC,IAAS;AAEb,aAAW,CAACjC,GAAOU,CAAI,KAAKM,EAAM,WAAW;AAC3C,UAAMkB,IAAOxB,EAAK,OAAOmB,MAAW,WAAW,WAAW,IAAI,GACxDjB,IAAOuB,GAAeD,EAAK,MAAM,GAAGP,CAAY,GAChDS,IAASD,GAAeD,EAAK,QAAQ,GAAGP,IAAe,CAAC;AAG9D,IAAIM,IAAS,KAAKA,IAASG,IAASxB,IAAOe,MACzCU,GAAkBN,GAAMC,GAAKC,GAAQjC,CAAK,GAC1CgC,KAAO,GACPC,IAAS;AAGX,UAAMK,IAAQ,KAAK,IAAIX,IAAef,GAAMqB,IAASG,CAAM;AAC3D,IAAIE,IAAQL,KAAQF,EAAK,KAAK,EAAE,OAAA/B,GAAO,KAAAgC,GAAK,OAAOC,GAAQ,MAAMK,IAAQL,EAAA,CAAQ,GACjFH,EAAM,KAAK,EAAE,QAAQpB,EAAK,IAAI,OAAAV,GAAO,KAAAgC,GAAK,OAAAM,GAAO,MAAA1B,GAAM,GACvDqB,IAASK,IAAQ1B,GAEbqB,KAAUN,MACZK,KAAO,GACPC,IAAS;AAAA,EAEb;AAEA,SAAIjB,EAAM,WAAW,IAAU,EAAE,OAAAc,GAAO,MAAAC,GAAM,UAAU,EAAA,KACpDE,IAAS,KAAGI,GAAkBN,GAAMC,GAAKC,GAAQjB,EAAM,MAAM,GAC1D,EAAE,OAAAc,GAAO,MAAAC,GAAM,UAAU,KAAK,IAAI,GAAGC,KAAOC,IAAS,IAAI,IAAI,EAAE,EAAA;AACxE;AAEA,SAASI,GACPN,GACAC,GACAC,GACAjC,GACM;AACN,EAAIiC,KAAUN,KACdI,EAAK,KAAK,EAAE,OAAA/B,GAAO,KAAAgC,GAAK,OAAOC,GAAQ,MAAMN,IAAeM,GAAQ;AACtE;AAEA,SAASE,GAAe5G,GAAe0E,GAAiBC,GAAyB;AAC/E,SAAK,OAAO,SAAS3E,CAAK,IACnB,KAAK,IAAI0E,GAAS,KAAK,IAAIC,GAAS,KAAK,MAAM3E,CAAK,CAAC,CAAC,IADzB0E;AAEtC;AC5CO,SAASsC,GACdC,GACA9B,GACiD;AAEjD,MADqBtC,EAAsBsC,EAAK,aAAa,GAC3C,wBAAwB,UAAW;AAErD,QAAM+B,IAAgBC,GAAwBhC,EAAK,cAAc,YAAY,GACvEiC,IAAiBC,GAAyBlC,EAAK,cAAc,aAAa;AAChF,SAAO;AAAA,IACL,OAAO+B,MAAkB,YAAYD,EAAW,iBAAiBC;AAAA,IACjE,QAAQE,MAAmB,YAAYH,EAAW,kBAAkBG;AAAA,IACpE,aAAaF,MAAkB,YAAY,SAAS;AAAA,IACpD,cAAcE,MAAmB,YAAY,SAAS;AAAA,EAAA;AAE1D;AAGO,SAASE,GAA2BC,GAAsC;AAC/E,SAAO,+BAA+BA,EAAO,YAAA,CAAa;AAC5D;AAGO,SAASC,GAA0BD,GAAkD;AAC1F,SAAO,+BAA+BA,KAAU,SAAS,YAAA,CAAa;AACxE;AAGO,SAASE,GACdC,GACU;AACV,SAAKA,IACE;AAAA,IACL;AAAA,IACA,cAAcA,EAAS,MAAM,YAAA,CAAa;AAAA,IAC1C,iCAAiCA,EAAS,OAAO,YAAA,CAAa;AAAA,EAAA,IAJ1C,CAAA;AAMxB;AAGO,SAASC,GAA+B9C,GAAoC;AACjF,MAAI+C,IAAQ;AACZ,SAAAC,GAAuBhD,EAAS,SAAS,MAAM,MAAM;AACnD,IAAA+C,KAAS;AAAA,EACX,CAAC,GACMA;AACT;AAOO,SAASE,GACdjD,GACAkD,GACQ;AACR,QAAMC,IAAW,IAAI,IAAID,CAAU;AACnC,MAAIhC,IAAU;AACd,SAAA8B,GAAuBhD,EAAS,SAAS,MAAM,CAACM,MAAS;AACvD,QAAI8C,IAAc;AAClB,UAAMlG,IAAgB,EAAE,GAAGoD,EAAK,cAAA;AAShC,IARI6C,EAAS,IAAI,OAAO,KAAKjG,EAAc,iBAAiB,cAC1DA,EAAc,eAAe,WAC7BkG,IAAc,KAEZD,EAAS,IAAI,QAAQ,KAAKjG,EAAc,kBAAkB,cAC5DA,EAAc,gBAAgB,WAC9BkG,IAAc,KAEXA,MACL9C,EAAK,gBAAgBpD,GACrBgE,KAAW;AAAA,EACb,CAAC,GACMA;AACT;AAEA,SAAS8B,GACPpC,GACAyC,GACM;AACN,aAAW/C,KAAQM;AACjB,QAAIN,EAAK,aAAa,aACtB;AAAA,MAAItC,EAAsBsC,EAAK,aAAa,GAAG,wBAAwB,eAAmBA,CAAI;AAC9F,iBAAWO,KAAQP,EAAK,MAAO,CAAA0C,GAAuBnC,EAAK,UAAUwC,CAAO;AAAA;AAEhF;AAEA,SAASf,GAAwBnH,GAAgD;AAC/E,SAAO,CAAC,WAAW,QAAQ,YAAY,UAAU,QAAQ,EAAE,SAAS,OAAOA,CAAK,CAAC,IAC5EA,IACD;AACN;AAEA,SAASqH,GAAyBrH,GAAiD;AACjF,SAAO,CAAC,WAAW,SAAS,QAAQ,SAAS,QAAQ,OAAO,EAAE,SAAS,OAAOA,CAAK,CAAC,IAC/EA,IACD;AACN;AClHA,MAAMmI,KAAuB,IACvBC,KAAuB;AAGtB,SAASC,GACdC,GACAC,GACS;AACT,MAAIC,IAAU;AACd,QAAMC,IAAW,CAACtD,GAA0BuD,MAA2B;AAErE,QADAF,KAAW,GACPE,IAAQP,MAAwBK,IAAUJ;AAC5C,YAAM,IAAI,MAAM,YAAY;AAE9B,QAAIjD,EAAK,SAAS,UAAW,QAAOA,EAAK;AACzC,QAAIA,EAAK,SAAS;AAChB,aAAOA,EAAK,UAAU,gBAClBoD,EAAQ,aAAapD,EAAK,OAAO,IACjCoD,EAAQ,OAAOpD,EAAK,OAAO;AAEjC,QAAIA,EAAK,SAAS,mBAAmBoD,EAAQ,UAAUpD,EAAK,YAAY;AACxE,QAAIA,EAAK,SAAS,kBAAkBoD,EAAQ,QAAQpD,EAAK,GAAG;AAC5D,UAAM5D,IAAS4D,EAAK,UAAU,IAAI,CAACwD,MAAaF,EAASE,GAAUD,IAAQ,CAAC,CAAC;AAC7E,WAAOE,GAAazD,EAAK,UAAU5D,CAAM;AAAA,EAC3C;AACA,SAAOkH,EAASH,GAAY,CAAC;AAC/B;AAGO,SAASO,EACdP,GACAC,GACS;AACT,MAAI,CAACD,EAAY,QAAO;AACxB,MAAI;AACF,WAAOD,GAA2BC,GAAYC,CAAO,MAAM;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAASO,GAAkCR,GAA6C;AAC7F,QAAMS,wBAAa,IAAA,GACbvD,IAAQ,CAACL,MAAmC;AAChD,IAAIA,EAAK,SAAS,WAAS4D,EAAO,IAAI5D,EAAK,OAAO,GAC9CA,EAAK,SAAS,UAAQA,EAAK,UAAU,QAAQK,CAAK;AAAA,EACxD;AACA,SAAAA,EAAM8C,CAAU,GACTS;AACT;AAGO,SAASC,EACdV,GACAzD,GACAoE,GACA/H,IAAwC,EAAE,iBAAiB,MACrC;AACtB,QAAMgI,IAAoC,CAAA,GACpCC,IAAW,IAAI;AAAA,IACnB,MAAM,QAAQtE,EAAS,YAAY,MAAM,IACrCA,EAAS,WAAW,OAAO,IAAI,CAACxC,MAAUA,EAAM,EAAE,IAClD,CAAA;AAAA,EAAC,GAED+G,IAAa,IAAI;AAAA,IACrB,MAAM,QAAQvE,EAAS,YAAY,MAAM,IACrCA,EAAS,WAAW,OAAO,IAAI,CAACxC,MAAU,CAACA,EAAM,IAAIA,CAAK,CAAU,IACpE,CAAA;AAAA,EAAC,GAEDgH,IAAgB,IAAI;AAAA,IACxB,MAAM,QAAQxE,EAAS,SAAS,IAAIA,EAAS,UAAU,IAAI,CAACyE,MAAaA,EAAS,IAAI,IAAI,CAAA;AAAA,EAAC;AAE7F,MAAId,IAAU;AACd,QAAMhD,IAAQ,CAACL,GAAeoE,GAAkBb,MAAwB;AAEtE,QADAF,KAAW,GACPE,IAAQP,MAAwBK,IAAUJ,IAAsB;AAClE,MAAAc,EAAY,KAAKM,EAAM,yBAAyB,cAAcD,CAAQ,CAAC;AACvE;AAAA,IACF;AACA,QAAI,CAACE,GAAStE,CAAI,KAAK,OAAOA,EAAK,QAAS,UAAU;AACpD,MAAA+D,EAAY,KAAKM,EAAM,mBAAmB,sBAAsBD,CAAQ,CAAC;AACzE;AAAA,IACF;AACA,QAAIpE,EAAK,SAAS,WAAW;AAC3BuE,MAAAA,GAAYvE,GAAM,CAAC,QAAQ,OAAO,GAAGoE,GAAUL,CAAW,GACrDS,GAAUxE,EAAK,KAAK,KACvB+D,EAAY,KAAKM,EAAM,sBAAsB,aAAaD,CAAQ,CAAC;AACrE;AAAA,IACF;AACA,QAAIpE,EAAK,SAAS,SAAS;AAOzB,UANAuE,GAAYvE,GAAM,CAAC,QAAQ,WAAW,OAAO,GAAGoE,GAAUL,CAAW,IACjE,OAAO/D,EAAK,WAAY,YAAY,CAACgE,EAAS,IAAIhE,EAAK,OAAO,MAChE+D,EAAY;AAAA,QACVM,EAAM,oBAAoB,gBAAgB,GAAGD,CAAQ,UAAU;AAAA,MAAA,GAG/D,CAAC,CAAC,QAAQ,aAAa,EAAE,SAAS,OAAOpE,EAAK,KAAK,CAAC;AACtD,QAAA+D,EAAY,KAAKM,EAAM,oBAAoB,eAAe,GAAGD,CAAQ,QAAQ,CAAC;AAAA,eACrEpE,EAAK,UAAU,iBAAiB,CAACjE,EAAQ;AAClD,QAAAgI,EAAY;AAAA,UACVM,EAAM,oBAAoB,mBAAmB,GAAGD,CAAQ,QAAQ;AAAA,QAAA;AAAA,WAE7D;AACL,cAAMlH,IAAQ+G,EAAW,IAAI,OAAOjE,EAAK,OAAO,CAAC,GAC3CyE,IAAiB/E,EAAS,YAAY,YAAY;AACxD,QACExC,KACAuH,KACAzE,EAAK,UAAU,iBACf9C,EAAM,eAAeuH,KAErBV,EAAY;AAAA,UACVM,EAAM,oBAAoB,mBAAmB,GAAGD,CAAQ,QAAQ;AAAA,QAAA,GAIlElH,KACAuH,KACAzE,EAAK,UAAU,UACf9C,EAAM,eAAeuH,KAErBV,EAAY;AAAA,UACVM,EAAM,oBAAoB,kBAAkB,GAAGD,CAAQ,QAAQ;AAAA,QAAA;AAAA,MAGrE;AACA;AAAA,IACF;AACA,QAAIpE,EAAK,SAAS,YAAY;AAC5BuE,MAAAA,GAAYvE,GAAM,CAAC,QAAQ,cAAc,GAAGoE,GAAUL,CAAW,IAC7D,OAAO/D,EAAK,gBAAiB,YAAY,CAACkE,EAAc,IAAIlE,EAAK,YAAY,MAC/E+D,EAAY;AAAA,QACVM,EAAM,uBAAuB,kBAAkB,GAAGD,CAAQ,eAAe;AAAA,MAAA;AAG7E;AAAA,IACF;AACA,QAAIpE,EAAK,SAAS,WAAW;AAC3BuE,MAAAA,GAAYvE,GAAM,CAAC,QAAQ,KAAK,GAAGoE,GAAUL,CAAW,GAErD,CAAC,gBAAgB,UAAU,mBAAmB,qBAAqB,KAAK,EAAE;AAAA,QACzE,OAAO/D,EAAK,GAAG;AAAA,MAAA,KAGjB+D,EAAY,KAAKM,EAAM,sBAAsB,eAAe,GAAGD,CAAQ,MAAM,CAAC;AAEhF;AAAA,IACF;AACA,QAAIpE,EAAK,SAAS,QAAQ;AAKxB,UAJAuE,GAAYvE,GAAM,CAAC,QAAQ,YAAY,WAAW,GAAGoE,GAAUL,CAAW,GACrEW,GAA6B1E,EAAK,QAAQ,KAC7C+D,EAAY,KAAKM,EAAM,uBAAuB,aAAa,GAAGD,CAAQ,WAAW,CAAC,GAEhF,CAAC,MAAM,QAAQpE,EAAK,SAAS,GAAG;AAClC,QAAA+D,EAAY;AAAA,UACVM,EAAM,wBAAwB,cAAc,GAAGD,CAAQ,YAAY;AAAA,QAAA;AAErE;AAAA,MACF;AACA,MACEM,GAA6B1E,EAAK,QAAQ,KAC1C,CAAC2E,GAA2B3E,EAAK,UAAUA,EAAK,UAAU,MAAM,KAEhE+D,EAAY;AAAA,QACVM,EAAM,oBAAoB,gBAAgB,GAAGD,CAAQ,YAAY;AAAA,MAAA,GAGrEpE,EAAK,UAAU;AAAA,QAAQ,CAACwD,GAAUlE,MAChCe,EAAMmD,GAAU,GAAGY,CAAQ,cAAc9E,CAAK,KAAKiE,IAAQ,CAAC;AAAA,MAAA;AAE9D;AAAA,IACF;AACA,IAAAQ,EAAY,KAAKM,EAAM,mBAAmB,YAAYrE,EAAK,IAAI,IAAI,GAAGoE,CAAQ,OAAO,CAAC;AAAA,EACxF;AACA,SAAA/D,EAAM8C,GAAYW,GAAM,CAAC,GAClBC;AACT;AAGO,SAASa,GAAoClF,GAGlD;AACA,QAAMmF,IAAkBnF,EAAS,WAAW,OAAO;AAAA,IACjD,CAACxC,MAAUA,EAAM,SAAS,WAAW,SAAS;AAAA,EAAA,GAE1C4H,IAAO,IAAI,IAAID,EAAgB,IAAI,CAAC3H,MAAU,CAACA,EAAM,IAAIA,CAAK,CAAC,CAAC,GAChE6H,wBAAmB,IAAA;AACzB,aAAW7H,KAAS2H,GAAiB;AACnC,UAAMG,wBAAwB,IAAA;AAC9B,eAAWC,KAAQ/H,EAAM,SAAS,YAAY;AAC5C,iBAAWgI,KAAWvB,GAAkCsB,EAAK,UAAU;AACrE,QAAIH,EAAK,IAAII,CAAO,KAAGF,EAAkB,IAAIE,CAAO;AAEtD,UAAID,EAAK;AACP,mBAAWC,KAAWvB,GAAkCsB,EAAK,SAAS;AACpE,UAAIH,EAAK,IAAII,CAAO,KAAGF,EAAkB,IAAIE,CAAO;AAAA,IAG1D;AACA,IAAAH,EAAa,IAAI7H,EAAM,IAAI8H,CAAiB;AAAA,EAC9C;AACA,QAAMG,IAAiC,CAAA,GACjCpB,IAAoC,CAAA,GACpCqB,wBAAe,IAAA,GACf/B,wBAAc,IAAA,GACdhD,IAAQ,CAAC6E,GAAiBG,MAA0B;AACxD,QAAIhC,EAAQ,IAAI6B,CAAO,EAAG;AAC1B,QAAIE,EAAS,IAAIF,CAAO,GAAG;AACzB,MAAAnB,EAAY;AAAA,QACVM;AAAAA,UACE;AAAA,UACA,cAAc,CAAC,GAAGgB,GAAOH,CAAO,EAAE,KAAK,KAAK,CAAC;AAAA,UAC7C;AAAA,QAAA;AAAA,MACF;AAEF;AAAA,IACF;AACA,IAAAE,EAAS,IAAIF,CAAO;AACpB,eAAWI,KAAcP,EAAa,IAAIG,CAAO,KAAK,GAAI,CAAA7E,EAAMiF,GAAY,CAAC,GAAGD,GAAOH,CAAO,CAAC;AAC/F,IAAAE,EAAS,OAAOF,CAAO,GACvB7B,EAAQ,IAAI6B,CAAO;AACnB,UAAMhI,IAAQ4H,EAAK,IAAII,CAAO;AAC9B,IAAIhI,KAAOiI,EAAc,KAAKjI,CAAK;AAAA,EACrC;AACA,SAAA2H,EAAgB,QAAQ,CAAC3H,MAAUmD,EAAMnD,EAAM,IAAI,CAAA,CAAE,CAAC,GAC/C,EAAE,eAAAiI,GAAe,aAAApB,EAAA;AAC1B;AAEA,SAASN,GAAa3F,GAAkC1B,GAA4B;AAClF,MAAI0B,MAAS,MAAO,QAAO1B,EAAO,MAAM,OAAO;AAC/C,MAAI0B,MAAS,KAAM,QAAO1B,EAAO,KAAK,OAAO;AAC7C,MAAI0B,MAAS,MAAO,QAAO,CAAC1B,EAAO,CAAC;AACpC,MAAI0B,MAAS,KAAM,QAAO1B,EAAO,CAAC,MAAMA,EAAO,CAAC;AAChD,MAAI0B,MAAS,KAAM,QAAO1B,EAAO,CAAC,MAAMA,EAAO,CAAC;AAChD,MAAI0B,MAAS,KAAM,QAAOyH,EAAWnJ,EAAO,CAAC,CAAC,IAAImJ,EAAWnJ,EAAO,CAAC,CAAC;AACtE,MAAI0B,MAAS,MAAO,QAAOyH,EAAWnJ,EAAO,CAAC,CAAC,KAAKmJ,EAAWnJ,EAAO,CAAC,CAAC;AACxE,MAAI0B,MAAS,KAAM,QAAOyH,EAAWnJ,EAAO,CAAC,CAAC,IAAImJ,EAAWnJ,EAAO,CAAC,CAAC;AACtE,MAAI0B,MAAS,MAAO,QAAOyH,EAAWnJ,EAAO,CAAC,CAAC,KAAKmJ,EAAWnJ,EAAO,CAAC,CAAC;AACxE,MAAI0B,MAAS,QAAS,QAAO0H,GAAQpJ,EAAO,CAAC,CAAC;AAC9C,MAAI0B,MAAS,YAAa,QAAO,CAAC0H,GAAQpJ,EAAO,CAAC,CAAC;AACnD,MAAI0B,MAAS,KAAM,QAAO,MAAM,QAAQ1B,EAAO,CAAC,CAAC,KAAKA,EAAO,CAAC,EAAE,SAASA,EAAO,CAAC,CAAC;AAClF,MAAI0B,MAAS;AACX,WAAO,OAAO1B,EAAO,CAAC,KAAM,WACxBA,EAAO,CAAC,EAAE,SAAS,OAAOA,EAAO,CAAC,KAAK,EAAE,CAAC,IAC1C,MAAM,QAAQA,EAAO,CAAC,CAAC,KAAKA,EAAO,CAAC,EAAE,SAASA,EAAO,CAAC,CAAC;AAE9D,MAAI0B,MAAS,MAAO,QAAO2H,EAAQrJ,EAAO,CAAC,CAAC,IAAIqJ,EAAQrJ,EAAO,CAAC,CAAC;AACjE,MAAI0B,MAAS,WAAY,QAAO2H,EAAQrJ,EAAO,CAAC,CAAC,IAAIqJ,EAAQrJ,EAAO,CAAC,CAAC;AACtE,MAAI0B,MAAS,WAAY,QAAO2H,EAAQrJ,EAAO,CAAC,CAAC,IAAIqJ,EAAQrJ,EAAO,CAAC,CAAC;AACtE,MAAI0B,MAAS,UAAU;AACrB,UAAM4H,IAAUD,EAAQrJ,EAAO,CAAC,CAAC;AACjC,QAAIsJ,MAAY,EAAG,OAAM,IAAI,MAAM,QAAQ;AAC3C,WAAOD,EAAQrJ,EAAO,CAAC,CAAC,IAAIsJ;AAAA,EAC9B;AACA,MAAI5H,MAAS,SAAU,QAAO1B,EAAO,IAAI,CAACvB,MAAU,OAAOA,KAAS,EAAE,CAAC,EAAE,KAAK,EAAE;AAChF,MAAIiD,MAAS,WAAY,QAAO1B,EAAO,KAAK,CAACvB,MAAU,CAAC2K,GAAQ3K,CAAK,CAAC,KAAK;AAC3E,MAAIiD,MAAS;AACX,WAAO,OAAO1B,EAAO,CAAC,KAAM,YAAY,MAAM,QAAQA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,EAAE,SAAS;AACxF,MAAI0B,MAAS,KAAM,QAAO1B,EAAO,CAAC,IAAIA,EAAO,CAAC,IAAIA,EAAO,CAAC;AAC1D,QAAM,IAAI,MAAM,YAAY0B,CAAI,EAAE;AACpC;AAEA,SAAS2H,EAAQ5K,GAAwB;AACvC,MAAI,OAAOA,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,EAAG,OAAM,IAAI,MAAM,YAAY;AACtF,SAAOA;AACT;AAEA,SAAS0K,EAAW1K,GAAiC;AAEnD,MADI,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,KAClD,OAAOA,KAAU,SAAU,QAAOA;AACtC,QAAM,IAAI,MAAM,YAAY;AAC9B;AAEA,SAAS2K,GAAQ3K,GAAyB;AACxC,SAEEA,KAAU,QACVA,MAAU,MACT,MAAM,QAAQA,CAAK,KAAKA,EAAM,WAAW;AAE9C;AAEA,SAAS2J,GAAU3J,GAAyB;AAC1C,SAAOA,MAAU,QAAQ,CAAC,UAAU,UAAU,SAAS,EAAE,SAAS,OAAOA,CAAK;AAChF;AAEA,SAAS6J,GAA6B7J,GAAyB;AAC7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,SAAS,OAAOA,CAAK,CAAC;AAC1B;AAEA,SAAS8J,GAA2B9J,GAAgB4H,GAAwB;AAC1E,SAAI,CAAC,OAAO,SAAS,aAAa,QAAQ,EAAE,SAAS,OAAO5H,CAAK,CAAC,IAAU4H,MAAU,IAClF5H,MAAU,OAAa4H,MAAU,IACjC,CAAC,OAAO,MAAM,UAAU,UAAU,EAAE,SAAS,OAAO5H,CAAK,CAAC,IAAU4H,KAAS,KAAKA,KAAS,IACxFA,MAAU;AACnB;AAEA,SAAS8B,GACP1F,GACA8G,GACA7B,GACAC,GACM;AACN,QAAMpD,IAAU,IAAI,IAAIgF,CAAW;AACnC,aAAW7G,KAAO,OAAO,KAAKD,CAAM;AAClC,IAAK8B,EAAQ,IAAI7B,CAAG,KAClBiF,EAAY,KAAKM,EAAM,+BAA+B,SAASvF,CAAG,IAAI,GAAGgF,CAAI,IAAIhF,CAAG,EAAE,CAAC;AAE7F;AAEA,SAASuF,EAAMuB,GAAcC,GAAiB/B,GAAkC;AAC9E,SAAO,EAAE,UAAU,SAAS,MAAA8B,GAAM,SAAAC,GAAS,MAAA/B,EAAA;AAC7C;AAEA,SAASQ,GAASzJ,GAAkD;AAClE,SAAO,OAAOA,KAAU,YAAYA,MAAU,QAAQ,CAAC,MAAM,QAAQA,CAAK;AAC5E;ACvUO,SAASiL,GACdZ,GACAa,IAAuE,IAC/D;AACR,SAAO;AAAA,IACLA,EAAQ,YAAY;AAAA,IACpBA,EAAQ,eAAe;AAAA,IACvBA,EAAQ,SAAS;AAAA,IACjBb;AAAA,EAAA,EACA,KAAK,GAAG;AACZ;AAGO,SAASc,GACdC,GACmC;AACnC,QAAM5B,IAAQ4B,EAAQ,KAAK,CAAC3I,MAASA,EAAK,aAAa,OAAO,GAAG,SAC3D4I,IAAUD,EAAQ,KAAK,CAAC3I,MAASA,EAAK,aAAa,SAAS,GAAG;AACrE,SAAO+G,KAAS6B,IAAU,EAAE,OAAA7B,GAAO,SAAA6B,MAAY;AACjD;AAGO,SAASC,GACdjJ,GACAkG,GAC4B;AAC5B,QAAMgD,IAAoC;AAAA,IACxC,SAASlJ,EAAM,kBAAkB,YAAY,CAACA,EAAM,QAAQ;AAAA,IAC5D,UAAUA,EAAM;AAAA,IAChB,UACEA,EAAM,QAAQ,YAAYA,EAAM,SAAS,WAAW,KAAK,CAAC+H,MAASA,EAAK,SAAS,SAAS;AAAA,EAAA;AAE9F,aAAWA,KAAQ/H,EAAM,SAAS,YAAY;AAC5C,UAAMrC,IAAQ6I,EAA0BuB,EAAK,WAAW7B,CAAO,IAC3D6B,EAAK,gBACJA,EAAK,kBAAkBoB,GAAiBD,GAAOnB,EAAK,MAAM;AAC/D,IAAIA,EAAK,WAAW,cAAWmB,EAAM,UAAUvL,IAC3CoK,EAAK,WAAW,eAAYmB,EAAM,WAAWvL,IAC7CoK,EAAK,WAAW,eAAYmB,EAAM,WAAWvL;AAAA,EACnD;AACA,SAAIqC,EAAM,SAAS,WAAW,KAAK,CAAC+H,MAASA,EAAK,SAAS,SAAS,MAAGmB,EAAM,WAAW,KACjFA;AACT;AAGA,eAAsBE,GACpB5G,GACA6G,GACAnD,GACArH,IAII,CAAA,GACe;AACnB,QAAM,EAAE,eAAAoJ,GAAe,aAAApB,MAAgBa,GAAoClF,CAAQ;AACnF,MAAIqE,EAAY,SAAS,EAAG,QAAOA,EAAY,IAAI,CAACzG,MAASA,EAAK,OAAO;AACzE,QAAMkJ,IAAqB,CAAA,GACrBC,IAAQ1K,EAAQ,SAAS,cACzB2K,IAAgB,IAAI,IAAI3K,EAAQ,mBAAmB,CAAA,CAAE;AAC3D,aAAWmB,KAASiI;AAClB,QAAIjI,EAAM,eAAewC,EAAS,WAAW,WAAW;AACxD,iBAAWuF,KAAQ/H,EAAM,SAAS,YAAY;AAC5C,YAAI,CAACyJ,GAAuB1B,GAAMwB,GAAOC,CAAa,EAAG;AACzD,cAAMX,IAA4C,EAAE,GAAG3C,GAAS,QAAQmD,EAAW,OAAA;AACnF,YAAI,EAAAtB,EAAK,aAAa,CAACvB,EAA0BuB,EAAK,WAAWc,CAAO;AACxE,cAAI;AACF,kBAAMa,IAAY/F,GAAWqC,GAA2B+B,EAAK,YAAYc,CAAO,CAAC,GAC3Ec,IAAeN,EAAW,OAAOrJ,EAAM,EAAE,GACzC4J,IAAgBC;AAAA,cACpB9B;AAAA,cACA/H;AAAA,cACA2J;AAAA,cACAD;AAAA,cACAH;AAAA,cACA1K,EAAQ;AAAA,cACRyK;AAAA,YAAA;AAEF,gBAAI,EAAE,OAAOM,KAAkB,YAAYA,IAAgB,MAAMA;AAC/D;AAEF,YAAKE,GAAYH,GAAcD,CAAS,MACtCL,EAAW,OAAOrJ,EAAM,EAAE,IAAI0J,GAC9BF,EAAc,IAAIxJ,EAAM,EAAE;AAAA,UAE9B,SAASmH,GAAO;AACd,YAAAmC,EAAS,KAAK,GAAGtJ,EAAM,KAAK,IAAImH,aAAiB,QAAQA,EAAM,UAAU,MAAM,EAAE;AAAA,UACnF;AAAA,MACF;AAEF,SAAOmC;AACT;AAGA,eAAsBS,GACpBvH,GACAwH,GACAC,GACA/D,GACArH,IAII,IACe;AACnB,QAAM,EAAE,eAAAoJ,GAAe,aAAApB,MAAgBa,GAAoClF,CAAQ;AACnF,MAAIqE,EAAY,SAAS,EAAG,QAAOA,EAAY,IAAI,CAACzG,MAASA,EAAK,OAAO;AACzE,QAAMkJ,IAAqB,CAAA,GACrBC,IAAQ1K,EAAQ,SAAS,cACzB2K,IAAgB,IAAI,IAAI3K,EAAQ,mBAAmB,CAAA,CAAE;AAC3D,aAAWmB,KAASiI;AAClB,QAAIjI,EAAM,eAAeiK;AACzB,iBAAWlC,KAAQ/H,EAAM,SAAS,YAAY;AAC5C,YAAI,CAACyJ,GAAuB1B,GAAMwB,GAAOC,CAAa,EAAG;AACzD,cAAMX,IAA4C,EAAE,GAAG3C,GAAS,YAAY8D,EAAA;AAC5E,YAAI,EAAAjC,EAAK,aAAa,CAACvB,EAA0BuB,EAAK,WAAWc,CAAO;AACxE,cAAI;AACF,kBAAMa,IAAY/F,GAAWqC,GAA2B+B,EAAK,YAAYc,CAAO,CAAC,GAC3Ec,IAAeK,EAAUhK,EAAM,EAAE,GACjC4J,IAAgBC;AAAA,cACpB9B;AAAA,cACA/H;AAAA,cACA2J;AAAA,cACAD;AAAA,cACAH;AAAA,cACA1K,EAAQ;AAAA,cACRyK;AAAA,YAAA;AAEF,gBAAI,EAAE,OAAOM,KAAkB,YAAYA,IAAgB,MAAMA;AAC/D;AAEF,YAAKE,GAAYH,GAAcD,CAAS,MACtCM,EAAUhK,EAAM,EAAE,IAAI0J,GACtBF,EAAc,IAAIxJ,EAAM,EAAE;AAAA,UAE9B,SAASmH,GAAO;AACd,YAAAmC,EAAS,KAAK,GAAGtJ,EAAM,KAAK,IAAImH,aAAiB,QAAQA,EAAM,UAAU,MAAM,EAAE;AAAA,UACnF;AAAA,MACF;AAEF,SAAOmC;AACT;AAEA,SAASG,GACP1B,GACAwB,GACAC,GACS;AACT,MAAID,MAAU,aAAc,QAAO;AACnC,QAAM1B,IAAepB,GAAkCsB,EAAK,UAAU;AACtE,MAAIA,EAAK;AACP,eAAWC,KAAWvB,GAAkCsB,EAAK,SAAS;AACpE,MAAAF,EAAa,IAAIG,CAAO;AAE5B,SAAO,CAAC,GAAGH,CAAY,EAAE,KAAK,CAACG,MAAYwB,EAAc,IAAIxB,CAAO,CAAC;AACvE;AAEA,SAAS6B,GACP9B,GACA/H,GACA2J,GACAD,GACAH,GACAW,GACAZ,GAC4B;AAE5B,SADIvB,EAAK,SAAS,aAAaO,GAAQqB,CAAY,KAC/C5B,EAAK,oBAAoB,WAAiB,KAC1CA,EAAK,oBAAoB,gBAAgBwB,MAAU,eAAqB,KACvEW,IAIEA,EACJ,iBAAiB;AAAA,IAChB,SAASlK,EAAM;AAAA,IACf,YAAYA,EAAM;AAAA,IAClB,cAAA2J;AAAA,IACA,WAAAD;AAAA,EAAA,CACD,EACA,MAAM,OACLJ,EAAS,KAAK,GAAGtJ,EAAM,KAAK,iBAAiB,GACtC,GACR,KAbDsJ,EAAS,KAAK,GAAGtJ,EAAM,KAAK,0BAA0B,GAC/C;AAaX;AAEA,SAAS8J,GAAYK,GAAeC,GAAyB;AAC3D,MAAI,OAAO,GAAGD,GAAMC,CAAK,EAAG,QAAO;AACnC,MAAI;AACF,WAAO,KAAK,UAAUD,CAAI,MAAM,KAAK,UAAUC,CAAK;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsBC,GACpBrK,GACArC,GACA2M,GACApE,GACArH,IAII,IACiC;AACrC,QAAMqK,IAAQrK,EAAQ,SAASoK,GAA0BjJ,GAAOkG,CAAO;AACvE,MAAI,CAACgD,EAAM,WAAWA,EAAM,iBAAiB,CAAA;AAC7C,QAAMH,IAAsC,CAAA;AAC5C,EAAIG,EAAM,YAAYZ,GAAQ3K,CAAK,KACjCoL,EAAQ,KAAK;AAAA,IACX,SAAS/I,EAAM;AAAA,IACf,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAASA,EAAM,WAAW,WAAW,GAAGA,EAAM,KAAK;AAAA,EAAA,CACpD;AAEH,aAAW+H,KAAQ/H,EAAM,SAAS,iBAAiB;AAGjD,QAFI,CAAC+H,EAAK,WAAWA,EAAK,YAAYuC,KAClChC,GAAQ3K,CAAK,KAAKoK,EAAK,SAAS,cAChCA,EAAK,aAAa,CAACvB,EAA0BuB,EAAK,WAAW7B,CAAO,EAAG;AAC3E,UAAMqE,IAAU,MAAMC,GAAaxK,GAAO+H,GAAMpK,GAAOuI,GAASrH,CAAO;AACvE,IAAI0L,KACFxB,EAAQ,KAAK;AAAA,MACX,SAAS/I,EAAM;AAAA,MACf,QAAQ+H,EAAK;AAAA,MACb,UAAUA,EAAK;AAAA,MACf,SAASA,EAAK,WAAWwC;AAAA,IAAA,CAC1B;AAAA,EAEL;AACA,SAAOxB;AACT;AAGO,SAAS0B,GAAgCC,GAA0B;AAGxE,MAFI,CAACA,KAAWA,EAAQ,SAAS,OAC7B,mCAAmC,KAAKA,CAAO,KAC/C,0BAA0B,KAAKA,CAAO,EAAG,QAAO;AACpD,MAAI;AACF,WAAK,IAAI,OAAOA,CAAO,GAChB;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeF,GACbxK,GACA+H,GACApK,GACAuI,GACArH,GAIiB;AACjB,QAAMa,IAAgBqI,EAAK;AAC3B,MAAIA,EAAK,SAAS,UAAU;AAC1B,UAAM4C,IAASC,GAAYjN,CAAK,GAC1B0E,IAAUwI,EAAanL,EAAc,OAAO,GAC5C4C,IAAUuI,EAAanL,EAAc,OAAO;AAClD,QAAI2C,MAAY,UAAasI,IAAStI,EAAS,QAAO,UAAUA,CAAO;AACvE,QAAIC,MAAY,UAAaqI,IAASrI,EAAS,QAAO,UAAUA,CAAO;AAAA,EACzE;AACA,MAAIyF,EAAK,SAAS,SAAS;AACzB,UAAM+C,IAASD,EAAalN,CAAK;AACjC,QAAImN,MAAW,OAAW,QAAO;AACjC,UAAMzI,IAAUwI,EAAanL,EAAc,OAAO,GAC5C4C,IAAUuI,EAAanL,EAAc,OAAO;AAClD,QAAI2C,MAAY,UAAayI,IAASzI,EAAS,QAAO,QAAQA,CAAO;AACrE,QAAIC,MAAY,UAAawI,IAASxI,EAAS,QAAO,QAAQA,CAAO;AAAA,EACvE;AACA,MAAIyF,EAAK,SAAS,aAAa;AAC7B,UAAMgD,IAAQF,EAAanL,EAAc,KAAK;AAC9C,QAAIqL,MAAU,UAAaC,GAAcrN,CAAK,IAAIoN,EAAO,QAAO,YAAYA,CAAK;AAAA,EACnF;AACA,MAAIhD,EAAK,SAAS,UAAU;AAC1B,UAAMkD,IAAO,OAAOtN,CAAK,GACnBuN,IAAS,OAAOxL,EAAc,UAAU,EAAE;AAChD,QAAIwL,MAAW,WAAW,CAAC,6BAA6B,KAAKD,CAAI,EAAG,QAAO;AAC3E,QAAIC,MAAW,WAAW,CAAC,2BAA2B,KAAKD,CAAI,EAAG,QAAO;AACzE,QAAIC,MAAW,gBAAgB,CAAC,+BAA+B,KAAKD,CAAI;AACtE,aAAO;AAAA,EACX;AACA,MAAIlD,EAAK,SAAS,SAAS;AACzB,UAAM2C,IAAU,OAAOhL,EAAc,WAAW,EAAE;AAClD,QAAI,CAAC+K,GAAgCC,CAAO,EAAG,QAAO;AACtD,QAAI,CAAC,IAAI,OAAOA,CAAO,EAAE,KAAK,OAAO/M,CAAK,CAAC,EAAG,QAAO;AAAA,EACvD;AACA,MAAIoK,EAAK,SAAS,QAAQ;AACxB,UAAMoD,IAAY,KAAK,MAAM,OAAOxN,CAAK,CAAC;AAC1C,QAAI,CAAC,OAAO,SAASwN,CAAS,EAAG,QAAO;AACxC,UAAM9I,IAAU,KAAK,MAAM,OAAO3C,EAAc,WAAW,EAAE,CAAC,GACxD4C,IAAU,KAAK,MAAM,OAAO5C,EAAc,WAAW,EAAE,CAAC;AAC9D,QAAI,OAAO,SAAS2C,CAAO,KAAK8I,IAAY9I,EAAS,QAAO;AAC5D,QAAI,OAAO,SAASC,CAAO,KAAK6I,IAAY7I,EAAS,QAAO;AAAA,EAC9D;AACA,MAAIyF,EAAK,SAAS,aAAa;AAC7B,UAAMxC,IAAQ,MAAM,QAAQ5H,CAAK,IAAIA,EAAM,SAAS,GAC9C0E,IAAUwI,EAAanL,EAAc,OAAO,GAC5C4C,IAAUuI,EAAanL,EAAc,OAAO;AAClD,QAAI2C,MAAY,UAAakD,IAAQlD,EAAS,QAAO,QAAQA,CAAO;AACpE,QAAIC,MAAY,UAAaiD,IAAQjD,EAAS,QAAO,QAAQA,CAAO;AAAA,EACtE;AACA,MAAIyF,EAAK,SAAS,QAAQ;AACxB,UAAMqD,IAAQ,MAAM,QAAQzN,CAAK,IAAIA,IAAQ,CAACA,CAAK,GAC7C0N,IAAeR,EAAanL,EAAc,YAAY;AAC5D,QAAI2L,MAAiB,UAAaD,EAAM,SAASC;AAC/C,aAAO,QAAQA,CAAY;AAC7B,UAAMC,IAAgBT,EAAanL,EAAc,aAAa;AAC9D,QACE4L,MAAkB,UAClBF,EAAM,KAAK,CAACG,MAAS;AACnB,UAAI,CAACnE,GAASmE,CAAI,EAAG,QAAO;AAC5B,YAAMC,IAAOX,EAAaU,EAAK,IAAI;AACnC,aAAOC,MAAS,UAAaA,IAAOF,IAAgB,OAAO;AAAA,IAC7D,CAAC;AAED,aAAO,YAAYA,CAAa;AAElC,UAAMG,IAAS,OAAO/L,EAAc,UAAU,EAAE,EAAE,KAAA;AAClD,QAAI+L,KAAUL,EAAM,KAAK,CAACG,MAAS,CAACG,GAAoBH,GAAME,CAAM,CAAC;AACnE,aAAO;AAAA,EACX;AACA,MAAI1D,EAAK,SAAS,iBAAiB;AACjC,UAAM4D,IAAgB,OAAOjM,EAAc,WAAW,EAAE,GAClDkM,IAAW,OAAOlM,EAAc,YAAY,IAAI,GAChDgD,IAASwD,EAAQ,OAAOyF,CAAa;AAE3C,QAAI,CADUE,GAAQlO,GAAO+E,GAAQkJ,CAAQ,EACjC,QAAO,IAAI5L,EAAM,KAAK;AAAA,EACpC;AACA,MAAI+H,EAAK,SAAS,cAAc;AAC9B,UAAM9B,IAAavG,EAAc;AACjC,QAAI,CAAC0H,GAASnB,CAAU,EAAG,QAAO;AAClC,QAAI;AACF,UACED,GAA2BC,GAA6CC,CAAO,MAAM;AAErF,eAAO;AAAA,IAEX,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI6B,EAAK,SAAS,YAAY;AAC5B,UAAM+D,IAAOjN,EAAQ,kBAAkB,GACjCkN,IAAclB,EAAanL,EAAc,WAAW,GACpDsM,IAAcnB,EAAanL,EAAc,WAAW;AAC1D,QAAIqM,MAAgB,UAAaD,IAAOC,EAAa,QAAO,UAAUA,CAAW;AACjF,QAAIC,MAAgB,UAAaF,IAAOE,EAAa,QAAO,UAAUA,CAAW;AAAA,EACnF;AACA,MAAIjE,EAAK,SAAS,UAAU;AAC1B,UAAMkE,IAAW,OAAOvM,EAAc,YAAY,EAAE,GAC9CwM,IAAc,OAAOxM,EAAc,eAAe,EAAE;AAC1D,QAAI,CAACuM,KAAY,CAACC,EAAa,QAAO;AACtC,QAAI,CAACrN,EAAQ,cAAe,QAAO;AACnC,QAAI;AACF,YAAM6H,IAAS,MAAM7H,EAAQ,cAAc,SAAS;AAAA,QAClD,UAAAoN;AAAA,QACA,aAAAC;AAAA,QACA,OAAAvO;AAAA,QACA,SAASqC,EAAM;AAAA,MAAA,CAChB;AACD,UAAI,CAAC0G,EAAO,MAAO,QAAOA,EAAO,WAAW;AAAA,IAC9C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASyC,GACPD,GACAxG,GACS;AACT,SAAIA,MAAW,YAAkBwG,EAAM,UACnCxG,MAAW,aAAmBwG,EAAM,WACjCA,EAAM;AACf;AAIA,SAAS2C,GAAQ1B,GAAeC,GAAgBwB,GAA2B;AACzE,SAAIA,MAAa,OAAazB,MAASC,IACnCwB,MAAa,OAAazB,MAASC,IACnC,OAAOD,KAAS,YAAY,OAAOC,KAAU,WAAiB,KAC9DwB,MAAa,OAAazB,IAAOC,IACjCwB,MAAa,QAAczB,KAAQC,IACnCwB,MAAa,OAAazB,IAAOC,IACjCwB,MAAa,QAAczB,KAAQC,IAChC;AACT;AAEA,SAASQ,GAAYjN,GAAwB;AAC3C,SAAI,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK,IAAUA,EAAM,SAC7D,OAAOA,KAAS,EAAE,EAAE;AAC7B;AAEA,SAASqN,GAAcrN,GAAwB;AAC7C,QAAMsN,IAAO,OAAOtN,CAAK,GACnBwO,IAAMlB,EAAK,QAAQ,GAAG;AAC5B,SAAOkB,IAAM,IAAI,IAAIlB,EAAK,SAASkB,IAAM;AAC3C;AAEA,SAAStB,EAAalN,GAAoC;AACxD,SAAO,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,IAAIA,IAAQ;AACvE;AAEA,SAAS2K,GAAQ3K,GAAyB;AACxC,SAEEA,KAAU,QACVA,MAAU,MACT,MAAM,QAAQA,CAAK,KAAKA,EAAM,WAAW;AAE9C;AAEA,SAAS+N,GAAoB/N,GAAgB8N,GAAyB;AACpE,MAAI,CAACrE,GAASzJ,CAAK,EAAG,QAAO;AAC7B,QAAMiD,IAAO,OAAOjD,EAAM,QAAS,WAAWA,EAAM,KAAK,gBAAgB,IACnEyO,IAAW,OAAOzO,EAAM,QAAS,WAAWA,EAAM,KAAK,gBAAgB;AAC7E,SAAO8N,EACJ,MAAM,GAAG,EACT,IAAI,CAACrL,MAASA,EAAK,KAAA,EAAO,YAAA,CAAa,EACvC,OAAO,OAAO,EACd,KAAK,CAACA,MACDA,EAAK,WAAW,GAAG,IAAUQ,EAAK,SAASR,CAAI,IAC/CA,EAAK,SAAS,IAAI,IAAUgM,EAAS,WAAWhM,EAAK,MAAM,GAAG,EAAE,CAAC,IAC9DgM,MAAahM,CACrB;AACL;AAEA,SAASuD,GAAWhG,GAAyB;AAC3C,MAA2BA,KAAU,KAAM,QAAOA;AAClD,MAAI,OAAO,WAAW,mBAAoB;AACxC,QAAI;AACF,aAAO,WAAW,gBAAgBA,CAAK;AAAA,IACzC,QAAQ;AAAA,IAER;AAEF,SAAOA;AACT;AAEA,SAASyJ,GAASzJ,GAAkD;AAClE,SAAO,OAAOA,KAAU,YAAYA,MAAU,QAAQ,CAAC,MAAM,QAAQA,CAAK;AAC5E;ACxcO,MAAM0O,KAAiD;AAAA,EAC5D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,IACP,EAAE,QAAQ,UAAU,OAAO,MAAM,SAAS,GAAA;AAAA,IAC1C,EAAE,QAAQ,SAAS,OAAO,MAAM,SAAS,GAAA;AAAA,IACzC,EAAE,QAAQ,SAAS,OAAO,MAAM,SAAS,GAAA;AAAA,EAAM;AAEnD,GAGaC,KAAuD;AAAA,EAClE,oBAAoB;AACtB;AAGO,SAASC,KAA4D;AAC1E,SAAO;AAAA,IACL,YAAY,CAAA;AAAA,IACZ,YAAY,CAAA;AAAA,IACZ,iBAAiB,CAAA;AAAA,IACjB,gBAAgB;AAAA,IAChB,eAAe,CAAA;AAAA,EAAC;AAEpB;AAOO,SAASC,GAAkC7K,GAAuC;AACvF,QAAM8K,IAAWrF,EAASzF,EAAO,QAAQ,IAAIA,EAAO,WAAW;AAE/D,MADI8K,KAAY,EAAE,cAAcA,OAAWA,EAAS,WAAW,CAAA,IAC3DA,KAAY,MAAM,QAAQA,EAAS,QAAQ;AAC7C,eAAWnJ,KAAWmJ,EAAS;AAC7B,MAAKrF,EAAS9D,CAAO,MACf,YAAYA,MAAUA,EAAQ,SAAS,UACvC,qBAAqBA,MAAUA,EAAQ,kBAAkB;AAGnE,EAAM,kBAAkB3B,QAAgB,eAAe,EAAE,GAAG2K,GAAA,IACtD,eAAe3K,MACnBA,EAAO,YAAY,EAAE,GAAG0K,IAA6B,SAAS,IAAO,SAAS,GAAC,IAE3E,eAAe1K,MAASA,EAAO,YAAY,CAAA,IAC3C,iBAAiBA,MAASA,EAAO,cAAc,CAAA,IAC/C,gBAAgBA,MAASA,EAAO,aAAa,CAAA,IAC7C,UAAUA,MACdA,EAAO,OAAO,EAAE,SAAS,IAAO,eAAe,SAAS,SAAS,CAAC,OAAO,GAAG,SAAS,CAAA,EAAC;AAExF,QAAM+K,IAAatF,EAASzF,EAAO,UAAU,IAAIA,EAAO,aAAa;AACrE,MAAI,GAAC+K,KAAc,CAAC,MAAM,QAAQA,EAAW,MAAM;AACnD,eAAWC,KAAYD,EAAW,QAAQ;AACxC,UAAI,CAACtF,EAASuF,CAAQ,EAAG;AACzB,UAAI,EAAE,cAAcA,IAAW;AAC7B,QAAAA,EAAS,WAAWJ,GAAA,GACpBK,GAAwBD,CAAQ;AAChC;AAAA,MACF;AACA,UAAI,CAACvF,EAASuF,EAAS,QAAQ,EAAG;AAClC,YAAME,IAAWF,EAAS;AAG1B,UAFM,gBAAgBE,MAAWA,EAAS,aAAa,CAAA,IACjD,gBAAgBA,MAAWA,EAAS,aAAa,CAAA,IACnD,MAAM,QAAQA,EAAS,UAAU;AACnC,mBAAWC,KAAaD,EAAS;AAC/B,UACEzF,EAAS0F,CAAS,KAClBA,EAAU,SAAS,aACnB,EAAE,qBAAqBA,OAEvBA,EAAU,kBAAkB;AAIlC,MAAM,qBAAqBD,MAAWA,EAAS,kBAAkB,CAAA,IAC3D,oBAAoBA,IAChB,CAAC,QAAQ,WAAW,SAAS,EAAE,SAAS,OAAOA,EAAS,cAAc,CAAC,IAD5CA,EAAS,iBAAiB,QAIzD,mBAAmBA,MAAWA,EAAS,gBAAgB,CAAA;AAAA,IAC/D;AACF;AAGO,SAASE,GAAiCvK,GAAkD;AACjG,QAAMkE,IAA+B,CAAA,GAC/B/E,IAASa;AACf,EAAA6E;AAAA,IACE1F;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,IACA;AAAA,IACA+E;AAAA,EAAA,GAEFsG,GAAqBxK,GAAUkE,CAAM,GACrCuG,GAAkBzK,GAAUkE,CAAM,GAClCwG,GAAkB1K,GAAUkE,CAAM,GAClCyG,GAAoB3K,GAAUkE,CAAM,GACpC0G,GAAa5K,GAAUkE,CAAM,GAC7B2G,GAAsB1L,EAAO,SAAS+E,CAAM;AAC5C,QAAMgG,IAAatF,EAASzF,EAAO,UAAU,IAAIA,EAAO,aAAa,QAC/D8K,IAAWrF,EAASzF,EAAO,QAAQ,IAAIA,EAAO,WAAW,QACzD2L,IAAY,MAAM,QAAQZ,GAAY,MAAM,GAC5Ca,IAAc,MAAM,QAAQd,GAAU,QAAQ;AACpD,SAAIA,KAAUe,GAAiBhL,GAAUkE,CAAM,GAC3C4G,KAAWG,GAAuBjL,GAAUkE,CAAM,GAEpD4G,KACAC,KACA,MAAM,QAAQ/K,EAAS,SAAS,KAChC,MAAM,QAAQA,EAAS,WAAW,KAClC,MAAM,QAAQA,EAAS,UAAU,MAEjCkL,GAAmBlL,GAAUkE,CAAM,GACnCA,EAAO,KAAK,GAAGgB,GAAoClF,CAAQ,EAAE,WAAW,IAEnEkE;AACT;AAEA,SAASkG,GAAwB5M,GAAsC;AACrE,QAAM6M,IAAW7M,EAAM,UACjB2N,IAAavG,EAASpH,EAAM,UAAU,IAAIA,EAAM,aAAa,QAC7DgI,IAAU,OAAOhI,EAAM,MAAO,WAAWA,EAAM,KAAK;AAC1D,EAAK2N,OACDA,EAAW,kBAAkB,UAAaA,EAAW,kBAAkB,WACzEd,EAAS,gBAAgB,KAAK;AAAA,IAC5B,IAAI,UAAU7E,CAAO;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS,OAAO2F,EAAW,WAAY,WAAWA,EAAW,UAAU;AAAA,IACvE,eAAe;AAAA,MACb,SAASC,GAAwBD,EAAW,aAAa;AAAA,MACzD,SAASC,GAAwBD,EAAW,aAAa;AAAA,IAAA;AAAA,EAC3D,CACD,IAECA,EAAW,YAAY,UAAaA,EAAW,YAAY,WAC7Dd,EAAS,gBAAgB,KAAK;AAAA,IAC5B,IAAI,UAAU7E,CAAO;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS,OAAO2F,EAAW,WAAY,WAAWA,EAAW,UAAU;AAAA,IACvE,eAAe;AAAA,MACb,SAASC,GAAwBD,EAAW,OAAO;AAAA,MACnD,SAASC,GAAwBD,EAAW,OAAO;AAAA,IAAA;AAAA,EACrD,CACD,GAEC,OAAOA,EAAW,WAAY,YAAYA,EAAW,WACvDd,EAAS,gBAAgB,KAAK;AAAA,IAC5B,IAAI,UAAU7E,CAAO;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS,OAAO2F,EAAW,WAAY,WAAWA,EAAW,UAAU;AAAA,IACvE,eAAe,EAAE,SAASA,EAAW,QAAA;AAAA,EAAQ,CAC9C;AAEL;AAEA,SAASX,GAAqBxK,GAA4BkE,GAAoC;AAC5F,MAAI,CAACU,EAAS5E,EAAS,YAAY,GAAG;AACpC,IAAAkE,EAAO,KAAKS,EAAM,iBAAiB,aAAa,gBAAgB,CAAC;AACjE;AAAA,EACF;AACA,EAAAE;AAAA,IACE7E,EAAS;AAAA,IACT,CAAC,oBAAoB;AAAA,IACrB;AAAA,IACA;AAAA,IACAkE;AAAA,EAAA,GAEE,OAAOlE,EAAS,aAAa,sBAAuB,aACtDkE,EAAO;AAAA,IACLS;AAAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAGN;AAEA,SAAS8F,GAAkBzK,GAA4BkE,GAAoC;AACzF,QAAMmH,IAAYrL,EAAS;AAC3B,MAAI,CAAC4E,EAASyG,CAAS,GAAG;AACxB,IAAAnH,EAAO,KAAKS,EAAM,cAAc,cAAc,aAAa,CAAC;AAC5D;AAAA,EACF;AAcA,MAbAE;AAAA,IACEwG;AAAA,IACA,CAAC,WAAW,YAAY,SAAS,SAAS;AAAA,IAC1C;AAAA,IACA;AAAA,IACAnH;AAAA,EAAA,GAEE,OAAOmH,EAAU,WAAY,aAC/BnH,EAAO,KAAKS,EAAM,oBAAoB,cAAc,qBAAqB,CAAC,GACvE,CAAC,OAAO,UAAU,MAAM,EAAE,SAAS,OAAO0G,EAAU,QAAQ,CAAC,KAChEnH,EAAO,KAAKS,EAAM,oBAAoB,YAAY,sBAAsB,CAAC,GACtE,CAAC,QAAQ,UAAU,OAAO,EAAE,SAAS,OAAO0G,EAAU,KAAK,CAAC,KAC/DnH,EAAO,KAAKS,EAAM,oBAAoB,YAAY,mBAAmB,CAAC,GACpE,CAAC,MAAM,QAAQ0G,EAAU,OAAO,GAAG;AACrC,IAAAnH,EAAO,KAAKS,EAAM,sBAAsB,cAAc,qBAAqB,CAAC;AAC5E;AAAA,EACF;AACA,EAAA0G,EAAU,QAAQ,QAAQ,CAACC,GAAQ1L,MAAU;AAC3C,UAAMwE,IAAO,uBAAuBxE,CAAK;AACzC,QAAI,CAACgF,EAAS0G,CAAM;AAClB,aAAO,KAAKpH,EAAO,KAAKS,EAAM,qBAAqB,cAAcP,CAAI,CAAC;AACxE,IAAAS;AAAA,MACEyG;AAAA,MACA,CAAC,UAAU,SAAS,SAAS;AAAA,MAC7BlH;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,IAGA,CAAC,CAAC,UAAU,SAAS,OAAO,EAAE,SAAS,OAAOoH,EAAO,MAAM,CAAC,KAC5D,OAAOA,EAAO,SAAU,YACxB,OAAOA,EAAO,WAAY,cAE1BpH,EAAO,KAAKS,EAAM,2BAA2B,cAAcP,CAAI,CAAC;AAAA,EAEpE,CAAC;AACH;AAEA,SAASsG,GAAkB1K,GAA4BkE,GAAoC;AACzF,MAAI,CAAC,MAAM,QAAQlE,EAAS,SAAS,GAAG;AACtC,IAAAkE,EAAO,KAAKS,EAAM,aAAa,aAAa,aAAa,CAAC;AAC1D;AAAA,EACF;AACA,QAAM4G,wBAAY,IAAA;AAClB,EAAAvL,EAAS,UAAU,QAAQ,CAACyE,GAAU7E,MAAU;AAC9C,UAAMwE,IAAO,eAAexE,CAAK;AACjC,QAAI,CAACgF,EAASH,CAAQ,EAAG,QAAO,KAAKP,EAAO,KAAKS,EAAM,YAAY,WAAWP,CAAI,CAAC;AACnF,IAAAS;AAAA,MACEJ;AAAA,MACA,CAAC,MAAM,QAAQ,QAAQ,aAAa,cAAc;AAAA,MAClDL;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,GAEE,CAACsH,EAAW/G,EAAS,IAAI,KAAK8G,EAAM,IAAI9G,EAAS,IAAI,IACvDP,EAAO,KAAKS,EAAM,iBAAiB,mBAAmB,GAAGP,CAAI,OAAO,CAAC,IAClEmH,EAAM,IAAI9G,EAAS,IAAI,IAE1B,OAAOA,EAAS,MAAO,YACvB,CAACA,EAAS,MACV,OAAOA,EAAS,QAAS,YACzB,CAACA,EAAS,SAEVP,EAAO,KAAKS,EAAM,qBAAqB,eAAeP,CAAI,CAAC,GACxD,CAAC,UAAU,UAAU,WAAW,QAAQ,QAAQ,EAAE,SAAS,OAAOK,EAAS,SAAS,CAAC,KACxFP,EAAO,KAAKS,EAAM,iBAAiB,WAAW,GAAGP,CAAI,YAAY,CAAC;AAAA,EACtE,CAAC;AACH;AAEA,SAASuG,GAAoB3K,GAA4BkE,GAAoC;AAC3F,MAAI,CAAC,MAAM,QAAQlE,EAAS,WAAW,GAAG;AACxC,IAAAkE,EAAO,KAAKS,EAAM,gBAAgB,cAAc,eAAe,CAAC;AAChE;AAAA,EACF;AACA,QAAM4G,wBAAY,IAAA,GACZjH,IAAW,IAAI;AAAA,IACnB,MAAM,QAAQtE,EAAS,YAAY,MAAM,IACrCA,EAAS,WAAW,OAAO,IAAI,CAACxC,MAAUA,EAAM,EAAE,IAClD,CAAA;AAAA,EAAC,GAEDgH,IAAgB,IAAI;AAAA,KACvB,MAAM,QAAQxE,EAAS,SAAS,IAAIA,EAAS,YAAY,CAAA,GAAI,IAAI,CAACyE,MAAaA,EAAS,IAAI;AAAA,EAAA;AAE/F,EAAAzE,EAAS,YAAY,QAAQ,CAACyL,GAAY7L,MAAU;AAClD,UAAMwE,IAAO,iBAAiBxE,CAAK;AACnC,QAAI,CAACgF,EAAS6G,CAAU;AACtB,aAAO,KAAKvH,EAAO,KAAKS,EAAM,eAAe,YAAYP,CAAI,CAAC;AAChE,IAAAS;AAAA,MACE4G;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEFrH;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,GAEE,CAACsH,EAAWC,EAAW,IAAI,KAAKF,EAAM,IAAIE,EAAW,IAAI,IAC3DvH,EAAO,KAAKS,EAAM,oBAAoB,oBAAoB,GAAGP,CAAI,OAAO,CAAC,IACtEmH,EAAM,IAAIE,EAAW,IAAI;AAC9B,eAAWrM,KAAO,CAAC,MAAM,QAAQ,YAAY,UAAU;AACrD,OAAI,OAAOqM,EAAWrM,CAAG,KAAM,YAAY,CAACqM,EAAWrM,CAAG,MACxD8E,EAAO,KAAKS,EAAM,wBAAwB,GAAGvF,CAAG,SAAS,GAAGgF,CAAI,IAAIhF,CAAG,EAAE,CAAC;AAE9E,IACEqM,EAAW,mBAAmB,WAC7B,CAAC,OAAO,UAAUA,EAAW,cAAc,KAAKA,EAAW,iBAAiB,MAE7EvH,EAAO,KAAKS,EAAM,wBAAwB,eAAe,GAAGP,CAAI,iBAAiB,CAAC,GAEpFsH;AAAA,MACED,EAAW;AAAA,MACX,GAAGrH,CAAI;AAAA,MACP;AAAA,MACAE;AAAA,MACAE;AAAA,MACAN;AAAA,IAAA,GAEFwH;AAAA,MACED,EAAW;AAAA,MACX,GAAGrH,CAAI;AAAA,MACP;AAAA,MACAE;AAAA,MACAE;AAAA,MACAN;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAEA,SAASwH,GACPvM,GACAiF,GACAuH,GACArH,GACAE,GACAN,GACM;AACN,MAAI,CAAC,MAAM,QAAQ/E,CAAM;AACvB,WAAO,KAAK+E,EAAO,KAAKS,EAAM,uBAAuB,WAAWP,CAAI,CAAC;AACvE,EAAAjF,EAAO,QAAQ,CAACyM,GAAShM,MAAU;AACjC,UAAMiM,IAAW,GAAGzH,CAAI,IAAIxE,CAAK;AACjC,QAAI,CAACgF,EAASgH,CAAO;AACnB,aAAO,KAAK1H,EAAO,KAAKS,EAAM,uBAAuB,YAAYkH,CAAQ,CAAC;AAe5E,QAdAhH;AAAA,MACE+G;AAAA,MACA,CAAC,UAAU,QAAQ;AAAA,MACnBC;AAAA,MACA;AAAA,MACA3H;AAAA,IAAA,IAGA,OAAO0H,EAAQ,UAAW,YAC1B,CAACA,EAAQ,UACT,OAAOA,EAAQ,UAAW,YAC1B,CAACA,EAAQ,WAET1H,EAAO,KAAKS,EAAM,6BAA6B,eAAekH,CAAQ,CAAC,GACrE,OAAOD,EAAQ,UAAW,YAAY,OAAOA,EAAQ,UAAW,SAAU;AAC9E,UAAME,IAAYH,MAAc,UAAUC,EAAQ,SAASA,EAAQ,QAC7DG,IAAaJ,MAAc,UAAUC,EAAQ,SAASA,EAAQ;AACpE,IAAKJ,EAAWO,CAAU,KACxB7H,EAAO;AAAA,MACLS;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAGkH,CAAQ,IAAIF,MAAc,UAAU,WAAW,QAAQ;AAAA,MAAA;AAAA,IAC5D;AAGJ,UAAMK,IAAgBF,EAAU,WAAW,QAAQ,IAC/C,UACAA,EAAU,WAAW,WAAW,IAC9B,aACA,WACAG,IAAgBH,EAAU,MAAMA,EAAU,QAAQ,GAAG,IAAI,CAAC;AAChE,IAAIE,MAAkB,YACpB9H,EAAO;AAAA,MACLS;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAGkH,CAAQ,IAAIF,MAAc,UAAU,WAAW,QAAQ;AAAA,MAAA;AAAA,IAC5D,KAGDK,MAAkB,WAAW,CAAC1H,EAAS,IAAI2H,CAAa,KACxDD,MAAkB,cAAc,CAACxH,EAAc,IAAIyH,CAAa,MAEjE/H,EAAO;AAAA,MACLS;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAGkH,CAAQ,IAAIF,MAAc,UAAU,WAAW,QAAQ;AAAA,MAAA;AAAA,IAC5D;AAAA,EAGN,CAAC;AACH;AAEA,SAASf,GAAa5K,GAA4BkE,GAAoC;AACpF,QAAMgI,IAAOlM,EAAS;AACtB,MAAI,CAAC4E,EAASsH,CAAI,EAAG,QAAO,KAAKhI,EAAO,KAAKS,EAAM,QAAQ,cAAc,QAAQ,CAAC;AAClF,EAAAE;AAAA,IACEqH;AAAA,IACA,CAAC,WAAW,iBAAiB,WAAW,SAAS;AAAA,IACjD;AAAA,IACA;AAAA,IACAhI;AAAA,EAAA,IAGA,OAAOgI,EAAK,WAAY,aACxB,CAACC,GAAOD,EAAK,aAAa,KAC1B,CAAC,MAAM,QAAQA,EAAK,OAAO,KAC3B,CAAC,MAAM,QAAQA,EAAK,OAAO,MAE3BhI,EAAO,KAAKS,EAAM,cAAc,cAAc,QAAQ,CAAC,GACrD,MAAM,QAAQuH,EAAK,OAAO,KAAKA,EAAK,QAAQ,KAAK,CAACtO,MAAS,CAACuO,GAAOvO,CAAI,CAAC,KAC1EsG,EAAO,KAAKS,EAAM,eAAe,wBAAwB,gBAAgB,CAAC,GACxE,MAAM,QAAQuH,EAAK,OAAO,KAAK,IAAI,IAAIA,EAAK,OAAO,EAAE,SAASA,EAAK,QAAQ,UAC7EhI,EAAO,KAAKS,EAAM,yBAAyB,eAAe,gBAAgB,CAAC,GAEzE,MAAM,QAAQuH,EAAK,OAAO,KAAK,CAACA,EAAK,QAAQ,SAASA,EAAK,aAAa,KAC1EhI,EAAO,KAAKS,EAAM,uBAAuB,iBAAiB,sBAAsB,CAAC;AAEnF,QAAMyH,wBAAW,IAAA;AACjB,EAAI,MAAM,QAAQF,EAAK,OAAO,KAC5BA,EAAK,QAAQ,QAAQ,CAACG,GAAOzM,MAAU;AACrC,UAAMwE,IAAO,kBAAkBxE,CAAK;AACpC,QAAI,CAACgF,EAASyH,CAAK;AACjB,aAAO,KAAKnI,EAAO,KAAKS,EAAM,cAAc,cAAcP,CAAI,CAAC;AACjE,IAAAS,EAAYwH,GAAO,CAAC,OAAO,QAAQ,GAAGjI,GAAM,+BAA+BF,CAAM,GAC7E,CAACsH,EAAWa,EAAM,GAAG,KAAKD,EAAK,IAAIC,EAAM,GAAG,IAC9CnI,EAAO,KAAKS,EAAM,kBAAkB,sBAAsB,GAAGP,CAAI,MAAM,CAAC,IACrEgI,EAAK,IAAIC,EAAM,GAAG,GAErB,CAACzH,EAASyH,EAAM,MAAM,KACtB,OAAO,OAAOA,EAAM,MAAM,EAAE,KAAK,CAAClR,MAAU,OAAOA,KAAU,QAAQ,IAErE+I,EAAO,KAAKS,EAAM,oBAAoB,eAAe,GAAGP,CAAI,SAAS,CAAC,IAEtE,MAAM,QAAQ8H,EAAK,OAAO,KAC1B,OAAO,KAAKG,EAAM,MAAM,EAAE,KAAK,CAACC,MAAgB,CAACJ,EAAK,QAAQ,SAASI,CAAW,CAAC,KAEnFpI,EAAO,KAAKS,EAAM,qBAAqB,cAAc,GAAGP,CAAI,SAAS,CAAC;AAAA,EAE1E,CAAC;AACL;AAEA,SAASyG,GAAsB1L,GAAiB+E,GAAoC;AAClF,MAAI,CAAC,MAAM,QAAQ/E,CAAM,EAAG;AAC5B,QAAMoM,wBAAY,IAAA;AAClB,EAAApM,EAAO,QAAQ,CAACoN,GAAQ3M,MAAU;AAChC,UAAMwE,IAAO,aAAaxE,CAAK;AAC/B,QAAI,CAACgF,EAAS2H,CAAM,EAAG,QAAO,KAAKrI,EAAO,KAAKS,EAAM,UAAU,cAAcP,CAAI,CAAC;AAClF,IAAAS;AAAA,MACE0H;AAAA,MACA,CAAC,QAAQ,QAAQ,eAAe,QAAQ;AAAA,MACxCnI;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,GAEE,CAACsH,EAAWe,EAAO,IAAI,KAAKhB,EAAM,IAAIgB,EAAO,IAAI,IACnDrI,EAAO,KAAKS,EAAM,eAAe,mBAAmB,GAAGP,CAAI,OAAO,CAAC,IAC9DmH,EAAM,IAAIgB,EAAO,IAAI,IACxB,OAAOA,EAAO,QAAS,YAAY,CAACA,EAAO,SAC7CrI,EAAO,KAAKS,EAAM,eAAe,YAAY,GAAGP,CAAI,OAAO,CAAC,GAEzD,CAAC,QAAQ,SAAS,UAAU,SAAS,UAAU,EAAE,SAAS,OAAOmI,EAAO,WAAW,CAAC,KACvFrI,EAAO,KAAKS,EAAM,kBAAkB,cAAc,GAAGP,CAAI,cAAc,CAAC,GAGxEmI,EAAO,gBAAgB,eACtB,OAAOA,EAAO,UAAW,YAAY,CAACf,EAAWe,EAAO,MAAM,MAE/DrI,EAAO,KAAKS,EAAM,iBAAiB,kBAAkB,GAAGP,CAAI,SAAS,CAAC;AAAA,EAE1E,CAAC;AACH;AAEA,SAAS4G,GAAiBhL,GAA4BkE,GAAoC;AACxF,MAAI,CAAC,MAAM,QAAQlE,EAAS,SAAS,QAAQ;AAC3C,WAAO,KAAKkE,EAAO,KAAKS,EAAM,YAAY,aAAa,qBAAqB,CAAC;AAC/E,QAAM4G,wBAAY,IAAA;AAClB,EAAAvL,EAAS,SAAS,SAAS,QAAQ,CAACc,GAASlB,MAAU;AACrD,UAAMwE,IAAO,uBAAuBxE,CAAK;AACzC,QAAI,CAACgF,EAAS9D,CAAO,EAAG,QAAO,KAAKoD,EAAO,KAAKS,EAAM,WAAW,aAAaP,CAAI,CAAC;AACnF,IAAAS;AAAA,MACE/D;AAAA,MACA,CAAC,MAAM,QAAQ,QAAQ,QAAQ,eAAe,SAAS,UAAU,mBAAmB,MAAM;AAAA,MAC1FsD;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,GAEE,CAACsH,EAAW1K,EAAQ,IAAI,KAAKyK,EAAM,IAAIzK,EAAQ,IAAI,IACrDoD,EAAO,KAAKS,EAAM,gBAAgB,mBAAmB,GAAGP,CAAI,OAAO,CAAC,IACjEmH,EAAM,IAAIzK,EAAQ,IAAI,IAEzB,OAAOA,EAAQ,MAAO,YACtB,CAACA,EAAQ,MACT,OAAOA,EAAQ,QAAS,YACxB,CAACA,EAAQ,SAEToD,EAAO,KAAKS,EAAM,oBAAoB,eAAeP,CAAI,CAAC,GACvD,CAAC,UAAU,QAAQ,EAAE,SAAS,OAAOtD,EAAQ,IAAI,CAAC,KACrDoD,EAAO,KAAKS,EAAM,gBAAgB,WAAW,GAAGP,CAAI,OAAO,CAAC,GACzD,CAAC,cAAc,oBAAoB,EAAE,SAAS,OAAOtD,EAAQ,WAAW,CAAC,KAC5EoD,EAAO,KAAKS,EAAM,mBAAmB,cAAc,GAAGP,CAAI,cAAc,CAAC,IAEzE,OAAOtD,EAAQ,SAAU,YACzB,CAAC,OAAO,SAASA,EAAQ,KAAK,KAC9BA,EAAQ,QAAQ,OAChBA,EAAQ,QAAQ,SAEhBoD,EAAO,KAAKS,EAAM,iBAAiB,oBAAoB,GAAGP,CAAI,QAAQ,CAAC,GACpE,CAAC,SAAS,QAAQ,SAAS,QAAQ,OAAO,EAAE,SAAS,OAAOtD,EAAQ,MAAM,CAAC,KAC9EoD,EAAO,KAAKS,EAAM,kBAAkB,aAAa,GAAGP,CAAI,SAAS,CAAC,GAGjE,CAAC,WAAW,YAAY,YAAY,UAAU,EAAE,SAAS,OAAOtD,EAAQ,eAAe,CAAC,KAEzFoD,EAAO;AAAA,MACLS,EAAM,sBAAsB,iBAAiB,GAAGP,CAAI,kBAAkB;AAAA,IAAA,GAGrE,MAAM,QAAQtD,EAAQ,IAAI,KAC7BoD,EAAO,KAAKS,EAAM,gBAAgB,aAAa,GAAGP,CAAI,OAAO,CAAC;AAAA,EAClE,CAAC;AACH;AAEA,SAAS6G,GAAuBjL,GAA4BkE,GAAoC;AAC9F,QAAMsI,IAAY,IAAI;AAAA,KACnB,MAAM,QAAQxM,EAAS,UAAU,IAAIA,EAAS,aAAa,CAAA,GAAI,IAAI,CAACyM,MAASA,EAAK,IAAI;AAAA,EAAA;AAEzF,EAAAzM,EAAS,WAAW,OAAO,QAAQ,CAACxC,GAAOoC,MAAU;AACnD,UAAMwE,IAAO,uBAAuBxE,CAAK,cACnCyK,IAAW7M,EAAM;AACvB,QAAI,CAACoH,EAASyF,CAAQ;AACpB,aAAO,KAAKnG,EAAO,KAAKS,EAAM,kBAAkB,aAAaP,CAAI,CAAC;AA+BpE,QA9BAS;AAAA,MACEwF;AAAA,MACA,CAAC,cAAc,cAAc,mBAAmB,kBAAkB,eAAe;AAAA,MACjFjG;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,GAEG,CAAC,QAAQ,WAAW,SAAS,EAAE,SAAS,OAAOmG,EAAS,cAAc,CAAC,KAC1EnG,EAAO,KAAKS,EAAM,yBAAyB,aAAa,GAAGP,CAAI,iBAAiB,CAAC,GACnFsI;AAAA,MACErC,EAAS;AAAA,MACTrK;AAAA,MACA,GAAGoE,CAAI;AAAA,MACP5G,EAAM,eAAewC,EAAS,WAAW,WAAW;AAAA,MACpDkE;AAAA,IAAA,GAEFyI;AAAA,MACEtC,EAAS;AAAA,MACTrK;AAAA,MACA,GAAGoE,CAAI;AAAA,MACP5G,EAAM,eAAewC,EAAS,WAAW,WAAW;AAAA,MACpDkE;AAAA,IAAA,GAEF0I;AAAA,MACEvC,EAAS;AAAA,MACTrK;AAAA,MACA,GAAGoE,CAAI;AAAA,MACP5G,EAAM,eAAewC,EAAS,WAAW,WAAW;AAAA,MACpDkE;AAAA,IAAA,GAEE,CAACU,EAASyF,EAAS,aAAa;AAClC,MAAAnG,EAAO,KAAKS,EAAM,wBAAwB,eAAe,GAAGP,CAAI,gBAAgB,CAAC;AAAA,SAC9E;AACH,YAAMxF,IAAeZ,EAAsBR,EAAM,aAAa,GACxDyD,IAAU,IAAI;AAAA,QAClBrC,GAAc,mBAAmBiO,GAAuBrP,EAAM,aAAa;AAAA,MAAA;AAE7E,iBAAW,CAACsP,GAAOC,CAAQ,KAAK,OAAO,QAAQ1C,EAAS,aAAa;AACnE,QAAKpJ,EAAQ,IAAI6L,CAAc,KAC7B5I,EAAO;AAAA,UACLS;AAAAA,YACE;AAAA,YACA,GAAG/F,GAAc,QAAQpB,EAAM,KAAK,OAAOsP,CAAK;AAAA,YAChD,GAAG1I,CAAI,kBAAkB0I,CAAK;AAAA,UAAA;AAAA,QAChC,IAEA,OAAOC,KAAa,YAAY,CAACP,EAAU,IAAIO,CAAQ,MACzD7I,EAAO;AAAA,UACLS;AAAAA,YACE;AAAA,YACA;AAAA,YACA,GAAGP,CAAI,kBAAkB0I,CAAK;AAAA,UAAA;AAAA,QAChC;AAAA,IAGR;AAAA,EACF,CAAC;AACH;AAEA,SAASJ,GACPvN,GACAa,GACAoE,GACA4I,GACA9I,GACM;AACN,MAAI,CAAC,MAAM,QAAQ/E,CAAM;AACvB,WAAO,KAAK+E,EAAO,KAAKS,EAAM,eAAe,eAAeP,CAAI,CAAC;AACnE,EAAAjF,EAAO,QAAQ,CAACoG,GAAM3F,MAAU;AAC9B,UAAMiM,IAAW,GAAGzH,CAAI,IAAIxE,CAAK;AACjC,QAAI,CAACgF,EAASW,CAAI;AAChB,aAAO,KAAKrB,EAAO,KAAKS,EAAM,cAAc,eAAekH,CAAQ,CAAC;AACtE,IAAAhH;AAAA,MACEU;AAAA,MACA,CAAC,MAAM,UAAU,aAAa,iBAAiB,gBAAgB;AAAA,MAC/DsG;AAAA,MACA;AAAA,MACA3H;AAAA,IAAA,IAGA,CAAC,CAAC,WAAW,YAAY,UAAU,EAAE,SAAS,OAAOqB,EAAK,MAAM,CAAC,KACjE,OAAOA,EAAK,MAAO,YACnB,OAAOA,EAAK,iBAAkB,aAC7BA,EAAK,mBAAmB,UAAa,OAAOA,EAAK,kBAAmB,cAErErB,EAAO,KAAKS,EAAM,oBAAoB,eAAekH,CAAQ,CAAC,GAChE3H,EAAO;AAAA,MACL,GAAGC,EAA2BoB,EAAK,WAAWvF,GAAU,GAAG6L,CAAQ,cAAc;AAAA,QAC/E,iBAAAmB;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,EAEL,CAAC;AACH;AAEA,SAASL,GACPxN,GACAa,GACAoE,GACA4I,GACA9I,GACM;AACN,MAAI,CAAC,MAAM,QAAQ/E,CAAM;AACvB,WAAO,KAAK+E,EAAO,KAAKS,EAAM,eAAe,cAAcP,CAAI,CAAC;AAClE,EAAAjF,EAAO,QAAQ,CAACoG,GAAM3F,MAAU;AAC9B,UAAMiM,IAAW,GAAGzH,CAAI,IAAIxE,CAAK;AACjC,QAAI,CAACgF,EAASW,CAAI;AAChB,aAAO,KAAKrB,EAAO,KAAKS,EAAM,cAAc,cAAckH,CAAQ,CAAC;AACrE,UAAM5F,IACJV,EAAK,SAAS,YACV,CAAC,MAAM,QAAQ,cAAc,aAAa,iBAAiB,IAC3D,CAAC,MAAM,QAAQ,cAAc,WAAW;AAC9C,IAAAV,EAAYU,GAAMU,GAAa4F,GAAU,+BAA+B3H,CAAM,IAC1E,CAAC,CAAC,WAAW,SAAS,EAAE,SAAS,OAAOqB,EAAK,IAAI,CAAC,KAAK,OAAOA,EAAK,MAAO,aAC5ErB,EAAO,KAAKS,EAAM,oBAAoB,cAAckH,CAAQ,CAAC,GAE7DtG,EAAK,SAAS,aACd,CAAC,CAAC,UAAU,cAAc,SAAS,EAAE,SAAS,OAAOA,EAAK,eAAe,CAAC,KAE1ErB,EAAO;AAAA,MACLS,EAAM,+BAA+B,aAAa,GAAGkH,CAAQ,kBAAkB;AAAA,IAAA,GAGnF3H,EAAO;AAAA,MACL,GAAGC,EAA2BoB,EAAK,YAAYvF,GAAU,GAAG6L,CAAQ,eAAe;AAAA,QACjF,iBAAAmB;AAAA,MAAA,CACD;AAAA,IAAA,GAECzH,EAAK,cAAc,UACrBrB,EAAO;AAAA,MACL,GAAGC,EAA2BoB,EAAK,WAAWvF,GAAU,GAAG6L,CAAQ,cAAc;AAAA,QAC/E,iBAAAmB;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,EAEP,CAAC;AACH;AAEA,SAASJ,GACPzN,GACAa,GACAoE,GACA4I,GACA9I,GACM;AACN,MAAI,CAAC,MAAM,QAAQ/E,CAAM;AACvB,WAAO,KAAK+E,EAAO,KAAKS,EAAM,oBAAoB,aAAaP,CAAI,CAAC;AACtE,EAAAjF,EAAO,QAAQ,CAACoG,GAAM3F,MAAU;AAC9B,UAAMiM,IAAW,GAAGzH,CAAI,IAAIxE,CAAK;AACjC,QAAI,CAACgF,EAASW,CAAI;AAChB,aAAO,KAAKrB,EAAO,KAAKS,EAAM,mBAAmB,aAAakH,CAAQ,CAAC;AACzE,IAAAhH;AAAA,MACEU;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEFsG;AAAA,MACA;AAAA,MACA3H;AAAA,IAAA,IAGA,OAAOqB,EAAK,MAAO,YACnB,CAACA,EAAK,MACN,OAAOA,EAAK,QAAS,YACrB,OAAOA,EAAK,WAAY,aACxB,CAAC,CAAC,UAAU,QAAQ,QAAQ,EAAE,SAAS,OAAOA,EAAK,OAAO,CAAC,KAC3D,CAAC,CAAC,SAAS,SAAS,EAAE,SAAS,OAAOA,EAAK,QAAQ,CAAC,KACpD,OAAOA,EAAK,WAAY,YACxB,CAACX,EAASW,EAAK,aAAa,MAE5BrB,EAAO,KAAKS,EAAM,yBAAyB,aAAakH,CAAQ,CAAC,GAEhE;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,SAAS,OAAOtG,EAAK,IAAI,CAAC,KAE5BrB,EAAO,KAAKS,EAAM,wBAAwB,cAAc,GAAGkH,CAAQ,OAAO,CAAC,GACzEtG,EAAK,cAAc,UACrBrB,EAAO;AAAA,MACL,GAAGC,EAA2BoB,EAAK,WAAWvF,GAAU,GAAG6L,CAAQ,cAAc;AAAA,QAC/E,iBAAAmB;AAAA,MAAA,CACD;AAAA,IAAA,GAGHzH,EAAK,SAAS,WACdX,EAASW,EAAK,aAAa,KAC3B,CAAC0C,GAAgC,OAAO1C,EAAK,cAAc,WAAW,EAAE,CAAC,KAEzErB,EAAO;AAAA,MACLS,EAAM,oBAAoB,eAAe,GAAGkH,CAAQ,wBAAwB;AAAA,IAAA,GAE5EjH,EAASW,EAAK,aAAa,KAC7B0H;AAAA,MACE,OAAO1H,EAAK,IAAI;AAAA,MAChBA,EAAK;AAAA,MACLvF;AAAA,MACA,GAAG6L,CAAQ;AAAA,MACXmB;AAAA,MACA9I;AAAA,IAAA;AAAA,EAGN,CAAC;AACH;AAEA,SAAS+I,GACPxN,GACAvC,GACA8C,GACAoE,GACA4I,GACA9I,GACM;AAeN,QAAMkI,IAdoC;AAAA,IACxC,QAAQ,CAAC,WAAW,SAAS;AAAA,IAC7B,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,IACnB,QAAQ,CAAC,QAAQ;AAAA,IACjB,OAAO,CAAC,SAAS;AAAA,IACjB,MAAM,CAAC,WAAW,SAAS;AAAA,IAC3B,WAAW,CAAC,WAAW,SAAS;AAAA,IAChC,MAAM,CAAC,gBAAgB,iBAAiB,QAAQ;AAAA,IAChD,eAAe,CAAC,WAAW,UAAU;AAAA,IACrC,YAAY,CAAC,YAAY;AAAA,IACzB,UAAU,CAAC,eAAe,eAAe,aAAa;AAAA,IACtD,QAAQ,CAAC,YAAY,aAAa;AAAA,EAAA,EAEf3M,CAAI;AACzB,MAAK2M,GAgEL;AAAA,QA/DAvH,EAAY3H,GAAekP,GAAMhI,GAAM,6CAA6CF,CAAM,GACtFzE,MAAS,WAASyN,GAAoBhQ,GAAekH,GAAMF,CAAM,GACjE,CAAC,UAAU,WAAW,EAAE,SAASzE,CAAI,KACvC0N,GAAqBjQ,GAAekH,GAAM,GAAGF,CAAM,GAEjDzE,MAAS,eACX2N,GAAuBlQ,EAAc,OAAO,GAAG,GAAGkH,CAAI,UAAUF,CAAM,GAEpEzE,MAAS,WACPvC,EAAc,iBAAiB,UACjCkQ,GAAuBlQ,EAAc,cAAc,GAAG,GAAGkH,CAAI,iBAAiBF,CAAM,GAGpFhH,EAAc,kBAAkB,WAC/B,OAAOA,EAAc,iBAAkB,YACtC,CAAC,OAAO,SAASA,EAAc,aAAa,KAC5CA,EAAc,iBAAiB,MAEjCgH,EAAO;AAAA,MACLS,EAAM,kCAAkC,gBAAgB,GAAGP,CAAI,gBAAgB;AAAA,IAAA,GAG/ElH,EAAc,WAAW,UAAa,OAAOA,EAAc,UAAW,YACxEgH,EAAO;AAAA,MACLS,EAAM,kCAAkC,eAAe,GAAGP,CAAI,SAAS;AAAA,IAAA,IAIzE3E,MAAS,cACX0N;AAAA,MACE,EAAE,SAASjQ,EAAc,aAAa,SAASA,EAAc,YAAA;AAAA,MAC7DkH;AAAA,MACA;AAAA,MACAF;AAAA,MACA,EAAE,SAAS,eAAe,SAAS,cAAA;AAAA,IAAc,GAGjDzE,MAAS,UAAQ4N,GAAkBnQ,GAAekH,GAAMF,CAAM,GAEhEzE,MAAS,YACT,CAAC,CAAC,SAAS,SAAS,YAAY,EAAE,SAAS,OAAOvC,EAAc,MAAM,CAAC,KAEvEgH,EAAO,KAAKS,EAAM,kCAAkC,aAAa,GAAGP,CAAI,SAAS,CAAC,GAEhF3E,MAAS,oBACM,IAAI,IAAIO,EAAS,WAAW,OAAO,IAAI,CAACxC,MAAUA,EAAM,EAAE,CAAC,EAC9D,IAAI,OAAON,EAAc,OAAO,CAAC,KAC7CgH,EAAO,KAAKS,EAAM,sCAAsC,WAAW,GAAGP,CAAI,UAAU,CAAC,GAGrFlH,EAAc,aAAa,UAC3B,CAAC,CAAC,MAAM,MAAM,MAAM,OAAO,MAAM,KAAK,EAAE,SAAS,OAAOA,EAAc,QAAQ,CAAC,KAE/EgH,EAAO,KAAKS,EAAM,kCAAkC,YAAY,GAAGP,CAAI,WAAW,CAAC,IAGnF3E,MAAS,gBACXyE,EAAO;AAAA,MACL,GAAGC,EAA2BjH,EAAc,YAAY8C,GAAU,GAAGoE,CAAI,eAAe;AAAA,QACtF,iBAAA4I;AAAA,MAAA,CACD;AAAA,IAAA,GAGDvN,MAAS,YAAY;AAKvB,YAAMa,IAJQgN,GAAa;AAAA,QACzBtN,EAAS,SAAS;AAAA,QAClB,GAAGA,EAAS,SAAS,SAAS,IAAI,CAACc,MAAYA,EAAQ,IAAI;AAAA,MAAA,CAC5D,EACkB,IAAI,OAAO5D,EAAc,WAAW,CAAC;AACxD,OACEoD,GAAM,aAAa,eACnB,CAAC,CAAC,gBAAgB,gBAAgB,EAAE,SAASA,EAAK,aAAa,MAE/D4D,EAAO;AAAA,QACLS,EAAM,sCAAsC,WAAW,GAAGP,CAAI,cAAc;AAAA,MAAA;AAAA,IAGlF;AACA,IACE3E,MAAS,aACR,OAAOvC,EAAc,YAAa,YACjC,CAACA,EAAc,YACf,OAAOA,EAAc,eAAgB,YACrC,CAACA,EAAc,gBAEjBgH,EAAO,KAAKS,EAAM,kCAAkC,cAAcP,CAAI,CAAC;AAAA;AAE3E;AAEA,SAAS8I,GACPhQ,GACAkH,GACAF,GACM;AACN,aAAW9E,KAAO,CAAC,WAAW,SAAS,GAAY;AACjD,UAAMjE,IAAQ+B,EAAckC,CAAG;AAC/B,IAAIjE,MAAU,WAAc,OAAOA,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,MAC7E+I,EAAO;AAAA,MACLS,EAAM,kCAAkC,GAAGvF,CAAG,YAAY,GAAGgF,CAAI,IAAIhF,CAAG,EAAE;AAAA,IAAA;AAAA,EAGhF;AACA,EACE,OAAOlC,EAAc,WAAY,YACjC,OAAO,SAASA,EAAc,OAAO,KACrC,OAAOA,EAAc,WAAY,YACjC,OAAO,SAASA,EAAc,OAAO,KACrCA,EAAc,UAAUA,EAAc,WAEtCgH,EAAO,KAAKS,EAAM,kCAAkC,cAAcP,CAAI,CAAC;AAE3E;AAEA,SAAS+I,GACPjQ,GACAkH,GACAmJ,GACArJ,GACAkI,IAA6C,EAAE,SAAS,WAAW,SAAS,UAAA,GACtE;AACN,QAAMvM,IAAU3C,EAAc,SACxB4C,IAAU5C,EAAc;AAC9B,EAAI2C,MAAY,UACduN,GAAuBvN,GAAS0N,GAAgB,GAAGnJ,CAAI,IAAIgI,EAAK,OAAO,IAAIlI,CAAM,GAE/EpE,MAAY,UACdsN,GAAuBtN,GAASyN,GAAgB,GAAGnJ,CAAI,IAAIgI,EAAK,OAAO,IAAIlI,CAAM,GAE/E,OAAOrE,KAAY,YAAY,OAAOC,KAAY,YAAYD,IAAUC,KAC1EoE,EAAO,KAAKS,EAAM,kCAAkC,cAAcP,CAAI,CAAC;AAE3E;AAEA,SAASgJ,GACPjS,GACA0E,GACAuE,GACAF,GACM;AACN,GAAI,OAAO/I,KAAU,YAAY,CAAC,OAAO,UAAUA,CAAK,KAAKA,IAAQ0E,MACnEqE,EAAO,KAAKS,EAAM,kCAAkC,UAAU9E,CAAO,QAAQuE,CAAI,CAAC;AAEtF;AAEA,SAASiJ,GACPnQ,GACAkH,GACAF,GACM;AACN,QAAMrE,IAAU3C,EAAc,SACxB4C,IAAU5C,EAAc,SACxBsQ,IAAc3N,MAAY,SAAY,SAAY,KAAK,MAAM,OAAOA,CAAO,CAAC,GAC5E4N,IAAc3N,MAAY,SAAY,SAAY,KAAK,MAAM,OAAOA,CAAO,CAAC;AAClF,EAAID,MAAY,UAAa,CAAC,OAAO,SAAS2N,CAAW,KACvDtJ,EAAO,KAAKS,EAAM,kCAAkC,aAAa,GAAGP,CAAI,UAAU,CAAC,GAEjFtE,MAAY,UAAa,CAAC,OAAO,SAAS2N,CAAW,KACvDvJ,EAAO,KAAKS,EAAM,kCAAkC,aAAa,GAAGP,CAAI,UAAU,CAAC,GAGnFoJ,MAAgB,UAChBC,MAAgB,UAChB,OAAO,SAASD,CAAW,KAC3B,OAAO,SAASC,CAAW,KAC3BD,IAAcC,KAEdvJ,EAAO,KAAKS,EAAM,kCAAkC,gBAAgBP,CAAI,CAAC;AAE7E;AAEA,SAAS8G,GAAmBlL,GAA4BkE,GAAoC;AAC1F,MAAI,CAAC,MAAM,QAAQlE,EAAS,UAAU,GAAG;AACvC,IAAAkE,EAAO,KAAKS,EAAM,eAAe,YAAY,cAAc,CAAC;AAC5D;AAAA,EACF;AACA,QAAM4G,wBAAY,IAAA,GACZmC,IAAc,IAAI,IAAI1N,EAAS,SAAS,SAAS,IAAI,CAAC2N,MAAWA,EAAO,IAAI,CAAC,GAC7EC,IAAkB,IAAI,IAAI5N,EAAS,YAAY,IAAI,CAACb,MAAWA,EAAO,IAAI,CAAC,GAC3EmF,IAAW,IAAI,IAAItE,EAAS,WAAW,OAAO,IAAI,CAACxC,MAAUA,EAAM,EAAE,CAAC,GACtEgH,IAAgB,IAAI,IAAIxE,EAAS,UAAU,IAAI,CAACyE,MAAaA,EAAS,IAAI,CAAC,GAC3EoJ,IAAQ;AAAA,IACZ7N,EAAS,SAAS;AAAA,IAClB,GAAGA,EAAS,SAAS,SAAS,IAAI,CAACc,MAAYA,EAAQ,IAAI;AAAA,EAAA,GAEvDgN,IAAUR,GAAaO,CAAK,GAC5BE,IAAU,IAAI,IAAID,EAAQ,MAAM,GAChCE,IAAoBC,GAAyBJ,CAAK,GAClDtJ,IAAa,IAAI,IAAIvE,EAAS,WAAW,OAAO,IAAI,CAACxC,MAAU,CAACA,EAAM,IAAIA,CAAK,CAAC,CAAC;AACvF,EAAAwC,EAAS,WAAW,QAAQ,CAACyM,GAAM7M,MAAU;AAC3C,UAAMwE,IAAO,gBAAgBxE,CAAK;AAClC,QAAI,CAACgF,EAAS6H,CAAI,EAAG,QAAO,KAAKvI,EAAO,KAAKS,EAAM,cAAc,YAAYP,CAAI,CAAC;AAmBlF,QAlBAS;AAAA,MACE4H;AAAA,MACA,CAAC,MAAM,QAAQ,QAAQ,WAAW,WAAW,OAAO;AAAA,MACpDrI;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,GAEE,CAACsH,EAAWiB,EAAK,IAAI,KAAKlB,EAAM,IAAIkB,EAAK,IAAI,IAC/CvI,EAAO,KAAKS,EAAM,mBAAmB,oBAAoB,GAAGP,CAAI,OAAO,CAAC,IACrEmH,EAAM,IAAIkB,EAAK,IAAI,IAEtB,OAAOA,EAAK,MAAO,YACnB,CAACA,EAAK,MACN,OAAOA,EAAK,QAAS,YACrB,CAACA,EAAK,QACN,OAAOA,EAAK,WAAY,cAExBvI,EAAO,KAAKS,EAAM,uBAAuB,oBAAoBP,CAAI,CAAC,GAChE,CAACQ,EAAS6H,EAAK,OAAO;AACxB,MAAAvI,EAAO,KAAKS,EAAM,sBAAsB,cAAc,GAAGP,CAAI,UAAU,CAAC;AAAA,aACjEqI,EAAK,QAAQ,UAAU;AAC9B,MAAA5H;AAAA,QACE4H,EAAK;AAAA,QACL,CAAC,SAAS,OAAO;AAAA,QACjB,GAAGrI,CAAI;AAAA,QACP;AAAA,QACAF;AAAA,MAAA,GAGC,CAAC,eAAe,iBAAiB,gBAAgB,OAAO,EAAE;AAAA,QACzD,OAAOuI,EAAK,QAAQ,KAAK;AAAA,MAAA,KAG3BvI,EAAO,KAAKS,EAAM,sBAAsB,YAAY,GAAGP,CAAI,gBAAgB,CAAC;AAAA,aACrEqI,EAAK,QAAQ,UAAU;AAQhC,UAPA5H;AAAA,QACE4H,EAAK;AAAA,QACL,CAAC,SAAS,SAAS,QAAQ;AAAA,QAC3B,GAAGrI,CAAI;AAAA,QACP;AAAA,QACAF;AAAA,MAAA,GAGA,CAAC,CAAC,UAAU,QAAQ,SAAS,OAAO,EAAE,SAAS,OAAOuI,EAAK,QAAQ,KAAK,CAAC,KACzE,OAAOA,EAAK,QAAQ,UAAW,YAC/B,CAACsB,EAAQ,IAAItB,EAAK,QAAQ,MAAM;AAEhC,QAAAvI,EAAO,KAAKS,EAAM,sBAAsB,gBAAgB,GAAGP,CAAI,UAAU,CAAC;AAAA,WACvE;AACH,cAAM9D,IAAOwN,EAAQ,IAAIrB,EAAK,QAAQ,MAAM,GACtCxO,IACJqC,GAAM,aAAa,UACfiE,EAAW,IAAIjE,EAAK,OAAO,GAAG,gBAC9BA,GAAM;AAEZ,SADqBrC,IAAgBD,EAAsBC,CAAa,IAAI,SACzD,iBAAiB,SAASwO,EAAK,QAAQ,KAAc,KACtEvI,EAAO;AAAA,UACLS;AAAAA,YACE;AAAA,YACA;AAAA,YACA,GAAGP,CAAI;AAAA,UAAA;AAAA,QACT;AAAA,MAGN;AAAA,WACY,KAAKO,EAAM,sBAAsB,aAAa,GAAGP,CAAI,gBAAgB,CAAC;AACpF,IAAA8J;AAAA,MACEzB,EAAK;AAAA,MACLzM;AAAA,MACA,GAAGoE,CAAI;AAAA,MACP;AAAA,MACAqI,EAAK,QAAQ,UAAU,eAAeuB,EAAkB,IAAIvB,EAAK,QAAQ,MAAM;AAAA,MAC/E;AAAA,QACE,aAAAiB;AAAA,QACA,iBAAAE;AAAA,QACA,UAAAtJ;AAAA,QACA,eAAAE;AAAA,QACA,6BAAa,IAAA;AAAA,QACb,+BAAe,IAAA;AAAA,MAAY;AAAA,MAE7BN;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAEA,SAASgK,GACP/O,GACAa,GACAoE,GACAP,GACAmJ,GACAmB,GAQAjK,GACM;AACN,MAAI,CAAC,MAAM,QAAQ/E,CAAM;AACvB,WAAO,KAAK+E,EAAO,KAAKS,EAAM,eAAe,aAAaP,CAAI,CAAC;AACjE,MAAIP,IAAQ,GAAI,QAAO,KAAKK,EAAO,KAAKS,EAAM,eAAe,eAAeP,CAAI,CAAC;AACjF,EAAAjF,EAAO,QAAQ,CAACiP,GAAMxO,MAAU;AAC9B,UAAMiM,IAAW,GAAGzH,CAAI,IAAIxE,CAAK;AACjC,QAAI,CAACgF,EAASwJ,CAAI;AAChB,aAAO,KAAKlK,EAAO,KAAKS,EAAM,cAAc,aAAakH,CAAQ,CAAC;AACpE,QAAIuC,EAAK,aAAa,UAAU;AAC9B,MAAAvJ;AAAA,QACEuJ;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEFvC;AAAA,QACA;AAAA,QACA3H;AAAA,MAAA,GAEE,OAAOkK,EAAK,MAAO,YAAY,CAACA,EAAK,MAAMD,EAAW,QAAQ,IAAIC,EAAK,EAAE,IAC3ElK,EAAO,KAAKS,EAAM,iBAAiB,qBAAqB,GAAGkH,CAAQ,KAAK,CAAC,IACpEsC,EAAW,QAAQ,IAAIC,EAAK,EAAE,IAEnC,OAAOA,EAAK,QAAS,YACrB,CAACA,EAAK,QACN,CAACC,GAAgBD,EAAK,UAAU,KAChC,CAACxJ,EAASwJ,EAAK,aAAa,KAC5B,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,OAAOA,EAAK,YAAY,CAAC,KACrD,CAAC,CAAC,QAAQ,UAAU,EAAE,SAAS,OAAOA,EAAK,OAAO,CAAC,MAEnDlK,EAAO,KAAKS,EAAM,sBAAsB,aAAakH,CAAQ,CAAC,GAC5DuC,EAAK,UAAU,UACjBlK,EAAO;AAAA,QACL,GAAGC,EAA2BiK,EAAK,OAAOpO,GAAU,GAAG6L,CAAQ,UAAU;AAAA,UACvE,iBAAAmB;AAAA,QAAA,CACD;AAAA,MAAA,GAEDpI,EAASwJ,EAAK,aAAa,KAC7BE;AAAA,QACEF,EAAK;AAAA,QACLA,EAAK;AAAA,QACLpO;AAAA,QACA6L;AAAA,QACAmB;AAAA,QACAmB;AAAA,QACAjK;AAAA,MAAA;AAEJ;AAAA,IACF;AACA,QAAIkK,EAAK,aAAa,aAAa;AAQjC,UAPAvJ;AAAA,QACEuJ;AAAA,QACA,CAAC,MAAM,YAAY,QAAQ,YAAY,WAAW;AAAA,QAClDvC;AAAA,QACA;AAAA,QACA3H;AAAA,MAAA,GAEE,CAAC,MAAM,QAAQkK,EAAK,QAAQ,KAAK,CAAC,MAAM,QAAQA,EAAK,SAAS;AAChE,eAAO,KAAKlK,EAAO,KAAKS,EAAM,yBAAyB,aAAakH,CAAQ,CAAC;AAC/E,MAAI,OAAOuC,EAAK,MAAO,YAAY,CAACA,EAAK,MAAMD,EAAW,QAAQ,IAAIC,EAAK,EAAE,IAC3ElK,EAAO,KAAKS,EAAM,iBAAiB,qBAAqB,GAAGkH,CAAQ,KAAK,CAAC,IACpEsC,EAAW,QAAQ,IAAIC,EAAK,EAAE,IACjC,OAAOA,EAAK,QAAS,YAAY,CAACA,EAAK,SACzClK,EAAO,KAAKS,EAAM,wBAAwB,cAAc,GAAGkH,CAAQ,OAAO,CAAC,GAE7EuC,EAAK,SAAS,QAAQ,CAACG,GAAQC,MAAgB;AAC7C,cAAMC,IAAa,GAAG5C,CAAQ,aAAa2C,CAAW;AACtD,YAAI,CAAC5J,EAAS2J,CAAM;AAClB,iBAAO,KAAKrK,EAAO,KAAKS,EAAM,gBAAgB,aAAa8J,CAAU,CAAC;AACxE,QAAA5J;AAAA,UACE0J;AAAA,UACA,CAAC,MAAM,QAAQ,aAAa,OAAO;AAAA,UACnCE;AAAA,UACA;AAAA,UACAvK;AAAA,QAAA,GAEE,OAAOqK,EAAO,MAAO,YAAY,CAACA,EAAO,MAAMJ,EAAW,UAAU,IAAII,EAAO,EAAE,IACnFrK,EAAO;AAAA,UACLS,EAAM,mBAAmB,qBAAqB,GAAG8J,CAAU,KAAK;AAAA,QAAA,IAE7DN,EAAW,UAAU,IAAII,EAAO,EAAE,IACrC,OAAOA,EAAO,QAAS,YAAY,CAACA,EAAO,SAC7CrK,EAAO,KAAKS,EAAM,qBAAqB,cAAc,GAAG8J,CAAU,OAAO,CAAC,GAE5EvK,EAAO;AAAA,UACL,GAAGC,EAA2BoK,EAAO,WAAWvO,GAAU,GAAGyO,CAAU,cAAc;AAAA,YACnF,iBAAAzB;AAAA,UAAA,CACD;AAAA,QAAA,GAEHkB;AAAA,UACEK,EAAO;AAAA,UACPvO;AAAA,UACA,GAAGyO,CAAU;AAAA,UACb5K,IAAQ;AAAA,UACRmJ;AAAA,UACAmB;AAAA,UACAjK;AAAA,QAAA;AAAA,MAEJ,CAAC,GACDgK;AAAA,QACEE,EAAK;AAAA,QACLpO;AAAA,QACA,GAAG6L,CAAQ;AAAA,QACXhI,IAAQ;AAAA,QACRmJ;AAAA,QACAmB;AAAA,QACAjK;AAAA,MAAA;AAEF;AAAA,IACF;AACA,IAAAA,EAAO,KAAKS,EAAM,mBAAmB,cAAc,GAAGkH,CAAQ,WAAW,CAAC;AAAA,EAC5E,CAAC;AACH;AAEA,SAASyC,GACP7O,GACAvC,GACA8C,GACAoE,GACA4I,GACAmB,GAQAjK,GACM;AAkBN,EAAAW;AAAA,IACE3H;AAAA,IAlByD;AAAA,MACzD,WAAW,CAAC,WAAW,SAAS,YAAY;AAAA,MAC5C,aAAa,CAAC,SAAS;AAAA,MACvB,YAAY,CAAC,iBAAiB,eAAe;AAAA,MAC7C,cAAc,CAAC,gBAAgB,SAAS,YAAY;AAAA,MACpD,UAAU,CAAA;AAAA,MACV,QAAQ,CAAA;AAAA,MACR,OAAO,CAAA;AAAA,MACP,OAAO,CAAA;AAAA,MACP,SAAS,CAAC,WAAW,OAAO;AAAA,MAC5B,aAAa,CAAC,YAAY;AAAA,MAC1B,gBAAgB,CAAC,YAAY;AAAA,MAC7B,eAAe,CAAC,YAAY;AAAA,MAC5B,mBAAmB,CAAC,gBAAgB,eAAe;AAAA,MACnD,qBAAqB,CAAC,gBAAgB;AAAA,MACtC,aAAa,CAAC,YAAY;AAAA,IAAA,EAIlBuC,CAAI;AAAA,IACZ,GAAG2E,CAAI;AAAA,IACP;AAAA,IACAF;AAAA,EAAA;AAEF,QAAMwK,IACJjP,MAAS,eACL,CAAC,iBAAiB,eAAe,IACjC,CAAC,aAAa,aAAa,EAAE,SAASA,CAAI,IACxC,CAAC,SAAS,IACV,CAAA;AACR,aAAWL,KAAOsP;AAChB,IAAKP,EAAW,SAAS,IAAI,OAAOjR,EAAckC,CAAG,CAAC,CAAC,KACrD8E,EAAO;AAAA,MACLS,EAAM,sBAAsB,eAAe,GAAGP,CAAI,kBAAkBhF,CAAG,EAAE;AAAA,IAAA;AAE/E,EAAIK,MAAS,kBAAkB,CAAC0O,EAAW,cAAc,IAAI,OAAOjR,EAAc,YAAY,CAAC,KAC7FgH,EAAO;AAAA,IACLS;AAAAA,MACE;AAAA,MACA;AAAA,MACA,GAAGP,CAAI;AAAA,IAAA;AAAA,EACT,GAGF,CAAC,eAAe,kBAAkB,eAAe,EAAE,SAAS3E,CAAI,KAChE,CAAC0O,EAAW,YAAY,IAAI,OAAOjR,EAAc,UAAU,CAAC,KAE5DgH,EAAO;AAAA,IACLS,EAAM,uBAAuB,eAAe,GAAGP,CAAI,2BAA2B;AAAA,EAAA,GAGhF3E,MAAS,yBACT,CAAC0O,EAAW,gBAAgB,IAAI,OAAOjR,EAAc,cAAc,CAAC,KAEpEgH,EAAO;AAAA,IACLS;AAAAA,MACE;AAAA,MACA;AAAA,MACA,GAAGP,CAAI;AAAA,IAAA;AAAA,EACT,GAEA,CAAC,aAAa,cAAc,EAAE,SAAS3E,CAAI,KAAKvC,EAAc,eAAe,UAC/EgH,EAAO;AAAA,IACL,GAAGC;AAAA,MACDjH,EAAc;AAAA,MACd8C;AAAA,MACA,GAAGoE,CAAI;AAAA,MACP;AAAA,QACE,iBAAA4I;AAAA,MAAA;AAAA,IACF;AAAA,EACF,GAIFvN,MAAS,cACR,OAAOvC,EAAc,WAAY,YAChC,CAACA,EAAc,WACf,CAAC,CAAC,WAAW,QAAQ,WAAW,OAAO,EAAE,SAAS,OAAOA,EAAc,KAAK,CAAC,MAE/EgH,EAAO,KAAKS,EAAM,wBAAwB,cAAc,GAAGP,CAAI,gBAAgB,CAAC,GAGhF3E,MAAS,wBACR,CAAC+L,EAAWtO,EAAc,YAAY,KACpCA,EAAc,kBAAkB,UAC/B,OAAOA,EAAc,iBAAkB,cAE3CgH,EAAO;AAAA,IACLS,EAAM,yBAAyB,kBAAkB,GAAGP,CAAI,gBAAgB;AAAA,EAAA,GAGxE3E,MAAS,iBAAiB,CAAC+L,EAAWtO,EAAc,UAAU,KAChEgH,EAAO;AAAA,IACLS,EAAM,qBAAqB,gBAAgB,GAAGP,CAAI,2BAA2B;AAAA,EAAA;AAGnF;AAEA,SAASkJ,GAAaO,GAAgE;AACpF,QAAM3J,wBAAa,IAAA,GACbvD,IAAQ,CAACC,MACbA,EAAM,QAAQ,CAACN,MAAS;AACtB,IAAA4D,EAAO,IAAI5D,EAAK,IAAIA,CAAI,GACpBA,EAAK,aAAa,eAAaA,EAAK,MAAM,QAAQ,CAACO,MAASF,EAAME,EAAK,QAAQ,CAAC;AAAA,EACtF,CAAC;AACH,SAAAgN,EAAM,QAAQlN,CAAK,GACZuD;AACT;AAEA,SAAS+J,GAAyBJ,GAA4C;AAC5E,QAAM3J,wBAAa,IAAA,GACbvD,IAAQ,CAACC,GAA6B+N,MAC1C/N,EAAM,QAAQ,CAACN,MAAS;AACtB,UAAMsO,IACJD,KACCrO,EAAK,aAAa,eACjB,CAAC,gBAAgB,gBAAgB,EAAE,SAASA,EAAK,aAAa;AAClE,IAAIqO,KAAgBzK,EAAO,IAAI5D,EAAK,EAAE,GAClCA,EAAK,aAAa,eACpBA,EAAK,MAAM,QAAQ,CAACO,MAASF,EAAME,EAAK,UAAU+N,CAAqB,CAAC;AAAA,EAE5E,CAAC;AACH,SAAAf,EAAM,QAAQ,CAACzM,MAAST,EAAMS,GAAM,EAAK,CAAC,GACnC8C;AACT;AAEA,SAAS2I,GAAuB5O,GAAmE;AACjG,SAAIA,MAAkB,+BAAqB,IAAI,CAAC,OAAO,CAAC,wBAC7C,IAAI,CAAC,UAAU,QAAQ,OAAO,CAAC;AAC5C;AAEA,SAASoQ,GAAgBlT,GAAyB;AAChD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,SAAS,OAAOA,CAAK,CAAC;AAC1B;AAEA,SAASqQ,EAAWrQ,GAAiC;AACnD,SAAO,OAAOA,KAAU,YAAY,+BAA+B,KAAKA,CAAK;AAC/E;AAEA,SAASgR,GAAOhR,GAAiC;AAC/C,SAAO,OAAOA,KAAU,YAAY,wCAAwC,KAAKA,CAAK;AACxF;AAEA,SAAS0J,EACP1F,GACA8G,GACA7B,GACA8B,GACAhC,GACM;AACN,QAAMjD,IAAU,IAAI,IAAIgF,CAAW;AACnC,aAAW7G,KAAO,OAAO,KAAKD,CAAM;AAClC,IAAK8B,EAAQ,IAAI7B,CAAG,OAAU,KAAKuF,EAAMuB,GAAM,SAAS9G,CAAG,IAAI,GAAGgF,CAAI,IAAIhF,CAAG,EAAE,CAAC;AACpF;AAEA,SAASuF,EAAMuB,GAAcC,GAAiB/B,GAAkC;AAC9E,SAAO,EAAE,UAAU,SAAS,MAAA8B,GAAM,SAAAC,GAAS,MAAA/B,EAAA;AAC7C;AAEA,SAASgH,GAAwBjQ,GAAoC;AACnE,SAAO,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,IAAIA,IAAQ;AACvE;AAEA,SAASyJ,EAASzJ,GAAkD;AAClE,SAAO,OAAOA,KAAU,YAAYA,MAAU,QAAQ,CAAC,MAAM,QAAQA,CAAK;AAC5E;AC93CO,MAAM0T,IAA8B,gCAErCC,IAA2B,oBAAI,IAAI,CAAC,gBAAgB,gBAAgB,CAAC;AAWpE,SAASC,GAA8B3Q,GAA8C;AAC1F,SAAO;AAAA,IACL,YAAY;AAAA,MACV,IAAI4Q,EAAiB,QAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM5Q,KAAQ;AAAA,IAAA;AAAA,IAEhB,WAAW,CAAA;AAAA,IACX,QAAQ,CAAA;AAAA,EAAC;AAEb;AAOO,SAAS6Q,GAA2BjP,GAAkC;AAC3E,QAAMkP,IAASlP,EAAS;AACxB,MAAI,CAACkP,KAAU,CAAC,MAAM,QAAQA,EAAO,MAAM,EAAG;AAC9C,QAAMC,IAAYD;AAClB,EAAM,gBAAgBC,MACpBD,EAAO,aAAaH,GAA8B/O,EAAS,IAAI,EAAE,aAE7D,eAAemP,MAAYD,EAAO,YAAY,CAAA;AACpD,QAAME,IAAY,MAAM,QAAQF,EAAO,SAAS,IAAIA,EAAO,YAAY,CAAA,GACjEG,IAAiBD,EAAU,OAAOE,EAAmB;AAI3D,MAHAD,EAAe,QAAQ,CAACE,MAAa;AACnC,IAAKA,EAAS,aAAUA,EAAS,WAAW;AAAA,EAC9C,CAAC,GACG,CAACC,GAAaN,EAAO,UAAU,EAAG;AACtC,EAAAA,EAAO,OAAO,QAAQ,CAAC1R,GAAOoC,MAAU;AACtC,IAAKpC,EAAM,eAAYA,EAAM,aAAa0R,EAAO,WAAW,OACxD,OAAO1R,EAAM,cAAe,gBAAiB,aAAa,KAC1D,OAAOA,EAAM,eAAgB,gBAAiB,cAAc,KAC3D,OAAO,SAASA,EAAM,YAAY,QAAS,eAAeoC;AAAA,EACjE,CAAC;AAED,QAAM6P,IAAgB,IAAI,IAAIJ,EAAe,IAAI,CAACE,MAAaA,EAAS,IAAI,CAAC,GACvEG,wBAAkB,IAAI;AAAA,IAC1BR,EAAO,WAAW;AAAA,IAClB,GAAGG,EAAe,IAAI,CAACE,MAAaA,EAAS,YAAY,IAAI;AAAA,EAAA,CAC9D;AACD,MAAII,IAAiB;AACrBC,EAAAA,GAAU5P,EAAS,SAAS,MAAM,CAACM,MAAS;AAC1C,QAAIA,EAAK,aAAa,eAAe,CAACwO,EAAyB,IAAIxO,EAAK,aAAa,EAAG;AACxF,UAAMuP,IACJ,OAAOvP,EAAK,cAAc,gBAAiB,YAC3CuO,EAA4B,KAAKvO,EAAK,cAAc,YAAY,IAC5DA,EAAK,cAAc,eACnB;AACN,QAAIiP,IAAWM,IACXR,EAAe,KAAK,CAACzR,MAASA,EAAK,SAASiS,CAAc,IAC1D;AAEJ,QAAI,GAACN,KAAYjP,EAAK,wBAAwB,IAC9C;AAAA,UAAI,CAACiP,GAAU;AACb,cAAMO,IACJD,KAAkBE,GAAiBb,EAAO,WAAW,MAAMO,GAAeE,CAAc;AAC1F,eAAOF,EAAc,IAAI,GAAGP,EAAO,WAAW,IAAI,WAAWS,CAAc,EAAE;AAC3E,UAAAA,KAAkB;AACpB,cAAMK,IAAYC,GAAoBP,GAAaC,CAAc;AACjE,QAAAJ,IAAW;AAAA,UACT,IAAIP,EAAiB,UAAU;AAAA,UAC/B,MAAMc;AAAA,UACN,MAAMI,GAAc5P,CAAI,KAAK,QAAQqP,CAAc;AAAA,UACnD,gBAAgBT,EAAO,WAAW;AAAA,UAClC,aAAa;AAAA,YACX,IAAIF,EAAiB,QAAQ;AAAA,YAC7B,MAAMgB;AAAA,YACN,MAAME,GAAc5P,CAAI,KAAK,QAAQqP,CAAc;AAAA,UAAA;AAAA,UAErD,UAAU;AAAA,QAAA,GAEZP,EAAU,KAAKG,CAAQ,GACvBF,EAAe,KAAKE,CAAQ,GAC5BE,EAAc,IAAIF,EAAS,IAAI,GAC/BG,EAAY,IAAIH,EAAS,YAAY,IAAI,GACzCI,KAAkB;AAAA,MACpB;AACA,MAAArP,EAAK,cAAc,eAAeiP,EAAS,MACvCjP,EAAK,uBAAuB,MAAGA,EAAK,uBAAuB;AAC/D,iBAAWO,KAAQP,EAAK;AACtB,mBAAW6P,KAAStP,EAAK,UAAU;AACjC,cAAIsP,EAAM,aAAa,QAAS;AAChC,gBAAM3S,IAAQ0R,EAAO,OAAO,KAAK,CAACtR,MAASA,EAAK,OAAOuS,EAAM,OAAO;AACpE,UAAI3S,MAAOA,EAAM,aAAa+R,EAAS,YAAY;AAAA,QACrD;AAAA;AAAA,EAEJ,CAAC;AACH;AAOO,SAASa,GACdjR,GACAkR,GAC8B;AAC9B,QAAMrQ,IAAWsQ,GAAcnR,CAAM;AAErC,MADA8P,GAA2BjP,CAAQ,GAC/B,CAACqQ;AACH,WAAO;AAAA,MACL,UAAArQ;AAAA,MACA,gBAAgBuQ,GAAA;AAAA,MAChB,aAAa,CAAA;AAAA,MACb,aAAa;AAAA,IAAA;AAGjB,QAAMlM,IAAcmM,GAAyBH,CAAgB;AAC7D,MAAIhM,EAAY,KAAK,CAACzG,MAASA,EAAK,aAAa,OAAO;AACtD,WAAO;AAAA,MACL,UAAAoC;AAAA,MACA,gBAAgBuQ,GAAA;AAAA,MAChB,aAAAlM;AAAA,MACA,aAAa;AAAA,IAAA;AAGjB,QAAMoM,IACJ,CAACzQ,EAAS,WAAW,UACrBA,EAAS,WAAW,OAAO,WAAW,KACtCA,EAAS,WAAW,UAAU,WAAW,KACzCA,EAAS,SAAS,KAAK,WAAW;AACpC,EAAIyQ,KAAeC,GAAsB1Q,GAAUqQ,CAAgB;AACnE,QAAMM,IAAiBC,GAAyB5Q,GAAUqQ,CAAgB;AAC1E,SAAO,EAAE,UAAArQ,GAAU,gBAAA2Q,GAAgB,aAAAtM,GAAa,aAAaoM,EAAA;AAC/D;AAGO,SAASI,GACd7Q,GACAM,GACuC;AACvC,MAAI,CAACwO,EAAyB,IAAIxO,EAAK,aAAa,EAAG;AACvD,QAAMuP,IACJ,OAAOvP,EAAK,cAAc,gBAAiB,WAAWA,EAAK,cAAc,eAAe,IACpFwQ,IAAW9Q,EAAS,WAAW,UAAU;AAAA,IAC7C,CAACuP,MAAaA,EAAS,SAASM;AAAA,EAAA;AAElC,MAAIiB;AACF,WAAAxQ,EAAK,uBAAuB,GACrBwQ;AAET,QAAMnB,IAAiBoB,GAAmB/Q,CAAQ,GAC5CyP,IAAgB,IAAI,IAAIzP,EAAS,WAAW,UAAU,IAAI,CAACuP,MAAaA,EAAS,IAAI,CAAC,GACtFG,wBAAkB,IAAI;AAAA,IAC1B1P,EAAS,WAAW,WAAW;AAAA,IAC/B,GAAGA,EAAS,WAAW,UAAU,IAAI,CAACuP,MAAaA,EAAS,YAAY,IAAI;AAAA,EAAA,CAC7E,GACKA,IAAsC;AAAA,IAC1C,IAAIP,EAAiB,UAAU;AAAA,IAC/B,MAAMe,GAAiB/P,EAAS,WAAW,WAAW,MAAMyP,GAAeE,CAAc;AAAA,IACzF,MAAMO,GAAc5P,CAAI,KAAK,QAAQqP,CAAc;AAAA,IACnD,gBAAgB3P,EAAS,WAAW,WAAW;AAAA,IAC/C,aAAa;AAAA,MACX,IAAIgP,EAAiB,QAAQ;AAAA,MAC7B,MAAMiB,GAAoBP,GAAaC,CAAc;AAAA,MACrD,MAAMO,GAAc5P,CAAI,KAAK,QAAQqP,CAAc;AAAA,IAAA;AAAA,IAErD,UAAU;AAAA,EAAA;AAEZ,SAAA3P,EAAS,WAAW,UAAU,KAAKuP,CAAQ,GAC3CjP,EAAK,gBAAgB,EAAE,GAAGA,EAAK,eAAe,cAAciP,EAAS,KAAA,GACrEjP,EAAK,uBAAuB,GACrBiP;AACT;AAGO,SAASyB,GACdhR,GACAb,GACA8R,GACM;AACN,MAAI,CAACnC,EAAyB,IAAImC,EAAK,aAAa,EAAG;AACvD,QAAMC,IACJ,OAAO/R,EAAO,cAAc,gBAAiB,WAAWA,EAAO,cAAc,eAAe,IACxFgS,IAAiBnR,EAAS,WAAW,UAAU;AAAA,IACnD,CAACuP,MAAaA,EAAS,SAAS2B;AAAA,EAAA;AAElC,EAAAD,EAAK,gBAAgB,EAAE,GAAGA,EAAK,eAAe,cAAc,GAAA;AAC5D,QAAM1B,IAAWsB,GAA+B7Q,GAAUiR,CAAI;AAC9D,MAAK1B,GACL;AAAA,IAAI4B,MACF5B,EAAS,OAAO,GAAG4B,EAAe,IAAI,MACtC5B,EAAS,YAAY,OAAO,GAAG4B,EAAe,YAAY,IAAI;AAEhE,eAAWtQ,KAAQoQ,EAAK;AACtB,iBAAWd,KAAStP,EAAK,UAAU;AACjC,YAAIsP,EAAM,aAAa,QAAS;AAChC,cAAM3S,IAAQwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,OAAOuS,EAAM,OAAO;AACjF,QAAK3S,MACLA,EAAM,aAAa+R,EAAS,YAAY,MACxC/R,EAAM,gBAAgB,WACtBA,EAAM,aAAa,IACnBA,EAAM,cAAc,IACpB,OAAOA,EAAM;AAAA,MACf;AAAA;AAEJ;AAGO,SAAS4T,GACdpR,GACAqR,GACoB;AACpB,MAAI,CAACA,EAAa,QAAOrR,EAAS,WAAW,WAAW;AACxD,QAAM1C,IAAYgU,GAAStR,EAAS,SAAS,MAAMqR,CAAW;AAC9D,MAAI,CAAC/T,KAAaA,EAAU,aAAa,YAAa;AACtD,MAAI,CAACwR,EAAyB,IAAIxR,EAAU,aAAa;AACvD,WAAO0C,EAAS,WAAW,WAAW;AACxC,QAAM8P,IACJ,OAAOxS,EAAU,cAAc,gBAAiB,WAC5CA,EAAU,cAAc,eACxB;AACN,SAAO0C,EAAS,WAAW,UAAU,KAAK,CAACuP,MAAaA,EAAS,SAASO,CAAY,GAClF,YAAY;AAClB;AAGO,SAASyB,GACdvR,GACAxC,GACAgU,GACQ;AACR,QAAMC,IAAmBL,GAAgCpR,GAAUwR,CAAiB;AACpF,SAAKC,IACDjU,EAAM,eAAeiU,IAAyB,KAC3C,UAAUjU,EAAM,UAAU,WAAWiU,CAAgB,SAF9B;AAGhC;AAGO,SAASC,GAA2B9Q,GAA0C;AACnF,QAAMsD,wBAAa,IAAA;AACnB0L,SAAAA,GAAUhP,GAAO,CAACN,MAAS;AACzB,IAAIA,EAAK,aAAa,eAAe,CAACwO,EAAyB,IAAIxO,EAAK,aAAa,KACjF,OAAOA,EAAK,cAAc,gBAAiB,YAC7C4D,EAAO,IAAI5D,EAAK,cAAc,YAAY;AAAA,EAC9C,CAAC,GACM4D;AACT;AAGO,SAASyN,GACd/Q,GACAkP,GACoE;AACpE,aAAWxP,KAAQM;AACjB,QAAIN,EAAK,aAAa,aAAa;AACjC,UACEwO,EAAyB,IAAIxO,EAAK,aAAa,KAC/CA,EAAK,cAAc,iBAAiBwP;AAEpC,eAAOxP;AAET,iBAAWO,KAAQP,EAAK,OAAO;AAC7B,cAAMgB,IAAQqQ,GAA+B9Q,EAAK,UAAUiP,CAAY;AACxE,YAAIxO,EAAO,QAAOA;AAAA,MACpB;AAAA,IACF;AAGJ;AAGO,SAASsQ,GACd5R,GACAwF,GAC+B;AAC/B,MAAIqM,GAAc7R,EAAS,SAAS,MAAMwF,CAAO,EAAG;AACpD,QAAMhI,IAAQwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,OAAO4H,CAAO;AAC3E,MAAI,CAAChI,EAAO;AACZ,QAAMoB,IAAeZ,EAAsBR,EAAM,aAAa;AAC9D,MACE,CAACoB,KACDA,EAAa,aAAa,WAC1BA,EAAa,iBAAiB;AAE9B;AAEF,QAAM0B,IAA0B;AAAA,IAC9B,UAAU;AAAA,IACV,IAAI0O,EAAiB,MAAM;AAAA,IAC3B,SAASxR,EAAM;AAAA,IACf,QAAQ;AAAA,MACN,IAAI;AAAA,QACF,MAAMoB,EAAa;AAAA,QACnB,QAAQ;AAAA,QACR,WAAWA,EAAa;AAAA,QACxB,eAAe;AAAA,MAAA;AAAA,MAEjB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAWA,EAAa;AAAA,QACxB,eAAe;AAAA,MAAA;AAAA,IACjB;AAAA,EACF;AAEF,MAAIpB,EAAM,eAAewC,EAAS,WAAW,WAAW;AACtD,WAAAA,EAAS,SAAS,KAAK,KAAKM,CAAI,GACzBA;AAET,QAAMiP,IAAWvP,EAAS,WAAW,UAAU;AAAA,IAC7C,CAACpC,MAASA,EAAK,YAAY,SAASJ,EAAM;AAAA,EAAA,GAKtCsU,KAHYvC,IACdoC,GAA+B3R,EAAS,SAAS,MAAMuP,EAAS,IAAI,IACpE,SACuB,MAAM,KAAK,CAAC1O,MAASA,EAAK,aAAa,SAAS;AAC3E,MAAKiR;AACL,WAAAA,EAAQ,SAAS,KAAKxR,CAAI,GACnBA;AACT;AAGO,SAASyR,GACd/R,GACAgS,GACQ;AACR,QAAM5Q,IAAOpB,EAAS,WAAW,YAC3BiS,IAAWD,EAAM,QAAQ5Q,EAAK;AACpC,MAAI,CAACyN,EAA4B,KAAKoD,CAAQ,EAAG,QAAO;AACxD,MAAIjS,EAAS,WAAW,UAAU,KAAK,CAACuP,MAAaA,EAAS,YAAY,SAAS0C,CAAQ;AACzF,WAAO;AAET,MAAID,EAAM,SAAS,UAAa,CAACA,EAAM,KAAK,KAAA,EAAQ,QAAO;AAC3D,QAAME,IAAe9Q,EAAK;AAC1B,SAAAA,EAAK,OAAO6Q,GACRD,EAAM,SAAS,aAAgB,OAAOA,EAAM,KAAK,KAAA,IACjDE,MAAiBD,KACnBjS,EAAS,WAAW,OAAO,QAAQ,CAACxC,MAAU;AAC5C,IAAIA,EAAM,eAAe0U,MAAc1U,EAAM,aAAayU;AAAA,EAC5D,CAAC,GAEI;AACT;AAGO,SAASE,GACdnS,GACAoS,GACAJ,GACQ;AACR,QAAMzC,IAAWvP,EAAS,WAAW,UAAU,KAAK,CAACpC,MAASA,EAAK,SAASwU,CAAW;AACvF,MAAI,CAAC7C,EAAU,QAAO;AACtB,QAAMQ,IAAmBiC,EAAM,QAAQzC,EAAS,MAC1C8C,IAAgBL,EAAM,mBAAmBzC,EAAS,YAAY;AACpE,MAAI,CAACV,EAA4B,KAAKkB,CAAgB,EAAG,QAAO;AAChE,MAAI,CAAClB,EAA4B,KAAKwD,CAAa,EAAG,QAAO;AAC7D,MACErS,EAAS,WAAW,UAAU;AAAA,IAC5B,CAACpC,MAASA,EAAK,OAAO2R,EAAS,MAAM3R,EAAK,SAASmS;AAAAA,EAAA;AAGrD,WAAO;AAET,MACEsC,MAAkBrS,EAAS,WAAW,WAAW,QACjDA,EAAS,WAAW,UAAU;AAAA,IAC5B,CAACpC,MAASA,EAAK,OAAO2R,EAAS,MAAM3R,EAAK,YAAY,SAASyU;AAAA,EAAA;AAGjE,WAAO;AAET,MAAIL,EAAM,SAAS,UAAa,CAACA,EAAM,KAAK,KAAA,EAAQ,QAAO;AAC3D,MAAIA,EAAM,oBAAoB,UAAa,CAACA,EAAM,gBAAgB,KAAA;AAChE,WAAO;AACT,QAAMM,IAAuB/C,EAAS,MAChCgD,IAAoBhD,EAAS,YAAY;AAC/C,SAAAA,EAAS,OAAOQ,GAChBR,EAAS,YAAY,OAAO8C,GACxBL,EAAM,SAAS,aAAoB,OAAOA,EAAM,KAAK,KAAA,IACrDA,EAAM,oBAAoB,WAAWzC,EAAS,YAAY,OAAOyC,EAAM,gBAAgB,KAAA,IAC3FpC,GAAU5P,EAAS,SAAS,MAAM,CAACM,MAAS;AAC1C,IACEA,EAAK,aAAa,eAClBwO,EAAyB,IAAIxO,EAAK,aAAa,KAC/CA,EAAK,cAAc,iBAAiBgS,MAEpChS,EAAK,cAAc,eAAeyP;AAAAA,EAEtC,CAAC,GACGwC,MAAsBF,KACxBrS,EAAS,WAAW,OAAO,QAAQ,CAACxC,MAAU;AAC5C,IAAIA,EAAM,eAAe+U,MAAmB/U,EAAM,aAAa6U;AAAA,EACjE,CAAC,GAEI;AACT;AAGO,SAASG,GAA0BxS,GAAkD;AAC1F,QAAMqE,IAAoC,CAAA,GACpC6K,IAASlP,EAAS;AACxB,EAAAyS;AAAA,IACEvD,EAAO;AAAA,IACP,CAAC,MAAM,QAAQ,MAAM;AAAA,IACrB;AAAA,IACA7K;AAAA,EAAA,GAEFqO,GAAexD,EAAO,YAAY,2BAA2B7K,CAAW,GACpE6K,EAAO,WACTuD;AAAA,IACEvD,EAAO;AAAA,IACP,CAAC,YAAY,YAAY,gBAAgB;AAAA,IACzC;AAAA,IACA7K;AAAA,EAAA,IAEE,CAAC6K,EAAO,OAAO,YAAY,CAACA,EAAO,OAAO,aAC5C7K,EAAY,KAAKM,EAAM,qBAAqB,eAAe,qBAAqB,CAAC,GAGjFuK,EAAO,OAAO,mBAAmB,WAChC,CAAC,OAAO,UAAUA,EAAO,OAAO,cAAc,KAAKA,EAAO,OAAO,iBAAiB,MAEnF7K,EAAY;AAAA,IACVM;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAIN,QAAMgO,wBAAkB,IAAA,GAClBlD,wBAAoB,IAAA,GACpBmD,IAAY,oBAAI,IAAY,CAAC1D,EAAO,WAAW,EAAE,CAAC,GAClDQ,IAAc,oBAAI,IAAY,CAACR,EAAO,WAAW,IAAI,CAAC;AAC5D,aAAW,CAACtP,GAAOiT,CAAW,KAAK3D,EAAO,UAAU,WAAW;AAC7D,UAAM9K,IAAO,0BAA0BxE,CAAK;AAC5C,QAAI,CAAC0P,GAAoBuD,CAAW,GAAG;AACrC,MAAAxO,EAAY,KAAKM,EAAM,iBAAiB,iBAAiBP,CAAI,CAAC;AAC9D;AAAA,IACF;AACA,UAAMmL,IAAWsD;AACjB,IAAAJ;AAAA,MACElD;AAAA,MACA,CAAC,MAAM,QAAQ,QAAQ,kBAAkB,eAAe,UAAU;AAAA,MAClEnL;AAAA,MACAC;AAAA,IAAA,GAEFoO;AAAA,MACElD,EAAS;AAAA,MACT,CAAC,MAAM,QAAQ,MAAM;AAAA,MACrB,GAAGnL,CAAI;AAAA,MACPC;AAAA,IAAA,GAEE,CAACkL,EAAS,MAAMoD,EAAY,IAAIpD,EAAS,EAAE,IAC7ClL,EAAY,KAAKM,EAAM,eAAe,aAAa,GAAGP,CAAI,KAAK,CAAC,IAC7DuO,EAAY,IAAIpD,EAAS,EAAE,GAC5B,CAACV,EAA4B,KAAKU,EAAS,IAAI,KAAKE,EAAc,IAAIF,EAAS,IAAI,IACrFlL,EAAY,KAAKM,EAAM,iBAAiB,gBAAgB,GAAGP,CAAI,OAAO,CAAC,IAClEqL,EAAc,IAAIF,EAAS,IAAI,GACjCA,EAAS,QAAMlL,EAAY,KAAKM,EAAM,iBAAiB,YAAY,GAAGP,CAAI,OAAO,CAAC,GACnFmL,EAAS,mBAAmBL,EAAO,WAAW,MAChD7K,EAAY;AAAA,MACVM,EAAM,mBAAmB,kBAAkB,GAAGP,CAAI,iBAAiB;AAAA,IAAA,GAGvEsO,GAAenD,EAAS,aAAa,GAAGnL,CAAI,gBAAgBC,CAAW,GACnEuO,EAAU,IAAIrD,EAAS,YAAY,EAAE,IACvClL,EAAY,KAAKM,EAAM,uBAAuB,YAAY,GAAGP,CAAI,iBAAiB,CAAC,IAC9EwO,EAAU,IAAIrD,EAAS,YAAY,EAAE,GACxCG,EAAY,IAAIH,EAAS,YAAY,IAAI,IAC3ClL,EAAY;AAAA,MACVM,EAAM,yBAAyB,YAAY,GAAGP,CAAI,mBAAmB;AAAA,IAAA,IAElEsL,EAAY,IAAIH,EAAS,YAAY,IAAI,GAC3C,CAAC,QAAQ,OAAO,EAAE,SAASA,EAAS,QAAQ,KAC/ClL,EAAY,KAAKM,EAAM,sBAAsB,aAAa,GAAGP,CAAI,WAAW,CAAC;AAAA,EAEjF;AACA,aAAW,CAACxE,GAAOpC,CAAK,KAAK0R,EAAO,OAAO;AACzC,IAAKQ,EAAY,IAAIlS,EAAM,UAAU,KACnC6G,EAAY;AAAA,MACVM;AAAA,QACE;AAAA,QACA;AAAA,QACA,uBAAuB/E,CAAK;AAAA,MAAA;AAAA,IAC9B;AAIN,SAAAkT,GAAyB9S,GAAUqE,CAAW,GACvCA;AACT;AAEA,SAASqM,GACP1Q,GACA+S,GACM;AACN,EAAA/S,EAAS,aAAa;AAAA,IACpB,QAAQ;AAAA,MACN,UAAU+S,EAAQ;AAAA,MAClB,UAAUA,EAAQ;AAAA,MAClB,gBAAgBA,EAAQ;AAAA,IAAA;AAAA,IAE1B,YAAYC,GAAaD,EAAQ,UAAU;AAAA,IAC3C,WAAWA,EAAQ,UAAU,IAAI,CAACxD,OAAc;AAAA,MAC9C,IAAIA,EAAS;AAAA,MACb,MAAMA,EAAS;AAAA,MACf,MAAMA,EAAS;AAAA,MACf,gBAAgBA,EAAS;AAAA,MACzB,aAAayD,GAAazD,EAAS,WAAW;AAAA,MAC9C,UAAUA,EAAS,YAAY;AAAA,IAAA,EAC/B;AAAA,IACF,QAAQ,CAAA;AAAA,EAAC,GAEXvP,EAAS,WAAW,OAAO;AAAA,IACzB,GAAGiT,GAAoBjT,GAAU+S,EAAQ,UAAU;AAAA,IACnD,GAAGA,EAAQ,UAAU,QAAQ,CAACxD,MAAa0D,GAAoBjT,GAAUuP,EAAS,WAAW,CAAC;AAAA,EAAA;AAElG;AAEA,SAAS0D,GACPjT,GACAkT,GACiB;AACjB,SAAO,CAAC,GAAGA,EAAO,MAAM,EACrB,KAAK,CAACvL,GAAMC,OAAWD,EAAK,gBAAgB,MAAMC,EAAM,gBAAgB,EAAE,EAC1E,IAAI,CAACpK,GAAOoC,MAAUuT,GAAmBnT,GAAUkT,GAAQ1V,GAAOoC,CAAK,CAAC;AAC7E;AAEA,SAASuT,GACPnT,GACAkT,GACAH,GACAnT,GACe;AACf,QAAMhB,IAAeZ,EAAsB+U,EAAQ,oBAAoB;AACvE,SAAO;AAAA,IACL,IAAI/D,EAAiB,OAAO;AAAA,IAC5B,YAAYkE,EAAO;AAAA,IACnB,KAAKH,EAAQ;AAAA,IACb,OAAOA,EAAQ;AAAA,IACf,cAAcA,EAAQ;AAAA,IACtB,eAAenU,EAAa;AAAA,IAC5B,sBAAsBA,EAAa;AAAA,IACnC,eAAewU,GAAYxU,EAAa,oBAAoB;AAAA,IAC5D,cAAcyU,GAAgBN,EAAQ,YAAY;AAAA,IAClD,UAAU;AAAA,IACV,UAAUA,EAAQ,aAAa;AAAA,IAC/B,YAAY,CAAA;AAAA,IACZ,UAAUhJ,GAAA;AAAA,IACV,SAAS;AAAA,MACP,aAAa;AAAA,MACb,QAAQnL,EAAa,kBAAkB;AAAA,MACvC,UACEmU,EAAQ,aAAa,MAAQA,EAAQ,eAAe,MAAQA,EAAQ,gBAAgB;AAAA,IAAA;AAAA,IAExF,eAAe;AAAA,IACf,YAAYA,EAAQ,eAAe;AAAA,IACnC,aAAaA,EAAQ,gBAAgB;AAAA,IACrC,cAAcA,EAAQ,gBAAgBnT;AAAA,IACtC,SAAS;AAAA,MACP,UAAUI,EAAS,WAAW,OAAQ;AAAA,MACtC,UAAUA,EAAS,WAAW,OAAQ;AAAA,MACtC,gBAAgBA,EAAS,WAAW,OAAQ;AAAA,MAC5C,SAAS+S,EAAQ;AAAA,MACjB,WAAW,GAAGG,EAAO,UAAU,IAAIH,EAAQ,SAAS;AAAA,MACpD,gBAAgBA,EAAQ;AAAA,IAAA;AAAA,EAC1B;AAEJ;AAEA,SAASnC,GACP5Q,GACA+S,GAC6B;AAC7B,MACE/S,EAAS,WAAW,QAAQ,aAAa+S,EAAQ,YACjD/S,EAAS,WAAW,OAAO,aAAa+S,EAAQ;AAEhD,WAAOxC,GAAA;AAET,QAAM3Q,IAAqC;AAAA,IACzC,UAAUmT,EAAQ;AAAA,IAClB,UAAUA,EAAQ;AAAA,IAClB,gBAAgBA,EAAQ;AAAA,IACxB,UAAU,CAAA;AAAA,IACV,QAAQ,CAAA;AAAA,IACR,WAAW,CAAA;AAAA,EAAC,GAERO,IAAkB;AAAA,IACtBP,EAAQ;AAAA,IACR,GAAGA,EAAQ,UAAU,IAAI,CAACxD,MAAaA,EAAS,WAAW;AAAA,EAAA;AAE7D,aAAW2D,KAAUI,GAAiB;AACpC,UAAMC,IACJvT,EAAS,WAAW,WAAW,OAAOkT,EAAO,WACzClT,EAAS,WAAW,aACpBA,EAAS,WAAW,UAAU;AAAA,MAC5B,CAACuP,MAAaA,EAAS,YAAY,OAAO2D,EAAO;AAAA,IAAA,GAChD;AACT,IAAIK,QAAkB,SAASA,EAAW,EAAE,IAAI,EAAE,mBAAmBL,EAAO,kBAAA;AAC5E,eAAWM,KAAgBN,EAAO,QAAQ;AACxC,YAAM1V,IAAQwC,EAAS,WAAW,OAAO;AAAA,QACvC,CAACpC,MAASA,EAAK,SAAS,YAAY4V,EAAa;AAAA,MAAA;AAEnD,MAAIhW,QAAa,OAAOA,EAAM,EAAE,IAAI,EAAE,oBAAoBgW,EAAa,mBAAA;AAAA,IACzE;AAAA,EACF;AACA,aAAWC,KAAmBV,EAAQ,WAAW;AAC/C,UAAMxD,IAAWvP,EAAS,WAAW,UAAU;AAAA,MAC7C,CAACpC,MAASA,EAAK,OAAO6V,EAAgB;AAAA,IAAA;AAExC,IAAIlE,MACF3P,EAAM,UAAU2P,EAAS,EAAE,IAAI;AAAA,MAC7B,cAAckE,EAAgB,eAAe,CAAA,GAAI,IAAI,CAAC7H,OAAa,EAAE,GAAGA,IAAU;AAAA,IAAA;AAAA,EAGxF;AACA,SAAOhM;AACT;AAEA,SAAS4Q,GAAyBuC,GAAyD;AACzF,QAAM1O,IAAoC,CAAA;AAC1C,MAAI,CAACqP,GAAcX,CAAO;AACxB,WAAO,CAACpO,EAAM,gBAAgB,iBAAiB,oBAAoB,CAAC;AAsBtE,OAnBE,OAAOoO,EAAQ,YAAa,YAC5B,CAACA,EAAQ,YACT,OAAOA,EAAQ,YAAa,YAC5B,CAACA,EAAQ,aAET1O,EAAY,KAAKM,EAAM,kBAAkB,kBAAkB,oBAAoB,CAAC,GAGhFoO,EAAQ,mBAAmB,WAC1B,CAAC,OAAO,UAAUA,EAAQ,cAAc,KAAKA,EAAQ,iBAAiB,MAEvE1O,EAAY;AAAA,IACVM;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,GAGA,CAACgP,GAAqBZ,EAAQ,UAAU;AAC1C,WAAA1O,EAAY;AAAA,MACVM,EAAM,uBAAuB,cAAc,+BAA+B;AAAA,IAAA,GAErEN;AAET,MAAI,CAAC,MAAM,QAAQ0O,EAAQ,SAAS;AAClC,WAAA1O,EAAY;AAAA,MACVM,EAAM,qBAAqB,eAAe,8BAA8B;AAAA,IAAA,GAEnEN;AAET,QAAMuO,wBAAgB,IAAA,GAChBlD,wBAAkB,IAAA,GAClBpL,wBAAe,IAAA;AACrB,EAAAsP;AAAA,IACEb,EAAQ;AAAA,IACR;AAAA,IACA1O;AAAA,IACAuO;AAAA,IACAlD;AAAA,IACApL;AAAA,EAAA;AAEF,QAAMqO,wBAAkB,IAAA,GAClBlD,wBAAoB,IAAA;AAC1B,SAAAsD,EAAQ,UAAU,QAAQ,CAACxD,GAAU3P,MAAU;AAC7C,UAAMwE,IAAO,gCAAgCxE,CAAK;AAClD,QAAI,CAACiU,GAAuBtE,CAAQ,GAAG;AACrC,MAAAlL,EAAY,KAAKM,EAAM,yBAAyB,eAAeP,CAAI,CAAC;AACpE;AAAA,IACF;AACA,IAAI,CAACmL,EAAS,cAAcoD,EAAY,IAAIpD,EAAS,UAAU,IAC7DlL,EAAY,KAAKM,EAAM,uBAAuB,aAAa,GAAGP,CAAI,aAAa,CAAC,IAC3EuO,EAAY,IAAIpD,EAAS,UAAU,GAExC,CAACV,EAA4B,KAAKU,EAAS,YAAY,KACvDE,EAAc,IAAIF,EAAS,YAAY,IAEvClL,EAAY;AAAA,MACVM,EAAM,yBAAyB,gBAAgB,GAAGP,CAAI,eAAe;AAAA,IAAA,IAElEqL,EAAc,IAAIF,EAAS,YAAY,GACzCA,EAAS,gBACZlL,EAAY,KAAKM,EAAM,yBAAyB,YAAY,GAAGP,CAAI,eAAe,CAAC,GACjFmL,EAAS,mBAAmBwD,EAAQ,WAAW,YACjD1O,EAAY;AAAA,MACVM,EAAM,2BAA2B,kBAAkB,GAAGP,CAAI,iBAAiB;AAAA,IAAA,GAG/EwP;AAAA,MACErE,EAAS;AAAA,MACT,GAAGnL,CAAI;AAAA,MACPC;AAAA,MACAuO;AAAA,MACAlD;AAAA,MACApL;AAAA,IAAA,GAEEiL,EAAS,aAAa,UAAa,CAAC,CAAC,QAAQ,OAAO,EAAE,SAASA,EAAS,QAAQ,KAClFlL,EAAY;AAAA,MACVM,EAAM,8BAA8B,aAAa,GAAGP,CAAI,WAAW;AAAA,IAAA;AAGvE,UAAM0P,IAAiB,IAAI,IAAIf,EAAQ,WAAW,OAAO,IAAI,CAACvV,MAAUA,EAAM,OAAO,CAAC,GAChFuW,IAAgB,IAAI,IAAIxE,EAAS,YAAY,OAAO,IAAI,CAAC/R,MAAUA,EAAM,OAAO,CAAC,GACjFwW,IAAc,MAAM,QAAQzE,EAAS,WAAW,IAAIA,EAAS,cAAc,CAAA;AACjF,IAAIA,EAAS,gBAAgB,UAAa,CAAC,MAAM,QAAQA,EAAS,WAAW,KAC3ElL,EAAY;AAAA,MACVM,EAAM,iCAAiC,cAAc,GAAGP,CAAI,cAAc;AAAA,IAAA,GAG9E4P,EAAY,QAAQ,CAACpI,GAASqI,MAAiB;AAC7C,YAAMC,IAAc,GAAG9P,CAAI,gBAAgB6P,CAAY;AACvD,UAAI,CAACP,GAAc9H,CAAO,GAAG;AAC3B,QAAAvH,EAAY,KAAKM,EAAM,gCAAgC,cAAcuP,CAAW,CAAC;AACjF;AAAA,MACF;AACA,MAAKJ,EAAe,IAAIlI,EAAQ,aAAa,KAC3CvH,EAAY;AAAA,QACVM;AAAA,UACE;AAAA,UACA;AAAA,UACA,GAAGuP,CAAW;AAAA,QAAA;AAAA,MAChB,GAGCH,EAAc,IAAInI,EAAQ,YAAY,KACzCvH,EAAY;AAAA,QACVM;AAAA,UACE;AAAA,UACA;AAAA,UACA,GAAGuP,CAAW;AAAA,QAAA;AAAA,MAChB;AAAA,IAGN,CAAC;AAAA,EACH,CAAC,GACM7P;AACT;AAEA,SAASuP,GACPV,GACA9O,GACAC,GACAuO,GACAlD,GACApL,GACM;AACN,EAAI,CAAC4O,EAAO,YAAYN,EAAU,IAAIM,EAAO,QAAQ,IACnD7O,EAAY,KAAKM,EAAM,qBAAqB,aAAa,GAAGP,CAAI,WAAW,CAAC,IACzEwO,EAAU,IAAIM,EAAO,QAAQ,GAC9B,CAACrE,EAA4B,KAAKqE,EAAO,UAAU,KAAKxD,EAAY,IAAIwD,EAAO,UAAU,IAC3F7O,EAAY,KAAKM,EAAM,uBAAuB,gBAAgB,GAAGP,CAAI,aAAa,CAAC,IAC9EsL,EAAY,IAAIwD,EAAO,UAAU,GACnCA,EAAO,cACV7O,EAAY,KAAKM,EAAM,uBAAuB,YAAY,GAAGP,CAAI,aAAa,CAAC;AACjF,QAAM+P,wBAAiB,IAAA;AACvB,EAAAjB,EAAO,OAAO,QAAQ,CAAC1V,GAAOoC,MAAU;AACtC,UAAMwU,IAAY,GAAGhQ,CAAI,WAAWxE,CAAK;AACzC,QAAI,CAAC8T,GAAclW,CAAK,GAAG;AACzB,MAAA6G,EAAY,KAAKM,EAAM,sBAAsB,eAAeyP,CAAS,CAAC;AACtE;AAAA,IACF;AACA,IAAI,CAAC5W,EAAM,WAAW8G,EAAS,IAAI9G,EAAM,OAAO,IAC9C6G,EAAY;AAAA,MACVM,EAAM,oBAAoB,gBAAgB,GAAGyP,CAAS,UAAU;AAAA,IAAA,IAE/D9P,EAAS,IAAI9G,EAAM,OAAO,GAC3B,CAACqR,EAA4B,KAAKrR,EAAM,SAAS,KAAK2W,EAAW,IAAI3W,EAAM,SAAS,IACtF6G,EAAY;AAAA,MACVM,EAAM,sBAAsB,oBAAoB,GAAGyP,CAAS,YAAY;AAAA,IAAA,IAErED,EAAW,IAAI3W,EAAM,SAAS;AACrC,UAAMoB,IAAeZ,EAAsBR,EAAM,oBAAoB;AACrE,KACE,CAACoB,KACDA,EAAa,aAAa,WAC1BA,EAAa,iBAAiB,iBAC9B,CAACA,EAAa,wBAAwB,SAASpB,EAAM,YAAY,MAEjE6G,EAAY;AAAA,MACVM;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAGyP,CAAS;AAAA,MAAA;AAAA,IACd;AAAA,EAGN,CAAC;AACH;AAEA,SAAStB,GACP9S,GACAqE,GACM;AACN,QAAMgQ,wBAAoB,IAAA,GACpBjF,IAAYpP,EAAS,WAAW,UAAU,OAAOsP,EAAmB,GACpE3O,IAAQ,CAACC,GAA6B6G,GAAoBrD,MAAuB;AACrF,IAAAxD,EAAM,QAAQ,CAACN,GAAMV,MAAU;AAC7B,YAAM8E,IAAW,GAAGN,CAAI,IAAIxE,CAAK;AACjC,UAAIU,EAAK,aAAa,SAAS;AAC7B,cAAM9C,IAAQwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,OAAO0C,EAAK,OAAO;AAChF,QAAI9C,KAASA,EAAM,eAAeiK,KAChCpD,EAAY;AAAA,UACVM;AAAA,YACE;AAAA,YACA,QAAQnH,EAAM,UAAU,aAAaiK,CAAU;AAAA,YAC/C/C;AAAA,UAAA;AAAA,QACF;AAGJ;AAAA,MACF;AACA,UAAIoK,EAAyB,IAAIxO,EAAK,aAAa,GAAG;AACpD,cAAMwP,IACJ,OAAOxP,EAAK,cAAc,gBAAiB,WAAWA,EAAK,cAAc,eAAe,IACpFiP,IAAWH,EAAU,KAAK,CAACxR,MAASA,EAAK,SAASkS,CAAY;AACpE,YAAI,CAACP,GAAU;AACb,UAAAlL,EAAY;AAAA,YACVM;AAAA,cACE;AAAA,cACA;AAAA,cACA,GAAGD,CAAQ;AAAA,YAAA;AAAA,UACb;AAEF;AAAA,QACF;AACA,QAAI2P,EAAc,IAAI9E,EAAS,IAAI,KACjClL,EAAY;AAAA,UACVM;AAAA,YACE;AAAA,YACA;AAAA,YACA,GAAGD,CAAQ;AAAA,UAAA;AAAA,QACb,GAGJ2P,EAAc,IAAI9E,EAAS,IAAI,GAC/BjP,EAAK,MAAM;AAAA,UAAQ,CAACO,GAAMyT,MACxB3T;AAAA,YACEE,EAAK;AAAA,YACL0O,EAAS,YAAY;AAAA,YACrB,GAAG7K,CAAQ,UAAU4P,CAAS;AAAA,UAAA;AAAA,QAChC;AAEF;AAAA,MACF;AACA,MAAAhU,EAAK,MAAM;AAAA,QAAQ,CAACO,GAAMyT,MACxB3T,EAAME,EAAK,UAAU4G,GAAY,GAAG/C,CAAQ,UAAU4P,CAAS,YAAY;AAAA,MAAA;AAAA,IAE/E,CAAC;AAAA,EACH;AACA,EAAA3T,EAAMX,EAAS,SAAS,MAAMA,EAAS,WAAW,WAAW,MAAM,iBAAiB;AACtF;AAEA,SAAS0S,GACPQ,GACA9O,GACAC,GACM;AACN,EAAK6O,GAAQ,MAAI7O,EAAY,KAAKM,EAAM,aAAa,YAAY,GAAGP,CAAI,KAAK,CAAC,GACzE8O,GAAQ,QAAM7O,EAAY,KAAKM,EAAM,eAAe,YAAY,GAAGP,CAAI,OAAO,CAAC,GAC/EyK,EAA4B,KAAKqE,GAAQ,QAAQ,EAAE,KACtD7O,EAAY;AAAA,IACVM,EAAM,eAAe,6BAA6B,GAAGP,CAAI,OAAO;AAAA,EAAA;AAGtE;AAEA,SAAS2M,GAAmB/Q,GAAoC;AAC9D,QAAMuU,IAAO,IAAI,IAAIvU,EAAS,WAAW,UAAU,IAAI,CAACuP,MAAaA,EAAS,YAAY,IAAI,CAAC;AAC/F,MAAIiF,IAAS;AACb,SAAOD,EAAK,IAAI,UAAUC,CAAM,EAAE,IAAG,CAAAA,KAAU;AAC/C,SAAOA;AACT;AAEA,SAASzE,GAAiB0E,GAAkBF,GAAmBrS,GAAuB;AACpF,MAAIsS,IAAS,KAAK,IAAI,GAAGtS,CAAK,GAC1BgE,IAAO,GAAGuO,CAAQ,WAAWD,CAAM;AACvC,SAAOD,EAAK,IAAIrO,CAAI;AAClB,IAAAsO,KAAU,GACVtO,IAAO,GAAGuO,CAAQ,WAAWD,CAAM;AAErC,SAAOtO;AACT;AAEA,SAAS+J,GAAoBsE,GAAmBrS,GAAuB;AACrE,MAAIsS,IAAS,KAAK,IAAI,GAAGtS,CAAK,GAC1BgE,IAAO,UAAUsO,CAAM;AAC3B,SAAOD,EAAK,IAAIrO,CAAI;AAClB,IAAAsO,KAAU,GACVtO,IAAO,UAAUsO,CAAM;AAEzB,SAAOtO;AACT;AAEA,SAASgK,GAAc5P,GAAsE;AAC3F,SAAO,OAAOA,EAAK,cAAc,SAAU,WAAWA,EAAK,cAAc,MAAM,KAAA,IAAS;AAC1F;AAEA,SAAS0S,GAAaE,GAAmD;AACvE,SAAO,EAAE,IAAIA,EAAO,UAAU,MAAMA,EAAO,YAAY,MAAMA,EAAO,WAAA;AACtE;AAEA,SAAS5B,GAAS1Q,GAA6B8T,GAAgD;AAC7F,aAAWpU,KAAQM,GAAO;AACxB,QAAIN,EAAK,OAAOoU,EAAQ,QAAOpU;AAC/B,QAAIA,EAAK,aAAa;AACtB,iBAAWO,KAAQP,EAAK,OAAO;AAC7B,cAAMgB,IAAQgQ,GAASzQ,EAAK,UAAU6T,CAAM;AAC5C,YAAIpT,EAAO,QAAOA;AAAA,MACpB;AAAA,EACF;AAEF;AAEA,SAASuQ,GAAcjR,GAA6B4E,GAA0B;AAC5E,SAAO5E,EAAM,KAAK,CAACN,MACbA,EAAK,aAAa,UAAgBA,EAAK,YAAYkF,IAChDlF,EAAK,MAAM,KAAK,CAACO,MAASgR,GAAchR,EAAK,UAAU2E,CAAO,CAAC,CACvE;AACH;AAEA,SAASoK,GAAUhP,GAA6ByC,GAAmD;AACjG,aAAW/C,KAAQM;AACjB,IAAAyC,EAAQ/C,CAAI,GACRA,EAAK,aAAa,eACpBA,EAAK,MAAM,QAAQ,CAACO,MAAS+O,GAAU/O,EAAK,UAAUwC,CAAO,CAAC;AAGpE;AAEA,SAASgQ,GAAgB5T,GAA8C;AACrE,SAAIA,MAAS,UAAgB,CAAA,IACzBA,MAAS,YAAkB,KAC3BA,MAAS,YAAYA,MAAS,WAAiB,OAC5C;AACT;AAEA,SAAS8Q,KAAmD;AAC1D,SAAO,EAAE,UAAU,IAAI,UAAU,IAAI,UAAU,CAAA,GAAI,QAAQ,IAAI,WAAW,CAAA,EAAC;AAC7E;AAEA,SAAS5L,EAAMuB,GAAcC,GAAiB/B,GAAkC;AAC9E,SAAO,EAAE,UAAU,SAAS,MAAA8B,GAAM,SAAAC,GAAS,MAAA/B,EAAA;AAC7C;AAEA,SAASqO,GACPtT,GACA8B,GACAmD,GACAC,GACM;AACN,QAAM4B,IAAc,IAAI,IAAIhF,CAAO;AACnC,SAAO,KAAK9B,CAAM,EAAE,QAAQ,CAACC,MAAQ;AACnC,IAAK6G,EAAY,IAAI7G,CAAG,KACtBiF,EAAY;AAAA,MACVM,EAAM,+BAA+B,aAAavF,CAAG,IAAI,GAAGgF,CAAI,IAAIhF,CAAG,EAAE;AAAA,IAAA;AAAA,EAG/E,CAAC;AACH;AAEA,SAASoQ,GAAarU,GAA6C;AACjE,MAAI,OAAOA,KAAU,YAAYA,MAAU,QAAQ,MAAM,QAAQA,CAAK,EAAG,QAAO;AAChF,QAAM+X,IAAS/X;AACf,SACE,OAAO+X,EAAO,MAAO,YACrB,OAAOA,EAAO,QAAS,YACvB,OAAOA,EAAO,QAAS;AAE3B;AAEA,SAASS,GAAqBxY,GAAgD;AAC5E,SAAOuY,GAAcvY,CAAK,KAAK,MAAM,QAAQA,EAAM,MAAM;AAC3D;AAEA,SAAS0Y,GACP1Y,GACwD;AACxD,SAAOuY,GAAcvY,CAAK,KAAKwY,GAAqBxY,EAAM,WAAW;AACvE;AAEA,SAASuY,GAAcvY,GAAkD;AACvE,SAAO,OAAOA,KAAU,YAAYA,MAAU,QAAQ,CAAC,MAAM,QAAQA,CAAK;AAC5E;AAEA,SAASmU,GAAoBnU,GAAoD;AAC/E,MAAI,OAAOA,KAAU,YAAYA,MAAU,QAAQ,MAAM,QAAQA,CAAK,EAAG,QAAO;AAChF,QAAMoU,IAAWpU;AACjB,SACE,OAAOoU,EAAS,MAAO,YACvB,OAAOA,EAAS,QAAS,YACzB,OAAOA,EAAS,QAAS,YACzB,OAAOA,EAAS,kBAAmB,YACnCC,GAAaD,EAAS,WAAW;AAErC;AAEA,SAAS6D,GAAYjU,GAAoE;AACvF,SAAO,KAAK,MAAM,KAAK,UAAUA,CAAM,CAAC;AAC1C;AAEA,SAASmR,GAActQ,GAA8C;AACnE,SAAO,KAAK,MAAM,KAAK,UAAUA,CAAQ,CAAC;AAC5C;AAEA,SAASgP,EAAiB2F,GAAwB;AAChD,QAAMC,IACJ,OAAO,SAAW,OAAe,gBAAgB,SAC7C,OAAO,WAAA,EAAa,WAAW,KAAK,EAAE,IACtC,GAAG,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,GAAG,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACtE,SAAO,GAAGD,CAAM,IAAIC,CAAM;AAC5B;ACphCO,MAAMC,KAA4B,OCmCnCC,KAAqD;AAAA,EACzD,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,iBAAiB;AACnB,GAEMC,yBAAwC,IAAI;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,SAASC,GACdC,GACA7W,IAAO,WACW;AAClB,SAAO;AAAA,IACL,iBAAiByW;AAAA,IACjB,IAAII;AAAA,IACJ,MAAA7W;AAAA,IACA,aAAa;AAAA,IACb,YAAY2Q,GAA8B3Q,CAAI;AAAA,IAC9C,UAAU,EAAE,MAAM,IAAI,UAAU,CAAA,EAAC;AAAA,IACjC,YAAY8W,EAAUJ,EAAkB;AAAA,IACxC,cAAcI,EAAUpL,EAA8B;AAAA,IACtD,WAAWoL,EAAUrL,EAA2B;AAAA,IAChD,WAAW,CAAA;AAAA,IACX,aAAa,CAAA;AAAA,IACb,YAAY,CAAA;AAAA,IACZ,MAAM,EAAE,SAAS,IAAO,eAAe,SAAS,SAAS,CAAC,OAAO,GAAG,SAAS,GAAC;AAAA,IAC9E,SAAS,CAAA;AAAA,IACT,YAAY,CAAA;AAAA,EAAC;AAEjB;AAGO,SAASsL,GAA2BF,GAAsC;AAC/E,QAAMjV,IAAWgV,GAA4BC,CAAU,GACjDG,IAAqE;AAAA,IACzE,CAAC,QAAQ,QAAQ,EAAE,aAAa,WAAW;AAAA,IAC3C,CAAC,UAAU,QAAQ,EAAE;AAAA,IACrB,CAAC,YAAY,QAAQ,EAAE,MAAM,GAAG;AAAA,IAChC,CAAC,UAAU,QAAQ,EAAE,WAAW,GAAG,gBAAgB,KAAK,oBAAoB,IAAM;AAAA,IAClF,CAAC,QAAQ,UAAU,EAAE;AAAA,IACrB,CAAC,QAAQ,QAAQ,CAAA,CAAE;AAAA,EAAA;AAErB,aAAW,CAACnX,GAAeoB,GAAOnC,CAAa,KAAKkY,GAAS;AAC3D,UAAMC,IAAUC,GAAwBtV,GAAU/B,GAAe,EAAE,OAAAoB,GAAO,eAAAnC,GAAe;AACzF,IAAImY,KAASrV,EAAS,SAAS,KAAK,KAAKqV,CAAO;AAAA,EAClD;AACA,SAAOrV;AACT;AAGO,SAASsV,GACdtV,GACA/B,GACAsX,IAA8F,CAAA,GAC9D;AAChC,QAAM3W,IAAeZ,EAAsBC,CAAa;AACxD,MAAI,CAACW,KAAgBA,EAAa,iBAAiB,cAAe;AAClE,MAAIA,EAAa,aAAa,aAAa;AACzC,UAAM0B,IAAOkV,GAAoB5W,GAAc2W,EAAU,aAAa;AACtE,WAAA1E,GAA+B7Q,GAAUM,CAAI,GACtCA;AAAA,EACT;AACA,QAAM9C,IAAQiY,GAAoBzV,GAAUpB,GAAc2W,CAAS;AACnE,SAAAvV,EAAS,WAAW,OAAO,KAAKxC,CAAK,GAC9BkY,GAAgBlY,GAAOoB,EAAa,aAAaA,EAAa,gBAAgB;AACvF;AAGO,SAAS+W,GACd3V,GACAM,GACAJ,GACS;AAET,MADI0V,EAAW5V,EAAS,SAAS,MAAMM,EAAK,EAAE,KAC1CuV,GAAkC7V,GAAUM,GAAMJ,CAAM,EAAG,QAAO;AACtE,QAAM4V,IAAaC,GAAsB/V,GAAUE,CAAM;AACzD,SAAK4V,KACLA,EAAW,OAAO5V,EAAO,OAAO,GAAGI,CAAI,GACvC0V,GAA6BF,GAAYxV,EAAK,IAAIJ,EAAO,WAAW,GAC7D,MAHiB;AAI1B;AAGO,SAAS+V,GACdjW,GACA0U,GACAxU,GACS;AACT,QAAMgW,IAAUN,EAAW5V,EAAS,SAAS,MAAM0U,CAAM;AAEzD,MADI,CAACwB,KACDC,GAA0BnW,GAAU0U,GAAQxU,CAAM,EAAG,QAAO;AAChE,QAAMkW,IAAmBL,GAAsB/V,GAAUE,CAAM;AAC/D,MAAI,CAACkW,EAAkB,QAAO;AAC9B,QAAM,CAAC9V,CAAI,IAAI4V,EAAQ,WAAW,OAAOA,EAAQ,OAAO,CAAC;AACzD,MAAI,CAAC5V,EAAM,QAAO;AAClB,MAAI+V,IAAc,KAAK,IAAI,GAAG,KAAK,IAAInW,EAAO,OAAOkW,EAAiB,MAAM,CAAC;AAC7E,SAAIA,MAAqBF,EAAQ,cAAcA,EAAQ,QAAQhW,EAAO,UAAOmW,KAAe,IAC5FD,EAAiB,OAAO,KAAK,IAAI,GAAGC,CAAW,GAAG,GAAG/V,CAAI,GACzD0V,GAA6BI,GAAkB9V,EAAK,IAAIJ,EAAO,WAAW,GACnE;AACT;AAUO,SAASoW,GACd1V,GACA8T,GACAlD,GACS;AACT,MAAI,CAACA,EAAmB,QAAO;AAC/B,QAAM0E,IAAUN,EAAWhV,GAAO8T,CAAM;AACxC,SAAO,GAAQwB,KAAW,CAACK,GAAsBL,EAAQ,MAAM1E,CAAiB;AAClF;AAUO,SAASgF,GACdxW,GACA/B,GACAiC,GACQ;AACR,QAAMtB,IAAeZ,EAAsBC,CAAa;AACxD,MAAI,CAACW,EAAc,QAAO,MAAMX,CAAa;AAC7C,MAAIW,EAAa,iBAAiB,cAAe,QAAOA,EAAa;AACrE,QAAM6X,IAAkBC,GAAoB1W,GAAUE,CAAM;AAC5D,SAAIuW,KACGE;AAAA,IACL3W;AAAA,IACAE,EAAO;AAAA,IACPtB,EAAa;AAAA,IACbX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAUO,SAASkY,GACdnW,GACA0U,GACAxU,GACQ;AACR,QAAMgW,IAAUN,EAAW5V,EAAS,SAAS,MAAM0U,CAAM;AACzD,MAAI,CAACwB,EAAS,QAAO;AACrB,QAAMO,IAAkBC,GAAoB1W,GAAUE,CAAM;AAC5D,MAAIuW,EAAiB,QAAOA;AAC5B,QAAMG,IAAaV,EAAQ;AAC3B,MAAIhW,EAAO,eAAeqW,GAAsBK,GAAY1W,EAAO,WAAW;AAC5E,WAAO;AAET,MAAI0W,EAAW,aAAa,aAAa;AACvC,UAAMhY,IAAeZ,EAAsB4Y,EAAW,aAAa;AACnE,WAAI,CAAChY,KAAgBA,EAAa,aAAa,cAAoB,cAC/DA,EAAa,iBAAiB,gBAAsBA,EAAa,oBAC9D+X;AAAA,MACL3W;AAAA,MACAE,EAAO;AAAA,MACP;AAAA,MACA0W,EAAW;AAAA,MACX;AAAA,MACAC,GAAiBD,CAAU;AAAA,MAC3B;AAAA,IAAA;AAAA,EAEJ;AACA,QAAMpR,IAAUoR,EAAW,SACrBpZ,IAAQwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,OAAO4H,CAAO;AAC3E,MAAI,CAAChI,EAAO,QAAO;AACnB,QAAMoB,IAAeZ,EAAsBR,EAAM,aAAa;AAC9D,SAAI,CAACoB,KAAgBA,EAAa,aAAa,UAAgB,cAC3DA,EAAa,iBAAiB,gBAAsBA,EAAa,oBAC9D+X;AAAA,IACL3W;AAAA,IACAE,EAAO;AAAA,IACP;AAAA,IACA1C,EAAM;AAAA,IACNA,EAAM,QAAQ;AAAA,IACd;AAAA,IACAA,EAAM;AAAA,EAAA;AAEV;AAGO,SAASsZ,GACd9W,GACA0U,GACgC;AAChC,SAAOqC,GAAyB/W,EAAS,SAAS,MAAM0U,CAAM;AAChE;AAGO,SAASsC,GACdhX,GACAwF,GAC+B;AAC/B,SAAOoM,GAAuB5R,GAAUwF,CAAO;AACjD;AAGO,SAASyR,GACdjX,GACA8P,GACA7R,GACmC;AACnC,QAAMsR,IAAWvP,EAAS,WAAW,UAAU,KAAK,CAACpC,MAASA,EAAK,SAASkS,CAAY;AACxF,MAAI,CAACP,EAAU;AACf,QAAM2H,IAAgBC,GAAsBnX,EAAS,SAAS,MAAM8P,CAAY;AAChF,MAAIoH,EAAe,QAAOA;AAC1B,QAAM5W,IAAOgV,GAAwBtV,GAAU/B,GAAe;AAAA,IAC5D,eAAe,EAAE,cAAA6R,GAAc,OAAOP,EAAS,YAAY,KAAA;AAAA,EAAK,CACjE;AACD,MAAIjP,GAAM,aAAa;AACvB,WAAAN,EAAS,SAAS,KAAK,KAAKM,CAAI,GACzBA;AACT;AAOO,SAAS8W,GACdpX,GACAqX,GACyD;AACzD,QAAMC,IAA2B,CAAA,GAC3BC,IAA4B,CAAA;AAClC,aAAWC,KAAaH,EAAQ,WAAW;AACzC,UAAMH,IAAgBC,GAAsBnX,EAAS,SAAS,MAAMwX,EAAU,YAAY,GACpFlX,IAAO2W;AAAA,MACXjX;AAAA,MACAwX,EAAU;AAAA,MACVA,EAAU;AAAA,IAAA;AAEZ,IAAIlX,KAAQ,CAAC4W,KAAeI,EAAe,KAAKhX,EAAK,EAAE;AAAA,EACzD;AACA,aAAWkF,KAAW6R,EAAQ,UAAU;AACtC,UAAM7Z,IAAQwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,OAAO4H,CAAO;AAC3E,QAAI,CAAChI,KAASA,EAAM,cAAcA,EAAM,aAAa;AACnD,MAAA+Z,EAAgB,KAAK/R,CAAO;AAC5B;AAAA,IACF;AACA,UAAMlF,IAAOsR,GAAuB5R,GAAUwF,CAAO;AACrD,IAAIlF,IAAMgX,EAAe,KAAKhX,EAAK,EAAE,IAChCiX,EAAgB,KAAK/R,CAAO;AAAA,EACnC;AACA,SAAO,EAAE,gBAAgB,CAAC,GAAG,IAAI,IAAI8R,CAAc,CAAC,GAAG,iBAAAC,EAAA;AACzD;AAGO,SAASE,GAA4BzX,GAA4BwF,GAA0B;AAChG,MAAIkS,GAAsB1X,EAAS,SAAS,IAAI,EAAE,IAAIwF,CAAO,EAAG,QAAO;AACvE,QAAM5F,IAAQI,EAAS,WAAW,OAAO,UAAU,CAACpC,MAASA,EAAK,OAAO4H,CAAO;AAChF,SAAI5F,IAAQ,KAAKI,EAAS,WAAW,OAAOJ,CAAK,GAAG,kBAAkB,YAAkB,MACxFI,EAAS,WAAW,OAAO,OAAOJ,GAAO,CAAC,GACnC;AACT;AAGO,SAAS+X,GACd3X,GACA0U,GACgC;AAChC,QAAMwB,IAAUN,EAAW5V,EAAS,SAAS,MAAM0U,CAAM;AACzD,MAAI,CAACwB,EAAS;AACd,QAAMjF,IAAO2G,GAAoB5X,GAAUkW,EAAQ,IAAI;AACvD,SAAAA,EAAQ,WAAW,OAAOA,EAAQ,QAAQ,GAAG,GAAGjF,CAAI,GAC7CA;AACT;AAGO,SAAS4G,GACdjX,GACA8T,GACgC;AAChC,SAAOkB,EAAWhV,GAAO8T,CAAM,GAAG;AACpC;AAGO,SAASgD,GAAsB9W,GAA0C;AAC9E,QAAMsD,wBAAa,IAAA;AACnB,SAAA0L,GAAUhP,GAAO,CAACN,MAAS;AACzB,IAAIA,EAAK,aAAa,WAAS4D,EAAO,IAAI5D,EAAK,OAAO;AAAA,EACxD,CAAC,GACM4D;AACT;AAGO,SAAS4T,GAAsB9X,GAAmD;AACvF,QAAM+X,IAAS,IAAI,IAAI/X,EAAS,WAAW,OAAO,IAAI,CAACxC,MAAU,CAACA,EAAM,IAAIA,CAAK,CAAC,CAAC,GAC7Ewa,IAAU,CAAC1X,MAAkD;AACjE,QAAIA,EAAK,aAAa,SAAS;AAC7B,YAAM9C,IAAQua,EAAO,IAAIzX,EAAK,OAAO,GAC/B1B,IAAepB,IAAQQ,EAAsBR,EAAM,aAAa,IAAI;AAC1E,aAAO;AAAA,QACL,IAAI8C,EAAK;AAAA,QACT,OAAO9C,GAAO,SAAS;AAAA,QACvB,WAAWoB,GAAc,QAAQ;AAAA,QACjC,UAAU,CAAA;AAAA,MAAC;AAAA,IAEf;AACA,UAAMA,IAAeZ,EAAsBsC,EAAK,aAAa;AAC7D,WAAO;AAAA,MACL,IAAIA,EAAK;AAAA,MACT,OAAO2X,GAAe3X,GAAM1B,CAAY;AAAA,MACxC,WAAWA,GAAc,QAAQ0B,EAAK;AAAA,MACtC,UAAUA,EAAK,MAAM,QAAQ,CAACO,MAASA,EAAK,SAAS,IAAImX,CAAO,CAAC;AAAA,IAAA;AAAA,EAErE;AACA,SAAOhY,EAAS,SAAS,KAAK,IAAIgY,CAAO;AAC3C;AAGO,SAASE,GAA0B5X,GAAmC;AAC3E,MAAIA,EAAK,kBAAkB,OAAQ;AACnC,QAAM6X,IAAaC,GAAiB9X,EAAK,cAAc,IAAI,GACrDX,IAASwY,EAAW,SAAS,IAAIA,EAAW,IAAI,CAACva,MAASA,EAAK,KAAK,IAAI,CAAC,OAAO,GAChFtB,IAAU,CAAC,GAAGgE,EAAK,KAAK;AAC9B,EAAAA,EAAK,QAAQX,EAAO,IAAI,CAACN,GAAOO,OAAW;AAAA,IACzC,IAAItD,EAAQsD,CAAK,GAAG,MAAMyY,EAAiB,MAAM;AAAA,IACjD,UAAU/b,EAAQsD,CAAK,GAAG,YAAY,OAAOA,IAAQ,CAAC;AAAA,IACtD,OAAAP;AAAA,IACA,UAAU/C,EAAQsD,CAAK,GAAG,YAAY,CAAA;AAAA,EAAC,EACvC;AACJ;AAGO,SAAS0Y,GAAuBnZ,GAA+C;AACpF,MAAI,CAACyF,EAASzF,CAAM;AAClB,WAAO,EAAE,aAAa,CAACoZ,EAAW,SAAS,iBAAiB,mBAAmB,GAAG,CAAC,EAAA;AAErF,MAAI;AACF,UAAMC,IAAaC,GAA0BtZ,CAAM,GAC7CkF,IAAcqU,GAAiCF,CAAU;AAC/D,WAAInU,EAAY,KAAK,CAACzG,MAASA,EAAK,aAAa,OAAO,IAAU,EAAE,aAAAyG,EAAA,IAC7D,EAAE,UAAUmU,GAAY,aAAAnU,EAAA;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,MACL,aAAa;AAAA,QACXkU,EAAW,SAAS,kBAAkB,wBAAwB,GAAG;AAAA,MAAA;AAAA,IACnE;AAAA,EAEJ;AACF;AAOO,SAASI,GAAyBxZ,GAAuC;AAC9E,MAAI;AACF,WAAOuZ;AAAA,MACL9T,EAASzF,CAAM,IAAIsZ,GAA0BtZ,CAAM,IAAIA;AAAA,IAAA;AAAA,EAE3D,QAAQ;AACN,WAAO,CAACoZ,EAAW,SAAS,uBAAuB,qBAAqB,GAAG,CAAC;AAAA,EAC9E;AACF;AAEA,SAASG,GAAiCvZ,GAAuC;AAC/E,QAAM+E,IAA+B,CAAA;AACrC,MAAI,CAACU,EAASzF,CAAM;AAClB,WAAA+E,EAAO,KAAKqU,EAAW,SAAS,iBAAiB,aAAa,GAAG,CAAC,GAC3DrU;AAET,EAAI/E,EAAO,oBAAoB0V,MAC7B3Q,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA,OAAO1D,EAAyB;AAAA,MAChC;AAAA,IAAA;AAAA,EACF,IAIF,OAAO1V,EAAO,MAAO,YACrB,CAACA,EAAO,MACR,OAAOA,EAAO,QAAS,YACvB,CAACA,EAAO,SAER+E,EAAO,KAAKqU,EAAW,SAAS,qBAAqB,eAAe,GAAG,CAAC,GAEtE,OAAOpZ,EAAO,eAAgB,YAChC+E,EAAO,KAAKqU,EAAW,SAAS,wBAAwB,aAAa,eAAe,CAAC;AAEvF,QAAMrO,IAAatF,EAASzF,EAAO,UAAU,IAAIA,EAAO,aAAa,QAC/D8K,IAAWrF,EAASzF,EAAO,QAAQ,IAAIA,EAAO,WAAW,QACzD4Y,IAAS7N,KAAc,MAAM,QAAQA,EAAW,MAAM,IAAIA,EAAW,SAAS,QAC9E9I,IAAO6I,KAAY,MAAM,QAAQA,EAAS,IAAI,IAAIA,EAAS,OAAO;AACxE,GAAI,CAAC8N,KAAU,CAAC3W,MACd8C,EAAO,KAAKqU,EAAW,SAAS,mBAAmB,8BAA8B,GAAG,CAAC,GACnFtO,MACF2O;AAAA,IACE3O;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,IACnB;AAAA,IACA;AAAA,IACA/F;AAAA,EAAA,GAEG,MAAM,QAAQ+F,EAAS,QAAQ,KAClC/F,EAAO;AAAA,IACLqU,EAAW,SAAS,sBAAsB,aAAa,qBAAqB;AAAA,EAAA,IAI9ErO,MACF0O;AAAA,IACE1O;AAAA,IACA,CAAC,UAAU,cAAc,aAAa,QAAQ;AAAA,IAC9C;AAAA,IACA;AAAA,IACAhG;AAAA,EAAA,GAEGU,EAASsF,EAAW,UAAU,KACjChG,EAAO;AAAA,IACLqU,EAAW,SAAS,eAAe,aAAa,yBAAyB;AAAA,EAAA,GAGxE,MAAM,QAAQrO,EAAW,SAAS,KACrChG,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,IAID3T,EAASzF,EAAO,UAAU,IAG7B0Z,GAAmB1Z,EAAO,YAAY,gBAAgB+E,CAAM,IAF5DA,EAAO,KAAKqU,EAAW,SAAS,uBAAuB,cAAc,cAAc,CAAC,GAIjF,MAAM,QAAQpZ,EAAO,OAAO,KAC/B+E,EAAO,KAAKqU,EAAW,SAAS,oBAAoB,cAAc,WAAW,CAAC,GAC3E3T,EAASzF,EAAO,UAAU,KAC7B+E,EAAO,KAAKqU,EAAW,SAAS,uBAAuB,aAAa,cAAc,CAAC;AACrF,QAAMjU,wBAAe,IAAA,GACfwU,wBAAgB,IAAA,GAChBC,wBAAe,IAAA;AACrB,aAAW,CAACnZ,GAAOuK,CAAQ,MAAM4N,KAAU,CAAA,GAAI,WAAW;AACxD,UAAM3T,IAAO,uBAAuBxE,CAAK;AACzC,QAAI,CAACgF,EAASuF,CAAQ,GAAG;AACvB,MAAAjG,EAAO,KAAKqU,EAAW,SAAS,cAAc,aAAanU,CAAI,CAAC;AAChE;AAAA,IACF;AACA,UAAM5G,IAAQ2M;AACd,IAAAyO;AAAA,MACEzO;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF/F;AAAA,MACA;AAAA,MACAF;AAAA,IAAA,GAEE,OAAO1G,EAAM,MAAO,YAAY,CAACA,EAAM,MAAM8G,EAAS,IAAI9G,EAAM,EAAE,IACpE0G,EAAO,KAAKqU,EAAW,SAAS,YAAY,aAAa,GAAGnU,CAAI,KAAK,CAAC,KAEtEE,EAAS,IAAI9G,EAAM,EAAE,GACrBub,EAAS,IAAIvb,EAAM,IAAIA,CAAK;AAE9B,UAAMwb,IAAiB,GAAGxb,EAAM,UAAU,KAASA,EAAM,GAAG;AAC5D,IAAI,OAAOA,EAAM,OAAQ,YAAY,CAACA,EAAM,OAAOsb,EAAU,IAAIE,CAAc,IAC7E9U,EAAO,KAAKqU,EAAW,SAAS,aAAa,aAAa,GAAGnU,CAAI,MAAM,CAAC,IAExE0U,EAAU,IAAIE,CAAc,IAE1B,OAAOxb,EAAM,cAAe,YAAY,CAACA,EAAM,eACjD0G,EAAO;AAAA,MACLqU,EAAW,SAAS,gBAAgB,gBAAgB,GAAGnU,CAAI,aAAa;AAAA,IAAA,IAGxE,OAAO5G,EAAM,SAAU,YAAY,CAACA,EAAM,UAC5C0G,EAAO,KAAKqU,EAAW,SAAS,eAAe,YAAY,GAAGnU,CAAI,QAAQ,CAAC,IAEzE,OAAO5G,EAAM,YAAa,YAAY,OAAOA,EAAM,YAAa,cAClE0G,EAAO,KAAKqU,EAAW,SAAS,kBAAkB,oBAAoBnU,CAAI,CAAC,GAG1E,CAAC,WAAW,SAAS,SAAS,gBAAgB,SAAS,EAAE;AAAA,MACxD,OAAO5G,EAAM,aAAa;AAAA,IAAA,KAG5B0G,EAAO;AAAA,MACLqU,EAAW,SAAS,wBAAwB,aAAa,GAAGnU,CAAI,gBAAgB;AAAA,IAAA,GAGhF5G,EAAM,YAAY,UAAWyb,GAAqBzb,EAAM,SAAS,GAAG4G,CAAI,YAAYF,CAAM,IAC1F,OAAO1G,EAAM,cAAe,aAAa,OAAOA,EAAM,eAAgB,cACxE0G,EAAO;AAAA,MACLqU,EAAW,SAAS,sBAAsB,oBAAoBnU,CAAI;AAAA,IAAA,GAGjE,OAAO,SAAS5G,EAAM,YAAY,KACrC0G,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAGnU,CAAI;AAAA,MAAA;AAAA,IACT;AAGJ,UAAM8U,IAAmBtU,EAASpH,EAAM,aAAa;AACrD,IAAK0b,KACHhV,EAAO;AAAA,MACLqU,EAAW,SAAS,uBAAuB,aAAa,GAAGnU,CAAI,gBAAgB;AAAA,IAAA;AAEnF,UAAM+U,IAAUvU,EAASpH,EAAM,OAAO,IAAIA,EAAM,UAAU;AAC1D,IAAK2b,IAGHC,GAAqBD,GAAS,GAAG/U,CAAI,YAAYF,CAAM,IAFvDA,EAAO,KAAKqU,EAAW,SAAS,iBAAiB,eAAe,GAAGnU,CAAI,UAAU,CAAC,GAI/EQ,EAASpH,EAAM,UAAU,IAK5B6b,GAAwB7b,EAAM,YAAY,GAAG4G,CAAI,eAAeF,CAAM,IAJtEA,EAAO;AAAA,MACLqU,EAAW,SAAS,oBAAoB,eAAe,GAAGnU,CAAI,aAAa;AAAA,IAAA;AAK/E,UAAMxF,IACJ,OAAOpB,EAAM,iBAAkB,WAC3BQ,EAAsBR,EAAM,aAAa,IACzC;AACN,QAAI,CAACoB,KAAgBA,EAAa,aAAa,SAAS;AACtD,MAAAsF,EAAO;AAAA,QACLqU;AAAAA,UACE;AAAA,UACA;AAAA,UACA,QAAQ/a,EAAM,aAAa;AAAA,UAC3B,GAAG4G,CAAI;AAAA,QAAA;AAAA,MACT;AAEF;AAAA,IACF;AACA,IAAI8U,KACFI;AAAA,MACE1a;AAAA,MACApB,EAAM;AAAA,MACN,GAAG4G,CAAI;AAAA,MACPF;AAAA,IAAA,GAGA1G,EAAM,yBAAyBoB,EAAa,wBAC9CsF,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI;AAAA,QACpB,GAAGwF,CAAI;AAAA,MAAA;AAAA,IACT,GAGCxF,EAAa,wBAAwB,SAASpB,EAAM,YAAY,KACnE0G,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI,OAAOpB,EAAM,YAAY;AAAA,QAC7C,GAAG4G,CAAI;AAAA,MAAA;AAAA,IACT,GAGAxF,EAAa,iBAAiB,eAChCsF,EAAO,KAAKqU,EAAW,WAAW,oBAAoB3Z,EAAa,mBAAmBwF,CAAI,CAAC,GAEzF5G,EAAM,kBAAkB,YAAY2b,GAAS,WAAW,MAC1DjV,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAGnU,CAAI;AAAA,MAAA;AAAA,IACT;AAAA,EAGN;AACA,QAAM2J,wBAAc,IAAA;AAGpB,MAFI3M,KACFmY,GAAcnY,GAAM,mBAAmBkD,GAAUyU,GAAUhL,GAAS7J,GAAQ,GAAG,oBAAI,SAAS,GAC1F+F,KAAY,MAAM,QAAQA,EAAS,QAAQ;AAC7C,eAAW,CAACrK,GAAOkB,CAAO,KAAKmJ,EAAS,SAAS;AAC/C,MAAI,CAACrF,EAAS9D,CAAO,KAAK,CAAC,MAAM,QAAQA,EAAQ,IAAI,KACrDyY;AAAA,QACEzY,EAAQ;AAAA,QACR,uBAAuBlB,CAAK;AAAA,QAC5B0E;AAAA,QACAyU;AAAA,QACAhL;AAAA,QACA7J;AAAA,QACA;AAAA,4BACI,QAAA;AAAA,MAAQ;AAIlB,SACE6T,KACA3W,KACA8I,KACAtF,EAASsF,EAAW,UAAU,KAC9B,MAAM,QAAQA,EAAW,SAAS,KAElChG,EAAO,KAAK,GAAGsO,GAA0BrT,CAAqC,CAAC,GAEjF+E,EAAO,KAAK,GAAGqG,GAAiCpL,CAAqC,CAAC,GAC/E+E;AACT;AAGO,SAASsV,GAAsBxZ,GAA8C;AAClF,SAAOkV,EAAUlV,CAAQ;AAC3B;AAGO,SAASyZ,GAA0BzZ,GAAoC;AAC5E,SAAO,KAAK,UAAUA,CAAQ;AAChC;AAGO,SAASqY,EAAiB1D,GAAwB;AACvD,QAAMC,IACJ,OAAO,SAAW,OAAe,gBAAgB,SAC7C,OAAO,WAAA,EAAa,WAAW,KAAK,EAAE,IACtC,GAAG,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,GAAG,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACtE,SAAO,GAAGD,CAAM,IAAIC,CAAM;AAC5B;AAEA,SAASa,GACPzV,GACApB,GACA2W,GACe;AACf,QAAM9N,IAAa8N,EAAU,cAAcvV,EAAS,WAAW,WAAW,MACpEwU,IAASkF,GAAgB1Z,GAAUpB,EAAa,eAAe6I,CAAU;AAC/E,SAAO;AAAA,IACL,IAAI4Q,EAAiB,OAAO;AAAA,IAC5B,YAAA5Q;AAAA,IACA,KAAK,GAAG7I,EAAa,cAAc,WAAW,KAAK,GAAG,CAAC,IAAI4V,CAAM;AAAA,IACjE,OAAOe,EAAU,SAAS,GAAG3W,EAAa,IAAI,GAAG4V,CAAM;AAAA,IACvD,cAAc5V,EAAa;AAAA,IAC3B,eAAeA,EAAa;AAAA,IAC5B,sBAAsBA,EAAa;AAAA,IACnC,eAAe,EAAE,GAAGsW,EAAUtW,EAAa,oBAAoB,GAAG,GAAG2W,EAAU,cAAA;AAAA,IAC/E,cAAclC,GAAgBzU,EAAa,YAAY;AAAA,IACvD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY,CAAA;AAAA,IACZ,UAAUmL,GAAA;AAAA,IACV,SAAS,EAAE,aAAa,IAAI,QAAQnL,EAAa,kBAAkB,UAAU,UAAU,GAAA;AAAA,IACvF,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAcoB,EAAS,WAAW,OAAO;AAAA,EAAA;AAE7C;AAEA,SAAS0V,GACPlY,GACAiB,GACAkb,GACmB;AACnB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,IAAItB,EAAiB,MAAM;AAAA,IAC3B,SAAS7a,EAAM;AAAA,IACf,QAAQoc,GAAqBnb,GAAakb,CAAgB;AAAA,EAAA;AAE9D;AAEA,SAASnE,GACP5W,GACA1B,GACuB;AACvB,QAAMoD,IAA8B;AAAA,IAClC,UAAU;AAAA,IACV,IAAI+X,EAAiB,MAAM;AAAA,IAC3B,eAAezZ,EAAa;AAAA,IAC5B,sBAAsBA,EAAa;AAAA,IACnC,eAAe,EAAE,GAAGsW,EAAUtW,EAAa,oBAAoB,GAAG,GAAG1B,EAAA;AAAA,IACrE,QAAQ0c,GAAqB,IAAIhb,EAAa,gBAAgB;AAAA,IAC9D,OAAOib,GAAmBjb,CAAY;AAAA,EAAA;AAExC,SAAAsZ,GAA0B5X,CAAI,GACvBA;AACT;AAEA,SAASuZ,GAAmBjb,GAAmE;AAC7F,SAAKA,EAAa,kBACdA,EAAa,kBAAkB,SAC1B,CAAC,GAAG,CAAC,EAAE,IAAI,CAACgB,OAAW;AAAA,IAC5B,IAAIyY,EAAiB,MAAM;AAAA,IAC3B,UAAU,OAAOzY,CAAK;AAAA,IACtB,OAAO,OAAOA,CAAK;AAAA,IACnB,UAAU,CAAA;AAAA,EAAC,EACX,IAEG,CAAC,EAAE,IAAIyY,EAAiB,MAAM,GAAG,UAAU,WAAW,OAAO,MAAM,UAAU,CAAA,GAAI,IAT9C,CAAA;AAU5C;AAEA,SAASuB,GAAqBE,GAAgBC,GAA4C;AACxF,SAAO;AAAA,IACL,IAAI,EAAE,MAAMD,GAAQ,QAAQ,GAAG,WAAAC,GAAW,eAAe,UAAA;AAAA,IACzD,QAAQ,EAAE,MAAM,IAAI,QAAQ,GAAG,WAAAA,GAAW,eAAe,UAAA;AAAA,EAAU;AAEvE;AAEA,SAAS/D,GACPF,GACApB,GACAsF,GACM;AACN,MAAIA,MAAgB,OAAW;AAC/B,QAAMC,IAAYnE,EAAW,UAAU,CAAClY,MAASA,EAAK,OAAO8W,CAAM,GAC7DpU,IAAOwV,EAAWmE,CAAS;AACjC,MAAI,CAAC3Z,KAAQ2Z,IAAY,EAAG;AAC5B,QAAMC,IAAe,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMF,CAAW,CAAC,CAAC,GAChExZ,IAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIF,EAAK,OAAO,GAAG,IAAI,CAAC;AAC1D,MAAIuB,IAAS;AACb,aAAWsY,KAAYrE,EAAW,MAAM,GAAGmE,CAAS,GAAG;AACrD,UAAMG,IAAe,KAAK,IAAI,GAAG,KAAK,IAAI,IAAID,EAAS,OAAO,GAAG,IAAI,CAAC,GAChEE,IAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIF,EAAS,OAAO,GAAG,MAAM,CAAC;AAC1E,IAAItY,IAAS,KAAKA,IAASwY,IAAiBD,IAAe,OAAIvY,IAAS,IACxEA,IAAS,KAAK,IAAI,IAAIA,IAASwY,IAAiBD,CAAY,GACxDvY,KAAU,OAAIA,IAAS;AAAA,EAC7B;AACA,EAAAvB,EAAK,OAAO,GAAG,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKE,GAAM0Z,IAAerY,CAAM,CAAC;AAChF;AAEA,SAASwR,GAAgB5T,GAA8C;AACrE,SAAIA,MAAS,UAAgB,CAAA,IACzBA,MAAS,YAAkB,KAC3BA,MAAS,YACTA,MAAS,WAAiB,OACvB;AACT;AAEA,SAASia,GACP1Z,GACA/B,GACAwJ,GACQ;AACR,QAAMkN,IAAS1W,EAAc,WAAW,KAAK,GAAG;AAChD,MAAIuW,IAAS;AACb,SACExU,EAAS,WAAW,OAAO;AAAA,IACzB,CAACxC,MAAUA,EAAM,eAAeiK,KAAcjK,EAAM,QAAQ,GAAGmX,CAAM,IAAIH,CAAM;AAAA,EAAA;AAGjF,IAAAA,KAAU;AACZ,SAAOA;AACT;AAEA,SAAS8F,GACP1Z,GACAyQ,GACAkJ,GACgC;AAChC,aAAWja,KAAQM;AACjB,QAAIN,EAAK,aAAa,aACtB;AAAA,UAAIA,EAAK,OAAO+Q,EAAa,QAAO/Q,EAAK,MAAM,KAAK,CAACO,MAASA,EAAK,aAAa0Z,CAAQ;AACxF,iBAAW1Z,KAAQP,EAAK,OAAO;AAC7B,cAAMgB,IAAQgZ,GAAkBzZ,EAAK,UAAUwQ,GAAakJ,CAAQ;AACpE,YAAIjZ,EAAO,QAAOA;AAAA,MACpB;AAAA;AAGJ;AAEA,SAAS6V,GACPvW,GACAkP,GACmC;AACnC,aAAWxP,KAAQM;AACjB,QAAIN,EAAK,aAAa,aACtB;AAAA,UACE,CAAC,gBAAgB,gBAAgB,EAAE,SAASA,EAAK,aAAa,KAC9DA,EAAK,cAAc,iBAAiBwP;AAEpC,eAAOxP;AAET,iBAAWO,KAAQP,EAAK,OAAO;AAC7B,cAAMgB,IAAQ6V,GAAsBtW,EAAK,UAAUiP,CAAY;AAC/D,YAAIxO,EAAO,QAAOA;AAAA,MACpB;AAAA;AAGJ;AAEA,SAASsU,EACPhV,GACA8T,GAC2F;AAC3F,QAAM9U,IAAQgB,EAAM,UAAU,CAACN,MAASA,EAAK,OAAOoU,CAAM;AAC1D,MAAI9U,KAAS,EAAG,QAAO,EAAE,MAAMgB,EAAMhB,CAAK,GAAI,YAAYgB,GAAO,OAAAhB,EAAA;AACjE,aAAWU,KAAQM;AACjB,QAAIN,EAAK,aAAa;AACtB,iBAAWO,KAAQP,EAAK,OAAO;AAC7B,cAAMgB,IAAQsU,EAAW/U,EAAK,UAAU6T,CAAM;AAC9C,YAAIpT,EAAO,QAAOA;AAAA,MACpB;AAGJ;AAEA,SAASyV,GACPnW,GACA8T,GACgC;AAChC,QAAMpT,IAAQsU,EAAWhV,GAAO8T,CAAM;AACtC,MAAKpT;AACL,WAAOA,EAAM,WAAW,OAAOA,EAAM,OAAO,CAAC,EAAE,CAAC;AAClD;AAEA,SAASsW,GACP5X,GACAM,GACoB;AACpB,MAAIA,EAAK,aAAa,SAAS;AAC7B,UAAMnB,IAASa,EAAS,WAAW,OAAO,KAAK,CAACxC,MAAUA,EAAM,OAAO8C,EAAK,OAAO;AACnF,QAAI,CAACnB,EAAQ,QAAO,EAAE,GAAG+V,EAAU5U,CAAI,GAAG,IAAI+X,EAAiB,MAAM,EAAA;AACrE,UAAMpH,IAAOiE,EAAU/V,CAAM;AAC7B8R,WAAAA,EAAK,KAAKoH,EAAiB,OAAO,GAClCpH,EAAK,MAAMuJ,GAAexa,GAAUb,EAAO,YAAY,GAAGA,EAAO,GAAG,OAAO,GAC3E8R,EAAK,QAAQ,GAAG9R,EAAO,KAAK,MAC5Ba,EAAS,WAAW,OAAO,KAAKiR,CAAI,GAC7B,EAAE,GAAGiE,EAAU5U,CAAI,GAAG,IAAI+X,EAAiB,MAAM,GAAG,SAASpH,EAAK,GAAA;AAAA,EAC3E;AACA,QAAMA,IAAOiE,EAAU5U,CAAI;AAC3B,SAAA2Q,EAAK,KAAKoH,EAAiB,MAAM,GACjCpH,EAAK,QAAQA,EAAK,MAAM,IAAI,CAACpQ,OAAU;AAAA,IACrC,GAAGA;AAAA,IACH,IAAIwX,EAAiB,MAAM;AAAA,IAC3B,UAAUxX,EAAK,SAAS,IAAI,CAACsP,MAAUyH,GAAoB5X,GAAUmQ,CAAK,CAAC;AAAA,EAAA,EAC3E,GACE,OAAOc,EAAK,cAAc,SAAU,aACtCA,EAAK,cAAc,QAAQ,GAAGA,EAAK,cAAc,KAAK,OACxDD,GAAkChR,GAAUM,GAAM2Q,CAAI,GAC/CA;AACT;AAEA,SAASuJ,GAAexa,GAA4ByH,GAAoBgT,GAA2B;AACjG,MAAIrb,IAAMqb,GACNjG,IAAS;AACb,SACExU,EAAS,WAAW,OAAO,KAAK,CAACxC,MAAUA,EAAM,eAAeiK,KAAcjK,EAAM,QAAQ4B,CAAG;AAE/F,IAAAA,IAAM,GAAGqb,CAAS,IAAIjG,CAAM,IAC5BA,KAAU;AAEZ,SAAOpV;AACT;AAEA,SAASwQ,GAAUhP,GAA6ByC,GAAmD;AACjG,aAAW/C,KAAQM;AAEjB,QADAyC,EAAQ/C,CAAI,GACRA,EAAK,aAAa;AACpB,iBAAWO,KAAQP,EAAK,MAAO,CAAAsP,GAAU/O,EAAK,UAAUwC,CAAO;AAGrE;AAEA,SAASkT,GAAsBjW,GAA0B+Q,GAA8B;AACrF,SAAI/Q,EAAK,aAAa,cAAoB,KACtCA,EAAK,OAAO+Q,IAAoB,KAC7B/Q,EAAK,MAAM;AAAA,IAAK,CAACO,MACtBA,EAAK,SAAS,KAAK,CAACsP,MAAUoG,GAAsBpG,GAAOkB,CAAW,CAAC;AAAA,EAAA;AAE3E;AAGA,SAASwF,GAAiBvW,GAAkC;AAC1D,SAAIA,EAAK,aAAa,cAAoB,IACnCA,EAAK,MAAM;AAAA,IAChB,CAACR,GAASe,MACR,KAAK,IAAIf,GAAS,GAAGe,EAAK,SAAS,IAAI,CAACsP,MAAU,IAAI0G,GAAiB1G,CAAK,CAAC,GAAG,CAAC;AAAA,IACnF;AAAA,EAAA;AAEJ;AAGA,SAASuK,GAAc9Z,GAA6B8T,GAAgB7Q,IAAQ,GAAuB;AACjG,aAAWvD,KAAQM,GAAO;AACxB,QAAIN,EAAK,OAAOoU,EAAQ,QAAO7Q;AAC/B,QAAIvD,EAAK,aAAa;AACtB,iBAAWO,KAAQP,EAAK,OAAO;AAC7B,cAAMgB,IAAQoZ,GAAc7Z,EAAK,UAAU6T,GAAQ7Q,IAAQ,CAAC;AAC5D,YAAIvC,MAAU,OAAW,QAAOA;AAAA,MAClC;AAAA,EACF;AAEF;AAEA,SAASiY,GACP3Y,GACAwD,GACAE,GACAyU,GACAhL,GACA7J,GACAL,GACA8W,GACM;AACN,MAAI,CAAC,MAAM,QAAQ/Z,CAAK,GAAG;AACzB,IAAAsD,EAAO,KAAKqU,EAAW,SAAS,qBAAqB,qBAAqBnU,CAAI,CAAC;AAC/E;AAAA,EACF;AACA,EAAIP,IAAQ,KAAGK,EAAO,KAAKqU,EAAW,SAAS,gBAAgB,gBAAgBnU,CAAI,CAAC;AACpF,aAAW,CAACxE,GAAOgb,CAAO,KAAKha,EAAM,WAAW;AAC9C,UAAM8D,IAAW,GAAGN,CAAI,IAAIxE,CAAK;AACjC,QAAI,CAACgF,EAASgW,CAAO,GAAG;AACtB,MAAA1W,EAAO,KAAKqU,EAAW,SAAS,aAAa,aAAa7T,CAAQ,CAAC;AACnE;AAAA,IACF;AACA,QAAIiW,EAAU,IAAIC,CAAO,GAAG;AAC1B,MAAA1W,EAAO,KAAKqU,EAAW,SAAS,cAAc,gBAAgB7T,CAAQ,CAAC;AACvE;AAAA,IACF;AACA,IAAAiW,EAAU,IAAIC,CAAO;AACrB,UAAMta,IAAOsa;AAMb,QALI,OAAOta,EAAK,MAAO,YAAY,CAACA,EAAK,MAAMyN,EAAQ,IAAIzN,EAAK,EAAE,IAChE4D,EAAO,KAAKqU,EAAW,SAAS,WAAW,eAAe,GAAG7T,CAAQ,KAAK,CAAC,IAE3EqJ,EAAQ,IAAIzN,EAAK,EAAE,GAEjBA,EAAK,aAAa,SAAS;AAC7B,MAAAsY;AAAA,QACEgC;AAAA,QACA,CAAC,YAAY,MAAM,WAAW,QAAQ;AAAA,QACtClW;AAAA,QACA;AAAA,QACAR;AAAA,MAAA,IAEE,OAAO5D,EAAK,WAAY,YAAY,CAACgE,EAAS,IAAIhE,EAAK,OAAO,MAChE4D,EAAO;AAAA,QACLqU,EAAW,SAAS,mBAAmB,eAAe,GAAG7T,CAAQ,UAAU;AAAA,MAAA,GAE/EmW,GAAava,EAAK,QAAQ,GAAGoE,CAAQ,WAAWR,CAAM;AACtD;AAAA,IACF;AACA,QAAI5D,EAAK,aAAa,aAAa;AACjC,MAAA4D,EAAO;AAAA,QACLqU;AAAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG7T,CAAQ;AAAA,QAAA;AAAA,MACb;AAEF;AAAA,IACF;AACA,IAAAkU;AAAA,MACEgC;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEFlW;AAAA,MACA;AAAA,MACAR;AAAA,IAAA;AAEF,UAAMtF,IACJ,OAAO0B,EAAK,iBAAkB,WAAWtC,EAAsBsC,EAAK,aAAa,IAAI;AACvF,IAAI,CAAC1B,KAAgBA,EAAa,aAAa,cAC7CsF,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,QAAQjY,EAAK,aAAa;AAAA,QAC1B,GAAGoE,CAAQ;AAAA,MAAA;AAAA,IACb,KAGEpE,EAAK,yBAAyB1B,EAAa,wBAC7CsF,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI;AAAA,QACpB,GAAG8F,CAAQ;AAAA,MAAA;AAAA,IACb,GAGA9F,EAAa,iBAAiB,eAChCsF,EAAO;AAAA,MACLqU,EAAW,WAAW,wBAAwB3Z,EAAa,mBAAmB8F,CAAQ;AAAA,IAAA,GAGrFE,EAAStE,EAAK,aAAa,IAU9BgZ;AAAA,MACE1a;AAAA,MACA0B,EAAK;AAAA,MACL,GAAGoE,CAAQ;AAAA,MACXR;AAAA,IAAA,IAbFA,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI;AAAA,QACpB,GAAG8F,CAAQ;AAAA,MAAA;AAAA,IACb,GAUC,MAAM,QAAQpE,EAAK,KAAK,KAC3B4D,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI;AAAA,QACpB,GAAG8F,CAAQ;AAAA,MAAA;AAAA,IACb,IAINmW,GAAava,EAAK,QAAQ,GAAGoE,CAAQ,WAAWR,CAAM;AACtD,UAAM4W,IAAQ,MAAM,QAAQxa,EAAK,KAAK,IAAIA,EAAK,QAAQ,CAAA,GACjDya,wBAAgB,IAAA,GAChBC,wBAAc,IAAA;AACpB,IAAIpc,GAAc,aAAa,gBACzB,CAACA,EAAa,mBAAmBkc,EAAM,SAAS,IAClD5W,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI;AAAA,QACpB,GAAG8F,CAAQ;AAAA,MAAA;AAAA,IACb,IAEO9F,EAAa,mBAAmB0B,EAAK,kBAAkB,UAC5Dwa,EAAM,WAAW,KAAKA,EAAM,CAAC,GAAG,aAAa,cAC/C5W,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI;AAAA,QACpB,GAAG8F,CAAQ;AAAA,MAAA;AAAA,IACb,IAGKpE,EAAK,kBAAkB,UAAUwa,EAAM,WAAW,KAC3D5W,EAAO;AAAA,MACLqU,EAAW,SAAS,aAAa,iBAAiB,GAAG7T,CAAQ,QAAQ;AAAA,IAAA;AAI3E,eAAW,CAAC4P,GAAW2G,CAAO,KAAKH,EAAM,WAAW;AAClD,YAAMI,IAAW,GAAGxW,CAAQ,UAAU4P,CAAS;AAC/C,UAAI,CAAC1P,EAASqW,CAAO,GAAG;AACtB,QAAA/W,EAAO,KAAKqU,EAAW,SAAS,aAAa,aAAa2C,CAAQ,CAAC;AACnE;AAAA,MACF;AACA,YAAMra,IAAOoa;AA2Bb,UA1BI,OAAOpa,EAAK,MAAO,YAAY,CAACA,EAAK,MAAMma,EAAQ,IAAIna,EAAK,EAAE,IAChEqD,EAAO,KAAKqU,EAAW,SAAS,WAAW,eAAe,GAAG2C,CAAQ,KAAK,CAAC,IACxEF,EAAQ,IAAIna,EAAK,EAAE,GACpB,OAAOA,EAAK,SAAU,YACxBqD,EAAO;AAAA,QACLqU,EAAW,SAAS,cAAc,eAAe,GAAG2C,CAAQ,QAAQ;AAAA,MAAA,GAEpE,OAAOra,EAAK,YAAa,YAAY,CAACA,EAAK,WAC7CqD,EAAO,KAAKqU,EAAW,SAAS,aAAa,cAAc2C,CAAQ,CAAC,IAC7DH,EAAU,IAAIla,EAAK,QAAQ,IAClCqD,EAAO;AAAA,QACLqU;AAAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG7T,CAAQ,UAAU4P,CAAS;AAAA,QAAA;AAAA,MAChC,IAECyG,EAAU,IAAIla,EAAK,QAAQ,GAChC+X;AAAA,QACEqC;AAAA,QACA,CAAC,MAAM,YAAY,SAAS,UAAU;AAAA,QACtCC;AAAA,QACA;AAAA,QACAhX;AAAA,MAAA,GAEE,CAAC,MAAM,QAAQrD,EAAK,QAAQ,GAAG;AACjC,QAAAqD,EAAO;AAAA,UACLqU;AAAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG2C,CAAQ;AAAA,UAAA;AAAA,QACb;AAEF;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB,gBAAgB,EAAE,SAAS5a,EAAK,aAAa,GAAG;AACnE,cAAM6a,yBAAqB,IAAA;AAC3B,mBAAW,CAACC,IAAYC,EAAQ,KAAKxa,EAAK,SAAS,WAAW;AAC5D,gBAAMya,KAAY,GAAG5W,CAAQ,UAAU4P,CAAS,cAAc8G,EAAU;AACxE,cAAI,CAACxW,EAASyW,EAAQ,GAAG;AACvB,YAAAnX,EAAO;AAAA,cACLqU,EAAW,SAAS,uBAAuB,cAAc+C,EAAS;AAAA,YAAA;AAEpE;AAAA,UACF;AACA,gBAAMnL,KAAQkL;AACd,cAAIlL,GAAM,aAAa,SAAS;AAC9B,YAAAjM,EAAO,KAAKqU,EAAW,SAAS,kBAAkB,cAAc+C,EAAS,CAAC;AAC1E;AAAA,UACF;AACA,UAAIH,GAAe,IAAIhL,GAAM,OAAO,KAClCjM,EAAO;AAAA,YACLqU;AAAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA,GAAG+C,EAAS;AAAA,YAAA;AAAA,UACd,GAGJH,GAAe,IAAIhL,GAAM,OAAO;AAChC,gBAAMoL,KAAaxC,EAAS,IAAI5I,GAAM,OAAO;AAG7C,YADEoL,MAAc3W,EAAS2W,GAAW,OAAO,IAAIA,GAAW,UAAU,SAClD,WAAW,MAAQA,IAAY,kBAAkB,aACjErX,EAAO;AAAA,YACLqU;AAAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA+C;AAAA,YAAA;AAAA,UACF;AAAA,QAGN;AAAA,MACF;AACA,MAAA/B;AAAA,QACE1Y,EAAK;AAAA,QACL,GAAG6D,CAAQ,UAAU4P,CAAS;AAAA,QAC9BhQ;AAAA,QACAyU;AAAA,QACAhL;AAAA,QACA7J;AAAA,QACAL,IAAQ;AAAA,QACR8W;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACF;AAGA,SAAS9E,GACP7V,GACAM,GACAJ,GACQ;AACR,QAAMuW,IAAkBC,GAAoB1W,GAAUE,CAAM;AAC5D,MAAIuW,EAAiB,QAAOA;AAC5B,MAAInW,EAAK,aAAa,aAAa;AACjC,UAAM1B,IAAeZ,EAAsBsC,EAAK,aAAa;AAC7D,WAAI,CAAC1B,KAAgBA,EAAa,aAAa,cAAoB,eAC/DA,EAAa,iBAAiB,gBAAsBA,EAAa,oBAC9D+X;AAAA,MACL3W;AAAA,MACAE,EAAO;AAAA,MACP;AAAA,MACAI,EAAK;AAAA,MACL;AAAA,MACAuW,GAAiBvW,CAAI;AAAA,MACrB;AAAA,IAAA;AAAA,EAEJ;AACA,QAAM9C,IAAQwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,OAAO0C,EAAK,OAAO;AAChF,MAAI,CAAC9C,EAAO,QAAO;AACnB,QAAMoB,IAAeZ,EAAsBR,EAAM,aAAa;AAC9D,SAAI,CAACoB,KAAgBA,EAAa,aAAa,UAAgB,eAC3DA,EAAa,iBAAiB,gBAAsBA,EAAa,oBAC9D+X;AAAA,IACL3W;AAAA,IACAE,EAAO;AAAA,IACP;AAAA,IACA1C,EAAM;AAAA,IACNA,EAAM,QAAQ;AAAA,IACd;AAAA,IACAA,EAAM;AAAA,EAAA;AAEV;AAGA,SAASkZ,GAAoB1W,GAA4BE,GAAoC;AAC3F,MAAI,CAAC,OAAO,UAAUA,EAAO,KAAK,EAAG,QAAO;AAC5C,MACEA,EAAO,gBAAgB,WACtB,CAAC,OAAO,UAAUA,EAAO,WAAW,KAAKA,EAAO,cAAc,KAAKA,EAAO,cAAc;AAEzF,WAAO;AAET,QAAM4V,IAAaC,GAAsB/V,GAAUE,CAAM;AACzD,SAAK4V,IACD5V,EAAO,QAAQ,KAAKA,EAAO,QAAQ4V,EAAW,SAAe,gBAC1D,KAFiB5V,EAAO,cAAc,cAAc;AAG7D;AAGA,SAAS6V,GACP/V,GACAE,GACkC;AAClC,SAAKA,EAAO,cACLoa,GAAkBta,EAAS,SAAS,MAAME,EAAO,aAAaA,EAAO,QAAQ,GAAG,WADvDA,EAAO,aAAa,SAASF,EAAS,SAAS,OAAO;AAExF;AAGA,SAAS2W,GACP3W,GACAwR,GACAgK,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAcrK,IAChBkJ,GAAc1a,EAAS,SAAS,MAAMwR,CAAiB,IACvD;AACJ,MAAIA,KAAqBqK,MAAgB,OAAW,QAAO;AAC3D,OAAKA,KAAe,MAAM,IAAIF,IAAqB,EAAG,QAAO;AAC7D,MAAIH,MAAe,WAAWI,GAAkB;AAC9C,UAAMnK,IAAmBL,GAAgCpR,GAAUwR,CAAiB;AACpF,QAAI,CAACC,EAAkB,QAAO;AAC9B,QAAImK,MAAqBnK;AACvB,aAAO,UAAUmK,CAAgB,WAAWnK,CAAgB;AAAA,EAEhE;AACA,MAAI,CAACD,EAAmB,QAAO;AAC/B,QAAMtR,IAAS2X,GAAiB7X,EAAS,SAAS,MAAMwR,CAAiB;AACzE,MAAI,CAACtR,KAAUA,EAAO,aAAa,YAAa,QAAO;AACvD,QAAM4b,IAAqB9d,EAAsBkC,EAAO,aAAa;AACrE,SAAK4b,GAAoB,kBAEpB,CAAC,gBAAgB,gBAAgB,EAAE,SAAS5b,EAAO,aAAa,IACjEsb,MAAe,UAAgB,sBAC/BE,KAAgBD,MAAwB,WAAiB,kBACtD,KAHwE,KADtE,GAAGK,GAAoB,QAAQ,MAAM;AAKhD;AAGA,SAASxC,GACP1a,GACA1B,GACAkH,GACAF,GACM;AACN,QAAM6X,IAAc,IAAI,IAAInd,EAAa,WAAW,IAAI,CAAChB,MAAS,CAACA,EAAK,KAAKA,CAAI,CAAC,CAAC,GAC7EqI,wBAAkB,IAAI;AAAA,IAC1B,GAAG,OAAO,KAAKrH,EAAa,oBAAoB;AAAA,IAChD,GAAGmd,EAAY,KAAA;AAAA,EAAK,CACrB;AACD,EAAAnD;AAAA,IACE1b;AAAA,IACA+I;AAAA,IACA7B;AAAA,IACA;AAAA,IACAF;AAAA,EAAA;AAEF,aAAW,CAAC9E,GAAKjE,CAAK,KAAK,OAAO,QAAQ+B,CAAa,GAAG;AACxD,QAAI,CAAC+I,EAAY,IAAI7G,CAAG,EAAG;AAC3B,UAAM4c,IAAaD,EAAY,IAAI3c,CAAG;AACtC,QAAI4c,GAAY;AACd,MAAAC;AAAA,QACErd;AAAA,QACAod;AAAA,QACA7gB;AAAA,QACAyD,EAAa,qBAAqBQ,CAAG,MAAM;AAAA,QAC3C,GAAGgF,CAAI,IAAIhF,CAAG;AAAA,QACd8E;AAAA,MAAA;AAEF;AAAA,IACF;AACA,IAAAgY;AAAA,MACEtd;AAAA,MACAQ;AAAA,MACAR,EAAa,qBAAqBQ,CAAG;AAAA,MACrCjE;AAAA,MACA,GAAGiJ,CAAI,IAAIhF,CAAG;AAAA,MACd8E;AAAA,IAAA;AAAA,EAEJ;AACA,EAAAiY,GAAmCvd,GAAc1B,GAAekH,GAAMF,CAAM;AAC9E;AAEA,SAAS+X,GACPrd,GACAod,GACA7gB,GACAihB,GACAhY,GACAF,GACM;AACN,MAAI/I,MAAU,QAAQihB,EAAU;AAChC,QAAM7c,IAASyc,EAAW;AAC1B,MAAIzc,EAAO,SAAS,cAAc;AAChC,KAAI,OAAOpE,KAAU,YAAY,CAAC,+BAA+B,KAAKA,CAAK,MACzE+I,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI,KAAKod,EAAW,KAAK;AAAA,QACzC5X;AAAA,MAAA;AAAA,IACF;AAGJ;AAAA,EACF;AACA,MACE,CAAC,QAAQ,YAAY,SAAS,eAAe,cAAc,oBAAoB,EAAE;AAAA,IAC/E7E,EAAO;AAAA,EAAA,GAET;AACA,IAAI,OAAOpE,KAAU,YACnBkhB,GAAgCzd,GAAcod,EAAW,OAAO5X,GAAMF,CAAM;AAC9E;AAAA,EACF;AACA,MAAI3E,EAAO,SAAS,OAAO;AACzB,QAAI,OAAOpE,KAAU,UAAU;AAC7B,MAAAkhB,GAAgCzd,GAAcod,EAAW,OAAO5X,GAAMF,CAAM;AAC5E;AAAA,IACF;AACA,IAAI/I,KAAS,CAACmhB,GAAWnhB,CAAK,KAC5B+I,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI,KAAKod,EAAW,KAAK;AAAA,QACzC5X;AAAA,MAAA;AAAA,IACF;AAGJ;AAAA,EACF;AACA,MAAI7E,EAAO,SAAS,WAAW;AAC7B,IAAI,OAAOpE,KAAU,aACnBkhB,GAAgCzd,GAAcod,EAAW,OAAO5X,GAAMF,CAAM;AAC9E;AAAA,EACF;AACA,MACE3E,EAAO,SAAS,YAChBA,EAAO,SAAS,mBAChBA,EAAO,SAAS,eAChBA,EAAO,SAAS,eAChB;AACA,QAAI,OAAOpE,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,GAAG;AACxD,MAAAkhB,GAAgCzd,GAAcod,EAAW,OAAO5X,GAAMF,CAAM;AAC5E;AAAA,IACF;AACA,UAAMrE,IAAU,aAAaN,IAASA,EAAO,UAAU,QACjDO,IAAU,aAAaP,IAASA,EAAO,UAAU;AACvD,KAAKM,MAAY,UAAa1E,IAAQ0E,KAAaC,MAAY,UAAa3E,IAAQ2E,MAClFoE,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI,KAAKod,EAAW,KAAK;AAAA,QACzC5X;AAAA,MAAA;AAAA,IACF;AAGJ;AAAA,EACF;AACA,MAAI7E,EAAO,SAAS,YAAYA,EAAO,SAAS,aAAa;AAE3D,IACE,CAFmBA,EAAO,QAAQ,IAAI,CAAC3B,MAASA,EAAK,KAAK,EAE5C,KAAK,CAAC2e,MAAgBA,MAAgBphB,CAAK,KACzDoE,EAAO,sBAAsB,cAE7B2E,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG3Z,EAAa,IAAI,KAAKod,EAAW,KAAK;AAAA,QACzC5X;AAAA,MAAA;AAAA,IACF;AAGJ;AAAA,EACF;AACA,EAAI7E,EAAO,SAAS,aAClBid,GAA6B5d,GAAcod,EAAW,OAAO7gB,GAAOiJ,GAAMF,GAAQ,oBAAI,SAAS;AAEnG;AAGA,SAASiY,GACPvd,GACA1B,GACAkH,GACAF,GACM;AACN,EAAAuY;AAAA,IACE7d;AAAA,IACA1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAkH;AAAA,IACAF;AAAA,EAAA,GAEFuY;AAAA,IACE7d;AAAA,IACA1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAkH;AAAA,IACAF;AAAA,EAAA,GAEFuY;AAAA,IACE7d;AAAA,IACA1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAkH;AAAA,IACAF;AAAA,EAAA;AAEF,QAAMwY,IAAoBxf,EAAc,mBAClCyf,IAAoBzf,EAAc;AACxC,EACE0f,GAAeF,CAAiB,KAChCE,GAAeD,CAAiB,KAChCA,IAAoB,KACpBD,IAAoBC,KAEpBzY,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG3Z,EAAa,IAAI;AAAA,MACpB,GAAGwF,CAAI;AAAA,IAAA;AAAA,EACT;AAGN;AAEA,SAASqY,GACP7d,GACA1B,GACA2f,GACAC,GACAC,GACAC,GACA5Y,GACAF,GACM;AACN,QAAMrE,IAAU3C,EAAc2f,CAAU,GAClC/c,IAAU5C,EAAc4f,CAAU;AACxC,EAAI,CAACF,GAAe/c,CAAO,KAAK,CAAC+c,GAAe9c,CAAO,KAAKD,KAAWC,KACvEoE,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG3Z,EAAa,IAAI,IAAIme,CAAY,OAAOC,CAAY;AAAA,MACvD,GAAG5Y,CAAI,IAAIyY,CAAU;AAAA,IAAA;AAAA,EACvB;AAEJ;AAEA,SAASD,GAAezhB,GAAiC;AACvD,SAAO,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK;AAC3D;AAEA,SAASmhB,GAAWnhB,GAAwB;AAC1C,MAAI;AACF,WAAO,IAAI,IAAIA,CAAK,EAAE,aAAa;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASqhB,GACP5d,GACAS,GACAF,GACAiF,GACAF,GACA+Y,GACM;AACN,MAAI,CAAC,MAAM,QAAQ9d,CAAM,GAAG;AAC1B,IAAAkd,GAAgCzd,GAAcS,GAAO+E,GAAMF,CAAM;AACjE;AAAA,EACF;AACA,MAAI+Y,EAAK,IAAI9d,CAAM,GAAG;AACpB,IAAA+E,EAAO;AAAA,MACLqU,EAAW,SAAS,iCAAiC,GAAGlZ,CAAK,YAAY+E,CAAI;AAAA,IAAA;AAE/E;AAAA,EACF;AACA,EAAA6Y,EAAK,IAAI9d,CAAM;AACf,aAAW,CAACS,GAAOhC,CAAI,KAAKuB,EAAO,WAAW;AAC5C,UAAM0M,IAAW,GAAGzH,CAAI,IAAIxE,CAAK;AACjC,QAAI,EAAC,UAAU,UAAU,SAAS,EAAE,SAAS,OAAOhC,CAAI,GACxD;AAAA,UAAI,CAACgH,EAAShH,CAAI,GAAG;AACnB,QAAAsG,EAAO;AAAA,UACLqU;AAAAA,YACE;AAAA,YACA;AAAA,YACA,GAAG3Z,EAAa,IAAI,KAAKS,CAAK;AAAA,YAC9BwM;AAAA,UAAA;AAAA,QACF;AAEF;AAAA,MACF;AACA,MAAA+M;AAAA,QACEhb;AAAA,QACA,CAAC,SAAS,SAAS,eAAe,YAAY,UAAU;AAAA,QACxDiO;AAAA,QACA;AAAA,QACA3H;AAAA,MAAA,IAGA,OAAOtG,EAAK,SAAU,YACtB,CAAC,CAAC,UAAU,UAAU,SAAS,EAAE,SAAS,OAAOA,EAAK,KAAK,MAE3DsG,EAAO;AAAA,QACLqU;AAAAA,UACE;AAAA,UACA;AAAA,UACA,GAAG3Z,EAAa,IAAI,KAAKS,CAAK;AAAA,UAC9BwM;AAAA,QAAA;AAAA,MACF,GAIFjO,EAAK,gBAAgB,UACrBA,EAAK,gBAAgB,QACrB,OAAOA,EAAK,eAAgB,YAE5BsG,EAAO;AAAA,QACLqU;AAAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG1M,CAAQ;AAAA,QAAA;AAAA,MACb,GAGAjO,EAAK,aAAa,UAAa,OAAOA,EAAK,YAAa,aAC1DsG,EAAO;AAAA,QACLqU;AAAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG1M,CAAQ;AAAA,QAAA;AAAA,MACb,GAGAjO,EAAK,aAAa,UACpB4e;AAAA,QACE5d;AAAA,QACAS;AAAA,QACAzB,EAAK;AAAA,QACL,GAAGiO,CAAQ;AAAA,QACX3H;AAAA,QACA+Y;AAAA,MAAA;AAAA;AAAA,EAGN;AACF;AAEA,SAASf,GACPtd,GACAQ,GACA8d,GACA/hB,GACAiJ,GACAF,GACM;AAMN,GAAI,EALY,MAAM,QAAQgZ,CAAQ,IAClC,MAAM,QAAQ/hB,CAAK,IACnB+hB,MAAa,OACX/hB,MAAU,OACV,OAAOA,KAAU,OAAO+hB,MACb,OAAO/hB,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,MAClE+I,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG3Z,EAAa,IAAI,KAAKQ,CAAG;AAAA,MAC5BgF;AAAA,IAAA;AAAA,EACF;AAGN;AAEA,SAASiY,GACPzd,GACAS,GACA+E,GACAF,GACM;AACN,EAAAA,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG3Z,EAAa,IAAI,KAAKS,CAAK;AAAA,MAC9B+E;AAAA,IAAA;AAAA,EACF;AAEJ;AAEA,SAASgV,GACPD,GACA/U,GACAF,GACM;AACN,EAAA0U;AAAA,IACEO;AAAA,IACA,CAAC,eAAe,UAAU,UAAU;AAAA,IACpC/U;AAAA,IACA;AAAA,IACAF;AAAA,EAAA,IAGA,OAAOiV,EAAQ,UAAW,aAC1B,OAAOA,EAAQ,YAAa,aAC5B,OAAOA,EAAQ,eAAgB,aAE/BjV,EAAO,KAAKqU,EAAW,SAAS,uBAAuB,eAAenU,CAAI,CAAC;AAE/E;AAEA,SAASiV,GACPlO,GACA/G,GACAF,GACM;AACN,EAAA0U;AAAA,IACEzN;AAAA,IACA,CAAC,iBAAiB,iBAAiB,WAAW,WAAW,WAAW,SAAS;AAAA,IAC7E/G;AAAA,IACA;AAAA,IACAF;AAAA,EAAA;AAEF,aAAW9E,KAAO,CAAC,iBAAiB,eAAe,GAAY;AAC7D,UAAMjE,IAAQgQ,EAAW/L,CAAG;AAC5B,IAAIjE,MAAU,WAAc,CAAC,OAAO,UAAUA,CAAK,KAAMA,IAAmB,MAC1E+I,EAAO;AAAA,MACLqU,EAAW,SAAS,2BAA2B,GAAGnZ,CAAG,YAAY,GAAGgF,CAAI,IAAIhF,CAAG,EAAE;AAAA,IAAA;AAAA,EAGvF;AACA,aAAWA,KAAO,CAAC,WAAW,SAAS,GAAY;AACjD,UAAMjE,IAAQgQ,EAAW/L,CAAG;AAC5B,IAAIjE,MAAU,WAAc,OAAOA,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,MAC7E+I,EAAO;AAAA,MACLqU,EAAW,SAAS,2BAA2B,GAAGnZ,CAAG,YAAY,GAAGgF,CAAI,IAAIhF,CAAG,EAAE;AAAA,IAAA;AAAA,EAGvF;AACA,aAAWA,KAAO,CAAC,WAAW,SAAS,GAAY;AACjD,UAAMjE,IAAQgQ,EAAW/L,CAAG;AAC5B,IAAIjE,MAAU,UAAa,OAAOA,KAAU,YAC1C+I,EAAO;AAAA,MACLqU,EAAW,SAAS,yBAAyB,GAAGnZ,CAAG,UAAU,GAAGgF,CAAI,IAAIhF,CAAG,EAAE;AAAA,IAAA;AAAA,EAGnF;AACF;AAEA,SAAS6Z,GAAqB9Z,GAAiBiF,GAAcF,GAAoC;AAC/F,MAAI,CAACU,EAASzF,CAAM,GAAG;AACrB,IAAA+E,EAAO,KAAKqU,EAAW,SAAS,iBAAiB,aAAanU,CAAI,CAAC;AACnE;AAAA,EACF;AACA,EAAAwU;AAAA,IACEzZ;AAAA,IACA,CAAC,YAAY,YAAY,WAAW,aAAa,kBAAkB,gBAAgB;AAAA,IACnFiF;AAAA,IACA;AAAA,IACAF;AAAA,EAAA;AAEF,aAAW9E,KAAO,CAAC,YAAY,YAAY,WAAW,aAAa,gBAAgB;AACjF,KAAI,OAAOD,EAAOC,CAAG,KAAM,YAAY,CAACD,EAAOC,CAAG,MAChD8E,EAAO;AAAA,MACLqU,EAAW,SAAS,uBAAuB,cAAc,GAAGnU,CAAI,IAAIhF,CAAG,EAAE;AAAA,IAAA;AAI/E,EAAID,EAAO,mBAAmB,UAAa,CAAC,OAAO,UAAUA,EAAO,cAAc,KAChF+E,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAGnU,CAAI;AAAA,IAAA;AAAA,EACT;AAGN;AAEA,SAASwU,EACPzZ,GACA8G,GACA7B,GACA8B,GACAhC,GACM;AACN,QAAMjD,IAAU,IAAI,IAAIgF,CAAW;AACnC,aAAW7G,KAAO,OAAO,KAAKD,CAAM;AAClC,IAAI8B,EAAQ,IAAI7B,CAAG,KACnB8E,EAAO,KAAKqU,EAAW,SAASrS,GAAM,SAAS9G,CAAG,IAAI,GAAGgF,CAAI,IAAIhF,CAAG,EAAE,CAAC;AAE3E;AAGA,SAASyZ,GACPzW,GACAgC,GACAF,GACM;AACN,EAAA0U;AAAA,IACExW;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEFgC;AAAA,IACA;AAAA,IACAF;AAAA,EAAA,GAEG,CAAC,OAAO,QAAQ,OAAO,EAAE,SAAS,OAAO9B,EAAW,aAAa,CAAC,KACrE8B,EAAO;AAAA,IACLqU,EAAW,SAAS,6BAA6B,WAAW,GAAGnU,CAAI,gBAAgB;AAAA,EAAA,GAElF,CAAC,QAAQ,OAAO,EAAE,SAAS,OAAOhC,EAAW,UAAU,CAAC,KAC3D8B,EAAO;AAAA,IACLqU,EAAW,SAAS,0BAA0B,aAAa,GAAGnU,CAAI,aAAa;AAAA,EAAA,GAE9E,CAAC,WAAW,MAAM,EAAE,SAAS,OAAOhC,EAAW,mBAAmB,CAAC,KACtE8B,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAGnU,CAAI;AAAA,IAAA;AAAA,EACT,GAEC,CAAC,SAAS,WAAW,OAAO,EAAE,SAAS,OAAOhC,EAAW,IAAI,CAAC,KACjE8B,EAAO,KAAKqU,EAAW,SAAS,mBAAmB,WAAW,GAAGnU,CAAI,OAAO,CAAC,GAC1E,CAAC,SAAS,QAAQ,SAAS,QAAQ,OAAO,EAAE,SAAS,OAAOhC,EAAW,aAAa,CAAC,KACxF8B,EAAO;AAAA,IACLqU,EAAW,SAAS,6BAA6B,WAAW,GAAGnU,CAAI,gBAAgB;AAAA,EAAA,GAElF,CAAC,QAAQ,YAAY,QAAQ,EAAE,SAAS,OAAOhC,EAAW,cAAc,CAAC,KAC5E8B,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAGnU,CAAI;AAAA,IAAA;AAAA,EACT,GAEC,CAAC,SAAS,QAAQ,SAAS,QAAQ,OAAO,EAAE,SAAS,OAAOhC,EAAW,eAAe,CAAC,KAC1F8B,EAAO;AAAA,IACLqU;AAAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAGnU,CAAI;AAAA,IAAA;AAAA,EACT;AAEJ,aAAW,CAAChF,GAAKS,GAASC,CAAO,KAAK;AAAA,IACpC,CAAC,cAAc,GAAG,GAAG;AAAA,IACrB,CAAC,cAAc,GAAG,EAAE;AAAA,IACpB,CAAC,UAAU,GAAG,EAAE;AAAA,IAChB,CAAC,iBAAiB,GAAG,EAAE;AAAA,IACvB,CAAC,qBAAqB,GAAG,EAAE;AAAA,EAAA,GACjB;AACV,UAAM3E,IAAQiH,EAAWhD,CAAG;AAC5B,KACE,OAAOjE,KAAU,YACjB,CAAC,OAAO,SAASA,CAAK,KACtBA,IAAQ0E,KACR1E,IAAQ2E,MAERoE,EAAO;AAAA,MACLqU,EAAW,SAAS,qBAAqB,GAAGnZ,CAAG,YAAY,GAAGgF,CAAI,IAAIhF,CAAG,EAAE;AAAA,IAAA;AAAA,EAGjF;AACA,GACE,OAAOgD,EAAW,eAAgB,YAClC,OAAOA,EAAW,sBAAuB,aAEzC8B,EAAO,KAAKqU,EAAW,SAAS,mBAAmB,iBAAiBnU,CAAI,CAAC;AAC7E;AAEA,SAASyW,GAAasC,GAAiB/Y,GAAcF,GAAoC;AACvF,MAAI,CAACU,EAASuY,CAAM,GAAG;AACrB,IAAAjZ,EAAO,KAAKqU,EAAW,SAAS,aAAa,gBAAgBnU,CAAI,CAAC;AAClE;AAAA,EACF;AACA,EAAAwU,EAA0BuE,GAAQ,CAAC,MAAM,QAAQ,GAAG/Y,GAAM,yBAAyBF,CAAM;AACzF,aAAWzC,KAAU,CAAC,MAAM,QAAQ,GAAY;AAC9C,UAAM2b,IAAUD,EAAO1b,CAAM;AAC7B,QAAI,CAACmD,EAASwY,CAAO,GAAG;AACtB,MAAAlZ,EAAO;AAAA,QACLqU;AAAAA,UACE;AAAA,UACA;AAAA,UACA,GAAG9W,CAAM;AAAA,UACT,GAAG2C,CAAI,IAAI3C,CAAM;AAAA,QAAA;AAAA,MACnB;AAEF;AAAA,IACF;AACA,IAAAmX;AAAA,MACEwE;AAAA,MACA,CAAC,QAAQ,UAAU,aAAa,eAAe;AAAA,MAC/C,GAAGhZ,CAAI,IAAI3C,CAAM;AAAA,MACjB;AAAA,MACAyC;AAAA,IAAA;AAEF,UAAMpC,IAAOsb,GACPC,IAAY,OAAO,UAAUvb,EAAK,IAAI,KAAKA,EAAK,QAAQ,KAAKA,EAAK,QAAQ,IAC1Ewb,IAAc,OAAO,UAAUxb,EAAK,MAAM,KAAKA,EAAK,UAAU,KAAKA,EAAK,UAAU;AACxF,IAAKub,KACHnZ,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG9W,CAAM;AAAA,QACT,GAAG2C,CAAI,IAAI3C,CAAM;AAAA,MAAA;AAAA,IACnB,GAGC6b,KACHpZ,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG9W,CAAM;AAAA,QACT,GAAG2C,CAAI,IAAI3C,CAAM;AAAA,MAAA;AAAA,IACnB,GAGA4b,KAAaC,KAAexb,EAAK,OAAOA,EAAK,SAAS,MACxDoC,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG9W,CAAM;AAAA,QACT,GAAG2C,CAAI,IAAI3C,CAAM;AAAA,MAAA;AAAA,IACnB,GAGA,OAAOK,EAAK,aAAc,aAC5BoC,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG9W,CAAM;AAAA,QACT,GAAG2C,CAAI,IAAI3C,CAAM;AAAA,MAAA;AAAA,IACnB,GAGC,CAAC,WAAW,OAAO,QAAQ,OAAO,EAAE,SAAS,OAAOK,EAAK,aAAa,CAAC,KAC1EoC,EAAO;AAAA,MACLqU;AAAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG9W,CAAM;AAAA,QACT,GAAG2C,CAAI,IAAI3C,CAAM;AAAA,MAAA;AAAA,IACnB;AAAA,EAGN;AACF;AAEA,SAASwW,GACP3X,GACA1B,GACQ;AACR,QAAM2e,IAAQjd,EAAK,cAAc,SAASA,EAAK,cAAc;AAC7D,SAAO,OAAOid,KAAU,YAAYA,EAAM,SACtCA,IACC3e,GAAc,QAAQ0B,EAAK;AAClC;AAEA,SAAS8X,GAAiBjZ,GAA2D;AACnF,SAAK,MAAM,QAAQA,CAAM,IAClBA,EAAO,IAAI,CAACvB,GAAMgC,MACnBgF,EAAShH,CAAI,IACR,EAAE,OAAO,OAAOA,EAAK,SAAS,OAAOgC,IAAQ,CAAC,EAAE,GAAG,OAAOhC,EAAK,MAAA,IACjE,EAAE,OAAO,OAAOA,CAAI,GAAG,OAAOA,EAAA,CACtC,IALkC,CAAA;AAMrC;AAEA,SAAS2a,EACPiF,GACAtX,GACAC,GACA/B,GACoB;AACpB,SAAO,EAAE,UAAAoZ,GAAU,MAAAtX,GAAM,SAAAC,GAAS,MAAA/B,EAAA;AACpC;AAEA,SAASQ,EAASzJ,GAAkD;AAClE,SAAO,OAAOA,KAAU,YAAYA,MAAU,QAAQ,CAAC,MAAM,QAAQA,CAAK;AAC5E;AAQA,SAASsd,GAA0BtZ,GAAmC;AACpE,QAAMqZ,IAAatD,EAAU/V,CAAM;AACnC,SAAKyF,EAAS4T,CAAU,MACxBxO,GAAkCwO,CAAU,GAC5CiF,GAA4BjF,EAAW,UAAU,GAC7C5T,EAAS4T,EAAW,QAAQ,KAAK,MAAM,QAAQA,EAAW,SAAS,IAAI,MACzEkF,GAAwClF,EAAW,SAAS,IAAI,GAC5D5T,EAAS4T,EAAW,UAAU,KAAK,MAAM,QAAQA,EAAW,WAAW,MAAM,KAC/EvJ,GAA2BuJ,CAAyC,KAGjEA;AACT;AAEA,SAASiF,GAA4Bte,GAAuB;AAC1D,EAAKyF,EAASzF,CAAM,MACd,YAAYA,MAASA,EAAO,SAAS2V,GAAmB,SACxD,mBAAmB3V,MAASA,EAAO,gBAAgB,UACnD,oBAAoBA,MAASA,EAAO,iBAAiB,SAErD,qBAAqBA,MAASA,EAAO,kBAAkB;AAC/D;AAEA,SAASue,GAAwC9c,GAAwB;AACvE,aAAWzB,KAAUyB;AACnB,QAAI,GAACgE,EAASzF,CAAM,KAAKA,EAAO,aAAa,iBAE3CA,EAAO,yBAAyB,KAChC4V,GAAkC,IAAI,OAAO5V,EAAO,aAAa,CAAC,KAClEyF,EAASzF,EAAO,aAAa,MAGvB,kBAAkBA,EAAO,kBAAgBA,EAAO,cAAc,eAAe,SAC7E,mBAAmBA,EAAO,kBAAgBA,EAAO,cAAc,gBAAgB,UACrFA,EAAO,uBAAuB,IAE5B,EAAC,MAAM,QAAQA,EAAO,KAAK;AAC/B,iBAAW0B,KAAQ1B,EAAO;AACxB,QAAIyF,EAAS/D,CAAI,KAAK,MAAM,QAAQA,EAAK,QAAQ,KAC/C6c,GAAwC7c,EAAK,QAAQ;AAG7D;AAEA,SAASqU,EAAa/V,GAAc;AAClC,SAAO,KAAK,MAAM,KAAK,UAAUA,CAAM,CAAC;AAC1C;AC7gEA,MAAMwe,KAAkB,IAClBC,KAAkB;AAiCxB,eAAsBC,GACpBpR,GACAqR,GACAC,IAA6B,oBAAI,OACM;AACvC,MAAI,CAACtR,EAAK,QAAS,QAAO,EAAE,WAAW,IAAM,SAAS,IAAO,iBAAiB,IAAI,QAAQ,CAAA,EAAC;AAC3F,MAAIsR,EAAc,IAAItR,EAAK,EAAE;AAC3B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT,iBAAiB,CAAA;AAAA,MACjB,QAAQ,CAAC,iBAAiB;AAAA,IAAA;AAG9B,EAAAsR,EAAc,IAAItR,EAAK,EAAE;AACzB,QAAMvI,IAAuC;AAAA,IAC3C,WAAW;AAAA,IACX,SAAS;AAAA,IACT,iBAAiB,CAAA;AAAA,IACjB,QAAQ,CAAA;AAAA,EAAC;AAEX,MAAIP,IAAU;AACd,QAAMD,IAAU,OAAyC;AAAA,IACvD,QAAQoa,EAAK,WAAW;AAAA,IACxB,WAAWA,EAAK;AAAA,IAChB,SAASA,EAAK;AAAA,IACd,YAAYA,EAAK;AAAA,EAAA,IAEbE,IAAe,OAAOC,GAA4Bpa,MAAoC;AAC1F,QAAIA,IAAQ8Z,GAAiB,OAAM,IAAI,MAAM,aAAa;AAC1D,eAAWvP,KAAQ6P,GAAO;AAExB,UADAta,KAAW,GACPA,IAAUia,GAAiB,OAAM,IAAI,MAAM,aAAa;AAE5D,UADA1Z,EAAO,gBAAgB,KAAKkK,EAAK,EAAE,GAC/BA,EAAK,aAAa,aAAa;AACjC,cAAMG,IAASH,EAAK,SAAS;AAAA,UAAK,CAACxQ,MACjCoG,EAA0BpG,EAAK,WAAW8F,GAAS;AAAA,QAAA;AAGrD,YAAI,CADc,MAAMsa,EAAazP,GAAQ,SAASH,EAAK,WAAWvK,IAAQ,CAAC,EAC/D,QAAO;AACvB;AAAA,MACF;AACA,UAAIuK,EAAK,SAAS,CAACpK,EAA0BoK,EAAK,OAAO1K,EAAA,CAAS,GAAG;AACnE,YAAI0K,EAAK,iBAAiB,OAAQ;AAClC,eAAAlK,EAAO,UAAU,IACjBA,EAAO,OAAO,KAAK,GAAGkK,EAAK,IAAI,UAAU,GAClC;AAAA,MACT;AACA,UAAI;AACF,cAAM8P,GAAc9P,GAAM0P,GAAMpa,EAAA,CAAS;AAAA,MAC3C,SAASiB,GAAO;AAEd,YADAT,EAAO,OAAO,KAAK,GAAGkK,EAAK,IAAI,IAAIzJ,aAAiB,QAAQA,EAAM,UAAU,MAAM,EAAE,GAChFyJ,EAAK,YAAY;AACnB,iBAAAlK,EAAO,UAAU,IACV;AAAA,MAEX;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI;AACF,IAAAA,EAAO,YAAY,MAAM8Z,EAAavR,EAAK,OAAO,CAAC;AAAA,EACrD,SAAS9H,GAAO;AACd,IAAAT,EAAO,UAAU,IACjBA,EAAO,OAAO,KAAKS,aAAiB,QAAQA,EAAM,UAAU,SAAS;AAAA,EACvE,UAAA;AACE,IAAAoZ,EAAc,OAAOtR,EAAK,EAAE;AAAA,EAC9B;AACA,SAAOvI;AACT;AAEA,eAAega,GACb9P,GACA0P,GACApa,GACe;AACf,QAAMxG,IAAgBkR,EAAK;AAC3B,MAAIA,EAAK,eAAe,aAAa;AACnC,UAAM5I,IAAU2Y,EAAajhB,EAAc,SAAS,MAAM;AAC1D,IAAAkhB,GAAiBN,GAAMtY,GAASrE,EAAWkd,GAAmBnhB,GAAewG,CAAO,CAAC,CAAC;AACtF;AAAA,EACF;AACA,MAAI0K,EAAK,eAAe,eAAe;AACrC,UAAM5I,IAAU2Y,EAAajhB,EAAc,SAAS,MAAM;AAC1D,IAAAkhB,GAAiBN,GAAMtY,GAAS,IAAI;AACpC;AAAA,EACF;AACA,MAAI4I,EAAK,eAAe,cAAc;AACpC,UAAMkQ,IAAgBH,EAAajhB,EAAc,eAAe,MAAM,GAChEiM,IAAgBgV,EAAajhB,EAAc,eAAe,MAAM;AACtE,IAAAkhB,GAAiBN,GAAM3U,GAAehI,EAAWod,GAAeT,GAAMQ,CAAa,CAAC,CAAC;AACrF;AAAA,EACF;AACA,MAAIlQ,EAAK,eAAe,gBAAgB;AACtC,UAAMoQ,IAAeL,EAAajhB,EAAc,cAAc,MAAM;AACpE,IAAA4gB,EAAK,UAAUU,CAAY,IAAIrd,EAAWkd,GAAmBnhB,GAAewG,CAAO,CAAC;AACpF;AAAA,EACF;AACA,MAAI0K,EAAK,eAAe,YAAY;AAClC,QAAI,CAAC0P,EAAK,SAAU,OAAM,IAAI,MAAM,mBAAmB;AACvD,QAAI,CAAE,MAAMA,EAAK,SAAA,EAAa,OAAM,IAAI,MAAM,SAAS;AACvD;AAAA,EACF;AACA,MAAI1P,EAAK,eAAe,UAAU;AAChC,QAAI,CAAC0P,EAAK,OAAQ,OAAM,IAAI,MAAM,iBAAiB;AACnD,UAAMA,EAAK,OAAA;AACX;AAAA,EACF;AACA,MAAI1P,EAAK,eAAe,SAAS;AAC/B,QAAI,CAAC0P,EAAK,MAAO,OAAM,IAAI,MAAM,iBAAiB;AAClD,IAAAA,EAAK,MAAA;AACL;AAAA,EACF;AACA,MAAI1P,EAAK,eAAe,SAAS;AAC/B,QAAI,CAAC0P,EAAK,MAAO,OAAM,IAAI,MAAM,iBAAiB;AAClD,IAAAA,EAAK,MAAA;AACL;AAAA,EACF;AACA,MAAI1P,EAAK,eAAe,WAAW;AACjC,QAAI,CAAC0P,EAAK,QAAS,OAAM,IAAI,MAAM,iBAAiB;AACpD,IAAAA,EAAK,QAAQK,EAAajhB,EAAc,SAAS,MAAM,GAAGuhB,GAAavhB,EAAc,KAAK,CAAC;AAC3F;AAAA,EACF;AACA,MAAIkR,EAAK,eAAe,eAAe;AACrC,QAAI,CAAC0P,EAAK,WAAY,OAAM,IAAI,MAAM,mBAAmB;AACzD,IAAAA,EAAK,WAAWK,EAAajhB,EAAc,YAAY,MAAM,CAAC;AAC9D;AAAA,EACF;AACA,MAAIkR,EAAK,eAAe,kBAAkB;AACxC,QAAI,CAAC0P,EAAK,cAAe,OAAM,IAAI,MAAM,mBAAmB;AAC5D,IAAAA,EAAK,cAAcK,EAAajhB,EAAc,YAAY,MAAM,CAAC;AACjE;AAAA,EACF;AACA,MAAIkR,EAAK,eAAe,iBAAiB;AACvC,QAAI,CAAC0P,EAAK,aAAc,OAAM,IAAI,MAAM,mBAAmB;AAC3D,IAAAA,EAAK,aAAaK,EAAajhB,EAAc,YAAY,MAAM,CAAC;AAChE;AAAA,EACF;AACA,MAAIkR,EAAK,eAAe,qBAAqB;AAC3C,UAAMsQ,IAAUZ,EAAK,UAAU;AAC/B,QAAI,CAACY,EAAS,OAAM,IAAI,MAAM,sBAAsB;AACpD,UAAMA,EAAQ;AAAA,MACZP,EAAajhB,EAAc,cAAc,MAAM;AAAA,MAC/CA,EAAc,kBAAkB;AAAA,IAAA;AAElC;AAAA,EACF;AACA,MAAIkR,EAAK,eAAe,uBAAuB;AAC7C,UAAMsQ,IAAUZ,EAAK,UAAU;AAC/B,QAAI,CAACY,EAAS,OAAM,IAAI,MAAM,kBAAkB;AAChD,UAAM1C,IAAa2C,GAAkBb,EAAK,UAAU5gB,EAAc,cAAc,GAC1E0hB,IAAS,MAAMF,EAAQ,QAAQ1C,GAAY6C,GAAmB7C,GAAYtY,CAAO,CAAC;AACxF,eAAWkI,KAAWoQ,EAAW;AAC/B,MAAIpQ,EAAQ,OAAO,WAAW,QAAQ,IACpCwS;AAAA,QACEN;AAAA,QACAlS,EAAQ,OAAO,MAAM,CAAe;AAAA,QACpCzK,EAAWyd,EAAOhT,EAAQ,MAAM,CAAC;AAAA,MAAA,IAE1BA,EAAQ,OAAO,WAAW,WAAW,MAC9CkS,EAAK,UAAUlS,EAAQ,OAAO,MAAM,CAAkB,CAAC,IAAIzK;AAAAA,QACzDyd,EAAOhT,EAAQ,MAAM;AAAA,MAAA;AAI3B;AAAA,EACF;AACA,MAAIwC,EAAK,eAAe,eAAe;AACrC,UAAMsQ,IAAUZ,EAAK,UAAU;AAC/B,QAAI,CAACY,EAAS,OAAM,IAAI,MAAM,mBAAmB;AACjD,UAAMA,EAAQ,QAAQP,EAAajhB,EAAc,YAAY,MAAM,GAAG;AAAA,MACpE,QAAQiE,EAAW2c,EAAK,WAAW,MAAM;AAAA,MACzC,WAAW3c,EAAW2c,EAAK,SAAS;AAAA,IAAA,CACrC;AAAA,EACH;AACF;AAEA,SAASS,GAAeT,GAAgCtY,GAA0B;AAChF,SAAOsY,EAAK,cAActY,KAAWsY,EAAK,aACtCA,EAAK,WAAWtY,CAAO,IACvBsY,EAAK,WAAW,OAAOtY,CAAO;AACpC;AAEA,SAAS4Y,GAAiBN,GAAgCtY,GAAiBrK,GAAsB;AAC/F,EAAI2iB,EAAK,cAActY,KAAWsY,EAAK,aAAYA,EAAK,WAAWtY,CAAO,IAAIrK,IACzE2iB,EAAK,WAAW,OAAOtY,CAAO,IAAIrK;AACzC;AAEA,SAASkjB,GACPnhB,GACAwG,GACS;AACT,QAAMD,IAAavG,EAAc;AACjC,SAAI0H,GAASnB,CAAU,IACdD,GAA2BC,GAA6CC,CAAO,IACjFxG,EAAc,SAAS;AAChC;AAEA,SAASyhB,GACP3e,GACAkG,GAC8B;AAC9B,QAAMgL,IAAaiN,EAAajY,GAAM,OAAO,GACvC8V,IAAahc,EAAS,YAAY,KAAK,CAACpC,MAASA,EAAK,SAASsT,CAAU;AAC/E,MAAI,CAAC8K,EAAY,OAAM,IAAI,MAAM,OAAO9K,CAAU,MAAM;AACxD,SAAO8K;AACT;AAEA,SAAS6C,GACP7C,GACAtY,GACyB;AACzB,QAAMob,IAAiC,CAAA;AACvC,aAAWlT,KAAWoQ,EAAW;AAC/B,IAAIpQ,EAAQ,OAAO,WAAW,QAAQ,IACpCkT,EAAMlT,EAAQ,MAAM,IAAIlI,EAAQ,OAAOkI,EAAQ,OAAO,MAAM,CAAC,CAAC,IACvDA,EAAQ,OAAO,WAAW,WAAW,MAC5CkT,EAAMlT,EAAQ,MAAM,IAAIlI,EAAQ,UAAUkI,EAAQ,OAAO,MAAM,CAAC,CAAC;AAGrE,SAAOkT;AACT;AAEA,SAASX,EAAahjB,GAAgBkE,GAAuB;AAC3D,MAAI,OAAOlE,KAAU,YAAY,CAACA,EAAM,KAAA,EAAQ,OAAM,IAAI,MAAM,GAAGkE,CAAK,KAAK;AAC7E,SAAOlE,EAAM,KAAA;AACf;AAEA,SAASsjB,GAAatjB,GAA0D;AAC9E,SAAO,CAAC,WAAW,QAAQ,WAAW,OAAO,EAAE,SAAS,OAAOA,CAAK,CAAC,IAChEA,IACD;AACN;AAEA,SAASgG,EAAchG,GAAa;AAClC,MAA2BA,KAAU,KAAM,QAAOA;AAClD,MAAI,OAAO,WAAW,mBAAoB;AACxC,QAAI;AACF,aAAO,WAAW,gBAAgBA,CAAK;AAAA,IACzC,QAAQ;AAAA,IAER;AAEF,SAAI,MAAM,QAAQA,CAAK,IAAUA,EAAM,IAAI,CAACyC,MAASuD,EAAWvD,CAAI,CAAC,IACjE,OAAOzC,KAAU,YAAY,OAAO,eAAeA,CAAK,MAAM,OAAO,YAChE,OAAO;AAAA,IACZ,OAAO,QAAQA,CAAgC,EAAE,IAAI,CAAC,CAACiE,GAAKxB,CAAI,MAAM;AAAA,MACpEwB;AAAA,MACA+B,EAAWvD,CAAI;AAAA,IAAA,CAChB;AAAA,EAAA,IAGEzC;AACT;AAEA,SAASyJ,GAASzJ,GAAkD;AAClE,SAAO,OAAOA,KAAU,YAAYA,MAAU,QAAQ,CAAC,MAAM,QAAQA,CAAK;AAC5E;AC3PA,MAAM4jB,KAGF;AAAA,EACF,QAAQ,EAAE,OAAO,MAAM,aAAa,cAAA;AAAA,EACpC,OAAO,EAAE,OAAO,QAAQ,aAAa,cAAA;AAAA,EACrC,WAAW,EAAE,OAAO,QAAQ,aAAa,cAAA;AAAA,EACzC,QAAQ,EAAE,OAAO,QAAQ,aAAa,iBAAA;AAAA,EACtC,OAAO,EAAE,OAAO,QAAQ,aAAa,iBAAA;AAAA,EACrC,MAAM,EAAE,OAAO,QAAQ,aAAa,cAAA;AAAA,EACpC,WAAW,EAAE,OAAO,QAAQ,aAAa,eAAA;AAAA,EACzC,MAAM,EAAE,OAAO,QAAQ,aAAa,eAAA;AAAA,EACpC,eAAe,EAAE,OAAO,SAAS,aAAa,iBAAA;AAAA,EAC9C,YAAY,EAAE,OAAO,OAAO,aAAa,gBAAA;AAAA,EACzC,UAAU,EAAE,OAAO,QAAQ,aAAa,gBAAA;AAAA,EACxC,QAAQ,EAAE,OAAO,QAAQ,aAAa,2BAAA;AACxC;AAOO,SAASC,GACdhf,GACAxC,GACAyhB,GACiC;AACjC,QAAMC,IAAY,oBAAI,IAAgC,CAAC,iBAAiB,YAAY,CAAC,GAE/E/gB,IADeH,EAAsBR,EAAM,aAAa,GAC3B,gBAAgBA,EAAM;AACzD,SAAI,CAAC,UAAU,aAAa,WAAW,EAAE,SAASW,CAAY,MAC5D+gB,EAAU,IAAI,QAAQ,GACtBA,EAAU,IAAI,QAAQ,GACtBA,EAAU,IAAI,OAAO,IAEnB/gB,MAAiB,aACnB+gB,EAAU,IAAI,OAAO,GACrBA,EAAU,IAAI,WAAW,IAEvB,CAAC,QAAQ,WAAW,EAAE,SAAS/gB,CAAY,KAAG+gB,EAAU,IAAI,MAAM,GAClEC,GAAkB3hB,CAAK,KAAG0hB,EAAU,IAAI,WAAW,GACnD/gB,MAAiB,UAAQ+gB,EAAU,IAAI,MAAM,GAC7CE,GAAYpf,CAAQ,KAAGkf,EAAU,IAAI,UAAU,GACnDA,EAAU,IAAI,QAAQ,GAEf,CAAC,GAAGA,CAAS,EAAE,IAAI,CAACzf,MAAS;AAClC,UAAM4f,IAAwB5f,MAAS;AACvC,WAAO;AAAA,MACL,MAAAA;AAAA,MACA,GAAGsf,GAAgBtf,CAAI;AAAA,MACvB,WAAW,CAAC4f,KAAyBJ,EAAa;AAAA,MAClD,mBACEI,KAAyB,CAACJ,EAAa,mBACnC,yCACA;AAAA,IAAA;AAAA,EAEV,CAAC;AACH;AAGO,SAASK,GACdtf,GACAxC,GACwB;AACxB,SAAO;AAAA,IACL,IAAI+hB,GAAiB,OAAO;AAAA,IAC5B,QAAQ;AAAA,IACR,WAAWC,GAAiBxf,GAAUxC,CAAK;AAAA,IAC3C,eAAe;AAAA,EAAA;AAEnB;AAGO,SAASiiB,GACdC,IAAuC,WACf;AACxB,SAAIA,MAAS,YACJ;AAAA,IACL,IAAIH,GAAiB,SAAS;AAAA,IAC9B,MAAAG;AAAA,IACA,YAAY,EAAE,MAAM,WAAW,OAAO,KAAA;AAAA,IACtC,iBAAiB;AAAA,EAAA,IAGd;AAAA,IACL,IAAIH,GAAiB,SAAS;AAAA,IAC9B,MAAAG;AAAA,IACA,YAAY,EAAE,MAAM,WAAW,OAAO,KAAA;AAAA,EAAK;AAE/C;AAGO,SAASC,GACdlgB,GACAO,GACAxC,GACAoiB,GACwB;AACxB,QAAMC,IAAO;AAAA,IACX,IAAIN,GAAiB,YAAY;AAAA,IACjC,MAAM,GAAGR,GAAgBtf,CAAI,EAAE,KAAK,GAAGmgB,CAAQ;AAAA,IAC/C,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,EAAA,GAEL1iB,IAAgB4iB,GAA8BrgB,GAAMO,GAAUxC,CAAK;AACzE,SAAO,EAAE,GAAGqiB,GAAM,MAAApgB,GAAM,eAAAvC,EAAA;AAC1B;AAGO,SAAS6iB,GAA2Bxa,GAAsC;AAC/E,QAAMrF,IAAS,EAAE,SAAS,MAAM,UAAU,MAAM,UAAU,KAAA,EAAOqF,EAAK,MAAM;AAC5E,SAAO,QAAQA,EAAK,gBAAgB,KAAK,GAAG,GAAGrF,CAAM;AACvD;AAGO,SAAS8f,GAA2Bza,GAAsC;AAC/E,SAAIA,EAAK,SAAS,YAAkB,qBAM7B,aALwD;AAAA,IAC7D,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,EAAA,EAEgBA,EAAK,eAAe,CAAC;AAClD;AAGO,SAAS0a,GAAgC1a,GAAsC;AACpF,QAAM2a,IAAS3a,EAAK,UAAU,OAAO,MAC/BiY,IAAWjY,EAAK,aAAa,UAAU,SAAS;AACtD,SAAO,GAAGwZ,GAAgBxZ,EAAK,IAAI,EAAE,KAAK,MAAM2a,CAAM,MAAM1C,CAAQ;AACtE;AAOO,SAAS2C,GAAmCrB,GAMb;AACpC,QAAM9e,IAAWmB,GAAW2d,EAAM,QAAQ;AAC1C,EAAA9e,EAAS,aAAamB,GAAW2d,EAAM,UAAU;AACjD,QAAMsB,IAAapgB,EAAS,WAAW,OAAO,UAAU,CAACxC,MAAUA,EAAM,OAAOshB,EAAM,OAAO,GACvFthB,IAAQwC,EAAS,WAAW,OAAOogB,CAAU;AACnD,MAAI,CAAC5iB;AACH,WAAO;AAAA,MACL+a,EAAW,SAAS,iBAAiB,YAAY,uBAAuB,OAAO;AAAA,IAAA;AAGnF,EAAA/a,EAAM,WAAW2D,GAAW2d,EAAM,QAAQ;AAC1C,QAAM1K,IAAY,uBAAuBgM,CAAU,cAC7Clc,IAASqG,GAAiCvK,CAAQ,EACrD,OAAO,CAACpC,MAASA,EAAK,KAAK,WAAWwW,CAAS,KAAKxW,EAAK,KAAK,WAAW,cAAc,CAAC,EACxF,IAAI,CAACA,MAASyiB,GAAkBziB,GAAMJ,GAAOshB,EAAM,QAAQ,CAAC;AAC/D,SAAAwB,GAAyBxB,EAAM,UAAU5a,CAAM,GAC/Cqc,GAA4BzB,GAAO5a,CAAM,GAClCsc,GAAuBtc,CAAM;AACtC;AAGO,SAASuc,GACdhhB,GACAwf,GACiC;AACjC,SAAIxf,MAAS,uBAAuB,CAACwf,EAAa,aACzC,EAAE,MAAAxf,GAAM,WAAW,IAAO,mBAAmB,2BAAA,IAElDA,MAAS,yBAAyB,CAACwf,EAAa,aAC3C,EAAE,MAAAxf,GAAM,WAAW,IAAO,mBAAmB,yBAAA,IAElDA,MAAS,iBAAiB,CAACwf,EAAa,aACnC,EAAE,MAAAxf,GAAM,WAAW,IAAO,mBAAmB,8BAAA,IAE/C,EAAE,MAAAA,GAAM,WAAW,IAAM,mBAAmB,GAAA;AACrD;AAEA,SAASqgB,GACPrgB,GACAO,GACAxC,GAC0C;AAC1C,QAAMkjB,IAAkB1gB,EAAS,WAAW,OAAO;AAAA,IACjD,CAAC2gB,MAAcA,EAAU,OAAOnjB,EAAM,MAAMmjB,EAAU,eAAenjB,EAAM;AAAA,EAAA,GAEvEojB,IAAaC,GAAoB7gB,CAAQ;AAe/C,SAd2D;AAAA,IACzD,QAAQ,CAAA;AAAA,IACR,OAAO,CAAA;AAAA,IACP,WAAW,EAAE,OAAO,EAAA;AAAA,IACpB,QAAQ,EAAE,QAAQ,QAAA;AAAA,IAClB,OAAO,EAAE,SAAS,KAAA;AAAA,IAClB,MAAM,CAAA;AAAA,IACN,WAAW,CAAA;AAAA,IACX,MAAM,CAAA;AAAA,IACN,eAAe,EAAE,SAAS0gB,GAAiB,MAAM,IAAI,UAAU,KAAA;AAAA,IAC/D,YAAY,EAAE,YAAYlB,GAAiBxf,GAAUxC,CAAK,EAAA;AAAA,IAC1D,UAAU,EAAE,aAAaojB,EAAA;AAAA,IACzB,QAAQ,EAAE,UAAU,IAAI,aAAa,GAAA;AAAA,EAAG,EAEpBnhB,CAAI;AAC5B;AAEA,SAAS+f,GAAiBxf,GAA4BxC,GAAsB;AAG1E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,SAPJwC,EAAS,WAAW,OAAO,KAAK,CAACpC,MAASA,EAAK,eAAeJ,EAAM,UAAU,GAAG,MAAMA,EAAM;AAAA,QAQzF,OACEA,EAAM,eAAewC,EAAS,WAAW,WAAW,OAC/C,SACA;AAAA,MAAA;AAAA,IACT;AAAA,EACF;AAEJ;AAEA,SAASmf,GAAkB3hB,GAA+B;AACxD,SACEA,EAAM,iBAAiB,WACvB,CAAC,YAAY,gBAAgB,eAAe,EAAE,SAASA,EAAM,aAAa,KAC1EA,EAAM,cAAc,aAAa,MACjCA,EAAM,cAAc,kBAAkB;AAE1C;AAEA,SAAS4hB,GAAYpf,GAAqC;AACxD,SAAO,EAAQ6gB,GAAoB7gB,CAAQ;AAC7C;AAEA,SAAS6gB,GAAoB7gB,GAAoC;AAC/D,QAAM6N,IAAQ;AAAA,IACZ7N,EAAS,SAAS;AAAA,IAClB,GAAGA,EAAS,SAAS,SAAS,IAAI,CAACc,MAAYA,EAAQ,IAAI;AAAA,EAAA;AAE7D,aAAWM,KAAQyM,GAAO;AACxB,UAAMvM,IAAQwf,GAAoB1f,CAAI;AACtC,QAAIE,EAAO,QAAOA;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAASwf,GAAoBlgB,GAAqD;AAChF,aAAWN,KAAQM,GAAO;AACxB,QACEN,EAAK,aAAa,eAClB,CAAC,gBAAgB,gBAAgB,EAAE,SAASA,EAAK,aAAa;AAE9D,aAAOA,EAAK;AAEd,QAAIA,EAAK,aAAa;AACpB,iBAAWO,KAAQP,EAAK,OAAO;AAC7B,cAAMygB,IAASD,GAAoBjgB,EAAK,QAAQ;AAChD,YAAIkgB,EAAQ,QAAOA;AAAA,MACrB;AAAA,EAEJ;AACA,SAAO;AACT;AAEA,SAAST,GACPjW,GACAnG,GACM;AACN,QAAM8c,wBAAkB,IAAA;AACxB,aAAWzb,KAAQ8E,EAAS,iBAAiB;AAC3C,UAAMmO,IAAajT,EAAK,KAAK,KAAA,EAAO,kBAAA;AACpC,QAAI,CAACiT,GAAY;AACf,MAAAtU,EAAO;AAAA,QACLqU;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACAhT,EAAK;AAAA,QAAA;AAAA,MACP;AAEF;AAAA,IACF;AACA,QAAIyb,EAAY,IAAIxI,CAAU,GAAG;AAC/B,MAAAtU,EAAO;AAAA,QACLqU;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACAhT,EAAK;AAAA,QAAA;AAAA,MACP;AAEF;AAAA,IACF;AACA,IAAAyb,EAAY,IAAIxI,GAAYjT,EAAK,EAAE;AAAA,EACrC;AACF;AAEA,SAASgb,GACPzB,GAKA5a,GACM;AACN,aAAWqB,KAAQuZ,EAAM,SAAS;AAChC,IAAIvZ,EAAK,SAAS,YAAY,CAACuZ,EAAM,aAAa,oBAChD5a,EAAO;AAAA,MACLqU;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAhT,EAAK;AAAA,MAAA;AAAA,IACP;AAIN,aAAWA,KAAQuZ,EAAM,SAAS;AAChC,IACEvZ,EAAK,SAAS,aACdA,EAAK,oBAAoB,aACzB,CAACuZ,EAAM,aAAa,uBAEpB5a,EAAO;AAAA,MACLqU;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAhT,EAAK;AAAA,MAAA;AAAA,IACP;AAIN,QAAM0b,IAAa,IAAI,IAAI,OAAO,OAAOnC,EAAM,SAAS,aAAa,EAAE,OAAO,OAAO,CAAC;AACtF,aAAWrS,KAAQqS,EAAM,WAAW,OAAO,CAAClhB,MAASqjB,EAAW,IAAIrjB,EAAK,IAAI,CAAC;AAC5E,IAAAsjB,GAAgBzU,EAAK,OAAO,CAAC2B,MAAS;AACpC,UAAIA,EAAK,aAAa,SAAU;AAChC,YAAM1P,IAAe+hB;AAAA,QACnBrS,EAAK;AAAA,QACL0Q,EAAM;AAAA,MAAA;AAER,MAAKpgB,EAAa,aAChBwF,EAAO;AAAA,QACLqU;AAAA,UACE;AAAA,UACA;AAAA,UACA,GAAG7Z,EAAa,iBAAiB;AAAA,UACjC;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAGN,CAAC;AAEL;AAEA,SAASwiB,GACPjD,GACAtd,GACM;AACN,aAAWyN,KAAQ6P;AACjB,IAAAtd,EAAMyN,CAAI,GACNA,EAAK,aAAa,gBACpBA,EAAK,SAAS,QAAQ,CAACG,MAAW2S,GAAgB3S,EAAO,OAAO5N,CAAK,CAAC,GACtEugB,GAAgB9S,EAAK,WAAWzN,CAAK;AAG3C;AAEA,SAAS0f,GACPziB,GACAJ,GACA6M,GACiC;AACjC,QAAM8W,IAAMC,GAAcxjB,EAAK,IAAI,GAC7ByjB,IAAazjB,EAAK,KAAK,MAAM,mDAAmD,GAChFkY,IAAauL,IAAa,CAAC,GAC3BzhB,IAAQ,OAAOyhB,IAAa,CAAC,KAAK,EAAE,GACpCC,IACJxL,MAAe,eACXzL,EAAS,WAAWzK,CAAK,GAAG,KAC5BkW,MAAe,eACbzL,EAAS,WAAWzK,CAAK,GAAG,KAC5BkW,MAAe,oBACbzL,EAAS,gBAAgBzK,CAAK,GAAG,KACjC;AACV,SAAO,EAAE,GAAGhC,GAAM,SAAS,GAAGJ,EAAM,KAAK,IAAII,EAAK,OAAO,IAAI,KAAAujB,GAAK,QAAAG,EAAA;AACpE;AAEA,SAASF,GAAchd,GAAsD;AAC3E,SAAIA,EAAK,SAAS,aAAa,IAAU,UACrCA,EAAK,SAAS,kBAAkB,IAAU,eAC1CA,EAAK,SAAS,gBAAgB,KAAKA,EAAK,WAAW,cAAc,IAAU,WACxE;AACT;AAEA,SAASmU,EACPiF,GACAtX,GACAC,GACA/B,GACA+c,GACAG,GACiC;AACjC,SAAO,EAAE,UAAA9D,GAAU,MAAAtX,GAAM,SAAAC,GAAS,MAAA/B,GAAM,KAAA+c,GAAK,QAAAG,EAAA;AAC/C;AAEA,SAASd,GACPnc,GACmC;AACnC,QAAM4Y,wBAAW,IAAA;AACjB,SAAO5Y,EAAY,OAAO,CAACzG,MAAS;AAClC,UAAMwB,IAAM,GAAGxB,EAAK,QAAQ,IAAIA,EAAK,IAAI,IAAIA,EAAK,IAAI,IAAIA,EAAK,UAAU,EAAE;AAC3E,WAAIqf,EAAK,IAAI7d,CAAG,IAAU,MAC1B6d,EAAK,IAAI7d,CAAG,GACL;AAAA,EACT,CAAC;AACH;AAEA,SAASmgB,GAAiB5K,GAAwB;AAChD,SAAO,GAAGA,CAAM,IAAI,OAAO,aAAa,WAAW,KAAK,EAAE,CAAC;AAC7D;AAEA,SAASxT,GAAchG,GAAa;AAClC,SAAO,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC;AACzC;ACteO,SAASomB,GACdrkB,GACAkC,GACA+M,GACAqV,GACQ;AACR,MAAI,CAACtkB,EAAc,QAAS,QAAOskB;AACnC,QAAMnV,IAAQnP,EAAc,QAAQ,KAAK,CAACU,MAASA,EAAK,QAAQwB,CAAG;AACnE,MAAI,CAACiN,EAAO,QAAOmV;AACnB,QAAMC,IAAYpV,EAAM,OAAOF,CAAM,GAAG,KAAA;AACxC,SAAIsV,KACgBpV,EAAM,OAAOnP,EAAc,aAAa,GAAG,KAAA,KACzCskB;AACxB;AAGO,SAASE,GAA0BC,GAA0B;AAClE,SAAO,SAASC,GAAgBD,CAAQ,CAAC;AAC3C;AAGO,SAASE,GAAyBF,GAA0B;AACjE,SAAO,SAASC,GAAgBD,CAAQ,CAAC;AAC3C;AAGO,SAASG,GAAsBvV,GAAwB;AAC5D,SAAO,UAAUqV,GAAgBrV,EAAO,YAAA,CAAa,CAAC;AACxD;AAGO,SAASwV,GAAsBC,GAA4B;AAChE,SAAO,UAAUJ,GAAgBI,CAAU,CAAC;AAC9C;AAEA,SAASJ,GAAgBzmB,GAAuB;AAC9C,QAAMqd,IAAard,EAAM,QAAQ,kBAAkB,GAAG;AACtD,SAAO,YAAY,KAAKqd,CAAU,IAAIA,IAAa,OAAOA,CAAU;AACtE;AC9BO,SAASyJ,GACd9mB,GACA+B,GACQ;AACR,MAAI,CAAC,OAAO,SAAS/B,CAAK,EAAG,QAAO;AACpC,QAAM+mB,IAAYC,GAA+BjlB,CAAa,GACxDklB,IAAe,OAAOjnB,EAAM,QAAQ+mB,CAAS,CAAC,GAC9CG,IACJnlB,EAAc,uBAAuB,KACjCklB,EAAa,eAAe,SAAS;AAAA,IACnC,uBAAuBF;AAAA,IACvB,uBAAuBA;AAAA,EAAA,CACxB,IACDE,EAAa,QAAQF,CAAS,GAC9BI,IACJ,OAAOplB,EAAc,kBAAmB,WAAWA,EAAc,iBAAiB,IAC9EyX,IAAS4N,GAA0BD,CAAkB,KAAKA,GAC1DE,IACJtlB,EAAc,iBAAiB,KAAO,IAAIulB,GAA2BL,CAAY,CAAC,MAAM;AAC1F,SAAO,GAAGzN,CAAM,GAAG0N,CAAS,GAAGG,CAAS;AAC1C;AAQO,SAASL,GACdjlB,GACQ;AACR,SAAOwlB,GAAmBxlB,EAAc,SAAS;AACnD;AAQO,SAASulB,GAA2BtnB,GAAuB;AAChE,MAAI,CAAC,OAAO,SAASA,CAAK,KAAK,KAAK,IAAIA,CAAK,IAAI,mBAAkB,QAAO;AAC1E,QAAMwnB,IAAWxnB,IAAQ,IAAI,MAAM,IAC7BynB,IAAW,KAAK,MAAM,KAAK,IAAIznB,CAAK,IAAI,GAAG,GAC3C0nB,IAAU,KAAK,MAAMD,IAAW,GAAG,GACnCE,IAAO,KAAK,MAAOF,IAAW,MAAO,EAAE,GACvCG,IAAMH,IAAW,IACjBI,IAAcH,MAAY,IAAI,MAAMI,GAAiBJ,CAAO;AAClE,MAAIC,MAAS,KAAKC,MAAQ,UAAU,GAAGJ,CAAQ,GAAGK,CAAW;AAC7D,QAAME,IAAe,GAAGJ,IAAO,IAAI,GAAGK,GAAWL,CAAI,CAAC,MAAMD,IAAU,KAAKE,IAAM,IAAI,MAAM,EAAE,GAC3FA,IAAM,IAAI,GAAGI,GAAWJ,CAAG,CAAC,MAAM,EACpC;AACA,SAAO,GAAGJ,CAAQ,GAAGK,CAAW,IAAIE,CAAY;AAClD;AAEA,MAAMC,KAAa,cACbC,KAAkB,CAAC,IAAI,KAAK,KAAK,GAAG,GACpCC,KAAqB,CAAC,IAAI,KAAK,KAAK,GAAG,GACvCd,KAAoD;AAAA,EACxD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAQA,SAASU,GAAiB9nB,GAAuB;AAC/C,QAAMmoB,IAAmB,CAAA;AACzB,MAAIC,IAAYpoB;AAChB,SAAOooB,IAAY;AACjB,IAAAD,EAAO,KAAKC,IAAY,GAAK,GAC7BA,IAAY,KAAK,MAAMA,IAAY,GAAK;AAE1C,MAAIrf,IAAS,IACTsf,IAAc;AAClB,WAAS5jB,IAAQ0jB,EAAO,SAAS,GAAG1jB,KAAS,GAAGA,KAAS,GAAG;AAC1D,UAAMtB,IAAQglB,EAAO1jB,CAAK,KAAK;AAC/B,QAAItB,MAAU,GAAG;AACf,MAAI4F,MAAQsf,IAAc;AAC1B;AAAA,IACF;AACA,IAAItf,MAAWsf,KAAellB,IAAQ,SAAO4F,KAAUif,GAAW,CAAC,IACnEjf,KAAU,GAAGuf,GAAenlB,CAAK,CAAC,GAAG8kB,GAAgBxjB,CAAK,KAAK,EAAE,IACjE4jB,IAAc;AAAA,EAChB;AACA,SAAOtf;AACT;AAQA,SAASuf,GAAetoB,GAAuB;AAC7C,MAAI+I,IAAS,IACTsf,IAAc;AAClB,WAASE,IAAW,GAAGA,KAAY,GAAGA,KAAY,GAAG;AACnD,UAAMC,IAAQ,KAAK,MAAMxoB,IAAQ,MAAMuoB,CAAQ,IAAI;AACnD,QAAIC,MAAU,GAAG;AACf,MAAIzf,MAAQsf,IAAc;AAC1B;AAAA,IACF;AACA,IAAIA,MAAatf,KAAUif,GAAW,CAAC,IACvCjf,KAAU,GAAGif,GAAWQ,CAAK,CAAC,GAAGN,GAAmBK,CAAQ,CAAC,IAC7DF,IAAc;AAAA,EAChB;AACA,SAAOtf;AACT;AAQA,SAASwe,GAAmBvnB,GAAwB;AAClD,SAAI,OAAOA,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,IAAU,IAC1D,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMA,CAAK,CAAC,CAAC;AACpD;ACrIO,MAAMyoB,KAA0B,QAEjCC,KAAyF;AAAA,EAC7F,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAGO,SAASC,GAAgCC,GAAgD;AAC9F,SAAOF,GAA6BE,CAAM;AAC5C;AAGO,SAASC,GACdhkB,GACAikB,GACuB;AACvB,QAAMzP,IAAS0P,GAAiBlkB,CAAQ;AACxC,SAAO;AAAA,IACL,IAAIqY,EAAiB,QAAQ;AAAA,IAC7B,MAAM,UAAU7D,CAAM;AAAA,IACtB,MAAMyP,MAAS,WAAW,KAAKzP,CAAM,KAAK,KAAKA,CAAM;AAAA,IACrD,MAAAyP;AAAA,IACA,aAAa;AAAA,IACb,OAAOA,MAAS,WAAW,MAAM;AAAA,IACjC,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,MAAM,CAAA;AAAA,EAAC;AAEX;AAGO,SAASE,GACdnkB,GACAgiB,GACmC;AACnC,QAAM7iB,IAASa,EAAS,SAAS,SAAS,KAAK,CAAC2N,MAAWA,EAAO,SAASqU,CAAU;AACrF,MAAI,CAAC7iB,EAAQ;AACb,QAAM8R,IAAO9P,GAAWhC,CAAM,GACxBqV,IAAS0P,GAAiBlkB,CAAQ;AACxC,SAAAiR,EAAK,KAAKoH,EAAiB,QAAQ,GACnCpH,EAAK,OAAO,UAAUuD,CAAM,IAC5BvD,EAAK,OAAO,GAAG9R,EAAO,IAAI,MAC1BilB,GAAkBnT,EAAK,IAAI,GAC3BjR,EAAS,SAAS,SAAS,KAAKiR,CAAI,GAC7BA;AACT;AAGO,SAASoT,GACdrkB,GACAgiB,GACS;AACT,QAAMpiB,IAAQI,EAAS,SAAS,SAAS,UAAU,CAAC2N,MAAWA,EAAO,SAASqU,CAAU;AACzF,MAAIpiB,IAAQ,EAAG,QAAO;AACtB,EAAAI,EAAS,SAAS,SAAS,OAAOJ,GAAO,CAAC;AAC1C,aAAW6M,KAAQzM,EAAS,WAAY,CAAAskB,GAAoB7X,EAAK,OAAOuV,CAAU;AAClF,SAAO;AACT;AAGO,SAASuC,GACdvkB,GACAwkB,GACsB;AACtB,SAAOA,MAAaZ,KAChB5jB,EAAS,SAAS,OACjBA,EAAS,SAAS,SAAS,KAAK,CAAC2N,MAAWA,EAAO,SAAS6W,CAAQ,GAAG,QACtExkB,EAAS,SAAS;AAC1B;AAOO,SAASykB,GACdzkB,GACAwkB,GACAE,GACM;AACN,MAAIF,MAAaZ,IAAyB;AACxC,IAAAc,EAAS1kB,CAAQ;AACjB;AAAA,EACF;AACA,QAAM2N,IAAS3N,EAAS,SAAS,SAAS,KAAK,CAACpC,MAASA,EAAK,SAAS4mB,CAAQ;AAC/E,MAAI,CAAC7W,EAAQ;AACb,QAAMgX,IAAW3kB,EAAS,SAAS;AACnC,EAAAA,EAAS,SAAS,OAAO2N,EAAO;AAChC,MAAI;AACF,IAAA+W,EAAS1kB,CAAQ,GACjB2N,EAAO,OAAO3N,EAAS,SAAS;AAAA,EAClC,UAAA;AACE,IAAAA,EAAS,SAAS,OAAO2kB;AAAA,EAC3B;AACF;AAEA,SAAST,GAAiBlkB,GAAoC;AAC5D,QAAMuU,IAAO,IAAI;AAAA,IACfvU,EAAS,SAAS,SACf,IAAI,CAAC2N,MAAW,iBAAiB,KAAKA,EAAO,IAAI,IAAI,CAAC,CAAC,EACvD,OAAO,OAAO,EACd,IAAI,MAAM;AAAA,EAAA;AAEf,MAAI6G,IAAS;AACb,SAAOD,EAAK,IAAIC,CAAM,IAAG,CAAAA,KAAU;AACnC,SAAOA;AACT;AAEA,SAAS4P,GAAkBxjB,GAAmC;AAC5D,aAAWN,KAAQM;AAEjB,QADAN,EAAK,KAAK+X,EAAiB,MAAM,GAC7B/X,EAAK,aAAa;AACpB,iBAAWO,KAAQP,EAAK;AACtB,QAAAO,EAAK,KAAKwX,EAAiB,MAAM,GACjC+L,GAAkBvjB,EAAK,QAAQ;AAIvC;AAEA,SAASyjB,GACP1jB,GACAohB,GACM;AACN,WAASpiB,IAAQgB,EAAM,SAAS,GAAGhB,KAAS,GAAGA,KAAS,GAAG;AACzD,UAAMwO,IAAOxN,EAAMhB,CAAK;AACxB,QACEwO,EAAK,aAAa,YAClB,CAAC,eAAe,kBAAkB,eAAe,EAAE,SAASA,EAAK,UAAU,KAC3EA,EAAK,cAAc,eAAe4T,GAClC;AACA,MAAAphB,EAAM,OAAOhB,GAAO,CAAC;AACrB;AAAA,IACF;AACA,IAAIwO,EAAK,aAAa,gBACpBA,EAAK,SAAS,QAAQ,CAACG,MAAW+V,GAAoB/V,EAAO,OAAOyT,CAAU,CAAC,GAC/EsC,GAAoBlW,EAAK,WAAW4T,CAAU;AAAA,EAElD;AACF;AAEA,SAAS7gB,GAAchG,GAAa;AAClC,SAAO,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC;AACzC;AC9IO,SAASypB,GACd5kB,GACA6G,GACAge,GACAxoB,IAAgD,CAAA,GAClB;AAC9B,OAAKA,EAAQ,uBAAuB,UAAU,KAAK;AACjD,UAAM,IAAI,MAAM,qBAAqB;AAEvC,QAAMyoB,IAA6B,CAAA,GAC7BC,wBAAuB,IAAA;AAC7B,aAAWvnB,KAASwC,EAAS,WAAW,QAAQ;AAC9C,UAAMglB,IAAkBxnB,EAAM,kBAAkB,UAC1CkJ,IAAQme,EAAYrnB,EAAM,EAAE,GAC5BynB,IAASve,IAAQ,CAACA,EAAM,UAAUlJ,EAAM,QAAQ,QAChD6M,IAAW7M,EAAM,SAAS;AAKhC,KAJiBwnB,IACb,KACA3a,MAAa,aACZA,MAAa,aAAarK,EAAS,aAAa,sBAAsBilB,KAC7DH,EAAiB,KAAKtnB,EAAM,EAAE,IACvCunB,EAAiB,IAAIvnB,EAAM,EAAE;AAAA,EACpC;AACA,QAAMua,IAAS,OAAO;AAAA,IACpB,OAAO,QAAQlR,EAAW,MAAM,EAC7B,OAAO,CAAC,CAACrB,CAAO,MAAMuf,EAAiB,IAAIvf,CAAO,CAAC,EACnD,IAAI,CAAC,CAACA,GAASrK,CAAK,MAAM,CAACqK,GAASrE,GAAWhG,CAAK,CAAC,CAAC;AAAA,EAAA,GAErD+pB,IAAqBC,GAA0BnlB,EAAS,SAAS,IAAI;AAC3E,aAAWc,KAAWd,EAAS,SAAS;AACtC,IAAAolB,GAAwBF,GAAoBC,GAA0BrkB,EAAQ,IAAI,CAAC;AAErF,QAAMukB,IAAc,OAAO;AAAA,IACzB,OAAO,QAAQxe,EAAW,WAAW,EAAE,IAAI,CAAC,CAACwK,GAAa/H,CAAI,MAAM;AAClE,YAAMrI,IAAUikB,EAAmB,IAAI7T,CAAW,KAAK0T;AACvD,aAAO;AAAA,QACL1T;AAAA,QACA/H,EAAK,IAAI,CAAC1H,OAAS;AAAA,UACjB,OAAOA,EAAI;AAAA,UACX,QAAQ,OAAO;AAAA,YACb,OAAO,QAAQA,EAAI,MAAM,EACtB,OAAO,CAAC,CAAC4D,CAAO,MAAMvE,EAAQ,IAAIuE,CAAO,KAAKuf,EAAiB,IAAIvf,CAAO,CAAC,EAC3E,IAAI,CAAC,CAACA,GAASrK,CAAK,MAAM,CAACqK,GAASrE,GAAWhG,CAAK,CAAC,CAAC;AAAA,UAAA;AAAA,QAC3D,EACA;AAAA,MAAA;AAAA,IAEN,CAAC;AAAA,EAAA;AAEH,SAAO,EAAE,QAAA4c,GAAQ,aAAAsN,GAAa,kBAAAP,EAAA;AAChC;AAEA,SAASK,GAA0BvkB,GAAuD;AACxF,QAAMsD,wBAAa,IAAA,GACbvD,IAAQ,CAAC2kB,MAAyC;AACtD,eAAWhlB,KAAQglB;AACjB,UAAIhlB,EAAK,aAAa,aACtB;AAAA,YAAI,CAAC,gBAAgB,gBAAgB,EAAE,SAASA,EAAK,aAAa,GAAG;AACnE,gBAAMgE,wBAAe,IAAA;AACrB,qBAAWzD,KAAQP,EAAK;AACtB,uBAAW6P,KAAStP,EAAK;AACvB,cAAIsP,EAAM,aAAa,WAAS7L,EAAS,IAAI6L,EAAM,OAAO;AAG9D,UAAAjM,EAAO,IAAI5D,EAAK,IAAIgE,CAAQ;AAC5B;AAAA,QACF;AACA,QAAAhE,EAAK,MAAM,QAAQ,CAACO,MAASF,EAAME,EAAK,QAAQ,CAAC;AAAA;AAAA,EAErD;AACA,SAAAF,EAAMC,CAAK,GACJsD;AACT;AAEA,SAASkhB,GACPllB,GACAf,GACM;AACN,aAAW,CAACkS,GAAa/M,CAAQ,KAAKnF,EAAQ,CAAAe,EAAO,IAAImR,GAAa/M,CAAQ;AAChF;AAEA,SAASnD,GAAchG,GAAa;AAClC,MAA2BA,KAAU,KAAM,QAAOA;AAClD,MAAI,OAAO,WAAW,mBAAoB;AACxC,QAAI;AACF,aAAO,WAAW,gBAAgBA,CAAK;AAAA,IACzC,QAAQ;AAAA,IAER;AAEF,SAAI,MAAM,QAAQA,CAAK,IAAUA,EAAM,IAAI,CAACyC,MAASuD,GAAWvD,CAAI,CAAC,IACjE,OAAOzC,KAAU,YAAY,OAAO,eAAeA,CAAK,MAAM,OAAO,YAChE,OAAO;AAAA,IACZ,OAAO,QAAQA,CAAgC,EAAE,IAAI,CAAC,CAACiE,GAAKxB,CAAI,MAAM;AAAA,MACpEwB;AAAA,MACA+B,GAAWvD,CAAI;AAAA,IAAA,CAChB;AAAA,EAAA,IAGEzC;AACT;ACzEO,SAASoqB,GACdjoB,GACAya,GACAwC,GACAle,IAA6C,CAAA,GACnB;AAC1B,MAAIiB,EAAU,MAAM,WAAW,KAAKA,EAAU,MAAM,CAAC,GAAG,aAAa,UAAW,QAAO,CAAA;AACvF,QAAMuD,IAAO0Z,IACTjd,EAAU,MAAM,KAAK,CAACM,MAASA,EAAK,aAAa2c,CAAQ,IACzDjd,EAAU,MAAM,CAAC,GACfyb,IAAW,IAAI,IAAIhB,EAAO,IAAI,CAACva,MAAU,CAACA,EAAM,IAAIA,CAAK,CAAC,CAAC,GAC3D2d,wBAAqB,IAAA;AAE3B,aAAW7a,KAAQO,GAAM,YAAY,CAAA,GAAI;AACvC,QAAIP,EAAK,aAAa,WAAW6a,EAAe,IAAI7a,EAAK,OAAO,EAAG,QAAO,CAAA;AAC1E,IAAA6a,EAAe,IAAI7a,EAAK,OAAO;AAAA,EACjC;AAEA,UAAQO,GAAM,YAAY,CAAA,GAAI,QAAQ,CAACP,MAAS;AAC9C,QAAIA,EAAK,aAAa,QAAS,QAAO,CAAA;AACtC,UAAM9C,IAAQub,EAAS,IAAIzY,EAAK,OAAO;AACvC,WAAI,CAACjE,EAAQ,kBAAkBmB,GAAO,QAAQ,UAAUA,GAAO,kBAAkB,YACxE,CAAA,IACF;AAAA,MACL;AAAA,QACE,UAAU8C,EAAK;AAAA,QACf,SAASA,EAAK;AAAA,QACd,UAAU9C,GAAO,OAAO8C,EAAK;AAAA,QAC7B,OAAO9C,GAAO,SAAS;AAAA,QACvB,eAAeA,GAAO,iBAAiB;AAAA,QACvC,cAAcA,GAAO,gBAAgB;AAAA,MAAA;AAAA,IACvC;AAAA,EAEJ,CAAC;AACH;AASO,SAASgoB,GACdC,GACAppB,IAAuC,IACX;AAC5B,QAAMqpB,IAAaC,GAAoBtpB,EAAQ,YAAY,EAAE,GACvDupB,IAAcD,GAAoBtpB,EAAQ,aAAa,GAAG,GAC1DwpB,IAAaJ,EAAQ,IAAI,CAACK,MAAW,UAAUC,GAAmBD,CAAM,CAAC,UAAU,GACnFE,IAAS;AAAA,IACb,GAAI3pB,EAAQ,YAAY,CAAC,GAAGqpB,CAAU,IAAI,IAAI,CAAA;AAAA,IAC9C,GAAGG;AAAA,IACH,GAAIxpB,EAAQ,cAAc,CAAC,GAAGupB,CAAW,IAAI,IAAI,CAAA;AAAA,EAAC,GAE9CK,KACH5pB,EAAQ,YAAYqpB,IAAa,KAClCD,EAAQ,OAAO,CAACS,GAAOJ,MAAWI,IAAQH,GAAmBD,CAAM,GAAG,CAAC,KACtEzpB,EAAQ,cAAcupB,IAAc;AAEvC,SAAO;AAAA,IACL,UAAUI,EAAO,SAAS,IAAIA,EAAO,KAAK,GAAG,IAAI;AAAA,IACjD,cAAc,GAAG,KAAK,IAAIC,GAAc,GAAG,CAAC;AAAA,EAAA;AAEhD;AASO,SAASE,GACdV,GACAW,IAAgD,IAC3B;AACrB,SAAO;AAAA,IACL,OAAOC,GAAA;AAAA,IACP,QAAQ,OAAO;AAAA,MACbZ,EAAQ,IAAI,CAACK,MAAW,CAACA,EAAO,SAASQ,GAAkBF,EAAWN,EAAO,OAAO,CAAC,CAAC,CAAC;AAAA,IAAA;AAAA,EACzF;AAEJ;AAQO,SAASS,GAAyBpnB,GAAkD;AACzF,SAAO;AAAA,IACL,OAAOknB,GAAA;AAAA,IACP,QAAQC,GAAkBnnB,EAAO,MAAM;AAAA,EAAA;AAE3C;AAGA,SAAS4mB,GAAmBD,GAAwC;AAClE,SACE,CAAC,cAAc,iBAAiB,QAAQ,aAAa,WAAW,EAAE,SAASA,EAAO,aAAa,IAExF,MAEL,CAAC,aAAa,SAAS,QAAQ,EAAE,SAASA,EAAO,YAAY,IAAU,MACvE,CAAC,QAAQ,WAAW,EAAE,SAASA,EAAO,YAAY,IAAU,MACzD;AACT;AAGA,SAASH,GAAoBxqB,GAA2BqmB,GAA0B;AAChF,SAAO,OAAOrmB,KAAU,YAAY,OAAO,SAASA,CAAK,KAAKA,IAAQ,IAAIA,IAAQqmB;AACpF;AAGA,SAAS6E,KAA6B;AACpC,SAAI,OAAO,WAAW,QAAQ,cAAe,aAAmB,WAAW,OAAO,WAAA,IAC3E,OAAO,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAClF;AAGA,SAASC,GAAqBnrB,GAAa;AACzC,MAA2BA,KAAU,KAAM,QAAOA;AAClD,MAAI,OAAO,WAAW,mBAAoB;AACxC,QAAI;AACF,aAAO,WAAW,gBAAgBA,CAAK;AAAA,IACzC,QAAQ;AAAA,IAER;AAEF,SAAI,MAAM,QAAQA,CAAK,IAAUA,EAAM,IAAI,CAACyC,MAAS0oB,GAAkB1oB,CAAI,CAAC,IACxEzC,aAAiB,OAAa,IAAI,KAAKA,EAAM,SAAS,IACtD,OAAO,eAAeA,CAAK,MAAM,OAAO,YACnC,OAAO;AAAA,IACZ,OAAO,QAAQA,CAAgC,EAAE,IAAI,CAAC,CAACiE,GAAKxB,CAAI,MAAM;AAAA,MACpEwB;AAAA,MACAknB,GAAkB1oB,CAAI;AAAA,IAAA,CACvB;AAAA,EAAA,IAGEzC;AACT;"}