@acorex/platform 21.0.0-next.7 → 21.0.0-next.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/fesm2022/acorex-platform-auth.mjs +281 -23
  2. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-common-common-settings.provider-Bi1RYif5.mjs +163 -0
  4. package/fesm2022/acorex-platform-common-common-settings.provider-Bi1RYif5.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-common.mjs +1381 -276
  6. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-core.mjs +1538 -611
  8. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-domain.mjs +557 -826
  10. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-builder.mjs +1372 -210
  12. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs +121 -0
  14. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-layout-components.mjs +6298 -1929
  16. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-layout-designer.mjs +456 -204
  18. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-layout-entity-attachments-page.component-D8iQnT-R.mjs +371 -0
  20. package/fesm2022/acorex-platform-layout-entity-attachments-page.component-D8iQnT-R.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-layout-entity-file-list-popup.component-_yrP5SQe.mjs +100 -0
  22. package/fesm2022/acorex-platform-layout-entity-file-list-popup.component-_yrP5SQe.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-layout-entity.mjs +22537 -9975
  24. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  25. package/fesm2022/acorex-platform-layout-views.mjs +865 -218
  26. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  27. package/fesm2022/acorex-platform-layout-widget-core.mjs +2138 -487
  28. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  29. package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs → acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs} +10 -10
  30. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs.map +1 -0
  31. package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs → acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs} +6 -7
  32. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs.map +1 -0
  33. package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs → acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs} +12 -12
  34. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs +116 -0
  36. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs.map +1 -0
  37. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-BcpRkpJp.mjs} +6 -6
  38. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-BcpRkpJp.mjs.map +1 -0
  39. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-DQtK4lxl.mjs} +5 -5
  40. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-DQtK4lxl.mjs.map +1 -0
  41. package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs → acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs} +6 -6
  42. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs.map +1 -0
  43. package/fesm2022/acorex-platform-layout-widgets.mjs +10434 -7982
  44. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  45. package/fesm2022/acorex-platform-native.mjs +8 -7
  46. package/fesm2022/acorex-platform-native.mjs.map +1 -1
  47. package/fesm2022/acorex-platform-runtime.mjs +391 -166
  48. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  49. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs +160 -0
  50. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs.map +1 -0
  51. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs +120 -0
  52. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs.map +1 -0
  53. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs → acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs} +21 -28
  54. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs.map +1 -0
  55. package/fesm2022/{acorex-platform-themes-default-error-401.component-cfREo88K.mjs → acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs} +4 -4
  56. package/fesm2022/acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs.map +1 -0
  57. package/fesm2022/{acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs → acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs} +4 -4
  58. package/fesm2022/acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs.map +1 -0
  59. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs +19 -0
  60. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs.map +1 -0
  61. package/fesm2022/acorex-platform-themes-default.mjs +2289 -90
  62. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  63. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs → acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs} +6 -6
  64. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs.map +1 -0
  65. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs → acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs} +6 -6
  66. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs.map +1 -0
  67. package/fesm2022/{acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs → acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs} +52 -33
  68. package/fesm2022/acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs.map +1 -0
  69. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs +94 -0
  70. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs.map +1 -0
  71. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs +86 -0
  72. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs.map +1 -0
  73. package/fesm2022/acorex-platform-themes-shared.mjs +790 -612
  74. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  75. package/fesm2022/acorex-platform-workflow.mjs +978 -238
  76. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  77. package/fesm2022/acorex-platform.mjs.map +1 -1
  78. package/package.json +40 -38
  79. package/{auth/index.d.ts → types/acorex-platform-auth.d.ts} +241 -4
  80. package/{common/index.d.ts → types/acorex-platform-common.d.ts} +833 -89
  81. package/{core/index.d.ts → types/acorex-platform-core.d.ts} +779 -164
  82. package/{domain/index.d.ts → types/acorex-platform-domain.d.ts} +744 -412
  83. package/{layout/builder/index.d.ts → types/acorex-platform-layout-builder.d.ts} +277 -55
  84. package/types/acorex-platform-layout-components.d.ts +3257 -0
  85. package/{layout/designer/index.d.ts → types/acorex-platform-layout-designer.d.ts} +96 -18
  86. package/types/acorex-platform-layout-entity.d.ts +4492 -0
  87. package/{layout/views/index.d.ts → types/acorex-platform-layout-views.d.ts} +247 -62
  88. package/{layout/widget-core/index.d.ts → types/acorex-platform-layout-widget-core.d.ts} +437 -131
  89. package/{layout/widgets/index.d.ts → types/acorex-platform-layout-widgets.d.ts} +1140 -506
  90. package/{native/index.d.ts → types/acorex-platform-native.d.ts} +0 -7
  91. package/types/acorex-platform-runtime.d.ts +571 -0
  92. package/{themes/default/index.d.ts → types/acorex-platform-themes-default.d.ts} +254 -7
  93. package/{themes/shared/index.d.ts → types/acorex-platform-themes-shared.d.ts} +30 -2
  94. package/{workflow/index.d.ts → types/acorex-platform-workflow.d.ts} +620 -617
  95. package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs +0 -71
  96. package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map +0 -1
  97. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs.map +0 -1
  98. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs +0 -135
  99. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +0 -1
  100. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map +0 -1
  101. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs.map +0 -1
  102. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs.map +0 -1
  105. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs +0 -157
  106. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DfJEx_bs.mjs +0 -1542
  108. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DfJEx_bs.mjs.map +0 -1
  109. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +0 -101
  110. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
  111. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +0 -1
  112. package/fesm2022/acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map +0 -1
  113. package/fesm2022/acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map +0 -1
  114. package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs +0 -19
  115. package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map +0 -1
  116. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map +0 -1
  117. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs.map +0 -1
  118. package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +0 -1
  119. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs +0 -65
  120. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs.map +0 -1
  121. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs +0 -64
  122. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs.map +0 -1
  123. package/layout/components/index.d.ts +0 -1669
  124. package/layout/entity/index.d.ts +0 -2287
  125. package/runtime/index.d.ts +0 -307
  126. /package/{index.d.ts → types/acorex-platform.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-layout-builder.mjs","sources":["../tmp-esm2022/layout/builder/lib/layout-conversion.service.js","../tmp-esm2022/layout/builder/lib/layout-builder.service.js","../tmp-esm2022/layout/builder/lib/layout-renderer.component.js","../tmp-esm2022/layout/builder/lib/layout-builder.module.js","../tmp-esm2022/layout/builder/lib/layout-builder.types.js","../tmp-esm2022/layout/builder/lib/dialog-renderer.component.js","../tmp-esm2022/layout/builder/acorex-platform-layout-builder.js"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class AXPLayoutConversionService {\n constructor() {\n //#region ---- Caching ----\n this.widgetTreeCache = new Map();\n this.formDefinitionCache = new Map();\n }\n //#endregion\n //#region ---- Public Methods ----\n /**\n * Convert AXPDynamicFormDefinition to AXPWidgetNode tree structure\n * Groups become Fieldset Layouts with Form Field widgets as children\n * Fields become Form Field widgets with Editor widgets as children\n */\n convertFormDefinition(formDefinition) {\n // Create cache key based on form definition content\n const cacheKey = this.createFormDefinitionCacheKey(formDefinition);\n // Check cache first\n if (this.widgetTreeCache.has(cacheKey)) {\n return this.widgetTreeCache.get(cacheKey);\n }\n // Generate widget tree\n const widgetTree = {\n type: 'grid-layout',\n name: 'dynamic-form-container',\n mode: formDefinition.mode, // Preserve form-level mode\n options: {\n title: 'Dynamic Form',\n grid: {\n default: {\n columns: 1,\n gap: '1rem',\n },\n },\n },\n children: formDefinition.groups.map((group) => this.createGroupAsFieldsetWidget(group, formDefinition.mode)),\n };\n // Cache the result\n this.widgetTreeCache.set(cacheKey, widgetTree);\n return widgetTree;\n }\n /**\n * Convert AXPWidgetNode tree back to AXPDynamicFormDefinition\n * Parses Fieldset Layouts back to Groups\n * Parses Form Field widgets back to Fields\n */\n convertWidgetTreeToFormDefinition(widgetTree) {\n // Create cache key based on widget tree content\n const cacheKey = this.createWidgetTreeCacheKey(widgetTree);\n // Check cache first\n if (this.formDefinitionCache.has(cacheKey)) {\n return this.formDefinitionCache.get(cacheKey);\n }\n // Parse widget tree\n const groups = [];\n if (widgetTree.children) {\n widgetTree.children.forEach((child) => {\n if (child.type === 'fieldset-layout') {\n const group = this.extractGroupFromFieldset(child);\n groups.push(group);\n }\n });\n }\n const formDefinition = { groups };\n // Cache the result\n this.formDefinitionCache.set(cacheKey, formDefinition);\n return formDefinition;\n }\n /**\n * Validate that a widget tree represents a valid dynamic form structure\n */\n validateFormWidgetTree(widgetTree) {\n if (!widgetTree || widgetTree.type !== 'grid-layout') {\n return false;\n }\n if (!widgetTree.children || widgetTree.children.length === 0) {\n return true; // Empty form is valid\n }\n // Check that all children are fieldset-layout widgets\n return widgetTree.children.every((child) => child.type === 'fieldset-layout' &&\n child.children &&\n child.children.every((formField) => formField.type === 'form-field' && formField.children && formField.children.length > 0));\n }\n /**\n * Clear all caches\n */\n clearCaches() {\n this.widgetTreeCache.clear();\n this.formDefinitionCache.clear();\n }\n /**\n * Get cache statistics\n */\n getCacheStats() {\n return {\n widgetTreeCacheSize: this.widgetTreeCache.size,\n formDefinitionCacheSize: this.formDefinitionCache.size,\n };\n }\n //#endregion\n //#region ---- Private Methods ----\n /**\n * Convert a single group to Fieldset widget structure\n */\n createGroupAsFieldsetWidget(group, formMode) {\n // Determine columns count from layout or default to 1\n const columnsCount = 1;\n // Use group mode if set, otherwise inherit from form mode\n const groupMode = group.mode || formMode;\n return {\n type: 'fieldset-layout',\n name: group.name,\n mode: groupMode,\n options: {\n title: group.title,\n description: group.description,\n cols: columnsCount,\n look: group.look || 'container', // Default to 'container' if not specified\n },\n children: this.createFieldWidgets(group.parameters, columnsCount, groupMode),\n };\n }\n /**\n * Convert fields to Form Field widgets\n */\n createFieldWidgets(fields, columnsCount, groupMode) {\n return fields.map((field) => this.createFormFieldWidget(field, groupMode));\n }\n /**\n * Convert a single field to Form Field widget with editor as child\n */\n createFormFieldWidget(field, groupMode) {\n // Use field mode if set, otherwise inherit from group mode\n const fieldMode = field.mode || groupMode;\n // Ensure the editor widget also has the mode set\n const editorWidget = { ...field.widget };\n if (!editorWidget.mode) {\n editorWidget.mode = fieldMode;\n }\n return {\n type: 'form-field',\n name: field.path,\n mode: fieldMode,\n options: {\n label: field.title,\n badge: field.badge,\n description: field.description,\n showLabel: true,\n },\n children: [editorWidget], // The editor widget becomes a child of form-field\n };\n }\n /**\n * Extract group information from Fieldset Layout widget\n */\n extractGroupFromFieldset(fieldsetNode) {\n const columnsCount = fieldsetNode.options?.['cols'] || 1;\n // Extract fields directly from fieldset children\n const fields = [];\n if (fieldsetNode.children) {\n fieldsetNode.children.forEach((formField) => {\n if (formField.type === 'form-field' && formField.children && formField.children.length > 0) {\n const field = this.extractFieldFromFormWidget(formField);\n if (field) {\n fields.push(field);\n }\n }\n });\n }\n return {\n name: fieldsetNode.name || `group-${Date.now()}`,\n title: fieldsetNode.options?.['title'],\n description: fieldsetNode.options?.['description'],\n parameters: fields,\n mode: fieldsetNode.mode,\n look: fieldsetNode.options?.['look'],\n };\n }\n /**\n * Extract field information from Form Field widget\n */\n extractFieldFromFormWidget(formFieldNode) {\n if (!formFieldNode.children || formFieldNode.children.length === 0) {\n return null;\n }\n const editorWidget = formFieldNode.children[0];\n return {\n path: formFieldNode.name || editorWidget.name || `field-${Date.now()}`,\n title: formFieldNode.options?.['label'],\n badge: formFieldNode.options?.['badge'],\n description: formFieldNode.options?.['description'],\n widget: editorWidget,\n mode: formFieldNode.mode,\n };\n }\n /**\n * Create cache key for form definition\n */\n createFormDefinitionCacheKey(formDefinition) {\n // Create a hash-like key instead of full JSON string\n const keyParts = [];\n keyParts.push(`groups:${formDefinition.groups.length}`);\n formDefinition.groups.forEach((group, groupIndex) => {\n keyParts.push(`g${groupIndex}:${group.name}:${group.parameters.length}`);\n group.parameters.forEach((param, paramIndex) => {\n keyParts.push(`p${groupIndex}.${paramIndex}:${param.path}:${param.widget.type}`);\n });\n });\n if (formDefinition.mode) {\n keyParts.push(`mode:${formDefinition.mode}`);\n }\n // Join with delimiter and create a shorter hash\n const keyString = keyParts.join('|');\n // If still too long, create a simple hash\n if (keyString.length > 100) {\n return this.createSimpleHash(keyString);\n }\n return keyString;\n }\n /**\n * Create cache key for widget tree\n */\n createWidgetTreeCacheKey(widgetTree) {\n // Create a hash-like key instead of full JSON string\n const keyParts = [];\n keyParts.push(`type:${widgetTree.type}`);\n if (widgetTree.name) {\n keyParts.push(`name:${widgetTree.name}`);\n }\n if (widgetTree.children) {\n keyParts.push(`children:${widgetTree.children.length}`);\n widgetTree.children.forEach((child, index) => {\n keyParts.push(`c${index}:${child.type}`);\n if (child.children) {\n keyParts.push(`cc${index}:${child.children.length}`);\n child.children.forEach((grandChild, gIndex) => {\n keyParts.push(`gc${index}.${gIndex}:${grandChild.type}`);\n if (grandChild.children) {\n keyParts.push(`gcc${index}.${gIndex}:${grandChild.children.length}`);\n }\n });\n }\n });\n }\n // Join with delimiter and create a shorter hash\n const keyString = keyParts.join('|');\n // If still too long, create a simple hash\n if (keyString.length > 100) {\n return this.createSimpleHash(keyString);\n }\n return keyString;\n }\n /**\n * Create a simple hash from a string\n */\n createSimpleHash(str) {\n let hash = 0;\n if (str.length === 0)\n return hash.toString();\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36); // Convert to base36 for shorter string\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutConversionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutConversionService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutConversionService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWNvbnZlcnNpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2J1aWxkZXIvc3JjL2xpYi9sYXlvdXQtY29udmVyc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVzNDLE1BQU0sT0FBTywwQkFBMEI7SUFIdkM7UUFJRSwrQkFBK0I7UUFFdkIsb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUNuRCx3QkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBb0MsQ0FBQztLQWtVM0U7SUFoVUMsWUFBWTtJQUVaLHNDQUFzQztJQUV0Qzs7OztPQUlHO0lBQ0gscUJBQXFCLENBQUMsY0FBd0M7UUFDNUQsb0RBQW9EO1FBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVuRSxvQkFBb0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFFLENBQUM7UUFDN0MsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixNQUFNLFVBQVUsR0FBa0I7WUFDaEMsSUFBSSxFQUFFLGFBQWE7WUFDbkIsSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSwyQkFBMkI7WUFDdEQsT0FBTyxFQUFFO2dCQUNQLEtBQUssRUFBRSxjQUFjO2dCQUNyQixJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSxDQUFDO3dCQUNWLEdBQUcsRUFBRSxNQUFNO3FCQUNaO2lCQUNGO2FBQ0Y7WUFDRCxRQUFRLEVBQUUsY0FBYyxD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WUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLEdBQVc7UUFDbEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyw0QkFBNEI7UUFDbEQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUM7SUFDN0UsQ0FBQzsrR0FuVVUsMEJBQTBCO21IQUExQiwwQkFBMEIsY0FGekIsTUFBTTs7NEZBRVAsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYUFdpZGdldE5vZGUgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC93aWRnZXQtY29yZSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBWFBEeW5hbWljRm9ybURlZmluaXRpb24sXG4gIEFYUER5bmFtaWNGb3JtRmllbGREZWZpbml0aW9uLFxuICBBWFBEeW5hbWljRm9ybUdyb3VwRGVmaW5pdGlvbixcbiAgQVhQRHluYW1pY0Zvcm1Nb2RlLFxufSBmcm9tICcuL2xheW91dC1idWlsZGVyLnR5cGVzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEFYUExheW91dENvbnZlcnNpb25TZXJ2aWNlIHtcbiAgLy8jcmVnaW9uIC0tLS0gICBDYWNoaW5nICAgLS0tLVxuXG4gIHByaXZhdGUgd2lkZ2V0VHJlZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEFYUFdpZGdldE5vZGU+KCk7XG4gIHByaXZhdGUgZm9ybURlZmluaXRpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBBWFBEeW5hbWljRm9ybURlZmluaXRpb24+KCk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBQdWJsaWMgTWV0aG9kcyAgIC0tLS1cblxuICAvKipcbiAgICogQ29udmVydCBBWFBEeW5hbWljRm9ybURlZmluaXRpb24gdG8gQVhQV2lkZ2V0Tm9kZSB0cmVlIHN0cnVjdHVyZVxuICAgKiBHcm91cHMgYmVjb21lIEZpZWxkc2V0IExheW91dHMgd2l0aCBGb3JtIEZpZWxkIHdpZGdldHMgYXMgY2hpbGRyZW5cbiAgICogRmllbGRzIGJlY29tZSBGb3JtIEZpZWxkIHdpZGdldHMgd2l0aCBFZGl0b3Igd2lkZ2V0cyBhcyBjaGlsZHJlblxuICAgKi9cbiAgY29udmVydEZvcm1EZWZpbml0aW9uKGZvcm1EZWZpbml0aW9uOiBBWFBEeW5hbWljRm9ybURlZmluaXRpb24pOiBBWFBXaWRnZXROb2RlIHtcbiAgICAvLyBDcmVhdGUgY2FjaGUga2V5IGJhc2VkIG9uIGZvcm0gZGVmaW5pdGlvbiBjb250ZW50XG4gICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmNyZWF0ZUZvcm1EZWZpbml0aW9uQ2FjaGVLZXkoZm9ybURlZmluaXRpb24pO1xuXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBpZiAodGhpcy53aWRnZXRUcmVlQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0VHJlZUNhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIHdpZGdldCB0cmVlXG4gICAgY29uc3Qgd2lkZ2V0VHJlZTogQVhQV2lkZ2V0Tm9kZSA9IHtcbiAgICAgIHR5cGU6ICdncmlkLWxheW91dCcsXG4gICAgICBuYW1lOiAnZHluYW1pYy1mb3JtLWNvbnRhaW5lcicsXG4gICAgICBtb2RlOiBmb3JtRGVmaW5pdGlvbi5tb2RlLCAvLyBQcmVzZXJ2ZSBmb3JtLWxldmVsIG1vZGVcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgdGl0bGU6ICdEeW5hbWljIEZvcm0nLFxuICAgICAgICBncmlkOiB7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgICAgIGdhcDogJzFyZW0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IGZvcm1EZWZpbml0aW9uLmdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB0aGlzLmNyZWF0ZUdyb3VwQXNGaWVsZHNldFdpZGdldChncm91cCwgZm9ybURlZmluaXRpb24ubW9kZSkpLFxuICAgIH07XG5cbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgdGhpcy53aWRnZXRUcmVlQ2FjaGUuc2V0KGNhY2hlS2V5LCB3aWRnZXRUcmVlKTtcblxuICAgIHJldHVybiB3aWRnZXRUcmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgQVhQV2lkZ2V0Tm9kZSB0cmVlIGJhY2sgdG8gQVhQRHluYW1pY0Zvcm1EZWZpbml0aW9uXG4gICAqIFBhcnNlcyBGaWVsZHNldCBMYXlvdXRzIGJhY2sgdG8gR3JvdXBzXG4gICAqIFBhcnNlcyBGb3JtIEZpZWxkIHdpZGdldHMgYmFjayB0byBGaWVsZHNcbiAgICovXG4gIGNvbnZlcnRXaWRnZXRUcmVlVG9Gb3JtRGVmaW5pdGlvbih3aWRnZXRUcmVlOiBBWFBXaWRnZXROb2RlKTogQVhQRHluYW1pY0Zvcm1EZWZpbml0aW9uIHtcbiAgICAvLyBDcmVhdGUgY2FjaGUga2V5IGJhc2VkIG9uIHdpZGdldCB0cmVlIGNvbnRlbnRcbiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuY3JlYXRlV2lkZ2V0VHJlZUNhY2hlS2V5KHdpZGdldFRyZWUpO1xuXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBpZiAodGhpcy5mb3JtRGVmaW5pdGlvbkNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1EZWZpbml0aW9uQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gUGFyc2Ugd2lkZ2V0IHRyZWVcbiAgICBjb25zdCBncm91cHM6IEFYUER5bmFtaWNGb3JtR3JvdXBEZWZpbml0aW9uW10gPSBbXTtcblxuICAgIGlmICh3aWRnZXRUcmVlLmNoaWxkcmVuKSB7XG4gICAgICB3aWRnZXRUcmVlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlID09PSAnZmllbGRzZXQtbGF5b3V0Jykge1xuICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5leHRyYWN0R3JvdXBGcm9tRmllbGRzZXQoY2hpbGQpO1xuICAgICAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybURlZmluaXRpb24gPSB7IGdyb3VwcyB9O1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybURlZmluaXRpb25DYWNoZS5zZXQoY2FjaGVLZXksIGZvcm1EZWZpbml0aW9uKTtcblxuICAgIHJldHVybiBmb3JtRGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IGEgd2lkZ2V0IHRyZWUgcmVwcmVzZW50cyBhIHZhbGlkIGR5bmFtaWMgZm9ybSBzdHJ1Y3R1cmVcbiAgICovXG4gIHZhbGlkYXRlRm9ybVdpZGdldFRyZWUod2lkZ2V0VHJlZTogQVhQV2lkZ2V0Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghd2lkZ2V0VHJlZSB8fCB3aWRnZXRUcmVlLnR5cGUgIT09ICdncmlkLWxheW91dCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXdpZGdldFRyZWUuY2hpbGRyZW4gfHwgd2lkZ2V0VHJlZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBFbXB0eSBmb3JtIGlzIHZhbGlkXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhhdCBhbGwgY2hpbGRyZW4gYXJlIGZpZWxkc2V0LWxheW91dCB3aWRnZXRzXG4gICAgcmV0dXJuIHdpZGdldFRyZWUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+XG4gICAgICAgIGNoaWxkLnR5cGUgPT09ICdmaWVsZHNldC1sYXlvdXQnICYmXG4gICAgICAgIGNoaWxkLmNoaWxkcmVuICYmXG4gICAgICAgIGNoaWxkLmNoaWxkcmVuLmV2ZXJ5KFxuICAgICAgICAgIChmb3JtRmllbGQpID0+IGZvcm1GaWVsZC50eXBlID09PSAnZm9ybS1maWVsZCcgJiYgZm9ybUZpZWxkLmNoaWxkcmVuICYmIGZvcm1GaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlc1xuICAgKi9cbiAgY2xlYXJDYWNoZXMoKTogdm9pZCB7XG4gICAgdGhpcy53aWRnZXRUcmVlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmZvcm1EZWZpbml0aW9uQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgc3RhdGlzdGljc1xuICAgKi9cbiAgZ2V0Q2FjaGVTdGF0cygpOiB7IHdpZGdldFRyZWVDYWNoZVNpemU6IG51bWJlcjsgZm9ybURlZmluaXRpb25DYWNoZVNpemU6IG51bWJlciB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkZ2V0VHJlZUNhY2hlU2l6ZTogdGhpcy53aWRnZXRUcmVlQ2FjaGUuc2l6ZSxcbiAgICAgIGZvcm1EZWZpbml0aW9uQ2FjaGVTaXplOiB0aGlzLmZvcm1EZWZpbml0aW9uQ2FjaGUuc2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBQcml2YXRlIE1ldGhvZHMgICAtLS0tXG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBzaW5nbGUgZ3JvdXAgdG8gRmllbGRzZXQgd2lkZ2V0IHN0cnVjdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVHcm91cEFzRmllbGRzZXRXaWRnZXQoZ3JvdXA6IEFYUER5bmFtaWNGb3JtR3JvdXBEZWZpbml0aW9uLCBmb3JtTW9kZT86IEFYUER5bmFtaWNGb3JtTW9kZSk6IEFYUFdpZGdldE5vZGUge1xuICAgIC8vIERldGVybWluZSBjb2x1bW5zIGNvdW50IGZyb20gbGF5b3V0IG9yIGRlZmF1bHQgdG8gMVxuICAgIGNvbnN0IGNvbHVtbnNDb3VudCA9IDE7XG4gICAgLy8gVXNlIGdyb3VwIG1vZGUgaWYgc2V0LCBvdGhlcndpc2UgaW5oZXJpdCBmcm9tIGZvcm0gbW9kZVxuICAgIGNvbnN0IGdyb3VwTW9kZSA9IGdyb3VwLm1vZGUgfHwgZm9ybU1vZGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2ZpZWxkc2V0LWxheW91dCcsXG4gICAgICBuYW1lOiBncm91cC5uYW1lLFxuICAgICAgbW9kZTogZ3JvdXBNb2RlLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICB0aXRsZTogZ3JvdXAudGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBncm91cC5kZXNjcmlwdGlvbixcbiAgICAgICAgY29sczogY29sdW1uc0NvdW50LFxuICAgICAgICBsb29rOiBncm91cC5sb29rIHx8ICdjb250YWluZXInLCAvLyBEZWZhdWx0IHRvICdjb250YWluZXInIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogdGhpcy5jcmVhdGVGaWVsZFdpZGdldHMoZ3JvdXAucGFyYW1ldGVycywgY29sdW1uc0NvdW50LCBncm91cE1vZGUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBmaWVsZHMgdG8gRm9ybSBGaWVsZCB3aWRnZXRzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZpZWxkV2lkZ2V0cyhmaWVsZHM6IEFYUER5bmFtaWNGb3JtRmllbGREZWZpbml0aW9uW10sIGNvbHVtbnNDb3VudDogbnVtYmVyLCBncm91cE1vZGU/OiBBWFBEeW5hbWljRm9ybU1vZGUpOiBBWFBXaWRnZXROb2RlW10ge1xuICAgIHJldHVybiBmaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5jcmVhdGVGb3JtRmllbGRXaWRnZXQoZmllbGQsIGdyb3VwTW9kZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBzaW5nbGUgZmllbGQgdG8gRm9ybSBGaWVsZCB3aWRnZXQgd2l0aCBlZGl0b3IgYXMgY2hpbGRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRm9ybUZpZWxkV2lkZ2V0KGZpZWxkOiBBWFBEeW5hbWljRm9ybUZpZWxkRGVmaW5pdGlvbiwgZ3JvdXBNb2RlPzogQVhQRHluYW1pY0Zvcm1Nb2RlKTogQVhQV2lkZ2V0Tm9kZSB7XG4gICAgLy8gVXNlIGZpZWxkIG1vZGUgaWYgc2V0LCBvdGhlcndpc2UgaW5oZXJpdCBmcm9tIGdyb3VwIG1vZGVcbiAgICBjb25zdCBmaWVsZE1vZGUgPSBmaWVsZC5tb2RlIHx8IGdyb3VwTW9kZTtcblxuICAgIC8vIEVuc3VyZSB0aGUgZWRpdG9yIHdpZGdldCBhbHNvIGhhcyB0aGUgbW9kZSBzZXRcbiAgICBjb25zdCBlZGl0b3JXaWRnZXQgPSB7IC4uLmZpZWxkLndpZGdldCB9O1xuICAgIGlmICghZWRpdG9yV2lkZ2V0Lm1vZGUpIHtcbiAgICAgIGVkaXRvcldpZGdldC5tb2RlID0gZmllbGRNb2RlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybS1maWVsZCcsXG4gICAgICBuYW1lOiBmaWVsZC5wYXRoLFxuICAgICAgbW9kZTogZmllbGRNb2RlLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBsYWJlbDogZmllbGQudGl0bGUsXG4gICAgICAgIGJhZGdlOiBmaWVsZC5iYWRnZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGZpZWxkLmRlc2NyaXB0aW9uLFxuICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFtlZGl0b3JXaWRnZXRdLCAvLyBUaGUgZWRpdG9yIHdpZGdldCBiZWNvbWVzIGEgY2hpbGQgb2YgZm9ybS1maWVsZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBncm91cCBpbmZvcm1hdGlvbiBmcm9tIEZpZWxkc2V0IExheW91dCB3aWRnZXRcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEdyb3VwRnJvbUZpZWxkc2V0KGZpZWxkc2V0Tm9kZTogQVhQV2lkZ2V0Tm9kZSk6IEFYUER5bmFtaWNGb3JtR3JvdXBEZWZpbml0aW9uIHtcbiAgICBjb25zdCBjb2x1bW5zQ291bnQgPSBmaWVsZHNldE5vZGUub3B0aW9ucz8uWydjb2xzJ10gfHwgMTtcblxuICAgIC8vIEV4dHJhY3QgZmllbGRzIGRpcmVjdGx5IGZyb20gZmllbGRzZXQgY2hpbGRyZW5cbiAgICBjb25zdCBmaWVsZHM6IEFYUER5bmFtaWNGb3JtRmllbGREZWZpbml0aW9uW10gPSBbXTtcblxuICAgIGlmIChmaWVsZHNldE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZpZWxkc2V0Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKChmb3JtRmllbGQpID0+IHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC50eXBlID09PSAnZm9ybS1maWVsZCcgJiYgZm9ybUZpZWxkLmNoaWxkcmVuICYmIGZvcm1GaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmV4dHJhY3RGaWVsZEZyb21Gb3JtV2lkZ2V0KGZvcm1GaWVsZCk7XG4gICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmllbGRzZXROb2RlLm5hbWUgfHwgYGdyb3VwLSR7RGF0ZS5ub3coKX1gLFxuICAgICAgdGl0bGU6IGZpZWxkc2V0Tm9kZS5vcHRpb25zPy5bJ3RpdGxlJ10sXG4gICAgICBkZXNjcmlwdGlvbjogZmllbGRzZXROb2RlLm9wdGlvbnM/LlsnZGVzY3JpcHRpb24nXSxcbiAgICAgIHBhcmFtZXRlcnM6IGZpZWxkcyxcbiAgICAgIG1vZGU6IGZpZWxkc2V0Tm9kZS5tb2RlIGFzIEFYUER5bmFtaWNGb3JtTW9kZSB8IHVuZGVmaW5lZCxcbiAgICAgIGxvb2s6IGZpZWxkc2V0Tm9kZS5vcHRpb25zPy5bJ2xvb2snXSBhcyAnZmllbGRzZXQnIHwgJ2NhcmQnIHwgJ2dyb3VwJyB8ICdjb250YWluZXInLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBmaWVsZCBpbmZvcm1hdGlvbiBmcm9tIEZvcm0gRmllbGQgd2lkZ2V0XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RGaWVsZEZyb21Gb3JtV2lkZ2V0KGZvcm1GaWVsZE5vZGU6IEFYUFdpZGdldE5vZGUpOiBBWFBEeW5hbWljRm9ybUZpZWxkRGVmaW5pdGlvbiB8IG51bGwge1xuICAgIGlmICghZm9ybUZpZWxkTm9kZS5jaGlsZHJlbiB8fCBmb3JtRmllbGROb2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdG9yV2lkZ2V0ID0gZm9ybUZpZWxkTm9kZS5jaGlsZHJlblswXTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBmb3JtRmllbGROb2RlLm5hbWUgfHwgZWRpdG9yV2lkZ2V0Lm5hbWUgfHwgYGZpZWxkLSR7RGF0ZS5ub3coKX1gLFxuICAgICAgdGl0bGU6IGZvcm1GaWVsZE5vZGUub3B0aW9ucz8uWydsYWJlbCddLFxuICAgICAgYmFkZ2U6IGZvcm1GaWVsZE5vZGUub3B0aW9ucz8uWydiYWRnZSddLFxuICAgICAgZGVzY3JpcHRpb246IGZvcm1GaWVsZE5vZGUub3B0aW9ucz8uWydkZXNjcmlwdGlvbiddLFxuICAgICAgd2lkZ2V0OiBlZGl0b3JXaWRnZXQsXG4gICAgICBtb2RlOiBmb3JtRmllbGROb2RlLm1vZGUgYXMgQVhQRHluYW1pY0Zvcm1Nb2RlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGNhY2hlIGtleSBmb3IgZm9ybSBkZWZpbml0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZvcm1EZWZpbml0aW9uQ2FjaGVLZXkoZm9ybURlZmluaXRpb246IEFYUER5bmFtaWNGb3JtRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgLy8gQ3JlYXRlIGEgaGFzaC1saWtlIGtleSBpbnN0ZWFkIG9mIGZ1bGwgSlNPTiBzdHJpbmdcbiAgICBjb25zdCBrZXlQYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIGtleVBhcnRzLnB1c2goYGdyb3Vwczoke2Zvcm1EZWZpbml0aW9uLmdyb3Vwcy5sZW5ndGh9YCk7XG5cbiAgICBmb3JtRGVmaW5pdGlvbi5ncm91cHMuZm9yRWFjaCgoZ3JvdXAsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgIGtleVBhcnRzLnB1c2goYGcke2dyb3VwSW5kZXh9OiR7Z3JvdXAubmFtZX06JHtncm91cC5wYXJhbWV0ZXJzLmxlbmd0aH1gKTtcblxuICAgICAgZ3JvdXAucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbSwgcGFyYW1JbmRleCkgPT4ge1xuICAgICAgICBrZXlQYXJ0cy5wdXNoKGBwJHtncm91cEluZGV4fS4ke3BhcmFtSW5kZXh9OiR7cGFyYW0ucGF0aH06JHtwYXJhbS53aWRnZXQudHlwZX1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGZvcm1EZWZpbml0aW9uLm1vZGUpIHtcbiAgICAgIGtleVBhcnRzLnB1c2goYG1vZGU6JHtmb3JtRGVmaW5pdGlvbi5tb2RlfWApO1xuICAgIH1cblxuICAgIC8vIEpvaW4gd2l0aCBkZWxpbWl0ZXIgYW5kIGNyZWF0ZSBhIHNob3J0ZXIgaGFzaFxuICAgIGNvbnN0IGtleVN0cmluZyA9IGtleVBhcnRzLmpvaW4oJ3wnKTtcblxuICAgIC8vIElmIHN0aWxsIHRvbyBsb25nLCBjcmVhdGUgYSBzaW1wbGUgaGFzaFxuICAgIGlmIChrZXlTdHJpbmcubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaW1wbGVIYXNoKGtleVN0cmluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FjaGUga2V5IGZvciB3aWRnZXQgdHJlZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVXaWRnZXRUcmVlQ2FjaGVLZXkod2lkZ2V0VHJlZTogQVhQV2lkZ2V0Tm9kZSk6IHN0cmluZyB7XG4gICAgLy8gQ3JlYXRlIGEgaGFzaC1saWtlIGtleSBpbnN0ZWFkIG9mIGZ1bGwgSlNPTiBzdHJpbmdcbiAgICBjb25zdCBrZXlQYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIGtleVBhcnRzLnB1c2goYHR5cGU6JHt3aWRnZXRUcmVlLnR5cGV9YCk7XG5cbiAgICBpZiAod2lkZ2V0VHJlZS5uYW1lKSB7XG4gICAgICBrZXlQYXJ0cy5wdXNoKGBuYW1lOiR7d2lkZ2V0VHJlZS5uYW1lfWApO1xuICAgIH1cblxuICAgIGlmICh3aWRnZXRUcmVlLmNoaWxkcmVuKSB7XG4gICAgICBrZXlQYXJ0cy5wdXNoKGBjaGlsZHJlbjoke3dpZGdldFRyZWUuY2hpbGRyZW4ubGVuZ3RofWApO1xuXG4gICAgICB3aWRnZXRUcmVlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICBrZXlQYXJ0cy5wdXNoKGBjJHtpbmRleH06JHtjaGlsZC50eXBlfWApO1xuXG4gICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAgIGtleVBhcnRzLnB1c2goYGNjJHtpbmRleH06JHtjaGlsZC5jaGlsZHJlbi5sZW5ndGh9YCk7XG5cbiAgICAgICAgICBjaGlsZC5jaGlsZHJlbi5mb3JFYWNoKChncmFuZENoaWxkLCBnSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGtleVBhcnRzLnB1c2goYGdjJHtpbmRleH0uJHtnSW5kZXh9OiR7Z3JhbmRDaGlsZC50eXBlfWApO1xuXG4gICAgICAgICAgICBpZiAoZ3JhbmRDaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICBrZXlQYXJ0cy5wdXNoKGBnY2Mke2luZGV4fS4ke2dJbmRleH06JHtncmFuZENoaWxkLmNoaWxkcmVuLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSm9pbiB3aXRoIGRlbGltaXRlciBhbmQgY3JlYXRlIGEgc2hvcnRlciBoYXNoXG4gICAgY29uc3Qga2V5U3RyaW5nID0ga2V5UGFydHMuam9pbignfCcpO1xuXG4gICAgLy8gSWYgc3RpbGwgdG9vIGxvbmcsIGNyZWF0ZSBhIHNpbXBsZSBoYXNoXG4gICAgaWYgKGtleVN0cmluZy5sZW5ndGggPiAxMDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbXBsZUhhc2goa2V5U3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5U3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNpbXBsZSBoYXNoIGZyb20gYSBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2ltcGxlSGFzaChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGhhc2ggPSAwO1xuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gaGFzaC50b1N0cmluZygpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaGFyO1xuICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyLWJpdCBpbnRlZ2VyXG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguYWJzKGhhc2gpLnRvU3RyaW5nKDM2KTsgLy8gQ29udmVydCB0byBiYXNlMzYgZm9yIHNob3J0ZXIgc3RyaW5nXG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==","import { AXPopupService } from '@acorex/components/popup';\nimport { AXPWidgetSerializationHelper, } from '@acorex/platform/layout/widget-core';\nimport { Injectable, inject } from '@angular/core';\nimport { set, isNil, cloneDeep } from 'lodash-es';\nimport { AXPLayoutConversionService } from './layout-conversion.service';\nimport * as i0 from \"@angular/core\";\n//#region ---- Inheritance Utilities ----\n/**\n * Resolves inherited properties from context and local values\n */\nfunction resolveInheritedProperties(context, localValues = {}) {\n return {\n mode: localValues.mode ?? context.mode ?? 'edit',\n disabled: localValues.disabled ?? context.disabled,\n readonly: localValues.readonly ?? context.readonly,\n direction: localValues.direction ?? context.direction,\n visible: localValues.visible ?? context.visible,\n };\n}\n/**\n * Merges inheritance context with local overrides\n */\nfunction mergeInheritanceContext(parentContext, localOverrides = {}) {\n return {\n ...parentContext,\n ...localOverrides,\n };\n}\n/**\n * Generates a random string for path/name generation\n */\nfunction generateRandomId() {\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}\n/**\n * Converts label to a valid path/name\n */\nfunction labelToPath(label) {\n return label\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '') // Remove special characters\n .replace(/\\s+/g, '_') // Replace spaces with underscores\n .substring(0, 50); // Limit length\n}\n/**\n * Generates path for value widgets based on hierarchy\n */\nfunction generateValueWidgetPath(widgetName, formFieldName, formFieldLabel) {\n // Priority: widget name -> form field name -> generated from label -> random\n if (widgetName) {\n return widgetName;\n }\n if (formFieldName) {\n return formFieldName;\n }\n if (formFieldLabel) {\n return labelToPath(formFieldLabel);\n }\n return generateRandomId();\n}\n/**\n * Collects default values from widget node tree and merges them into context\n * Only sets values for paths that don't already exist in the context\n * @param node - The widget node to process\n * @param context - The context object to modify in place (cloned at top level only)\n * @param isTopLevel - Internal flag to track if this is the top-level call\n */\nfunction collectDefaultValues(node, context = {}, isTopLevel = true) {\n // Clone context only at the top level, then modify in place for recursive calls\n const result = isTopLevel ? cloneDeep(context) : context;\n // Check if this node has a defaultValue and a path\n // Note: We check for both node.defaultValue and also look in node.options.defaultValue as fallback\n const defaultValue = node.defaultValue !== undefined\n ? node.defaultValue\n : node.options?.defaultValue;\n if (defaultValue !== undefined && !isNil(defaultValue) && node.path) {\n // Check if path exists in context using lodash get equivalent check\n const currentValue = getNestedValue(result, node.path);\n if (currentValue === undefined) {\n // Clone the defaultValue to avoid reference issues (especially for Date objects)\n const clonedValue = defaultValue instanceof Date\n ? new Date(defaultValue.getTime())\n : cloneDeep(defaultValue);\n set(result, node.path, clonedValue);\n }\n }\n // Recursively process children - pass result object to accumulate values in place\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n collectDefaultValues(child, result, false);\n }\n }\n return result;\n}\n/**\n * Gets a nested value from an object using dot notation path\n */\nfunction getNestedValue(obj, path) {\n const keys = path.split('.');\n let current = obj;\n for (const key of keys) {\n if (current === undefined || current === null || typeof current !== 'object') {\n return undefined;\n }\n current = current[key];\n }\n return current;\n}\n//#endregion\n//#region ---- Service Implementation ----\nexport class AXPLayoutBuilderService {\n constructor() {\n this.popupService = inject(AXPopupService);\n }\n /**\n * Create a new layout builder\n */\n create() {\n return new LayoutBuilder(this.popupService);\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutBuilderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutBuilderService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutBuilderService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//#endregion\n//#region ---- Layout Builder Implementation ----\n/**\n * Main layout builder - Single Responsibility: Layout orchestration\n * Open/Closed: Extensible through container delegates\n */\nclass LayoutBuilder {\n constructor(popupService) {\n this.popupService = popupService;\n this.root = {\n children: [],\n mode: 'edit',\n type: 'flex-layout',\n };\n this.inheritanceContext = {\n mode: 'edit',\n };\n }\n // Predefined layout containers at root level - delegate pattern required\n grid(delegate) {\n const container = new GridContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n //this.state.children!.push(container.build());\n this.root = container.build();\n return this;\n }\n flex(delegate) {\n const container = new FlexContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children.push(container.build());\n return this;\n }\n panel(delegate) {\n const container = new PanelContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children.push(container.build());\n return this;\n }\n page(delegate) {\n const container = new PageContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children.push(container.build());\n return this;\n }\n tabset(delegate) {\n const container = new TabsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children.push(container.build());\n return this;\n }\n fieldset(delegate) {\n const container = new FieldsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children.push(container.build());\n return this;\n }\n dialog(delegate) {\n if (!this.popupService) {\n throw new Error('LayoutBuilder requires AXPopupService to create dialogs. Please inject it in the service constructor.');\n }\n const container = new DialogContainerBuilder(this.popupService);\n if (delegate) {\n delegate(container);\n }\n return container;\n }\n stepWizard(delegate) {\n const wizard = new StepWizardBuilder();\n wizard.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(wizard);\n }\n this.root.children.push(wizard.build());\n return this;\n }\n formField(label, delegate) {\n const field = new FormFieldBuilder(label);\n field.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(field);\n }\n this.root.children.push(field.build());\n return this;\n }\n build() {\n return {\n type: this.root.type,\n children: this.root.children,\n mode: this.root.mode,\n };\n }\n /**\n * Converts the built widget node to JSON string\n * @param options - Serialization options\n * @returns JSON string representation of the widget node\n */\n toJson(options) {\n const node = this.build();\n return AXPWidgetSerializationHelper.toJson(node, options);\n }\n}\n//#endregion\n//#region ---- Container Builder Implementation ----\n/**\n * Abstract base container builder - Open/Closed Principle\n * Provides common functionality for all container types\n */\nclass BaseContainerBuilder {\n constructor(containerType) {\n this.containerState = {\n mode: 'edit',\n type: 'flex-layout',\n children: [],\n };\n this.inheritanceContext = {};\n this.containerState.type = containerType;\n }\n // Base methods shared by all containers\n ensureChildren() {\n this.containerState.children = this.containerState.children || [];\n }\n addWidget(type, options) {\n const child = new WidgetBuilder();\n child.type(type);\n // For value widgets, ensure path is provided\n const widgetOptions = options ?? {};\n const path = widgetOptions.path;\n const name = widgetOptions.name;\n if (this.isValueWidget(type) && !path) {\n throw new Error(`Value widget '${type}' requires a 'path' property`);\n }\n // Set name and path in widget state, not options\n if (name) {\n child.name(name);\n }\n if (path) {\n child.path(path);\n }\n // Remove name and path from options\n const { name: _, path: __, ...cleanOptions } = widgetOptions;\n // IMPORTANT: Apply inheritance context BEFORE setting options\n // This ensures that inherited properties (readonly, disabled, etc.) are applied first\n // Then user-provided options will override them if explicitly set\n child.withInheritanceContext(this.inheritanceContext);\n child.options(cleanOptions);\n this.ensureChildren();\n this.containerState.children.push(child.build());\n return this;\n }\n isValueWidget(type) {\n const valueWidgetTypes = [\n 'text-editor',\n 'large-text-editor',\n 'rich-text-editor',\n 'password-editor',\n 'number-editor',\n 'select-editor',\n 'lookup-editor',\n 'selection-list-editor',\n 'date-time-editor',\n 'toggle-editor',\n 'color-editor',\n ];\n return valueWidgetTypes.includes(type);\n }\n build() {\n const result = {\n type: this.containerState.type,\n children: this.containerState.children,\n options: this.containerState.options,\n mode: this.containerState.mode,\n visible: this.containerState.visible,\n };\n // Add name with _form_field suffix for form fields\n if (this.containerState.type === 'form-field') {\n if (this.containerState.name) {\n result.name = this.containerState.name;\n }\n else if (this.containerState.options?.['label']) {\n result.name = labelToPath(this.containerState.options['label']) + '_form_field';\n }\n // Form fields don't have path\n }\n else {\n // Other containers can have name and path\n if (this.containerState.name) {\n result.name = this.containerState.name;\n }\n if (this.containerState.path) {\n result.path = this.containerState.path;\n }\n if (this.containerState.defaultValue !== undefined) {\n result.defaultValue = this.containerState.defaultValue;\n }\n }\n return result;\n }\n}\n/**\n * Base container builder mixin - Interface Segregation Principle\n * Provides common container operations\n */\nclass BaseContainerMixin extends BaseContainerBuilder {\n name(name) {\n this.containerState.name = name;\n return this;\n }\n path(path) {\n this.containerState.path = path;\n return this;\n }\n mode(mode) {\n this.containerState.mode = mode;\n this.inheritanceContext.mode = mode;\n return this;\n }\n visible(condition) {\n if (!this.containerState.options)\n this.containerState.options = {};\n this.containerState.options['visible'] = condition;\n this.inheritanceContext.visible = condition;\n return this;\n }\n disabled(condition) {\n if (!this.containerState.options)\n this.containerState.options = {};\n this.containerState.options['disabled'] = condition;\n this.inheritanceContext.disabled = condition;\n return this;\n }\n readonly(condition) {\n if (!this.containerState.options)\n this.containerState.options = {};\n this.containerState.options['readonly'] = condition;\n this.inheritanceContext.readonly = condition;\n return this;\n }\n direction(direction) {\n if (!this.containerState.options)\n this.containerState.options = {};\n this.containerState.options['direction'] = direction;\n this.inheritanceContext.direction = direction;\n return this;\n }\n // Inheritance context methods\n withInheritanceContext(context) {\n this.inheritanceContext = mergeInheritanceContext(context);\n return this;\n }\n getInheritanceContext() {\n return { ...this.inheritanceContext };\n }\n}\n/**\n * Layout container mixin - Interface Segregation Principle\n * Provides layout-specific operations\n */\nclass LayoutContainerMixin extends BaseContainerMixin {\n layout(value) {\n // Map layout intent to grid item sizing so containers like `form-field`\n // can span multiple columns inside grid/fieldset layouts.\n if (!this.containerState.options)\n this.containerState.options = {};\n if (typeof value === 'number') {\n // Direct numeric shorthand → colSpan\n this.containerState.options.colSpan = value;\n }\n else if (value) {\n // Try to extract a reasonable colSpan from breakpoint positions\n const positions = value.positions;\n if (positions) {\n const colSpan = positions?.lg?.colSpan ??\n positions?.xl?.colSpan ??\n positions?.xxl?.colSpan ??\n positions?.md?.colSpan ??\n positions?.sm?.colSpan;\n if (colSpan != null) {\n this.containerState.options.colSpan = colSpan;\n }\n }\n }\n return this;\n }\n}\n/**\n * Child container mixin - Interface Segregation Principle\n * Provides child container management\n */\nclass ChildContainerMixin extends LayoutContainerMixin {\n grid(delegate) {\n const container = new GridContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children.push(container.build());\n return this;\n }\n flex(delegate) {\n const container = new FlexContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children.push(container.build());\n return this;\n }\n panel(delegate) {\n const container = new PanelContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children.push(container.build());\n return this;\n }\n page(delegate) {\n const container = new PageContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children.push(container.build());\n return this;\n }\n tabset(delegate) {\n const container = new TabsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children.push(container.build());\n return this;\n }\n fieldset(delegate) {\n const container = new FieldsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children.push(container.build());\n return this;\n }\n dialog(delegate) {\n const container = new DialogContainerBuilder(); // Will use inject() fallback\n if (delegate) {\n delegate(container);\n }\n return container;\n }\n stepWizard(delegate) {\n const wizard = new StepWizardBuilder();\n wizard.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(wizard);\n }\n this.ensureChildren();\n this.containerState.children.push(wizard.build());\n return this;\n }\n formField(label, delegate) {\n const field = new FormFieldBuilder(label);\n field.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(field);\n }\n this.ensureChildren();\n this.containerState.children.push(field.build());\n return this;\n }\n dynamicForm(definition) {\n // Get conversion service using inject() - works in any context in Angular 14+\n let conversionService;\n try {\n conversionService = inject(AXPLayoutConversionService);\n }\n catch {\n // Fallback: create service instance if inject() fails (shouldn't happen in normal usage)\n conversionService = new AXPLayoutConversionService();\n }\n // Convert form definition to widget node\n const widgetNode = conversionService.convertFormDefinition(definition);\n // Add the widget node's children to this container\n // The converted widget node has a root grid-layout, we want its children (fieldsets)\n if (widgetNode.children && widgetNode.children.length > 0) {\n this.ensureChildren();\n this.containerState.children.push(...widgetNode.children);\n }\n return this;\n }\n}\n/**\n * Widget container mixin - Interface Segregation Principle\n * Provides widget creation operations\n */\nclass WidgetContainerMixin extends ChildContainerMixin {\n textBox(options) {\n this.addWidget('text-editor', options);\n return this;\n }\n largeTextBox(options) {\n this.addWidget('large-text-editor', options);\n return this;\n }\n richText(options) {\n this.addWidget('rich-text-editor', options);\n return this;\n }\n passwordBox(options) {\n this.addWidget('password-editor', options);\n return this;\n }\n numberBox(options) {\n this.addWidget('number-editor', options);\n return this;\n }\n selectBox(options) {\n this.addWidget('select-editor', options);\n return this;\n }\n lookupBox(options) {\n this.addWidget('lookup-editor', options);\n return this;\n }\n selectionList(options) {\n this.addWidget('selection-list-editor', options);\n return this;\n }\n dateTimeBox(options) {\n this.addWidget('date-time-editor', options);\n return this;\n }\n toggleSwitch(options) {\n this.addWidget('toggle-editor', options);\n return this;\n }\n colorBox(options) {\n this.addWidget('color-editor', options);\n return this;\n }\n list(delegate) {\n const container = new ListWidgetBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children.push(container.build());\n return this;\n }\n customWidget(type, optionsOrDelegate, delegate) {\n const child = new WidgetBuilder();\n child.type(type);\n // Determine if second parameter is delegate or options\n const isDelegate = typeof optionsOrDelegate === 'function';\n const options = isDelegate ? undefined : optionsOrDelegate;\n const actualDelegate = isDelegate ? optionsOrDelegate : delegate;\n // Apply inheritance context BEFORE setting options or calling delegate\n child.withInheritanceContext(this.inheritanceContext);\n // If options are provided (non-delegate overload), handle them\n if (!isDelegate && options !== undefined) {\n const widgetOptions = options;\n const path = widgetOptions.path;\n const name = widgetOptions.name;\n // Set name and path in widget state, not options\n if (name) {\n child.name(name);\n }\n if (path) {\n child.path(path);\n }\n // Remove name and path from options\n const { name: _, path: __, ...cleanOptions } = widgetOptions;\n child.options(cleanOptions);\n }\n // If delegate is provided, call it to allow setting path, options, and other control methods\n if (actualDelegate) {\n actualDelegate(child);\n }\n // Build the widget to check if path is set (for value widgets)\n const builtWidget = child.build();\n // Check if value widget requires path\n const valueWidgetTypes = [\n 'text-editor',\n 'large-text-editor',\n 'rich-text-editor',\n 'password-editor',\n 'number-editor',\n 'select-editor',\n 'lookup-editor',\n 'selection-list-editor',\n 'date-time-editor',\n 'toggle-editor',\n 'color-editor',\n ];\n if (valueWidgetTypes.includes(type) && !builtWidget.path) {\n throw new Error(`Value widget '${type}' requires a 'path' property`);\n }\n this.ensureChildren();\n this.containerState.children.push(builtWidget);\n return this;\n }\n}\n/**\n * Flex Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass FlexContainerBuilder extends WidgetContainerMixin {\n constructor() {\n super('flex-layout');\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n // Individual fluent methods for Flex\n setDirection(direction) {\n return this.setOptions({ flexDirection: direction });\n }\n setWrap(wrap) {\n return this.setOptions({ flexWrap: wrap });\n }\n setJustifyContent(justify) {\n return this.setOptions({ justifyContent: justify });\n }\n setAlignItems(align) {\n return this.setOptions({ alignItems: align });\n }\n setGap(gap) {\n return this.setOptions({ gap });\n }\n setBackgroundColor(color) {\n return this.setOptions({ backgroundColor: color });\n }\n setPadding(padding) {\n return this.setOptions({ spacing: { padding } });\n }\n setMargin(margin) {\n return this.setOptions({ spacing: { margin } });\n }\n}\n/**\n * Grid Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass GridContainerBuilder extends WidgetContainerMixin {\n constructor() {\n super('grid-layout');\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n // Individual fluent methods for Grid\n setColumns(columns) {\n return this.setOptions({ grid: { default: { columns } } });\n }\n setRows(rows) {\n return this.setOptions({ grid: { default: { rows } } });\n }\n setGap(gap) {\n return this.setOptions({ grid: { default: { gap } } });\n }\n setJustifyItems(justify) {\n return this.setOptions({ grid: { default: { justifyItems: justify } } });\n }\n setAlignItems(align) {\n return this.setOptions({ grid: { default: { alignItems: align } } });\n }\n setAutoFlow(flow) {\n return this.setOptions({ grid: { default: { autoFlow: flow } } });\n }\n setBackgroundColor(color) {\n return this.setOptions({ backgroundColor: color });\n }\n setPadding(padding) {\n return this.setOptions({ spacing: { padding } });\n }\n setMargin(margin) {\n return this.setOptions({ spacing: { margin } });\n }\n}\n/**\n * Panel Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass PanelContainerBuilder extends WidgetContainerMixin {\n constructor() {\n super('panel-layout');\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n // Individual fluent methods for Panel\n setCaption(caption) {\n return this.setOptions({ caption });\n }\n setIcon(icon) {\n return this.setOptions({ icon });\n }\n setLook(look) {\n return this.setOptions({ look });\n }\n setShowHeader(show) {\n return this.setOptions({ showHeader: show });\n }\n setCollapsed(collapsed) {\n return this.setOptions({ collapsed });\n }\n}\n/**\n * Page Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass PageContainerBuilder extends WidgetContainerMixin {\n constructor() {\n super('page-layout');\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n // Individual fluent methods for Page\n setBackgroundColor(color) {\n return this.setOptions({ backgroundColor: color });\n }\n setTheme(theme) {\n return this.setOptions({ theme });\n }\n setHasHeader(hasHeader) {\n return this.setOptions({ hasHeader });\n }\n setHasFooter(hasFooter) {\n return this.setOptions({ hasFooter });\n }\n setDirection(direction) {\n return this.setOptions({ direction });\n }\n}\n/**\n * Tabset Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass TabsetContainerBuilder extends WidgetContainerMixin {\n constructor() {\n super('tabset-layout');\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n // Individual fluent methods for Tabset\n setLook(look) {\n return this.setOptions({ look });\n }\n setOrientation(orientation) {\n return this.setOptions({ orientation });\n }\n setActiveIndex(index) {\n return this.setOptions({ activeIndex: index });\n }\n}\n/**\n * Form Field Builder - Liskov Substitution Principle\n * Can only contain ONE widget with automatic path generation\n */\nclass FormFieldBuilder extends LayoutContainerMixin {\n constructor(label) {\n super('form-field');\n this.hasWidget = false;\n this.containerState.options = { label, showLabel: true };\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n setLabel(label) {\n return this.setOptions({ label });\n }\n setShowLabel(showLabel) {\n return this.setOptions({ showLabel });\n }\n defaultValue(value) {\n this.containerState.defaultValue = value;\n this.inheritanceContext.defaultValue = value;\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n // Single widget methods with automatic path generation\n addSingleWidget(type, options) {\n if (this.hasWidget) {\n throw new Error('Form field can only contain one widget');\n }\n const formFieldName = this.containerState.name;\n const formFieldPath = this.containerState.path; // Get explicit path from form field\n const formFieldLabel = this.containerState.options?.['label'];\n const widgetName = options?.name;\n // Generate widget path: explicit path -> widget name -> form field name -> label -> random\n let widgetPath;\n if (formFieldPath) {\n widgetPath = formFieldPath; // Use explicit form field path first\n }\n else if (widgetName) {\n widgetPath = widgetName;\n }\n else if (formFieldName) {\n widgetPath = formFieldName; // Use form field name as default path\n }\n else if (formFieldLabel) {\n widgetPath = labelToPath(formFieldLabel);\n }\n else {\n widgetPath = generateRandomId();\n }\n const finalName = widgetName || formFieldName || widgetPath;\n const child = new WidgetBuilder();\n child.type(type);\n child.name(finalName);\n child.path(widgetPath);\n // Remove name from options since it's now in state\n const { name: _, ...cleanOptions } = (options || {});\n child.withInheritanceContext(this.inheritanceContext);\n child.options(cleanOptions);\n // IMPORTANT: Store the widget builder, don't build it yet!\n // This allows properties set after this method (like disabled, readonly) to be applied\n this.childWidget = child;\n this.hasWidget = true;\n return this;\n }\n textBox(options) {\n return this.addSingleWidget('text-editor', options);\n }\n largeTextBox(options) {\n return this.addSingleWidget('large-text-editor', options);\n }\n richText(options) {\n return this.addSingleWidget('rich-text-editor', options);\n }\n passwordBox(options) {\n return this.addSingleWidget('password-editor', options);\n }\n numberBox(options) {\n return this.addSingleWidget('number-editor', options);\n }\n selectBox(options) {\n return this.addSingleWidget('select-editor', options);\n }\n lookupBox(options) {\n return this.addSingleWidget('lookup-editor', options);\n }\n selectionList(options) {\n return this.addSingleWidget('selection-list-editor', options);\n }\n dateTimeBox(options) {\n return this.addSingleWidget('date-time-editor', options);\n }\n toggleSwitch(options) {\n return this.addSingleWidget('toggle-editor', options);\n }\n colorBox(options) {\n return this.addSingleWidget('color-editor', options);\n }\n customWidget(type, options) {\n return this.addSingleWidget(type, options);\n }\n // Override property setters to propagate changes to child widget\n disabled(condition) {\n super.disabled(condition);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n readonly(condition) {\n super.readonly(condition);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n visible(condition) {\n super.visible(condition);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n direction(direction) {\n super.direction(direction);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n mode(mode) {\n super.mode(mode);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n // Override withInheritanceContext to pass it to the child widget if it exists\n withInheritanceContext(context) {\n // Call parent implementation first\n super.withInheritanceContext(context);\n // If we have a child widget, update its inheritance context too\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n // Override build() to build the child widget at the last moment\n build() {\n // Build the child widget and add it to children before building the form field\n if (this.childWidget) {\n this.ensureChildren();\n this.containerState.children.push(this.childWidget.build());\n }\n // Call parent build\n return super.build();\n }\n}\n/**\n * Fieldset Container Builder - Liskov Substitution Principle\n * Extends LayoutContainerMixin to inherit layout functionality\n * Specialized for form fields only\n */\nclass FieldsetContainerBuilder extends LayoutContainerMixin {\n constructor() {\n super('fieldset-layout');\n this.containerState.options = {};\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n // Individual fluent methods for Fieldset\n setTitle(title) {\n return this.setOptions({ title });\n }\n setDescription(description) {\n return this.setOptions({ description });\n }\n setIcon(icon) {\n return this.setOptions({ icon });\n }\n setCollapsible(collapsible) {\n return this.setOptions({ collapsible });\n }\n setIsOpen(isOpen) {\n return this.setOptions({ isOpen });\n }\n setLook(look) {\n return this.setOptions({ look });\n }\n setShowHeader(showHeader) {\n return this.setOptions({ showHeader });\n }\n setCols(cols) {\n return this.setOptions({ cols });\n }\n // Only form fields are allowed in fieldset\n formField(label, delegate) {\n const field = new FormFieldBuilder(label);\n field.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(field);\n }\n this.ensureChildren();\n this.containerState.children.push(field.build());\n return this;\n }\n}\n/**\n * List Widget Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass ListWidgetBuilder extends WidgetContainerMixin {\n constructor() {\n super('data-list');\n }\n setOptions(options) {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n // Individual fluent methods for List Widget\n setDataSource(dataSource) {\n return this.setOptions({ dataSource });\n }\n setColumns(columns) {\n return this.setOptions({ columns });\n }\n // Event handlers\n setOnRowClick(handler) {\n return this.setOptions({ onRowClick: handler });\n }\n setOnRowDoubleClick(handler) {\n return this.setOptions({ onRowDoubleClick: handler });\n }\n setOnSelectionChange(handler) {\n return this.setOptions({ onSelectionChange: handler });\n }\n setOnRowCommand(handler) {\n return this.setOptions({ onRowCommand: handler });\n }\n // Table features\n setPaging(paging) {\n return this.setOptions({ paging });\n }\n setShowHeader(show) {\n return this.setOptions({ showHeader: show });\n }\n setShowFooter(show) {\n return this.setOptions({ showFooter: show });\n }\n setFixHeader(fix) {\n return this.setOptions({ fixHeader: fix });\n }\n setFixFooter(fix) {\n return this.setOptions({ fixFooter: fix });\n }\n setFetchDataMode(mode) {\n return this.setOptions({ fetchDataMode: mode });\n }\n setParentField(field) {\n return this.setOptions({ parentField: field });\n }\n setMinHeight(height) {\n return this.setOptions({ minHeight: height });\n }\n // Selection & Index\n setShowIndex(show) {\n return this.setOptions({ showIndex: show });\n }\n setAllowSelection(allow) {\n return this.setOptions({ allowSelection: allow });\n }\n // Commands\n setPrimaryCommands(commands) {\n return this.setOptions({ primaryCommands: commands });\n }\n setSecondaryCommands(commands) {\n return this.setOptions({ secondaryCommands: commands });\n }\n // Loading\n setLoading(loading) {\n return this.setOptions({ loading });\n }\n}\n/**\n * Dialog Container Builder - Specialized for dialog functionality\n * Uses composition instead of inheritance for cleaner separation\n */\nclass DialogContainerBuilder {\n constructor(popupService) {\n this.dialogState = {\n type: 'flex-layout', // This will be overridden when content layout exists\n children: [],\n mode: 'edit',\n dialogOptions: {\n title: '',\n size: 'md',\n closeButton: false,\n },\n actions: {\n footer: {\n prefix: [],\n suffix: [],\n },\n },\n };\n if (popupService) {\n this.popupService = popupService;\n }\n else {\n this.popupService = inject(AXPopupService);\n }\n }\n setOptions(options) {\n this.dialogState.dialogOptions = { ...this.dialogState.dialogOptions, ...options };\n return this;\n }\n // Individual fluent methods for Dialog\n setTitle(title) {\n return this.setOptions({ title });\n }\n setMessage(message) {\n return this.setOptions({ message });\n }\n setSize(size) {\n return this.setOptions({ size });\n }\n setCloseButton(closeButton) {\n return this.setOptions({ closeButton });\n }\n setContext(context) {\n return this.setOptions({ context });\n }\n content(delegate) {\n if (delegate) {\n // Create a flex container directly instead of through LayoutBuilder\n const flexContainer = new FlexContainerBuilder();\n flexContainer.setDirection('column');\n flexContainer.setGap('10px');\n delegate(flexContainer);\n this.contentLayout = flexContainer.build();\n }\n return this;\n }\n setActions(delegate) {\n if (delegate) {\n const actionBuilder = new ActionBuilder(this);\n delegate(actionBuilder);\n }\n return this;\n }\n addCustomAction(action) {\n // Add to actions based on position\n const position = action.position || 'suffix';\n if (position === 'prefix') {\n if (!this.dialogState.actions.footer.prefix) {\n this.dialogState.actions.footer.prefix = [];\n }\n this.dialogState.actions.footer.prefix.push(action);\n }\n else {\n if (!this.dialogState.actions.footer.suffix) {\n this.dialogState.actions.footer.suffix = [];\n }\n this.dialogState.actions.footer.suffix.push(action);\n }\n return this;\n }\n // Build method to create dialog node\n build() {\n // If we have content layout, use it directly to avoid extra wrapper\n if (this.contentLayout) {\n return {\n ...this.contentLayout,\n // Add dialog-specific properties\n options: {\n ...this.contentLayout.options,\n ...this.dialogState.dialogOptions,\n },\n };\n }\n // Fallback to dialog state structure if no content\n const result = {\n ...this.dialogState,\n children: [],\n };\n // Add dialog-specific properties\n if (this.dialogState.dialogOptions) {\n result.options = { ...result.options, ...this.dialogState.dialogOptions };\n }\n return result;\n }\n // Dialog-specific methods\n async show() {\n const dialogNode = this.build();\n // Import the dialog renderer component dynamically\n const { AXPDialogRendererComponent } = await import('./dialog-renderer.component');\n // Collect default values from widget tree and merge into initial context\n const initialContext = this.dialogState.dialogOptions?.context || {};\n const contextWithDefaults = collectDefaultValues(dialogNode, initialContext);\n // Create dialog configuration\n const dialogConfig = {\n title: this.dialogState.dialogOptions?.title || '',\n message: this.dialogState.dialogOptions?.message,\n context: contextWithDefaults,\n definition: dialogNode,\n actions: this.dialogState.actions,\n };\n // The Promise resolves when user clicks an action button\n return new Promise(async (resolve) => {\n this.popupService.open(AXPDialogRendererComponent, {\n title: dialogConfig.title,\n size: this.dialogState.dialogOptions?.size || 'md',\n closeButton: this.dialogState.dialogOptions?.closeButton || false,\n closeOnBackdropClick: false,\n draggable: false,\n data: {\n config: dialogConfig,\n callBack: (result) => {\n // Resolve with the dialog reference when user clicks an action\n resolve(result);\n },\n },\n });\n });\n }\n}\n//#endregion\n//#region ---- Widget Builder Implementation ----\n/**\n * Widget Builder - Single Responsibility Principle\n * Handles individual widget configuration and building\n */\nclass WidgetBuilder {\n constructor(name) {\n this.widgetState = {\n type: 'widget',\n options: {},\n };\n this.inheritanceContext = {};\n if (name) {\n this.widgetState.name = name;\n }\n }\n type(type) {\n this.widgetState.type = type;\n return this;\n }\n name(name) {\n this.widgetState.name = name;\n if (!this.widgetState.path) {\n this.widgetState.path = name;\n }\n return this;\n }\n path(path) {\n this.widgetState.path = path;\n return this;\n }\n options(options) {\n // Extract defaultValue from options - it's an exceptional parameter that updates context, not a widget option\n if (options && options.defaultValue !== undefined) {\n this.widgetState.defaultValue = options.defaultValue;\n // Remove defaultValue from options since it's stored on the node, not in options\n const { defaultValue: _, ...cleanOptions } = options;\n // Merge clean options instead of replacing to preserve inherited properties\n this.widgetState.options = { ...this.widgetState.options, ...cleanOptions };\n }\n else {\n // Merge options instead of replacing to preserve inherited properties\n this.widgetState.options = { ...this.widgetState.options, ...options };\n }\n return this;\n }\n layout(value) {\n if (typeof value === 'number') {\n this.widgetState.layout = {\n positions: {\n sm: { colSpan: 12 },\n md: { colSpan: 12 },\n lg: { colSpan: value },\n xl: { colSpan: value },\n xxl: { colSpan: value },\n },\n };\n }\n else {\n this.widgetState.layout = value;\n }\n return this;\n }\n mode(mode) {\n this.widgetState.mode = mode;\n this.inheritanceContext.mode = mode;\n return this;\n }\n visible(condition) {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['visible'] = condition;\n this.inheritanceContext.visible = condition;\n return this;\n }\n disabled(condition) {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['disabled'] = condition;\n this.inheritanceContext.disabled = condition;\n return this;\n }\n defaultValue(defaultValue) {\n this.widgetState.defaultValue = defaultValue;\n return this;\n }\n readonly(condition) {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['readonly'] = condition;\n this.inheritanceContext.readonly = condition;\n return this;\n }\n direction(direction) {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['direction'] = direction;\n this.inheritanceContext.direction = direction;\n return this;\n }\n // Inheritance context methods\n withInheritanceContext(context) {\n this.inheritanceContext = mergeInheritanceContext(context);\n // Apply inherited properties to widget state\n const resolved = resolveInheritedProperties(context, this.inheritanceContext);\n // Always apply inherited properties (remove the conditions that check if already set)\n // This allows properties to be updated when inheritance context changes\n if (resolved.mode) {\n this.widgetState.mode = resolved.mode;\n }\n if (!this.widgetState.options)\n this.widgetState.options = {};\n if (resolved.disabled !== undefined) {\n this.widgetState.options['disabled'] = resolved.disabled;\n }\n if (resolved.readonly !== undefined) {\n this.widgetState.options['readonly'] = resolved.readonly;\n }\n if (resolved.direction !== undefined) {\n this.widgetState.options['direction'] = resolved.direction;\n }\n if (resolved.visible !== undefined) {\n this.widgetState.options['visible'] = resolved.visible;\n }\n if (context.defaultValue !== undefined) {\n this.widgetState.defaultValue = context.defaultValue;\n }\n return this;\n }\n getInheritanceContext() {\n return { ...this.inheritanceContext };\n }\n build() {\n return {\n name: this.widgetState.name,\n type: this.widgetState.type,\n options: this.widgetState.options,\n mode: this.widgetState.mode,\n path: this.widgetState.path,\n defaultValue: this.widgetState.defaultValue,\n };\n }\n}\n//#region ---- Action Builder Implementation ----\nclass ActionBuilder {\n constructor(dialogBuilder) {\n this.dialogBuilder = dialogBuilder;\n }\n cancel(text) {\n if (!this.dialogBuilder['dialogState'].actions.footer.suffix) {\n this.dialogBuilder['dialogState'].actions.footer.suffix = [];\n }\n this.dialogBuilder['dialogState'].actions.footer.suffix.push({\n title: text || '@general:actions.cancel.title',\n icon: 'fa-times',\n color: 'default',\n command: { name: 'cancel' },\n });\n return this;\n }\n submit(text) {\n if (!this.dialogBuilder['dialogState'].actions.footer.suffix) {\n this.dialogBuilder['dialogState'].actions.footer.suffix = [];\n }\n this.dialogBuilder['dialogState'].actions.footer.suffix.push({\n title: text || '@general:actions.submit.title',\n icon: 'fa-check',\n color: 'primary',\n command: { name: 'submit', options: { validate: true } },\n });\n return this;\n }\n custom(action) {\n if (!this.dialogBuilder['dialogState'].actions.footer.suffix) {\n this.dialogBuilder['dialogState'].actions.footer.suffix = [];\n }\n this.dialogBuilder['dialogState'].actions.footer.suffix.push(action);\n return this;\n }\n}\n//#endregion\n//#region ---- Step Wizard Builder Implementation ----\n/**\n * Step Builder - Builds individual steps for step wizard\n */\nclass StepBuilder {\n constructor(id, title) {\n this.id = id;\n this.title = title;\n this.skippable = false;\n this.inheritanceContext = {};\n }\n setIcon(icon) {\n this.icon = icon;\n return this;\n }\n setDescription(description) {\n this.description = description;\n return this;\n }\n setSkippable(skippable) {\n this.skippable = skippable;\n return this;\n }\n content(delegate) {\n if (delegate) {\n // Create LayoutBuilder in injection context (will be called from component)\n const layoutBuilder = new LayoutBuilder();\n // ✅ IMPORTANT: Propagate inheritance context to content\n layoutBuilder.inheritanceContext = { ...this.inheritanceContext };\n delegate(layoutBuilder);\n this.contentNode = layoutBuilder.build();\n }\n return this;\n }\n withInheritanceContext(context) {\n this.inheritanceContext = mergeInheritanceContext(context);\n return this;\n }\n build() {\n if (!this.contentNode) {\n throw new Error(`Step '${this.id}' must have content`);\n }\n return {\n id: this.id,\n title: this.title,\n icon: this.icon,\n description: this.description,\n skippable: this.skippable,\n content: this.contentNode,\n };\n }\n}\n/**\n * Step Wizard Builder - Builds step wizard widget\n */\nclass StepWizardBuilder extends LayoutContainerMixin {\n constructor() {\n super('step-wizard');\n this.steps = [];\n this.linear = true;\n this.wizardDirection = 'horizontal';\n }\n setLinear(linear) {\n this.linear = linear;\n return this;\n }\n setDirection(direction) {\n this.wizardDirection = direction;\n return this;\n }\n setLook(look) {\n this.look = look;\n return this;\n }\n setShowActions(show) {\n this.showActions = show;\n return this;\n }\n setActions(actions) {\n this.wizardActions = actions;\n return this;\n }\n setGuards(guards) {\n this.guards = guards;\n return this;\n }\n setEvents(events) {\n this.events = events;\n return this;\n }\n step(id, title, delegate) {\n const stepBuilder = new StepBuilder(id, title);\n // ✅ IMPORTANT: Propagate inheritance context to step\n stepBuilder.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(stepBuilder);\n }\n this.steps.push(stepBuilder.build());\n return this;\n }\n build() {\n // ✅ Validation\n if (this.steps.length === 0) {\n throw new Error('StepWizard must have at least one step');\n }\n // ✅ Check duplicate IDs\n const ids = this.steps.map((s) => s.id);\n const duplicates = ids.filter((id, index) => ids.indexOf(id) !== index);\n if (duplicates.length > 0) {\n throw new Error(`Duplicate step IDs found: ${duplicates.join(', ')}`);\n }\n const definition = {\n steps: this.steps,\n linear: this.linear,\n direction: this.wizardDirection,\n look: this.look,\n // Do not auto-detect based on dialog context; keep explicit or undefined\n showActions: this.showActions,\n actions: this.wizardActions,\n guards: this.guards,\n events: this.events,\n };\n const node = {\n name: this.containerState.name,\n type: 'step-wizard',\n options: { definition },\n mode: this.containerState.mode,\n };\n return node;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2J1aWxkZXIvc3JjL2xpYi9sYXlvdXQtYnVpbGRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUcxRCxPQUFPLEVBR0wsNEJBQTRCLEdBQzdCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBa0RsRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFekUsNkNBQTZDO0FBRTdDOztHQUVHO0FBQ0gsU0FBUywwQkFBMEIsQ0FDakMsT0FBMkIsRUFDM0IsY0FBMkMsRUFBRTtJQUU3QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNO1FBQ2hELFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRO1FBQ2xELFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRO1FBQ2xELFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTO1FBQ3JELE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPO0tBQ2hELENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLHVCQUF1QixDQUM5QixhQUFpQyxFQUNqQyxpQkFBOEMsRUFBRTtJQUVoRCxPQUFPO1FBQ0wsR0FBRyxhQUFhO1FBQ2hCLEdBQUcsY0FBYztL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Q0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQTRCO1lBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQy9CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLHlFQUF5RTtZQUN6RSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFrQjtZQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJO1lBQzlCLElBQUksRUFBRSxhQUFhO1lBQ25CLE9BQU8sRUFBRSxFQUFFLFVBQVUsRUFBRTtZQUN2QixJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJO1NBQy9CLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYUG9wdXBTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3BvcHVwJztcbmltcG9ydCB7IEFYUEFjdGlvbk1lbnVJdGVtLCBBWFBHcmlkTGF5b3V0T3B0aW9ucyB9IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vY29yZSc7XG5cbmltcG9ydCB7XG4gIEFYUFdpZGdldE5vZGUsXG4gIEFYUFdpZGdldFJlbmRlck1vZGUsXG4gIEFYUFdpZGdldFNlcmlhbGl6YXRpb25IZWxwZXIsXG59IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vbGF5b3V0L3dpZGdldC1jb3JlJztcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2V0LCBpc05pbCwgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEFYUERpYWxvZ0NvbnRhaW5lck9wdGlvbnMsXG4gIEFYUERpYWxvZ1JlZixcbiAgQVhQRHluYW1pY0Zvcm1EZWZpbml0aW9uLFxuICBBWFBGaWVsZHNldENvbnRhaW5lck9wdGlvbnMsXG4gIEFYUEZsZXhDb250YWluZXJPcHRpb25zLFxuICBBWFBGb3JtRmllbGRPcHRpb25zLFxuICAvLyBDb250YWluZXIgb3B0aW9uc1xuICBBWFBHcmlkQ29udGFpbmVyT3B0aW9ucyxcbiAgQVhQTGlzdFdpZGdldE9wdGlvbnMsXG4gIEFYUFBhZ2VDb250YWluZXJPcHRpb25zLFxuICBBWFBQYW5lbENvbnRhaW5lck9wdGlvbnMsXG4gIEFYUFN0ZXBEZWZpbml0aW9uLFxuICBBWFBTdGVwV2l6YXJkRGVmaW5pdGlvbixcbiAgQVhQU3RlcFdpemFyZEd1YXJkUGF5bG9hZCxcbiAgQVhQU3RlcFdpemFyZFN0YXR1cyxcbiAgQVhQVGFic2V0Q29udGFpbmVyT3B0aW9ucyxcbiAgQVhQV2l6YXJkQWN0aW9ucyxcbiAgQ29sb3JCb3hPcHRpb25zLFxuICBEYXRlVGltZUJveE9wdGlvbnMsXG4gIERpYWxvZ0J1aWxkZXJTdGF0ZSxcbiAgSUFjdGlvbkJ1aWxkZXIsXG4gIElEaWFsb2dCdWlsZGVyLFxuICBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyLFxuICBJRmxleENvbnRhaW5lckJ1aWxkZXIsXG4gIElGb3JtRmllbGRCdWlsZGVyLFxuICBJR3JpZENvbnRhaW5lckJ1aWxkZXIsXG4gIElMYXlvdXRCdWlsZGVyLFxuICBJTGlzdFdpZGdldEJ1aWxkZXIsXG4gIElQYWdlQ29udGFpbmVyQnVpbGRlcixcbiAgSVBhbmVsQ29udGFpbmVyQnVpbGRlcixcbiAgSVN0ZXBXaXphcmRCdWlsZGVyLFxuICBJVGFic2V0Q29udGFpbmVyQnVpbGRlcixcbiAgSVdpZGdldEJ1aWxkZXIsXG4gIC8vIEluaGVyaXRhbmNlIGNvbnRleHRcbiAgSW5oZXJpdGFuY2VDb250ZXh0LFxuICBJbmhlcml0ZWRQcm9wZXJ0aWVzLFxuICBMYXJnZVRleHRCb3hPcHRpb25zLFxuICBMYXlvdXRCdWlsZGVyU3RhdGUsXG4gIExvb2t1cEJveE9wdGlvbnMsXG4gIE51bWJlckJveE9wdGlvbnMsXG4gIFBhc3N3b3JkQm94T3B0aW9ucyxcbiAgUmljaFRleHRPcHRpb25zLFxuICBTZWxlY3RCb3hPcHRpb25zLFxuICBTZWxlY3Rpb25MaXN0T3B0aW9ucyxcbiAgVGV4dEJveE9wdGlvbnMsXG4gIFRvZ2dsZVN3aXRjaE9wdGlvbnMsXG4gIFdpZGdldEJ1aWxkZXJTdGF0ZSxcbn0gZnJvbSAnLi9sYXlvdXQtYnVpbGRlci50eXBlcyc7XG5pbXBvcnQgeyBBWFBMYXlvdXRDb252ZXJzaW9uU2VydmljZSB9IGZyb20gJy4vbGF5b3V0LWNvbnZlcnNpb24uc2VydmljZSc7XG5cbi8vI3JlZ2lvbiAtLS0tICAgSW5oZXJpdGFuY2UgVXRpbGl0aWVzICAgLS0tLVxuXG4vKipcbiAqIFJlc29sdmVzIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gY29udGV4dCBhbmQgbG9jYWwgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVJbmhlcml0ZWRQcm9wZXJ0aWVzKFxuICBjb250ZXh0OiBJbmhlcml0YW5jZUNvbnRleHQsXG4gIGxvY2FsVmFsdWVzOiBQYXJ0aWFsPEluaGVyaXRhbmNlQ29udGV4dD4gPSB7fSxcbik6IEluaGVyaXRlZFByb3BlcnRpZXMge1xuICByZXR1cm4ge1xuICAgIG1vZGU6IGxvY2FsVmFsdWVzLm1vZGUgPz8gY29udGV4dC5tb2RlID8/ICdlZGl0JyxcbiAgICBkaXNhYmxlZDogbG9jYWxWYWx1ZXMuZGlzYWJsZWQgPz8gY29udGV4dC5kaXNhYmxlZCxcbiAgICByZWFkb25seTogbG9jYWxWYWx1ZXMucmVhZG9ubHkgPz8gY29udGV4dC5yZWFkb25seSxcbiAgICBkaXJlY3Rpb246IGxvY2FsVmFsdWVzLmRpcmVjdGlvbiA/PyBjb250ZXh0LmRpcmVjdGlvbixcbiAgICB2aXNpYmxlOiBsb2NhbFZhbHVlcy52aXNpYmxlID8/IGNvbnRleHQudmlzaWJsZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZXMgaW5oZXJpdGFuY2UgY29udGV4dCB3aXRoIGxvY2FsIG92ZXJyaWRlc1xuICovXG5mdW5jdGlvbiBtZXJnZUluaGVyaXRhbmNlQ29udGV4dChcbiAgcGFyZW50Q29udGV4dDogSW5oZXJpdGFuY2VDb250ZXh0LFxuICBsb2NhbE92ZXJyaWRlczogUGFydGlhbDxJbmhlcml0YW5jZUNvbnRleHQ+ID0ge30sXG4pOiBJbmhlcml0YW5jZUNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIC4uLnBhcmVudENvbnRleHQsXG4gICAgLi4ubG9jYWxPdmVycmlkZXMsXG4gIH07XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHN0cmluZyBmb3IgcGF0aC9uYW1lIGdlbmVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21JZCgpOiBzdHJpbmcge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgbGFiZWwgdG8gYSB2YWxpZCBwYXRoL25hbWVcbiAqL1xuZnVuY3Rpb24gbGFiZWxUb1BhdGgobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsYWJlbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XFxzXS9nLCAnJykgLy8gUmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgIC5yZXBsYWNlKC9cXHMrL2csICdfJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCB1bmRlcnNjb3Jlc1xuICAgIC5zdWJzdHJpbmcoMCwgNTApOyAvLyBMaW1pdCBsZW5ndGhcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgcGF0aCBmb3IgdmFsdWUgd2lkZ2V0cyBiYXNlZCBvbiBoaWVyYXJjaHlcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVWYWx1ZVdpZGdldFBhdGgod2lkZ2V0TmFtZT86IHN0cmluZywgZm9ybUZpZWxkTmFtZT86IHN0cmluZywgZm9ybUZpZWxkTGFiZWw/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQcmlvcml0eTogd2lkZ2V0IG5hbWUgLT4gZm9ybSBmaWVsZCBuYW1lIC0+IGdlbmVyYXRlZCBmcm9tIGxhYmVsIC0+IHJhbmRvbVxuICBpZiAod2lkZ2V0TmFtZSkge1xuICAgIHJldHVybiB3aWRnZXROYW1lO1xuICB9XG5cbiAgaWYgKGZvcm1GaWVsZE5hbWUpIHtcbiAgICByZXR1cm4gZm9ybUZpZWxkTmFtZTtcbiAgfVxuXG4gIGlmIChmb3JtRmllbGRMYWJlbCkge1xuICAgIHJldHVybiBsYWJlbFRvUGF0aChmb3JtRmllbGRMYWJlbCk7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYW5kb21JZCgpO1xufVxuXG4vKipcbiAqIENvbGxlY3RzIGRlZmF1bHQgdmFsdWVzIGZyb20gd2lkZ2V0IG5vZGUgdHJlZSBhbmQgbWVyZ2VzIHRoZW0gaW50byBjb250ZXh0XG4gKiBPbmx5IHNldHMgdmFsdWVzIGZvciBwYXRocyB0aGF0IGRvbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBub2RlIC0gVGhlIHdpZGdldCBub2RlIHRvIHByb2Nlc3NcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2JqZWN0IHRvIG1vZGlmeSBpbiBwbGFjZSAoY2xvbmVkIGF0IHRvcCBsZXZlbCBvbmx5KVxuICogQHBhcmFtIGlzVG9wTGV2ZWwgLSBJbnRlcm5hbCBmbGFnIHRvIHRyYWNrIGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBjYWxsXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3REZWZhdWx0VmFsdWVzKG5vZGU6IEFYUFdpZGdldE5vZGUsIGNvbnRleHQ6IGFueSA9IHt9LCBpc1RvcExldmVsOiBib29sZWFuID0gdHJ1ZSk6IGFueSB7XG4gIC8vIENsb25lIGNvbnRleHQgb25seSBhdCB0aGUgdG9wIGxldmVsLCB0aGVuIG1vZGlmeSBpbiBwbGFjZSBmb3IgcmVjdXJzaXZlIGNhbGxzXG4gIGNvbnN0IHJlc3VsdCA9IGlzVG9wTGV2ZWwgPyBjbG9uZURlZXAoY29udGV4dCkgOiBjb250ZXh0O1xuXG4gIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgYSBkZWZhdWx0VmFsdWUgYW5kIGEgcGF0aFxuICAvLyBOb3RlOiBXZSBjaGVjayBmb3IgYm90aCBub2RlLmRlZmF1bHRWYWx1ZSBhbmQgYWxzbyBsb29rIGluIG5vZGUub3B0aW9ucy5kZWZhdWx0VmFsdWUgYXMgZmFsbGJhY2tcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gbm9kZS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZFxuICAgID8gbm9kZS5kZWZhdWx0VmFsdWVcbiAgICA6IChub2RlLm9wdGlvbnMgYXMgYW55KT8uZGVmYXVsdFZhbHVlO1xuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhaXNOaWwoZGVmYXVsdFZhbHVlKSAmJiBub2RlLnBhdGgpIHtcbiAgICAvLyBDaGVjayBpZiBwYXRoIGV4aXN0cyBpbiBjb250ZXh0IHVzaW5nIGxvZGFzaCBnZXQgZXF1aXZhbGVudCBjaGVja1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldE5lc3RlZFZhbHVlKHJlc3VsdCwgbm9kZS5wYXRoKTtcbiAgICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENsb25lIHRoZSBkZWZhdWx0VmFsdWUgdG8gYXZvaWQgcmVmZXJlbmNlIGlzc3VlcyAoZXNwZWNpYWxseSBmb3IgRGF0ZSBvYmplY3RzKVxuICAgICAgY29uc3QgY2xvbmVkVmFsdWUgPSBkZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgID8gbmV3IERhdGUoZGVmYXVsdFZhbHVlLmdldFRpbWUoKSlcbiAgICAgICAgOiBjbG9uZURlZXAoZGVmYXVsdFZhbHVlKTtcbiAgICAgIHNldChyZXN1bHQsIG5vZGUucGF0aCwgY2xvbmVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgY2hpbGRyZW4gLSBwYXNzIHJlc3VsdCBvYmplY3QgdG8gYWNjdW11bGF0ZSB2YWx1ZXMgaW4gcGxhY2VcbiAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShub2RlLmNoaWxkcmVuKSkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgY29sbGVjdERlZmF1bHRWYWx1ZXMoY2hpbGQsIHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2V0cyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24gcGF0aFxuICovXG5mdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnQgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uIC0tLS0gICBTZXJ2aWNlIEltcGxlbWVudGF0aW9uICAgLS0tLVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQVhQTGF5b3V0QnVpbGRlclNlcnZpY2Uge1xuICBwcml2YXRlIHBvcHVwU2VydmljZSA9IGluamVjdChBWFBvcHVwU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBsYXlvdXQgYnVpbGRlclxuICAgKi9cbiAgY3JlYXRlKCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IExheW91dEJ1aWxkZXIodGhpcy5wb3B1cFNlcnZpY2UpO1xuICB9XG59XG5cbi8vI2VuZHJlZ2lvblxuXG4vLyNyZWdpb24gLS0tLSAgIExheW91dCBCdWlsZGVyIEltcGxlbWVudGF0aW9uICAgLS0tLVxuXG4vKipcbiAqIE1haW4gbGF5b3V0IGJ1aWxkZXIgLSBTaW5nbGUgUmVzcG9uc2liaWxpdHk6IExheW91dCBvcmNoZXN0cmF0aW9uXG4gKiBPcGVuL0Nsb3NlZDogRXh0ZW5zaWJsZSB0aHJvdWdoIGNvbnRhaW5lciBkZWxlZ2F0ZXNcbiAqL1xuY2xhc3MgTGF5b3V0QnVpbGRlciBpbXBsZW1lbnRzIElMYXlvdXRCdWlsZGVyIHtcbiAgcHJpdmF0ZSByb290OiBBWFBXaWRnZXROb2RlID0ge1xuICAgIGNoaWxkcmVuOiBbXSxcbiAgICBtb2RlOiAnZWRpdCcsXG4gICAgdHlwZTogJ2ZsZXgtbGF5b3V0JyxcbiAgfTtcblxuICBwcml2YXRlIGluaGVyaXRhbmNlQ29udGV4dDogSW5oZXJpdGFuY2VDb250ZXh0ID0ge1xuICAgIG1vZGU6ICdlZGl0JyxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBvcHVwU2VydmljZT86IEFYUG9wdXBTZXJ2aWNlKSB7IH1cblxuICAvLyBQcmVkZWZpbmVkIGxheW91dCBjb250YWluZXJzIGF0IHJvb3QgbGV2ZWwgLSBkZWxlZ2F0ZSBwYXR0ZXJuIHJlcXVpcmVkXG4gIGdyaWQoZGVsZWdhdGU6IChjb250YWluZXI6IElHcmlkQ29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgR3JpZENvbnRhaW5lckJ1aWxkZXIoKTtcbiAgICBjb250YWluZXIud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZShjb250YWluZXIpO1xuICAgIH1cbiAgICAvL3RoaXMuc3RhdGUuY2hpbGRyZW4hLnB1c2goY29udGFpbmVyLmJ1aWxkKCkpO1xuICAgIHRoaXMucm9vdCA9IGNvbnRhaW5lci5idWlsZCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZmxleChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSUZsZXhDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogSUxheW91dEJ1aWxkZXIge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBGbGV4Q29udGFpbmVyQnVpbGRlcigpO1xuICAgIGNvbnRhaW5lci53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgIGRlbGVnYXRlKGNvbnRhaW5lcik7XG4gICAgfVxuICAgIHRoaXMucm9vdC5jaGlsZHJlbiEucHVzaChjb250YWluZXIuYnVpbGQoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwYW5lbChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSVBhbmVsQ29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgUGFuZWxDb250YWluZXJCdWlsZGVyKCk7XG4gICAgY29udGFpbmVyLndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoY29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5yb290LmNoaWxkcmVuIS5wdXNoKGNvbnRhaW5lci5idWlsZCgpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHBhZ2UoZGVsZWdhdGU6IChjb250YWluZXI6IElQYWdlQ29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgUGFnZUNvbnRhaW5lckJ1aWxkZXIoKTtcbiAgICBjb250YWluZXIud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZShjb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLnJvb3QuY2hpbGRyZW4hLnB1c2goY29udGFpbmVyLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGFic2V0KGRlbGVnYXRlOiAoY29udGFpbmVyOiBJVGFic2V0Q29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgVGFic2V0Q29udGFpbmVyQnVpbGRlcigpO1xuICAgIGNvbnRhaW5lci53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgIGRlbGVnYXRlKGNvbnRhaW5lcik7XG4gICAgfVxuICAgIHRoaXMucm9vdC5jaGlsZHJlbiEucHVzaChjb250YWluZXIuYnVpbGQoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmaWVsZHNldChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgRmllbGRzZXRDb250YWluZXJCdWlsZGVyKCk7XG4gICAgY29udGFpbmVyLndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoY29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5yb290LmNoaWxkcmVuIS5wdXNoKGNvbnRhaW5lci5idWlsZCgpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRpYWxvZyhkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSURpYWxvZ0J1aWxkZXIpID0+IHZvaWQpOiBJRGlhbG9nQnVpbGRlciB7XG4gICAgaWYgKCF0aGlzLnBvcHVwU2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTGF5b3V0QnVpbGRlciByZXF1aXJlcyBBWFBvcHVwU2VydmljZSB0byBjcmVhdGUgZGlhbG9ncy4gUGxlYXNlIGluamVjdCBpdCBpbiB0aGUgc2VydmljZSBjb25zdHJ1Y3Rvci4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gbmV3IERpYWxvZ0NvbnRhaW5lckJ1aWxkZXIodGhpcy5wb3B1cFNlcnZpY2UpO1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoY29udGFpbmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIHN0ZXBXaXphcmQoZGVsZWdhdGU6ICh3aXphcmQ6IElTdGVwV2l6YXJkQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICBjb25zdCB3aXphcmQgPSBuZXcgU3RlcFdpemFyZEJ1aWxkZXIoKTtcbiAgICB3aXphcmQud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZSh3aXphcmQpO1xuICAgIH1cbiAgICB0aGlzLnJvb3QuY2hpbGRyZW4hLnB1c2god2l6YXJkLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9ybUZpZWxkKGxhYmVsOiBzdHJpbmcsIGRlbGVnYXRlPzogKGZpZWxkOiBJRm9ybUZpZWxkQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyIHtcbiAgICBjb25zdCBmaWVsZCA9IG5ldyBGb3JtRmllbGRCdWlsZGVyKGxhYmVsKTtcbiAgICBmaWVsZC53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgIGRlbGVnYXRlKGZpZWxkKTtcbiAgICB9XG4gICAgdGhpcy5yb290LmNoaWxkcmVuIS5wdXNoKGZpZWxkLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYnVpbGQoKTogQVhQV2lkZ2V0Tm9kZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMucm9vdC50eXBlLFxuICAgICAgY2hpbGRyZW46IHRoaXMucm9vdC5jaGlsZHJlbixcbiAgICAgIG1vZGU6IHRoaXMucm9vdC5tb2RlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGJ1aWx0IHdpZGdldCBub2RlIHRvIEpTT04gc3RyaW5nXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gU2VyaWFsaXphdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3aWRnZXQgbm9kZVxuICAgKi9cbiAgdG9Kc29uKG9wdGlvbnM/OiB7XG4gICAgcmVtb3ZlTWV0YT86IGJvb2xlYW47XG4gICAgcmVtb3ZlRnVuY3Rpb25zPzogYm9vbGVhbjtcbiAgICBwcmV0dHk/OiBib29sZWFuO1xuICB9KTogc3RyaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5idWlsZCgpO1xuICAgIHJldHVybiBBWFBXaWRnZXRTZXJpYWxpemF0aW9uSGVscGVyLnRvSnNvbihub2RlLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uIC0tLS0gICBDb250YWluZXIgQnVpbGRlciBJbXBsZW1lbnRhdGlvbiAgIC0tLS1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNvbnRhaW5lciBidWlsZGVyIC0gT3Blbi9DbG9zZWQgUHJpbmNpcGxlXG4gKiBQcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgYWxsIGNvbnRhaW5lciB0eXBlc1xuICovXG5hYnN0cmFjdCBjbGFzcyBCYXNlQ29udGFpbmVyQnVpbGRlciB7XG4gIHByb3RlY3RlZCBjb250YWluZXJTdGF0ZTogTGF5b3V0QnVpbGRlclN0YXRlID0ge1xuICAgIG1vZGU6ICdlZGl0JyxcbiAgICB0eXBlOiAnZmxleC1sYXlvdXQnLFxuICAgIGNoaWxkcmVuOiBbXSxcbiAgfTtcblxuICBwcm90ZWN0ZWQgaW5oZXJpdGFuY2VDb250ZXh0OiBJbmhlcml0YW5jZUNvbnRleHQgPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihjb250YWluZXJUeXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLnR5cGUgPSBjb250YWluZXJUeXBlO1xuICB9XG5cbiAgLy8gQmFzZSBtZXRob2RzIHNoYXJlZCBieSBhbGwgY29udGFpbmVyc1xuICBwcm90ZWN0ZWQgZW5zdXJlQ2hpbGRyZW4oKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5jaGlsZHJlbiA9IHRoaXMuY29udGFpbmVyU3RhdGUuY2hpbGRyZW4gfHwgW107XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkV2lkZ2V0PFQ+KHR5cGU6IHN0cmluZywgb3B0aW9ucz86IFQpOiB0aGlzIHtcbiAgICBjb25zdCBjaGlsZCA9IG5ldyBXaWRnZXRCdWlsZGVyKCk7XG4gICAgY2hpbGQudHlwZSh0eXBlKTtcblxuICAgIC8vIEZvciB2YWx1ZSB3aWRnZXRzLCBlbnN1cmUgcGF0aCBpcyBwcm92aWRlZFxuICAgIGNvbnN0IHdpZGdldE9wdGlvbnMgPSBvcHRpb25zID8/IHt9O1xuICAgIGNvbnN0IHBhdGggPSAod2lkZ2V0T3B0aW9ucyBhcyBhbnkpLnBhdGg7XG4gICAgY29uc3QgbmFtZSA9ICh3aWRnZXRPcHRpb25zIGFzIGFueSkubmFtZTtcblxuICAgIGlmICh0aGlzLmlzVmFsdWVXaWRnZXQodHlwZSkgJiYgIXBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWUgd2lkZ2V0ICcke3R5cGV9JyByZXF1aXJlcyBhICdwYXRoJyBwcm9wZXJ0eWApO1xuICAgIH1cblxuICAgIC8vIFNldCBuYW1lIGFuZCBwYXRoIGluIHdpZGdldCBzdGF0ZSwgbm90IG9wdGlvbnNcbiAgICBpZiAobmFtZSkge1xuICAgICAgY2hpbGQubmFtZShuYW1lKTtcbiAgICB9XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIGNoaWxkLnBhdGgocGF0aCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG5hbWUgYW5kIHBhdGggZnJvbSBvcHRpb25zXG4gICAgY29uc3QgeyBuYW1lOiBfLCBwYXRoOiBfXywgLi4uY2xlYW5PcHRpb25zIH0gPSB3aWRnZXRPcHRpb25zIGFzIGFueTtcblxuICAgIC8vIElNUE9SVEFOVDogQXBwbHkgaW5oZXJpdGFuY2UgY29udGV4dCBCRUZPUkUgc2V0dGluZyBvcHRpb25zXG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgaW5oZXJpdGVkIHByb3BlcnRpZXMgKHJlYWRvbmx5LCBkaXNhYmxlZCwgZXRjLikgYXJlIGFwcGxpZWQgZmlyc3RcbiAgICAvLyBUaGVuIHVzZXItcHJvdmlkZWQgb3B0aW9ucyB3aWxsIG92ZXJyaWRlIHRoZW0gaWYgZXhwbGljaXRseSBzZXRcbiAgICBjaGlsZC53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICBjaGlsZC5vcHRpb25zKGNsZWFuT3B0aW9ucyk7XG5cbiAgICB0aGlzLmVuc3VyZUNoaWxkcmVuKCk7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5jaGlsZHJlbiEucHVzaChjaGlsZC5idWlsZCgpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWx1ZVdpZGdldCh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZVdpZGdldFR5cGVzID0gW1xuICAgICAgJ3RleHQtZWRpdG9yJyxcbiAgICAgICdsYXJnZS10ZXh0LWVkaXRvcicsXG4gICAgICAncmljaC10ZXh0LWVkaXRvcicsXG4gICAgICAncGFzc3dvcmQtZWRpdG9yJyxcbiAgICAgICdudW1iZXItZWRpdG9yJyxcbiAgICAgICdzZWxlY3QtZWRpdG9yJyxcbiAgICAgICdsb29rdXAtZWRpdG9yJyxcbiAgICAgICdzZWxlY3Rpb24tbGlzdC1lZGl0b3InLFxuICAgICAgJ2RhdGUtdGltZS1lZGl0b3InLFxuICAgICAgJ3RvZ2dsZS1lZGl0b3InLFxuICAgICAgJ2NvbG9yLWVkaXRvcicsXG4gICAgXTtcbiAgICByZXR1cm4gdmFsdWVXaWRnZXRUeXBlcy5pbmNsdWRlcyh0eXBlKTtcbiAgfVxuXG4gIGJ1aWxkKCk6IEFYUFdpZGdldE5vZGUge1xuICAgIGNvbnN0IHJlc3VsdDogQVhQV2lkZ2V0Tm9kZSA9IHtcbiAgICAgIHR5cGU6IHRoaXMuY29udGFpbmVyU3RhdGUudHlwZSxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLmNvbnRhaW5lclN0YXRlLmNoaWxkcmVuLFxuICAgICAgb3B0aW9uczogdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zLFxuICAgICAgbW9kZTogdGhpcy5jb250YWluZXJTdGF0ZS5tb2RlLFxuICAgICAgdmlzaWJsZTogdGhpcy5jb250YWluZXJTdGF0ZS52aXNpYmxlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgbmFtZSB3aXRoIF9mb3JtX2ZpZWxkIHN1ZmZpeCBmb3IgZm9ybSBmaWVsZHNcbiAgICBpZiAodGhpcy5jb250YWluZXJTdGF0ZS50eXBlID09PSAnZm9ybS1maWVsZCcpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lclN0YXRlLm5hbWUpIHtcbiAgICAgICAgcmVzdWx0Lm5hbWUgPSB0aGlzLmNvbnRhaW5lclN0YXRlLm5hbWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGFpbmVyU3RhdGUub3B0aW9ucz8uWydsYWJlbCddKSB7XG4gICAgICAgIHJlc3VsdC5uYW1lID0gbGFiZWxUb1BhdGgodGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zWydsYWJlbCddKSArICdfZm9ybV9maWVsZCc7XG4gICAgICB9XG4gICAgICAvLyBGb3JtIGZpZWxkcyBkb24ndCBoYXZlIHBhdGhcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXIgY29udGFpbmVycyBjYW4gaGF2ZSBuYW1lIGFuZCBwYXRoXG4gICAgICBpZiAodGhpcy5jb250YWluZXJTdGF0ZS5uYW1lKSB7XG4gICAgICAgIHJlc3VsdC5uYW1lID0gdGhpcy5jb250YWluZXJTdGF0ZS5uYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGFpbmVyU3RhdGUucGF0aCkge1xuICAgICAgICByZXN1bHQucGF0aCA9IHRoaXMuY29udGFpbmVyU3RhdGUucGF0aDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lclN0YXRlLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdC5kZWZhdWx0VmFsdWUgPSB0aGlzLmNvbnRhaW5lclN0YXRlLmRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjb250YWluZXIgYnVpbGRlciBtaXhpbiAtIEludGVyZmFjZSBTZWdyZWdhdGlvbiBQcmluY2lwbGVcbiAqIFByb3ZpZGVzIGNvbW1vbiBjb250YWluZXIgb3BlcmF0aW9uc1xuICovXG5hYnN0cmFjdCBjbGFzcyBCYXNlQ29udGFpbmVyTWl4aW48VENvbnRhaW5lcj4gZXh0ZW5kcyBCYXNlQ29udGFpbmVyQnVpbGRlciB7XG4gIG5hbWUobmFtZTogc3RyaW5nKTogVENvbnRhaW5lciB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5uYW1lID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cbiAgcGF0aChwYXRoOiBzdHJpbmcpOiBUQ29udGFpbmVyIHtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIG1vZGUobW9kZTogQVhQV2lkZ2V0UmVuZGVyTW9kZSk6IFRDb250YWluZXIge1xuICAgIHRoaXMuY29udGFpbmVyU3RhdGUubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5pbmhlcml0YW5jZUNvbnRleHQubW9kZSA9IG1vZGU7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgdmlzaWJsZShjb25kaXRpb246IGJvb2xlYW4gfCBzdHJpbmcpOiBUQ29udGFpbmVyIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyU3RhdGUub3B0aW9ucykgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0ge307XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zWyd2aXNpYmxlJ10gPSBjb25kaXRpb247XG4gICAgdGhpcy5pbmhlcml0YW5jZUNvbnRleHQudmlzaWJsZSA9IGNvbmRpdGlvbjtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICBkaXNhYmxlZChjb25kaXRpb246IGJvb2xlYW4gfCBzdHJpbmcpOiBUQ29udGFpbmVyIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyU3RhdGUub3B0aW9ucykgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0ge307XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zWydkaXNhYmxlZCddID0gY29uZGl0aW9uO1xuICAgIHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0LmRpc2FibGVkID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIHJlYWRvbmx5KGNvbmRpdGlvbjogYm9vbGVhbiB8IHN0cmluZyk6IFRDb250YWluZXIge1xuICAgIGlmICghdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zKSB0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMgPSB7fTtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnNbJ3JlYWRvbmx5J10gPSBjb25kaXRpb247XG4gICAgdGhpcy5pbmhlcml0YW5jZUNvbnRleHQucmVhZG9ubHkgPSBjb25kaXRpb247XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgZGlyZWN0aW9uKGRpcmVjdGlvbjogJ3J0bCcgfCAnbHRyJyk6IFRDb250YWluZXIge1xuICAgIGlmICghdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zKSB0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMgPSB7fTtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnNbJ2RpcmVjdGlvbiddID0gZGlyZWN0aW9uO1xuICAgIHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICAvLyBJbmhlcml0YW5jZSBjb250ZXh0IG1ldGhvZHNcbiAgd2l0aEluaGVyaXRhbmNlQ29udGV4dChjb250ZXh0OiBJbmhlcml0YW5jZUNvbnRleHQpOiBUQ29udGFpbmVyIHtcbiAgICB0aGlzLmluaGVyaXRhbmNlQ29udGV4dCA9IG1lcmdlSW5oZXJpdGFuY2VDb250ZXh0KGNvbnRleHQpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIGdldEluaGVyaXRhbmNlQ29udGV4dCgpOiBJbmhlcml0YW5jZUNvbnRleHQge1xuICAgIHJldHVybiB7IC4uLnRoaXMuaW5oZXJpdGFuY2VDb250ZXh0IH07XG4gIH1cbn1cblxuLyoqXG4gKiBMYXlvdXQgY29udGFpbmVyIG1peGluIC0gSW50ZXJmYWNlIFNlZ3JlZ2F0aW9uIFByaW5jaXBsZVxuICogUHJvdmlkZXMgbGF5b3V0LXNwZWNpZmljIG9wZXJhdGlvbnNcbiAqL1xuYWJzdHJhY3QgY2xhc3MgTGF5b3V0Q29udGFpbmVyTWl4aW48VENvbnRhaW5lcj4gZXh0ZW5kcyBCYXNlQ29udGFpbmVyTWl4aW48VENvbnRhaW5lcj4ge1xuICBsYXlvdXQodmFsdWU6IFBhcnRpYWw8QVhQR3JpZExheW91dE9wdGlvbnM+IHwgbnVtYmVyKTogVENvbnRhaW5lciB7XG4gICAgLy8gTWFwIGxheW91dCBpbnRlbnQgdG8gZ3JpZCBpdGVtIHNpemluZyBzbyBjb250YWluZXJzIGxpa2UgYGZvcm0tZmllbGRgXG4gICAgLy8gY2FuIHNwYW4gbXVsdGlwbGUgY29sdW1ucyBpbnNpZGUgZ3JpZC9maWVsZHNldCBsYXlvdXRzLlxuICAgIGlmICghdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zKSB0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMgPSB7fTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBEaXJlY3QgbnVtZXJpYyBzaG9ydGhhbmQg4oaSIGNvbFNwYW5cbiAgICAgICh0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMgYXMgYW55KS5jb2xTcGFuID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgLy8gVHJ5IHRvIGV4dHJhY3QgYSByZWFzb25hYmxlIGNvbFNwYW4gZnJvbSBicmVha3BvaW50IHBvc2l0aW9uc1xuICAgICAgY29uc3QgcG9zaXRpb25zID0gKHZhbHVlIGFzIGFueSkucG9zaXRpb25zIGFzIGFueTtcbiAgICAgIGlmIChwb3NpdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29sU3BhbiA9XG4gICAgICAgICAgcG9zaXRpb25zPy5sZz8uY29sU3BhbiA/P1xuICAgICAgICAgIHBvc2l0aW9ucz8ueGw/LmNvbFNwYW4gPz9cbiAgICAgICAgICBwb3NpdGlvbnM/Lnh4bD8uY29sU3BhbiA/P1xuICAgICAgICAgIHBvc2l0aW9ucz8ubWQ/LmNvbFNwYW4gPz9cbiAgICAgICAgICBwb3NpdGlvbnM/LnNtPy5jb2xTcGFuO1xuICAgICAgICBpZiAoY29sU3BhbiAhPSBudWxsKSB7XG4gICAgICAgICAgKHRoaXMuY29udGFpbmVyU3RhdGUub3B0aW9ucyBhcyBhbnkpLmNvbFNwYW4gPSBjb2xTcGFuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG59XG5cbi8qKlxuICogQ2hpbGQgY29udGFpbmVyIG1peGluIC0gSW50ZXJmYWNlIFNlZ3JlZ2F0aW9uIFByaW5jaXBsZVxuICogUHJvdmlkZXMgY2hpbGQgY29udGFpbmVyIG1hbmFnZW1lbnRcbiAqL1xuYWJzdHJhY3QgY2xhc3MgQ2hpbGRDb250YWluZXJNaXhpbjxUQ29udGFpbmVyPiBleHRlbmRzIExheW91dENvbnRhaW5lck1peGluPFRDb250YWluZXI+IHtcbiAgZ3JpZChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSUdyaWRDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lciB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbmV3IEdyaWRDb250YWluZXJCdWlsZGVyKCk7XG4gICAgY29udGFpbmVyLndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoY29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVDaGlsZHJlbigpO1xuICAgIHRoaXMuY29udGFpbmVyU3RhdGUuY2hpbGRyZW4hLnB1c2goY29udGFpbmVyLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIGZsZXgoZGVsZWdhdGU6IChjb250YWluZXI6IElGbGV4Q29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IFRDb250YWluZXIge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBGbGV4Q29udGFpbmVyQnVpbGRlcigpO1xuICAgIGNvbnRhaW5lci53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgIGRlbGVnYXRlKGNvbnRhaW5lcik7XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLmNoaWxkcmVuIS5wdXNoKGNvbnRhaW5lci5idWlsZCgpKTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICBwYW5lbChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSVBhbmVsQ29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IFRDb250YWluZXIge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBQYW5lbENvbnRhaW5lckJ1aWxkZXIoKTtcbiAgICBjb250YWluZXIud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZShjb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLmVuc3VyZUNoaWxkcmVuKCk7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5jaGlsZHJlbiEucHVzaChjb250YWluZXIuYnVpbGQoKSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgcGFnZShkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSVBhZ2VDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lciB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbmV3IFBhZ2VDb250YWluZXJCdWlsZGVyKCk7XG4gICAgY29udGFpbmVyLndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoY29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVDaGlsZHJlbigpO1xuICAgIHRoaXMuY29udGFpbmVyU3RhdGUuY2hpbGRyZW4hLnB1c2goY29udGFpbmVyLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIHRhYnNldChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSVRhYnNldENvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBUQ29udGFpbmVyIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgVGFic2V0Q29udGFpbmVyQnVpbGRlcigpO1xuICAgIGNvbnRhaW5lci53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgIGRlbGVnYXRlKGNvbnRhaW5lcik7XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLmNoaWxkcmVuIS5wdXNoKGNvbnRhaW5lci5idWlsZCgpKTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICBmaWVsZHNldChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IFRDb250YWluZXIge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBGaWVsZHNldENvbnRhaW5lckJ1aWxkZXIoKTtcbiAgICBjb250YWluZXIud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZShjb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLmVuc3VyZUNoaWxkcmVuKCk7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5jaGlsZHJlbiEucHVzaChjb250YWluZXIuYnVpbGQoKSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgZGlhbG9nKGRlbGVnYXRlOiAoY29udGFpbmVyOiBJRGlhbG9nQnVpbGRlcikgPT4gdm9pZCk6IElEaWFsb2dCdWlsZGVyIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgRGlhbG9nQ29udGFpbmVyQnVpbGRlcigpOyAvLyBXaWxsIHVzZSBpbmplY3QoKSBmYWxsYmFja1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoY29udGFpbmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIHN0ZXBXaXphcmQoZGVsZWdhdGU6ICh3aXphcmQ6IElTdGVwV2l6YXJkQnVpbGRlcikgPT4gdm9pZCk6IFRDb250YWluZXIge1xuICAgIGNvbnN0IHdpemFyZCA9IG5ldyBTdGVwV2l6YXJkQnVpbGRlcigpO1xuICAgIHdpemFyZC53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgIGRlbGVnYXRlKHdpemFyZCk7XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLmNoaWxkcmVuIS5wdXNoKHdpemFyZC5idWlsZCgpKTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICBmb3JtRmllbGQobGFiZWw6IHN0cmluZywgZGVsZWdhdGU/OiAoZmllbGQ6IElGb3JtRmllbGRCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lciB7XG4gICAgY29uc3QgZmllbGQgPSBuZXcgRm9ybUZpZWxkQnVpbGRlcihsYWJlbCk7XG4gICAgZmllbGQud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZShmaWVsZCk7XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLmNoaWxkcmVuIS5wdXNoKGZpZWxkLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIGR5bmFtaWNGb3JtKGRlZmluaXRpb246IEFYUER5bmFtaWNGb3JtRGVmaW5pdGlvbik6IFRDb250YWluZXIge1xuICAgIC8vIEdldCBjb252ZXJzaW9uIHNlcnZpY2UgdXNpbmcgaW5qZWN0KCkgLSB3b3JrcyBpbiBhbnkgY29udGV4dCBpbiBBbmd1bGFyIDE0K1xuICAgIGxldCBjb252ZXJzaW9uU2VydmljZTogQVhQTGF5b3V0Q29udmVyc2lvblNlcnZpY2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnZlcnNpb25TZXJ2aWNlID0gaW5qZWN0KEFYUExheW91dENvbnZlcnNpb25TZXJ2aWNlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBjcmVhdGUgc2VydmljZSBpbnN0YW5jZSBpZiBpbmplY3QoKSBmYWlscyAoc2hvdWxkbid0IGhhcHBlbiBpbiBub3JtYWwgdXNhZ2UpXG4gICAgICBjb252ZXJzaW9uU2VydmljZSA9IG5ldyBBWFBMYXlvdXRDb252ZXJzaW9uU2VydmljZSgpO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgZm9ybSBkZWZpbml0aW9uIHRvIHdpZGdldCBub2RlXG4gICAgY29uc3Qgd2lkZ2V0Tm9kZSA9IGNvbnZlcnNpb25TZXJ2aWNlLmNvbnZlcnRGb3JtRGVmaW5pdGlvbihkZWZpbml0aW9uKTtcblxuICAgIC8vIEFkZCB0aGUgd2lkZ2V0IG5vZGUncyBjaGlsZHJlbiB0byB0aGlzIGNvbnRhaW5lclxuICAgIC8vIFRoZSBjb252ZXJ0ZWQgd2lkZ2V0IG5vZGUgaGFzIGEgcm9vdCBncmlkLWxheW91dCwgd2Ugd2FudCBpdHMgY2hpbGRyZW4gKGZpZWxkc2V0cylcbiAgICBpZiAod2lkZ2V0Tm9kZS5jaGlsZHJlbiAmJiB3aWRnZXROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZW5zdXJlQ2hpbGRyZW4oKTtcbiAgICAgIHRoaXMuY29udGFpbmVyU3RhdGUuY2hpbGRyZW4hLnB1c2goLi4ud2lkZ2V0Tm9kZS5jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG59XG5cbi8qKlxuICogV2lkZ2V0IGNvbnRhaW5lciBtaXhpbiAtIEludGVyZmFjZSBTZWdyZWdhdGlvbiBQcmluY2lwbGVcbiAqIFByb3ZpZGVzIHdpZGdldCBjcmVhdGlvbiBvcGVyYXRpb25zXG4gKi9cbmFic3RyYWN0IGNsYXNzIFdpZGdldENvbnRhaW5lck1peGluPFRDb250YWluZXI+IGV4dGVuZHMgQ2hpbGRDb250YWluZXJNaXhpbjxUQ29udGFpbmVyPiB7XG4gIHRleHRCb3gob3B0aW9ucz86IFRleHRCb3hPcHRpb25zKTogVENvbnRhaW5lciB7XG4gICAgdGhpcy5hZGRXaWRnZXQoJ3RleHQtZWRpdG9yJywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgbGFyZ2VUZXh0Qm94KG9wdGlvbnM/OiBMYXJnZVRleHRCb3hPcHRpb25zKTogVENvbnRhaW5lciB7XG4gICAgdGhpcy5hZGRXaWRnZXQoJ2xhcmdlLXRleHQtZWRpdG9yJywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgcmljaFRleHQob3B0aW9ucz86IFJpY2hUZXh0T3B0aW9ucyk6IFRDb250YWluZXIge1xuICAgIHRoaXMuYWRkV2lkZ2V0KCdyaWNoLXRleHQtZWRpdG9yJywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgcGFzc3dvcmRCb3gob3B0aW9ucz86IFBhc3N3b3JkQm94T3B0aW9ucyk6IFRDb250YWluZXIge1xuICAgIHRoaXMuYWRkV2lkZ2V0KCdwYXNzd29yZC1lZGl0b3InLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICBudW1iZXJCb3gob3B0aW9ucz86IE51bWJlckJveE9wdGlvbnMpOiBUQ29udGFpbmVyIHtcbiAgICB0aGlzLmFkZFdpZGdldCgnbnVtYmVyLWVkaXRvcicsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIHNlbGVjdEJveChvcHRpb25zOiBTZWxlY3RCb3hPcHRpb25zKTogVENvbnRhaW5lciB7XG4gICAgdGhpcy5hZGRXaWRnZXQoJ3NlbGVjdC1lZGl0b3InLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICBsb29rdXBCb3gob3B0aW9uczogTG9va3VwQm94T3B0aW9ucyk6IFRDb250YWluZXIge1xuICAgIHRoaXMuYWRkV2lkZ2V0KCdsb29rdXAtZWRpdG9yJywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgc2VsZWN0aW9uTGlzdChvcHRpb25zOiBTZWxlY3Rpb25MaXN0T3B0aW9ucyk6IFRDb250YWluZXIge1xuICAgIHRoaXMuYWRkV2lkZ2V0KCdzZWxlY3Rpb24tbGlzdC1lZGl0b3InLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICBkYXRlVGltZUJveChvcHRpb25zPzogRGF0ZVRpbWVCb3hPcHRpb25zKTogVENvbnRhaW5lciB7XG4gICAgdGhpcy5hZGRXaWRnZXQoJ2RhdGUtdGltZS1lZGl0b3InLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIFRDb250YWluZXI7XG4gIH1cblxuICB0b2dnbGVTd2l0Y2gob3B0aW9ucz86IFRvZ2dsZVN3aXRjaE9wdGlvbnMpOiBUQ29udGFpbmVyIHtcbiAgICB0aGlzLmFkZFdpZGdldCgndG9nZ2xlLWVkaXRvcicsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIGNvbG9yQm94KG9wdGlvbnM/OiBDb2xvckJveE9wdGlvbnMpOiBUQ29udGFpbmVyIHtcbiAgICB0aGlzLmFkZFdpZGdldCgnY29sb3ItZWRpdG9yJywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUQ29udGFpbmVyO1xuICB9XG5cbiAgbGlzdChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSUxpc3RXaWRnZXRCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lciB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbmV3IExpc3RXaWRnZXRCdWlsZGVyKCk7XG4gICAgY29udGFpbmVyLndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoY29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVDaGlsZHJlbigpO1xuICAgIHRoaXMuY29udGFpbmVyU3RhdGUuY2hpbGRyZW4hLnB1c2goY29udGFpbmVyLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxuXG4gIGN1c3RvbVdpZGdldDxUPih0eXBlOiBzdHJpbmcsIG9wdGlvbnM/OiBUKTogVENvbnRhaW5lcjtcbiAgY3VzdG9tV2lkZ2V0PFQ+KHR5cGU6IHN0cmluZywgZGVsZWdhdGU6ICh3aWRnZXQ6IElXaWRnZXRCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lcjtcbiAgY3VzdG9tV2lkZ2V0PFQ+KHR5cGU6IHN0cmluZywgb3B0aW9uc09yRGVsZWdhdGU/OiBUIHwgKCh3aWRnZXQ6IElXaWRnZXRCdWlsZGVyKSA9PiB2b2lkKSwgZGVsZWdhdGU/OiAod2lkZ2V0OiBJV2lkZ2V0QnVpbGRlcikgPT4gdm9pZCk6IFRDb250YWluZXIge1xuICAgIGNvbnN0IGNoaWxkID0gbmV3IFdpZGdldEJ1aWxkZXIoKTtcbiAgICBjaGlsZC50eXBlKHR5cGUpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHNlY29uZCBwYXJhbWV0ZXIgaXMgZGVsZWdhdGUgb3Igb3B0aW9uc1xuICAgIGNvbnN0IGlzRGVsZWdhdGUgPSB0eXBlb2Ygb3B0aW9uc09yRGVsZWdhdGUgPT09ICdmdW5jdGlvbic7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGlzRGVsZWdhdGUgPyB1bmRlZmluZWQgOiAob3B0aW9uc09yRGVsZWdhdGUgYXMgVCB8IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgYWN0dWFsRGVsZWdhdGUgPSBpc0RlbGVnYXRlID8gKG9wdGlvbnNPckRlbGVnYXRlIGFzICh3aWRnZXQ6IElXaWRnZXRCdWlsZGVyKSA9PiB2b2lkKSA6IGRlbGVnYXRlO1xuXG4gICAgLy8gQXBwbHkgaW5oZXJpdGFuY2UgY29udGV4dCBCRUZPUkUgc2V0dGluZyBvcHRpb25zIG9yIGNhbGxpbmcgZGVsZWdhdGVcbiAgICBjaGlsZC53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcblxuICAgIC8vIElmIG9wdGlvbnMgYXJlIHByb3ZpZGVkIChub24tZGVsZWdhdGUgb3ZlcmxvYWQpLCBoYW5kbGUgdGhlbVxuICAgIGlmICghaXNEZWxlZ2F0ZSAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHdpZGdldE9wdGlvbnMgPSBvcHRpb25zIGFzIGFueTtcbiAgICAgIGNvbnN0IHBhdGggPSB3aWRnZXRPcHRpb25zLnBhdGg7XG4gICAgICBjb25zdCBuYW1lID0gd2lkZ2V0T3B0aW9ucy5uYW1lO1xuXG4gICAgICAvLyBTZXQgbmFtZSBhbmQgcGF0aCBpbiB3aWRnZXQgc3RhdGUsIG5vdCBvcHRpb25zXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBjaGlsZC5uYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgY2hpbGQucGF0aChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIG5hbWUgYW5kIHBhdGggZnJvbSBvcHRpb25zXG4gICAgICBjb25zdCB7IG5hbWU6IF8sIHBhdGg6IF9fLCAuLi5jbGVhbk9wdGlvbnMgfSA9IHdpZGdldE9wdGlvbnM7XG4gICAgICBjaGlsZC5vcHRpb25zKGNsZWFuT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gSWYgZGVsZWdhdGUgaXMgcHJvdmlkZWQsIGNhbGwgaXQgdG8gYWxsb3cgc2V0dGluZyBwYXRoLCBvcHRpb25zLCBhbmQgb3RoZXIgY29udHJvbCBtZXRob2RzXG4gICAgaWYgKGFjdHVhbERlbGVnYXRlKSB7XG4gICAgICBhY3R1YWxEZWxlZ2F0ZShjaGlsZCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIHdpZGdldCB0byBjaGVjayBpZiBwYXRoIGlzIHNldCAoZm9yIHZhbHVlIHdpZGdldHMpXG4gICAgY29uc3QgYnVpbHRXaWRnZXQgPSBjaGlsZC5idWlsZCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdmFsdWUgd2lkZ2V0IHJlcXVpcmVzIHBhdGhcbiAgICBjb25zdCB2YWx1ZVdpZGdldFR5cGVzID0gW1xuICAgICAgJ3RleHQtZWRpdG9yJyxcbiAgICAgICdsYXJnZS10ZXh0LWVkaXRvcicsXG4gICAgICAncmljaC10ZXh0LWVkaXRvcicsXG4gICAgICAncGFzc3dvcmQtZWRpdG9yJyxcbiAgICAgICdudW1iZXItZWRpdG9yJyxcbiAgICAgICdzZWxlY3QtZWRpdG9yJyxcbiAgICAgICdsb29rdXAtZWRpdG9yJyxcbiAgICAgICdzZWxlY3Rpb24tbGlzdC1lZGl0b3InLFxuICAgICAgJ2RhdGUtdGltZS1lZGl0b3InLFxuICAgICAgJ3RvZ2dsZS1lZGl0b3InLFxuICAgICAgJ2NvbG9yLWVkaXRvcicsXG4gICAgXTtcbiAgICBpZiAodmFsdWVXaWRnZXRUeXBlcy5pbmNsdWRlcyh0eXBlKSAmJiAhYnVpbHRXaWRnZXQucGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZSB3aWRnZXQgJyR7dHlwZX0nIHJlcXVpcmVzIGEgJ3BhdGgnIHByb3BlcnR5YCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVDaGlsZHJlbigpO1xuICAgIHRoaXMuY29udGFpbmVyU3RhdGUuY2hpbGRyZW4hLnB1c2goYnVpbHRXaWRnZXQpO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVENvbnRhaW5lcjtcbiAgfVxufVxuXG4vKipcbiAqIEZsZXggQ29udGFpbmVyIEJ1aWxkZXIgLSBMaXNrb3YgU3Vic3RpdHV0aW9uIFByaW5jaXBsZVxuICogRXh0ZW5kcyBXaWRnZXRDb250YWluZXJNaXhpbiB0byBpbmhlcml0IGFsbCBjb21tb24gZnVuY3Rpb25hbGl0eVxuICovXG5jbGFzcyBGbGV4Q29udGFpbmVyQnVpbGRlciBleHRlbmRzIFdpZGdldENvbnRhaW5lck1peGluPElGbGV4Q29udGFpbmVyQnVpbGRlcj4gaW1wbGVtZW50cyBJRmxleENvbnRhaW5lckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignZmxleC1sYXlvdXQnKTtcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQRmxleENvbnRhaW5lck9wdGlvbnMpOiBJRmxleENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHRoaXMuY29udGFpbmVyU3RhdGUub3B0aW9ucyA9IHsgLi4udGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBJbmRpdmlkdWFsIGZsdWVudCBtZXRob2RzIGZvciBGbGV4XG4gIHNldERpcmVjdGlvbihkaXJlY3Rpb246ICdyb3cnIHwgJ2NvbHVtbicgfCAncm93LXJldmVyc2UnIHwgJ2NvbHVtbi1yZXZlcnNlJyk6IElGbGV4Q29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGZsZXhEaXJlY3Rpb246IGRpcmVjdGlvbiB9KTtcbiAgfVxuXG4gIHNldFdyYXAod3JhcDogJ25vd3JhcCcgfCAnd3JhcCcgfCAnd3JhcC1yZXZlcnNlJyk6IElGbGV4Q29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGZsZXhXcmFwOiB3cmFwIH0pO1xuICB9XG5cbiAgc2V0SnVzdGlmeUNvbnRlbnQoXG4gICAganVzdGlmeTogJ2ZsZXgtc3RhcnQnIHwgJ2ZsZXgtZW5kJyB8ICdjZW50ZXInIHwgJ3NwYWNlLWJldHdlZW4nIHwgJ3NwYWNlLWFyb3VuZCcgfCAnc3BhY2UtZXZlbmx5JyxcbiAgKTogSUZsZXhDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsganVzdGlmeUNvbnRlbnQ6IGp1c3RpZnkgfSk7XG4gIH1cblxuICBzZXRBbGlnbkl0ZW1zKGFsaWduOiAnZmxleC1zdGFydCcgfCAnZmxleC1lbmQnIHwgJ2NlbnRlcicgfCAnYmFzZWxpbmUnIHwgJ3N0cmV0Y2gnKTogSUZsZXhDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgYWxpZ25JdGVtczogYWxpZ24gfSk7XG4gIH1cblxuICBzZXRHYXAoZ2FwOiBzdHJpbmcpOiBJRmxleENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBnYXAgfSk7XG4gIH1cblxuICBzZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3I6IHN0cmluZyk6IElGbGV4Q29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGJhY2tncm91bmRDb2xvcjogY29sb3IgfSk7XG4gIH1cblxuICBzZXRQYWRkaW5nKHBhZGRpbmc6IHN0cmluZyk6IElGbGV4Q29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IHNwYWNpbmc6IHsgcGFkZGluZyB9IH0pO1xuICB9XG5cbiAgc2V0TWFyZ2luKG1hcmdpbjogc3RyaW5nKTogSUZsZXhDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgc3BhY2luZzogeyBtYXJnaW4gfSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEdyaWQgQ29udGFpbmVyIEJ1aWxkZXIgLSBMaXNrb3YgU3Vic3RpdHV0aW9uIFByaW5jaXBsZVxuICogRXh0ZW5kcyBXaWRnZXRDb250YWluZXJNaXhpbiB0byBpbmhlcml0IGFsbCBjb21tb24gZnVuY3Rpb25hbGl0eVxuICovXG5jbGFzcyBHcmlkQ29udGFpbmVyQnVpbGRlciBleHRlbmRzIFdpZGdldENvbnRhaW5lck1peGluPElHcmlkQ29udGFpbmVyQnVpbGRlcj4gaW1wbGVtZW50cyBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignZ3JpZC1sYXlvdXQnKTtcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQR3JpZENvbnRhaW5lck9wdGlvbnMpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHRoaXMuY29udGFpbmVyU3RhdGUub3B0aW9ucyA9IHsgLi4udGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBJbmRpdmlkdWFsIGZsdWVudCBtZXRob2RzIGZvciBHcmlkXG4gIHNldENvbHVtbnMoY29sdW1uczogbnVtYmVyKTogSUdyaWRDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgZ3JpZDogeyBkZWZhdWx0OiB7IGNvbHVtbnMgfSB9IH0pO1xuICB9XG5cbiAgc2V0Um93cyhyb3dzOiBudW1iZXIpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBncmlkOiB7IGRlZmF1bHQ6IHsgcm93cyB9IH0gfSk7XG4gIH1cblxuICBzZXRHYXAoZ2FwOiBzdHJpbmcpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBncmlkOiB7IGRlZmF1bHQ6IHsgZ2FwIH0gfSB9KTtcbiAgfVxuXG4gIHNldEp1c3RpZnlJdGVtcyhqdXN0aWZ5OiAnc3RhcnQnIHwgJ2VuZCcgfCAnY2VudGVyJyB8ICdzdHJldGNoJyk6IElHcmlkQ29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGdyaWQ6IHsgZGVmYXVsdDogeyBqdXN0aWZ5SXRlbXM6IGp1c3RpZnkgfSB9IH0pO1xuICB9XG5cbiAgc2V0QWxpZ25JdGVtcyhhbGlnbjogJ3N0YXJ0JyB8ICdlbmQnIHwgJ2NlbnRlcicgfCAnc3RyZXRjaCcpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBncmlkOiB7IGRlZmF1bHQ6IHsgYWxpZ25JdGVtczogYWxpZ24gfSB9IH0pO1xuICB9XG5cbiAgc2V0QXV0b0Zsb3coZmxvdzogJ3JvdycgfCAnY29sdW1uJyB8ICdyb3cgZGVuc2UnIHwgJ2NvbHVtbiBkZW5zZScpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBncmlkOiB7IGRlZmF1bHQ6IHsgYXV0b0Zsb3c6IGZsb3cgfSB9IH0pO1xuICB9XG5cbiAgc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yOiBzdHJpbmcpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yIH0pO1xuICB9XG5cbiAgc2V0UGFkZGluZyhwYWRkaW5nOiBzdHJpbmcpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBzcGFjaW5nOiB7IHBhZGRpbmcgfSB9KTtcbiAgfVxuXG4gIHNldE1hcmdpbihtYXJnaW46IHN0cmluZyk6IElHcmlkQ29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IHNwYWNpbmc6IHsgbWFyZ2luIH0gfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYW5lbCBDb250YWluZXIgQnVpbGRlciAtIExpc2tvdiBTdWJzdGl0dXRpb24gUHJpbmNpcGxlXG4gKiBFeHRlbmRzIFdpZGdldENvbnRhaW5lck1peGluIHRvIGluaGVyaXQgYWxsIGNvbW1vbiBmdW5jdGlvbmFsaXR5XG4gKi9cbmNsYXNzIFBhbmVsQ29udGFpbmVyQnVpbGRlciBleHRlbmRzIFdpZGdldENvbnRhaW5lck1peGluPElQYW5lbENvbnRhaW5lckJ1aWxkZXI+IGltcGxlbWVudHMgSVBhbmVsQ29udGFpbmVyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdwYW5lbC1sYXlvdXQnKTtcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQUGFuZWxDb250YWluZXJPcHRpb25zKTogSVBhbmVsQ29udGFpbmVyQnVpbGRlciB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0geyAuLi50aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEluZGl2aWR1YWwgZmx1ZW50IG1ldGhvZHMgZm9yIFBhbmVsXG4gIHNldENhcHRpb24oY2FwdGlvbjogc3RyaW5nKTogSVBhbmVsQ29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGNhcHRpb24gfSk7XG4gIH1cblxuICBzZXRJY29uKGljb246IHN0cmluZyk6IElQYW5lbENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBpY29uIH0pO1xuICB9XG5cbiAgc2V0TG9vayhsb29rOiAnc29saWQnIHwgJ2ZpbGwnIHwgJ291dGxpbmUnIHwgJ2ZsYXQnIHwgJ25vbmUnKTogSVBhbmVsQ29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGxvb2sgfSk7XG4gIH1cblxuICBzZXRTaG93SGVhZGVyKHNob3c6IGJvb2xlYW4pOiBJUGFuZWxDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgc2hvd0hlYWRlcjogc2hvdyB9KTtcbiAgfVxuXG4gIHNldENvbGxhcHNlZChjb2xsYXBzZWQ6IGJvb2xlYW4pOiBJUGFuZWxDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgY29sbGFwc2VkIH0pO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBDb250YWluZXIgQnVpbGRlciAtIExpc2tvdiBTdWJzdGl0dXRpb24gUHJpbmNpcGxlXG4gKiBFeHRlbmRzIFdpZGdldENvbnRhaW5lck1peGluIHRvIGluaGVyaXQgYWxsIGNvbW1vbiBmdW5jdGlvbmFsaXR5XG4gKi9cbmNsYXNzIFBhZ2VDb250YWluZXJCdWlsZGVyIGV4dGVuZHMgV2lkZ2V0Q29udGFpbmVyTWl4aW48SVBhZ2VDb250YWluZXJCdWlsZGVyPiBpbXBsZW1lbnRzIElQYWdlQ29udGFpbmVyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdwYWdlLWxheW91dCcpO1xuICB9XG5cbiAgc2V0T3B0aW9ucyhvcHRpb25zOiBBWFBQYWdlQ29udGFpbmVyT3B0aW9ucyk6IElQYWdlQ29udGFpbmVyQnVpbGRlciB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0geyAuLi50aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEluZGl2aWR1YWwgZmx1ZW50IG1ldGhvZHMgZm9yIFBhZ2VcbiAgc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yOiBzdHJpbmcpOiBJUGFnZUNvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yIH0pO1xuICB9XG5cbiAgc2V0VGhlbWUodGhlbWU6IHsgaWQ6IHN0cmluZyB9KTogSVBhZ2VDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgdGhlbWUgfSk7XG4gIH1cblxuICBzZXRIYXNIZWFkZXIoaGFzSGVhZGVyOiBib29sZWFuKTogSVBhZ2VDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgaGFzSGVhZGVyIH0pO1xuICB9XG5cbiAgc2V0SGFzRm9vdGVyKGhhc0Zvb3RlcjogYm9vbGVhbik6IElQYWdlQ29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGhhc0Zvb3RlciB9KTtcbiAgfVxuXG4gIHNldERpcmVjdGlvbihkaXJlY3Rpb246IHN0cmluZyk6IElQYWdlQ29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGRpcmVjdGlvbiB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRhYnNldCBDb250YWluZXIgQnVpbGRlciAtIExpc2tvdiBTdWJzdGl0dXRpb24gUHJpbmNpcGxlXG4gKiBFeHRlbmRzIFdpZGdldENvbnRhaW5lck1peGluIHRvIGluaGVyaXQgYWxsIGNvbW1vbiBmdW5jdGlvbmFsaXR5XG4gKi9cbmNsYXNzIFRhYnNldENvbnRhaW5lckJ1aWxkZXIgZXh0ZW5kcyBXaWRnZXRDb250YWluZXJNaXhpbjxJVGFic2V0Q29udGFpbmVyQnVpbGRlcj4gaW1wbGVtZW50cyBJVGFic2V0Q29udGFpbmVyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCd0YWJzZXQtbGF5b3V0Jyk7XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdGlvbnM6IEFYUFRhYnNldENvbnRhaW5lck9wdGlvbnMpOiBJVGFic2V0Q29udGFpbmVyQnVpbGRlciB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0geyAuLi50aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEluZGl2aWR1YWwgZmx1ZW50IG1ldGhvZHMgZm9yIFRhYnNldFxuICBzZXRMb29rKGxvb2s6ICd3aXRoLWxpbmUnIHwgJ3dpdGgtbGluZS1jb2xvcicgfCAncGlsbHMnIHwgJ3BpbGxzLWNvbG9yJyk6IElUYWJzZXRDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgbG9vayB9KTtcbiAgfVxuXG4gIHNldE9yaWVudGF0aW9uKG9yaWVudGF0aW9uOiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnKTogSVRhYnNldENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBvcmllbnRhdGlvbiB9KTtcbiAgfVxuXG4gIHNldEFjdGl2ZUluZGV4KGluZGV4OiBudW1iZXIpOiBJVGFic2V0Q29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGFjdGl2ZUluZGV4OiBpbmRleCB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcm0gRmllbGQgQnVpbGRlciAtIExpc2tvdiBTdWJzdGl0dXRpb24gUHJpbmNpcGxlXG4gKiBDYW4gb25seSBjb250YWluIE9ORSB3aWRnZXQgd2l0aCBhdXRvbWF0aWMgcGF0aCBnZW5lcmF0aW9uXG4gKi9cbmNsYXNzIEZvcm1GaWVsZEJ1aWxkZXIgZXh0ZW5kcyBMYXlvdXRDb250YWluZXJNaXhpbjxJRm9ybUZpZWxkQnVpbGRlcj4gaW1wbGVtZW50cyBJRm9ybUZpZWxkQnVpbGRlciB7XG4gIHByaXZhdGUgaGFzV2lkZ2V0ID0gZmFsc2U7XG4gIHByaXZhdGUgY2hpbGRXaWRnZXQ/OiBXaWRnZXRCdWlsZGVyOyAvLyBTdG9yZSB0aGUgd2lkZ2V0IGJ1aWxkZXIsIG5vdCB0aGUgYnVpbHQgd2lkZ2V0XG5cbiAgY29uc3RydWN0b3IobGFiZWw6IHN0cmluZykge1xuICAgIHN1cGVyKCdmb3JtLWZpZWxkJyk7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0geyBsYWJlbCwgc2hvd0xhYmVsOiB0cnVlIH07XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdGlvbnM6IEFYUEZvcm1GaWVsZE9wdGlvbnMpOiBJRm9ybUZpZWxkQnVpbGRlciB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0geyAuLi50aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiBJRm9ybUZpZWxkQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGxhYmVsIH0pO1xuICB9XG5cbiAgc2V0U2hvd0xhYmVsKHNob3dMYWJlbDogYm9vbGVhbik6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgc2hvd0xhYmVsIH0pO1xuICB9XG5cbiAgZGVmYXVsdFZhbHVlKHZhbHVlOiBhbnkpOiBJRm9ybUZpZWxkQnVpbGRlciB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmluaGVyaXRhbmNlQ29udGV4dC5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5jaGlsZFdpZGdldCkge1xuICAgICAgdGhpcy5jaGlsZFdpZGdldC53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBTaW5nbGUgd2lkZ2V0IG1ldGhvZHMgd2l0aCBhdXRvbWF0aWMgcGF0aCBnZW5lcmF0aW9uXG4gIHByaXZhdGUgYWRkU2luZ2xlV2lkZ2V0PFQ+KHR5cGU6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8VCwgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICBpZiAodGhpcy5oYXNXaWRnZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm9ybSBmaWVsZCBjYW4gb25seSBjb250YWluIG9uZSB3aWRnZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtRmllbGROYW1lID0gdGhpcy5jb250YWluZXJTdGF0ZS5uYW1lO1xuICAgIGNvbnN0IGZvcm1GaWVsZFBhdGggPSB0aGlzLmNvbnRhaW5lclN0YXRlLnBhdGg7IC8vIEdldCBleHBsaWNpdCBwYXRoIGZyb20gZm9ybSBmaWVsZFxuICAgIGNvbnN0IGZvcm1GaWVsZExhYmVsID0gdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zPy5bJ2xhYmVsJ107XG4gICAgY29uc3Qgd2lkZ2V0TmFtZSA9IChvcHRpb25zIGFzIGFueSk/Lm5hbWU7XG5cbiAgICAvLyBHZW5lcmF0ZSB3aWRnZXQgcGF0aDogZXhwbGljaXQgcGF0aCAtPiB3aWRnZXQgbmFtZSAtPiBmb3JtIGZpZWxkIG5hbWUgLT4gbGFiZWwgLT4gcmFuZG9tXG4gICAgbGV0IHdpZGdldFBhdGg6IHN0cmluZztcbiAgICBpZiAoZm9ybUZpZWxkUGF0aCkge1xuICAgICAgd2lkZ2V0UGF0aCA9IGZvcm1GaWVsZFBhdGg7IC8vIFVzZSBleHBsaWNpdCBmb3JtIGZpZWxkIHBhdGggZmlyc3RcbiAgICB9IGVsc2UgaWYgKHdpZGdldE5hbWUpIHtcbiAgICAgIHdpZGdldFBhdGggPSB3aWRnZXROYW1lO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkTmFtZSkge1xuICAgICAgd2lkZ2V0UGF0aCA9IGZvcm1GaWVsZE5hbWU7IC8vIFVzZSBmb3JtIGZpZWxkIG5hbWUgYXMgZGVmYXVsdCBwYXRoXG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGRMYWJlbCkge1xuICAgICAgd2lkZ2V0UGF0aCA9IGxhYmVsVG9QYXRoKGZvcm1GaWVsZExhYmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2lkZ2V0UGF0aCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbE5hbWUgPSB3aWRnZXROYW1lIHx8IGZvcm1GaWVsZE5hbWUgfHwgd2lkZ2V0UGF0aDtcblxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFdpZGdldEJ1aWxkZXIoKTtcbiAgICBjaGlsZC50eXBlKHR5cGUpO1xuICAgIGNoaWxkLm5hbWUoZmluYWxOYW1lKTtcbiAgICBjaGlsZC5wYXRoKHdpZGdldFBhdGgpO1xuXG4gICAgLy8gUmVtb3ZlIG5hbWUgZnJvbSBvcHRpb25zIHNpbmNlIGl0J3Mgbm93IGluIHN0YXRlXG4gICAgY29uc3QgeyBuYW1lOiBfLCAuLi5jbGVhbk9wdGlvbnMgfSA9IChvcHRpb25zIHx8IHt9KSBhcyBhbnk7XG4gICAgY2hpbGQud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgY2hpbGQub3B0aW9ucyhjbGVhbk9wdGlvbnMpO1xuXG4gICAgLy8gSU1QT1JUQU5UOiBTdG9yZSB0aGUgd2lkZ2V0IGJ1aWxkZXIsIGRvbid0IGJ1aWxkIGl0IHlldCFcbiAgICAvLyBUaGlzIGFsbG93cyBwcm9wZXJ0aWVzIHNldCBhZnRlciB0aGlzIG1ldGhvZCAobGlrZSBkaXNhYmxlZCwgcmVhZG9ubHkpIHRvIGJlIGFwcGxpZWRcbiAgICB0aGlzLmNoaWxkV2lkZ2V0ID0gY2hpbGQ7XG4gICAgdGhpcy5oYXNXaWRnZXQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0ZXh0Qm94KG9wdGlvbnM/OiBPbWl0PFRleHRCb3hPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmFkZFNpbmdsZVdpZGdldDxUZXh0Qm94T3B0aW9ucz4oJ3RleHQtZWRpdG9yJywgb3B0aW9ucyk7XG4gIH1cblxuICBsYXJnZVRleHRCb3gob3B0aW9ucz86IE9taXQ8TGFyZ2VUZXh0Qm94T3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRTaW5nbGVXaWRnZXQ8TGFyZ2VUZXh0Qm94T3B0aW9ucz4oJ2xhcmdlLXRleHQtZWRpdG9yJywgb3B0aW9ucyk7XG4gIH1cblxuICByaWNoVGV4dChvcHRpb25zPzogT21pdDxSaWNoVGV4dE9wdGlvbnMsICdwYXRoJz4pOiBJRm9ybUZpZWxkQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2luZ2xlV2lkZ2V0PFJpY2hUZXh0T3B0aW9ucz4oJ3JpY2gtdGV4dC1lZGl0b3InLCBvcHRpb25zKTtcbiAgfVxuXG4gIHBhc3N3b3JkQm94KG9wdGlvbnM/OiBPbWl0PFBhc3N3b3JkQm94T3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRTaW5nbGVXaWRnZXQ8UGFzc3dvcmRCb3hPcHRpb25zPigncGFzc3dvcmQtZWRpdG9yJywgb3B0aW9ucyk7XG4gIH1cblxuICBudW1iZXJCb3gob3B0aW9ucz86IE9taXQ8TnVtYmVyQm94T3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRTaW5nbGVXaWRnZXQ8TnVtYmVyQm94T3B0aW9ucz4oJ251bWJlci1lZGl0b3InLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNlbGVjdEJveChvcHRpb25zOiBPbWl0PFNlbGVjdEJveE9wdGlvbnMsICdwYXRoJz4pOiBJRm9ybUZpZWxkQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2luZ2xlV2lkZ2V0PFNlbGVjdEJveE9wdGlvbnM+KCdzZWxlY3QtZWRpdG9yJywgb3B0aW9ucyk7XG4gIH1cblxuICBsb29rdXBCb3gob3B0aW9uczogT21pdDxMb29rdXBCb3hPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmFkZFNpbmdsZVdpZGdldDxMb29rdXBCb3hPcHRpb25zPignbG9va3VwLWVkaXRvcicsIG9wdGlvbnMpO1xuICB9XG5cbiAgc2VsZWN0aW9uTGlzdChvcHRpb25zOiBPbWl0PFNlbGVjdGlvbkxpc3RPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmFkZFNpbmdsZVdpZGdldDxTZWxlY3Rpb25MaXN0T3B0aW9ucz4oJ3NlbGVjdGlvbi1saXN0LWVkaXRvcicsIG9wdGlvbnMpO1xuICB9XG5cbiAgZGF0ZVRpbWVCb3gob3B0aW9ucz86IE9taXQ8RGF0ZVRpbWVCb3hPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmFkZFNpbmdsZVdpZGdldDxEYXRlVGltZUJveE9wdGlvbnM+KCdkYXRlLXRpbWUtZWRpdG9yJywgb3B0aW9ucyk7XG4gIH1cblxuICB0b2dnbGVTd2l0Y2gob3B0aW9ucz86IE9taXQ8VG9nZ2xlU3dpdGNoT3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRTaW5nbGVXaWRnZXQ8VG9nZ2xlU3dpdGNoT3B0aW9ucz4oJ3RvZ2dsZS1lZGl0b3InLCBvcHRpb25zKTtcbiAgfVxuXG4gIGNvbG9yQm94KG9wdGlvbnM/OiBPbWl0PENvbG9yQm94T3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRTaW5nbGVXaWRnZXQ8Q29sb3JCb3hPcHRpb25zPignY29sb3ItZWRpdG9yJywgb3B0aW9ucyk7XG4gIH1cblxuICBjdXN0b21XaWRnZXQ8VD4odHlwZTogc3RyaW5nLCBvcHRpb25zPzogT21pdDxULCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmFkZFNpbmdsZVdpZGdldDxUPih0eXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIHByb3BlcnR5IHNldHRlcnMgdG8gcHJvcGFnYXRlIGNoYW5nZXMgdG8gY2hpbGQgd2lkZ2V0XG4gIG92ZXJyaWRlIGRpc2FibGVkKGNvbmRpdGlvbjogYm9vbGVhbiB8IHN0cmluZyk6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICBzdXBlci5kaXNhYmxlZChjb25kaXRpb24pO1xuICAgIGlmICh0aGlzLmNoaWxkV2lkZ2V0KSB7XG4gICAgICB0aGlzLmNoaWxkV2lkZ2V0LndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG92ZXJyaWRlIHJlYWRvbmx5KGNvbmRpdGlvbjogYm9vbGVhbiB8IHN0cmluZyk6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICBzdXBlci5yZWFkb25seShjb25kaXRpb24pO1xuICAgIGlmICh0aGlzLmNoaWxkV2lkZ2V0KSB7XG4gICAgICB0aGlzLmNoaWxkV2lkZ2V0LndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2libGUoY29uZGl0aW9uOiBib29sZWFuIHwgc3RyaW5nKTogSUZvcm1GaWVsZEJ1aWxkZXIge1xuICAgIHN1cGVyLnZpc2libGUoY29uZGl0aW9uKTtcbiAgICBpZiAodGhpcy5jaGlsZFdpZGdldCkge1xuICAgICAgdGhpcy5jaGlsZFdpZGdldC53aXRoSW5oZXJpdGFuY2VDb250ZXh0KHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvdmVycmlkZSBkaXJlY3Rpb24oZGlyZWN0aW9uOiAncnRsJyB8ICdsdHInKTogSUZvcm1GaWVsZEJ1aWxkZXIge1xuICAgIHN1cGVyLmRpcmVjdGlvbihkaXJlY3Rpb24pO1xuICAgIGlmICh0aGlzLmNoaWxkV2lkZ2V0KSB7XG4gICAgICB0aGlzLmNoaWxkV2lkZ2V0LndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG92ZXJyaWRlIG1vZGUobW9kZTogQVhQV2lkZ2V0UmVuZGVyTW9kZSk6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICBzdXBlci5tb2RlKG1vZGUpO1xuICAgIGlmICh0aGlzLmNoaWxkV2lkZ2V0KSB7XG4gICAgICB0aGlzLmNoaWxkV2lkZ2V0LndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIHdpdGhJbmhlcml0YW5jZUNvbnRleHQgdG8gcGFzcyBpdCB0byB0aGUgY2hpbGQgd2lkZ2V0IGlmIGl0IGV4aXN0c1xuICBvdmVycmlkZSB3aXRoSW5oZXJpdGFuY2VDb250ZXh0KGNvbnRleHQ6IEluaGVyaXRhbmNlQ29udGV4dCk6IElGb3JtRmllbGRCdWlsZGVyIHtcbiAgICAvLyBDYWxsIHBhcmVudCBpbXBsZW1lbnRhdGlvbiBmaXJzdFxuICAgIHN1cGVyLndpdGhJbmhlcml0YW5jZUNvbnRleHQoY29udGV4dCk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgY2hpbGQgd2lkZ2V0LCB1cGRhdGUgaXRzIGluaGVyaXRhbmNlIGNvbnRleHQgdG9vXG4gICAgaWYgKHRoaXMuY2hpbGRXaWRnZXQpIHtcbiAgICAgIHRoaXMuY2hpbGRXaWRnZXQud2l0aEluaGVyaXRhbmNlQ29udGV4dCh0aGlzLmluaGVyaXRhbmNlQ29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPdmVycmlkZSBidWlsZCgpIHRvIGJ1aWxkIHRoZSBjaGlsZCB3aWRnZXQgYXQgdGhlIGxhc3QgbW9tZW50XG4gIG92ZXJyaWRlIGJ1aWxkKCk6IEFYUFdpZGdldE5vZGUge1xuICAgIC8vIEJ1aWxkIHRoZSBjaGlsZCB3aWRnZXQgYW5kIGFkZCBpdCB0byBjaGlsZHJlbiBiZWZvcmUgYnVpbGRpbmcgdGhlIGZvcm0gZmllbGRcbiAgICBpZiAodGhpcy5jaGlsZFdpZGdldCkge1xuICAgICAgdGhpcy5lbnN1cmVDaGlsZHJlbigpO1xuICAgICAgdGhpcy5jb250YWluZXJTdGF0ZS5jaGlsZHJlbiEucHVzaCh0aGlzLmNoaWxkV2lkZ2V0LmJ1aWxkKCkpO1xuICAgIH1cblxuICAgIC8vIENhbGwgcGFyZW50IGJ1aWxkXG4gICAgcmV0dXJuIHN1cGVyLmJ1aWxkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaWVsZHNldCBDb250YWluZXIgQnVpbGRlciAtIExpc2tvdiBTdWJzdGl0dXRpb24gUHJpbmNpcGxlXG4gKiBFeHRlbmRzIExheW91dENvbnRhaW5lck1peGluIHRvIGluaGVyaXQgbGF5b3V0IGZ1bmN0aW9uYWxpdHlcbiAqIFNwZWNpYWxpemVkIGZvciBmb3JtIGZpZWxkcyBvbmx5XG4gKi9cbmNsYXNzIEZpZWxkc2V0Q29udGFpbmVyQnVpbGRlclxuICBleHRlbmRzIExheW91dENvbnRhaW5lck1peGluPElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXI+XG4gIGltcGxlbWVudHMgSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdmaWVsZHNldC1sYXlvdXQnKTtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQRmllbGRzZXRDb250YWluZXJPcHRpb25zKTogSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlciB7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5vcHRpb25zID0geyAuLi50aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEluZGl2aWR1YWwgZmx1ZW50IG1ldGhvZHMgZm9yIEZpZWxkc2V0XG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgdGl0bGUgfSk7XG4gIH1cblxuICBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGRlc2NyaXB0aW9uIH0pO1xuICB9XG5cbiAgc2V0SWNvbihpY29uOiBzdHJpbmcpOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgaWNvbiB9KTtcbiAgfVxuXG4gIHNldENvbGxhcHNpYmxlKGNvbGxhcHNpYmxlOiBib29sZWFuKTogSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGNvbGxhcHNpYmxlIH0pO1xuICB9XG5cbiAgc2V0SXNPcGVuKGlzT3BlbjogYm9vbGVhbik6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBpc09wZW4gfSk7XG4gIH1cblxuICBzZXRMb29rKGxvb2s6ICdmaWVsZHNldCcgfCAnY2FyZCcgfCAnZ3JvdXAnIHwgJ2NvbnRhaW5lcicpOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgbG9vayB9KTtcbiAgfVxuXG4gIHNldFNob3dIZWFkZXIoc2hvd0hlYWRlcjogYm9vbGVhbik6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBzaG93SGVhZGVyIH0pO1xuICB9XG5cbiAgc2V0Q29scyhjb2xzOiBudW1iZXIpOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgY29scyB9KTtcbiAgfVxuXG4gIC8vIE9ubHkgZm9ybSBmaWVsZHMgYXJlIGFsbG93ZWQgaW4gZmllbGRzZXRcbiAgZm9ybUZpZWxkKGxhYmVsOiBzdHJpbmcsIGRlbGVnYXRlPzogKGZpZWxkOiBJRm9ybUZpZWxkQnVpbGRlcikgPT4gdm9pZCk6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXIge1xuICAgIGNvbnN0IGZpZWxkID0gbmV3IEZvcm1GaWVsZEJ1aWxkZXIobGFiZWwpO1xuICAgIGZpZWxkLndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUoZmllbGQpO1xuICAgIH1cbiAgICB0aGlzLmVuc3VyZUNoaWxkcmVuKCk7XG4gICAgdGhpcy5jb250YWluZXJTdGF0ZS5jaGlsZHJlbiEucHVzaChmaWVsZC5idWlsZCgpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIExpc3QgV2lkZ2V0IEJ1aWxkZXIgLSBMaXNrb3YgU3Vic3RpdHV0aW9uIFByaW5jaXBsZVxuICogRXh0ZW5kcyBXaWRnZXRDb250YWluZXJNaXhpbiB0byBpbmhlcml0IGFsbCBjb21tb24gZnVuY3Rpb25hbGl0eVxuICovXG5jbGFzcyBMaXN0V2lkZ2V0QnVpbGRlciBleHRlbmRzIFdpZGdldENvbnRhaW5lck1peGluPElMaXN0V2lkZ2V0QnVpbGRlcj4gaW1wbGVtZW50cyBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignZGF0YS1saXN0Jyk7XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdGlvbnM6IEFYUExpc3RXaWRnZXRPcHRpb25zKTogSUxpc3RXaWRnZXRCdWlsZGVyIHtcbiAgICB0aGlzLmNvbnRhaW5lclN0YXRlLm9wdGlvbnMgPSB7IC4uLnRoaXMuY29udGFpbmVyU3RhdGUub3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSW5kaXZpZHVhbCBmbHVlbnQgbWV0aG9kcyBmb3IgTGlzdCBXaWRnZXRcbiAgc2V0RGF0YVNvdXJjZShkYXRhU291cmNlOiBhbnlbXSk6IElMaXN0V2lkZ2V0QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGRhdGFTb3VyY2UgfSk7XG4gIH1cblxuICBzZXRDb2x1bW5zKGNvbHVtbnM6IGFueVtdKTogSUxpc3RXaWRnZXRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgY29sdW1ucyB9KTtcbiAgfVxuXG4gIC8vIEV2ZW50IGhhbmRsZXJzXG4gIHNldE9uUm93Q2xpY2soaGFuZGxlcjogKHJvdzogYW55KSA9PiB2b2lkKTogSUxpc3RXaWRnZXRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgb25Sb3dDbGljazogaGFuZGxlciB9KTtcbiAgfVxuXG4gIHNldE9uUm93RG91YmxlQ2xpY2soaGFuZGxlcjogKHJvdzogYW55KSA9PiB2b2lkKTogSUxpc3RXaWRnZXRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgb25Sb3dEb3VibGVDbGljazogaGFuZGxlciB9KTtcbiAgfVxuXG4gIHNldE9uU2VsZWN0aW9uQ2hhbmdlKGhhbmRsZXI6IChzZWxlY3RlZFJvd3M6IGFueVtdKSA9PiB2b2lkKTogSUxpc3RXaWRnZXRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgb25TZWxlY3Rpb25DaGFuZ2U6IGhhbmRsZXIgfSk7XG4gIH1cblxuICBzZXRPblJvd0NvbW1hbmQoaGFuZGxlcjogKGNvbW1hbmQ6IGFueSwgc2VsZWN0ZWRSb3dzOiBhbnlbXSkgPT4gdm9pZCk6IElMaXN0V2lkZ2V0QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IG9uUm93Q29tbWFuZDogaGFuZGxlciB9KTtcbiAgfVxuXG4gIC8vIFRhYmxlIGZlYXR1cmVzXG4gIHNldFBhZ2luZyhwYWdpbmc6IGJvb2xlYW4pOiBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBwYWdpbmcgfSk7XG4gIH1cblxuICBzZXRTaG93SGVhZGVyKHNob3c6IGJvb2xlYW4pOiBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBzaG93SGVhZGVyOiBzaG93IH0pO1xuICB9XG5cbiAgc2V0U2hvd0Zvb3RlcihzaG93OiBib29sZWFuKTogSUxpc3RXaWRnZXRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgc2hvd0Zvb3Rlcjogc2hvdyB9KTtcbiAgfVxuXG4gIHNldEZpeEhlYWRlcihmaXg6IGJvb2xlYW4pOiBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBmaXhIZWFkZXI6IGZpeCB9KTtcbiAgfVxuXG4gIHNldEZpeEZvb3RlcihmaXg6IGJvb2xlYW4pOiBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBmaXhGb290ZXI6IGZpeCB9KTtcbiAgfVxuXG4gIHNldEZldGNoRGF0YU1vZGUobW9kZTogJ2F1dG8nIHwgJ21hbnVhbCcpOiBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBmZXRjaERhdGFNb2RlOiBtb2RlIH0pO1xuICB9XG5cbiAgc2V0UGFyZW50RmllbGQoZmllbGQ6IHN0cmluZyk6IElMaXN0V2lkZ2V0QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IHBhcmVudEZpZWxkOiBmaWVsZCB9KTtcbiAgfVxuXG4gIHNldE1pbkhlaWdodChoZWlnaHQ6IHN0cmluZyB8IG51bWJlcik6IElMaXN0V2lkZ2V0QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IG1pbkhlaWdodDogaGVpZ2h0IH0pO1xuICB9XG5cbiAgLy8gU2VsZWN0aW9uICYgSW5kZXhcbiAgc2V0U2hvd0luZGV4KHNob3c6IGJvb2xlYW4pOiBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBzaG93SW5kZXg6IHNob3cgfSk7XG4gIH1cblxuICBzZXRBbGxvd1NlbGVjdGlvbihhbGxvdzogYm9vbGVhbik6IElMaXN0V2lkZ2V0QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGFsbG93U2VsZWN0aW9uOiBhbGxvdyB9KTtcbiAgfVxuXG4gIC8vIENvbW1hbmRzXG4gIHNldFByaW1hcnlDb21tYW5kcyhjb21tYW5kczogYW55W10pOiBJTGlzdFdpZGdldEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBwcmltYXJ5Q29tbWFuZHM6IGNvbW1hbmRzIH0pO1xuICB9XG5cbiAgc2V0U2Vjb25kYXJ5Q29tbWFuZHMoY29tbWFuZHM6IGFueVtdKTogSUxpc3RXaWRnZXRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgc2Vjb25kYXJ5Q29tbWFuZHM6IGNvbW1hbmRzIH0pO1xuICB9XG5cbiAgLy8gTG9hZGluZ1xuICBzZXRMb2FkaW5nKGxvYWRpbmc6IHsgZW5hYmxlZD86IGJvb2xlYW47IGFuaW1hdGlvbj86IGJvb2xlYW4gfSk6IElMaXN0V2lkZ2V0QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGxvYWRpbmcgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaWFsb2cgQ29udGFpbmVyIEJ1aWxkZXIgLSBTcGVjaWFsaXplZCBmb3IgZGlhbG9nIGZ1bmN0aW9uYWxpdHlcbiAqIFVzZXMgY29tcG9zaXRpb24gaW5zdGVhZCBvZiBpbmhlcml0YW5jZSBmb3IgY2xlYW5lciBzZXBhcmF0aW9uXG4gKi9cbmNsYXNzIERpYWxvZ0NvbnRhaW5lckJ1aWxkZXIgaW1wbGVtZW50cyBJRGlhbG9nQnVpbGRlciB7XG4gIHByaXZhdGUgZGlhbG9nU3RhdGU6IERpYWxvZ0J1aWxkZXJTdGF0ZSA9IHtcbiAgICB0eXBlOiAnZmxleC1sYXlvdXQnLCAvLyBUaGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuIGNvbnRlbnQgbGF5b3V0IGV4aXN0c1xuICAgIGNoaWxkcmVuOiBbXSxcbiAgICBtb2RlOiAnZWRpdCcsXG4gICAgZGlhbG9nT3B0aW9uczoge1xuICAgICAgdGl0bGU6ICcnLFxuICAgICAgc2l6ZTogJ21kJyxcbiAgICAgIGNsb3NlQnV0dG9uOiBmYWxzZSxcbiAgICB9LFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIGZvb3Rlcjoge1xuICAgICAgICBwcmVmaXg6IFtdLFxuICAgICAgICBzdWZmaXg6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHByaXZhdGUgcG9wdXBTZXJ2aWNlOiBBWFBvcHVwU2VydmljZTtcbiAgcHJpdmF0ZSBjb250ZW50TGF5b3V0PzogQVhQV2lkZ2V0Tm9kZTtcblxuICBjb25zdHJ1Y3Rvcihwb3B1cFNlcnZpY2U/OiBBWFBvcHVwU2VydmljZSkge1xuICAgIGlmIChwb3B1cFNlcnZpY2UpIHtcbiAgICAgIHRoaXMucG9wdXBTZXJ2aWNlID0gcG9wdXBTZXJ2aWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvcHVwU2VydmljZSA9IGluamVjdChBWFBvcHVwU2VydmljZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0T3B0aW9ucyhvcHRpb25zOiBBWFBEaWFsb2dDb250YWluZXJPcHRpb25zKTogSURpYWxvZ0J1aWxkZXIge1xuICAgIHRoaXMuZGlhbG9nU3RhdGUuZGlhbG9nT3B0aW9ucyA9IHsgLi4udGhpcy5kaWFsb2dTdGF0ZS5kaWFsb2dPcHRpb25zLCAuLi5vcHRpb25zIH07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEluZGl2aWR1YWwgZmx1ZW50IG1ldGhvZHMgZm9yIERpYWxvZ1xuICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogSURpYWxvZ0J1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyB0aXRsZSB9KTtcbiAgfVxuXG4gIHNldE1lc3NhZ2UobWVzc2FnZT86IHN0cmluZyk6IElEaWFsb2dCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25zKHsgbWVzc2FnZSB9KTtcbiAgfVxuXG4gIHNldFNpemUoc2l6ZTogYW55KTogSURpYWxvZ0J1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvbnMoeyBzaXplIH0pO1xuICB9XG5cbiAgc2V0Q2xvc2VCdXR0b24oY2xvc2VCdXR0b246IGJvb2xlYW4pOiBJRGlhbG9nQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGNsb3NlQnV0dG9uIH0pO1xuICB9XG5cbiAgc2V0Q29udGV4dChjb250ZXh0OiBhbnkpOiBJRGlhbG9nQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9ucyh7IGNvbnRleHQgfSk7XG4gIH1cblxuICBjb250ZW50KGRlbGVnYXRlOiAobGF5b3V0QnVpbGRlcjogSUZsZXhDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogSURpYWxvZ0J1aWxkZXIge1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgLy8gQ3JlYXRlIGEgZmxleCBjb250YWluZXIgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIExheW91dEJ1aWxkZXJcbiAgICAgIGNvbnN0IGZsZXhDb250YWluZXIgPSBuZXcgRmxleENvbnRhaW5lckJ1aWxkZXIoKTtcbiAgICAgIGZsZXhDb250YWluZXIuc2V0RGlyZWN0aW9uKCdjb2x1bW4nKTtcbiAgICAgIGZsZXhDb250YWluZXIuc2V0R2FwKCcxMHB4Jyk7XG5cbiAgICAgIGRlbGVnYXRlKGZsZXhDb250YWluZXIpO1xuICAgICAgdGhpcy5jb250ZW50TGF5b3V0ID0gZmxleENvbnRhaW5lci5idWlsZCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFjdGlvbnMoZGVsZWdhdGU/OiAoYWN0aW9uczogSUFjdGlvbkJ1aWxkZXIpID0+IHZvaWQpOiBJRGlhbG9nQnVpbGRlciB7XG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBjb25zdCBhY3Rpb25CdWlsZGVyID0gbmV3IEFjdGlvbkJ1aWxkZXIodGhpcyk7XG4gICAgICBkZWxlZ2F0ZShhY3Rpb25CdWlsZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRDdXN0b21BY3Rpb24oYWN0aW9uOiBBWFBBY3Rpb25NZW51SXRlbSk6IElEaWFsb2dCdWlsZGVyIHtcbiAgICAvLyBBZGQgdG8gYWN0aW9ucyBiYXNlZCBvbiBwb3NpdGlvblxuICAgIGNvbnN0IHBvc2l0aW9uID0gKGFjdGlvbiBhcyBhbnkpLnBvc2l0aW9uIHx8ICdzdWZmaXgnO1xuXG4gICAgaWYgKHBvc2l0aW9uID09PSAncHJlZml4Jykge1xuICAgICAgaWYgKCF0aGlzLmRpYWxvZ1N0YXRlLmFjdGlvbnMhLmZvb3RlciEucHJlZml4KSB7XG4gICAgICAgIHRoaXMuZGlhbG9nU3RhdGUuYWN0aW9ucyEuZm9vdGVyIS5wcmVmaXggPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nU3RhdGUuYWN0aW9ucyEuZm9vdGVyIS5wcmVmaXghLnB1c2goYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmRpYWxvZ1N0YXRlLmFjdGlvbnMhLmZvb3RlciEuc3VmZml4KSB7XG4gICAgICAgIHRoaXMuZGlhbG9nU3RhdGUuYWN0aW9ucyEuZm9vdGVyIS5zdWZmaXggPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nU3RhdGUuYWN0aW9ucyEuZm9vdGVyIS5zdWZmaXghLnB1c2goYWN0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEJ1aWxkIG1ldGhvZCB0byBjcmVhdGUgZGlhbG9nIG5vZGVcbiAgYnVpbGQoKTogQVhQV2lkZ2V0Tm9kZSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBjb250ZW50IGxheW91dCwgdXNlIGl0IGRpcmVjdGx5IHRvIGF2b2lkIGV4dHJhIHdyYXBwZXJcbiAgICBpZiAodGhpcy5jb250ZW50TGF5b3V0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLmNvbnRlbnRMYXlvdXQsXG4gICAgICAgIC8vIEFkZCBkaWFsb2ctc3BlY2lmaWMgcHJvcGVydGllc1xuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4udGhpcy5jb250ZW50TGF5b3V0Lm9wdGlvbnMsXG4gICAgICAgICAgLi4udGhpcy5kaWFsb2dTdGF0ZS5kaWFsb2dPcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBkaWFsb2cgc3RhdGUgc3RydWN0dXJlIGlmIG5vIGNvbnRlbnRcbiAgICBjb25zdCByZXN1bHQ6IEFYUFdpZGdldE5vZGUgPSB7XG4gICAgICAuLi50aGlzLmRpYWxvZ1N0YXRlLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG5cbiAgICAvLyBBZGQgZGlhbG9nLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBpZiAodGhpcy5kaWFsb2dTdGF0ZS5kaWFsb2dPcHRpb25zKSB7XG4gICAgICByZXN1bHQub3B0aW9ucyA9IHsgLi4ucmVzdWx0Lm9wdGlvbnMsIC4uLnRoaXMuZGlhbG9nU3RhdGUuZGlhbG9nT3B0aW9ucyB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBEaWFsb2ctc3BlY2lmaWMgbWV0aG9kc1xuICBhc3luYyBzaG93KCk6IFByb21pc2U8QVhQRGlhbG9nUmVmPiB7XG4gICAgY29uc3QgZGlhbG9nTm9kZSA9IHRoaXMuYnVpbGQoKTtcblxuICAgIC8vIEltcG9ydCB0aGUgZGlhbG9nIHJlbmRlcmVyIGNvbXBvbmVudCBkeW5hbWljYWxseVxuICAgIGNvbnN0IHsgQVhQRGlhbG9nUmVuZGVyZXJDb21wb25lbnQgfSA9IGF3YWl0IGltcG9ydCgnLi9kaWFsb2ctcmVuZGVyZXIuY29tcG9uZW50Jyk7XG5cbiAgICAvLyBDb2xsZWN0IGRlZmF1bHQgdmFsdWVzIGZyb20gd2lkZ2V0IHRyZWUgYW5kIG1lcmdlIGludG8gaW5pdGlhbCBjb250ZXh0XG4gICAgY29uc3QgaW5pdGlhbENvbnRleHQgPSB0aGlzLmRpYWxvZ1N0YXRlLmRpYWxvZ09wdGlvbnM/LmNvbnRleHQgfHwge307XG4gICAgY29uc3QgY29udGV4dFdpdGhEZWZhdWx0cyA9IGNvbGxlY3REZWZhdWx0VmFsdWVzKGRpYWxvZ05vZGUsIGluaXRpYWxDb250ZXh0KTtcblxuICAgIC8vIENyZWF0ZSBkaWFsb2cgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGRpYWxvZ0NvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB0aGlzLmRpYWxvZ1N0YXRlLmRpYWxvZ09wdGlvbnM/LnRpdGxlIHx8ICcnLFxuICAgICAgbWVzc2FnZTogdGhpcy5kaWFsb2dTdGF0ZS5kaWFsb2dPcHRpb25zPy5tZXNzYWdlLFxuICAgICAgY29udGV4dDogY29udGV4dFdpdGhEZWZhdWx0cyxcbiAgICAgIGRlZmluaXRpb246IGRpYWxvZ05vZGUsXG4gICAgICBhY3Rpb25zOiB0aGlzLmRpYWxvZ1N0YXRlLmFjdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIFRoZSBQcm9taXNlIHJlc29sdmVzIHdoZW4gdXNlciBjbGlja3MgYW4gYWN0aW9uIGJ1dHRvblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5wb3B1cFNlcnZpY2Uub3BlbihBWFBEaWFsb2dSZW5kZXJlckNvbXBvbmVudCwge1xuICAgICAgICB0aXRsZTogZGlhbG9nQ29uZmlnLnRpdGxlLFxuICAgICAgICBzaXplOiB0aGlzLmRpYWxvZ1N0YXRlLmRpYWxvZ09wdGlvbnM/LnNpemUgfHwgJ21kJyxcbiAgICAgICAgY2xvc2VCdXR0b246IHRoaXMuZGlhbG9nU3RhdGUuZGlhbG9nT3B0aW9ucz8uY2xvc2VCdXR0b24gfHwgZmFsc2UsXG4gICAgICAgIGNsb3NlT25CYWNrZHJvcENsaWNrOiBmYWxzZSxcbiAgICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGNvbmZpZzogZGlhbG9nQ29uZmlnLFxuICAgICAgICAgIGNhbGxCYWNrOiAocmVzdWx0OiBBWFBEaWFsb2dSZWYpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgd2l0aCB0aGUgZGlhbG9nIHJlZmVyZW5jZSB3aGVuIHVzZXIgY2xpY2tzIGFuIGFjdGlvblxuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uIC0tLS0gICBXaWRnZXQgQnVpbGRlciBJbXBsZW1lbnRhdGlvbiAgIC0tLS1cblxuLyoqXG4gKiBXaWRnZXQgQnVpbGRlciAtIFNpbmdsZSBSZXNwb25zaWJpbGl0eSBQcmluY2lwbGVcbiAqIEhhbmRsZXMgaW5kaXZpZHVhbCB3aWRnZXQgY29uZmlndXJhdGlvbiBhbmQgYnVpbGRpbmdcbiAqL1xuY2xhc3MgV2lkZ2V0QnVpbGRlciBpbXBsZW1lbnRzIElXaWRnZXRCdWlsZGVyIHtcbiAgcHJpdmF0ZSB3aWRnZXRTdGF0ZTogV2lkZ2V0QnVpbGRlclN0YXRlID0ge1xuICAgIHR5cGU6ICd3aWRnZXQnIGFzIGNvbnN0LFxuICAgIG9wdGlvbnM6IHt9IGFzIGFueSxcbiAgfTtcblxuICBwcml2YXRlIGluaGVyaXRhbmNlQ29udGV4dDogSW5oZXJpdGFuY2VDb250ZXh0ID0ge307XG5cbiAgY29uc3RydWN0b3IobmFtZT86IHN0cmluZykge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICB0aGlzLndpZGdldFN0YXRlLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgfVxuXG4gIHR5cGUodHlwZTogc3RyaW5nKTogSVdpZGdldEJ1aWxkZXIge1xuICAgIHRoaXMud2lkZ2V0U3RhdGUudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBuYW1lKG5hbWU6IHN0cmluZyk6IElXaWRnZXRCdWlsZGVyIHtcbiAgICB0aGlzLndpZGdldFN0YXRlLm5hbWUgPSBuYW1lO1xuICAgIGlmICghdGhpcy53aWRnZXRTdGF0ZS5wYXRoKSB7XG4gICAgICB0aGlzLndpZGdldFN0YXRlLnBhdGggPSBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHBhdGgocGF0aDogc3RyaW5nKTogSVdpZGdldEJ1aWxkZXIge1xuICAgIHRoaXMud2lkZ2V0U3RhdGUucGF0aCA9IHBhdGg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcHRpb25zKG9wdGlvbnM6IGFueSk6IElXaWRnZXRCdWlsZGVyIHtcbiAgICAvLyBFeHRyYWN0IGRlZmF1bHRWYWx1ZSBmcm9tIG9wdGlvbnMgLSBpdCdzIGFuIGV4Y2VwdGlvbmFsIHBhcmFtZXRlciB0aGF0IHVwZGF0ZXMgY29udGV4dCwgbm90IGEgd2lkZ2V0IG9wdGlvblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMud2lkZ2V0U3RhdGUuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgICAvLyBSZW1vdmUgZGVmYXVsdFZhbHVlIGZyb20gb3B0aW9ucyBzaW5jZSBpdCdzIHN0b3JlZCBvbiB0aGUgbm9kZSwgbm90IGluIG9wdGlvbnNcbiAgICAgIGNvbnN0IHsgZGVmYXVsdFZhbHVlOiBfLCAuLi5jbGVhbk9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgICAvLyBNZXJnZSBjbGVhbiBvcHRpb25zIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRvIHByZXNlcnZlIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLndpZGdldFN0YXRlLm9wdGlvbnMgPSB7IC4uLnRoaXMud2lkZ2V0U3RhdGUub3B0aW9ucywgLi4uY2xlYW5PcHRpb25zIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1lcmdlIG9wdGlvbnMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdG8gcHJlc2VydmUgaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgIHRoaXMud2lkZ2V0U3RhdGUub3B0aW9ucyA9IHsgLi4udGhpcy53aWRnZXRTdGF0ZS5vcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGF5b3V0KHZhbHVlOiBQYXJ0aWFsPEFYUEdyaWRMYXlvdXRPcHRpb25zPiB8IG51bWJlcik6IElXaWRnZXRCdWlsZGVyIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy53aWRnZXRTdGF0ZS5sYXlvdXQgPSB7XG4gICAgICAgIHBvc2l0aW9uczoge1xuICAgICAgICAgIHNtOiB7IGNvbFNwYW46IDEyIH0sXG4gICAgICAgICAgbWQ6IHsgY29sU3BhbjogMTIgfSxcbiAgICAgICAgICBsZzogeyBjb2xTcGFuOiB2YWx1ZSB9LFxuICAgICAgICAgIHhsOiB7IGNvbFNwYW46IHZhbHVlIH0sXG4gICAgICAgICAgeHhsOiB7IGNvbFNwYW46IHZhbHVlIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndpZGdldFN0YXRlLmxheW91dCA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vZGUobW9kZTogQVhQV2lkZ2V0UmVuZGVyTW9kZSk6IElXaWRnZXRCdWlsZGVyIHtcbiAgICB0aGlzLndpZGdldFN0YXRlLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0Lm1vZGUgPSBtb2RlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmlzaWJsZShjb25kaXRpb246IGJvb2xlYW4gfCBzdHJpbmcpOiBJV2lkZ2V0QnVpbGRlciB7XG4gICAgaWYgKCF0aGlzLndpZGdldFN0YXRlLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMud2lkZ2V0U3RhdGUub3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLndpZGdldFN0YXRlLm9wdGlvbnNbJ3Zpc2libGUnXSA9IGNvbmRpdGlvbjtcbiAgICB0aGlzLmluaGVyaXRhbmNlQ29udGV4dC52aXNpYmxlID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGlzYWJsZWQoY29uZGl0aW9uOiBib29sZWFuIHwgc3RyaW5nKTogSVdpZGdldEJ1aWxkZXIge1xuICAgIGlmICghdGhpcy53aWRnZXRTdGF0ZS5vcHRpb25zKSB7XG4gICAgICB0aGlzLndpZGdldFN0YXRlLm9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy53aWRnZXRTdGF0ZS5vcHRpb25zWydkaXNhYmxlZCddID0gY29uZGl0aW9uO1xuICAgIHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0LmRpc2FibGVkID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZTogYW55KTogSVdpZGdldEJ1aWxkZXIge1xuICAgIHRoaXMud2lkZ2V0U3RhdGUuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmVhZG9ubHkoY29uZGl0aW9uOiBib29sZWFuIHwgc3RyaW5nKTogSVdpZGdldEJ1aWxkZXIge1xuICAgIGlmICghdGhpcy53aWRnZXRTdGF0ZS5vcHRpb25zKSB7XG4gICAgICB0aGlzLndpZGdldFN0YXRlLm9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy53aWRnZXRTdGF0ZS5vcHRpb25zWydyZWFkb25seSddID0gY29uZGl0aW9uO1xuICAgIHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0LnJlYWRvbmx5ID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGlyZWN0aW9uKGRpcmVjdGlvbjogJ3J0bCcgfCAnbHRyJyk6IElXaWRnZXRCdWlsZGVyIHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0U3RhdGUub3B0aW9ucykge1xuICAgICAgdGhpcy53aWRnZXRTdGF0ZS5vcHRpb25zID0ge307XG4gICAgfVxuICAgIHRoaXMud2lkZ2V0U3RhdGUub3B0aW9uc1snZGlyZWN0aW9uJ10gPSBkaXJlY3Rpb247XG4gICAgdGhpcy5pbmhlcml0YW5jZUNvbnRleHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSW5oZXJpdGFuY2UgY29udGV4dCBtZXRob2RzXG4gIHdpdGhJbmhlcml0YW5jZUNvbnRleHQoY29udGV4dDogSW5oZXJpdGFuY2VDb250ZXh0KTogSVdpZGdldEJ1aWxkZXIge1xuICAgIHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0ID0gbWVyZ2VJbmhlcml0YW5jZUNvbnRleHQoY29udGV4dCk7XG5cbiAgICAvLyBBcHBseSBpbmhlcml0ZWQgcHJvcGVydGllcyB0byB3aWRnZXQgc3RhdGVcbiAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbmhlcml0ZWRQcm9wZXJ0aWVzKGNvbnRleHQsIHRoaXMuaW5oZXJpdGFuY2VDb250ZXh0KTtcblxuICAgIC8vIEFsd2F5cyBhcHBseSBpbmhlcml0ZWQgcHJvcGVydGllcyAocmVtb3ZlIHRoZSBjb25kaXRpb25zIHRoYXQgY2hlY2sgaWYgYWxyZWFkeSBzZXQpXG4gICAgLy8gVGhpcyBhbGxvd3MgcHJvcGVydGllcyB0byBiZSB1cGRhdGVkIHdoZW4gaW5oZXJpdGFuY2UgY29udGV4dCBjaGFuZ2VzXG4gICAgaWYgKHJlc29sdmVkLm1vZGUpIHtcbiAgICAgIHRoaXMud2lkZ2V0U3RhdGUubW9kZSA9IHJlc29sdmVkLm1vZGU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLndpZGdldFN0YXRlLm9wdGlvbnMpIHRoaXMud2lkZ2V0U3RhdGUub3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHJlc29sdmVkLmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMud2lkZ2V0U3RhdGUub3B0aW9uc1snZGlzYWJsZWQnXSA9IHJlc29sdmVkLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmIChyZXNvbHZlZC5yZWFkb25seSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLndpZGdldFN0YXRlLm9wdGlvbnNbJ3JlYWRvbmx5J10gPSByZXNvbHZlZC5yZWFkb25seTtcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZWQuZGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMud2lkZ2V0U3RhdGUub3B0aW9uc1snZGlyZWN0aW9uJ10gPSByZXNvbHZlZC5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVkLnZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy53aWRnZXRTdGF0ZS5vcHRpb25zWyd2aXNpYmxlJ10gPSByZXNvbHZlZC52aXNpYmxlO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLndpZGdldFN0YXRlLmRlZmF1bHRWYWx1ZSA9IGNvbnRleHQuZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0SW5oZXJpdGFuY2VDb250ZXh0KCk6IEluaGVyaXRhbmNlQ29udGV4dCB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5pbmhlcml0YW5jZUNvbnRleHQgfTtcbiAgfVxuXG4gIGJ1aWxkKCk6IEFYUFdpZGdldE5vZGUge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLndpZGdldFN0YXRlLm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLndpZGdldFN0YXRlLnR5cGUsXG4gICAgICBvcHRpb25zOiB0aGlzLndpZGdldFN0YXRlLm9wdGlvbnMsXG4gICAgICBtb2RlOiB0aGlzLndpZGdldFN0YXRlLm1vZGUsXG4gICAgICBwYXRoOiB0aGlzLndpZGdldFN0YXRlLnBhdGgsXG4gICAgICBkZWZhdWx0VmFsdWU6IHRoaXMud2lkZ2V0U3RhdGUuZGVmYXVsdFZhbHVlLFxuICAgIH07XG4gIH1cbn1cblxuLy8jcmVnaW9uIC0tLS0gICBBY3Rpb24gQnVpbGRlciBJbXBsZW1lbnRhdGlvbiAgIC0tLS1cblxuY2xhc3MgQWN0aW9uQnVpbGRlciBpbXBsZW1lbnRzIElBY3Rpb25CdWlsZGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2dCdWlsZGVyOiBEaWFsb2dDb250YWluZXJCdWlsZGVyKSB7IH1cblxuICBjYW5jZWwodGV4dD86IHN0cmluZyk6IElBY3Rpb25CdWlsZGVyIHtcbiAgICBpZiAoIXRoaXMuZGlhbG9nQnVpbGRlclsnZGlhbG9nU3RhdGUnXS5hY3Rpb25zIS5mb290ZXIhLnN1ZmZpeCkge1xuICAgICAgdGhpcy5kaWFsb2dCdWlsZGVyWydkaWFsb2dTdGF0ZSddLmFjdGlvbnMhLmZvb3RlciEuc3VmZml4ID0gW107XG4gICAgfVxuICAgIHRoaXMuZGlhbG9nQnVpbGRlclsnZGlhbG9nU3RhdGUnXS5hY3Rpb25zIS5mb290ZXIhLnN1ZmZpeCEucHVzaCh7XG4gICAgICB0aXRsZTogdGV4dCB8fCAnQGdlbmVyYWw6YWN0aW9ucy5jYW5jZWwudGl0bGUnLFxuICAgICAgaWNvbjogJ2ZhLXRpbWVzJyxcbiAgICAgIGNvbG9yOiAnZGVmYXVsdCcsXG4gICAgICBjb21tYW5kOiB7IG5hbWU6ICdjYW5jZWwnIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdWJtaXQodGV4dD86IHN0cmluZyk6IElBY3Rpb25CdWlsZGVyIHtcbiAgICBpZiAoIXRoaXMuZGlhbG9nQnVpbGRlclsnZGlhbG9nU3RhdGUnXS5hY3Rpb25zIS5mb290ZXIhLnN1ZmZpeCkge1xuICAgICAgdGhpcy5kaWFsb2dCdWlsZGVyWydkaWFsb2dTdGF0ZSddLmFjdGlvbnMhLmZvb3RlciEuc3VmZml4ID0gW107XG4gICAgfVxuICAgIHRoaXMuZGlhbG9nQnVpbGRlclsnZGlhbG9nU3RhdGUnXS5hY3Rpb25zIS5mb290ZXIhLnN1ZmZpeCEucHVzaCh7XG4gICAgICB0aXRsZTogdGV4dCB8fCAnQGdlbmVyYWw6YWN0aW9ucy5zdWJtaXQudGl0bGUnLFxuICAgICAgaWNvbjogJ2ZhLWNoZWNrJyxcbiAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICBjb21tYW5kOiB7IG5hbWU6ICdzdWJtaXQnLCBvcHRpb25zOiB7IHZhbGlkYXRlOiB0cnVlIH0gfSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGN1c3RvbShhY3Rpb246IEFYUEFjdGlvbk1lbnVJdGVtKTogSUFjdGlvbkJ1aWxkZXIge1xuICAgIGlmICghdGhpcy5kaWFsb2dCdWlsZGVyWydkaWFsb2dTdGF0ZSddLmFjdGlvbnMhLmZvb3RlciEuc3VmZml4KSB7XG4gICAgICB0aGlzLmRpYWxvZ0J1aWxkZXJbJ2RpYWxvZ1N0YXRlJ10uYWN0aW9ucyEuZm9vdGVyIS5zdWZmaXggPSBbXTtcbiAgICB9XG4gICAgdGhpcy5kaWFsb2dCdWlsZGVyWydkaWFsb2dTdGF0ZSddLmFjdGlvbnMhLmZvb3RlciEuc3VmZml4IS5wdXNoKGFjdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLy8jZW5kcmVnaW9uXG5cbi8vI3JlZ2lvbiAtLS0tICAgU3RlcCBXaXphcmQgQnVpbGRlciBJbXBsZW1lbnRhdGlvbiAgIC0tLS1cblxuLyoqXG4gKiBTdGVwIEJ1aWxkZXIgLSBCdWlsZHMgaW5kaXZpZHVhbCBzdGVwcyBmb3Igc3RlcCB3aXphcmRcbiAqL1xuY2xhc3MgU3RlcEJ1aWxkZXIge1xuICBwcml2YXRlIGljb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgc2tpcHBhYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgY29udGVudE5vZGU/OiBBWFBXaWRnZXROb2RlO1xuICBwcml2YXRlIGluaGVyaXRhbmNlQ29udGV4dDogSW5oZXJpdGFuY2VDb250ZXh0ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpZDogc3RyaW5nLFxuICAgIHByaXZhdGUgdGl0bGU6IHN0cmluZyxcbiAgKSB7IH1cblxuICBzZXRJY29uKGljb246IHN0cmluZyk6IFN0ZXBCdWlsZGVyIHtcbiAgICB0aGlzLmljb24gPSBpY29uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFN0ZXBCdWlsZGVyIHtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTa2lwcGFibGUoc2tpcHBhYmxlOiBib29sZWFuKTogU3RlcEJ1aWxkZXIge1xuICAgIHRoaXMuc2tpcHBhYmxlID0gc2tpcHBhYmxlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29udGVudChkZWxlZ2F0ZTogKGxheW91dEJ1aWxkZXI6IElMYXlvdXRCdWlsZGVyKSA9PiB2b2lkKTogU3RlcEJ1aWxkZXIge1xuICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgLy8gQ3JlYXRlIExheW91dEJ1aWxkZXIgaW4gaW5qZWN0aW9uIGNvbnRleHQgKHdpbGwgYmUgY2FsbGVkIGZyb20gY29tcG9uZW50KVxuICAgICAgY29uc3QgbGF5b3V0QnVpbGRlciA9IG5ldyBMYXlvdXRCdWlsZGVyKCk7XG5cbiAgICAgIC8vIOKchSBJTVBPUlRBTlQ6IFByb3BhZ2F0ZSBpbmhlcml0YW5jZSBjb250ZXh0IHRvIGNvbnRlbnRcbiAgICAgIChsYXlvdXRCdWlsZGVyIGFzIGFueSkuaW5oZXJpdGFuY2VDb250ZXh0ID0geyAuLi50aGlzLmluaGVyaXRhbmNlQ29udGV4dCB9O1xuXG4gICAgICBkZWxlZ2F0ZShsYXlvdXRCdWlsZGVyKTtcbiAgICAgIHRoaXMuY29udGVudE5vZGUgPSBsYXlvdXRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2l0aEluaGVyaXRhbmNlQ29udGV4dChjb250ZXh0OiBJbmhlcml0YW5jZUNvbnRleHQpOiBTdGVwQnVpbGRlciB7XG4gICAgdGhpcy5pbmhlcml0YW5jZUNvbnRleHQgPSBtZXJnZUluaGVyaXRhbmNlQ29udGV4dChjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkKCk6IEFYUFN0ZXBEZWZpbml0aW9uIHtcbiAgICBpZiAoIXRoaXMuY29udGVudE5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RlcCAnJHt0aGlzLmlkfScgbXVzdCBoYXZlIGNvbnRlbnRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGljb246IHRoaXMuaWNvbixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgc2tpcHBhYmxlOiB0aGlzLnNraXBwYWJsZSxcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudE5vZGUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN0ZXAgV2l6YXJkIEJ1aWxkZXIgLSBCdWlsZHMgc3RlcCB3aXphcmQgd2lkZ2V0XG4gKi9cbmNsYXNzIFN0ZXBXaXphcmRCdWlsZGVyIGV4dGVuZHMgTGF5b3V0Q29udGFpbmVyTWl4aW48SVN0ZXBXaXphcmRCdWlsZGVyPiBpbXBsZW1lbnRzIElTdGVwV2l6YXJkQnVpbGRlciB7XG4gIHByaXZhdGUgc3RlcHM6IEFYUFN0ZXBEZWZpbml0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBsaW5lYXIgPSB0cnVlO1xuICBwcml2YXRlIHdpemFyZERpcmVjdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyA9ICdob3Jpem9udGFsJztcbiAgcHJpdmF0ZSBsb29rPzogc3RyaW5nO1xuICBwcml2YXRlIHNob3dBY3Rpb25zPzogYm9vbGVhbjsgLy8gdW5kZWZpbmVkID0gYXV0by1kZXRlY3RcbiAgcHJpdmF0ZSB3aXphcmRBY3Rpb25zPzogQVhQV2l6YXJkQWN0aW9ucztcbiAgcHJpdmF0ZSBndWFyZHM/OiB7XG4gICAgbmV4dD86IChwYXlsb2FkOiBBWFBTdGVwV2l6YXJkR3VhcmRQYXlsb2FkKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcbiAgICBwcmV2PzogKHBheWxvYWQ6IEFYUFN0ZXBXaXphcmRHdWFyZFBheWxvYWQpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICB9O1xuICBwcml2YXRlIGV2ZW50cz86IHtcbiAgICBvblN0ZXBDaGFuZ2VkPzogKHN0YXR1czogQVhQU3RlcFdpemFyZFN0YXR1cykgPT4gdm9pZDtcbiAgICBvbkNvbXBsZXRlPzogKHN0YXR1czogQVhQU3RlcFdpemFyZFN0YXR1cykgPT4gdm9pZDtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignc3RlcC13aXphcmQnKTtcbiAgfVxuXG4gIHNldExpbmVhcihsaW5lYXI6IGJvb2xlYW4pOiBJU3RlcFdpemFyZEJ1aWxkZXIge1xuICAgIHRoaXMubGluZWFyID0gbGluZWFyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGlyZWN0aW9uKGRpcmVjdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyk6IElTdGVwV2l6YXJkQnVpbGRlciB7XG4gICAgdGhpcy53aXphcmREaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMb29rKGxvb2s6IHN0cmluZyk6IElTdGVwV2l6YXJkQnVpbGRlciB7XG4gICAgdGhpcy5sb29rID0gbG9vaztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFNob3dBY3Rpb25zKHNob3c6IGJvb2xlYW4pOiBJU3RlcFdpemFyZEJ1aWxkZXIge1xuICAgIHRoaXMuc2hvd0FjdGlvbnMgPSBzaG93O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QWN0aW9ucyhhY3Rpb25zOiBBWFBXaXphcmRBY3Rpb25zKTogSVN0ZXBXaXphcmRCdWlsZGVyIHtcbiAgICB0aGlzLndpemFyZEFjdGlvbnMgPSBhY3Rpb25zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0R3VhcmRzKGd1YXJkczoge1xuICAgIG5leHQ/OiAocGF5bG9hZDogQVhQU3RlcFdpemFyZEd1YXJkUGF5bG9hZCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG4gICAgcHJldj86IChwYXlsb2FkOiBBWFBTdGVwV2l6YXJkR3VhcmRQYXlsb2FkKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcbiAgfSk6IElTdGVwV2l6YXJkQnVpbGRlciB7XG4gICAgdGhpcy5ndWFyZHMgPSBndWFyZHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFdmVudHMoZXZlbnRzOiB7XG4gICAgb25TdGVwQ2hhbmdlZD86IChzdGF0dXM6IEFYUFN0ZXBXaXphcmRTdGF0dXMpID0+IHZvaWQ7XG4gICAgb25Db21wbGV0ZT86IChzdGF0dXM6IEFYUFN0ZXBXaXphcmRTdGF0dXMpID0+IHZvaWQ7XG4gIH0pOiBJU3RlcFdpemFyZEJ1aWxkZXIge1xuICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RlcChpZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBkZWxlZ2F0ZTogKHN0ZXA6IFN0ZXBCdWlsZGVyKSA9PiB2b2lkKTogSVN0ZXBXaXphcmRCdWlsZGVyIHtcbiAgICBjb25zdCBzdGVwQnVpbGRlciA9IG5ldyBTdGVwQnVpbGRlcihpZCwgdGl0bGUpO1xuXG4gICAgLy8g4pyFIElNUE9SVEFOVDogUHJvcGFnYXRlIGluaGVyaXRhbmNlIGNvbnRleHQgdG8gc3RlcFxuICAgIHN0ZXBCdWlsZGVyLndpdGhJbmhlcml0YW5jZUNvbnRleHQodGhpcy5pbmhlcml0YW5jZUNvbnRleHQpO1xuXG4gICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZShzdGVwQnVpbGRlcik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGVwcy5wdXNoKHN0ZXBCdWlsZGVyLmJ1aWxkKCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3ZlcnJpZGUgYnVpbGQoKTogQVhQV2lkZ2V0Tm9kZSB7XG4gICAgLy8g4pyFIFZhbGlkYXRpb25cbiAgICBpZiAodGhpcy5zdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3RlcFdpemFyZCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN0ZXAnKTtcbiAgICB9XG5cbiAgICAvLyDinIUgQ2hlY2sgZHVwbGljYXRlIElEc1xuICAgIGNvbnN0IGlkcyA9IHRoaXMuc3RlcHMubWFwKChzKSA9PiBzLmlkKTtcbiAgICBjb25zdCBkdXBsaWNhdGVzID0gaWRzLmZpbHRlcigoaWQsIGluZGV4KSA9PiBpZHMuaW5kZXhPZihpZCkgIT09IGluZGV4KTtcbiAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBzdGVwIElEcyBmb3VuZDogJHtkdXBsaWNhdGVzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmaW5pdGlvbjogQVhQU3RlcFdpemFyZERlZmluaXRpb24gPSB7XG4gICAgICBzdGVwczogdGhpcy5zdGVwcyxcbiAgICAgIGxpbmVhcjogdGhpcy5saW5lYXIsXG4gICAgICBkaXJlY3Rpb246IHRoaXMud2l6YXJkRGlyZWN0aW9uLFxuICAgICAgbG9vazogdGhpcy5sb29rLFxuICAgICAgLy8gRG8gbm90IGF1dG8tZGV0ZWN0IGJhc2VkIG9uIGRpYWxvZyBjb250ZXh0OyBrZWVwIGV4cGxpY2l0IG9yIHVuZGVmaW5lZFxuICAgICAgc2hvd0FjdGlvbnM6IHRoaXMuc2hvd0FjdGlvbnMsXG4gICAgICBhY3Rpb25zOiB0aGlzLndpemFyZEFjdGlvbnMsXG4gICAgICBndWFyZHM6IHRoaXMuZ3VhcmRzLFxuICAgICAgZXZlbnRzOiB0aGlzLmV2ZW50cyxcbiAgICB9O1xuXG4gICAgY29uc3Qgbm9kZTogQVhQV2lkZ2V0Tm9kZSA9IHtcbiAgICAgIG5hbWU6IHRoaXMuY29udGFpbmVyU3RhdGUubmFtZSxcbiAgICAgIHR5cGU6ICdzdGVwLXdpemFyZCcsXG4gICAgICBvcHRpb25zOiB7IGRlZmluaXRpb24gfSxcbiAgICAgIG1vZGU6IHRoaXMuY29udGFpbmVyU3RhdGUubW9kZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn1cblxuLy8jZW5kcmVnaW9uXG4iXX0=","import { AXFormComponent, AXFormModule } from '@acorex/components/form';\nimport { AXPPageStatus, AXPWidgetContainerComponent, AXPWidgetCoreModule, } from '@acorex/platform/layout/widget-core';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, inject, input, model, output, signal, viewChild, } from '@angular/core';\nimport { cloneDeep, isEqual } from 'lodash-es';\nimport { debounceTime, distinctUntilChanged, startWith, Subject } from 'rxjs';\nimport { AXPLayoutConversionService } from './layout-conversion.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@acorex/platform/layout/widget-core\";\nimport * as i2 from \"@acorex/components/form\";\nexport class AXPLayoutRendererComponent {\n constructor() {\n this.conversionService = inject(AXPLayoutConversionService);\n /**\n * RxJS subjects for context management\n */\n this.contextUpdateSubject = new Subject();\n this.contextChangeSubject = new Subject();\n //#region ---- Inputs ----\n /**\n * Form definition containing groups and fields OR widget tree\n */\n this.layout = input.required(...(ngDevMode ? [{ debugName: \"layout\" }] : []));\n /**\n * Form context/model data\n */\n this.context = model({}, ...(ngDevMode ? [{ debugName: \"context\" }] : []));\n /**\n * Form appearance and density styling (normal, compact, spacious)\n */\n this.look = input('fieldset', ...(ngDevMode ? [{ debugName: \"look\" }] : []));\n /**\n * Default form mode. Can be overridden by section/group and field.\n */\n this.mode = input('edit', ...(ngDevMode ? [{ debugName: \"mode\" }] : []));\n //#endregion\n //#region ---- Widget Tree Conversion ----\n this.widgetTree = signal(null, ...(ngDevMode ? [{ debugName: \"widgetTree\" }] : []));\n /**\n * Convert layout data to widget tree when inputs change\n */\n this.conversionEffect = effect(() => {\n const inputData = this.layout();\n // Convert to widget tree\n let tree;\n if (this.isFormDefinition(inputData)) {\n // Convert form definition to widget tree\n tree = this.conversionService.convertFormDefinition(inputData);\n }\n else if (this.isWidgetNode(inputData)) {\n // Use widget tree directly\n tree = inputData;\n }\n else {\n console.warn('AXPLayoutRendererComponent: Invalid layout input. Expected AXPDynamicFormDefinition or AXPWidgetNode.', inputData);\n return;\n }\n // Update widget tree only if changed (Angular effect already prevents unnecessary runs)\n const prev = this.widgetTree();\n if (!isEqual(prev, tree)) {\n this.widgetTree.set(tree);\n }\n }, ...(ngDevMode ? [{ debugName: \"conversionEffect\" }] : []));\n //#endregion\n //#region ---- Outputs ----\n /**\n * Emitted when context change is initiated\n */\n this.contextInitiated = output();\n /**\n * Emitted when form becomes valid/invalid\n */\n this.validityChange = output();\n //#endregion\n //#region ---- Properties ----\n this.form = viewChild(AXFormComponent, ...(ngDevMode ? [{ debugName: \"form\" }] : []));\n this.container = viewChild(AXPWidgetContainerComponent, ...(ngDevMode ? [{ debugName: \"container\" }] : []));\n /**\n * Internal context signal for reactivity\n */\n this.internalContext = signal({}, ...(ngDevMode ? [{ debugName: \"internalContext\" }] : []));\n /**\n * Initial context for reset functionality\n */\n this.initialContext = {};\n //#endregion\n //#region ---- Effects ----\n /**\n * Effect to sync context changes from external to internal (optimized with RxJS)\n */\n this.#contextSyncEffect = effect(() => {\n const ctx = this.context() ?? {};\n this.contextUpdateSubject.next(ctx);\n }, ...(ngDevMode ? [{ debugName: \"#contextSyncEffect\" }] : []));\n /**\n * Effect to handle widget tree status changes\n */\n this.#widgetStatusEffect = effect(() => {\n const widgetTree = this.widgetTree();\n if (widgetTree) {\n this.container()?.builderService.setStatus(AXPPageStatus.Rendered);\n }\n }, ...(ngDevMode ? [{ debugName: \"#widgetStatusEffect\" }] : []));\n }\n //#endregion\n //#region ---- Lifecycle Methods ----\n ngOnInit() {\n // Initialize internal context with input context\n const ctx = this.context() ?? {};\n this.internalContext.set(ctx);\n // Store initial context for reset functionality\n this.initialContext = cloneDeep(ctx);\n // Setup RxJS streams for context management\n this.setupContextStreams();\n }\n //#endregion\n //#region ---- Effects ----\n /**\n * Effect to sync context changes from external to internal (optimized with RxJS)\n */\n #contextSyncEffect;\n /**\n * Effect to handle widget tree status changes\n */\n #widgetStatusEffect;\n //#endregion\n //#region ---- Event Handlers ----\n /**\n * Handle context change events from widget container (optimized with RxJS)\n */\n handleContextChanged(event) {\n if (event.state === 'initiated') {\n this.contextInitiated.emit(event.data);\n }\n else {\n this.contextChangeSubject.next(event.data ?? {});\n }\n }\n //#endregion\n //#region ---- Public Methods ----\n /**\n * Get the form component instance\n */\n getForm() {\n return this.form();\n }\n /**\n * Get the widget container component instance\n */\n getContainer() {\n return this.container();\n }\n /**\n * Get current form context\n */\n getContext() {\n return this.internalContext();\n }\n /**\n * Update form context programmatically\n */\n updateContext(context) {\n this.internalContext.set(context);\n }\n /**\n * Get the current widget tree\n */\n getWidgetTree() {\n return this.widgetTree();\n }\n /**\n * Validate the form\n */\n async validate() {\n const form = this.form();\n if (form) {\n const isValid = await form.validate();\n this.validityChange.emit(isValid.result);\n return isValid;\n }\n return {\n result: false,\n messages: [],\n rules: [],\n };\n }\n /**\n * Clear the form context\n */\n clear() {\n // Clear internal context\n this.internalContext.set({});\n // Update the model signal\n this.context.set({});\n }\n /**\n * Reset the form to its initial state\n */\n reset() {\n // Reset to initial context\n const resetContext = cloneDeep(this.initialContext);\n this.internalContext.set(resetContext);\n // Update the model signal\n this.context.set(resetContext);\n }\n //#endregion\n //#region ---- RxJS Stream Setup ----\n /**\n * Setup RxJS streams for context management\n */\n setupContextStreams() {\n // Debounced context updates from external source\n this.contextUpdateSubject\n .pipe(debounceTime(16), // ~60fps\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)), startWith(this.context() ?? {}))\n .subscribe((ctx) => {\n this.internalContext.set(ctx);\n });\n // Debounced context changes from widgets\n this.contextChangeSubject\n .pipe(debounceTime(16), // ~60fps\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)))\n .subscribe((ctx) => {\n this.internalContext.set(ctx);\n // Update the model signal directly - it will emit change events automatically\n this.context.set(this.internalContext());\n });\n }\n //#endregion\n //#region ---- Type Guards ----\n /**\n * Type guard to check if the input is a form definition\n */\n isFormDefinition(data) {\n return data && typeof data === 'object' && 'groups' in data && Array.isArray(data.groups);\n }\n /**\n * Type guard to check if the input is a widget node\n */\n isWidgetNode(data) {\n return data && typeof data === 'object' && 'type' in data && typeof data.type === 'string';\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.12\", type: AXPLayoutRendererComponent, isStandalone: true, selector: \"axp-layout-renderer\", inputs: { layout: { classPropertyName: \"layout\", publicName: \"layout\", isSignal: true, isRequired: true, transformFunction: null }, context: { classPropertyName: \"context\", publicName: \"context\", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: \"look\", publicName: \"look\", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: \"mode\", publicName: \"mode\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { context: \"contextChange\", contextInitiated: \"contextInitiated\", validityChange: \"validityChange\" }, viewQueries: [{ propertyName: \"form\", first: true, predicate: AXFormComponent, descendants: true, isSignal: true }, { propertyName: \"container\", first: true, predicate: AXPWidgetContainerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `\n <ax-form>\n <axp-widgets-container [context]=\"internalContext()\" (onContextChanged)=\"handleContextChanged($event)\">\n @if (widgetTree()) {\n <ng-container axp-widget-renderer [node]=\"widgetTree()!\" [mode]=\"mode()\"></ng-container>\n }\n </axp-widgets-container>\n </ax-form>\n `, isInline: true, styles: [\":host{display:block;width:100%}\\n\"], dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"ngmodule\", type: AXPWidgetCoreModule }, { kind: \"component\", type: i1.AXPWidgetContainerComponent, selector: \"axp-widgets-container\", inputs: [\"context\", \"functions\"], outputs: [\"onContextChanged\"] }, { kind: \"directive\", type: i1.AXPWidgetRendererDirective, selector: \"[axp-widget-renderer]\", inputs: [\"parentNode\", \"index\", \"mode\", \"node\"], outputs: [\"onOptionsChanged\", \"onValueChanged\", \"onLoad\"], exportAs: [\"widgetRenderer\"] }, { kind: \"ngmodule\", type: AXFormModule }, { kind: \"component\", type: i2.AXFormComponent, selector: \"ax-form\", inputs: [\"disabled\", \"readonly\", \"labelMode\", \"look\", \"messageStyle\", \"updateOn\"], outputs: [\"onValidate\", \"updateOnChange\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPLayoutRendererComponent, decorators: [{\n type: Component,\n args: [{ selector: 'axp-layout-renderer', standalone: true, imports: [CommonModule, AXPWidgetCoreModule, AXFormModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `\n <ax-form>\n <axp-widgets-container [context]=\"internalContext()\" (onContextChanged)=\"handleContextChanged($event)\">\n @if (widgetTree()) {\n <ng-container axp-widget-renderer [node]=\"widgetTree()!\" [mode]=\"mode()\"></ng-container>\n }\n </axp-widgets-container>\n </ax-form>\n `, styles: [\":host{display:block;width:100%}\\n\"] }]\n }], propDecorators: { layout: [{ type: i0.Input, args: [{ isSignal: true, alias: \"layout\", required: true }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: \"context\", required: false }] }, { type: i0.Output, args: [\"contextChange\"] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: \"look\", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: \"mode\", required: false }] }], contextInitiated: [{ type: i0.Output, args: [\"contextInitiated\"] }], validityChange: [{ type: i0.Output, args: [\"validityChange\"] }], form: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXFormComponent), { isSignal: true }] }], container: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPWidgetContainerComponent), { isSignal: true }] }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2J1aWxkZXIvc3JjL2xpYi9sYXlvdXQtcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFeEUsT0FBTyxFQUNMLGFBQWEsRUFDYiwyQkFBMkIsRUFFM0IsbUJBQW1CLEdBRXBCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUF5QnpFLE1BQU0sT0FBTywwQkFBMEI7SUF2QnZDO1FBd0JVLHNCQUFpQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBRS9EOztXQUVHO1FBQ0sseUJBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUMxQyx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBRWxELDhCQUE4QjtRQUU5Qjs7V0FFRztRQUNILFdBQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxpREFBNEMsQ0FBQztRQUVwRTs7V0FFRztRQUNILFlB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WUFBWSw4QkFBRSxtQkFBbUIsd2FBQUUsWUFBWTs7NEZBb0I5QywwQkFBMEI7a0JBdkJ0QyxTQUFTOytCQUNFLHFCQUFxQixjQUNuQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLG1CQUN6Qyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7OztHQVFUO21uQkErRndCLGVBQWUsd0ZBQ1YsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhGb3JtQ29tcG9uZW50LCBBWEZvcm1Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgeyBBWFZhbGlkYXRpb25TdW1tYXJ5IH0gZnJvbSAnQGFjb3JleC9jb3JlL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHtcbiAgQVhQUGFnZVN0YXR1cyxcbiAgQVhQV2lkZ2V0Q29udGFpbmVyQ29tcG9uZW50LFxuICBBWFBXaWRnZXRDb3JlQ29udGV4dENoYW5nZUV2ZW50LFxuICBBWFBXaWRnZXRDb3JlTW9kdWxlLFxuICBBWFBXaWRnZXROb2RlLFxufSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC93aWRnZXQtY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgT25Jbml0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzdGFydFdpdGgsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFYUER5bmFtaWNGb3JtRGVmaW5pdGlvbiwgQVhQRHluYW1pY0Zvcm1Mb29rLCBBWFBEeW5hbWljRm9ybU1vZGUgfSBmcm9tICcuL2xheW91dC1idWlsZGVyLnR5cGVzJztcbmltcG9ydCB7IEFYUExheW91dENvbnZlcnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9sYXlvdXQtY29udmVyc2lvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXhwLWxheW91dC1yZW5kZXJlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEFYUFdpZGdldENvcmVNb2R1bGUsIEFYRm9ybU1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxheC1mb3JtPlxuICAgICAgPGF4cC13aWRnZXRzLWNvbnRhaW5lciBbY29udGV4dF09XCJpbnRlcm5hbENvbnRleHQoKVwiIChvbkNvbnRleHRDaGFuZ2VkKT1cImhhbmRsZUNvbnRleHRDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgQGlmICh3aWRnZXRUcmVlKCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIGF4cC13aWRnZXQtcmVuZGVyZXIgW25vZGVdPVwid2lkZ2V0VHJlZSgpIVwiIFttb2RlXT1cIm1vZGUoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICA8L2F4cC13aWRnZXRzLWNvbnRhaW5lcj5cbiAgICA8L2F4LWZvcm0+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFYUExheW91dFJlbmRlcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBjb252ZXJzaW9uU2VydmljZSA9IGluamVjdChBWFBMYXlvdXRDb252ZXJzaW9uU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIFJ4SlMgc3ViamVjdHMgZm9yIGNvbnRleHQgbWFuYWdlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBjb250ZXh0VXBkYXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBjb250ZXh0Q2hhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAvLyNyZWdpb24gLS0tLSAgIElucHV0cyAgIC0tLS1cblxuICAvKipcbiAgICogRm9ybSBkZWZpbml0aW9uIGNvbnRhaW5pbmcgZ3JvdXBzIGFuZCBmaWVsZHMgT1Igd2lkZ2V0IHRyZWVcbiAgICovXG4gIGxheW91dCA9IGlucHV0LnJlcXVpcmVkPEFYUER5bmFtaWNGb3JtRGVmaW5pdGlvbiB8IEFYUFdpZGdldE5vZGU+KCk7XG5cbiAgLyoqXG4gICAqIEZvcm0gY29udGV4dC9tb2RlbCBkYXRhXG4gICAqL1xuICBjb250ZXh0ID0gbW9kZWw8YW55Pih7fSk7XG5cbiAgLyoqXG4gICAqIEZvcm0gYXBwZWFyYW5jZSBhbmQgZGVuc2l0eSBzdHlsaW5nIChub3JtYWwsIGNvbXBhY3QsIHNwYWNpb3VzKVxuICAgKi9cbiAgbG9vayA9IGlucHV0PEFYUER5bmFtaWNGb3JtTG9vaz4oJ2ZpZWxkc2V0Jyk7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgZm9ybSBtb2RlLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzZWN0aW9uL2dyb3VwIGFuZCBmaWVsZC5cbiAgICovXG4gIG1vZGUgPSBpbnB1dDxBWFBEeW5hbWljRm9ybU1vZGU+KCdlZGl0Jyk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBXaWRnZXQgVHJlZSBDb252ZXJzaW9uICAgLS0tLVxuXG4gIHByb3RlY3RlZCB3aWRnZXRUcmVlID0gc2lnbmFsPEFYUFdpZGdldE5vZGUgfCBudWxsPihudWxsKTtcblxuICAvKipcbiAgICogQ29udmVydCBsYXlvdXQgZGF0YSB0byB3aWRnZXQgdHJlZSB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICovXG4gIGNvbnZlcnNpb25FZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0RGF0YSA9IHRoaXMubGF5b3V0KCk7XG5cbiAgICAvLyBDb252ZXJ0IHRvIHdpZGdldCB0cmVlXG4gICAgbGV0IHRyZWU6IEFYUFdpZGdldE5vZGU7XG5cbiAgICBpZiAodGhpcy5pc0Zvcm1EZWZpbml0aW9uKGlucHV0RGF0YSkpIHtcbiAgICAgIC8vIENvbnZlcnQgZm9ybSBkZWZpbml0aW9uIHRvIHdpZGdldCB0cmVlXG4gICAgICB0cmVlID0gdGhpcy5jb252ZXJzaW9uU2VydmljZS5jb252ZXJ0Rm9ybURlZmluaXRpb24oaW5wdXREYXRhKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNXaWRnZXROb2RlKGlucHV0RGF0YSkpIHtcbiAgICAgIC8vIFVzZSB3aWRnZXQgdHJlZSBkaXJlY3RseVxuICAgICAgdHJlZSA9IGlucHV0RGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnQVhQTGF5b3V0UmVuZGVyZXJDb21wb25lbnQ6IEludmFsaWQgbGF5b3V0IGlucHV0LiBFeHBlY3RlZCBBWFBEeW5hbWljRm9ybURlZmluaXRpb24gb3IgQVhQV2lkZ2V0Tm9kZS4nLFxuICAgICAgICBpbnB1dERhdGEsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB3aWRnZXQgdHJlZSBvbmx5IGlmIGNoYW5nZWQgKEFuZ3VsYXIgZWZmZWN0IGFscmVhZHkgcHJldmVudHMgdW5uZWNlc3NhcnkgcnVucylcbiAgICBjb25zdCBwcmV2ID0gdGhpcy53aWRnZXRUcmVlKCk7XG4gICAgaWYgKCFpc0VxdWFsKHByZXYsIHRyZWUpKSB7XG4gICAgICB0aGlzLndpZGdldFRyZWUuc2V0KHRyZWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBPdXRwdXRzICAgLS0tLVxuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gY29udGV4dCBjaGFuZ2UgaXMgaW5pdGlhdGVkXG4gICAqL1xuICBjb250ZXh0SW5pdGlhdGVkID0gb3V0cHV0PGFueT4oKTtcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGZvcm0gYmVjb21lcyB2YWxpZC9pbnZhbGlkXG4gICAqL1xuICB2YWxpZGl0eUNoYW5nZSA9IG91dHB1dDxib29sZWFuPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAtLS0tICAgUHJvcGVydGllcyAgIC0tLS1cblxuICBwcml2YXRlIGZvcm0gPSB2aWV3Q2hpbGQoQVhGb3JtQ29tcG9uZW50KTtcbiAgcHJpdmF0ZSBjb250YWluZXIgPSB2aWV3Q2hpbGQoQVhQV2lkZ2V0Q29udGFpbmVyQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogSW50ZXJuYWwgY29udGV4dCBzaWduYWwgZm9yIHJlYWN0aXZpdHlcbiAgICovXG4gIHByb3RlY3RlZCBpbnRlcm5hbENvbnRleHQgPSBzaWduYWw8YW55Pih7fSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgY29udGV4dCBmb3IgcmVzZXQgZnVuY3Rpb25hbGl0eVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsQ29udGV4dDogYW55ID0ge307XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBMaWZlY3ljbGUgTWV0aG9kcyAgIC0tLS1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsaXplIGludGVybmFsIGNvbnRleHQgd2l0aCBpbnB1dCBjb250ZXh0XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jb250ZXh0KCkgPz8ge307XG4gICAgdGhpcy5pbnRlcm5hbENvbnRleHQuc2V0KGN0eCk7XG5cbiAgICAvLyBTdG9yZSBpbml0aWFsIGNvbnRleHQgZm9yIHJlc2V0IGZ1bmN0aW9uYWxpdHlcbiAgICB0aGlzLmluaXRpYWxDb250ZXh0ID0gY2xvbmVEZWVwKGN0eCk7XG5cbiAgICAvLyBTZXR1cCBSeEpTIHN0cmVhbXMgZm9yIGNvbnRleHQgbWFuYWdlbWVudFxuICAgIHRoaXMuc2V0dXBDb250ZXh0U3RyZWFtcygpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBFZmZlY3RzICAgLS0tLVxuXG4gIC8qKlxuICAgKiBFZmZlY3QgdG8gc3luYyBjb250ZXh0IGNoYW5nZXMgZnJvbSBleHRlcm5hbCB0byBpbnRlcm5hbCAob3B0aW1pemVkIHdpdGggUnhKUylcbiAgICovXG4gICNjb250ZXh0U3luY0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jb250ZXh0KCkgPz8ge307XG4gICAgdGhpcy5jb250ZXh0VXBkYXRlU3ViamVjdC5uZXh0KGN0eCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBFZmZlY3QgdG8gaGFuZGxlIHdpZGdldCB0cmVlIHN0YXR1cyBjaGFuZ2VzXG4gICAqL1xuICAjd2lkZ2V0U3RhdHVzRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB3aWRnZXRUcmVlID0gdGhpcy53aWRnZXRUcmVlKCk7XG4gICAgaWYgKHdpZGdldFRyZWUpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyKCk/LmJ1aWxkZXJTZXJ2aWNlLnNldFN0YXR1cyhBWFBQYWdlU3RhdHVzLlJlbmRlcmVkKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAtLS0tICAgRXZlbnQgSGFuZGxlcnMgICAtLS0tXG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb250ZXh0IGNoYW5nZSBldmVudHMgZnJvbSB3aWRnZXQgY29udGFpbmVyIChvcHRpbWl6ZWQgd2l0aCBSeEpTKVxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZUNvbnRleHRDaGFuZ2VkKGV2ZW50OiBBWFBXaWRnZXRDb3JlQ29udGV4dENoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnN0YXRlID09PSAnaW5pdGlhdGVkJykge1xuICAgICAgdGhpcy5jb250ZXh0SW5pdGlhdGVkLmVtaXQoZXZlbnQuZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dENoYW5nZVN1YmplY3QubmV4dChldmVudC5kYXRhID8/IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gLS0tLSAgIFB1YmxpYyBNZXRob2RzICAgLS0tLVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZvcm0gY29tcG9uZW50IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgZ2V0Rm9ybSgpOiBBWEZvcm1Db21wb25lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdpZGdldCBjb250YWluZXIgY29tcG9uZW50IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGFpbmVyKCk6IEFYUFdpZGdldENvbnRhaW5lckNvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgZm9ybSBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmludGVybmFsQ29udGV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBmb3JtIGNvbnRleHQgcHJvZ3JhbW1hdGljYWxseVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNvbnRleHQoY29udGV4dDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbENvbnRleHQuc2V0KGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB3aWRnZXQgdHJlZVxuICAgKi9cbiAgcHVibGljIGdldFdpZGdldFRyZWUoKTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLndpZGdldFRyZWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgZm9ybVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKCk6IFByb21pc2U8QVhWYWxpZGF0aW9uU3VtbWFyeT4ge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm0oKTtcbiAgICBpZiAoZm9ybSkge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IGZvcm0udmFsaWRhdGUoKTtcbiAgICAgIHRoaXMudmFsaWRpdHlDaGFuZ2UuZW1pdChpc1ZhbGlkLnJlc3VsdCk7XG4gICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICBtZXNzYWdlczogW10sXG4gICAgICBydWxlczogW10sXG4gICAgfSBhcyBBWFZhbGlkYXRpb25TdW1tYXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBmb3JtIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBpbnRlcm5hbCBjb250ZXh0XG4gICAgdGhpcy5pbnRlcm5hbENvbnRleHQuc2V0KHt9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWwgc2lnbmFsXG4gICAgdGhpcy5jb250ZXh0LnNldCh7fSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGZvcm0gdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAvLyBSZXNldCB0byBpbml0aWFsIGNvbnRleHRcbiAgICBjb25zdCByZXNldENvbnRleHQgPSBjbG9uZURlZXAodGhpcy5pbml0aWFsQ29udGV4dCk7XG4gICAgdGhpcy5pbnRlcm5hbENvbnRleHQuc2V0KHJlc2V0Q29udGV4dCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIG1vZGVsIHNpZ25hbFxuICAgIHRoaXMuY29udGV4dC5zZXQocmVzZXRDb250ZXh0KTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAtLS0tICAgUnhKUyBTdHJlYW0gU2V0dXAgICAtLS0tXG5cbiAgLyoqXG4gICAqIFNldHVwIFJ4SlMgc3RyZWFtcyBmb3IgY29udGV4dCBtYW5hZ2VtZW50XG4gICAqL1xuICBwcml2YXRlIHNldHVwQ29udGV4dFN0cmVhbXMoKTogdm9pZCB7XG4gICAgLy8gRGVib3VuY2VkIGNvbnRleHQgdXBkYXRlcyBmcm9tIGV4dGVybmFsIHNvdXJjZVxuICAgIHRoaXMuY29udGV4dFVwZGF0ZVN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMTYpLCAvLyB+NjBmcHNcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IGlzRXF1YWwocHJldiwgY3VycikpLFxuICAgICAgICBzdGFydFdpdGgodGhpcy5jb250ZXh0KCkgPz8ge30pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY3R4KSA9PiB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb250ZXh0LnNldChjdHgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBEZWJvdW5jZWQgY29udGV4dCBjaGFuZ2VzIGZyb20gd2lkZ2V0c1xuICAgIHRoaXMuY29udGV4dENoYW5nZVN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMTYpLCAvLyB+NjBmcHNcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IGlzRXF1YWwocHJldiwgY3VycikpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY3R4KSA9PiB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb250ZXh0LnNldChjdHgpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIG1vZGVsIHNpZ25hbCBkaXJlY3RseSAtIGl0IHdpbGwgZW1pdCBjaGFuZ2UgZXZlbnRzIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgdGhpcy5jb250ZXh0LnNldCh0aGlzLmludGVybmFsQ29udGV4dCgpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBUeXBlIEd1YXJkcyAgIC0tLS1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCB0byBjaGVjayBpZiB0aGUgaW5wdXQgaXMgYSBmb3JtIGRlZmluaXRpb25cbiAgICovXG4gIHByaXZhdGUgaXNGb3JtRGVmaW5pdGlvbihkYXRhOiBhbnkpOiBkYXRhIGlzIEFYUER5bmFtaWNGb3JtRGVmaW5pdGlvbiB7XG4gICAgcmV0dXJuIGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICdncm91cHMnIGluIGRhdGEgJiYgQXJyYXkuaXNBcnJheShkYXRhLmdyb3Vwcyk7XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCB0byBjaGVjayBpZiB0aGUgaW5wdXQgaXMgYSB3aWRnZXQgbm9kZVxuICAgKi9cbiAgcHJpdmF0ZSBpc1dpZGdldE5vZGUoZGF0YTogYW55KTogZGF0YSBpcyBBWFBXaWRnZXROb2RlIHtcbiAgICByZXR1cm4gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ3R5cGUnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEudHlwZSA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { AXPLayoutBuilderService } from './layout-builder.service';\nimport { AXPLayoutRendererComponent } from './layout-renderer.component';\nimport * as i0 from \"@angular/core\";\nexport class LayoutBuilderModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: LayoutBuilderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.12\", ngImport: i0, type: LayoutBuilderModule, imports: [CommonModule, AXPLayoutRendererComponent], exports: [AXPLayoutRendererComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: LayoutBuilderModule, providers: [AXPLayoutBuilderService], imports: [CommonModule, AXPLayoutRendererComponent] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: LayoutBuilderModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [CommonModule, AXPLayoutRendererComponent],\n providers: [AXPLayoutBuilderService],\n exports: [AXPLayoutRendererComponent],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9sYXlvdXQvYnVpbGRlci9zcmMvbGliL2xheW91dC1idWlsZGVyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFPekUsTUFBTSxPQUFPLG1CQUFtQjsrR0FBbkIsbUJBQW1CO2dIQUFuQixtQkFBbUIsWUFKcEIsWUFBWSxFQUFFLDBCQUEwQixhQUV4QywwQkFBMEI7Z0hBRXpCLG1CQUFtQixhQUhuQixDQUFDLHVCQUF1QixDQUFDLFlBRDFCLFlBQVksRUFBRSwwQkFBMEI7OzRGQUl2QyxtQkFBbUI7a0JBTC9CLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLDBCQUEwQixDQUFDO29CQUNuRCxTQUFTLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDcEMsT0FBTyxFQUFFLENBQUMsMEJBQTBCLENBQUM7aUJBQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWFBMYXlvdXRCdWlsZGVyU2VydmljZSB9IGZyb20gJy4vbGF5b3V0LWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBWFBMYXlvdXRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEFYUExheW91dFJlbmRlcmVyQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbQVhQTGF5b3V0QnVpbGRlclNlcnZpY2VdLFxuICBleHBvcnRzOiBbQVhQTGF5b3V0UmVuZGVyZXJDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMYXlvdXRCdWlsZGVyTW9kdWxlIHt9XG4iXX0=","export {};\n//#endregion\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXIudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2xheW91dC9idWlsZGVyL3NyYy9saWIvbGF5b3V0LWJ1aWxkZXIudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQW8wQkEsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYRGF0YVNvdXJjZSB9IGZyb20gJ0BhY29yZXgvY2RrL2NvbW1vbic7XG5pbXBvcnQgeyBBWFBvcHVwU2l6ZVR5cGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvcG9wdXAnO1xuaW1wb3J0IHsgQVhTdGVwV2l6YXJkTG9vayB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9zdGVwLXdpemFyZCc7XG5pbXBvcnQge1xuICBBWFBBY3Rpb25NZW51SXRlbSxcbiAgQVhQRXhwcmVzc2lvbixcbiAgQVhQR3JpZExheW91dE9wdGlvbnMsXG4gIEFYUE9wdGlvbnNEYXRhLFxuICBBWFBWYWxpZGF0aW9uUnVsZXMsXG59IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vY29yZSc7XG5pbXBvcnQgeyBBWFBXaWRnZXROb2RlLCBBWFBXaWRnZXRSZW5kZXJNb2RlIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9sYXlvdXQvd2lkZ2V0LWNvcmUnO1xuXG4vKipcbiAqIEZvcm0gYXBwZWFyYW5jZSBhbmQgZGVuc2l0eSBzdHlsaW5nICh1c2luZyBmaWVsZHNldCB3aWRnZXQgbG9vaylcbiAqL1xuZXhwb3J0IHR5cGUgQVhQRHluYW1pY0Zvcm1Mb29rID0gJ2ZpZWxkc2V0JyB8ICdjYXJkJyB8ICdncm91cCcgfCAnY29udGFpbmVyJztcblxuLyoqXG4gKiBGb3JtIHJlbmRlcmluZyBtb2RlXG4gKi9cbmV4cG9ydCB0eXBlIEFYUER5bmFtaWNGb3JtTW9kZSA9ICd2aWV3JyB8ICdlZGl0JztcblxuLyoqXG4gKiBGb3JtIGxheW91dCBkaXJlY3Rpb24gYW5kIGZsb3dcbiAqL1xuZXhwb3J0IHR5cGUgQVhQRHluYW1pY0Zvcm1EaXJlY3Rpb24gPSAndmVydGljYWwnIHwgJ2hvcml6b250YWwnIHwgJ2dyaWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFYUER5bmFtaWNGb3JtRmllbGREZWZpbml0aW9uIHtcbiAgcGF0aDogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgYmFkZ2U/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB3aWRnZXQ6IEFYUFdpZGdldE5vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBwZXItZmllbGQgcmVuZGVyaW5nIG1vZGUuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBzZWN0aW9uIGFuZCBmb3JtIG1vZGVzLlxuICAgKi9cbiAgbW9kZT86IEFYUER5bmFtaWNGb3JtTW9kZTtcbiAgbGF5b3V0PzogQVhQR3JpZExheW91dE9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRHluYW1pY0Zvcm1Hcm91cERlZmluaXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcGFyYW1ldGVyczogQVhQRHluYW1pY0Zvcm1GaWVsZERlZmluaXRpb25bXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBlci1zZWN0aW9uIHJlbmRlcmluZyBtb2RlLiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgZm9ybSBtb2RlIGFuZCBpcyBvdmVycmlkZGVuIGJ5IGZpZWxkIG1vZGUuXG4gICAqL1xuICBtb2RlPzogQVhQRHluYW1pY0Zvcm1Nb2RlO1xuICAvKipcbiAgICogVmlzdWFsIGFwcGVhcmFuY2Ugb2YgdGhlIGdyb3VwIChmaWVsZHNldCwgY2FyZCwgZ3JvdXAsIGNvbnRhaW5lcilcbiAgICovXG4gIGxvb2s/OiAnZmllbGRzZXQnIHwgJ2NhcmQnIHwgJ2dyb3VwJyB8ICdjb250YWluZXInO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUER5bmFtaWNGb3JtRGVmaW5pdGlvbiB7XG4gIGdyb3VwczogQVhQRHluYW1pY0Zvcm1Hcm91cERlZmluaXRpb25bXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZvcm0tbGV2ZWwgcmVuZGVyaW5nIG1vZGVcbiAgICovXG4gIG1vZGU/OiBBWFBEeW5hbWljRm9ybU1vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGlhbG9nUmVmIHtcbiAgLyoqXG4gICAqIE1hbnVhbGx5IGNsb3NlIHRoZSBkaWFsb2cgKG9wdGlvbmFsIC0gZGlhbG9nIGNsb3NlcyBhdXRvbWF0aWNhbGx5IGFmdGVyIHVzZXIgaW50ZXJhY3Rpb24pXG4gICAqL1xuICBjbG9zZSgpOiB2b2lkO1xuICAvKipcbiAgICogR2V0IHRoZSBmb3JtIGRhdGEgZnJvbSB0aGUgZGlhbG9nXG4gICAqL1xuICBjb250ZXh0KCk6IGFueTtcbiAgLyoqXG4gICAqIEdldCB0aGUgYWN0aW9uIHRoYXQgd2FzIGNsaWNrZWQgYnkgdGhlIHVzZXJcbiAgICovXG4gIGFjdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBTZXQgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhlIGRpYWxvZ1xuICAgKi9cbiAgc2V0TG9hZGluZyhsb2FkaW5nOiBib29sZWFuKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBvcHRpb25zIGZvciBhIGZpZWxkIGFmdGVyIHRoZSBkaWFsb2cgaXMgc2hvd24gYW5kIHJlbmRlcmVkXG4gICAqL1xuICAvL3NldEZpZWxkT3B0aW9ucyhuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEFYUEZvcm1GaWVsZE9wdGlvbnMpOiB2b2lkO1xufVxuXG4vLyNyZWdpb24gLS0tLSAgIFdpZGdldCBPcHRpb25zIEludGVyZmFjZXMgICAtLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0V2lkZ2V0T3B0aW9ucyB7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVXaWRnZXRPcHRpb25zIGV4dGVuZHMgTGF5b3V0V2lkZ2V0T3B0aW9ucyB7XG4gIHBhdGg6IHN0cmluZzsgLy8gUmVxdWlyZWQgZm9yIGFsbCB2YWx1ZSB3aWRnZXRzXG4gIGRlZmF1bHRWYWx1ZT86IGFueSAvLyBzaG91bGQgdXBkYXRlIHRoZSB2YWx1ZSBpbiB0aGUgY29udGV4dDtcbiAgdmFsaWRhdGlvbnM/OiBBWFBWYWxpZGF0aW9uUnVsZXM7XG59XG5cbi8vIFdpZGdldCB0eXBlIG9wdGlvbnMgLSBvbmx5IGludGVybmFsIHdpZGdldCBiZWhhdmlvciwgbm8gc3R5bGluZy9sYXlvdXRcbmV4cG9ydCBpbnRlcmZhY2UgVGV4dEJveE9wdGlvbnMgZXh0ZW5kcyBWYWx1ZVdpZGdldE9wdGlvbnMge1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBtaW5MZW5ndGg/OiBudW1iZXI7XG4gIHByZWZpeD86IHN0cmluZztcbiAgc3VmZml4Pzogc3RyaW5nO1xuICBjbGVhckJ1dHRvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyQm94T3B0aW9ucyBleHRlbmRzIFZhbHVlV2lkZ2V0T3B0aW9ucyB7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBzdGVwPzogbnVtYmVyO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgZm9ybWF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEJveE9wdGlvbnMgZXh0ZW5kcyBWYWx1ZVdpZGdldE9wdGlvbnMge1xuICBkYXRhU291cmNlOiBhbnlbXSB8ICgoKSA9PiBhbnlbXSkgfCAoKCkgPT4gUHJvbWlzZTxhbnlbXT4pIHwgQVhEYXRhU291cmNlPGFueT47XG4gIHZhbHVlRmllbGQ/OiBzdHJpbmc7XG4gIHRleHRGaWVsZD86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIG11bHRpcGxlPzogYm9vbGVhbjtcbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIGNsZWFyQnV0dG9uPzogYm9vbGVhbjtcbiAgYWxsb3dTZWFyY2g/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUaW1lQm94T3B0aW9ucyBleHRlbmRzIFZhbHVlV2lkZ2V0T3B0aW9ucyB7XG4gIHR5cGU/OiAnZGF0ZScgfCAndGltZScgfCAnZGF0ZXRpbWUnO1xuICBmb3JtYXQ/OiBzdHJpbmc7XG4gIG1pbj86IERhdGUgfCBzdHJpbmc7XG4gIG1heD86IERhdGUgfCBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBjbGVhckJ1dHRvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9nZ2xlU3dpdGNoT3B0aW9ucyBleHRlbmRzIFZhbHVlV2lkZ2V0T3B0aW9ucyB7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB0cnVlVGV4dD86IHN0cmluZztcbiAgZmFsc2VUZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhcmdlVGV4dEJveE9wdGlvbnMgZXh0ZW5kcyBWYWx1ZVdpZGdldE9wdGlvbnMge1xuICByb3dzPzogbnVtYmVyO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIHJlc2l6YWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JCb3hPcHRpb25zIGV4dGVuZHMgVmFsdWVXaWRnZXRPcHRpb25zIHtcbiAgZm9ybWF0PzogJ2hleCcgfCAncmdiJyB8ICdoc2wnO1xuICBzaG93QWxwaGE/OiBib29sZWFuO1xuICBzaG93UGFsZXR0ZT86IGJvb2xlYW47XG59XG5cbi8vIENvbnRhaW5lci1zcGVjaWZpYyBvcHRpb25zIGJhc2VkIG9uIGFjdHVhbCB3aWRnZXQgY29uZmlnc1xuZXhwb3J0IGludGVyZmFjZSBBWFBGbGV4Q29udGFpbmVyT3B0aW9ucyBleHRlbmRzIExheW91dFdpZGdldE9wdGlvbnMge1xuICBmbGV4RGlyZWN0aW9uPzogJ3JvdycgfCAnY29sdW1uJyB8ICdyb3ctcmV2ZXJzZScgfCAnY29sdW1uLXJldmVyc2UnO1xuICBmbGV4V3JhcD86ICdub3dyYXAnIHwgJ3dyYXAnIHwgJ3dyYXAtcmV2ZXJzZSc7XG4gIGp1c3RpZnlDb250ZW50PzogJ2ZsZXgtc3RhcnQnIHwgJ2ZsZXgtZW5kJyB8ICdjZW50ZXInIHwgJ3NwYWNlLWJldHdlZW4nIHwgJ3NwYWNlLWFyb3VuZCcgfCAnc3BhY2UtZXZlbmx5JztcbiAgYWxpZ25JdGVtcz86ICdmbGV4LXN0YXJ0JyB8ICdmbGV4LWVuZCcgfCAnY2VudGVyJyB8ICdiYXNlbGluZScgfCAnc3RyZXRjaCc7XG4gIGdhcD86IHN0cmluZztcbiAgc3BhY2luZz86IHtcbiAgICBwYWRkaW5nPzogc3RyaW5nO1xuICAgIG1hcmdpbj86IHN0cmluZztcbiAgfTtcbiAgYm9yZGVyPzoge1xuICAgIHJhZGl1cz86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbiAgICBjb2xvcj86IHN0cmluZztcbiAgICBzdHlsZT86IHN0cmluZztcbiAgfTtcbiAgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICBkaXJlY3Rpb24/OiBzdHJpbmc7XG4gIG92ZXJmbG93Pzogc3RyaW5nO1xuICBvdmVyZmxvd1g/OiBzdHJpbmc7XG4gIG92ZXJmbG93WT86IHN0cmluZztcbiAgd2lkdGg/OiBzdHJpbmc7XG4gIG1pbldpZHRoPzogc3RyaW5nO1xuICBtYXhXaWR0aD86IHN0cmluZztcbiAgaGVpZ2h0Pzogc3RyaW5nO1xuICBtaW5IZWlnaHQ/OiBzdHJpbmc7XG4gIG1heEhlaWdodD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBHcmlkQ29udGFpbmVyT3B0aW9ucyBleHRlbmRzIExheW91dFdpZGdldE9wdGlvbnMge1xuICBncmlkPzoge1xuICAgIGRlZmF1bHQ/OiB7XG4gICAgICBjb2x1bW5zPzogbnVtYmVyO1xuICAgICAgcm93cz86IG51bWJlcjtcbiAgICAgIGdhcD86IHN0cmluZztcbiAgICAgIGp1c3RpZnlJdGVtcz86IHN0cmluZztcbiAgICAgIGFsaWduSXRlbXM/OiBzdHJpbmc7XG4gICAgICBhdXRvRmxvdz86IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBzcGFjaW5nPzoge1xuICAgIHBhZGRpbmc/OiBzdHJpbmc7XG4gICAgbWFyZ2luPzogc3RyaW5nO1xuICB9O1xuICBib3JkZXI/OiB7XG4gICAgcmFkaXVzPzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xuICAgIGNvbG9yPzogc3RyaW5nO1xuICAgIHN0eWxlPzogc3RyaW5nO1xuICB9O1xuICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIGRpcmVjdGlvbj86IHN0cmluZztcbiAgb3ZlcmZsb3c/OiBzdHJpbmc7XG4gIG92ZXJmbG93WD86IHN0cmluZztcbiAgb3ZlcmZsb3dZPzogc3RyaW5nO1xuICB3aWR0aD86IHN0cmluZztcbiAgbWluV2lkdGg/OiBzdHJpbmc7XG4gIG1heFdpZHRoPzogc3RyaW5nO1xuICBoZWlnaHQ/OiBzdHJpbmc7XG4gIG1pbkhlaWdodD86IHN0cmluZztcbiAgbWF4SGVpZ2h0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUFBhbmVsQ29udGFpbmVyT3B0aW9ucyBleHRlbmRzIExheW91dFdpZGdldE9wdGlvbnMge1xuICBjYXB0aW9uPzogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBsb29rPzogJ3NvbGlkJyB8ICdmaWxsJyB8ICdvdXRsaW5lJyB8ICdmbGF0JyB8ICdub25lJztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBzaG93SGVhZGVyPzogYm9vbGVhbjtcbiAgY29sbGFwc2VkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBQYWdlQ29udGFpbmVyT3B0aW9ucyBleHRlbmRzIExheW91dFdpZGdldE9wdGlvbnMge1xuICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIHRoZW1lPzogeyBpZDogc3RyaW5nIH07XG4gIGhhc0hlYWRlcj86IGJvb2xlYW47XG4gIGhhc0Zvb3Rlcj86IGJvb2xlYW47XG4gIGRpcmVjdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBUYWJzZXRDb250YWluZXJPcHRpb25zIGV4dGVuZHMgTGF5b3V0V2lkZ2V0T3B0aW9ucyB7XG4gIGxvb2s/OiAnd2l0aC1saW5lJyB8ICd3aXRoLWxpbmUtY29sb3InIHwgJ3BpbGxzJyB8ICdwaWxscy1jb2xvcic7XG4gIG9yaWVudGF0aW9uPzogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJztcbiAgYWN0aXZlSW5kZXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRmllbGRzZXRDb250YWluZXJPcHRpb25zIGV4dGVuZHMgTGF5b3V0V2lkZ2V0T3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgY29sbGFwc2libGU/OiBib29sZWFuO1xuICBpc09wZW4/OiBib29sZWFuO1xuICBsb29rPzogJ2ZpZWxkc2V0JyB8ICdjYXJkJyB8ICdncm91cCcgfCAnY29udGFpbmVyJztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBzaG93SGVhZGVyPzogYm9vbGVhbjtcbiAgY29scz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBGb3JtRmllbGRPcHRpb25zIGV4dGVuZHMgTGF5b3V0V2lkZ2V0T3B0aW9ucyB7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBzaG93TGFiZWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERpYWxvZ0NvbnRhaW5lck9wdGlvbnMgZXh0ZW5kcyBMYXlvdXRXaWRnZXRPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIHNpemU/OiBBWFBvcHVwU2l6ZVR5cGU7XG4gIGNsb3NlQnV0dG9uPzogYm9vbGVhbjtcbiAgY29udGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dE9wdGlvbnMgZXh0ZW5kcyBWYWx1ZVdpZGdldE9wdGlvbnMge1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdG9vbGJhcj86IHN0cmluZ1tdO1xuICByZWFkb25seT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRCb3hPcHRpb25zIGV4dGVuZHMgVmFsdWVXaWRnZXRPcHRpb25zIHtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIHJldmVhbFRvZ2dsZT86IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBCb3hPcHRpb25zIGV4dGVuZHMgVmFsdWVXaWRnZXRPcHRpb25zIHtcbiAgZGF0YVNvdXJjZT86IGFueVtdIHwgKCgpID0+IGFueVtdKSB8ICgoKSA9PiBQcm9taXNlPGFueVtdPik7XG4gIHZhbHVlRmllbGQ/OiBzdHJpbmc7XG4gIHRleHRGaWVsZD86IHN0cmluZztcbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIGVudGl0eT86IHN0cmluZztcbiAgbG9vaz86IHN0cmluZztcbiAgY29sdW1ucz86IGFueVtdO1xuICBleHBvc2U/OiBhbnlbXTtcbiAgbXVsdGlwbGU/OiBib29sZWFuO1xuICBhbGxvd0NsZWFyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25MaXN0T3B0aW9ucyBleHRlbmRzIFZhbHVlV2lkZ2V0T3B0aW9ucyB7XG4gIGRhdGFTb3VyY2U6IGFueVtdIHwgKCgpID0+IGFueVtdKSB8ICgoKSA9PiBQcm9taXNlPGFueVtdPikgfCBBWERhdGFTb3VyY2U8YW55PjtcbiAgdmFsdWVGaWVsZD86IHN0cmluZztcbiAgdGV4dEZpZWxkPzogc3RyaW5nO1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbn1cblxuLy8gTGlzdCBXaWRnZXQgVHlwZXNcbmV4cG9ydCBpbnRlcmZhY2UgQVhQTGlzdFdpZGdldENvbHVtbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHZpc2libGU/OiBib29sZWFuO1xuICB3aWR0aD86IHN0cmluZztcbiAgd2lkZ2V0Pzoge1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIG9wdGlvbnM/OiBhbnk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQTGlzdFdpZGdldFJvd0NvbW1hbmQge1xuICB0aXRsZT86IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgY29sb3I/OiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbiB8IHN0cmluZztcbiAgaGlkZGVuPzogYm9vbGVhbiB8IHN0cmluZztcbiAgY29tbWFuZD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBMaXN0V2lkZ2V0T3B0aW9ucyBleHRlbmRzIExheW91dFdpZGdldE9wdGlvbnMge1xuICBkYXRhU291cmNlPzogYW55W10gfCBBWERhdGFTb3VyY2U7XG4gIGNvbHVtbnM/OiBBWFBMaXN0V2lkZ2V0Q29sdW1uW107XG5cbiAgLy8gRXZlbnQgQ2FsbGJhY2tzXG4gIG9uUm93Q2xpY2s/OiAocm93OiBhbnkpID0+IHZvaWQ7XG4gIG9uUm93RG91YmxlQ2xpY2s/OiAocm93OiBhbnkpID0+IHZvaWQ7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlPzogKHNlbGVjdGVkUm93czogYW55W10pID0+IHZvaWQ7XG4gIG9uUm93Q29tbWFuZD86IChjb21tYW5kOiBhbnksIHNlbGVjdGVkUm93czogYW55W10pID0+IHZvaWQ7XG5cbiAgLy8gVGFibGUgRmVhdHVyZXNcbiAgcGFnaW5nPzogYm9vbGVhbjtcbiAgc2hvd0hlYWRlcj86IGJvb2xlYW47XG4gIHNob3dGb290ZXI/OiBib29sZWFuO1xuICBmaXhIZWFkZXI/OiBib29sZWFuO1xuICBmaXhGb290ZXI/OiBib29sZWFuO1xuICBmZXRjaERhdGFNb2RlPzogJ2F1dG8nIHwgJ21hbnVhbCc7XG4gIHBhcmVudEZpZWxkPzogc3RyaW5nO1xuICBtaW5IZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgLy8gU2VsZWN0aW9uICYgSW5kZXhcbiAgc2hvd0luZGV4PzogYm9vbGVhbjtcbiAgYWxsb3dTZWxlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8vIFJvdyBDb21tYW5kc1xuICBwcmltYXJ5Q29tbWFuZHM/OiBhbnlbXTtcbiAgc2Vjb25kYXJ5Q29tbWFuZHM/OiBBWFBMaXN0V2lkZ2V0Um93Q29tbWFuZFtdO1xuXG4gIC8vIExvYWRpbmcgU3RhdGVcbiAgbG9hZGluZz86IHtcbiAgICBlbmFibGVkPzogYm9vbGVhbjtcbiAgICBhbmltYXRpb24/OiBib29sZWFuO1xuICB9O1xufVxuXG4vLyBTdGVwIFdpemFyZCBUeXBlc1xuZXhwb3J0IGludGVyZmFjZSBBWFBXaXphcmRBY3Rpb25EZWZpbml0aW9uIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIGNvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUFdpemFyZEFjdGlvbnMge1xuICBwcmV2aW91cz86IEFYUFdpemFyZEFjdGlvbkRlZmluaXRpb247XG4gIG5leHQ/OiBBWFBXaXphcmRBY3Rpb25EZWZpbml0aW9uO1xuICBzdWJtaXQ/OiBBWFBXaXphcmRBY3Rpb25EZWZpbml0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUFN0ZXBEZWZpbml0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIHNraXBwYWJsZT86IGJvb2xlYW47XG4gIGNvbnRlbnQ6IEFYUFdpZGdldE5vZGU7XG4gIGFjdGlvbnM/OiBBWFBBY3Rpb25NZW51SXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUFN0ZXBXaXphcmRHdWFyZFBheWxvYWQge1xuICBzdGVwOiBBWFBTdGVwRGVmaW5pdGlvbjtcbiAgaW5kZXg6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgaXNGaXJzdDogYm9vbGVhbjtcbiAgaXNMYXN0OiBib29sZWFuO1xuICBjb250ZXh0OiBhbnk7XG4gIHN0ZXBDb250ZXh0PzogYW55O1xuICBkaWFsb2dDb250ZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUFN0ZXBXaXphcmRTdGF0dXMge1xuICBjdXJyZW50U3RlcDogQVhQU3RlcERlZmluaXRpb247XG4gIGluZGV4OiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGlzRmlyc3Q6IGJvb2xlYW47XG4gIGlzTGFzdDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBTdGVwV2l6YXJkRGVmaW5pdGlvbiB7XG4gIHN0ZXBzOiBBWFBTdGVwRGVmaW5pdGlvbltdO1xuICBsaW5lYXI/OiBib29sZWFuO1xuICBkaXJlY3Rpb24/OiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuICBsb29rPzogc3RyaW5nO1xuICBzaG93QWN0aW9ucz86IGJvb2xlYW47XG4gIGFjdGlvbnM/OiBBWFBXaXphcmRBY3Rpb25zO1xuICBndWFyZHM/OiB7XG4gICAgbmV4dD86IChwYXlsb2FkOiBBWFBTdGVwV2l6YXJkR3VhcmRQYXlsb2FkKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcbiAgICBwcmV2PzogKHBheWxvYWQ6IEFYUFN0ZXBXaXphcmRHdWFyZFBheWxvYWQpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICB9O1xuICBldmVudHM/OiB7XG4gICAgb25TdGVwQ2hhbmdlZD86IChzdGF0dXM6IEFYUFN0ZXBXaXphcmRTdGF0dXMpID0+IHZvaWQ7XG4gICAgb25Db21wbGV0ZT86IChzdGF0dXM6IEFYUFN0ZXBXaXphcmRTdGF0dXMpID0+IHZvaWQ7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQU3RlcFdpemFyZENvbnRhaW5lck9wdGlvbnMgZXh0ZW5kcyBMYXlvdXRXaWRnZXRPcHRpb25zIHtcbiAgZGVmaW5pdGlvbj86IEFYUFN0ZXBXaXphcmREZWZpbml0aW9uO1xufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uIC0tLS0gICBJbmhlcml0YW5jZSBDb250ZXh0IFR5cGVzICAgLS0tLVxuXG4vLyBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBjaXJjdWxhciByZWZlcmVuY2VcbmV4cG9ydCBpbnRlcmZhY2UgSURpYWxvZ0J1aWxkZXIgeyB9XG5cbi8vIENvbnRleHQgZm9yIGluaGVyaXRpbmcgcHJvcGVydGllcyBmcm9tIHBhcmVudCBub2Rlc1xuZXhwb3J0IGludGVyZmFjZSBJbmhlcml0YW5jZUNvbnRleHQge1xuICBtb2RlPzogQVhQV2lkZ2V0UmVuZGVyTW9kZTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuIHwgc3RyaW5nO1xuICByZWFkb25seT86IGJvb2xlYW4gfCBzdHJpbmc7XG4gIGRpcmVjdGlvbj86ICdydGwnIHwgJ2x0cic7XG4gIHZpc2libGU/OiBib29sZWFuIHwgc3RyaW5nO1xuICBkZWZhdWx0VmFsdWU/OiBhbnk7XG59XG5cbi8vIEhlbHBlciB0eXBlIGZvciByZXNvbHZpbmcgaW5oZXJpdGVkIHByb3BlcnRpZXNcbmV4cG9ydCBpbnRlcmZhY2UgSW5oZXJpdGVkUHJvcGVydGllcyB7XG4gIG1vZGU6IEFYUFdpZGdldFJlbmRlck1vZGU7XG4gIGRpc2FibGVkOiBib29sZWFuIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZGlyZWN0aW9uOiAncnRsJyB8ICdsdHInIHwgdW5kZWZpbmVkO1xuICB2aXNpYmxlOiBib29sZWFuIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uIC0tLS0gICBCdWlsZGVyIFN0YXRlIFR5cGVzICAgLS0tLVxuXG4vLyBCYXNlIHdpZGdldCBjb25maWd1cmF0aW9uIC0gbm8gcGF0aCBtYW5hZ2VtZW50IGhlcmVcbmV4cG9ydCBpbnRlcmZhY2UgQVhQV2lkZ2V0Q29uZmlndXJhdGlvbiB7XG4gIHR5cGU6IHN0cmluZztcbiAgb3B0aW9ucz86IEFYUE9wdGlvbnNEYXRhO1xufVxuXG4vLyBCdWlsZGVyIHN0YXRlIGludGVyZmFjZXNcbmV4cG9ydCB0eXBlIExheW91dEJ1aWxkZXJTdGF0ZSA9IEFYUFdpZGdldE5vZGU7XG5cbi8vIFdpZGdldEJ1aWxkZXJTdGF0ZSBtaXJyb3JzIEFYUFdpZGdldE5vZGUgYnV0IGludGVudGlvbmFsbHkgZXhjbHVkZXMgYGNoaWxkcmVuYCBmb3IgbW9zdCB3aWRnZXRzXG5leHBvcnQgdHlwZSBXaWRnZXRCdWlsZGVyU3RhdGUgPSBPbWl0PEFYUFdpZGdldE5vZGUsICdjaGlsZHJlbic+ICYgeyBsYXlvdXQ/OiBBWFBHcmlkTGF5b3V0T3B0aW9ucyB9O1xuXG4vLyBGb3JtRmllbGRCdWlsZGVyU3RhdGUgaW5jbHVkZXMgY2hpbGRyZW4gc2luY2UgZm9ybSBmaWVsZHMgY2FuIGNvbnRhaW4gd2lkZ2V0c1xuZXhwb3J0IHR5cGUgRm9ybUZpZWxkQnVpbGRlclN0YXRlID0gQVhQV2lkZ2V0Tm9kZSAmIHsgbGF5b3V0PzogQVhQR3JpZExheW91dE9wdGlvbnMgfTtcblxuLy8gRGlhbG9nQnVpbGRlclN0YXRlIGluY2x1ZGVzIGRpYWxvZy1zcGVjaWZpYyBwcm9wZXJ0aWVzXG5leHBvcnQgdHlwZSBEaWFsb2dCdWlsZGVyU3RhdGUgPSBBWFBXaWRnZXROb2RlICYge1xuICBsYXlvdXQ/OiBBWFBHcmlkTGF5b3V0T3B0aW9ucztcbiAgZGlhbG9nT3B0aW9ucz86IEFYUERpYWxvZ0NvbnRhaW5lck9wdGlvbnM7XG4gIGFjdGlvbnM/OiB7XG4gICAgZm9vdGVyPzoge1xuICAgICAgcHJlZml4PzogQVhQQWN0aW9uTWVudUl0ZW1bXTtcbiAgICAgIHN1ZmZpeD86IEFYUEFjdGlvbk1lbnVJdGVtW107XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbkJ1aWxkZXIge1xuICBjYW5jZWwodGV4dD86IHN0cmluZyk6IElBY3Rpb25CdWlsZGVyO1xuICBzdWJtaXQodGV4dD86IHN0cmluZyk6IElBY3Rpb25CdWlsZGVyO1xuICBjdXN0b20oYWN0aW9uOiBBWFBBY3Rpb25NZW51SXRlbSk6IElBY3Rpb25CdWlsZGVyO1xufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uIC0tLS0gICBDb3JlIEJ1aWxkZXIgSW50ZXJmYWNlcyAgIC0tLS1cblxuLy8gTWFpbiBsYXlvdXQgYnVpbGRlciBpbnRlcmZhY2UgLSBTaW5nbGUgUmVzcG9uc2liaWxpdHk6IExheW91dCBvcmNoZXN0cmF0aW9uXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCdWlsZGVyIHtcbiAgLy8gUHJlZGVmaW5lZCBsYXlvdXQgY29udGFpbmVycyBhdCByb290IGxldmVsIC0gb25seSB0aGVzZSBhcmUgYWxsb3dlZCB3aXRoIHNwZWNpZmljIHR5cGVzXG4gIGdyaWQoZGVsZWdhdGU6IChjb250YWluZXI6IElHcmlkQ29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IElMYXlvdXRCdWlsZGVyO1xuICBmbGV4KGRlbGVnYXRlOiAoY29udGFpbmVyOiBJRmxleENvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBJTGF5b3V0QnVpbGRlcjtcbiAgcGFuZWwoZGVsZWdhdGU6IChjb250YWluZXI6IElQYW5lbENvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBJTGF5b3V0QnVpbGRlcjtcbiAgcGFnZShkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSVBhZ2VDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogSUxheW91dEJ1aWxkZXI7XG4gIHRhYnNldChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSVRhYnNldENvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBJTGF5b3V0QnVpbGRlcjtcbiAgZmllbGRzZXQoZGVsZWdhdGU6IChjb250YWluZXI6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBJTGF5b3V0QnVpbGRlcjtcbiAgZGlhbG9nKGRlbGVnYXRlOiAoY29udGFpbmVyOiBJRGlhbG9nQnVpbGRlcikgPT4gdm9pZCk6IElEaWFsb2dCdWlsZGVyO1xuICBzdGVwV2l6YXJkKGRlbGVnYXRlOiAod2l6YXJkOiBJU3RlcFdpemFyZEJ1aWxkZXIpID0+IHZvaWQpOiBJTGF5b3V0QnVpbGRlcjtcblxuICAvLyBCdWlsZCBhbmQgcmVuZGVyXG4gIGJ1aWxkKCk6IEFYUFdpZGdldE5vZGU7XG4gIHRvSnNvbihvcHRpb25zPzoge1xuICAgIHJlbW92ZU1ldGE/OiBib29sZWFuO1xuICAgIHJlbW92ZUZ1bmN0aW9ucz86IGJvb2xlYW47XG4gICAgcHJldHR5PzogYm9vbGVhbjtcbiAgfSk6IHN0cmluZztcbn1cblxuLy8jZW5kcmVnaW9uXG5cbi8vI3JlZ2lvbiAtLS0tICAgV2lkZ2V0IEJ1aWxkZXIgSW50ZXJmYWNlcyAgIC0tLS1cblxuLy8gQmFzZSB3aWRnZXQgYnVpbGRlciBpbnRlcmZhY2UgLSBTaW5nbGUgUmVzcG9uc2liaWxpdHk6IFdpZGdldCBjb25maWd1cmF0aW9uXG5leHBvcnQgaW50ZXJmYWNlIElXaWRnZXRCdWlsZGVyIHtcbiAgbmFtZShuYW1lOiBzdHJpbmcpOiBJV2lkZ2V0QnVpbGRlcjtcbiAgcGF0aChwYXRoOiBzdHJpbmcpOiBJV2lkZ2V0QnVpbGRlcjtcbiAgdHlwZSh0eXBlOiBzdHJpbmcpOiBJV2lkZ2V0QnVpbGRlcjtcbiAgb3B0aW9ucyhvcHRpb25zOiBBWFBPcHRpb25zRGF0YSk6IElXaWRnZXRCdWlsZGVyO1xuXG4gIC8vIExheW91dFxuICBsYXlvdXQoY29uZmlnOiBQYXJ0aWFsPEFYUEdyaWRMYXlvdXRPcHRpb25zPik6IElXaWRnZXRCdWlsZGVyO1xuICBsYXlvdXQoY29sU3BhbjogbnVtYmVyKTogSVdpZGdldEJ1aWxkZXI7XG4gIG1vZGUobW9kZTogQVhQV2lkZ2V0UmVuZGVyTW9kZSk6IElXaWRnZXRCdWlsZGVyO1xuXG4gIC8vIFN0YXRlIChtYW5hZ2VkIGJ5IGhpZ2hlci1sZXZlbCBzeXN0ZW1zIGxpa2UgZHluYW1pYyBmb3JtcylcbiAgdmlzaWJsZShjb25kaXRpb246IGJvb2xlYW4gfCBzdHJpbmcpOiBJV2lkZ2V0QnVpbGRlcjtcbiAgZGlzYWJsZWQoY29uZGl0aW9uOiBib29sZWFuIHwgc3RyaW5nKTogSVdpZGdldEJ1aWxkZXI7XG4gIHJlYWRvbmx5KGNvbmRpdGlvbjogYm9vbGVhbiB8IHN0cmluZyk6IElXaWRnZXRCdWlsZGVyO1xuICBkZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlOiBhbnkpOiBJV2lkZ2V0QnVpbGRlcjtcbiAgZGlyZWN0aW9uKGRpcmVjdGlvbjogJ3J0bCcgfCAnbHRyJyk6IElXaWRnZXRCdWlsZGVyO1xuXG4gIC8vIEluaGVyaXRhbmNlIGNvbnRleHQgbWV0aG9kc1xuICB3aXRoSW5oZXJpdGFuY2VDb250ZXh0KGNvbnRleHQ6IEluaGVyaXRhbmNlQ29udGV4dCk6IElXaWRnZXRCdWlsZGVyO1xuICBnZXRJbmhlcml0YW5jZUNvbnRleHQoKTogSW5oZXJpdGFuY2VDb250ZXh0O1xuXG4gIC8vIEJ1aWxkXG4gIGJ1aWxkKCk6IEFYUFdpZGdldE5vZGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuXG4vLyNyZWdpb24gLS0tLSAgIENvbnRhaW5lciBCdWlsZGVyIEludGVyZmFjZXMgICAtLS0tXG5cbi8vIEJhc2UgY29udGFpbmVyIGJ1aWxkZXIgaW50ZXJmYWNlIC0gSW50ZXJmYWNlIFNlZ3JlZ2F0aW9uOiBDb21tb24gY29udGFpbmVyIG9wZXJhdGlvbnNcbmV4cG9ydCBpbnRlcmZhY2UgSUJhc2VDb250YWluZXJCdWlsZGVyPFRDb250YWluZXIgPSBhbnk+IHtcbiAgbmFtZShuYW1lOiBzdHJpbmcpOiBUQ29udGFpbmVyO1xuICBwYXRoKHBhdGg6IHN0cmluZyk6IFRDb250YWluZXI7XG4gIG1vZGUobW9kZTogQVhQV2lkZ2V0UmVuZGVyTW9kZSk6IFRDb250YWluZXI7XG4gIHZpc2libGUoY29uZGl0aW9uOiBib29sZWFuIHwgQVhQRXhwcmVzc2lvbik6IFRDb250YWluZXI7XG4gIGRpc2FibGVkKGNvbmRpdGlvbjogYm9vbGVhbiB8IEFYUEV4cHJlc3Npb24pOiBUQ29udGFpbmVyO1xuICByZWFkb25seShjb25kaXRpb246IGJvb2xlYW4gfCBBWFBFeHByZXNzaW9uKTogVENvbnRhaW5lcjtcbiAgZGlyZWN0aW9uKGRpcmVjdGlvbjogJ3J0bCcgfCAnbHRyJyk6IFRDb250YWluZXI7XG5cbiAgLy8gSW5oZXJpdGFuY2UgY29udGV4dCBtZXRob2RzXG4gIHdpdGhJbmhlcml0YW5jZUNvbnRleHQoY29udGV4dDogSW5oZXJpdGFuY2VDb250ZXh0KTogVENvbnRhaW5lcjtcbiAgZ2V0SW5oZXJpdGFuY2VDb250ZXh0KCk6IEluaGVyaXRhbmNlQ29udGV4dDtcblxuICBidWlsZCgpOiBBWFBXaWRnZXROb2RlO1xufVxuXG4vLyBMYXlvdXQtc3BlY2lmaWMgY29udGFpbmVyIG9wZXJhdGlvbnNcbmV4cG9ydCBpbnRlcmZhY2UgSUxheW91dENvbnRhaW5lckJ1aWxkZXI8VENvbnRhaW5lciA9IGFueT4ge1xuICBsYXlvdXQoY29uZmlnOiBQYXJ0aWFsPEFYUEdyaWRMYXlvdXRPcHRpb25zPik6IFRDb250YWluZXI7XG4gIGxheW91dChjb2xTcGFuOiBudW1iZXIpOiBUQ29udGFpbmVyO1xufVxuXG4vLyBDaGlsZCBjb250YWluZXIgbWFuYWdlbWVudFxuZXhwb3J0IGludGVyZmFjZSBJQ2hpbGRDb250YWluZXJCdWlsZGVyPFRDb250YWluZXIgPSBhbnk+IHtcbiAgZ3JpZChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSUdyaWRDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lcjtcbiAgZmxleChkZWxlZ2F0ZTogKGNvbnRhaW5lcjogSUZsZXhDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lcjtcbiAgcGFuZWwoZGVsZWdhdGU6IChjb250YWluZXI6IElQYW5lbENvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBUQ29udGFpbmVyO1xuICBwYWdlKGRlbGVnYXRlOiAoY29udGFpbmVyOiBJUGFnZUNvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBUQ29udGFpbmVyO1xuICB0YWJzZXQoZGVsZWdhdGU6IChjb250YWluZXI6IElUYWJzZXRDb250YWluZXJCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lcjtcbiAgZmllbGRzZXQoZGVsZWdhdGU6IChjb250YWluZXI6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXIpID0+IHZvaWQpOiBUQ29udGFpbmVyO1xuICBmb3JtRmllbGQobGFiZWw6IHN0cmluZywgZGVsZWdhdGU/OiAoZmllbGQ6IElGb3JtRmllbGRCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lcjtcbiAgc3RlcFdpemFyZChkZWxlZ2F0ZTogKHdpemFyZDogSVN0ZXBXaXphcmRCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lcjtcbiAgZHluYW1pY0Zvcm0oZGVmaW5pdGlvbjogQVhQRHluYW1pY0Zvcm1EZWZpbml0aW9uKTogVENvbnRhaW5lcjtcbn1cblxuLy8gV2lkZ2V0IGNyZWF0aW9uIG9wZXJhdGlvbnNcbmV4cG9ydCBpbnRlcmZhY2UgSVdpZGdldENvbnRhaW5lckJ1aWxkZXI8VENvbnRhaW5lciA9IGFueT4ge1xuICB0ZXh0Qm94KG9wdGlvbnM/OiBUZXh0Qm94T3B0aW9ucyk6IFRDb250YWluZXI7XG4gIGxhcmdlVGV4dEJveChvcHRpb25zPzogTGFyZ2VUZXh0Qm94T3B0aW9ucyk6IFRDb250YWluZXI7XG4gIHJpY2hUZXh0KG9wdGlvbnM/OiBSaWNoVGV4dE9wdGlvbnMpOiBUQ29udGFpbmVyO1xuICBwYXNzd29yZEJveChvcHRpb25zPzogUGFzc3dvcmRCb3hPcHRpb25zKTogVENvbnRhaW5lcjtcbiAgbnVtYmVyQm94KG9wdGlvbnM/OiBOdW1iZXJCb3hPcHRpb25zKTogVENvbnRhaW5lcjtcbiAgc2VsZWN0Qm94KG9wdGlvbnM6IFNlbGVjdEJveE9wdGlvbnMpOiBUQ29udGFpbmVyO1xuICBsb29rdXBCb3gob3B0aW9uczogTG9va3VwQm94T3B0aW9ucyk6IFRDb250YWluZXI7XG4gIHNlbGVjdGlvbkxpc3Qob3B0aW9uczogU2VsZWN0aW9uTGlzdE9wdGlvbnMpOiBUQ29udGFpbmVyO1xuICBkYXRlVGltZUJveChvcHRpb25zPzogRGF0ZVRpbWVCb3hPcHRpb25zKTogVENvbnRhaW5lcjtcbiAgdG9nZ2xlU3dpdGNoKG9wdGlvbnM/OiBUb2dnbGVTd2l0Y2hPcHRpb25zKTogVENvbnRhaW5lcjtcbiAgY29sb3JCb3gob3B0aW9ucz86IENvbG9yQm94T3B0aW9ucyk6IFRDb250YWluZXI7XG4gIGxpc3QoZGVsZWdhdGU6IChjb250YWluZXI6IElMaXN0V2lkZ2V0QnVpbGRlcikgPT4gdm9pZCk6IFRDb250YWluZXI7XG4gIGN1c3RvbVdpZGdldDxUPih0eXBlOiBzdHJpbmcsIG9wdGlvbnM/OiBUKTogVENvbnRhaW5lcjtcbiAgY3VzdG9tV2lkZ2V0PFQ+KHR5cGU6IHN0cmluZywgZGVsZWdhdGU6ICh3aWRnZXQ6IElXaWRnZXRCdWlsZGVyKSA9PiB2b2lkKTogVENvbnRhaW5lcjtcbn1cblxuLy8gRmxleCBjb250YWluZXIgYnVpbGRlciAtIEludGVyZmFjZSBTZWdyZWdhdGlvbjogQ29tYmluZXMgYWxsIGNvbnRhaW5lciBpbnRlcmZhY2VzXG5leHBvcnQgaW50ZXJmYWNlIElGbGV4Q29udGFpbmVyQnVpbGRlclxuICBleHRlbmRzIElCYXNlQ29udGFpbmVyQnVpbGRlcjxJRmxleENvbnRhaW5lckJ1aWxkZXI+LFxuICBJTGF5b3V0Q29udGFpbmVyQnVpbGRlcjxJRmxleENvbnRhaW5lckJ1aWxkZXI+LFxuICBJQ2hpbGRDb250YWluZXJCdWlsZGVyPElGbGV4Q29udGFpbmVyQnVpbGRlcj4sXG4gIElXaWRnZXRDb250YWluZXJCdWlsZGVyPElGbGV4Q29udGFpbmVyQnVpbGRlcj4ge1xuICAvLyBGbGV4LXNwZWNpZmljIG9wdGlvbnMgLSBib3RoIG9iamVjdCBhbmQgaW5kaXZpZHVhbCBtZXRob2RzXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQRmxleENvbnRhaW5lck9wdGlvbnMpOiBJRmxleENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldERpcmVjdGlvbihkaXJlY3Rpb246ICdyb3cnIHwgJ2NvbHVtbicgfCAncm93LXJldmVyc2UnIHwgJ2NvbHVtbi1yZXZlcnNlJyk6IElGbGV4Q29udGFpbmVyQnVpbGRlcjtcbiAgc2V0V3JhcCh3cmFwOiAnbm93cmFwJyB8ICd3cmFwJyB8ICd3cmFwLXJldmVyc2UnKTogSUZsZXhDb250YWluZXJCdWlsZGVyO1xuICBzZXRKdXN0aWZ5Q29udGVudChcbiAgICBqdXN0aWZ5OiAnZmxleC1zdGFydCcgfCAnZmxleC1lbmQnIHwgJ2NlbnRlcicgfCAnc3BhY2UtYmV0d2VlbicgfCAnc3BhY2UtYXJvdW5kJyB8ICdzcGFjZS1ldmVubHknLFxuICApOiBJRmxleENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEFsaWduSXRlbXMoYWxpZ246ICdmbGV4LXN0YXJ0JyB8ICdmbGV4LWVuZCcgfCAnY2VudGVyJyB8ICdiYXNlbGluZScgfCAnc3RyZXRjaCcpOiBJRmxleENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEdhcChnYXA6IHN0cmluZyk6IElGbGV4Q29udGFpbmVyQnVpbGRlcjtcbiAgc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yOiBzdHJpbmcpOiBJRmxleENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldFBhZGRpbmcocGFkZGluZzogc3RyaW5nKTogSUZsZXhDb250YWluZXJCdWlsZGVyO1xuICBzZXRNYXJnaW4obWFyZ2luOiBzdHJpbmcpOiBJRmxleENvbnRhaW5lckJ1aWxkZXI7XG59XG5cbi8vIEdyaWQgY29udGFpbmVyIGJ1aWxkZXIgLSBJbnRlcmZhY2UgU2VncmVnYXRpb246IENvbWJpbmVzIGFsbCBjb250YWluZXIgaW50ZXJmYWNlc1xuZXhwb3J0IGludGVyZmFjZSBJR3JpZENvbnRhaW5lckJ1aWxkZXJcbiAgZXh0ZW5kcyBJQmFzZUNvbnRhaW5lckJ1aWxkZXI8SUdyaWRDb250YWluZXJCdWlsZGVyPixcbiAgSUxheW91dENvbnRhaW5lckJ1aWxkZXI8SUdyaWRDb250YWluZXJCdWlsZGVyPixcbiAgSUNoaWxkQ29udGFpbmVyQnVpbGRlcjxJR3JpZENvbnRhaW5lckJ1aWxkZXI+LFxuICBJV2lkZ2V0Q29udGFpbmVyQnVpbGRlcjxJR3JpZENvbnRhaW5lckJ1aWxkZXI+IHtcbiAgLy8gR3JpZC1zcGVjaWZpYyBvcHRpb25zIC0gYm90aCBvYmplY3QgYW5kIGluZGl2aWR1YWwgbWV0aG9kc1xuICBzZXRPcHRpb25zKG9wdGlvbnM6IEFYUEdyaWRDb250YWluZXJPcHRpb25zKTogSUdyaWRDb250YWluZXJCdWlsZGVyO1xuICBzZXRDb2x1bW5zKGNvbHVtbnM6IG51bWJlcik6IElHcmlkQ29udGFpbmVyQnVpbGRlcjtcbiAgc2V0Um93cyhyb3dzOiBudW1iZXIpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEdhcChnYXA6IHN0cmluZyk6IElHcmlkQ29udGFpbmVyQnVpbGRlcjtcbiAgc2V0SnVzdGlmeUl0ZW1zKGp1c3RpZnk6ICdzdGFydCcgfCAnZW5kJyB8ICdjZW50ZXInIHwgJ3N0cmV0Y2gnKTogSUdyaWRDb250YWluZXJCdWlsZGVyO1xuICBzZXRBbGlnbkl0ZW1zKGFsaWduOiAnc3RhcnQnIHwgJ2VuZCcgfCAnY2VudGVyJyB8ICdzdHJldGNoJyk6IElHcmlkQ29udGFpbmVyQnVpbGRlcjtcbiAgc2V0QXV0b0Zsb3coZmxvdzogJ3JvdycgfCAnY29sdW1uJyB8ICdyb3cgZGVuc2UnIHwgJ2NvbHVtbiBkZW5zZScpOiBJR3JpZENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEJhY2tncm91bmRDb2xvcihjb2xvcjogc3RyaW5nKTogSUdyaWRDb250YWluZXJCdWlsZGVyO1xuICBzZXRQYWRkaW5nKHBhZGRpbmc6IHN0cmluZyk6IElHcmlkQ29udGFpbmVyQnVpbGRlcjtcbiAgc2V0TWFyZ2luKG1hcmdpbjogc3RyaW5nKTogSUdyaWRDb250YWluZXJCdWlsZGVyO1xufVxuXG4vLyBQYW5lbCBjb250YWluZXIgYnVpbGRlciAtIEludGVyZmFjZSBTZWdyZWdhdGlvbjogQ29tYmluZXMgYWxsIGNvbnRhaW5lciBpbnRlcmZhY2VzXG5leHBvcnQgaW50ZXJmYWNlIElQYW5lbENvbnRhaW5lckJ1aWxkZXJcbiAgZXh0ZW5kcyBJQmFzZUNvbnRhaW5lckJ1aWxkZXI8SVBhbmVsQ29udGFpbmVyQnVpbGRlcj4sXG4gIElMYXlvdXRDb250YWluZXJCdWlsZGVyPElQYW5lbENvbnRhaW5lckJ1aWxkZXI+LFxuICBJQ2hpbGRDb250YWluZXJCdWlsZGVyPElQYW5lbENvbnRhaW5lckJ1aWxkZXI+LFxuICBJV2lkZ2V0Q29udGFpbmVyQnVpbGRlcjxJUGFuZWxDb250YWluZXJCdWlsZGVyPiB7XG4gIC8vIFBhbmVsLXNwZWNpZmljIG9wdGlvbnNcbiAgc2V0T3B0aW9ucyhvcHRpb25zOiBBWFBQYW5lbENvbnRhaW5lck9wdGlvbnMpOiBJUGFuZWxDb250YWluZXJCdWlsZGVyO1xuICBzZXRDYXB0aW9uKGNhcHRpb246IHN0cmluZyk6IElQYW5lbENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEljb24oaWNvbjogc3RyaW5nKTogSVBhbmVsQ29udGFpbmVyQnVpbGRlcjtcbiAgc2V0TG9vayhsb29rOiAnc29saWQnIHwgJ2ZpbGwnIHwgJ291dGxpbmUnIHwgJ2ZsYXQnIHwgJ25vbmUnKTogSVBhbmVsQ29udGFpbmVyQnVpbGRlcjtcbiAgc2V0U2hvd0hlYWRlcihzaG93OiBib29sZWFuKTogSVBhbmVsQ29udGFpbmVyQnVpbGRlcjtcbiAgc2V0Q29sbGFwc2VkKGNvbGxhcHNlZDogYm9vbGVhbik6IElQYW5lbENvbnRhaW5lckJ1aWxkZXI7XG59XG5cbi8vIFBhZ2UgY29udGFpbmVyIGJ1aWxkZXIgLSBJbnRlcmZhY2UgU2VncmVnYXRpb246IENvbWJpbmVzIGFsbCBjb250YWluZXIgaW50ZXJmYWNlc1xuZXhwb3J0IGludGVyZmFjZSBJUGFnZUNvbnRhaW5lckJ1aWxkZXJcbiAgZXh0ZW5kcyBJQmFzZUNvbnRhaW5lckJ1aWxkZXI8SVBhZ2VDb250YWluZXJCdWlsZGVyPixcbiAgSUxheW91dENvbnRhaW5lckJ1aWxkZXI8SVBhZ2VDb250YWluZXJCdWlsZGVyPixcbiAgSUNoaWxkQ29udGFpbmVyQnVpbGRlcjxJUGFnZUNvbnRhaW5lckJ1aWxkZXI+LFxuICBJV2lkZ2V0Q29udGFpbmVyQnVpbGRlcjxJUGFnZUNvbnRhaW5lckJ1aWxkZXI+IHtcbiAgLy8gUGFnZS1zcGVjaWZpYyBvcHRpb25zXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQUGFnZUNvbnRhaW5lck9wdGlvbnMpOiBJUGFnZUNvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEJhY2tncm91bmRDb2xvcihjb2xvcjogc3RyaW5nKTogSVBhZ2VDb250YWluZXJCdWlsZGVyO1xuICBzZXRUaGVtZSh0aGVtZTogeyBpZDogc3RyaW5nIH0pOiBJUGFnZUNvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEhhc0hlYWRlcihoYXNIZWFkZXI6IGJvb2xlYW4pOiBJUGFnZUNvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEhhc0Zvb3RlcihoYXNGb290ZXI6IGJvb2xlYW4pOiBJUGFnZUNvbnRhaW5lckJ1aWxkZXI7XG4gIHNldERpcmVjdGlvbihkaXJlY3Rpb246ICdydGwnIHwgJ2x0cicpOiBJUGFnZUNvbnRhaW5lckJ1aWxkZXI7XG59XG5cbi8vIFRhYnNldCBjb250YWluZXIgYnVpbGRlciAtIEludGVyZmFjZSBTZWdyZWdhdGlvbjogQ29tYmluZXMgYWxsIGNvbnRhaW5lciBpbnRlcmZhY2VzXG5leHBvcnQgaW50ZXJmYWNlIElUYWJzZXRDb250YWluZXJCdWlsZGVyXG4gIGV4dGVuZHMgSUJhc2VDb250YWluZXJCdWlsZGVyPElUYWJzZXRDb250YWluZXJCdWlsZGVyPixcbiAgSUxheW91dENvbnRhaW5lckJ1aWxkZXI8SVRhYnNldENvbnRhaW5lckJ1aWxkZXI+LFxuICBJQ2hpbGRDb250YWluZXJCdWlsZGVyPElUYWJzZXRDb250YWluZXJCdWlsZGVyPixcbiAgSVdpZGdldENvbnRhaW5lckJ1aWxkZXI8SVRhYnNldENvbnRhaW5lckJ1aWxkZXI+IHtcbiAgLy8gVGFic2V0LXNwZWNpZmljIG9wdGlvbnNcbiAgc2V0T3B0aW9ucyhvcHRpb25zOiBBWFBUYWJzZXRDb250YWluZXJPcHRpb25zKTogSVRhYnNldENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldExvb2sobG9vazogJ3dpdGgtbGluZScgfCAnd2l0aC1saW5lLWNvbG9yJyB8ICdwaWxscycgfCAncGlsbHMtY29sb3InKTogSVRhYnNldENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldE9yaWVudGF0aW9uKG9yaWVudGF0aW9uOiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnKTogSVRhYnNldENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldEFjdGl2ZUluZGV4KGluZGV4OiBudW1iZXIpOiBJVGFic2V0Q29udGFpbmVyQnVpbGRlcjtcbn1cblxuLy8gRm9ybSBmaWVsZCBidWlsZGVyIC0gSW50ZXJmYWNlIFNlZ3JlZ2F0aW9uOiBDb21iaW5lcyBiYXNlIGFuZCB3aWRnZXQgaW50ZXJmYWNlc1xuLy8gRm9ybSBmaWVsZHMgY2FuIG9ubHkgY29udGFpbiBPTkUgd2lkZ2V0XG5leHBvcnQgaW50ZXJmYWNlIElGb3JtRmllbGRCdWlsZGVyXG4gIGV4dGVuZHMgSUJhc2VDb250YWluZXJCdWlsZGVyPElGb3JtRmllbGRCdWlsZGVyPixcbiAgSUxheW91dENvbnRhaW5lckJ1aWxkZXI8SUZvcm1GaWVsZEJ1aWxkZXI+IHtcbiAgLy8gRm9ybSBmaWVsZCBzcGVjaWZpYyBvcHRpb25zXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQRm9ybUZpZWxkT3B0aW9ucyk6IElGb3JtRmllbGRCdWlsZGVyO1xuICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKTogSUZvcm1GaWVsZEJ1aWxkZXI7XG4gIHNldFNob3dMYWJlbChzaG93TGFiZWw6IGJvb2xlYW4pOiBJRm9ybUZpZWxkQnVpbGRlcjtcbiAgZGVmYXVsdFZhbHVlKHZhbHVlOiBhbnkpOiBJRm9ybUZpZWxkQnVpbGRlcjtcblxuICAvLyBTaW5nbGUgd2lkZ2V0IG1ldGhvZHMgKHJlcGxhY2VzIElXaWRnZXRDb250YWluZXJCdWlsZGVyKVxuICB0ZXh0Qm94KG9wdGlvbnM/OiBPbWl0PFRleHRCb3hPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXI7XG4gIGxhcmdlVGV4dEJveChvcHRpb25zPzogT21pdDxMYXJnZVRleHRCb3hPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXI7XG4gIHJpY2hUZXh0KG9wdGlvbnM/OiBPbWl0PFJpY2hUZXh0T3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyO1xuICBwYXNzd29yZEJveChvcHRpb25zPzogT21pdDxQYXNzd29yZEJveE9wdGlvbnMsICdwYXRoJz4pOiBJRm9ybUZpZWxkQnVpbGRlcjtcbiAgbnVtYmVyQm94KG9wdGlvbnM/OiBPbWl0PE51bWJlckJveE9wdGlvbnMsICdwYXRoJz4pOiBJRm9ybUZpZWxkQnVpbGRlcjtcbiAgc2VsZWN0Qm94KG9wdGlvbnM6IE9taXQ8U2VsZWN0Qm94T3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyO1xuICBsb29rdXBCb3gob3B0aW9uczogT21pdDxMb29rdXBCb3hPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXI7XG4gIHNlbGVjdGlvbkxpc3Qob3B0aW9uczogT21pdDxTZWxlY3Rpb25MaXN0T3B0aW9ucywgJ3BhdGgnPik6IElGb3JtRmllbGRCdWlsZGVyO1xuICBkYXRlVGltZUJveChvcHRpb25zPzogT21pdDxEYXRlVGltZUJveE9wdGlvbnMsICdwYXRoJz4pOiBJRm9ybUZpZWxkQnVpbGRlcjtcbiAgdG9nZ2xlU3dpdGNoKG9wdGlvbnM/OiBPbWl0PFRvZ2dsZVN3aXRjaE9wdGlvbnMsICdwYXRoJz4pOiBJRm9ybUZpZWxkQnVpbGRlcjtcbiAgY29sb3JCb3gob3B0aW9ucz86IE9taXQ8Q29sb3JCb3hPcHRpb25zLCAncGF0aCc+KTogSUZvcm1GaWVsZEJ1aWxkZXI7XG4gIGN1c3RvbVdpZGdldDxUPih0eXBlOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PFQsICdwYXRoJz4pOiBJRm9ybUZpZWxkQnVpbGRlcjtcbn1cblxuLy8gRmllbGRzZXQgY29udGFpbmVyIGJ1aWxkZXIgLSBJbnRlcmZhY2UgU2VncmVnYXRpb246IFNwZWNpYWxpemVkIGZvciBmb3JtIGZpZWxkcyBvbmx5XG5leHBvcnQgaW50ZXJmYWNlIElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXJcbiAgZXh0ZW5kcyBJQmFzZUNvbnRhaW5lckJ1aWxkZXI8SUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlcj4sXG4gIElMYXlvdXRDb250YWluZXJCdWlsZGVyPElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXI+IHtcbiAgLy8gRmllbGRzZXQtc3BlY2lmaWMgb3B0aW9uc1xuICBzZXRPcHRpb25zKG9wdGlvbnM6IEFYUEZpZWxkc2V0Q29udGFpbmVyT3B0aW9ucyk6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyO1xuICBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlcjtcbiAgc2V0SWNvbihpY29uOiBzdHJpbmcpOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyO1xuICBzZXRDb2xsYXBzaWJsZShjb2xsYXBzaWJsZTogYm9vbGVhbik6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXI7XG4gIHNldElzT3Blbihpc09wZW46IGJvb2xlYW4pOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyO1xuICBzZXRMb29rKGxvb2s6ICdmaWVsZHNldCcgfCAnY2FyZCcgfCAnZ3JvdXAnIHwgJ2NvbnRhaW5lcicpOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyO1xuICBzZXRTaG93SGVhZGVyKHNob3dIZWFkZXI6IGJvb2xlYW4pOiBJRmllbGRzZXRDb250YWluZXJCdWlsZGVyO1xuICBzZXRDb2xzKGNvbHM6IG51bWJlcik6IElGaWVsZHNldENvbnRhaW5lckJ1aWxkZXI7XG5cbiAgLy8gT25seSBmb3JtIGZpZWxkcyBhcmUgYWxsb3dlZCBpbiBmaWVsZHNldFxuICBmb3JtRmllbGQobGFiZWw6IHN0cmluZywgZGVsZWdhdGU/OiAoZmllbGQ6IElGb3JtRmllbGRCdWlsZGVyKSA9PiB2b2lkKTogSUZpZWxkc2V0Q29udGFpbmVyQnVpbGRlcjtcbn1cblxuLy8gRGlhbG9nIGNvbnRhaW5lciBidWlsZGVyIC0gSW50ZXJmYWNlIFNlZ3JlZ2F0aW9uOiBTcGVjaWFsaXplZCBmb3IgZGlhbG9nIGZ1bmN0aW9uYWxpdHlcbmV4cG9ydCBpbnRlcmZhY2UgSURpYWxvZ0J1aWxkZXIge1xuICAvLyBEaWFsb2ctc3BlY2lmaWMgb3B0aW9uc1xuICBzZXRPcHRpb25zKG9wdGlvbnM6IEFYUERpYWxvZ0NvbnRhaW5lck9wdGlvbnMpOiBJRGlhbG9nQnVpbGRlcjtcbiAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IElEaWFsb2dCdWlsZGVyO1xuICBzZXRNZXNzYWdlKG1lc3NhZ2U/OiBzdHJpbmcpOiBJRGlhbG9nQnVpbGRlcjtcbiAgc2V0U2l6ZShzaXplOiBBWFBvcHVwU2l6ZVR5cGUpOiBJRGlhbG9nQnVpbGRlcjtcbiAgc2V0Q2xvc2VCdXR0b24oY2xvc2VCdXR0b246IGJvb2xlYW4pOiBJRGlhbG9nQnVpbGRlcjtcbiAgc2V0Q29udGV4dChjb250ZXh0OiBhbnkpOiBJRGlhbG9nQnVpbGRlcjtcblxuICAvLyBDb250ZW50IG1ldGhvZCAtIHdyYXBzIGxheW91dCBidWlsZGVyIG1ldGhvZHNcbiAgY29udGVudChkZWxlZ2F0ZTogKGxheW91dEJ1aWxkZXI6IElGbGV4Q29udGFpbmVyQnVpbGRlcikgPT4gdm9pZCk6IElEaWFsb2dCdWlsZGVyO1xuXG4gIC8vIEFjdGlvbnMgbWV0aG9kXG4gIHNldEFjdGlvbnMoZGVsZWdhdGU/OiAoYWN0aW9uczogSUFjdGlvbkJ1aWxkZXIpID0+IHZvaWQpOiBJRGlhbG9nQnVpbGRlcjtcblxuXG5cbiAgLy8gQ3VzdG9tIGFjdGlvbiBtYW5hZ2VtZW50IChmb3Igc3RlcCB3aXphcmQgaW50ZWdyYXRpb24pXG4gIGFkZEN1c3RvbUFjdGlvbihhY3Rpb246IEFYUEFjdGlvbk1lbnVJdGVtKTogSURpYWxvZ0J1aWxkZXI7XG5cbiAgLy8gRGlhbG9nLXNwZWNpZmljIG1ldGhvZHNcbiAgYnVpbGQoKTogQVhQV2lkZ2V0Tm9kZTtcbiAgc2hvdygpOiBQcm9taXNlPEFYUERpYWxvZ1JlZj47XG59XG5cbi8vIExpc3QgV2lkZ2V0IEJ1aWxkZXIgLSBJbnRlcmZhY2UgU2VncmVnYXRpb246IENvbWJpbmVzIGFsbCBjb250YWluZXIgaW50ZXJmYWNlc1xuZXhwb3J0IGludGVyZmFjZSBJTGlzdFdpZGdldEJ1aWxkZXJcbiAgZXh0ZW5kcyBJQmFzZUNvbnRhaW5lckJ1aWxkZXI8SUxpc3RXaWRnZXRCdWlsZGVyPixcbiAgSUxheW91dENvbnRhaW5lckJ1aWxkZXI8SUxpc3RXaWRnZXRCdWlsZGVyPixcbiAgSUNoaWxkQ29udGFpbmVyQnVpbGRlcjxJTGlzdFdpZGdldEJ1aWxkZXI+LFxuICBJV2lkZ2V0Q29udGFpbmVyQnVpbGRlcjxJTGlzdFdpZGdldEJ1aWxkZXI+IHtcbiAgLy8gTGlzdC1zcGVjaWZpYyBvcHRpb25zXG4gIHNldE9wdGlvbnMob3B0aW9uczogQVhQTGlzdFdpZGdldE9wdGlvbnMpOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG4gIHNldERhdGFTb3VyY2UoZGF0YVNvdXJjZTogYW55W10gfCBBWERhdGFTb3VyY2UpOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG4gIHNldENvbHVtbnMoY29sdW1uczogQVhQTGlzdFdpZGdldENvbHVtbltdKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuXG4gIC8vIEV2ZW50IGhhbmRsZXJzXG4gIHNldE9uUm93Q2xpY2soaGFuZGxlcjogKHJvdzogYW55KSA9PiB2b2lkKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuICBzZXRPblJvd0RvdWJsZUNsaWNrKGhhbmRsZXI6IChyb3c6IGFueSkgPT4gdm9pZCk6IElMaXN0V2lkZ2V0QnVpbGRlcjtcbiAgc2V0T25TZWxlY3Rpb25DaGFuZ2UoaGFuZGxlcjogKHNlbGVjdGVkUm93czogYW55W10pID0+IHZvaWQpOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG4gIHNldE9uUm93Q29tbWFuZChoYW5kbGVyOiAoY29tbWFuZDogYW55LCBzZWxlY3RlZFJvd3M6IGFueVtdKSA9PiB2b2lkKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuXG4gIC8vIFRhYmxlIGZlYXR1cmVzXG4gIHNldFBhZ2luZyhwYWdpbmc6IGJvb2xlYW4pOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG4gIHNldFNob3dIZWFkZXIoc2hvdzogYm9vbGVhbik6IElMaXN0V2lkZ2V0QnVpbGRlcjtcbiAgc2V0U2hvd0Zvb3RlcihzaG93OiBib29sZWFuKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuICBzZXRGaXhIZWFkZXIoZml4OiBib29sZWFuKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuICBzZXRGaXhGb290ZXIoZml4OiBib29sZWFuKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuICBzZXRGZXRjaERhdGFNb2RlKG1vZGU6ICdhdXRvJyB8ICdtYW51YWwnKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuICBzZXRQYXJlbnRGaWVsZChmaWVsZDogc3RyaW5nKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuICBzZXRNaW5IZWlnaHQoaGVpZ2h0OiBzdHJpbmcgfCBudW1iZXIpOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG5cbiAgLy8gU2VsZWN0aW9uICYgSW5kZXhcbiAgc2V0U2hvd0luZGV4KHNob3c6IGJvb2xlYW4pOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG4gIHNldEFsbG93U2VsZWN0aW9uKGFsbG93OiBib29sZWFuKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuXG4gIC8vIENvbW1hbmRzXG4gIHNldFByaW1hcnlDb21tYW5kcyhjb21tYW5kczogYW55W10pOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG4gIHNldFNlY29uZGFyeUNvbW1hbmRzKGNvbW1hbmRzOiBBWFBMaXN0V2lkZ2V0Um93Q29tbWFuZFtdKTogSUxpc3RXaWRnZXRCdWlsZGVyO1xuXG4gIC8vIExvYWRpbmdcbiAgc2V0TG9hZGluZyhsb2FkaW5nOiB7IGVuYWJsZWQ/OiBib29sZWFuOyBhbmltYXRpb24/OiBib29sZWFuIH0pOiBJTGlzdFdpZGdldEJ1aWxkZXI7XG59XG5cbi8vIFN0ZXAgQnVpbGRlciAtIEludGVyZmFjZSBmb3IgYnVpbGRpbmcgaW5kaXZpZHVhbCBzdGVwc1xuZXhwb3J0IGludGVyZmFjZSBJU3RlcEJ1aWxkZXIge1xuICBzZXRJY29uKGljb246IHN0cmluZyk6IElTdGVwQnVpbGRlcjtcbiAgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IElTdGVwQnVpbGRlcjtcbiAgc2V0U2tpcHBhYmxlKHNraXBwYWJsZTogYm9vbGVhbik6IElTdGVwQnVpbGRlcjtcblxuICAvLyBDb250ZW50IHVzaW5nIGxheW91dCBidWlsZGVyXG4gIGNvbnRlbnQoZGVsZWdhdGU6IChsYXlvdXRCdWlsZGVyOiBJTGF5b3V0QnVpbGRlcikgPT4gdm9pZCk6IElTdGVwQnVpbGRlcjtcblxuICAvLyBTdGVwLXNwZWNpZmljIGFjdGlvbnMgKGZ1dHVyZSBmZWF0dXJlIC0gc2tpcCBmb3Igbm93KVxuICAvLyBhZGRBY3Rpb24oYWN0aW9uOiBBWFBBY3Rpb25NZW51SXRlbSk6IElTdGVwQnVpbGRlcjtcblxuICBidWlsZCgpOiBBWFBTdGVwRGVmaW5pdGlvbjtcbn1cblxuLy8gU3RlcCBXaXphcmQgQnVpbGRlciAtIEludGVyZmFjZSBmb3IgYnVpbGRpbmcgc3RlcCB3aXphcmRcbmV4cG9ydCBpbnRlcmZhY2UgSVN0ZXBXaXphcmRCdWlsZGVyXG4gIGV4dGVuZHMgSUJhc2VDb250YWluZXJCdWlsZGVyPElTdGVwV2l6YXJkQnVpbGRlcj4sXG4gIElMYXlvdXRDb250YWluZXJCdWlsZGVyPElTdGVwV2l6YXJkQnVpbGRlcj4ge1xuICAvLyBDb25maWd1cmF0aW9uXG4gIHNldExpbmVhcihsaW5lYXI6IGJvb2xlYW4pOiBJU3RlcFdpemFyZEJ1aWxkZXI7XG4gIHNldERpcmVjdGlvbihkaXJlY3Rpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcpOiBJU3RlcFdpemFyZEJ1aWxkZXI7XG4gIHNldExvb2sobG9vazogQVhTdGVwV2l6YXJkTG9vayk6IElTdGVwV2l6YXJkQnVpbGRlcjtcbiAgc2V0U2hvd0FjdGlvbnMoc2hvdzogYm9vbGVhbik6IElTdGVwV2l6YXJkQnVpbGRlcjtcblxuICAvLyBBY3Rpb25zXG4gIHNldEFjdGlvbnMoYWN0aW9uczogQVhQV2l6YXJkQWN0aW9ucyk6IElTdGVwV2l6YXJkQnVpbGRlcjtcblxuICAvLyBHdWFyZHNcbiAgc2V0R3VhcmRzKGd1YXJkczoge1xuICAgIG5leHQ/OiAocGF5bG9hZDogQVhQU3RlcFdpemFyZEd1YXJkUGF5bG9hZCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG4gICAgcHJldj86IChwYXlsb2FkOiBBWFBTdGVwV2l6YXJkR3VhcmRQYXlsb2FkKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcbiAgfSk6IElTdGVwV2l6YXJkQnVpbGRlcjtcblxuICAvLyBFdmVudHNcbiAgc2V0RXZlbnRzKGV2ZW50czoge1xuICAgIG9uU3RlcENoYW5nZWQ/OiAoc3RhdHVzOiBBWFBTdGVwV2l6YXJkU3RhdHVzKSA9PiB2b2lkO1xuICAgIG9uQ29tcGxldGU/OiAoc3RhdHVzOiBBWFBTdGVwV2l6YXJkU3RhdHVzKSA9PiB2b2lkO1xuICB9KTogSVN0ZXBXaXphcmRCdWlsZGVyO1xuXG4gIC8vIEFkZCBzdGVwc1xuICBzdGVwKGlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGRlbGVnYXRlOiAoc3RlcDogSVN0ZXBCdWlsZGVyKSA9PiB2b2lkKTogSVN0ZXBXaXphcmRCdWlsZGVyO1xufVxuXG4vLyNlbmRyZWdpb25cbiJdfQ==","import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPExpressionEvaluatorService } from '@acorex/platform/core';\nimport { CommonModule } from '@angular/common';\nimport { Component, effect, EventEmitter, inject, Input, Output, signal, viewChild } from '@angular/core';\nimport { AXPLayoutRendererComponent } from './layout-renderer.component';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@acorex/components/button\";\nimport * as i2 from \"@acorex/components/decorators\";\nimport * as i3 from \"@acorex/components/loading\";\nimport * as i4 from \"@angular/common\";\nimport * as i5 from \"@acorex/core/translation\";\nexport class AXPDialogRendererComponent extends AXBasePageComponent {\n constructor() {\n super(...arguments);\n this.result = new EventEmitter();\n this.expressionEvaluator = inject(AXPExpressionEvaluatorService);\n this.context = signal({}, ...(ngDevMode ? [{ debugName: \"context\" }] : []));\n // This will be set by the popup service automatically - same as dynamic-dialog\n this.callBack = () => { };\n this.isDialogLoading = signal(false, ...(ngDevMode ? [{ debugName: \"isDialogLoading\" }] : []));\n // Aggregated actions for footer rendering\n this.footerPrefix = signal([], ...(ngDevMode ? [{ debugName: \"footerPrefix\" }] : []));\n this.footerSuffix = signal([], ...(ngDevMode ? [{ debugName: \"footerSuffix\" }] : []));\n //#endregion\n //#region ---- View Accessors ----\n // Access the internal layout renderer to reach the widgets container injector\n this.layoutRenderer = viewChild(AXPLayoutRendererComponent, ...(ngDevMode ? [{ debugName: \"layoutRenderer\" }] : []));\n this.#eff = effect(() => {\n let count = 0;\n this.aggregateAndEvaluateActions();\n if (!this.widgetCoreService) {\n const renderer = this.layoutRenderer();\n const container = renderer?.getContainer();\n this.widgetCoreService = container?.builderService ?? null;\n count = this.widgetCoreService.registeredWidgetsCount();\n }\n else {\n count = this.widgetCoreService.registeredWidgetsCount();\n // Clear existing timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n // Set new timer to call after 200ms of no count changes\n this.debounceTimer = setTimeout(() => {\n this.aggregateAndEvaluateActions();\n }, 200);\n }\n }, ...(ngDevMode ? [{ debugName: \"#eff\" }] : []));\n }\n //#endregion\n //#region ---- Lifecycle ----\n ngOnInit() {\n // Initialize context with provided context\n this.context.set(this.config?.context || {});\n }\n #eff;\n //#endregion\n handleContextChanged(event) {\n this.context.set(event);\n this.aggregateAndEvaluateActions();\n }\n handleContextInitiated(event) {\n this.context.set(event);\n this.aggregateAndEvaluateActions();\n }\n footerPrefixActions() {\n return this.footerPrefix();\n }\n footerSuffixActions() {\n return this.footerSuffix();\n }\n isFormLoading() {\n return this.isDialogLoading();\n }\n isSubmitting() {\n return this.isDialogLoading();\n }\n async executeAction(action) {\n const cmd = action.command;\n if (cmd !== 'cancel') {\n const isValid = await this.layoutRenderer()?.validate();\n if (!isValid?.result) {\n return;\n }\n }\n if (typeof cmd === 'string' && cmd.startsWith('widget:')) {\n const parsed = this.parseWidgetCommand(cmd);\n if (parsed.widgetName && parsed.action) {\n await this.executeWidgetApi(parsed.widgetName, parsed.action);\n await this.aggregateAndEvaluateActions();\n return;\n }\n }\n // Fallback: treat as regular dialog action (cancel/confirm/custom)\n const result = { context: this.context(), action: cmd };\n this.dialogResult = result;\n if (this.data) {\n this.data.context = result.context;\n this.data.action = result.action;\n }\n this.callBack({\n close: (result) => {\n this.close(result);\n },\n context: () => this.context(),\n action: () => result.action,\n setLoading: (loading) => {\n this.isDialogLoading.set(loading);\n },\n });\n }\n parseWidgetCommand(cmd) {\n // Expected 'widget:<widgetName>.<action>'\n if (!cmd?.startsWith('widget:'))\n return {};\n const rest = cmd.slice('widget:'.length);\n const dot = rest.lastIndexOf('.');\n if (dot <= 0)\n return {};\n return { widgetName: rest.slice(0, dot), action: rest.slice(dot + 1) };\n }\n async executeWidgetApi(widgetName, apiMethod) {\n if (!this.widgetCoreService)\n return;\n try {\n const widget = this.widgetCoreService.getWidget(widgetName);\n const api = widget?.api?.();\n const fn = api?.[apiMethod];\n if (typeof fn === 'function') {\n await Promise.resolve(fn({\n close: (result) => {\n this.close(result);\n },\n context: () => this.context(),\n setLoading: (loading) => {\n this.isDialogLoading.set(loading);\n },\n }));\n }\n }\n catch { }\n }\n async close(result) {\n if (result) {\n const isValid = await this.layoutRenderer()?.validate();\n if (isValid?.result) {\n this.result.emit(result);\n }\n }\n super.close(result);\n }\n // --- Actions aggregation & evaluation ---\n async aggregateAndEvaluateActions() {\n const widgetActions = await this.collectWidgetActions();\n const dialogActions = this.collectDialogActionsFromConfig();\n const all = [...widgetActions, ...dialogActions];\n const evaluated = await this.evaluatePredicates(all);\n const visible = evaluated.filter((a) => a.hidden !== true);\n const prefix = visible.filter((a) => (a.zone ?? 'footer') === 'footer' && (a.placement ?? 'suffix') === 'prefix');\n const suffix = visible.filter((a) => (a.zone ?? 'footer') === 'footer' && (a.placement ?? 'suffix') === 'suffix');\n this.footerPrefix.set(prefix);\n this.footerSuffix.set(suffix);\n }\n async collectWidgetActions() {\n if (!this.widgetCoreService)\n return [];\n const names = this.widgetCoreService.listRegisteredWidgetNames();\n const actions = [];\n for (const name of names) {\n try {\n const widget = this.widgetCoreService.getWidget(name);\n const widgetActs = widget?.actions?.() ?? [];\n actions.push(...widgetActs);\n }\n catch { }\n }\n return actions;\n }\n collectDialogActionsFromConfig() {\n const footer = this.config?.actions?.footer;\n const mapOne = (a, placement) => ({\n title: a.title,\n command: typeof a.command === 'string' ? a.command : a.command?.name,\n icon: a.icon,\n color: a.color,\n disabled: a.disabled,\n hidden: a.hidden,\n zone: 'footer',\n placement,\n scope: a.scope,\n });\n const prefix = (footer?.prefix || []).map((a) => mapOne(a, 'prefix'));\n const suffix = (footer?.suffix || []).map((a) => mapOne(a, 'suffix'));\n return [...prefix, ...suffix];\n }\n async evaluatePredicates(actions) {\n const out = [];\n for (const a of actions) {\n const parsed = typeof a.command === 'string' ? this.parseWidgetCommand(a.command) : {};\n const api = parsed.widgetName ? await this.resolveApi(parsed.widgetName) : undefined;\n const scope = {\n api,\n widget: { name: parsed.widgetName },\n dialog: { context: this.context() },\n context: this.context(),\n };\n const disabled = await this.evalBool(a.disabled, scope);\n const hidden = await this.evalBool(a.hidden, scope);\n out.push({ ...a, disabled, hidden });\n }\n return out;\n }\n async evalBool(value, scope) {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'string') {\n try {\n const result = await this.expressionEvaluator.evaluate(value, scope);\n return !!result;\n }\n catch {\n return false;\n }\n }\n return value;\n }\n async resolveApi(widgetName) {\n try {\n await this.widgetCoreService?.waitForWidget(widgetName, 2000);\n const widget = this.widgetCoreService?.getWidget(widgetName);\n return widget?.api?.();\n }\n catch {\n return undefined;\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPDialogRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.12\", type: AXPDialogRendererComponent, isStandalone: true, selector: \"axp-dialog-renderer\", inputs: { config: \"config\" }, outputs: { result: \"result\" }, viewQueries: [{ propertyName: \"layoutRenderer\", first: true, predicate: AXPLayoutRendererComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `\n <div class=\"ax-p-4\">\n <axp-layout-renderer\n [layout]=\"config.definition\"\n [context]=\"context()\"\n (contextChange)=\"handleContextChanged($event)\"\n (contextInitiated)=\"handleContextInitiated($event)\"\n >\n </axp-layout-renderer>\n </div>\n\n <ax-footer>\n <ax-prefix>\n @for (action of footerPrefixActions(); track $index) {\n <ax-button\n [disabled]=\"action.disabled || isFormLoading()\"\n [text]=\"(action.title | translate | async)!\"\n [look]=\"'outline'\"\n [color]=\"action.color\"\n (onClick)=\"executeAction(action)\"\n >\n <ax-prefix>\n <i class=\"{{ action.icon }}\"></i>\n </ax-prefix>\n </ax-button>\n }\n </ax-prefix>\n <ax-suffix>\n @for (action of footerSuffixActions(); track $index) {\n <ax-button\n [disabled]=\"action.disabled || isSubmitting()\"\n [text]=\"(action.title | translate | async)!\"\n [look]=\"'solid'\"\n [color]=\"action.color\"\n (onClick)=\"executeAction(action)\"\n >\n @if (isFormLoading()) {\n <ax-loading></ax-loading>\n }\n @if (action.icon) {\n <ax-prefix>\n <ax-icon icon=\"{{ action.icon }}\"></ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n </ax-suffix>\n </ax-footer>\n `, isInline: true, dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"component\", type: AXPLayoutRendererComponent, selector: \"axp-layout-renderer\", inputs: [\"layout\", \"context\", \"look\", \"mode\"], outputs: [\"contextChange\", \"contextInitiated\", \"validityChange\"] }, { kind: \"ngmodule\", type: AXButtonModule }, { kind: \"component\", type: i1.AXButtonComponent, selector: \"ax-button\", inputs: [\"disabled\", \"size\", \"tabIndex\", \"color\", \"look\", \"text\", \"toggleable\", \"selected\", \"iconOnly\", \"type\", \"loadingText\"], outputs: [\"onBlur\", \"onFocus\", \"onClick\", \"selectedChange\", \"toggleableChange\", \"lookChange\", \"colorChange\", \"disabledChange\", \"loadingTextChange\"] }, { kind: \"ngmodule\", type: AXDecoratorModule }, { kind: \"component\", type: i2.AXDecoratorIconComponent, selector: \"ax-icon\", inputs: [\"icon\"] }, { kind: \"component\", type: i2.AXDecoratorGenericComponent, selector: \"ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay\" }, { kind: \"ngmodule\", type: AXLoadingModule }, { kind: \"component\", type: i3.AXLoadingComponent, selector: \"ax-loading\", inputs: [\"visible\", \"type\", \"context\"], outputs: [\"visibleChange\"] }, { kind: \"ngmodule\", type: AXTranslationModule }, { kind: \"pipe\", type: i4.AsyncPipe, name: \"async\" }, { kind: \"pipe\", type: i5.AXTranslatorPipe, name: \"translate\" }] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPDialogRendererComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'axp-dialog-renderer',\n standalone: true,\n imports: [\n CommonModule,\n AXPLayoutRendererComponent,\n AXButtonModule,\n AXDecoratorModule,\n AXLoadingModule,\n AXTranslationModule,\n ],\n template: `\n <div class=\"ax-p-4\">\n <axp-layout-renderer\n [layout]=\"config.definition\"\n [context]=\"context()\"\n (contextChange)=\"handleContextChanged($event)\"\n (contextInitiated)=\"handleContextInitiated($event)\"\n >\n </axp-layout-renderer>\n </div>\n\n <ax-footer>\n <ax-prefix>\n @for (action of footerPrefixActions(); track $index) {\n <ax-button\n [disabled]=\"action.disabled || isFormLoading()\"\n [text]=\"(action.title | translate | async)!\"\n [look]=\"'outline'\"\n [color]=\"action.color\"\n (onClick)=\"executeAction(action)\"\n >\n <ax-prefix>\n <i class=\"{{ action.icon }}\"></i>\n </ax-prefix>\n </ax-button>\n }\n </ax-prefix>\n <ax-suffix>\n @for (action of footerSuffixActions(); track $index) {\n <ax-button\n [disabled]=\"action.disabled || isSubmitting()\"\n [text]=\"(action.title | translate | async)!\"\n [look]=\"'solid'\"\n [color]=\"action.color\"\n (onClick)=\"executeAction(action)\"\n >\n @if (isFormLoading()) {\n <ax-loading></ax-loading>\n }\n @if (action.icon) {\n <ax-prefix>\n <ax-icon icon=\"{{ action.icon }}\"></ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n </ax-suffix>\n </ax-footer>\n `,\n }]\n }], propDecorators: { config: [{\n type: Input\n }], result: [{\n type: Output\n }], layoutRenderer: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPLayoutRendererComponent), { isSignal: true }] }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2J1aWxkZXIvc3JjL2xpYi9kaWFsb2ctcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7O0FBaUZ6RSxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsbUJBQW1CO0lBN0RuRTs7UUErRFksV0FBTSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBTXBELHdCQUFtQixHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBU3BFLFlBQU8sR0FBRyxNQUFNLENBQU0sRUFBRSxtREFBQyxDQUFDO1FBRTFCLCtFQUErRTtRQUMvRSxhQUFRLEdBQXNDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUcvQyxvQkFBZSxHQUFH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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdEVDtpQkFDRjs7c0JBRUUsS0FBSzs7c0JBQ0wsTUFBTTtrRkF5QzRCLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYQnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQgeyBBWERlY29yYXRvck1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFYTG9hZGluZ01vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9sb2FkaW5nJztcbmltcG9ydCB7IEFYQmFzZVBhZ2VDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvcGFnZSc7XG5pbXBvcnQgeyBBWFRyYW5zbGF0aW9uTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb3JlL3RyYW5zbGF0aW9uJztcbmltcG9ydCB7IEFYUEV4cHJlc3Npb25FdmFsdWF0b3JTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb3JlJztcbmltcG9ydCB7IEFYUFdpZGdldENvcmVFbGVtZW50QWN0aW9uLCBBWFBXaWRnZXRDb3JlU2VydmljZSwgQVhQV2lkZ2V0Tm9kZSB9IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vbGF5b3V0L3dpZGdldC1jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGVmZmVjdCwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUERpYWxvZ1JlZiB9IGZyb20gJy4vbGF5b3V0LWJ1aWxkZXIudHlwZXMnO1xuaW1wb3J0IHsgQVhQTGF5b3V0UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1yZW5kZXJlci5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ1JlbmRlcmVyQ29uZmlnIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgY29udGV4dDogYW55O1xuICBkZWZpbml0aW9uOiBBWFBXaWRnZXROb2RlO1xuICBhY3Rpb25zPzoge1xuICAgIGZvb3Rlcj86IHtcbiAgICAgIHByZWZpeD86IGFueVtdO1xuICAgICAgc3VmZml4PzogYW55W107XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dSZW5kZXJlclJlc3VsdCB7XG4gIGNvbnRleHQ6IGFueTtcbiAgYWN0aW9uPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheHAtZGlhbG9nLXJlbmRlcmVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBBWFBMYXlvdXRSZW5kZXJlckNvbXBvbmVudCxcbiAgICBBWEJ1dHRvbk1vZHVsZSxcbiAgICBBWERlY29yYXRvck1vZHVsZSxcbiAgICBBWExvYWRpbmdNb2R1bGUsXG4gICAgQVhUcmFuc2xhdGlvbk1vZHVsZSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYXgtcC00XCI+XG4gICAgICA8YXhwLWxheW91dC1yZW5kZXJlclxuICAgICAgICBbbGF5b3V0XT1cImNvbmZpZy5kZWZpbml0aW9uXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dCgpXCJcbiAgICAgICAgKGNvbnRleHRDaGFuZ2UpPVwiaGFuZGxlQ29udGV4dENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChjb250ZXh0SW5pdGlhdGVkKT1cImhhbmRsZUNvbnRleHRJbml0aWF0ZWQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICA8L2F4cC1sYXlvdXQtcmVuZGVyZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8YXgtZm9vdGVyPlxuICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgQGZvciAoYWN0aW9uIG9mIGZvb3RlclByZWZpeEFjdGlvbnMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgPGF4LWJ1dHRvblxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCBpc0Zvcm1Mb2FkaW5nKClcIlxuICAgICAgICAgICAgW3RleHRdPVwiKGFjdGlvbi50aXRsZSB8IHRyYW5zbGF0ZSB8IGFzeW5jKSFcIlxuICAgICAgICAgICAgW2xvb2tdPVwiJ291dGxpbmUnXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJhY3Rpb24uY29sb3JcIlxuICAgICAgICAgICAgKG9uQ2xpY2spPVwiZXhlY3V0ZUFjdGlvbihhY3Rpb24pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7IGFjdGlvbi5pY29uIH19XCI+PC9pPlxuICAgICAgICAgICAgPC9heC1wcmVmaXg+XG4gICAgICAgICAgPC9heC1idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgPGF4LXN1ZmZpeD5cbiAgICAgICAgQGZvciAoYWN0aW9uIG9mIGZvb3RlclN1ZmZpeEFjdGlvbnMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgPGF4LWJ1dHRvblxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCBpc1N1Ym1pdHRpbmcoKVwiXG4gICAgICAgICAgICBbdGV4dF09XCIoYWN0aW9uLnRpdGxlIHwgdHJhbnNsYXRlIHwgYXN5bmMpIVwiXG4gICAgICAgICAgICBbbG9va109XCInc29saWQnXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJhY3Rpb24uY29sb3JcIlxuICAgICAgICAgICAgKG9uQ2xpY2spPVwiZXhlY3V0ZUFjdGlvbihhY3Rpb24pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKGlzRm9ybUxvYWRpbmcoKSkge1xuICAgICAgICAgICAgICA8YXgtbG9hZGluZz48L2F4LWxvYWRpbmc+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGFjdGlvbi5pY29uKSB7XG4gICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cInt7IGFjdGlvbi5pY29uIH19XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2F4LWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9heC1zdWZmaXg+XG4gICAgPC9heC1mb290ZXI+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEFYUERpYWxvZ1JlbmRlcmVyQ29tcG9uZW50IGV4dGVuZHMgQVhCYXNlUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IERpYWxvZ1JlbmRlcmVyQ29uZmlnO1xuICBAT3V0cHV0KCkgcmVzdWx0ID0gbmV3IEV2ZW50RW1pdHRlcjxEaWFsb2dSZW5kZXJlclJlc3VsdD4oKTtcblxuICAvLyNyZWdpb24gLS0tLSAgIFNlcnZpY2VzICYgRGVwZW5kZW5jaWVzICAgLS0tLVxuXG4gIC8vIOKchSBJbmplY3Qgc2VydmljZXNcbiAgcHJpdmF0ZSB3aWRnZXRDb3JlU2VydmljZTogQVhQV2lkZ2V0Q29yZVNlcnZpY2U7XG4gIHByaXZhdGUgZXhwcmVzc2lvbkV2YWx1YXRvciA9IGluamVjdChBWFBFeHByZXNzaW9uRXZhbHVhdG9yU2VydmljZSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBTdGF0ZSAgIC0tLS1cblxuICAvLyBTdG9yZSBkaWFsb2cgcmVzdWx0IGZvciBtYW51YWwgY2xvc2luZ1xuICBwcml2YXRlIGRpYWxvZ1Jlc3VsdD86IERpYWxvZ1JlbmRlcmVyUmVzdWx0O1xuXG4gIGNvbnRleHQgPSBzaWduYWw8YW55Pih7fSk7XG5cbiAgLy8gVGhpcyB3aWxsIGJlIHNldCBieSB0aGUgcG9wdXAgc2VydmljZSBhdXRvbWF0aWNhbGx5IC0gc2FtZSBhcyBkeW5hbWljLWRpYWxvZ1xuICBjYWxsQmFjazogKGRpYWxvZ1JlZjogQVhQRGlhbG9nUmVmKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIGRhdGE6IGFueTtcblxuICBwcml2YXRlIGlzRGlhbG9nTG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gQWdncmVnYXRlZCBhY3Rpb25zIGZvciBmb290ZXIgcmVuZGVyaW5nXG4gIGZvb3RlclByZWZpeCA9IHNpZ25hbDxBWFBXaWRnZXRDb3JlRWxlbWVudEFjdGlvbltdPihbXSk7XG4gIGZvb3RlclN1ZmZpeCA9IHNpZ25hbDxBWFBXaWRnZXRDb3JlRWxlbWVudEFjdGlvbltdPihbXSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBMaWZlY3ljbGUgICAtLS0tXG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBjb250ZXh0IHdpdGggcHJvdmlkZWQgY29udGV4dFxuICAgIHRoaXMuY29udGV4dC5zZXQodGhpcy5jb25maWc/LmNvbnRleHQgfHwge30pO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBWaWV3IEFjY2Vzc29ycyAgIC0tLS1cblxuICAvLyBBY2Nlc3MgdGhlIGludGVybmFsIGxheW91dCByZW5kZXJlciB0byByZWFjaCB0aGUgd2lkZ2V0cyBjb250YWluZXIgaW5qZWN0b3JcbiAgcHJpdmF0ZSBsYXlvdXRSZW5kZXJlciA9IHZpZXdDaGlsZChBWFBMYXlvdXRSZW5kZXJlckNvbXBvbmVudCk7XG5cbiAgLy8gRGVib3VuY2UgdGltZXIgZm9yIGFnZ3JlZ2F0aW5nIGFjdGlvbnMgYWZ0ZXIgd2lkZ2V0IGNvdW50IHN0YWJpbGl6ZXNcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cbiAgI2VmZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB0aGlzLmFnZ3JlZ2F0ZUFuZEV2YWx1YXRlQWN0aW9ucygpO1xuICAgIGlmICghdGhpcy53aWRnZXRDb3JlU2VydmljZSkge1xuICAgICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmxheW91dFJlbmRlcmVyKCk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSByZW5kZXJlcj8uZ2V0Q29udGFpbmVyKCk7XG4gICAgICB0aGlzLndpZGdldENvcmVTZXJ2aWNlID0gKGNvbnRhaW5lcj8uYnVpbGRlclNlcnZpY2UgYXMgQVhQV2lkZ2V0Q29yZVNlcnZpY2UpID8/IG51bGw7XG4gICAgICBjb3VudCA9IHRoaXMud2lkZ2V0Q29yZVNlcnZpY2UucmVnaXN0ZXJlZFdpZGdldHNDb3VudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IHRoaXMud2lkZ2V0Q29yZVNlcnZpY2UucmVnaXN0ZXJlZFdpZGdldHNDb3VudCgpO1xuXG4gICAgICAvLyBDbGVhciBleGlzdGluZyB0aW1lclxuICAgICAgaWYgKHRoaXMuZGVib3VuY2VUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZVRpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IG5ldyB0aW1lciB0byBjYWxsIGFmdGVyIDIwMG1zIG9mIG5vIGNvdW50IGNoYW5nZXNcbiAgICAgIHRoaXMuZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFnZ3JlZ2F0ZUFuZEV2YWx1YXRlQWN0aW9ucygpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIGhhbmRsZUNvbnRleHRDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmNvbnRleHQuc2V0KGV2ZW50KTtcbiAgICB0aGlzLmFnZ3JlZ2F0ZUFuZEV2YWx1YXRlQWN0aW9ucygpO1xuICB9XG5cbiAgaGFuZGxlQ29udGV4dEluaXRpYXRlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5jb250ZXh0LnNldChldmVudCk7XG4gICAgdGhpcy5hZ2dyZWdhdGVBbmRFdmFsdWF0ZUFjdGlvbnMoKTtcbiAgfVxuXG4gIGZvb3RlclByZWZpeEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9vdGVyUHJlZml4KCk7XG4gIH1cblxuICBmb290ZXJTdWZmaXhBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmZvb3RlclN1ZmZpeCgpO1xuICB9XG5cbiAgaXNGb3JtTG9hZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0RpYWxvZ0xvYWRpbmcoKTtcbiAgfVxuXG4gIGlzU3VibWl0dGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0RpYWxvZ0xvYWRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBY3Rpb24oYWN0aW9uOiBBWFBXaWRnZXRDb3JlRWxlbWVudEFjdGlvbikge1xuICAgIGNvbnN0IGNtZCA9IGFjdGlvbi5jb21tYW5kO1xuXG4gICAgaWYgKGNtZCAhPT0gJ2NhbmNlbCcpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCB0aGlzLmxheW91dFJlbmRlcmVyKCk/LnZhbGlkYXRlKCk7XG4gICAgICBpZiAoIWlzVmFsaWQ/LnJlc3VsdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjbWQgPT09ICdzdHJpbmcnICYmIGNtZC5zdGFydHNXaXRoKCd3aWRnZXQ6JykpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VXaWRnZXRDb21tYW5kKGNtZCk7XG4gICAgICBpZiAocGFyc2VkLndpZGdldE5hbWUgJiYgcGFyc2VkLmFjdGlvbikge1xuICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVXaWRnZXRBcGkocGFyc2VkLndpZGdldE5hbWUsIHBhcnNlZC5hY3Rpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLmFnZ3JlZ2F0ZUFuZEV2YWx1YXRlQWN0aW9ucygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IHRyZWF0IGFzIHJlZ3VsYXIgZGlhbG9nIGFjdGlvbiAoY2FuY2VsL2NvbmZpcm0vY3VzdG9tKVxuICAgIGNvbnN0IHJlc3VsdDogRGlhbG9nUmVuZGVyZXJSZXN1bHQgPSB7IGNvbnRleHQ6IHRoaXMuY29udGV4dCgpLCBhY3Rpb246IGNtZCB9O1xuICAgIHRoaXMuZGlhbG9nUmVzdWx0ID0gcmVzdWx0O1xuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YS5jb250ZXh0ID0gcmVzdWx0LmNvbnRleHQ7XG4gICAgICB0aGlzLmRhdGEuYWN0aW9uID0gcmVzdWx0LmFjdGlvbjtcbiAgICB9XG4gICAgdGhpcy5jYWxsQmFjayh7XG4gICAgICBjbG9zZTogKHJlc3VsdD86IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlKHJlc3VsdCk7XG4gICAgICB9LFxuICAgICAgY29udGV4dDogKCkgPT4gdGhpcy5jb250ZXh0KCksXG4gICAgICBhY3Rpb246ICgpID0+IHJlc3VsdC5hY3Rpb24sXG4gICAgICBzZXRMb2FkaW5nOiAobG9hZGluZzogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLmlzRGlhbG9nTG9hZGluZy5zZXQobG9hZGluZyk7XG4gICAgICB9LFxuICAgIH0gYXMgQVhQRGlhbG9nUmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VXaWRnZXRDb21tYW5kKGNtZDogc3RyaW5nKTogeyB3aWRnZXROYW1lPzogc3RyaW5nOyBhY3Rpb24/OiBzdHJpbmcgfSB7XG4gICAgLy8gRXhwZWN0ZWQgJ3dpZGdldDo8d2lkZ2V0TmFtZT4uPGFjdGlvbj4nXG4gICAgaWYgKCFjbWQ/LnN0YXJ0c1dpdGgoJ3dpZGdldDonKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IHJlc3QgPSBjbWQuc2xpY2UoJ3dpZGdldDonLmxlbmd0aCk7XG4gICAgY29uc3QgZG90ID0gcmVzdC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChkb3QgPD0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHdpZGdldE5hbWU6IHJlc3Quc2xpY2UoMCwgZG90KSwgYWN0aW9uOiByZXN0LnNsaWNlKGRvdCArIDEpIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVXaWRnZXRBcGkod2lkZ2V0TmFtZTogc3RyaW5nLCBhcGlNZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy53aWRnZXRDb3JlU2VydmljZSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldENvcmVTZXJ2aWNlLmdldFdpZGdldCh3aWRnZXROYW1lKSBhcyBhbnk7XG4gICAgICBjb25zdCBhcGkgPSB3aWRnZXQ/LmFwaT8uKCk7XG4gICAgICBjb25zdCBmbiA9IGFwaT8uW2FwaU1ldGhvZF07XG4gICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICBmbih7XG4gICAgICAgICAgICBjbG9zZTogKHJlc3VsdD86IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlKHJlc3VsdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dDogKCkgPT4gdGhpcy5jb250ZXh0KCksXG4gICAgICAgICAgICBzZXRMb2FkaW5nOiAobG9hZGluZzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmlzRGlhbG9nTG9hZGluZy5zZXQobG9hZGluZyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgQVhQRGlhbG9nUmVmKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjbG9zZShyZXN1bHQ/OiBEaWFsb2dSZW5kZXJlclJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCB0aGlzLmxheW91dFJlbmRlcmVyKCk/LnZhbGlkYXRlKCk7XG4gICAgICBpZiAoaXNWYWxpZD8ucmVzdWx0KSB7XG4gICAgICAgIHRoaXMucmVzdWx0LmVtaXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlci5jbG9zZShyZXN1bHQpO1xuICB9XG5cbiAgLy8gLS0tIEFjdGlvbnMgYWdncmVnYXRpb24gJiBldmFsdWF0aW9uIC0tLVxuICBwcml2YXRlIGFzeW5jIGFnZ3JlZ2F0ZUFuZEV2YWx1YXRlQWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3aWRnZXRBY3Rpb25zID0gYXdhaXQgdGhpcy5jb2xsZWN0V2lkZ2V0QWN0aW9ucygpO1xuICAgIGNvbnN0IGRpYWxvZ0FjdGlvbnMgPSB0aGlzLmNvbGxlY3REaWFsb2dBY3Rpb25zRnJvbUNvbmZpZygpO1xuICAgIGNvbnN0IGFsbCA9IFsuLi53aWRnZXRBY3Rpb25zLCAuLi5kaWFsb2dBY3Rpb25zXTtcbiAgICBjb25zdCBldmFsdWF0ZWQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlUHJlZGljYXRlcyhhbGwpO1xuICAgIGNvbnN0IHZpc2libGUgPSBldmFsdWF0ZWQuZmlsdGVyKChhKSA9PiBhLmhpZGRlbiAhPT0gdHJ1ZSk7XG5cbiAgICBjb25zdCBwcmVmaXggPSB2aXNpYmxlLmZpbHRlcigoYSkgPT4gKGEuem9uZSA/PyAnZm9vdGVyJykgPT09ICdmb290ZXInICYmIChhLnBsYWNlbWVudCA/PyAnc3VmZml4JykgPT09ICdwcmVmaXgnKTtcbiAgICBjb25zdCBzdWZmaXggPSB2aXNpYmxlLmZpbHRlcigoYSkgPT4gKGEuem9uZSA/PyAnZm9vdGVyJykgPT09ICdmb290ZXInICYmIChhLnBsYWNlbWVudCA/PyAnc3VmZml4JykgPT09ICdzdWZmaXgnKTtcblxuICAgIHRoaXMuZm9vdGVyUHJlZml4LnNldChwcmVmaXgpO1xuICAgIHRoaXMuZm9vdGVyU3VmZml4LnNldChzdWZmaXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0V2lkZ2V0QWN0aW9ucygpOiBQcm9taXNlPEFYUFdpZGdldENvcmVFbGVtZW50QWN0aW9uW10+IHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0Q29yZVNlcnZpY2UpIHJldHVybiBbXTtcbiAgICBjb25zdCBuYW1lcyA9IHRoaXMud2lkZ2V0Q29yZVNlcnZpY2UubGlzdFJlZ2lzdGVyZWRXaWRnZXROYW1lcygpO1xuICAgIGNvbnN0IGFjdGlvbnM6IEFYUFdpZGdldENvcmVFbGVtZW50QWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0Q29yZVNlcnZpY2UuZ2V0V2lkZ2V0KG5hbWUpIGFzIGFueTtcbiAgICAgICAgY29uc3Qgd2lkZ2V0QWN0czogQVhQV2lkZ2V0Q29yZUVsZW1lbnRBY3Rpb25bXSA9IHdpZGdldD8uYWN0aW9ucz8uKCkgPz8gW107XG4gICAgICAgIGFjdGlvbnMucHVzaCguLi53aWRnZXRBY3RzKTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgcmV0dXJuIGFjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3REaWFsb2dBY3Rpb25zRnJvbUNvbmZpZygpOiBBWFBXaWRnZXRDb3JlRWxlbWVudEFjdGlvbltdIHtcbiAgICBjb25zdCBmb290ZXIgPSB0aGlzLmNvbmZpZz8uYWN0aW9ucz8uZm9vdGVyO1xuICAgIGNvbnN0IG1hcE9uZSA9IChhOiBhbnksIHBsYWNlbWVudDogJ3ByZWZpeCcgfCAnc3VmZml4Jyk6IEFYUFdpZGdldENvcmVFbGVtZW50QWN0aW9uID0+ICh7XG4gICAgICB0aXRsZTogYS50aXRsZSxcbiAgICAgIGNvbW1hbmQ6IHR5cGVvZiBhLmNvbW1hbmQgPT09ICdzdHJpbmcnID8gYS5jb21tYW5kIDogYS5jb21tYW5kPy5uYW1lLFxuICAgICAgaWNvbjogYS5pY29uLFxuICAgICAgY29sb3I6IGEuY29sb3IsXG4gICAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCxcbiAgICAgIGhpZGRlbjogYS5oaWRkZW4sXG4gICAgICB6b25lOiAnZm9vdGVyJyxcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHNjb3BlOiBhLnNjb3BlLFxuICAgIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IChmb290ZXI/LnByZWZpeCB8fCBbXSkubWFwKChhKSA9PiBtYXBPbmUoYSwgJ3ByZWZpeCcpKTtcbiAgICBjb25zdCBzdWZmaXggPSAoZm9vdGVyPy5zdWZmaXggfHwgW10pLm1hcCgoYSkgPT4gbWFwT25lKGEsICdzdWZmaXgnKSk7XG4gICAgcmV0dXJuIFsuLi5wcmVmaXgsIC4uLnN1ZmZpeF07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV2YWx1YXRlUHJlZGljYXRlcyhhY3Rpb25zOiBBWFBXaWRnZXRDb3JlRWxlbWVudEFjdGlvbltdKTogUHJvbWlzZTxBWFBXaWRnZXRDb3JlRWxlbWVudEFjdGlvbltdPiB7XG4gICAgY29uc3Qgb3V0OiBBWFBXaWRnZXRDb3JlRWxlbWVudEFjdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBhIG9mIGFjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiBhLmNvbW1hbmQgPT09ICdzdHJpbmcnID8gdGhpcy5wYXJzZVdpZGdldENvbW1hbmQoYS5jb21tYW5kKSA6IHt9O1xuICAgICAgY29uc3QgYXBpID0gcGFyc2VkLndpZGdldE5hbWUgPyBhd2FpdCB0aGlzLnJlc29sdmVBcGkocGFyc2VkLndpZGdldE5hbWUpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc2NvcGUgPSB7XG4gICAgICAgIGFwaSxcbiAgICAgICAgd2lkZ2V0OiB7IG5hbWU6IHBhcnNlZC53aWRnZXROYW1lIH0sXG4gICAgICAgIGRpYWxvZzogeyBjb250ZXh0OiB0aGlzLmNvbnRleHQoKSB9LFxuICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQoKSxcbiAgICAgIH0gYXMgYW55O1xuICAgICAgY29uc3QgZGlzYWJsZWQgPSBhd2FpdCB0aGlzLmV2YWxCb29sKGEuZGlzYWJsZWQsIHNjb3BlKTtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IGF3YWl0IHRoaXMuZXZhbEJvb2woYS5oaWRkZW4sIHNjb3BlKTtcbiAgICAgIG91dC5wdXNoKHsgLi4uYSwgZGlzYWJsZWQsIGhpZGRlbiB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXZhbEJvb2wodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQsIHNjb3BlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHByZXNzaW9uRXZhbHVhdG9yLmV2YWx1YXRlKHZhbHVlLCBzY29wZSk7XG4gICAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUFwaSh3aWRnZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLndpZGdldENvcmVTZXJ2aWNlPy53YWl0Rm9yV2lkZ2V0KHdpZGdldE5hbWUsIDIwMDApO1xuICAgICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRDb3JlU2VydmljZT8uZ2V0V2lkZ2V0KHdpZGdldE5hbWUpIGFzIGFueTtcbiAgICAgIHJldHVybiB3aWRnZXQ/LmFwaT8uKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LXBsYXRmb3JtLWxheW91dC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9sYXlvdXQvYnVpbGRlci9zcmMvYWNvcmV4LXBsYXRmb3JtLWxheW91dC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-layout-builder.mjs","sources":["../../../../libs/platform/layout/builder/src/lib/dialog-action-shortcuts.util.ts","../../../../libs/platform/layout/builder/src/lib/layout-builder.types.ts","../../../../libs/platform/layout/builder/src/lib/layout-builder-dialog.hooks.ts","../../../../libs/platform/layout/builder/src/lib/layout-conversion.service.ts","../../../../libs/platform/layout/builder/src/lib/dialog-close-confirmation.util.ts","../../../../libs/platform/layout/builder/src/lib/layout-builder.service.ts","../../../../libs/platform/layout/builder/src/lib/layout-renderer.component.ts","../../../../libs/platform/layout/builder/src/lib/preview-widget-field.command.key.ts","../../../../libs/platform/layout/builder/src/lib/layout-builder.module.ts","../../../../libs/platform/layout/builder/src/lib/dialog-escape-priority.util.ts","../../../../libs/platform/layout/builder/src/lib/dialog-resolve.util.ts","../../../../libs/platform/layout/builder/src/lib/dialog-renderer.component.ts","../../../../libs/platform/layout/builder/src/lib/preview-widget-field.command.ts","../../../../libs/platform/layout/builder/src/acorex-platform-layout-builder.ts"],"sourcesContent":["//#region ---- Dialog Action Shortcut Utilities ----\n\nexport type AXPDialogActionShortcut = string;\n\nexport const DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS: readonly AXPDialogActionShortcut[] = ['Esc'];\nexport const DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS: readonly AXPDialogActionShortcut[] = ['Enter', 'ctrl+s'];\n\nconst PRIMARY_DIALOG_ACTION_COMMANDS = new Set(['submit', 'create', 'entity-form-done']);\n\nexport interface AXPDialogActionOptions {\n /**\n * Additional keyboard shortcuts for this action (e.g. `'ctrl+s'`).\n * Merged with built-in defaults for `cancel` / `submit`. Pass `[]` to disable all shortcuts.\n */\n shortcuts?: AXPDialogActionShortcut[];\n}\n\ninterface ParsedShortcut {\n ctrl: boolean;\n shift: boolean;\n alt: boolean;\n meta: boolean;\n key: string;\n}\n\n/**\n * Parses a shortcut string such as `Enter`, `Escape`, or `ctrl+shift+s`.\n */\nexport function parseDialogActionShortcut(shortcut: string): ParsedShortcut {\n const parts = shortcut\n .trim()\n .toLowerCase()\n .split('+')\n .map((part) => part.trim())\n .filter(Boolean);\n\n const key = normalizeShortcutToken(parts.pop() ?? '');\n return {\n ctrl: parts.includes('ctrl') || parts.includes('control'),\n shift: parts.includes('shift'),\n alt: parts.includes('alt') || parts.includes('option'),\n meta: parts.includes('meta') || parts.includes('cmd') || parts.includes('command'),\n key,\n };\n}\n\n/**\n * Returns true when the keyboard event matches the given shortcut definition.\n */\nexport function matchesDialogActionShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const parsed = parseDialogActionShortcut(shortcut);\n\n if (parsed.ctrl !== event.ctrlKey) {\n return false;\n }\n if (parsed.shift !== event.shiftKey) {\n return false;\n }\n if (parsed.alt !== event.altKey) {\n return false;\n }\n if (parsed.meta !== event.metaKey) {\n return false;\n }\n\n return normalizeShortcutKey(event) === normalizeShortcutToken(parsed.key);\n}\n\n/**\n * Resolves footer action shortcuts: defaults when omitted, merge when extras are provided, none when `[]`.\n */\nexport function resolveDialogActionShortcuts(\n defaults: readonly AXPDialogActionShortcut[],\n overrides?: AXPDialogActionShortcut[],\n): AXPDialogActionShortcut[] | undefined {\n if (overrides !== undefined) {\n if (overrides.length === 0) {\n return undefined;\n }\n return dedupeDialogActionShortcuts([...defaults, ...overrides]);\n }\n return defaults.length ? [...defaults] : undefined;\n}\n\n/**\n * Applies built-in footer shortcuts when actions are declared without `shortcuts`\n * (e.g. workflow `show-layout-popup` raw action config).\n */\nexport function resolveConfiguredFooterActionShortcuts(\n command: string | undefined,\n explicit?: AXPDialogActionShortcut[],\n): AXPDialogActionShortcut[] | undefined {\n if (explicit !== undefined) {\n return resolveDialogActionShortcuts([], explicit);\n }\n\n if (command === 'cancel') {\n return resolveDialogActionShortcuts(DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS, undefined);\n }\n\n if (command && PRIMARY_DIALOG_ACTION_COMMANDS.has(command)) {\n return resolveDialogActionShortcuts(DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS, undefined);\n }\n\n return undefined;\n}\n\nfunction dedupeDialogActionShortcuts(shortcuts: AXPDialogActionShortcut[]): AXPDialogActionShortcut[] {\n const seen = new Set<string>();\n const result: AXPDialogActionShortcut[] = [];\n for (const shortcut of shortcuts) {\n const token = normalizeShortcutToken(shortcut);\n if (!token || seen.has(token)) {\n continue;\n }\n seen.add(token);\n result.push(shortcut.trim());\n }\n return result;\n}\n\nfunction normalizeShortcutToken(key: string): string {\n const normalized = key.trim().toLowerCase();\n if (normalized === 'esc') {\n return 'escape';\n }\n return normalized;\n}\n\n/**\n * Whether a shortcut should fire given the current focus target.\n * Enter without modifiers is suppressed in multiline / rich-text fields.\n */\nexport function shouldTriggerDialogActionShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const parsed = parseDialogActionShortcut(shortcut);\n const isPlainEnter = parsed.key === 'enter' && !parsed.ctrl && !parsed.shift && !parsed.alt && !parsed.meta;\n\n if (!isPlainEnter) {\n return true;\n }\n\n return !isKeyboardTargetMultilineEditable(event.target);\n}\n\nfunction normalizeShortcutKey(event: KeyboardEvent): string {\n if (event.key === 'Enter') {\n return 'enter';\n }\n if (event.key === 'Escape') {\n return 'escape';\n }\n if (event.key === ' ') {\n return 'space';\n }\n if (event.key.length === 1) {\n return event.key.toLowerCase();\n }\n\n const codeMatch = event.code.match(/^Key([A-Z])$/);\n if (codeMatch) {\n return codeMatch[1].toLowerCase();\n }\n\n const digitMatch = event.code.match(/^Digit([0-9])$/);\n if (digitMatch) {\n return digitMatch[1];\n }\n\n return event.key.toLowerCase();\n}\n\nfunction isKeyboardTargetMultilineEditable(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n if (target.isContentEditable) {\n return true;\n }\n\n const textarea = target.closest('textarea');\n if (textarea && !textarea.readOnly && !textarea.disabled) {\n return true;\n }\n\n const richText = target.closest('[contenteditable=\"true\"]');\n return richText instanceof HTMLElement;\n}\n\n//#endregion\n","import { AXDataSource } from '@acorex/cdk/common';\nimport { AXPopupSizeType } from '@acorex/components/popup';\nimport { AXStepWizardLook } from '@acorex/components/step-wizard';\nimport {\n AXPActionMenuItem,\n AXPExpression,\n AXPGridLayoutOptions,\n AXPMetaData,\n AXPOptionsData,\n AXPValidationRules,\n type AXPMultiLanguageString,\n} from '@acorex/platform/core';\nimport { AXPWidgetNode, AXPWidgetRenderMode } from '@acorex/platform/layout/widget-core';\nimport type { AXPDialogActionOptions, AXPDialogActionShortcut } from './dialog-action-shortcuts.util';\n\nexport type { AXPDialogActionOptions, AXPDialogActionShortcut } from './dialog-action-shortcuts.util';\nexport {\n DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS,\n DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS,\n} from './dialog-action-shortcuts.util';\n\n/**\n * Extended widget node properties (excluding type, path, name, options, children)\n * These properties can be passed as a third parameter to customWidget method\n */\nexport type AXPWidgetNodeExtendedProperties = Omit<AXPWidgetNode, 'type' | 'path' | 'name' | 'options'>;\n\n/**\n * Form appearance and density styling (using fieldset widget look)\n */\nexport type AXPDynamicFormLook = 'fieldset' | 'card' | 'group' | 'container';\n\n/**\n * Form rendering mode\n */\nexport type AXPDynamicFormMode = 'view' | 'edit';\n\n/**\n * Form layout direction and flow\n */\nexport type AXPDynamicFormDirection = 'vertical' | 'horizontal' | 'grid';\n\nexport interface AXPDynamicFormFieldDefinition {\n path: string;\n title?: AXPMultiLanguageString;\n badge?: string;\n description?: AXPMultiLanguageString;\n widget: AXPWidgetNode;\n /**\n * Optional per-field rendering mode. Takes precedence over section and form modes.\n */\n mode?: AXPDynamicFormMode;\n layout?: AXPGridLayoutOptions;\n}\n\nexport interface AXPDynamicFormGroupDefinition {\n name: string;\n title?: AXPMultiLanguageString;\n description?: AXPMultiLanguageString;\n parameters: AXPDynamicFormFieldDefinition[];\n /**\n * Optional per-section rendering mode. Takes precedence over form mode and is overridden by field mode.\n */\n mode?: AXPDynamicFormMode;\n /**\n * Visual appearance of the group (fieldset, card, group, container)\n */\n look?: 'fieldset' | 'card' | 'group' | 'container';\n}\n\nexport interface AXPDynamicFormDefinition {\n groups: AXPDynamicFormGroupDefinition[];\n /**\n * Optional form-level rendering mode\n */\n mode?: AXPDynamicFormMode;\n}\n\nexport interface AXPDialogRef {\n /**\n * Manually close the dialog (optional - dialog closes automatically after user interaction)\n */\n close(result?: any): void;\n /**\n * Get the form data from the dialog\n */\n context(): any;\n /**\n * Get the action that was clicked by the user\n */\n action(): string | undefined;\n /**\n * Set the loading state of the dialog\n */\n setLoading(loading: boolean): void;\n\n /**\n * Deep-merge partial values into the dialog layout context (e.g. after create returns an id).\n */\n patchContext?(partial: Record<string, unknown>): void;\n\n /**\n * Invoke a registered widget's public `api()` method (e.g. step-wizard `next`).\n */\n invokeWidget?(\n widgetName: string,\n method: string,\n options?: { setLoading?: (loading: boolean) => void; close?: (result?: any) => void },\n ): Promise<void>;\n\n /**\n * Set the options for a field after the dialog is shown and rendered\n */\n //setFieldOptions(name: string, options: AXPFormFieldOptions): void;\n}\n\n/** Fallback {@link AXPDialogRef} when the popup is dismissed without a footer action (e.g. header close). */\nexport function createDismissedDialogRef(context: () => unknown = () => ({})): AXPDialogRef {\n return {\n close: () => {},\n context,\n action: () => 'cancel',\n setLoading: () => {},\n };\n}\n\n//#region ---- Widget Options Interfaces ----\n\nexport interface LayoutWidgetOptions {\n name?: string;\n}\n\nexport interface ValueWidgetOptions extends LayoutWidgetOptions {\n path: string; // Required for all value widgets\n defaultValue?: any; // should update the value in the context;\n validations?: AXPValidationRules;\n}\n\n// Widget type options - only internal widget behavior, no styling/layout\nexport interface TextBoxOptions extends ValueWidgetOptions {\n placeholder?: AXPMultiLanguageString;\n maxLength?: number;\n minLength?: number;\n prefix?: string;\n suffix?: string;\n clearButton?: boolean;\n}\n\nexport interface NumberBoxOptions extends ValueWidgetOptions {\n min?: number;\n max?: number;\n step?: number;\n placeholder?: AXPMultiLanguageString;\n format?: string;\n}\n\nexport interface SelectBoxOptions extends ValueWidgetOptions {\n dataSource: any[] | (() => any[]) | (() => Promise<any[]>) | AXDataSource<any>;\n valueField?: string;\n textField?: string;\n placeholder?: AXPMultiLanguageString;\n multiple?: boolean;\n searchable?: boolean;\n clearButton?: boolean;\n allowSearch?: boolean;\n}\n\nexport interface DateTimeBoxOptions extends ValueWidgetOptions {\n type?: 'date' | 'time' | 'datetime';\n format?: string;\n min?: Date | string;\n max?: Date | string;\n placeholder?: AXPMultiLanguageString;\n clearButton?: boolean;\n}\n\nexport interface ToggleSwitchOptions extends ValueWidgetOptions {\n label?: string;\n trueText?: string;\n falseText?: string;\n}\n\nexport interface LargeTextBoxOptions extends ValueWidgetOptions {\n rows?: number;\n maxLength?: number;\n minLength?: number;\n placeholder?: AXPMultiLanguageString;\n resizable?: boolean;\n}\n\nexport interface ColorBoxOptions extends ValueWidgetOptions {\n format?: 'hex' | 'rgb' | 'hsl';\n showAlpha?: boolean;\n showPalette?: boolean;\n}\n\n// Container-specific options based on actual widget configs\nexport interface AXPFlexContainerOptions extends LayoutWidgetOptions {\n flexDirection?: 'row' | 'column' | 'row-reverse' | 'column-reverse';\n flexWrap?: 'nowrap' | 'wrap' | 'wrap-reverse';\n justifyContent?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly';\n alignItems?: 'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch';\n gap?: string;\n spacing?: {\n padding?: string;\n margin?: string;\n };\n border?: {\n radius?: string;\n width?: string;\n color?: string;\n style?: string;\n };\n backgroundColor?: string;\n direction?: string;\n overflow?: string;\n overflowX?: string;\n overflowY?: string;\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n height?: string;\n minHeight?: string;\n maxHeight?: string;\n}\n\nexport interface AXPGridContainerOptions extends LayoutWidgetOptions {\n grid?: {\n default?: {\n columns?: number;\n rows?: number;\n gap?: string;\n justifyItems?: string;\n alignItems?: string;\n autoFlow?: string;\n };\n };\n spacing?: {\n padding?: string;\n margin?: string;\n };\n border?: {\n radius?: string;\n width?: string;\n color?: string;\n style?: string;\n };\n backgroundColor?: string;\n direction?: string;\n overflow?: string;\n overflowX?: string;\n overflowY?: string;\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n height?: string;\n minHeight?: string;\n maxHeight?: string;\n}\n\nexport interface AXPPanelContainerOptions extends LayoutWidgetOptions {\n caption?: string;\n icon?: string;\n look?: 'solid' | 'fill' | 'outline' | 'flat' | 'none';\n disabled?: boolean;\n showHeader?: boolean;\n collapsed?: boolean;\n}\n\nexport interface AXPPageContainerOptions extends LayoutWidgetOptions {\n backgroundColor?: string;\n theme?: { id: string };\n hasHeader?: boolean;\n hasFooter?: boolean;\n direction?: string;\n}\n\nexport interface AXPTabsetContainerOptions extends LayoutWidgetOptions {\n look?: 'with-line' | 'with-line-color' | 'pills' | 'pills-color';\n orientation?: 'vertical' | 'horizontal';\n activeIndex?: number;\n}\n\nexport interface AXPFieldsetContainerOptions extends LayoutWidgetOptions {\n title?: string;\n description?: string;\n icon?: string;\n collapsible?: boolean;\n isOpen?: boolean;\n look?: 'fieldset' | 'card' | 'group' | 'container';\n disabled?: boolean;\n showTitle?: boolean;\n showHeader?: boolean;\n cols?: number;\n}\n\n/** How optional `hint` text is rendered in `form-field` layout widgets. */\nexport type AXPFormFieldHintDisplayMode = 'icon' | 'note';\n\nexport interface AXPFormFieldOptions extends LayoutWidgetOptions {\n label?: string;\n showLabel?: boolean;\n /** Translated/helper copy; pairing with {@link hintDisplayMode}. */\n hint?: AXPMultiLanguageString;\n hintDisplayMode?: AXPFormFieldHintDisplayMode;\n}\n\nexport interface AXPDialogCloseConfirmationOptions {\n /** When false, dirty-close confirmation is disabled even if the builder flag is set. */\n enabled?: boolean;\n title?: AXPMultiLanguageString;\n message?: AXPMultiLanguageString;\n /** Custom dirty check; defaults to user-origin context paths plus composite widget `api().isDirty()`. */\n isDirty?: (context: Record<string, unknown>, baseline: Record<string, unknown>) => boolean;\n}\n\nexport interface AXPDialogContainerOptions extends LayoutWidgetOptions {\n title?: string;\n message?: string;\n size?: AXPopupSizeType;\n closeButton?: boolean;\n context?: any;\n metadata?: AXPMetaData;\n /**\n * When enabled, prompts before dismiss (cancel, Esc, header close) if dialog context is dirty.\n * Set via {@link IDialogBuilder.confirmCloseWhenDirty}.\n */\n confirmCloseWhenDirty?: boolean | AXPDialogCloseConfirmationOptions;\n /**\n * When set, invoked on footer action with {@link AXPDialogRef}.\n * Set via {@link IDialogBuilder.onAction}.\n */\n onAction?: (dialogRef: AXPDialogRef) => unknown | Promise<unknown>;\n}\n\n\n/**\n * Popup payload for `AXPDialogRendererComponent` (`data.config`) and the `layout-builder.dialog.config` hook.\n */\nexport interface AXPLayoutBuilderDialogConfig {\n title: string;\n //TODO: why we need message?\n //message?: string;\n context: Record<string, unknown>;\n definition: AXPWidgetNode;\n metadata?: AXPMetaData;\n actions: NonNullable<DialogBuilderState['actions']>;\n onAction?: (dialogRef: AXPDialogRef) => unknown | Promise<unknown>;\n confirmCloseWhenDirty?: AXPDialogCloseConfirmationOptions;\n}\n\n\nexport interface RichTextOptions extends ValueWidgetOptions {\n placeholder?: AXPMultiLanguageString;\n toolbar?: string[];\n readonly?: boolean;\n /** Max height (px) for scrollable full preview when `showFullContent` is true. */\n height?: number;\n /** When true, view mode renders full HTML in a scrollable area instead of a truncated snippet. */\n showFullContent?: boolean;\n}\n\nexport interface PasswordBoxOptions extends ValueWidgetOptions {\n placeholder?: AXPMultiLanguageString;\n revealToggle?: boolean;\n maxLength?: number;\n}\n\nexport interface LookupBoxOptions extends ValueWidgetOptions {\n dataSource?: any[] | (() => any[]) | (() => Promise<any[]>);\n valueField?: string;\n textField?: string;\n searchable?: boolean;\n entity?: string;\n look?: string;\n columns?: any[];\n expose?: any[];\n multiple?: boolean;\n allowClear?: boolean;\n}\n\nexport interface SelectionListOptions extends ValueWidgetOptions {\n dataSource: any[] | (() => any[]) | (() => Promise<any[]>) | AXDataSource<any>;\n valueField?: string;\n textField?: string;\n multiple?: boolean;\n searchable?: boolean;\n placeholder?: AXPMultiLanguageString;\n}\n\n// List Widget Types\nexport interface AXPListWidgetColumn {\n name: string;\n title?: string;\n visible?: boolean;\n width?: string;\n widget?: {\n type: string;\n path?: string;\n options?: any;\n };\n}\n\nexport interface AXPListWidgetRowCommand {\n title?: string;\n icon?: string;\n color?: string;\n disabled?: boolean | string;\n hidden?: boolean | string;\n command?: any;\n}\n\nexport interface AXPListWidgetOptions extends LayoutWidgetOptions {\n dataSource?: any[] | AXDataSource;\n columns?: AXPListWidgetColumn[];\n\n // Event Callbacks\n onRowClick?: (row: any) => void;\n onRowDoubleClick?: (row: any) => void;\n onSelectionChange?: (selectedRows: any[]) => void;\n onRowCommand?: (command: any, selectedRows: any[]) => void;\n\n // Table Features\n paging?: boolean;\n showHeader?: boolean;\n showFooter?: boolean;\n fixHeader?: boolean;\n fixFooter?: boolean;\n fetchDataMode?: 'auto' | 'manual';\n parentField?: string;\n minHeight?: string | number;\n\n // Selection & Index\n showIndex?: boolean;\n allowSelection?: boolean;\n\n // Row Commands\n primaryCommands?: any[];\n secondaryCommands?: AXPListWidgetRowCommand[];\n\n // Loading State\n loading?: {\n enabled?: boolean;\n animation?: boolean;\n };\n}\n\n// Step Wizard Types\nexport interface AXPWizardActionDefinition {\n title?: string;\n icon?: string;\n color?: string;\n}\n\nexport interface AXPWizardActions {\n previous?: AXPWizardActionDefinition;\n next?: AXPWizardActionDefinition;\n submit?: AXPWizardActionDefinition;\n}\n\nexport interface AXPStepDefinition {\n id: string;\n title: string;\n description?: string;\n icon?: string;\n skippable?: boolean;\n content: AXPWidgetNode;\n actions?: AXPActionMenuItem[];\n}\n\nexport interface AXPStepWizardGuardPayload {\n step: AXPStepDefinition;\n index: number;\n total: number;\n isFirst: boolean;\n isLast: boolean;\n context: any;\n stepContext?: any;\n dialogContext?: any;\n}\n\nexport interface AXPStepWizardStatus {\n currentStep: AXPStepDefinition;\n index: number;\n total: number;\n isFirst: boolean;\n isLast: boolean;\n}\n\nexport interface AXPStepWizardDefinition {\n steps: AXPStepDefinition[];\n linear?: boolean;\n direction?: 'horizontal' | 'vertical';\n look?: string;\n showActions?: boolean;\n actions?: AXPWizardActions;\n guards?: {\n next?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n prev?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n };\n events?: {\n onStepChanged?: (status: AXPStepWizardStatus) => void;\n onComplete?: (status: AXPStepWizardStatus) => void;\n };\n}\n\nexport interface AXPStepWizardContainerOptions extends LayoutWidgetOptions {\n definition?: AXPStepWizardDefinition;\n}\n\n//#endregion\n\n//#region ---- Inheritance Context Types ----\n\n// Forward declaration for circular reference\nexport interface IDialogBuilder<T = AXPDialogRef> { }\n\n// Context for inheriting properties from parent nodes\nexport interface InheritanceContext {\n mode?: AXPWidgetRenderMode;\n disabled?: boolean | string;\n readonly?: boolean | string;\n direction?: 'rtl' | 'ltr';\n visible?: boolean | string;\n defaultValue?: any;\n}\n\n// Helper type for resolving inherited properties\nexport interface InheritedProperties {\n mode: AXPWidgetRenderMode;\n disabled: boolean | string | undefined;\n readonly: boolean | string | undefined;\n direction: 'rtl' | 'ltr' | undefined;\n visible: boolean | string | undefined;\n}\n\n//#endregion\n\n//#region ---- Builder State Types ----\n\n// Base widget configuration - no path management here\nexport interface AXPWidgetConfiguration {\n type: string;\n options?: AXPOptionsData;\n}\n\n// Builder state interfaces\nexport type LayoutBuilderState = AXPWidgetNode;\n\n// WidgetBuilderState mirrors AXPWidgetNode but intentionally excludes `children` for most widgets\nexport type WidgetBuilderState = AXPWidgetNode & { layout?: AXPGridLayoutOptions };\n\n// FormFieldBuilderState includes children since form fields can contain widgets\nexport type FormFieldBuilderState = AXPWidgetNode & { layout?: AXPGridLayoutOptions };\n\n/** Dialog footer action item; extends menu actions with placement and keyboard shortcuts. */\nexport type AXPDialogActionMenuItem = AXPActionMenuItem & {\n position?: 'prefix' | 'suffix';\n shortcuts?: AXPDialogActionShortcut[];\n};\n\n// DialogBuilderState includes dialog-specific properties\nexport type DialogBuilderState = AXPWidgetNode & {\n layout?: AXPGridLayoutOptions;\n dialogOptions?: AXPDialogContainerOptions;\n actions?: {\n footer?: {\n prefix?: AXPDialogActionMenuItem[];\n suffix?: AXPDialogActionMenuItem[];\n };\n };\n};\n\n\nexport interface IActionBuilder {\n cancel(text?: string, options?: AXPDialogActionOptions): IActionBuilder;\n submit(text?: string, options?: AXPDialogActionOptions): IActionBuilder;\n custom(action: AXPDialogActionMenuItem, options?: AXPDialogActionOptions): IActionBuilder;\n}\n\n//#endregion\n\n//#region ---- Core Builder Interfaces ----\n\n// Main layout builder interface - Single Responsibility: Layout orchestration\nexport interface ILayoutBuilder {\n // Predefined layout containers at root level - only these are allowed with specific types\n grid(delegate: (container: IGridContainerBuilder) => void): ILayoutBuilder;\n flex(delegate: (container: IFlexContainerBuilder) => void): ILayoutBuilder;\n panel(delegate: (container: IPanelContainerBuilder) => void): ILayoutBuilder;\n page(delegate: (container: IPageContainerBuilder) => void): ILayoutBuilder;\n tabset(delegate: (container: ITabsetContainerBuilder) => void): ILayoutBuilder;\n fieldset(delegate: (container: IFieldsetContainerBuilder) => void): ILayoutBuilder;\n dialog<T = AXPDialogRef>(delegate: (container: IDialogBuilder<T>) => void): IDialogBuilder<T>;\n stepWizard(delegate: (wizard: IStepWizardBuilder) => void): ILayoutBuilder;\n\n // Build and render\n build(): AXPWidgetNode;\n toJson(options?: { removeMeta?: boolean; removeFunctions?: boolean; pretty?: boolean }): string;\n}\n\n//#endregion\n\n//#region ---- Widget Builder Interfaces ----\n\n// Base widget builder interface - Single Responsibility: Widget configuration\nexport interface IWidgetBuilder {\n name(name: string): IWidgetBuilder;\n path(path: string): IWidgetBuilder;\n type(type: string): IWidgetBuilder;\n options(options: AXPOptionsData): IWidgetBuilder;\n\n // Layout\n layout(config: Partial<AXPGridLayoutOptions>): IWidgetBuilder;\n layout(colSpan: number): IWidgetBuilder;\n mode(mode: AXPWidgetRenderMode): IWidgetBuilder;\n\n // State (managed by higher-level systems like dynamic forms)\n visible(condition: boolean | string): IWidgetBuilder;\n disabled(condition: boolean | string): IWidgetBuilder;\n readonly(condition: boolean | string): IWidgetBuilder;\n defaultValue(defaultValue: any): IWidgetBuilder;\n direction(direction: 'rtl' | 'ltr'): IWidgetBuilder;\n\n // Inheritance context methods\n withInheritanceContext(context: InheritanceContext): IWidgetBuilder;\n getInheritanceContext(): InheritanceContext;\n\n // Build\n build(): AXPWidgetNode;\n}\n\n//#endregion\n\n//#region ---- Container Builder Interfaces ----\n\n// Base container builder interface - Interface Segregation: Common container operations\nexport interface IBaseContainerBuilder<TContainer = any> {\n name(name: string): TContainer;\n path(path: string): TContainer;\n mode(mode: AXPWidgetRenderMode): TContainer;\n visible(condition: boolean | AXPExpression): TContainer;\n disabled(condition: boolean | AXPExpression): TContainer;\n readonly(condition: boolean | AXPExpression): TContainer;\n direction(direction: 'rtl' | 'ltr'): TContainer;\n\n // Inheritance context methods\n withInheritanceContext(context: InheritanceContext): TContainer;\n getInheritanceContext(): InheritanceContext;\n\n build(): AXPWidgetNode;\n}\n\n// Layout-specific container operations\nexport interface ILayoutContainerBuilder<TContainer = any> {\n layout(config: Partial<AXPGridLayoutOptions>): TContainer;\n layout(colSpan: number): TContainer;\n}\n\n// Child container management\nexport interface IChildContainerBuilder<TContainer = any> {\n grid(delegate: (container: IGridContainerBuilder) => void): TContainer;\n flex(delegate: (container: IFlexContainerBuilder) => void): TContainer;\n panel(delegate: (container: IPanelContainerBuilder) => void): TContainer;\n page(delegate: (container: IPageContainerBuilder) => void): TContainer;\n tabset(delegate: (container: ITabsetContainerBuilder) => void): TContainer;\n fieldset(delegate: (container: IFieldsetContainerBuilder) => void): TContainer;\n formField(label: string, delegate?: (field: IFormFieldBuilder) => void): TContainer;\n stepWizard(delegate: (wizard: IStepWizardBuilder) => void): TContainer;\n dynamicForm(definition: AXPDynamicFormDefinition): TContainer;\n}\n\n// Widget creation operations\nexport interface IWidgetContainerBuilder<TContainer = any> {\n textBox(options?: TextBoxOptions): TContainer;\n largeTextBox(options?: LargeTextBoxOptions): TContainer;\n richText(options?: RichTextOptions): TContainer;\n passwordBox(options?: PasswordBoxOptions): TContainer;\n numberBox(options?: NumberBoxOptions): TContainer;\n selectBox(options: SelectBoxOptions): TContainer;\n lookupBox(options: LookupBoxOptions): TContainer;\n selectionList(options: SelectionListOptions): TContainer;\n dateTimeBox(options?: DateTimeBoxOptions): TContainer;\n toggleSwitch(options?: ToggleSwitchOptions): TContainer;\n colorBox(options?: ColorBoxOptions): TContainer;\n list(delegate: (container: IListWidgetBuilder) => void): TContainer;\n customWidget<T>(type: string, options?: T): TContainer;\n customWidget<T>(type: string, delegate: (widget: IWidgetBuilder) => void): TContainer;\n}\n\n// Flex container builder - Interface Segregation: Combines all container interfaces\nexport interface IFlexContainerBuilder\n extends\n IBaseContainerBuilder<IFlexContainerBuilder>,\n ILayoutContainerBuilder<IFlexContainerBuilder>,\n IChildContainerBuilder<IFlexContainerBuilder>,\n IWidgetContainerBuilder<IFlexContainerBuilder> {\n // Flex-specific options - both object and individual methods\n setOptions(options: AXPFlexContainerOptions): IFlexContainerBuilder;\n setDirection(direction: 'row' | 'column' | 'row-reverse' | 'column-reverse'): IFlexContainerBuilder;\n setWrap(wrap: 'nowrap' | 'wrap' | 'wrap-reverse'): IFlexContainerBuilder;\n setJustifyContent(\n justify: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly',\n ): IFlexContainerBuilder;\n setAlignItems(align: 'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch'): IFlexContainerBuilder;\n setGap(gap: string): IFlexContainerBuilder;\n setBackgroundColor(color: string): IFlexContainerBuilder;\n setPadding(padding: string): IFlexContainerBuilder;\n setMargin(margin: string): IFlexContainerBuilder;\n}\n\n// Grid container builder - Interface Segregation: Combines all container interfaces\nexport interface IGridContainerBuilder\n extends\n IBaseContainerBuilder<IGridContainerBuilder>,\n ILayoutContainerBuilder<IGridContainerBuilder>,\n IChildContainerBuilder<IGridContainerBuilder>,\n IWidgetContainerBuilder<IGridContainerBuilder> {\n // Grid-specific options - both object and individual methods\n setOptions(options: AXPGridContainerOptions): IGridContainerBuilder;\n setColumns(columns: number): IGridContainerBuilder;\n setRows(rows: number): IGridContainerBuilder;\n setGap(gap: string): IGridContainerBuilder;\n setJustifyItems(justify: 'start' | 'end' | 'center' | 'stretch'): IGridContainerBuilder;\n setAlignItems(align: 'start' | 'end' | 'center' | 'stretch'): IGridContainerBuilder;\n setAutoFlow(flow: 'row' | 'column' | 'row dense' | 'column dense'): IGridContainerBuilder;\n setBackgroundColor(color: string): IGridContainerBuilder;\n setPadding(padding: string): IGridContainerBuilder;\n setMargin(margin: string): IGridContainerBuilder;\n /** Add a grid-item-layout child with optional placement; delegate builds the fieldset content. */\n item(\n layoutOptions: Partial<AXPGridLayoutOptions> | null | undefined,\n delegate: (container: IFieldsetContainerBuilder) => void,\n ): IGridContainerBuilder;\n}\n\n// Panel container builder - Interface Segregation: Combines all container interfaces\nexport interface IPanelContainerBuilder\n extends\n IBaseContainerBuilder<IPanelContainerBuilder>,\n ILayoutContainerBuilder<IPanelContainerBuilder>,\n IChildContainerBuilder<IPanelContainerBuilder>,\n IWidgetContainerBuilder<IPanelContainerBuilder> {\n // Panel-specific options\n setOptions(options: AXPPanelContainerOptions): IPanelContainerBuilder;\n setCaption(caption: string): IPanelContainerBuilder;\n setIcon(icon: string): IPanelContainerBuilder;\n setLook(look: 'solid' | 'fill' | 'outline' | 'flat' | 'none'): IPanelContainerBuilder;\n setShowHeader(show: boolean): IPanelContainerBuilder;\n setCollapsed(collapsed: boolean): IPanelContainerBuilder;\n}\n\n// Page container builder - Interface Segregation: Combines all container interfaces\nexport interface IPageContainerBuilder\n extends\n IBaseContainerBuilder<IPageContainerBuilder>,\n ILayoutContainerBuilder<IPageContainerBuilder>,\n IChildContainerBuilder<IPageContainerBuilder>,\n IWidgetContainerBuilder<IPageContainerBuilder> {\n // Page-specific options\n setOptions(options: AXPPageContainerOptions): IPageContainerBuilder;\n setBackgroundColor(color: string): IPageContainerBuilder;\n setTheme(theme: { id: string }): IPageContainerBuilder;\n setHasHeader(hasHeader: boolean): IPageContainerBuilder;\n setHasFooter(hasFooter: boolean): IPageContainerBuilder;\n setDirection(direction: 'rtl' | 'ltr'): IPageContainerBuilder;\n}\n\n// Tabset container builder - Interface Segregation: Combines all container interfaces\nexport interface ITabsetContainerBuilder\n extends\n IBaseContainerBuilder<ITabsetContainerBuilder>,\n ILayoutContainerBuilder<ITabsetContainerBuilder>,\n IChildContainerBuilder<ITabsetContainerBuilder>,\n IWidgetContainerBuilder<ITabsetContainerBuilder> {\n // Tabset-specific options\n setOptions(options: AXPTabsetContainerOptions): ITabsetContainerBuilder;\n setLook(look: 'with-line' | 'with-line-color' | 'pills' | 'pills-color'): ITabsetContainerBuilder;\n setOrientation(orientation: 'vertical' | 'horizontal'): ITabsetContainerBuilder;\n setActiveIndex(index: number): ITabsetContainerBuilder;\n}\n\n// Form field builder - Interface Segregation: Combines base and widget interfaces\n// Form fields can only contain ONE widget\nexport interface IFormFieldBuilder\n extends IBaseContainerBuilder<IFormFieldBuilder>, ILayoutContainerBuilder<IFormFieldBuilder> {\n // Form field specific options\n setOptions(options: AXPFormFieldOptions): IFormFieldBuilder;\n setLabel(label: string): IFormFieldBuilder;\n setShowLabel(showLabel: boolean): IFormFieldBuilder;\n defaultValue(value: any): IFormFieldBuilder;\n\n // Single widget methods (replaces IWidgetContainerBuilder)\n textBox(options?: Omit<TextBoxOptions, 'path'>): IFormFieldBuilder;\n largeTextBox(options?: Omit<LargeTextBoxOptions, 'path'>): IFormFieldBuilder;\n richText(options?: Omit<RichTextOptions, 'path'>): IFormFieldBuilder;\n passwordBox(options?: Omit<PasswordBoxOptions, 'path'>): IFormFieldBuilder;\n numberBox(options?: Omit<NumberBoxOptions, 'path'>): IFormFieldBuilder;\n selectBox(options: Omit<SelectBoxOptions, 'path'>): IFormFieldBuilder;\n lookupBox(options: Omit<LookupBoxOptions, 'path'>): IFormFieldBuilder;\n selectionList(options: Omit<SelectionListOptions, 'path'>): IFormFieldBuilder;\n dateTimeBox(options?: Omit<DateTimeBoxOptions, 'path'>): IFormFieldBuilder;\n toggleSwitch(options?: Omit<ToggleSwitchOptions, 'path'>): IFormFieldBuilder;\n colorBox(options?: Omit<ColorBoxOptions, 'path'>): IFormFieldBuilder;\n customWidget<T>(type: string, options?: Omit<T, 'path'>): IFormFieldBuilder;\n customWidget<T>(\n type: string,\n options?: Omit<T, 'path'> & Partial<AXPWidgetNodeExtendedProperties>,\n ): IFormFieldBuilder;\n}\n\n// Fieldset container builder - Interface Segregation: Specialized for form fields only\nexport interface IFieldsetContainerBuilder\n extends IBaseContainerBuilder<IFieldsetContainerBuilder>, ILayoutContainerBuilder<IFieldsetContainerBuilder> {\n // Fieldset-specific options\n setOptions(options: AXPFieldsetContainerOptions): IFieldsetContainerBuilder;\n setTitle(title: string): IFieldsetContainerBuilder;\n setDescription(description: string): IFieldsetContainerBuilder;\n setIcon(icon: string): IFieldsetContainerBuilder;\n setCollapsible(collapsible: boolean): IFieldsetContainerBuilder;\n setIsOpen(isOpen: boolean): IFieldsetContainerBuilder;\n setLook(look: 'fieldset' | 'card' | 'group' | 'container'): IFieldsetContainerBuilder;\n setShowHeader(showHeader: boolean): IFieldsetContainerBuilder;\n setCols(cols: number): IFieldsetContainerBuilder;\n\n // Only form fields are allowed in fieldset\n formField(label: string, delegate?: (field: IFormFieldBuilder) => void): IFieldsetContainerBuilder;\n}\n\n// Dialog container builder - Interface Segregation: Specialized for dialog functionality\nexport interface IDialogBuilder<T = AXPDialogRef> {\n // Dialog-specific options\n setOptions(options: AXPDialogContainerOptions): IDialogBuilder<T>;\n setTitle(title: string): IDialogBuilder<T>;\n setMessage(message?: string): IDialogBuilder<T>;\n setSize(size: AXPopupSizeType): IDialogBuilder<T>;\n setCloseButton(closeButton: boolean): IDialogBuilder<T>;\n setContext(context: any): IDialogBuilder<T>;\n\n // Content method - wraps layout builder methods\n content(delegate: (layoutBuilder: IFlexContainerBuilder) => void): IDialogBuilder<T>;\n\n // Actions method\n setActions(delegate?: (actions: IActionBuilder) => void): IDialogBuilder<T>;\n\n /**\n * Handler invoked when user clicks an action. Receives AXPDialogRef (context, action, setLoading, close).\n * If handler throws, dialog stays open for retry.\n * If handler returns, dialog closes and show() resolves with the return value.\n */\n onAction(handler: (dialogRef: AXPDialogRef) => T | Promise<T>): IDialogBuilder<T>;\n\n /**\n * Prompts for confirmation before dismiss when the dialog context is dirty (cancel, Esc, header close).\n */\n confirmCloseWhenDirty(options?: boolean | AXPDialogCloseConfirmationOptions): IDialogBuilder<T>;\n\n // Custom action management (for step wizard integration)\n addCustomAction(action: AXPActionMenuItem): IDialogBuilder<T>;\n\n // Dialog-specific methods\n build(): AXPWidgetNode;\n show(): Promise<T>;\n}\n\n// List Widget Builder - Interface Segregation: Combines all container interfaces\nexport interface IListWidgetBuilder\n extends\n IBaseContainerBuilder<IListWidgetBuilder>,\n ILayoutContainerBuilder<IListWidgetBuilder>,\n IChildContainerBuilder<IListWidgetBuilder>,\n IWidgetContainerBuilder<IListWidgetBuilder> {\n // List-specific options\n setOptions(options: AXPListWidgetOptions): IListWidgetBuilder;\n setDataSource(dataSource: any[] | AXDataSource): IListWidgetBuilder;\n setColumns(columns: AXPListWidgetColumn[]): IListWidgetBuilder;\n\n // Event handlers\n setOnRowClick(handler: (row: any) => void): IListWidgetBuilder;\n setOnRowDoubleClick(handler: (row: any) => void): IListWidgetBuilder;\n setOnSelectionChange(handler: (selectedRows: any[]) => void): IListWidgetBuilder;\n setOnRowCommand(handler: (command: any, selectedRows: any[]) => void): IListWidgetBuilder;\n\n // Table features\n setPaging(paging: boolean): IListWidgetBuilder;\n setShowHeader(show: boolean): IListWidgetBuilder;\n setShowFooter(show: boolean): IListWidgetBuilder;\n setFixHeader(fix: boolean): IListWidgetBuilder;\n setFixFooter(fix: boolean): IListWidgetBuilder;\n setFetchDataMode(mode: 'auto' | 'manual'): IListWidgetBuilder;\n setParentField(field: string): IListWidgetBuilder;\n setMinHeight(height: string | number): IListWidgetBuilder;\n\n // Selection & Index\n setShowIndex(show: boolean): IListWidgetBuilder;\n setAllowSelection(allow: boolean): IListWidgetBuilder;\n\n // Commands\n setPrimaryCommands(commands: any[]): IListWidgetBuilder;\n setSecondaryCommands(commands: AXPListWidgetRowCommand[]): IListWidgetBuilder;\n\n // Loading\n setLoading(loading: { enabled?: boolean; animation?: boolean }): IListWidgetBuilder;\n}\n\n// Step Builder - Interface for building individual steps\nexport interface IStepBuilder {\n setIcon(icon: string): IStepBuilder;\n setDescription(description: string): IStepBuilder;\n setSkippable(skippable: boolean): IStepBuilder;\n\n // Content using layout builder\n content(delegate: (layoutBuilder: ILayoutBuilder) => void): IStepBuilder;\n\n // Step-specific actions (future feature - skip for now)\n // addAction(action: AXPActionMenuItem): IStepBuilder;\n\n build(): AXPStepDefinition;\n}\n\n// Step Wizard Builder - Interface for building step wizard\nexport interface IStepWizardBuilder\n extends IBaseContainerBuilder<IStepWizardBuilder>, ILayoutContainerBuilder<IStepWizardBuilder> {\n // Configuration\n setLinear(linear: boolean): IStepWizardBuilder;\n setDirection(direction: 'horizontal' | 'vertical'): IStepWizardBuilder;\n setLook(look: AXStepWizardLook): IStepWizardBuilder;\n setShowActions(show: boolean): IStepWizardBuilder;\n\n // Actions\n setActions(actions: AXPWizardActions): IStepWizardBuilder;\n\n // Guards\n setGuards(guards: {\n next?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n prev?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n }): IStepWizardBuilder;\n\n // Events\n setEvents(events: {\n onStepChanged?: (status: AXPStepWizardStatus) => void;\n onComplete?: (status: AXPStepWizardStatus) => void;\n }): IStepWizardBuilder;\n\n // Add steps\n step(id: string, title: string, delegate: (step: IStepBuilder) => void): IStepWizardBuilder;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\n\nimport type { AXPDialogContainerOptions } from './layout-builder.types';\n\n//#endregion\n\n//#region ---- Before open ----\n\n/**\n * Runs after dialog options and context are prepared and **before** footer customization and popup open.\n * Listeners may mutate {@link AXPLayoutBuilderDialogBeforeOpenPayload.context} by reference.\n */\nexport const AXP_LAYOUT_BUILDER_DIALOG_BEFORE_OPEN_HOOK_KEY = 'layout-builder.dialog.before-open';\n\nexport interface AXPLayoutBuilderDialogBeforeOpenPayload {\n context: Record<string, unknown>;\n dialogOptions: AXPDialogContainerOptions;\n}\n\n//#endregion\n\n//#region ---- Footer actions ----\n\n/**\n * Runs after builder-defined footer actions exist and **before** the dialog opens.\n * Listeners receive the live `actions.footer.prefix` / `suffix` arrays (same references as the dialog)\n * so they may push, splice, filter, or replace items. They may also mutate {@link AXPLayoutBuilderDialogFooterPayload.context} by reference.\n */\nexport const AXP_LAYOUT_BUILDER_DIALOG_CONFIG_HOOK_KEY = 'layout-builder.dialog.config';\n\n//#endregion\n\n//#region ---- Context updates (after open) ----\n\n/**\n * Runs whenever the dialog layout builder context changes (debounced upstream), **after** the popup is visible.\n * Use for side effects that depend on live context (for example values updated by widgets after render).\n * Payload mirrors `AXPDialogRendererComponent` semantics: {@link AXPLayoutBuilderDialogContextChangedPayload.getContext},\n * {@link AXPLayoutBuilderDialogContextChangedPayload.patchContext}, and optional loading state.\n */\nexport const AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY = 'layout-builder.dialog.context-changed';\n\nexport interface AXPLayoutBuilderDialogContextChangedPayload {\n /** Stable id for this dialog instance; lets listeners correlate repeated emissions or async follow-up work. */\n sessionKey: string;\n\n getContext: () => Record<string, unknown>;\n\n metadata: Record<string, unknown> | undefined;\n\n patchContext: (partial: Record<string, unknown>) => void;\n\n setLoading: (loading: boolean) => void;\n}\n\n//#endregion\n","import { AXPWidgetNode } from '@acorex/platform/layout/widget-core';\nimport { Injectable } from '@angular/core';\nimport {\n AXPDynamicFormDefinition,\n AXPDynamicFormFieldDefinition,\n AXPDynamicFormGroupDefinition,\n AXPDynamicFormMode,\n} from './layout-builder.types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPLayoutConversionService {\n //#region ---- Caching ----\n\n private widgetTreeCache = new Map<string, AXPWidgetNode>();\n private formDefinitionCache = new Map<string, AXPDynamicFormDefinition>();\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Convert AXPDynamicFormDefinition to AXPWidgetNode tree structure\n * Groups become Fieldset Layouts with Form Field widgets as children\n * Fields become Form Field widgets with Editor widgets as children\n */\n convertFormDefinition(formDefinition: AXPDynamicFormDefinition): AXPWidgetNode {\n // Create cache key based on form definition content\n const cacheKey = this.createFormDefinitionCacheKey(formDefinition);\n\n // Check cache first\n if (this.widgetTreeCache.has(cacheKey)) {\n return this.widgetTreeCache.get(cacheKey)!;\n }\n\n // Generate widget tree\n const widgetTree: AXPWidgetNode = {\n type: 'grid-layout',\n name: 'dynamic-form-container',\n mode: formDefinition.mode, // Preserve form-level mode\n options: {\n title: 'Dynamic Form',\n grid: {\n default: {\n columns: 1,\n gap: '1rem',\n },\n },\n },\n children: formDefinition.groups.map((group) => this.createGroupAsFieldsetWidget(group, formDefinition.mode)),\n };\n\n // Cache the result\n this.widgetTreeCache.set(cacheKey, widgetTree);\n\n return widgetTree;\n }\n\n /**\n * Convert AXPWidgetNode tree back to AXPDynamicFormDefinition\n * Parses Fieldset Layouts back to Groups\n * Parses Form Field widgets back to Fields\n */\n convertWidgetTreeToFormDefinition(widgetTree: AXPWidgetNode): AXPDynamicFormDefinition {\n // Create cache key based on widget tree content\n const cacheKey = this.createWidgetTreeCacheKey(widgetTree);\n\n // Check cache first\n if (this.formDefinitionCache.has(cacheKey)) {\n return this.formDefinitionCache.get(cacheKey)!;\n }\n\n // Parse widget tree\n const groups: AXPDynamicFormGroupDefinition[] = [];\n\n if (widgetTree.children) {\n widgetTree.children.forEach((child) => {\n if (child.type === 'fieldset-layout') {\n const group = this.extractGroupFromFieldset(child);\n groups.push(group);\n }\n });\n }\n\n const formDefinition = { groups };\n\n // Cache the result\n this.formDefinitionCache.set(cacheKey, formDefinition);\n\n return formDefinition;\n }\n\n /**\n * Validate that a widget tree represents a valid dynamic form structure\n */\n validateFormWidgetTree(widgetTree: AXPWidgetNode): boolean {\n if (!widgetTree || widgetTree.type !== 'grid-layout') {\n return false;\n }\n\n if (!widgetTree.children || widgetTree.children.length === 0) {\n return true; // Empty form is valid\n }\n\n // Check that all children are fieldset-layout widgets\n return widgetTree.children.every(\n (child) =>\n child.type === 'fieldset-layout' &&\n child.children &&\n child.children.every(\n (formField) => formField.type === 'form-field' && formField.children && formField.children.length > 0,\n ),\n );\n }\n\n /**\n * Clear all caches\n */\n clearCaches(): void {\n this.widgetTreeCache.clear();\n this.formDefinitionCache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { widgetTreeCacheSize: number; formDefinitionCacheSize: number } {\n return {\n widgetTreeCacheSize: this.widgetTreeCache.size,\n formDefinitionCacheSize: this.formDefinitionCache.size,\n };\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n /**\n * Convert a single group to Fieldset widget structure\n */\n private createGroupAsFieldsetWidget(group: AXPDynamicFormGroupDefinition, formMode?: AXPDynamicFormMode): AXPWidgetNode {\n // Determine columns count from layout or default to 1\n const columnsCount = 1;\n // Use group mode if set, otherwise inherit from form mode\n const groupMode = group.mode || formMode;\n\n return {\n type: 'fieldset-layout',\n name: group.name,\n mode: groupMode,\n options: {\n title: group.title,\n description: group.description,\n cols: columnsCount,\n look: group.look || 'container', // Default to 'container' if not specified\n },\n children: this.createFieldWidgets(group.parameters, columnsCount, groupMode),\n };\n }\n\n /**\n * Convert fields to Form Field widgets\n */\n private createFieldWidgets(fields: AXPDynamicFormFieldDefinition[], columnsCount: number, groupMode?: AXPDynamicFormMode): AXPWidgetNode[] {\n return fields.map((field) => this.createFormFieldWidget(field, groupMode));\n }\n\n /**\n * Convert a single field to Form Field widget with editor as child\n */\n private createFormFieldWidget(field: AXPDynamicFormFieldDefinition, groupMode?: AXPDynamicFormMode): AXPWidgetNode {\n // Use field mode if set, otherwise inherit from group mode\n const fieldMode = field.mode || groupMode;\n\n // Ensure the editor widget also has the mode set\n const editorWidget = { ...field.widget };\n if (!editorWidget.mode) {\n editorWidget.mode = fieldMode;\n }\n\n const hintOpts =\n field.description != null &&\n (typeof field.description !== 'string' || field.description.trim().length > 0)\n ? ({ hint: field.description, hintDisplayMode: 'note' as const } satisfies Record<string, unknown>)\n : {};\n\n return {\n type: 'form-field',\n name: field.path,\n mode: fieldMode,\n options: {\n label: field.title,\n badge: field.badge,\n showLabel: true,\n ...hintOpts,\n },\n children: [editorWidget], // The editor widget becomes a child of form-field\n };\n }\n\n /**\n * Extract group information from Fieldset Layout widget\n */\n private extractGroupFromFieldset(fieldsetNode: AXPWidgetNode): AXPDynamicFormGroupDefinition {\n const columnsCount = fieldsetNode.options?.['cols'] || 1;\n\n // Extract fields directly from fieldset children\n const fields: AXPDynamicFormFieldDefinition[] = [];\n\n if (fieldsetNode.children) {\n fieldsetNode.children.forEach((formField) => {\n if (formField.type === 'form-field' && formField.children && formField.children.length > 0) {\n const field = this.extractFieldFromFormWidget(formField);\n if (field) {\n fields.push(field);\n }\n }\n });\n }\n\n return {\n name: fieldsetNode.name || `group-${Date.now()}`,\n title: fieldsetNode.options?.['title'],\n description: fieldsetNode.options?.['description'],\n parameters: fields,\n mode: fieldsetNode.mode as AXPDynamicFormMode | undefined,\n look: fieldsetNode.options?.['look'] as 'fieldset' | 'card' | 'group' | 'container',\n };\n }\n\n /**\n * Extract field information from Form Field widget\n */\n private extractFieldFromFormWidget(formFieldNode: AXPWidgetNode): AXPDynamicFormFieldDefinition | null {\n if (!formFieldNode.children || formFieldNode.children.length === 0) {\n return null;\n }\n\n const editorWidget = formFieldNode.children[0];\n\n return {\n path: formFieldNode.name || editorWidget.name || `field-${Date.now()}`,\n title: formFieldNode.options?.['label'],\n badge: formFieldNode.options?.['badge'],\n description: formFieldNode.options?.['hint'],\n widget: editorWidget,\n mode: formFieldNode.mode as AXPDynamicFormMode,\n };\n }\n\n /**\n * Create cache key for form definition\n */\n private createFormDefinitionCacheKey(formDefinition: AXPDynamicFormDefinition): string {\n // Create a hash-like key instead of full JSON string\n const keyParts: string[] = [];\n\n keyParts.push(`groups:${formDefinition.groups.length}`);\n\n formDefinition.groups.forEach((group, groupIndex) => {\n // Include group.mode so view vs edit (or mixed) layouts do not share a cached widget tree.\n const groupModePart = group.mode ?? '_';\n keyParts.push(`g${groupIndex}:${group.name}:${group.parameters.length}:${groupModePart}`);\n keyParts.push(`gL${groupIndex}:${JSON.stringify(group.title ?? null)}:${JSON.stringify(group.description ?? null)}`);\n\n group.parameters.forEach((param, paramIndex) => {\n // Field mode must be part of the key; otherwise metadata forms that only differ by\n // view/edit (same paths and widget types) incorrectly reuse the first cached tree.\n const fieldModePart = param.mode ?? '_';\n keyParts.push(`p${groupIndex}.${paramIndex}:${param.path}:${param.widget.type}:${fieldModePart}`);\n keyParts.push(\n `pL${groupIndex}.${paramIndex}:${JSON.stringify(param.title ?? null)}:${JSON.stringify(param.description ?? null)}:${JSON.stringify(param.badge ?? null)}`,\n );\n });\n });\n\n if (formDefinition.mode) {\n keyParts.push(`mode:${formDefinition.mode}`);\n }\n\n // Join with delimiter and create a shorter hash\n const keyString = keyParts.join('|');\n\n // If still too long, create a simple hash\n if (keyString.length > 100) {\n return this.createSimpleHash(keyString);\n }\n\n return keyString;\n }\n\n /**\n * Create cache key for widget tree\n */\n private createWidgetTreeCacheKey(widgetTree: AXPWidgetNode): string {\n // Create a hash-like key instead of full JSON string\n const keyParts: string[] = [];\n\n keyParts.push(`type:${widgetTree.type}`);\n\n if (widgetTree.name) {\n keyParts.push(`name:${widgetTree.name}`);\n }\n\n if (widgetTree.children) {\n keyParts.push(`children:${widgetTree.children.length}`);\n\n widgetTree.children.forEach((child, index) => {\n keyParts.push(`c${index}:${child.type}`);\n\n if (child.children) {\n keyParts.push(`cc${index}:${child.children.length}`);\n\n child.children.forEach((grandChild, gIndex) => {\n keyParts.push(`gc${index}.${gIndex}:${grandChild.type}`);\n\n if (grandChild.children) {\n keyParts.push(`gcc${index}.${gIndex}:${grandChild.children.length}`);\n }\n });\n }\n });\n }\n\n // Join with delimiter and create a shorter hash\n const keyString = keyParts.join('|');\n\n // If still too long, create a simple hash\n if (keyString.length > 100) {\n return this.createSimpleHash(keyString);\n }\n\n return keyString;\n }\n\n /**\n * Create a simple hash from a string\n */\n private createSimpleHash(str: string): string {\n let hash = 0;\n if (str.length === 0) return hash.toString();\n\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36); // Convert to base36 for shorter string\n }\n\n //#endregion\n}\n","import type { AXPDialogCloseConfirmationOptions } from './layout-builder.types';\n\n//#region ---- Dialog Close Confirmation Utilities ----\n\nexport function normalizeDialogCloseConfirmation(\n value?: boolean | AXPDialogCloseConfirmationOptions,\n): AXPDialogCloseConfirmationOptions | undefined {\n if (value === undefined || value === false) {\n return undefined;\n }\n if (value === true) {\n return { enabled: true };\n }\n if (value.enabled === false) {\n return undefined;\n }\n return { enabled: true, ...value };\n}\n\n//#endregion\n","import { AXPopupService } from '@acorex/components/popup';\nimport { AXPActionMenuItem, AXPGridLayoutOptions, AXPHookService } from '@acorex/platform/core';\n\nimport { AXPWidgetNode, AXPWidgetRenderMode, AXPWidgetSerializationHelper } from '@acorex/platform/layout/widget-core';\nimport { Injectable, inject } from '@angular/core';\nimport { cloneDeep, isNil, set } from 'lodash-es';\nimport {\n AXPDialogContainerOptions,\n AXPDialogRef,\n createDismissedDialogRef,\n AXPDynamicFormDefinition,\n AXPFieldsetContainerOptions,\n AXPFlexContainerOptions,\n AXPFormFieldOptions,\n // Container options\n AXPGridContainerOptions,\n AXPListWidgetOptions,\n AXPPageContainerOptions,\n AXPPanelContainerOptions,\n AXPStepDefinition,\n AXPStepWizardDefinition,\n AXPStepWizardGuardPayload,\n AXPStepWizardStatus,\n AXPTabsetContainerOptions,\n AXPWidgetNodeExtendedProperties,\n AXPWizardActions,\n ColorBoxOptions,\n DateTimeBoxOptions,\n DialogBuilderState,\n AXPLayoutBuilderDialogConfig,\n AXPDialogActionMenuItem,\n AXPDialogActionOptions,\n AXPDialogCloseConfirmationOptions,\n IActionBuilder,\n IDialogBuilder,\n IFieldsetContainerBuilder,\n IFlexContainerBuilder,\n IFormFieldBuilder,\n IGridContainerBuilder,\n ILayoutBuilder,\n IListWidgetBuilder,\n IPageContainerBuilder,\n IPanelContainerBuilder,\n IStepWizardBuilder,\n ITabsetContainerBuilder,\n IWidgetBuilder,\n // Inheritance context\n InheritanceContext,\n InheritedProperties,\n LargeTextBoxOptions,\n LayoutBuilderState,\n LookupBoxOptions,\n NumberBoxOptions,\n PasswordBoxOptions,\n RichTextOptions,\n SelectBoxOptions,\n SelectionListOptions,\n TextBoxOptions,\n ToggleSwitchOptions,\n WidgetBuilderState,\n} from './layout-builder.types';\nimport {\n AXP_LAYOUT_BUILDER_DIALOG_BEFORE_OPEN_HOOK_KEY,\n AXP_LAYOUT_BUILDER_DIALOG_CONFIG_HOOK_KEY,\n type AXPLayoutBuilderDialogBeforeOpenPayload,\n} from './layout-builder-dialog.hooks';\nimport { AXPLayoutConversionService } from './layout-conversion.service';\nimport { AXDialogRef } from '@acorex/components/dialog';\nimport {\n DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS,\n DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS,\n resolveDialogActionShortcuts,\n} from './dialog-action-shortcuts.util';\nimport { normalizeDialogCloseConfirmation } from './dialog-close-confirmation.util';\n\n//#region ---- Inheritance Utilities ----\n\n/**\n * Resolves inherited properties from context and local values\n */\nfunction resolveInheritedProperties(\n context: InheritanceContext,\n localValues: Partial<InheritanceContext> = {},\n): InheritedProperties {\n return {\n mode: localValues.mode ?? context.mode ?? 'edit',\n disabled: localValues.disabled ?? context.disabled,\n readonly: localValues.readonly ?? context.readonly,\n direction: localValues.direction ?? context.direction,\n visible: localValues.visible ?? context.visible,\n };\n}\n\n/**\n * Merges inheritance context with local overrides\n */\nfunction mergeInheritanceContext(\n parentContext: InheritanceContext,\n localOverrides: Partial<InheritanceContext> = {},\n): InheritanceContext {\n return {\n ...parentContext,\n ...localOverrides,\n };\n}\n\n/**\n * Generates a random string for path/name generation\n */\nfunction generateRandomId(): string {\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}\n\n/**\n * Converts label to a valid path/name\n */\nfunction labelToPath(label: string): string {\n return label\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '') // Remove special characters\n .replace(/\\s+/g, '_') // Replace spaces with underscores\n .substring(0, 50); // Limit length\n}\n\n/**\n * Generates path for value widgets based on hierarchy\n */\nfunction generateValueWidgetPath(widgetName?: string, formFieldName?: string, formFieldLabel?: string): string {\n // Priority: widget name -> form field name -> generated from label -> random\n if (widgetName) {\n return widgetName;\n }\n\n if (formFieldName) {\n return formFieldName;\n }\n\n if (formFieldLabel) {\n return labelToPath(formFieldLabel);\n }\n\n return generateRandomId();\n}\n\n/**\n * Collects default values from widget node tree and merges them into context\n * Only sets values for paths that don't already exist in the context\n * @param node - The widget node to process\n * @param context - The context object to modify in place (cloned at top level only)\n * @param isTopLevel - Internal flag to track if this is the top-level call\n */\nfunction collectDefaultValues(node: AXPWidgetNode, context: any = {}, isTopLevel: boolean = true): any {\n // Clone context only at the top level, then modify in place for recursive calls\n const result = isTopLevel ? cloneDeep(context) : context;\n\n // Check if this node has a defaultValue and a path\n // Note: We check for both node.defaultValue and also look in node.options.defaultValue as fallback\n const defaultValue = node.defaultValue !== undefined ? node.defaultValue : (node.options as any)?.defaultValue;\n\n if (defaultValue !== undefined && !isNil(defaultValue) && node.path) {\n // Check if path exists in context using lodash get equivalent check\n const currentValue = getNestedValue(result, node.path);\n if (currentValue === undefined) {\n // Clone the defaultValue to avoid reference issues (especially for Date objects)\n const clonedValue = defaultValue instanceof Date ? new Date(defaultValue.getTime()) : cloneDeep(defaultValue);\n set(result, node.path, clonedValue);\n }\n }\n\n // Recursively process children - pass result object to accumulate values in place\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n collectDefaultValues(child, result, false);\n }\n }\n\n return result;\n}\n\n/**\n * Gets a nested value from an object using dot notation path\n */\nfunction getNestedValue(obj: any, path: string): any {\n const keys = path.split('.');\n let current = obj;\n for (const key of keys) {\n if (current === undefined || current === null || typeof current !== 'object') {\n return undefined;\n }\n current = current[key];\n }\n return current;\n}\n\n//#endregion\n\n//#region ---- Service Implementation ----\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPLayoutBuilderService {\n private popupService = inject(AXPopupService);\n private readonly hookService = inject(AXPHookService, { optional: true }) ?? undefined;\n\n /**\n * Create a new layout builder\n */\n create(): ILayoutBuilder {\n return new LayoutBuilder(this.popupService, this.hookService);\n }\n}\n\n//#endregion\n\n//#region ---- Layout Builder Implementation ----\n\n/**\n * Main layout builder - Single Responsibility: Layout orchestration\n * Open/Closed: Extensible through container delegates\n */\nclass LayoutBuilder implements ILayoutBuilder {\n private root: AXPWidgetNode = {\n children: [],\n mode: 'edit',\n type: 'flex-layout',\n };\n\n private inheritanceContext: InheritanceContext = {\n mode: 'edit',\n };\n\n constructor(\n private popupService?: AXPopupService,\n private readonly hookService?: AXPHookService,\n ) { }\n\n // Predefined layout containers at root level - delegate pattern required\n grid(delegate: (container: IGridContainerBuilder) => void): ILayoutBuilder {\n const container = new GridContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n //this.state.children!.push(container.build());\n this.root = container.build();\n return this;\n }\n\n flex(delegate: (container: IFlexContainerBuilder) => void): ILayoutBuilder {\n const container = new FlexContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n const built = container.build();\n // Step/dialog content usually calls flex() once; replace the default empty flex root instead of nesting flex inside flex.\n if (\n this.root.type === 'flex-layout' &&\n (!this.root.children || this.root.children.length === 0) &&\n !this.root.options\n ) {\n this.root = built;\n } else {\n if (!this.root.children) {\n this.root.children = [];\n }\n this.root.children.push(built);\n }\n return this;\n }\n\n panel(delegate: (container: IPanelContainerBuilder) => void): ILayoutBuilder {\n const container = new PanelContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children!.push(container.build());\n return this;\n }\n\n page(delegate: (container: IPageContainerBuilder) => void): ILayoutBuilder {\n const container = new PageContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children!.push(container.build());\n return this;\n }\n\n tabset(delegate: (container: ITabsetContainerBuilder) => void): ILayoutBuilder {\n const container = new TabsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children!.push(container.build());\n return this;\n }\n\n fieldset(delegate: (container: IFieldsetContainerBuilder) => void): ILayoutBuilder {\n const container = new FieldsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.root.children!.push(container.build());\n return this;\n }\n\n dialog<T = AXPDialogRef>(delegate: (container: IDialogBuilder<T>) => void): IDialogBuilder<T> {\n if (!this.popupService) {\n throw new Error(\n 'LayoutBuilder requires AXPopupService to create dialogs. Please inject it in the service constructor.',\n );\n }\n const container = new DialogContainerBuilder<T>(this.popupService, this.hookService);\n if (delegate) {\n delegate(container);\n }\n return container;\n }\n\n stepWizard(delegate: (wizard: IStepWizardBuilder) => void): ILayoutBuilder {\n const wizard = new StepWizardBuilder();\n wizard.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(wizard);\n }\n this.root.children!.push(wizard.build());\n return this;\n }\n\n formField(label: string, delegate?: (field: IFormFieldBuilder) => void): ILayoutBuilder {\n const field = new FormFieldBuilder(label);\n field.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(field);\n }\n this.root.children!.push(field.build());\n return this;\n }\n\n build(): AXPWidgetNode {\n const r = this.root;\n const node: AXPWidgetNode = {\n type: r.type,\n ...(r.mode !== undefined ? { mode: r.mode } : {}),\n ...(r.children !== undefined ? { children: r.children } : {}),\n ...(r.options !== undefined ? { options: r.options } : {}),\n ...(r.name !== undefined ? { name: r.name } : {}),\n ...(r.path !== undefined ? { path: r.path } : {}),\n ...(r.visible !== undefined ? { visible: r.visible } : {}),\n ...(r.defaultValue !== undefined ? { defaultValue: r.defaultValue } : {}),\n ...(r.triggers !== undefined ? { triggers: r.triggers } : {}),\n ...(r.meta !== undefined ? { meta: r.meta } : {}),\n ...(r.valueTransforms !== undefined ? { valueTransforms: r.valueTransforms } : {}),\n };\n return node;\n }\n\n /**\n * Converts the built widget node to JSON string\n * @param options - Serialization options\n * @returns JSON string representation of the widget node\n */\n toJson(options?: { removeMeta?: boolean; removeFunctions?: boolean; pretty?: boolean }): string {\n const node = this.build();\n return AXPWidgetSerializationHelper.toJson(node, options);\n }\n}\n\n//#endregion\n\n//#region ---- Container Builder Implementation ----\n\n/**\n * Abstract base container builder - Open/Closed Principle\n * Provides common functionality for all container types\n */\nabstract class BaseContainerBuilder {\n protected containerState: LayoutBuilderState = {\n mode: 'edit',\n type: 'flex-layout',\n children: [],\n };\n\n protected inheritanceContext: InheritanceContext = {};\n\n constructor(containerType: string) {\n this.containerState.type = containerType;\n }\n\n // Base methods shared by all containers\n protected ensureChildren(): void {\n this.containerState.children = this.containerState.children || [];\n }\n\n protected addWidget<T>(type: string, options?: T): this {\n const child = new WidgetBuilder();\n child.type(type);\n\n // For value widgets, ensure path is provided\n const widgetOptions = options ?? {};\n const path = (widgetOptions as any).path;\n const name = (widgetOptions as any).name;\n\n if (this.isValueWidget(type) && !path) {\n throw new Error(`Value widget '${type}' requires a 'path' property`);\n }\n\n // Set name and path in widget state, not options\n if (name) {\n child.name(name);\n }\n if (path) {\n child.path(path);\n }\n\n // Remove name and path from options\n const { name: _, path: __, ...cleanOptions } = widgetOptions as any;\n\n // IMPORTANT: Apply inheritance context BEFORE setting options\n // This ensures that inherited properties (readonly, disabled, etc.) are applied first\n // Then user-provided options will override them if explicitly set\n child.withInheritanceContext(this.inheritanceContext);\n child.options(cleanOptions);\n\n this.ensureChildren();\n this.containerState.children!.push(child.build());\n return this;\n }\n\n private isValueWidget(type: string): boolean {\n const valueWidgetTypes = [\n 'text-editor',\n 'large-text-editor',\n 'rich-text-editor',\n 'password-editor',\n 'number-editor',\n 'select-editor',\n 'lookup-editor',\n 'entity-definition-provider-editor',\n 'selection-list-editor',\n 'date-time-editor',\n 'toggle-editor',\n 'color-editor',\n ];\n return valueWidgetTypes.includes(type);\n }\n\n build(): AXPWidgetNode {\n const result: AXPWidgetNode = {\n type: this.containerState.type,\n children: this.containerState.children,\n options: this.containerState.options,\n mode: this.containerState.mode,\n visible: this.containerState.visible,\n };\n\n // Add name with _form_field suffix for form fields\n if (this.containerState.type === 'form-field') {\n if (this.containerState.name) {\n result.name = this.containerState.name;\n } else if (this.containerState.options?.['label']) {\n result.name = labelToPath(this.containerState.options['label']) + '_form_field';\n }\n // Form fields don't have path\n } else {\n // Other containers can have name and path\n if (this.containerState.name) {\n result.name = this.containerState.name;\n }\n if (this.containerState.path) {\n result.path = this.containerState.path;\n }\n if (this.containerState.defaultValue !== undefined) {\n result.defaultValue = this.containerState.defaultValue;\n }\n }\n\n return result;\n }\n}\n\n/**\n * Base container builder mixin - Interface Segregation Principle\n * Provides common container operations\n */\nabstract class BaseContainerMixin<TContainer> extends BaseContainerBuilder {\n name(name: string): TContainer {\n this.containerState.name = name;\n return this as unknown as TContainer;\n }\n path(path: string): TContainer {\n this.containerState.path = path;\n return this as unknown as TContainer;\n }\n\n mode(mode: AXPWidgetRenderMode): TContainer {\n this.containerState.mode = mode;\n this.inheritanceContext.mode = mode;\n return this as unknown as TContainer;\n }\n\n visible(condition: boolean | string): TContainer {\n if (!this.containerState.options) this.containerState.options = {};\n this.containerState.options['visible'] = condition;\n this.inheritanceContext.visible = condition;\n return this as unknown as TContainer;\n }\n\n disabled(condition: boolean | string): TContainer {\n if (!this.containerState.options) this.containerState.options = {};\n this.containerState.options['disabled'] = condition;\n this.inheritanceContext.disabled = condition;\n return this as unknown as TContainer;\n }\n\n readonly(condition: boolean | string): TContainer {\n if (!this.containerState.options) this.containerState.options = {};\n this.containerState.options['readonly'] = condition;\n this.inheritanceContext.readonly = condition;\n return this as unknown as TContainer;\n }\n\n direction(direction: 'rtl' | 'ltr'): TContainer {\n if (!this.containerState.options) this.containerState.options = {};\n this.containerState.options['direction'] = direction;\n this.inheritanceContext.direction = direction;\n return this as unknown as TContainer;\n }\n\n // Inheritance context methods\n withInheritanceContext(context: InheritanceContext): TContainer {\n this.inheritanceContext = mergeInheritanceContext(context);\n return this as unknown as TContainer;\n }\n\n getInheritanceContext(): InheritanceContext {\n return { ...this.inheritanceContext };\n }\n}\n\n/**\n * Layout container mixin - Interface Segregation Principle\n * Provides layout-specific operations\n */\nabstract class LayoutContainerMixin<TContainer> extends BaseContainerMixin<TContainer> {\n layout(value: Partial<AXPGridLayoutOptions> | number): TContainer {\n // Map layout intent to grid item sizing so containers like `form-field`\n // can span multiple columns/rows inside grid/fieldset layouts.\n if (!this.containerState.options) this.containerState.options = {};\n\n if (typeof value === 'number') {\n (this.containerState.options as any).colSpan = value;\n } else if (value) {\n const positions = (value as any).positions as any;\n if (positions) {\n const placement = positions?.lg ?? positions?.xl ?? positions?.xxl ?? positions?.md ?? positions?.sm;\n if (placement) {\n const opts = this.containerState.options as any;\n if (placement.colSpan != null) opts.colSpan = placement.colSpan;\n if (placement.colStart != null) opts.colStart = placement.colStart;\n if (placement.colEnd != null) opts.colEnd = placement.colEnd;\n if (placement.rowSpan != null) opts.rowSpan = placement.rowSpan;\n if (placement.rowStart != null) opts.rowStart = placement.rowStart;\n if (placement.rowEnd != null) opts.rowEnd = placement.rowEnd;\n }\n }\n }\n\n return this as unknown as TContainer;\n }\n}\n\n/**\n * Child container mixin - Interface Segregation Principle\n * Provides child container management\n */\nabstract class ChildContainerMixin<TContainer> extends LayoutContainerMixin<TContainer> {\n grid(delegate: (container: IGridContainerBuilder) => void): TContainer {\n const container = new GridContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children!.push(container.build());\n return this as unknown as TContainer;\n }\n\n flex(delegate: (container: IFlexContainerBuilder) => void): TContainer {\n const container = new FlexContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children!.push(container.build());\n return this as unknown as TContainer;\n }\n\n panel(delegate: (container: IPanelContainerBuilder) => void): TContainer {\n const container = new PanelContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children!.push(container.build());\n return this as unknown as TContainer;\n }\n\n page(delegate: (container: IPageContainerBuilder) => void): TContainer {\n const container = new PageContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children!.push(container.build());\n return this as unknown as TContainer;\n }\n\n tabset(delegate: (container: ITabsetContainerBuilder) => void): TContainer {\n const container = new TabsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children!.push(container.build());\n return this as unknown as TContainer;\n }\n\n fieldset(delegate: (container: IFieldsetContainerBuilder) => void): TContainer {\n const container = new FieldsetContainerBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children!.push(container.build());\n return this as unknown as TContainer;\n }\n\n dialog<T = AXPDialogRef>(delegate: (container: IDialogBuilder<T>) => void): IDialogBuilder<T> {\n const container = new DialogContainerBuilder<T>(); // Will use inject() fallback\n if (delegate) {\n delegate(container);\n }\n return container;\n }\n\n stepWizard(delegate: (wizard: IStepWizardBuilder) => void): TContainer {\n const wizard = new StepWizardBuilder();\n wizard.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(wizard);\n }\n this.ensureChildren();\n this.containerState.children!.push(wizard.build());\n return this as unknown as TContainer;\n }\n\n formField(label: string, delegate?: (field: IFormFieldBuilder) => void): TContainer {\n const field = new FormFieldBuilder(label);\n field.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(field);\n }\n this.ensureChildren();\n this.containerState.children!.push(field.build());\n return this as unknown as TContainer;\n }\n\n dynamicForm(definition: AXPDynamicFormDefinition): TContainer {\n // Get conversion service using inject() - works in any context in Angular 14+\n let conversionService: AXPLayoutConversionService;\n try {\n conversionService = inject(AXPLayoutConversionService);\n } catch {\n // Fallback: create service instance if inject() fails (shouldn't happen in normal usage)\n conversionService = new AXPLayoutConversionService();\n }\n\n // Convert form definition to widget node\n const widgetNode = conversionService.convertFormDefinition(definition);\n\n // Add the widget node's children to this container\n // The converted widget node has a root grid-layout, we want its children (fieldsets)\n if (widgetNode.children && widgetNode.children.length > 0) {\n this.ensureChildren();\n this.containerState.children!.push(...widgetNode.children);\n }\n\n return this as unknown as TContainer;\n }\n}\n\n/**\n * Widget container mixin - Interface Segregation Principle\n * Provides widget creation operations\n */\nabstract class WidgetContainerMixin<TContainer> extends ChildContainerMixin<TContainer> {\n textBox(options?: TextBoxOptions): TContainer {\n this.addWidget('text-editor', options);\n return this as unknown as TContainer;\n }\n\n largeTextBox(options?: LargeTextBoxOptions): TContainer {\n this.addWidget('large-text-editor', options);\n return this as unknown as TContainer;\n }\n\n richText(options?: RichTextOptions): TContainer {\n this.addWidget('rich-text-editor', options);\n return this as unknown as TContainer;\n }\n\n passwordBox(options?: PasswordBoxOptions): TContainer {\n this.addWidget('password-editor', options);\n return this as unknown as TContainer;\n }\n\n numberBox(options?: NumberBoxOptions): TContainer {\n this.addWidget('number-editor', options);\n return this as unknown as TContainer;\n }\n\n selectBox(options: SelectBoxOptions): TContainer {\n this.addWidget('select-editor', options);\n return this as unknown as TContainer;\n }\n\n lookupBox(options: LookupBoxOptions): TContainer {\n this.addWidget('lookup-editor', options);\n return this as unknown as TContainer;\n }\n\n selectionList(options: SelectionListOptions): TContainer {\n this.addWidget('selection-list-editor', options);\n return this as unknown as TContainer;\n }\n\n dateTimeBox(options?: DateTimeBoxOptions): TContainer {\n this.addWidget('date-time-editor', options);\n return this as unknown as TContainer;\n }\n\n toggleSwitch(options?: ToggleSwitchOptions): TContainer {\n this.addWidget('toggle-editor', options);\n return this as unknown as TContainer;\n }\n\n colorBox(options?: ColorBoxOptions): TContainer {\n this.addWidget('color-editor', options);\n return this as unknown as TContainer;\n }\n\n list(delegate: (container: IListWidgetBuilder) => void): TContainer {\n const container = new ListWidgetBuilder();\n container.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(container);\n }\n this.ensureChildren();\n this.containerState.children!.push(container.build());\n return this as unknown as TContainer;\n }\n\n customWidget<T>(type: string, options?: T): TContainer;\n customWidget<T>(type: string, delegate: (widget: IWidgetBuilder) => void): TContainer;\n customWidget<T>(\n type: string,\n optionsOrDelegate?: T | ((widget: IWidgetBuilder) => void),\n delegate?: (widget: IWidgetBuilder) => void,\n ): TContainer {\n const child = new WidgetBuilder();\n child.type(type);\n\n // Determine if second parameter is delegate or options\n const isDelegate = typeof optionsOrDelegate === 'function';\n const options = isDelegate ? undefined : (optionsOrDelegate as T | undefined);\n const actualDelegate = isDelegate ? (optionsOrDelegate as (widget: IWidgetBuilder) => void) : delegate;\n\n // Apply inheritance context BEFORE setting options or calling delegate\n child.withInheritanceContext(this.inheritanceContext);\n\n // If options are provided (non-delegate overload), handle them\n if (!isDelegate && options !== undefined) {\n const widgetOptions = options as any;\n const path = widgetOptions.path;\n const name = widgetOptions.name;\n\n // Set name and path in widget state, not options\n if (name) {\n child.name(name);\n }\n if (path) {\n child.path(path);\n }\n\n // Remove name and path from options\n const { name: _, path: __, ...cleanOptions } = widgetOptions;\n child.options(cleanOptions);\n }\n\n // If delegate is provided, call it to allow setting path, options, and other control methods\n if (actualDelegate) {\n actualDelegate(child);\n }\n\n // Build the widget to check if path is set (for value widgets)\n const builtWidget = child.build();\n\n // Check if value widget requires path\n const valueWidgetTypes = [\n 'text-editor',\n 'large-text-editor',\n 'rich-text-editor',\n 'password-editor',\n 'number-editor',\n 'select-editor',\n 'lookup-editor',\n 'entity-definition-provider-editor',\n 'selection-list-editor',\n 'date-time-editor',\n 'toggle-editor',\n 'color-editor',\n ];\n if (valueWidgetTypes.includes(type) && !builtWidget.path) {\n throw new Error(`Value widget '${type}' requires a 'path' property`);\n }\n\n this.ensureChildren();\n this.containerState.children!.push(builtWidget);\n return this as unknown as TContainer;\n }\n}\n\n/**\n * Flex Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass FlexContainerBuilder extends WidgetContainerMixin<IFlexContainerBuilder> implements IFlexContainerBuilder {\n constructor() {\n super('flex-layout');\n }\n\n setOptions(options: AXPFlexContainerOptions): IFlexContainerBuilder {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n\n // Individual fluent methods for Flex\n setDirection(direction: 'row' | 'column' | 'row-reverse' | 'column-reverse'): IFlexContainerBuilder {\n return this.setOptions({ flexDirection: direction });\n }\n\n setWrap(wrap: 'nowrap' | 'wrap' | 'wrap-reverse'): IFlexContainerBuilder {\n return this.setOptions({ flexWrap: wrap });\n }\n\n setJustifyContent(\n justify: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly',\n ): IFlexContainerBuilder {\n return this.setOptions({ justifyContent: justify });\n }\n\n setAlignItems(align: 'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch'): IFlexContainerBuilder {\n return this.setOptions({ alignItems: align });\n }\n\n setGap(gap: string): IFlexContainerBuilder {\n return this.setOptions({ gap });\n }\n\n setBackgroundColor(color: string): IFlexContainerBuilder {\n return this.setOptions({ backgroundColor: color });\n }\n\n setPadding(padding: string): IFlexContainerBuilder {\n return this.setOptions({ spacing: { padding } });\n }\n\n setMargin(margin: string): IFlexContainerBuilder {\n return this.setOptions({ spacing: { margin } });\n }\n}\n\n/**\n * Grid Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\n/**\n * Extracts flat grid-item options from AXPGridLayoutOptions for grid-item-layout widget.\n * Uses first available breakpoint (lg, xl, md, sm).\n */\n/**\n * Deep-merges grid breakpoint buckets so sequential fluent calls (e.g. setColumns then setGap)\n * do not wipe sibling keys under options.grid.default.\n */\nfunction mergeAXPGridContainerOptions(\n prev: AXPGridContainerOptions | undefined,\n patch: AXPGridContainerOptions,\n): AXPGridContainerOptions {\n const next: AXPGridContainerOptions = { ...(prev ?? {}), ...patch };\n\n if (prev?.grid?.default || patch.grid?.default) {\n next.grid = {\n ...(prev?.grid ?? {}),\n ...(patch.grid ?? {}),\n default: {\n ...(prev?.grid?.default ?? {}),\n ...(patch.grid?.default ?? {}),\n },\n };\n }\n\n return next;\n}\n\nfunction toGridItemOptions(layoutOptions: Partial<AXPGridLayoutOptions> | null | undefined): Record<string, number> {\n if (!layoutOptions?.positions) return { colSpan: 12 };\n const positions = layoutOptions.positions as Record<\n string,\n { colSpan?: number; colStart?: number; colEnd?: number; rowSpan?: number; rowStart?: number; rowEnd?: number }\n >;\n const placement = positions['lg'] ?? positions['xl'] ?? positions['xxl'] ?? positions['md'] ?? positions['sm'];\n if (!placement) return { colSpan: 12 };\n const opts: Record<string, number> = {};\n if (placement['colSpan'] != null) opts['colSpan'] = placement['colSpan'];\n if (placement['colStart'] != null) opts['colStart'] = placement['colStart'];\n if (placement['colEnd'] != null) opts['colEnd'] = placement['colEnd'];\n if (placement['rowSpan'] != null) opts['rowSpan'] = placement['rowSpan'];\n if (placement['rowStart'] != null) opts['rowStart'] = placement['rowStart'];\n if (placement['rowEnd'] != null) opts['rowEnd'] = placement['rowEnd'];\n if (Object.keys(opts).length === 0) opts['colSpan'] = 12;\n return opts;\n}\n\nclass GridContainerBuilder extends WidgetContainerMixin<IGridContainerBuilder> implements IGridContainerBuilder {\n constructor() {\n super('grid-layout');\n }\n\n setOptions(options: AXPGridContainerOptions): IGridContainerBuilder {\n this.containerState.options = mergeAXPGridContainerOptions(\n this.containerState.options as AXPGridContainerOptions | undefined,\n options,\n );\n return this;\n }\n\n item(\n layoutOptions: Partial<AXPGridLayoutOptions> | null | undefined,\n delegate: (container: IFieldsetContainerBuilder) => void,\n ): IGridContainerBuilder {\n const fieldset = new FieldsetContainerBuilder();\n fieldset.withInheritanceContext(this.inheritanceContext);\n delegate(fieldset);\n const fieldsetNode = fieldset.build();\n const gridItemOptions = toGridItemOptions(layoutOptions);\n const gridItemNode: AXPWidgetNode = {\n type: 'grid-item-layout',\n options: gridItemOptions,\n children: [fieldsetNode],\n };\n this.ensureChildren();\n this.containerState.children!.push(gridItemNode);\n return this;\n }\n\n // Individual fluent methods for Grid\n setColumns(columns: number): IGridContainerBuilder {\n return this.setOptions({ grid: { default: { columns } } });\n }\n\n setRows(rows: number): IGridContainerBuilder {\n return this.setOptions({ grid: { default: { rows } } });\n }\n\n setGap(gap: string): IGridContainerBuilder {\n return this.setOptions({ grid: { default: { gap } } });\n }\n\n setJustifyItems(justify: 'start' | 'end' | 'center' | 'stretch'): IGridContainerBuilder {\n return this.setOptions({ grid: { default: { justifyItems: justify } } });\n }\n\n setAlignItems(align: 'start' | 'end' | 'center' | 'stretch'): IGridContainerBuilder {\n return this.setOptions({ grid: { default: { alignItems: align } } });\n }\n\n setAutoFlow(flow: 'row' | 'column' | 'row dense' | 'column dense'): IGridContainerBuilder {\n return this.setOptions({ grid: { default: { autoFlow: flow } } });\n }\n\n setBackgroundColor(color: string): IGridContainerBuilder {\n return this.setOptions({ backgroundColor: color });\n }\n\n setPadding(padding: string): IGridContainerBuilder {\n return this.setOptions({ spacing: { padding } });\n }\n\n setMargin(margin: string): IGridContainerBuilder {\n return this.setOptions({ spacing: { margin } });\n }\n}\n\n/**\n * Panel Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass PanelContainerBuilder extends WidgetContainerMixin<IPanelContainerBuilder> implements IPanelContainerBuilder {\n constructor() {\n super('panel-layout');\n }\n\n setOptions(options: AXPPanelContainerOptions): IPanelContainerBuilder {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n\n // Individual fluent methods for Panel\n setCaption(caption: string): IPanelContainerBuilder {\n return this.setOptions({ caption });\n }\n\n setIcon(icon: string): IPanelContainerBuilder {\n return this.setOptions({ icon });\n }\n\n setLook(look: 'solid' | 'fill' | 'outline' | 'flat' | 'none'): IPanelContainerBuilder {\n return this.setOptions({ look });\n }\n\n setShowHeader(show: boolean): IPanelContainerBuilder {\n return this.setOptions({ showHeader: show });\n }\n\n setCollapsed(collapsed: boolean): IPanelContainerBuilder {\n return this.setOptions({ collapsed });\n }\n}\n\n/**\n * Page Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass PageContainerBuilder extends WidgetContainerMixin<IPageContainerBuilder> implements IPageContainerBuilder {\n constructor() {\n super('page-layout');\n }\n\n setOptions(options: AXPPageContainerOptions): IPageContainerBuilder {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n\n // Individual fluent methods for Page\n setBackgroundColor(color: string): IPageContainerBuilder {\n return this.setOptions({ backgroundColor: color });\n }\n\n setTheme(theme: { id: string }): IPageContainerBuilder {\n return this.setOptions({ theme });\n }\n\n setHasHeader(hasHeader: boolean): IPageContainerBuilder {\n return this.setOptions({ hasHeader });\n }\n\n setHasFooter(hasFooter: boolean): IPageContainerBuilder {\n return this.setOptions({ hasFooter });\n }\n\n setDirection(direction: string): IPageContainerBuilder {\n return this.setOptions({ direction });\n }\n}\n\n/**\n * Tabset Container Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass TabsetContainerBuilder extends WidgetContainerMixin<ITabsetContainerBuilder> implements ITabsetContainerBuilder {\n constructor() {\n super('tabset-layout');\n }\n\n setOptions(options: AXPTabsetContainerOptions): ITabsetContainerBuilder {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n\n // Individual fluent methods for Tabset\n setLook(look: 'with-line' | 'with-line-color' | 'pills' | 'pills-color'): ITabsetContainerBuilder {\n return this.setOptions({ look });\n }\n\n setOrientation(orientation: 'vertical' | 'horizontal'): ITabsetContainerBuilder {\n return this.setOptions({ orientation });\n }\n\n setActiveIndex(index: number): ITabsetContainerBuilder {\n return this.setOptions({ activeIndex: index });\n }\n}\n\n/**\n * Form Field Builder - Liskov Substitution Principle\n * Can only contain ONE widget with automatic path generation\n */\nclass FormFieldBuilder extends LayoutContainerMixin<IFormFieldBuilder> implements IFormFieldBuilder {\n private hasWidget = false;\n private childWidget?: WidgetBuilder; // Store the widget builder, not the built widget\n\n constructor(label: string) {\n super('form-field');\n this.containerState.options = { label, showLabel: true };\n }\n\n setOptions(options: AXPFormFieldOptions): IFormFieldBuilder {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n\n setLabel(label: string): IFormFieldBuilder {\n return this.setOptions({ label });\n }\n\n setShowLabel(showLabel: boolean): IFormFieldBuilder {\n return this.setOptions({ showLabel });\n }\n\n defaultValue(value: any): IFormFieldBuilder {\n this.containerState.defaultValue = value;\n this.inheritanceContext.defaultValue = value;\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n\n // Single widget methods with automatic path generation\n private addSingleWidget<T>(\n type: string,\n options?: Omit<T, 'path'> | (Omit<T, 'path'> & Partial<AXPWidgetNodeExtendedProperties>),\n ): IFormFieldBuilder {\n if (this.hasWidget) {\n throw new Error('Form field can only contain one widget');\n }\n\n const formFieldName = this.containerState.name;\n const formFieldPath = this.containerState.path; // Get explicit path from form field\n const formFieldLabel = this.containerState.options?.['label'];\n const widgetName = (options as any)?.name;\n\n // Generate widget path: explicit path -> widget name -> form field name -> label -> random\n let widgetPath: string;\n if (formFieldPath) {\n widgetPath = formFieldPath; // Use explicit form field path first\n } else if (widgetName) {\n widgetPath = widgetName;\n } else if (formFieldName) {\n widgetPath = formFieldName; // Use form field name as default path\n } else if (formFieldLabel) {\n widgetPath = labelToPath(formFieldLabel);\n } else {\n widgetPath = generateRandomId();\n }\n\n const finalName = widgetName || formFieldName || widgetPath;\n\n const child = new WidgetBuilder();\n child.type(type);\n child.name(finalName);\n child.path(widgetPath);\n\n // Extract extended properties from options (triggers, meta, valueTransforms, mode, visible, defaultValue)\n const {\n name: _,\n triggers,\n meta,\n valueTransforms,\n mode: extendedMode,\n visible: extendedVisible,\n defaultValue: extendedDefaultValue,\n children: extendedChildren,\n ...cleanOptions\n } = (options || {}) as any;\n\n child.withInheritanceContext(this.inheritanceContext);\n child.options(cleanOptions);\n\n // Apply extended properties if provided\n if (extendedMode !== undefined) {\n child.mode(extendedMode);\n }\n if (extendedVisible !== undefined) {\n child.visible(extendedVisible);\n }\n if (extendedDefaultValue !== undefined) {\n child.defaultValue(extendedDefaultValue);\n }\n // Set triggers, meta, and valueTransforms directly on widgetState\n // These are part of AXPWidgetNode but not handled by WidgetBuilder methods\n if (triggers !== undefined) {\n (child as any).widgetState.triggers = triggers;\n }\n if (meta !== undefined) {\n (child as any).widgetState.meta = meta;\n }\n if (valueTransforms !== undefined) {\n (child as any).widgetState.valueTransforms = valueTransforms;\n }\n if (extendedChildren !== undefined) {\n (child as any).widgetState.children = extendedChildren;\n }\n\n // IMPORTANT: Store the widget builder, don't build it yet!\n // This allows properties set after this method (like disabled, readonly) to be applied\n this.childWidget = child;\n this.hasWidget = true;\n\n return this;\n }\n\n textBox(options?: Omit<TextBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<TextBoxOptions>('text-editor', options);\n }\n\n largeTextBox(options?: Omit<LargeTextBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<LargeTextBoxOptions>('large-text-editor', options);\n }\n\n richText(options?: Omit<RichTextOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<RichTextOptions>('rich-text-editor', options);\n }\n\n passwordBox(options?: Omit<PasswordBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<PasswordBoxOptions>('password-editor', options);\n }\n\n numberBox(options?: Omit<NumberBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<NumberBoxOptions>('number-editor', options);\n }\n\n selectBox(options: Omit<SelectBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<SelectBoxOptions>('select-editor', options);\n }\n\n lookupBox(options: Omit<LookupBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<LookupBoxOptions>('lookup-editor', options);\n }\n\n selectionList(options: Omit<SelectionListOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<SelectionListOptions>('selection-list-editor', options);\n }\n\n dateTimeBox(options?: Omit<DateTimeBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<DateTimeBoxOptions>('date-time-editor', options);\n }\n\n toggleSwitch(options?: Omit<ToggleSwitchOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<ToggleSwitchOptions>('toggle-editor', options);\n }\n\n colorBox(options?: Omit<ColorBoxOptions, 'path'>): IFormFieldBuilder {\n return this.addSingleWidget<ColorBoxOptions>('color-editor', options);\n }\n\n customWidget<T>(type: string, options?: Omit<T, 'path'>): IFormFieldBuilder;\n customWidget<T>(\n type: string,\n options?: Omit<T, 'path'> & Partial<AXPWidgetNodeExtendedProperties>,\n ): IFormFieldBuilder;\n customWidget<T>(\n type: string,\n options?: Omit<T, 'path'> | (Omit<T, 'path'> & Partial<AXPWidgetNodeExtendedProperties>),\n ): IFormFieldBuilder {\n return this.addSingleWidget<T>(type, options);\n }\n\n // Override property setters to propagate changes to child widget\n override disabled(condition: boolean | string): IFormFieldBuilder {\n super.disabled(condition);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n\n override readonly(condition: boolean | string): IFormFieldBuilder {\n super.readonly(condition);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n\n override visible(condition: boolean | string): IFormFieldBuilder {\n super.visible(condition);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n\n override direction(direction: 'rtl' | 'ltr'): IFormFieldBuilder {\n super.direction(direction);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n\n override mode(mode: AXPWidgetRenderMode): IFormFieldBuilder {\n super.mode(mode);\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n return this;\n }\n\n // Override withInheritanceContext to pass it to the child widget if it exists\n override withInheritanceContext(context: InheritanceContext): IFormFieldBuilder {\n // Call parent implementation first\n super.withInheritanceContext(context);\n\n // If we have a child widget, update its inheritance context too\n if (this.childWidget) {\n this.childWidget.withInheritanceContext(this.inheritanceContext);\n }\n\n return this;\n }\n\n // Override build() to build the child widget at the last moment\n override build(): AXPWidgetNode {\n // Build the child widget and add it to children before building the form field\n if (this.childWidget) {\n this.ensureChildren();\n this.containerState.children!.push(this.childWidget.build());\n }\n\n // Call parent build\n return super.build();\n }\n}\n\n/**\n * Fieldset Container Builder - Liskov Substitution Principle\n * Extends LayoutContainerMixin to inherit layout functionality\n * Specialized for form fields only\n */\nclass FieldsetContainerBuilder\n extends LayoutContainerMixin<IFieldsetContainerBuilder>\n implements IFieldsetContainerBuilder {\n constructor() {\n super('fieldset-layout');\n this.containerState.options = {};\n }\n\n setOptions(options: AXPFieldsetContainerOptions): IFieldsetContainerBuilder {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n\n // Individual fluent methods for Fieldset\n setTitle(title: string): IFieldsetContainerBuilder {\n return this.setOptions({ title });\n }\n\n setDescription(description: string): IFieldsetContainerBuilder {\n return this.setOptions({ description });\n }\n\n setIcon(icon: string): IFieldsetContainerBuilder {\n return this.setOptions({ icon });\n }\n\n setCollapsible(collapsible: boolean): IFieldsetContainerBuilder {\n return this.setOptions({ collapsible });\n }\n\n setIsOpen(isOpen: boolean): IFieldsetContainerBuilder {\n return this.setOptions({ isOpen });\n }\n\n setLook(look: 'fieldset' | 'card' | 'group' | 'container'): IFieldsetContainerBuilder {\n return this.setOptions({ look });\n }\n\n setShowHeader(showHeader: boolean): IFieldsetContainerBuilder {\n return this.setOptions({ showHeader });\n }\n\n setCols(cols: number): IFieldsetContainerBuilder {\n return this.setOptions({ cols });\n }\n\n // Only form fields are allowed in fieldset\n formField(label: string, delegate?: (field: IFormFieldBuilder) => void): IFieldsetContainerBuilder {\n const field = new FormFieldBuilder(label);\n field.withInheritanceContext(this.inheritanceContext);\n if (delegate) {\n delegate(field);\n }\n this.ensureChildren();\n this.containerState.children!.push(field.build());\n return this;\n }\n}\n\n/**\n * List Widget Builder - Liskov Substitution Principle\n * Extends WidgetContainerMixin to inherit all common functionality\n */\nclass ListWidgetBuilder extends WidgetContainerMixin<IListWidgetBuilder> implements IListWidgetBuilder {\n constructor() {\n super('data-list');\n }\n\n setOptions(options: AXPListWidgetOptions): IListWidgetBuilder {\n this.containerState.options = { ...this.containerState.options, ...options };\n return this;\n }\n\n // Individual fluent methods for List Widget\n setDataSource(dataSource: any[]): IListWidgetBuilder {\n return this.setOptions({ dataSource });\n }\n\n setColumns(columns: any[]): IListWidgetBuilder {\n return this.setOptions({ columns });\n }\n\n // Event handlers\n setOnRowClick(handler: (row: any) => void): IListWidgetBuilder {\n return this.setOptions({ onRowClick: handler });\n }\n\n setOnRowDoubleClick(handler: (row: any) => void): IListWidgetBuilder {\n return this.setOptions({ onRowDoubleClick: handler });\n }\n\n setOnSelectionChange(handler: (selectedRows: any[]) => void): IListWidgetBuilder {\n return this.setOptions({ onSelectionChange: handler });\n }\n\n setOnRowCommand(handler: (command: any, selectedRows: any[]) => void): IListWidgetBuilder {\n return this.setOptions({ onRowCommand: handler });\n }\n\n // Table features\n setPaging(paging: boolean): IListWidgetBuilder {\n return this.setOptions({ paging });\n }\n\n setShowHeader(show: boolean): IListWidgetBuilder {\n return this.setOptions({ showHeader: show });\n }\n\n setShowFooter(show: boolean): IListWidgetBuilder {\n return this.setOptions({ showFooter: show });\n }\n\n setFixHeader(fix: boolean): IListWidgetBuilder {\n return this.setOptions({ fixHeader: fix });\n }\n\n setFixFooter(fix: boolean): IListWidgetBuilder {\n return this.setOptions({ fixFooter: fix });\n }\n\n setFetchDataMode(mode: 'auto' | 'manual'): IListWidgetBuilder {\n return this.setOptions({ fetchDataMode: mode });\n }\n\n setParentField(field: string): IListWidgetBuilder {\n return this.setOptions({ parentField: field });\n }\n\n setMinHeight(height: string | number): IListWidgetBuilder {\n return this.setOptions({ minHeight: height });\n }\n\n // Selection & Index\n setShowIndex(show: boolean): IListWidgetBuilder {\n return this.setOptions({ showIndex: show });\n }\n\n setAllowSelection(allow: boolean): IListWidgetBuilder {\n return this.setOptions({ allowSelection: allow });\n }\n\n // Commands\n setPrimaryCommands(commands: any[]): IListWidgetBuilder {\n return this.setOptions({ primaryCommands: commands });\n }\n\n setSecondaryCommands(commands: any[]): IListWidgetBuilder {\n return this.setOptions({ secondaryCommands: commands });\n }\n\n // Loading\n setLoading(loading: { enabled?: boolean; animation?: boolean }): IListWidgetBuilder {\n return this.setOptions({ loading });\n }\n}\n\n/**\n * Dialog Container Builder - Specialized for dialog functionality\n * Uses composition instead of inheritance for cleaner separation\n */\nclass DialogContainerBuilder<T = AXPDialogRef> implements IDialogBuilder<T> {\n private dialogState: DialogBuilderState = {\n type: 'flex-layout', // This will be overridden when content layout exists\n children: [],\n mode: 'edit',\n dialogOptions: {\n title: '',\n size: 'md',\n closeButton: false,\n },\n actions: {\n footer: {\n prefix: [],\n suffix: [],\n },\n },\n };\n\n private popupService: AXPopupService;\n private readonly hookService: AXPHookService | undefined;\n private contentLayout?: AXPWidgetNode;\n\n constructor(popupService?: AXPopupService, hookService?: AXPHookService) {\n if (popupService) {\n this.popupService = popupService;\n } else {\n this.popupService = inject(AXPopupService);\n }\n this.hookService = hookService ?? inject(AXPHookService, { optional: true }) ?? undefined;\n }\n\n setOptions(options: AXPDialogContainerOptions): IDialogBuilder<T> {\n this.dialogState.dialogOptions = { ...this.dialogState.dialogOptions, ...options };\n\n return this;\n }\n\n // Individual fluent methods for Dialog\n setTitle(title: string): IDialogBuilder<T> {\n return this.setOptions({ title });\n }\n\n setMessage(message?: string): IDialogBuilder<T> {\n return this.setOptions({ message });\n }\n\n setSize(size: any): IDialogBuilder<T> {\n return this.setOptions({ size });\n }\n\n setCloseButton(closeButton: boolean): IDialogBuilder<T> {\n return this.setOptions({ closeButton });\n }\n\n setContext(context: any): IDialogBuilder<T> {\n return this.setOptions({ context });\n }\n\n content(delegate: (layoutBuilder: IFlexContainerBuilder) => void): IDialogBuilder<T> {\n if (delegate) {\n // Create a flex container directly instead of through LayoutBuilder\n const flexContainer = new FlexContainerBuilder();\n flexContainer.setDirection('column');\n flexContainer.setGap('10px');\n\n delegate(flexContainer);\n this.contentLayout = flexContainer.build();\n }\n return this;\n }\n\n setActions(delegate?: (actions: IActionBuilder) => void): IDialogBuilder<T> {\n if (delegate) {\n const actionBuilder = new ActionBuilder(this);\n delegate(actionBuilder);\n }\n return this;\n }\n\n onAction(handler: (dialogRef: AXPDialogRef) => T | Promise<T>): IDialogBuilder<T> {\n this.dialogState.dialogOptions ??= {\n title: '',\n size: 'md',\n closeButton: false,\n };\n this.dialogState.dialogOptions.onAction = handler;\n return this;\n }\n\n confirmCloseWhenDirty(options?: boolean | AXPDialogCloseConfirmationOptions): IDialogBuilder<T> {\n return this.setOptions({ confirmCloseWhenDirty: options ?? true });\n }\n\n addCustomAction(action: AXPActionMenuItem): IDialogBuilder<T> {\n // Add to actions based on position\n const position = (action as any).position || 'suffix';\n\n if (position === 'prefix') {\n if (!this.dialogState.actions!.footer!.prefix) {\n this.dialogState.actions!.footer!.prefix = [];\n }\n this.dialogState.actions!.footer!.prefix!.push(action);\n } else {\n if (!this.dialogState.actions!.footer!.suffix) {\n this.dialogState.actions!.footer!.suffix = [];\n }\n this.dialogState.actions!.footer!.suffix!.push(action);\n }\n\n return this;\n }\n\n // Build method to create dialog node\n build(): AXPWidgetNode {\n // If we have content layout, use it directly to avoid extra wrapper\n if (this.contentLayout) {\n return {\n ...this.contentLayout,\n // Add dialog-specific properties\n options: {\n ...this.contentLayout.options,\n ...this.dialogState.dialogOptions,\n },\n };\n }\n\n // Fallback to dialog state structure if no content\n const result: AXPWidgetNode = {\n ...this.dialogState,\n children: [],\n };\n\n // Add dialog-specific properties\n if (this.dialogState.dialogOptions) {\n result.options = { ...result.options, ...this.dialogState.dialogOptions };\n }\n\n return result;\n }\n\n // Dialog-specific methods\n async show(): Promise<T> {\n const dialogNode = this.build();\n\n // Import the dialog renderer component dynamically\n const { AXPDialogRendererComponent } = await import('./dialog-renderer.component');\n\n this.dialogState.dialogOptions ??= {} as AXPDialogContainerOptions;\n if (this.dialogState.dialogOptions.context == null || typeof this.dialogState.dialogOptions.context !== 'object') {\n this.dialogState.dialogOptions.context = {};\n }\n const initialContext = this.dialogState.dialogOptions.context as Record<string, unknown>;\n\n this.dialogState.actions ??= { footer: { prefix: [], suffix: [] } };\n this.dialogState.actions.footer ??= { prefix: [], suffix: [] };\n this.dialogState.actions.footer.prefix ??= [];\n this.dialogState.actions.footer.suffix ??= [];\n\n const hookService = this.hookService;\n if (hookService) {\n const beforePayload: AXPLayoutBuilderDialogBeforeOpenPayload = {\n context: initialContext,\n dialogOptions: this.dialogState.dialogOptions,\n };\n await hookService.runAsync(AXP_LAYOUT_BUILDER_DIALOG_BEFORE_OPEN_HOOK_KEY, beforePayload);\n }\n\n const confirmCloseWhenDirty = normalizeDialogCloseConfirmation(\n this.dialogState.dialogOptions?.confirmCloseWhenDirty,\n );\n\n // Create dialog configuration\n const dialogConfig: AXPLayoutBuilderDialogConfig = {\n title: this.dialogState.dialogOptions?.title || '',\n //TODO: why we need message?\n //message: this.dialogState.dialogOptions?.message,\n context: initialContext,\n definition: dialogNode,\n metadata: this.dialogState.dialogOptions.metadata,\n actions: this.dialogState.actions as NonNullable<DialogBuilderState['actions']>,\n onAction: this.dialogState.dialogOptions?.onAction,\n confirmCloseWhenDirty,\n };\n\n // \n if (hookService) {\n await hookService.runAsync(AXP_LAYOUT_BUILDER_DIALOG_CONFIG_HOOK_KEY, dialogConfig);\n }\n\n // The Promise resolves when user clicks an action button\n return new Promise(async (resolve) => {\n let flag = false;\n await this.popupService.open(AXPDialogRendererComponent, {\n title: dialogConfig.title,\n size: this.dialogState.dialogOptions?.size || 'md',\n closeButton: this.dialogState.dialogOptions?.closeButton || false,\n closeOnBackdropClick: false,\n draggable: false,\n data: {\n config: dialogConfig,\n callBack: (result: AXDialogRef) => {\n flag = true;\n resolve(result as T);\n },\n },\n });\n if (!flag) {\n resolve(createDismissedDialogRef() as T);\n }\n });\n }\n}\n\n//#endregion\n\n//#region ---- Widget Builder Implementation ----\n\n/**\n * Widget Builder - Single Responsibility Principle\n * Handles individual widget configuration and building\n */\nclass WidgetBuilder implements IWidgetBuilder {\n private widgetState: WidgetBuilderState = {\n type: 'widget' as const,\n options: {} as any,\n children: [],\n };\n\n private inheritanceContext: InheritanceContext = {};\n\n constructor(name?: string) {\n if (name) {\n this.widgetState.name = name;\n }\n }\n\n type(type: string): IWidgetBuilder {\n this.widgetState.type = type;\n return this;\n }\n\n name(name: string): IWidgetBuilder {\n this.widgetState.name = name;\n if (!this.widgetState.path) {\n this.widgetState.path = name;\n }\n return this;\n }\n\n path(path: string): IWidgetBuilder {\n this.widgetState.path = path;\n return this;\n }\n\n options(options: any): IWidgetBuilder {\n // Extract defaultValue from options - it's an exceptional parameter that updates context, not a widget option\n if (options && options.defaultValue !== undefined) {\n this.widgetState.defaultValue = options.defaultValue;\n // Remove defaultValue from options since it's stored on the node, not in options\n const { defaultValue: _, ...cleanOptions } = options;\n // Merge clean options instead of replacing to preserve inherited properties\n this.widgetState.options = { ...this.widgetState.options, ...cleanOptions };\n } else {\n // Merge options instead of replacing to preserve inherited properties\n this.widgetState.options = { ...this.widgetState.options, ...options };\n }\n return this;\n }\n\n layout(value: Partial<AXPGridLayoutOptions> | number): IWidgetBuilder {\n if (typeof value === 'number') {\n this.widgetState.layout = {\n positions: {\n sm: { colSpan: 12 },\n md: { colSpan: 12 },\n lg: { colSpan: value },\n xl: { colSpan: value },\n xxl: { colSpan: value },\n },\n };\n } else {\n this.widgetState.layout = value;\n }\n return this;\n }\n\n mode(mode: AXPWidgetRenderMode): IWidgetBuilder {\n this.widgetState.mode = mode;\n this.inheritanceContext.mode = mode;\n return this;\n }\n\n visible(condition: boolean | string): IWidgetBuilder {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['visible'] = condition;\n this.widgetState.visible = condition;\n this.inheritanceContext.visible = condition;\n return this;\n }\n\n disabled(condition: boolean | string): IWidgetBuilder {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['disabled'] = condition;\n this.inheritanceContext.disabled = condition;\n return this;\n }\n\n defaultValue(defaultValue: any): IWidgetBuilder {\n this.widgetState.defaultValue = defaultValue;\n return this;\n }\n\n readonly(condition: boolean | string): IWidgetBuilder {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['readonly'] = condition;\n this.inheritanceContext.readonly = condition;\n return this;\n }\n\n direction(direction: 'rtl' | 'ltr'): IWidgetBuilder {\n if (!this.widgetState.options) {\n this.widgetState.options = {};\n }\n this.widgetState.options['direction'] = direction;\n this.inheritanceContext.direction = direction;\n return this;\n }\n\n children(children: AXPWidgetNode[]): IWidgetBuilder {\n this.widgetState.children = children;\n return this;\n }\n\n // Inheritance context methods\n withInheritanceContext(context: InheritanceContext): IWidgetBuilder {\n this.inheritanceContext = mergeInheritanceContext(context);\n\n // Apply inherited properties to widget state\n const resolved = resolveInheritedProperties(context, this.inheritanceContext);\n\n // Always apply inherited properties (remove the conditions that check if already set)\n // This allows properties to be updated when inheritance context changes\n if (resolved.mode) {\n this.widgetState.mode = resolved.mode;\n }\n\n if (!this.widgetState.options) this.widgetState.options = {};\n\n if (resolved.disabled !== undefined) {\n this.widgetState.options['disabled'] = resolved.disabled;\n }\n\n if (resolved.readonly !== undefined) {\n this.widgetState.options['readonly'] = resolved.readonly;\n }\n\n if (resolved.direction !== undefined) {\n this.widgetState.options['direction'] = resolved.direction;\n }\n\n if (resolved.visible !== undefined) {\n this.widgetState.options['visible'] = resolved.visible;\n this.widgetState.visible = resolved.visible;\n }\n\n if (context.defaultValue !== undefined) {\n this.widgetState.defaultValue = context.defaultValue;\n }\n\n return this;\n }\n\n getInheritanceContext(): InheritanceContext {\n return { ...this.inheritanceContext };\n }\n\n build(): AXPWidgetNode {\n const node: AXPWidgetNode = {\n name: this.widgetState.name,\n type: this.widgetState.type,\n options: this.widgetState.options,\n mode: this.widgetState.mode,\n path: this.widgetState.path,\n defaultValue: this.widgetState.defaultValue,\n children: this.widgetState.children,\n };\n\n // Add extended properties if they exist\n if (this.widgetState.triggers !== undefined) {\n node.triggers = this.widgetState.triggers;\n }\n if (this.widgetState.meta !== undefined) {\n node.meta = this.widgetState.meta;\n }\n if (this.widgetState.valueTransforms !== undefined) {\n node.valueTransforms = this.widgetState.valueTransforms;\n }\n if (this.widgetState.visible !== undefined) {\n node.visible = this.widgetState.visible;\n }\n\n return node;\n }\n}\n\n//#region ---- Action Builder Implementation ----\n\nclass ActionBuilder implements IActionBuilder {\n constructor(private dialogBuilder: DialogContainerBuilder<any>) {\n\n }\n\n cancel(text?: string, options?: AXPDialogActionOptions): IActionBuilder {\n if (!this.dialogBuilder['dialogState'].actions!.footer!.suffix) {\n this.dialogBuilder['dialogState'].actions!.footer!.suffix = [];\n }\n this.dialogBuilder['dialogState'].actions!.footer!.suffix!.push({\n title: text || '@general:actions.cancel.title',\n color: 'default',\n command: { name: 'cancel' },\n shortcuts: resolveDialogActionShortcuts(DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS, options?.shortcuts),\n });\n return this;\n }\n\n submit(text?: string, options?: AXPDialogActionOptions): IActionBuilder {\n if (!this.dialogBuilder['dialogState'].actions!.footer!.suffix) {\n this.dialogBuilder['dialogState'].actions!.footer!.suffix = [];\n }\n this.dialogBuilder['dialogState'].actions!.footer!.suffix!.push({\n title: text || '@general:actions.submit.title',\n color: 'primary',\n command: { name: 'submit', options: { validate: true } },\n shortcuts: resolveDialogActionShortcuts(DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS, options?.shortcuts),\n });\n return this;\n }\n\n custom(action: AXPDialogActionMenuItem, options?: AXPDialogActionOptions): IActionBuilder {\n const item: AXPDialogActionMenuItem = {\n ...action,\n shortcuts: resolveDialogActionShortcuts(action.shortcuts ?? [], options?.shortcuts),\n };\n\n const position = item.position ?? 'suffix';\n if (position === 'prefix') {\n if (!this.dialogBuilder['dialogState'].actions!.footer!.prefix) {\n this.dialogBuilder['dialogState'].actions!.footer!.prefix = [];\n }\n this.dialogBuilder['dialogState'].actions!.footer!.prefix!.push(item);\n } else {\n if (!this.dialogBuilder['dialogState'].actions!.footer!.suffix) {\n this.dialogBuilder['dialogState'].actions!.footer!.suffix = [];\n }\n this.dialogBuilder['dialogState'].actions!.footer!.suffix!.push(item);\n }\n return this;\n }\n}\n\n//#endregion\n\n//#region ---- Step Wizard Builder Implementation ----\n\n/**\n * Step Builder - Builds individual steps for step wizard\n */\nclass StepBuilder {\n private icon?: string;\n private description?: string;\n private skippable = false;\n private contentNode?: AXPWidgetNode;\n private inheritanceContext: InheritanceContext = {};\n\n constructor(\n private id: string,\n private title: string,\n ) { }\n\n setIcon(icon: string): StepBuilder {\n this.icon = icon;\n return this;\n }\n\n setDescription(description: string): StepBuilder {\n this.description = description;\n return this;\n }\n\n setSkippable(skippable: boolean): StepBuilder {\n this.skippable = skippable;\n return this;\n }\n\n content(delegate: (layoutBuilder: ILayoutBuilder) => void): StepBuilder {\n if (delegate) {\n // Create LayoutBuilder in injection context (will be called from component)\n const layoutBuilder = new LayoutBuilder();\n\n // ✅ IMPORTANT: Propagate inheritance context to content\n (layoutBuilder as any).inheritanceContext = { ...this.inheritanceContext };\n\n delegate(layoutBuilder);\n this.contentNode = layoutBuilder.build();\n }\n return this;\n }\n\n withInheritanceContext(context: InheritanceContext): StepBuilder {\n this.inheritanceContext = mergeInheritanceContext(context);\n return this;\n }\n\n build(): AXPStepDefinition {\n if (!this.contentNode) {\n throw new Error(`Step '${this.id}' must have content`);\n }\n\n return {\n id: this.id,\n title: this.title,\n icon: this.icon,\n description: this.description,\n skippable: this.skippable,\n content: this.contentNode,\n };\n }\n}\n\n/**\n * Step Wizard Builder - Builds step wizard widget\n */\nclass StepWizardBuilder extends LayoutContainerMixin<IStepWizardBuilder> implements IStepWizardBuilder {\n private steps: AXPStepDefinition[] = [];\n private linear = true;\n private wizardDirection: 'horizontal' | 'vertical' = 'horizontal';\n private look?: string;\n private showActions?: boolean; // undefined = auto-detect\n private wizardActions?: AXPWizardActions;\n private guards?: {\n next?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n prev?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n };\n private events?: {\n onStepChanged?: (status: AXPStepWizardStatus) => void;\n onComplete?: (status: AXPStepWizardStatus) => void;\n };\n\n constructor() {\n super('step-wizard');\n }\n\n setLinear(linear: boolean): IStepWizardBuilder {\n this.linear = linear;\n return this;\n }\n\n setDirection(direction: 'horizontal' | 'vertical'): IStepWizardBuilder {\n this.wizardDirection = direction;\n return this;\n }\n\n setLook(look: string): IStepWizardBuilder {\n this.look = look;\n return this;\n }\n\n setShowActions(show: boolean): IStepWizardBuilder {\n this.showActions = show;\n return this;\n }\n\n setActions(actions: AXPWizardActions): IStepWizardBuilder {\n this.wizardActions = actions;\n return this;\n }\n\n setGuards(guards: {\n next?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n prev?: (payload: AXPStepWizardGuardPayload) => boolean | Promise<boolean>;\n }): IStepWizardBuilder {\n this.guards = guards;\n return this;\n }\n\n setEvents(events: {\n onStepChanged?: (status: AXPStepWizardStatus) => void;\n onComplete?: (status: AXPStepWizardStatus) => void;\n }): IStepWizardBuilder {\n this.events = events;\n return this;\n }\n\n step(id: string, title: string, delegate: (step: StepBuilder) => void): IStepWizardBuilder {\n const stepBuilder = new StepBuilder(id, title);\n\n // ✅ IMPORTANT: Propagate inheritance context to step\n stepBuilder.withInheritanceContext(this.inheritanceContext);\n\n if (delegate) {\n delegate(stepBuilder);\n }\n\n this.steps.push(stepBuilder.build());\n return this;\n }\n\n override build(): AXPWidgetNode {\n // ✅ Validation\n if (this.steps.length === 0) {\n throw new Error('StepWizard must have at least one step');\n }\n\n // ✅ Check duplicate IDs\n const ids = this.steps.map((s) => s.id);\n const duplicates = ids.filter((id, index) => ids.indexOf(id) !== index);\n if (duplicates.length > 0) {\n throw new Error(`Duplicate step IDs found: ${duplicates.join(', ')}`);\n }\n\n const definition: AXPStepWizardDefinition = {\n steps: this.steps,\n linear: this.linear,\n direction: this.wizardDirection,\n look: this.look,\n // Do not auto-detect based on dialog context; keep explicit or undefined\n showActions: this.showActions,\n actions: this.wizardActions,\n guards: this.guards,\n events: this.events,\n };\n\n const node: AXPWidgetNode = {\n name: this.containerState.name,\n type: 'step-wizard',\n options: { definition },\n mode: this.containerState.mode,\n };\n\n return node;\n }\n}\n\n//#endregion\n","import { AXFormComponent, AXFormModule } from '@acorex/components/form';\nimport { AXValidationSummary } from '@acorex/core/validation';\nimport {\n AXPPageStatus,\n AXPWidgetContainerComponent,\n AXPWidgetCoreModule,\n AXPWidgetNode,\n} from '@acorex/platform/layout/widget-core';\n\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { cloneDeep, isEqual } from 'lodash-es';\nimport { debounceTime, distinctUntilChanged, startWith, Subject } from 'rxjs';\nimport { AXPDynamicFormDefinition, AXPDynamicFormLook, AXPDynamicFormMode } from './layout-builder.types';\nimport { AXPLayoutConversionService } from './layout-conversion.service';\nimport { AXPContextChangeEvent } from '@acorex/platform/core';\n\n@Component({\n selector: 'axp-layout-renderer',\n standalone: true,\n imports: [AXPWidgetCoreModule, AXFormModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ax-form>\n <axp-widgets-container [context]=\"internalContext()\" (onContextChanged)=\"handleContextChanged($event)\">\n @if (widgetTree()) {\n <ng-container\n axp-widget-renderer\n [node]=\"widgetTree()!\"\n [mode]=\"effectiveRenderMode()\"\n ></ng-container>\n }\n </axp-widgets-container>\n </ax-form>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n `,\n ],\n})\nexport class AXPLayoutRendererComponent implements OnInit {\n private conversionService = inject(AXPLayoutConversionService);\n\n /**\n * RxJS subjects for context management\n */\n private contextUpdateSubject = new Subject<any>();\n private contextChangeSubject = new Subject<any>();\n\n //#region ---- Inputs ----\n\n /**\n * Form definition containing groups and fields OR widget tree\n */\n layout = input.required<AXPDynamicFormDefinition | AXPWidgetNode>();\n\n /**\n * Form context/model data\n */\n context = model<any>({});\n\n /**\n * Form appearance and density styling (normal, compact, spacious)\n */\n look = input<AXPDynamicFormLook>('fieldset');\n\n /**\n * Default form mode. Can be overridden by section/group and field.\n */\n mode = input<AXPDynamicFormMode>('edit');\n\n //#endregion\n\n //#region ---- Widget Tree Conversion ----\n\n protected widgetTree = signal<AXPWidgetNode | null>(null);\n\n /**\n * Prefer explicit {@link AXPWidgetNode.mode} on the root node (e.g. dialog flex `mode('view')`)\n * so nested widgets resolve view vs edit correctly; fall back to the layout `mode` input.\n */\n protected effectiveRenderMode = computed(() => this.widgetTree()?.mode ?? this.mode());\n\n /**\n * Convert layout data to widget tree when inputs change\n */\n conversionEffect = effect(() => {\n const inputData = this.layout();\n\n // Convert to widget tree\n let tree: AXPWidgetNode;\n\n if (this.isFormDefinition(inputData)) {\n // Convert form definition to widget tree\n tree = this.conversionService.convertFormDefinition(inputData);\n } else if (this.isWidgetNode(inputData)) {\n // Use widget tree directly\n tree = inputData;\n } else {\n console.warn(\n 'AXPLayoutRendererComponent: Invalid layout input. Expected AXPDynamicFormDefinition or AXPWidgetNode.',\n inputData,\n );\n return;\n }\n\n // Update widget tree only if changed (Angular effect already prevents unnecessary runs)\n const prev = this.widgetTree();\n if (!isEqual(prev, tree)) {\n this.widgetTree.set(tree);\n }\n });\n\n //#endregion\n\n //#region ---- Outputs ----\n\n /**\n * Emitted when context change is initiated\n */\n contextInitiated = output<any>();\n\n /**\n * Emitted when form becomes valid/invalid\n */\n validityChange = output<boolean>();\n\n //#endregion\n\n //#region ---- Properties ----\n\n private form = viewChild(AXFormComponent);\n private container = viewChild(AXPWidgetContainerComponent);\n\n /**\n * Internal context signal for reactivity\n */\n protected internalContext = signal<any>({});\n\n /**\n * Initial context for reset functionality\n */\n private initialContext: any = {};\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n ngOnInit(): void {\n // Initialize internal context with input context\n const ctx = this.context() ?? {};\n this.internalContext.set(ctx);\n\n // Store initial context for reset functionality\n this.initialContext = cloneDeep(ctx);\n\n // Setup RxJS streams for context management\n this.setupContextStreams();\n }\n\n //#endregion\n\n //#region ---- Effects ----\n\n /**\n * Effect to sync context changes from external to internal (optimized with RxJS)\n */\n #contextSyncEffect = effect(() => {\n const ctx = this.context() ?? {};\n this.contextUpdateSubject.next(ctx);\n });\n\n /**\n * Effect to handle widget tree status changes\n */\n #widgetStatusEffect = effect(() => {\n const widgetTree = this.widgetTree();\n if (widgetTree) {\n this.container()?.builderService.setStatus(AXPPageStatus.Rendered);\n }\n });\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n /**\n * Handle context change events from widget container (optimized with RxJS)\n */\n protected handleContextChanged(event: AXPContextChangeEvent): void {\n if (event.state === 'initiated') {\n this.contextInitiated.emit(event.data);\n } else {\n this.contextChangeSubject.next(event.data ?? {});\n }\n }\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Get the form component instance\n */\n public getForm(): AXFormComponent | undefined {\n return this.form();\n }\n\n /**\n * Get the widget container component instance\n */\n public getContainer(): AXPWidgetContainerComponent | undefined {\n return this.container();\n }\n\n /**\n * Get current form context\n */\n public getContext(): any {\n return this.internalContext();\n }\n\n /**\n * Update form context programmatically\n */\n public updateContext(context: any): void {\n this.internalContext.set(context);\n }\n\n /**\n * Get the current widget tree\n */\n public getWidgetTree(): AXPWidgetNode | null {\n return this.widgetTree();\n }\n\n /**\n * Validate the form\n */\n public async validate(): Promise<AXValidationSummary> {\n const form = this.form();\n if (form) {\n const isValid = await form.validate();\n this.validityChange.emit(isValid.result);\n return isValid;\n }\n return {\n result: false,\n messages: [],\n rules: [],\n } as AXValidationSummary;\n }\n\n /**\n * Clear the form context\n */\n public clear(): void {\n // Clear internal context\n this.internalContext.set({});\n\n // Update the model signal\n this.context.set({});\n }\n\n /**\n * Reset the form to its initial state\n */\n public reset(): void {\n // Reset to initial context\n const resetContext = cloneDeep(this.initialContext);\n this.internalContext.set(resetContext);\n\n // Update the model signal\n this.context.set(resetContext);\n }\n\n //#endregion\n\n //#region ---- RxJS Stream Setup ----\n\n /**\n * Setup RxJS streams for context management\n */\n private setupContextStreams(): void {\n // Debounced context updates from external source\n this.contextUpdateSubject\n .pipe(\n debounceTime(16), // ~60fps\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\n startWith(this.context() ?? {}),\n )\n .subscribe((ctx) => {\n this.internalContext.set(ctx);\n });\n\n // Debounced context changes from widgets\n this.contextChangeSubject\n .pipe(\n debounceTime(16), // ~60fps\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\n )\n .subscribe((ctx) => {\n this.internalContext.set(ctx);\n // Update the model signal directly - it will emit change events automatically\n this.context.set(this.internalContext());\n });\n }\n\n //#endregion\n\n //#region ---- Type Guards ----\n\n /**\n * Type guard to check if the input is a form definition\n */\n private isFormDefinition(data: any): data is AXPDynamicFormDefinition {\n return data && typeof data === 'object' && 'groups' in data && Array.isArray(data.groups);\n }\n\n /**\n * Type guard to check if the input is a widget node\n */\n private isWidgetNode(data: any): data is AXPWidgetNode {\n return data && typeof data === 'object' && 'type' in data && typeof data.type === 'string';\n }\n\n //#endregion\n}\n","/** Registration key for {@link AXPPreviewWidgetFieldCommand}; lives alone so `LayoutBuilderModule` can reference it without static-importing the command implementation. */\nexport const AXP_PREVIEW_WIDGET_FIELD_COMMAND_KEY = 'Widget:Preview';\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { provideCommandSetups } from '@acorex/platform/runtime';\nimport { AXPLayoutBuilderService } from './layout-builder.service';\nimport { AXPLayoutRendererComponent } from './layout-renderer.component';\nimport { AXP_PREVIEW_WIDGET_FIELD_COMMAND_KEY } from './preview-widget-field.command.key';\n\n@NgModule({\n imports: [CommonModule, AXPLayoutRendererComponent],\n providers: [\n AXPLayoutBuilderService,\n provideCommandSetups([\n {\n key: AXP_PREVIEW_WIDGET_FIELD_COMMAND_KEY,\n command: () => import('./preview-widget-field.command').then((c) => c.AXPPreviewWidgetFieldCommand),\n },\n ]),\n ],\n exports: [AXPLayoutRendererComponent],\n})\nexport class LayoutBuilderModule {}\n","import type { AXOverlayService } from '@acorex/cdk/overlay';\n\nconst OVERLAY_CONTAINER_SELECTOR = '.ax-overlay-container';\nconst OVERLAY_PANE_SELECTOR = '.ax-overlay-pane';\n\n/**\n * Optional open-overlay queries expected on {@link AXOverlayService} once the Acorex UI library\n * tracks overlay instances created via `create()`.\n *\n * TODO(acorex-ui): Implement on `AXOverlayService` in `@acorex/cdk/overlay`:\n * - Register each overlay ref in `create()` and unregister in `dispose()`.\n * - `hasOpenAnchoredOverlay(): boolean` — true when a popover/picker/dropdown panel is open.\n * - `hasOverlayAbove(container: HTMLElement | null): boolean` — true when the topmost overlay\n * is not the given container (covers nested widget panels and stacked modal confirms).\n *\n * `AXDialogService` / `AXPopupService` do not expose popover-open state today; widget popovers\n * (`ax-select-box`, `ax-datetime-box`, `ax-dropdown-box`) open through `AXOverlayService` only.\n */\ntype AXOverlayOpenStateQuery = AXOverlayService & {\n hasOpenAnchoredOverlay?: () => boolean;\n hasOverlayAbove?: (container: HTMLElement | null) => boolean;\n};\n\n/**\n * Returns true when a nested overlay is open and Esc should close it first.\n * Returns false when only the dialog shell is on top.\n * Returns null when the Acorex overlay service does not expose open-state queries yet.\n */\nexport function hasOpenNestedOverlayFromAcorexService(\n overlayService: AXOverlayService,\n dialogOverlay: HTMLElement | null,\n): boolean | null {\n const service = overlayService as AXOverlayOpenStateQuery;\n\n if (typeof service.hasOpenAnchoredOverlay === 'function') {\n if (!service.hasOpenAnchoredOverlay()) {\n return false;\n }\n\n if (typeof service.hasOverlayAbove === 'function') {\n return service.hasOverlayAbove(dialogOverlay);\n }\n\n return true;\n }\n\n if (typeof service.hasOverlayAbove === 'function') {\n return service.hasOverlayAbove(dialogOverlay);\n }\n\n return null;\n}\n\n/**\n * Returns true when the overlay element is rendered and visible in the viewport.\n */\nfunction isVisibleOverlayElement(element: Element): boolean {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n const style = getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden' || Number(style.opacity) === 0) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n\n/**\n * Collects visible overlay containers in stacking order (later / higher z-index wins).\n */\nfunction getVisibleOverlayContainers(document: Document): HTMLElement[] {\n return Array.from(document.querySelectorAll<HTMLElement>(OVERLAY_CONTAINER_SELECTOR))\n .filter(isVisibleOverlayElement)\n .sort(compareOverlayStackOrder);\n}\n\n/**\n * Compares two overlay containers by z-index, then DOM order.\n */\nfunction compareOverlayStackOrder(a: HTMLElement, b: HTMLElement): number {\n const za = Number(getComputedStyle(a).zIndex) || 0;\n const zb = Number(getComputedStyle(b).zIndex) || 0;\n if (za !== zb) {\n return za - zb;\n }\n\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n\n return 0;\n}\n\n/**\n * Returns visible anchored overlay panes that belong to widget popovers, not the dialog shell.\n */\nfunction getNestedOverlayPanes(document: Document, dialogOverlay: HTMLElement | null): HTMLElement[] {\n return Array.from(document.querySelectorAll<HTMLElement>(OVERLAY_PANE_SELECTOR)).filter(\n (pane) => isVisibleOverlayElement(pane) && !dialogOverlay?.contains(pane),\n );\n}\n\n/**\n * DOM fallback until {@link AXOverlayService} exposes open-overlay queries.\n *\n * Dialog popups use a centered `.ax-overlay-container` without `.ax-overlay-pane`.\n * Widget popovers (select, datetime, dropdown) use anchored containers with `.ax-overlay-pane`.\n */\nfunction shouldDeferEscapeToNestedOverlayFromDom(document: Document, dialogHost: HTMLElement): boolean {\n const dialogOverlay = dialogHost.closest<HTMLElement>(OVERLAY_CONTAINER_SELECTOR);\n\n if (getNestedOverlayPanes(document, dialogOverlay).length > 0) {\n return true;\n }\n\n const visibleContainers = getVisibleOverlayContainers(document);\n if (!visibleContainers.length) {\n return false;\n }\n\n const topContainer = visibleContainers[visibleContainers.length - 1];\n\n if (!dialogOverlay) {\n return topContainer.contains(dialogHost) === false;\n }\n\n return topContainer !== dialogOverlay;\n}\n\n/**\n * When a nested overlay is above this dialog (widget popover, confirm box, etc.), footer shortcuts\n * should not run on the parent dialog.\n */\nexport function shouldDeferDialogShortcutsToNestedOverlay(\n document: Document,\n dialogHost: HTMLElement,\n overlayService?: AXOverlayService,\n): boolean {\n const dialogOverlay = dialogHost.closest<HTMLElement>(OVERLAY_CONTAINER_SELECTOR);\n\n if (overlayService) {\n const fromService = hasOpenNestedOverlayFromAcorexService(overlayService, dialogOverlay);\n if (fromService !== null) {\n return fromService;\n }\n }\n\n return shouldDeferEscapeToNestedOverlayFromDom(document, dialogHost);\n}\n","import type { AXPDialogRef } from './layout-builder.types';\n\n/**\n * ## Dialog `show()` resolve contract (do not change without a breaking-change review)\n *\n * `AXPLayoutBuilderService.show()` resolves once via `callBack` with one of:\n *\n * 1. **`onAction` return value** — arbitrary `T` from the handler (e.g. `{ data, success }`, `{ skipValidate: true }`).\n * Unchanged by dirty-state work; only dismiss *routing* may defer resolve until `onClosing` for cancel when\n * `confirmCloseWhenDirty` is enabled.\n *\n * 2. **Layout-builder custom footer commands** (no `onAction`) — {@link AXPDialogRef} built by\n * {@link buildLayoutBuilderCustomActionRef}. Resolves on button click; dialog stays open until the caller\n * invokes `ref.close()` (e.g. `upload-image`, `signature-apply`).\n *\n * 3. **Header X / Esc dismiss** — {@link AXPDialogRef} from `createDialogRef('cancel')` when no footer action ran.\n *\n * Dirty-state / Esc-priority changes must not alter these payload shapes or `onAction` handler signatures.\n */\n\nexport interface DialogRendererLegacyData {\n context?: unknown;\n action?: string;\n}\n\n/**\n * Builds the `show()` resolve payload for layout-builder custom footer commands (fallback path).\n */\nexport function buildLayoutBuilderCustomActionRef(\n createDialogRef: (command: string | undefined) => AXPDialogRef,\n command: string | undefined,\n): AXPDialogRef {\n return {\n ...createDialogRef(command),\n action: () => command,\n };\n}\n\n/**\n * Keeps legacy popup `data.context` / `data.action` side fields in sync for custom footer commands.\n */\nexport function syncLegacyDialogDataSideFields(\n data: DialogRendererLegacyData | undefined,\n context: unknown,\n action: string | undefined,\n): void {\n if (!data) {\n return;\n }\n\n data.context = context;\n data.action = action;\n}\n\n/**\n * Cancel from an `onAction` handler should route through the dirty-close gate only when configured.\n * Otherwise preserve the original resolve-then-close sequence.\n */\nexport function shouldRouteOnActionCancelThroughDismissGate(confirmCloseWhenDirtyEnabled: boolean | undefined): boolean {\n return confirmCloseWhenDirtyEnabled === true;\n}\n","import { AXComponentClosing } from '@acorex/cdk/common';\nimport { AXOverlayService } from '@acorex/cdk/overlay';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport {\n AXPComponentSlotModule,\n AXPContextStore,\n AXPExpressionEvaluatorService,\n AXPHookService,\n captureFormContextBaseline,\n isFormContextDirty,\n} from '@acorex/platform/core';\nimport { AXPWidgetCoreElementAction, AXPWidgetCoreService } from '@acorex/platform/layout/widget-core';\nimport { AXPCommandService } from '@acorex/platform/runtime';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n OnInit,\n Output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { merge } from 'lodash-es';\nimport {\n matchesDialogActionShortcut,\n resolveConfiguredFooterActionShortcuts,\n shouldTriggerDialogActionShortcut,\n} from './dialog-action-shortcuts.util';\nimport { shouldDeferDialogShortcutsToNestedOverlay } from './dialog-escape-priority.util';\nimport {\n buildLayoutBuilderCustomActionRef,\n shouldRouteOnActionCancelThroughDismissGate,\n syncLegacyDialogDataSideFields,\n} from './dialog-resolve.util';\nimport {\n AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY,\n type AXPLayoutBuilderDialogContextChangedPayload,\n} from './layout-builder-dialog.hooks';\nimport type {\n AXPDialogCloseConfirmationOptions,\n AXPDialogRef,\n AXPLayoutBuilderDialogConfig,\n} from './layout-builder.types';\nimport { AXPLayoutRendererComponent } from './layout-renderer.component';\n\n/** Idle period after the last context change before capturing the clean baseline. */\nconst DIALOG_DIRTY_BASELINE_IDLE_MS = 500;\n\n/** Hard fallback when idle detection never settles. */\nconst DIALOG_DIRTY_BASELINE_FALLBACK_DELAY_MS = 2000;\n\n/** Debounce after widget count stabilizes before re-evaluating footer actions. */\nconst DIALOG_WIDGET_COUNT_STABLE_DELAY_MS = 350;\n\nexport type DialogRendererConfig = AXPLayoutBuilderDialogConfig;\n\nexport interface DialogRendererResult {\n context: any;\n action?: string;\n}\n\n@Component({\n selector: 'axp-dialog-renderer',\n standalone: true,\n imports: [\n CommonModule,\n AXPLayoutRendererComponent,\n AXButtonModule,\n AXDecoratorModule,\n AXLoadingModule,\n AXTranslationModule,\n AXPComponentSlotModule,\n ],\n providers: [AXPContextStore],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <axp-component-slot name=\"dialog-header\" [context]=\"context()\"></axp-component-slot>\n <div class=\"ax-p-4\">\n <!-- @if (config.message) {\n <p class=\"ax-mb-4 ax-leading-relaxed\">{{ config.message | translate | async }}</p>\n } -->\n <axp-layout-renderer\n [layout]=\"config.definition\"\n [context]=\"context()\"\n (contextChange)=\"handleContextChanged($event)\"\n (contextInitiated)=\"handleContextInitiated($event)\"\n >\n </axp-layout-renderer>\n </div>\n\n <!-- Custom footer slot: if it has content, default footer is hidden -->\n <axp-component-slot name=\"dialog-footer\" #footerSlot=\"slot\" [context]=\"context()\"></axp-component-slot>\n @if (footerSlot.isEmpty()) {\n <ax-footer>\n <ax-prefix>\n <axp-component-slot name=\"dialog-footer-prefix\" [context]=\"context()\"></axp-component-slot>\n @for (action of footerPrefixActions(); track $index) {\n <ax-button\n [disabled]=\"action.disabled || isFormLoading()\"\n [text]=\"(action.title | translate | async)!\"\n [look]=\"'outline'\"\n [color]=\"action.color\"\n (onClick)=\"executeAction(action)\"\n >\n @if (isFormLoading()) {\n <ax-loading></ax-loading>\n }\n <ax-prefix>\n @if (action.icon) {\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n }\n </ax-prefix>\n </ax-button>\n }\n </ax-prefix>\n <ax-suffix>\n @for (action of footerSuffixActions(); track $index) {\n <ax-button\n [disabled]=\"action.disabled || isSubmitting()\"\n [text]=\"(action.title | translate | async)!\"\n [look]=\"'solid'\"\n [color]=\"action.color\"\n (onClick)=\"executeAction(action)\"\n >\n @if (isFormLoading()) {\n <ax-loading></ax-loading>\n }\n @if (action.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n <axp-component-slot name=\"dialog-footer-suffix\" [context]=\"context()\"></axp-component-slot>\n </ax-suffix>\n </ax-footer>\n }\n `,\n})\nexport class AXPDialogRendererComponent extends AXBasePageComponent implements OnInit {\n config!: DialogRendererConfig;\n\n @Output() result = new EventEmitter<DialogRendererResult>();\n\n //#region ---- Services & Dependencies ----\n\n // ✅ Inject services\n private widgetCoreService: AXPWidgetCoreService;\n private expressionEvaluator = inject(AXPExpressionEvaluatorService);\n private readonly commandService = inject(AXPCommandService);\n private readonly hookService = inject(AXPHookService, { optional: true });\n private readonly dialogService = inject(AXDialogService);\n private readonly overlayService = inject(AXOverlayService);\n private readonly translationService = inject(AXTranslationService);\n private readonly document = inject(DOCUMENT);\n private readonly host = inject(ElementRef<HTMLElement>);\n\n //#endregion\n\n //#region ---- State ----\n\n // Store dialog result for manual closing\n private dialogResult?: DialogRendererResult;\n\n /** Ensures `show()` resolves once when the dialog closes (footer action or header close). */\n private callbackInvoked = false;\n\n /** Baseline snapshot for dirty detection (captured once after init settles). */\n private dirtyBaseline?: Record<string, unknown>;\n\n /** True after the post-init baseline snapshot has been captured. */\n private dirtyBaselineCaptured = false;\n\n private dirtyBaselineIdleTimer?: ReturnType<typeof setTimeout>;\n\n /** Callback payload applied when a dismiss is allowed in {@link onClosing}. */\n private pendingDismissResolvePayload?: unknown;\n\n /** Skips dirty confirmation on the next {@link onClosing} (successful submit / programmatic close). */\n private skipNextOnClosingDirtyCheck = false;\n\n /** Prevents concurrent dismiss paths from opening multiple unsaved-changes confirms. */\n private dismissConfirmPromise?: Promise<boolean>;\n\n private dirtyBaselineFallbackTimer?: ReturnType<typeof setTimeout>;\n\n private readonly destroyRef = inject(DestroyRef);\n\n context = signal<any>({});\n\n // This will be set by the popup service automatically - same as dynamic-dialog\n callBack: (result: unknown) => void = () => {};\n data: any;\n\n private isDialogLoading = signal(false);\n\n // Aggregated actions for footer rendering\n footerPrefix = signal<AXPWidgetCoreElementAction[]>([]);\n footerSuffix = signal<AXPWidgetCoreElementAction[]>([]);\n\n /**\n * Correlate layout context snapshots for distributed hooks (`layout-builder.dialog.context-changed`).\n */\n private readonly contextChangedHooksSessionKey =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `layout-dialog-ctx-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n /**\n * Capture-phase footer shortcuts — runs before widget editors (select, date, text) that stop keydown bubbling.\n */\n private readonly onDialogShortcutCapture = (event: KeyboardEvent): void => {\n if (this.isDialogLoading()) {\n return;\n }\n\n // Unsaved-changes confirm is modal — parent footer shortcuts must not run underneath it.\n if (this.dismissConfirmPromise) {\n return;\n }\n\n if (shouldDeferDialogShortcutsToNestedOverlay(this.document, this.host.nativeElement, this.overlayService)) {\n return;\n }\n\n if (event.key === 'Escape' && this.config?.confirmCloseWhenDirty?.enabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.requestDismiss();\n return;\n }\n\n const actions = [...this.footerPrefixActions(), ...this.footerSuffixActions()];\n for (const action of actions) {\n if (action.disabled || action.hidden || !action.shortcuts?.length) {\n continue;\n }\n\n for (const shortcut of action.shortcuts) {\n if (event.key === 'Escape' && this.config?.confirmCloseWhenDirty?.enabled) {\n continue;\n }\n\n if (!matchesDialogActionShortcut(event, shortcut) || !shouldTriggerDialogActionShortcut(event, shortcut)) {\n continue;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n void this.executeAction(action);\n return;\n }\n }\n };\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n override ngOnInit(): void {\n const initialContext = this.config?.context || {};\n this.context.set(initialContext);\n this.dirtyBaselineFallbackTimer = setTimeout(() => {\n this.captureDirtyBaselineIfNeeded();\n }, DIALOG_DIRTY_BASELINE_FALLBACK_DELAY_MS);\n this.document.addEventListener('keydown', this.onDialogShortcutCapture, true);\n this.destroyRef.onDestroy(() => {\n this.document.removeEventListener('keydown', this.onDialogShortcutCapture, true);\n if (this.dirtyBaselineIdleTimer) {\n clearTimeout(this.dirtyBaselineIdleTimer);\n }\n if (this.dirtyBaselineFallbackTimer) {\n clearTimeout(this.dirtyBaselineFallbackTimer);\n }\n });\n void this.invokeLayoutContextChangedHooks();\n }\n\n //#endregion\n\n //#region ---- Popup Close Gate ----\n\n /**\n * Popup shell hook — handles header **X** and **Esc** (when `closeButton` is enabled).\n * This is the only place that prompts for unsaved changes.\n */\n override async onClosing(e: AXComponentClosing): Promise<void> {\n if (this.dismissConfirmPromise) {\n e.cancel = true;\n return;\n }\n\n if (this.skipNextOnClosingDirtyCheck) {\n this.skipNextOnClosingDirtyCheck = false;\n this.completeDismissResolve();\n return;\n }\n\n if (!this.config?.confirmCloseWhenDirty?.enabled) {\n this.completeDismissResolve();\n return;\n }\n\n if (!(await this.confirmDismissIfDirty())) {\n e.cancel = true;\n this.pendingDismissResolvePayload = undefined;\n return;\n }\n\n this.completeDismissResolve();\n }\n\n /**\n * Footer cancel and other in-app dismiss actions. Routes through `super.close()` so the\n * popup shell invokes {@link onClosing} exactly once (same path as **X** / **Esc**).\n */\n private requestDismiss(resolvePayload?: unknown): void {\n this.pendingDismissResolvePayload = resolvePayload ?? this.createDialogRef('cancel');\n super.close();\n }\n\n /** Invokes `show()` callback with the pending payload or a default cancel {@link AXPDialogRef}. */\n private completeDismissResolve(): void {\n const payload = this.pendingDismissResolvePayload;\n this.pendingDismissResolvePayload = undefined;\n\n if (payload !== undefined) {\n this.resolveDialog(payload);\n return;\n }\n\n if (!this.callbackInvoked) {\n this.resolveDialog(this.createDialogRef('cancel'));\n }\n }\n\n //#endregion\n\n //#region ---- Dirty State ----\n\n private getWidgetContextStore(): InstanceType<typeof AXPContextStore> | undefined {\n return this.layoutRenderer()?.getContainer()?.contextService;\n }\n\n private scheduleDirtyBaselineCapture(): void {\n if (this.dirtyBaselineCaptured) {\n return;\n }\n\n if (this.dirtyBaselineIdleTimer) {\n clearTimeout(this.dirtyBaselineIdleTimer);\n }\n\n this.dirtyBaselineIdleTimer = setTimeout(() => {\n this.captureDirtyBaselineIfNeeded();\n }, DIALOG_DIRTY_BASELINE_IDLE_MS);\n }\n\n /**\n * Captures a dialog-local baseline once after widget init/normalization goes idle.\n */\n private captureDirtyBaselineIfNeeded(): void {\n if (this.dirtyBaselineCaptured) {\n return;\n }\n\n const store = this.getWidgetContextStore();\n if (!store) {\n return;\n }\n\n const widgetCount = this.widgetCoreService?.registeredWidgetsCount() ?? 0;\n if (widgetCount === 0) {\n return;\n }\n\n const snapshot = store.data() as Record<string, unknown>;\n this.dirtyBaseline = captureFormContextBaseline(snapshot);\n store.commitBaseline();\n this.dirtyBaselineCaptured = true;\n\n if (this.dirtyBaselineIdleTimer) {\n clearTimeout(this.dirtyBaselineIdleTimer);\n this.dirtyBaselineIdleTimer = undefined;\n }\n if (this.dirtyBaselineFallbackTimer) {\n clearTimeout(this.dirtyBaselineFallbackTimer);\n this.dirtyBaselineFallbackTimer = undefined;\n }\n }\n\n //#endregion\n\n //#region ---- View Accessors ----\n\n // Access the internal layout renderer to reach the widgets container injector\n private layoutRenderer = viewChild(AXPLayoutRendererComponent);\n\n // Debounce timer for aggregating actions after widget count stabilizes\n private debounceTimer?: ReturnType<typeof setTimeout>;\n\n #widgetActionsEffect = effect(() => {\n this.aggregateAndEvaluateActions();\n if (!this.widgetCoreService) {\n const renderer = this.layoutRenderer();\n const container = renderer?.getContainer();\n this.widgetCoreService = (container?.builderService as AXPWidgetCoreService) ?? null;\n return;\n }\n\n this.widgetCoreService.registeredWidgetsCount();\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.aggregateAndEvaluateActions();\n }, DIALOG_WIDGET_COUNT_STABLE_DELAY_MS);\n });\n\n #dirtyBaselineEffect = effect(() => {\n if (this.dirtyBaselineCaptured) {\n return;\n }\n\n const store = this.getWidgetContextStore();\n if (!store) {\n return;\n }\n\n store.data();\n this.widgetCoreService?.registeredWidgetsCount();\n this.scheduleDirtyBaselineCapture();\n });\n\n //#endregion\n\n handleContextChanged(event: any) {\n this.context.set(event);\n this.aggregateAndEvaluateActions();\n void this.invokeLayoutContextChangedHooks();\n }\n\n handleContextInitiated(event: any) {\n this.context.set(event);\n this.aggregateAndEvaluateActions();\n void this.invokeLayoutContextChangedHooks();\n }\n\n private async invokeLayoutContextChangedHooks(): Promise<void> {\n const meta = this.config?.metadata as Record<string, unknown> | undefined;\n\n if (!this.hookService) {\n return;\n }\n\n const payload: AXPLayoutBuilderDialogContextChangedPayload = {\n sessionKey: this.contextChangedHooksSessionKey,\n getContext: () => {\n const store = this.getWidgetContextStore();\n return (store?.data() ?? this.context() ?? {}) as Record<string, unknown>;\n },\n metadata: meta,\n patchContext: (partial: Record<string, unknown>) => {\n const merged = merge({}, this.context(), partial);\n this.context.set(merged);\n this.layoutRenderer()?.updateContext(merged);\n },\n setLoading: (loading: boolean) => this.isDialogLoading.set(loading),\n };\n\n try {\n await this.hookService.runAsync(AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY, payload);\n } catch {\n // Hook providers are best-effort; avoid breaking the dialog lifecycle.\n }\n }\n\n footerPrefixActions() {\n return this.footerPrefix();\n }\n\n footerSuffixActions() {\n return this.footerSuffix();\n }\n\n isFormLoading() {\n return this.isDialogLoading();\n }\n\n isSubmitting() {\n return this.isDialogLoading();\n }\n\n async executeAction(action: AXPWidgetCoreElementAction) {\n const cmd = this.resolveActionCommandName(action.command);\n\n if (this.shouldValidateBeforeAction(cmd)) {\n const isValid = await this.layoutRenderer()?.validate();\n if (!isValid?.result) {\n return;\n }\n }\n\n //TODO: matin, why we need this? maybe we can remove it?\n if (cmd?.startsWith('widget:')) {\n const parsed = this.parseWidgetCommand(cmd);\n if (parsed.widgetName && parsed.action) {\n await this.invokeWidget(parsed.widgetName, parsed.action, {});\n await this.aggregateAndEvaluateActions();\n return;\n }\n }\n\n if (cmd && this.commandService.exists(cmd)) {\n const dialogRef = this.createDialogRef(cmd);\n const integration = (this.config.metadata ?? {}) as Record<string, unknown>;\n try {\n const cmdResult = await this.commandService.execute(cmd, { dialogRef, integration });\n if (!cmdResult?.success) {\n return;\n }\n if (this.shouldKeepDialogOpenAfterCommandResult(cmdResult)) {\n return;\n }\n this.resolveDialog(cmdResult);\n await this.closeWithOptionalSkipValidate(cmdResult);\n } catch (error) {\n console.error('Error executing action', cmd, error);\n }\n return;\n }\n\n const context = this.context();\n const onAction = this.config?.onAction;\n\n // `onAction` return value is passed through to `show()` unchanged — see dialog-resolve.util.ts.\n if (onAction) {\n const dialogRef = this.createDialogRef(cmd);\n try {\n this.isDialogLoading.set(true);\n const result = await Promise.resolve(onAction(dialogRef));\n if (this.shouldKeepDialogOpenAfterCommandResult(result)) {\n return;\n }\n if (\n cmd === 'cancel' &&\n shouldRouteOnActionCancelThroughDismissGate(this.config?.confirmCloseWhenDirty?.enabled)\n ) {\n this.isDialogLoading.set(false);\n this.requestDismiss(result);\n return;\n }\n this.resolveDialog(result);\n await this.closeWithOptionalSkipValidate(result);\n } catch {\n // Handler threw: stay open for retry, actions remain clickable\n } finally {\n this.isDialogLoading.set(false);\n }\n return;\n }\n\n // Fallback: layout-builder custom footer commands (e.g. signature-apply, upload-image).\n // See dialog-resolve.util.ts — resolves {@link AXPDialogRef}; does not auto-close except cancel.\n const result: DialogRendererResult = { context, action: cmd };\n this.dialogResult = result;\n syncLegacyDialogDataSideFields(this.data, result.context, result.action);\n\n const dialogRefPayload = buildLayoutBuilderCustomActionRef((command) => this.createDialogRef(command), cmd);\n\n if (cmd === 'cancel') {\n this.requestDismiss(dialogRefPayload);\n return;\n }\n\n this.resolveDialog(dialogRefPayload);\n }\n\n private isDialogDirty(): boolean {\n const confirmOptions = this.config?.confirmCloseWhenDirty;\n if (!confirmOptions?.enabled || !this.dirtyBaselineCaptured) {\n return false;\n }\n\n const store = this.getWidgetContextStore();\n if (!store) {\n return false;\n }\n\n const current = store.data() as Record<string, unknown>;\n const baseline = this.dirtyBaseline ?? (store.initial() as Record<string, unknown>);\n\n if (typeof confirmOptions.isDirty === 'function') {\n return confirmOptions.isDirty(current, baseline);\n }\n\n return (\n store.isUserDirty() ||\n (this.widgetCoreService?.hasDirtyWidgets() ?? false) ||\n isFormContextDirty(current, baseline)\n );\n }\n\n private async confirmDismissIfDirty(): Promise<boolean> {\n if (this.dismissConfirmPromise) {\n return this.dismissConfirmPromise;\n }\n\n const confirmOptions = this.config?.confirmCloseWhenDirty;\n if (!confirmOptions?.enabled || !this.isDialogDirty()) {\n return true;\n }\n\n this.dismissConfirmPromise = this.promptUnsavedChangesConfirm(confirmOptions);\n try {\n return await this.dismissConfirmPromise;\n } finally {\n this.dismissConfirmPromise = undefined;\n }\n }\n\n private async promptUnsavedChangesConfirm(confirmOptions: AXPDialogCloseConfirmationOptions): Promise<boolean> {\n const title = await this.translationService.translateAsync(\n confirmOptions.title ?? '@general:messages.unsaved-changes.title',\n );\n const message = await this.translationService.translateAsync(\n confirmOptions.message ?? '@general:messages.unsaved-changes.message',\n );\n const dialogResult = await this.dialogService.confirm(\n title,\n message,\n 'warning',\n 'horizontal',\n false,\n 'cancel',\n );\n return dialogResult.result === true;\n }\n\n /** Whether the layout form should be validated before running this footer command. */\n private shouldValidateBeforeAction(cmd: string | undefined): boolean {\n if (!cmd || cmd === 'cancel' || cmd === 'entity-form-done' || cmd === 'entity-form-next-step') {\n return false;\n }\n if (cmd.startsWith('widget:')) {\n return false;\n }\n if (this.commandService.exists(cmd)) {\n return false;\n }\n return true;\n }\n\n /** True when a footer handler or command result asks to leave the dialog open (`keepDialogOpen` on the result or `result.data`). */\n private shouldKeepDialogOpenAfterCommandResult(result: unknown): boolean {\n if (!result || typeof result !== 'object') {\n return false;\n }\n const top = result as { keepDialogOpen?: boolean; data?: unknown };\n if (top.keepDialogOpen === true) {\n return true;\n }\n if (top.data != null && typeof top.data === 'object' && 'keepDialogOpen' in top.data) {\n return (top.data as { keepDialogOpen?: boolean }).keepDialogOpen === true;\n }\n return false;\n }\n\n /** Resolves the dialog `show()` promise exactly once. */\n private resolveDialog(result: unknown): void {\n if (this.callbackInvoked) {\n return;\n }\n this.callbackInvoked = true;\n this.callBack(result);\n }\n\n private createDialogRef(actionCmd: string | undefined): AXPDialogRef {\n return {\n close: (res?: any) => {\n void this.closeWithOptionalSkipValidate(res);\n },\n context: () => this.context(),\n action: () => actionCmd,\n setLoading: (loading: boolean) => this.isDialogLoading.set(loading),\n patchContext: (partial: Record<string, unknown>) => {\n const merged = merge({}, this.context(), partial);\n this.context.set(merged);\n this.layoutRenderer()?.updateContext(merged);\n },\n invokeWidget: (widgetName: string, method: string, opts?: { setLoading?: (v: boolean) => void }) =>\n this.invokeWidget(widgetName, method, opts ?? {}),\n };\n }\n\n private async closeWithOptionalSkipValidate(result: any): Promise<void> {\n if (result && typeof result === 'object' && (result as { skipValidate?: boolean }).skipValidate) {\n this.result.emit(result);\n this.skipNextOnClosingDirtyCheck = true;\n this.pendingDismissResolvePayload = undefined;\n super.close(result);\n return;\n }\n await this.close(result, { skipDirtyConfirm: true });\n }\n\n /** Resolves footer/widget action command to a string (e.g. `cancel`, `submit`, `widget:...`). */\n private resolveActionCommandName(command: AXPWidgetCoreElementAction['command']): string | undefined {\n if (typeof command === 'string') {\n return command;\n }\n if (command && typeof command === 'object' && 'name' in command) {\n return (command as { name: string }).name;\n }\n return undefined;\n }\n\n private parseWidgetCommand(cmd: string): { widgetName?: string; action?: string } {\n // Expected 'widget:<widgetName>.<action>'\n if (!cmd?.startsWith('widget:')) return {};\n const rest = cmd.slice('widget:'.length);\n const dot = rest.lastIndexOf('.');\n if (dot <= 0) return {};\n return { widgetName: rest.slice(0, dot), action: rest.slice(dot + 1) };\n }\n\n private async invokeWidget(\n widgetName: string,\n apiMethod: string,\n opts: { setLoading?: (loading: boolean) => void; close?: (result?: any) => void },\n ): Promise<void> {\n if (!this.widgetCoreService) return;\n try {\n const widget = this.widgetCoreService.getWidget(widgetName) as any;\n const api = widget?.api?.();\n const fn = api?.[apiMethod];\n if (typeof fn === 'function') {\n await Promise.resolve(\n fn({\n close: (result?: any) => {\n void this.closeWithOptionalSkipValidate(result);\n },\n context: () => this.context(),\n setLoading: (loading: boolean) => {\n (opts.setLoading ?? ((v: boolean) => this.isDialogLoading.set(v)))(loading);\n },\n } as AXPDialogRef),\n );\n // Footer predicates (e.g. wizard step) must refresh when the widget advances outside executeAction (e.g. dialogRef.invokeWidget after entity-form continue).\n await this.aggregateAndEvaluateActions();\n }\n } catch {\n //\n }\n }\n\n override async close(result?: DialogRendererResult, options?: { skipDirtyConfirm?: boolean }) {\n if (options?.skipDirtyConfirm) {\n this.skipNextOnClosingDirtyCheck = true;\n this.pendingDismissResolvePayload = undefined;\n }\n\n if (result) {\n const isValid = await this.layoutRenderer()?.validate();\n if (isValid?.result) {\n this.result.emit(result);\n }\n }\n\n super.close(result);\n }\n\n // --- Actions aggregation & evaluation ---\n private async aggregateAndEvaluateActions(): Promise<void> {\n const widgetActions = await this.collectWidgetActions();\n const dialogActions = this.collectDialogActionsFromConfig();\n const all = [...widgetActions, ...dialogActions];\n const evaluated = await this.evaluatePredicates(all);\n const visible = evaluated.filter((a) => a.hidden !== true);\n\n const prefix = visible.filter((a) => (a.zone ?? 'footer') === 'footer' && (a.placement ?? 'suffix') === 'prefix');\n const suffix = visible.filter((a) => (a.zone ?? 'footer') === 'footer' && (a.placement ?? 'suffix') === 'suffix');\n\n this.footerPrefix.set(prefix);\n this.footerSuffix.set(suffix);\n }\n\n private async collectWidgetActions(): Promise<AXPWidgetCoreElementAction[]> {\n if (!this.widgetCoreService) return [];\n const names = this.widgetCoreService.listRegisteredWidgetNames();\n const actions: AXPWidgetCoreElementAction[] = [];\n for (const name of names) {\n try {\n const widget = this.widgetCoreService.getWidget(name) as any;\n const widgetActs: AXPWidgetCoreElementAction[] = widget?.actions?.() ?? [];\n actions.push(...widgetActs);\n } catch {}\n }\n return actions;\n }\n\n private collectDialogActionsFromConfig(): AXPWidgetCoreElementAction[] {\n const footer = this.config?.actions?.footer;\n const mapOne = (a: any, placement: 'prefix' | 'suffix'): AXPWidgetCoreElementAction => ({\n title: a.title,\n command: typeof a.command === 'string' ? a.command : a.command?.name,\n icon: a.icon,\n color: a.color,\n disabled: a.disabled,\n hidden: a.hidden,\n zone: 'footer',\n placement,\n scope: a.scope,\n predicateApiWidgetName: a.predicateApiWidgetName,\n shortcuts: resolveConfiguredFooterActionShortcuts(\n typeof a.command === 'string' ? a.command : a.command?.name,\n a.shortcuts,\n ),\n });\n const prefix = (footer?.prefix || []).map((a) => mapOne(a, 'prefix'));\n const suffix = (footer?.suffix || []).map((a) => mapOne(a, 'suffix'));\n return [...prefix, ...suffix];\n }\n\n private async evaluatePredicates(actions: AXPWidgetCoreElementAction[]): Promise<AXPWidgetCoreElementAction[]> {\n const out: AXPWidgetCoreElementAction[] = [];\n for (const a of actions) {\n const parsed = typeof a.command === 'string' ? this.parseWidgetCommand(a.command) : {};\n const widgetNameForApi = parsed.widgetName ?? a.predicateApiWidgetName;\n const api = widgetNameForApi ? await this.resolveApi(widgetNameForApi) : undefined;\n const scope = {\n api,\n widget: { name: widgetNameForApi },\n dialog: { context: this.context() },\n context: this.context(),\n } as any;\n const disabled = await this.evalBool(a.disabled, scope);\n const hidden = await this.evalBool(a.hidden, scope);\n const resolvedTitle = (await this.evalActionTitle(a.title, scope)) ?? a.title;\n out.push({ ...a, disabled, hidden, title: resolvedTitle });\n }\n return out;\n }\n\n private async evalBool(value: boolean | string | undefined, scope: any): Promise<boolean | undefined> {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n try {\n const result = await this.expressionEvaluator.evaluate(value, scope);\n return !!result;\n } catch {\n return false;\n }\n }\n return value;\n }\n\n /** Resolves footer action title when it contains {{ ... }} (e.g. wizard labels from dialog context). */\n private async evalActionTitle(value: string | undefined, scope: any): Promise<string | undefined> {\n if (value == null || typeof value !== 'string' || !value.includes('{{')) {\n return value;\n }\n try {\n const result = await this.expressionEvaluator.evaluate(value, scope);\n if (typeof result === 'string' && result.length > 0) {\n return result;\n }\n if (result != null && result !== false) {\n return String(result);\n }\n } catch {\n //\n }\n return value;\n }\n\n private async resolveApi(widgetName: string): Promise<any> {\n try {\n await this.widgetCoreService?.waitForWidget(widgetName, 2000);\n const widget = this.widgetCoreService?.getWidget(widgetName) as any;\n return widget?.api?.();\n } catch {\n return undefined;\n }\n }\n}\n","//#region ---- Imports ----\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPExecuteCommandResult, type AXPMultiLanguageString } from '@acorex/platform/core';\nimport { AXP_ENTITY_DEFINITION_CRUD_SERVICE, type AXPEntityDefinitionCrudService } from '@acorex/platform/domain';\nimport { AXPWidgetNode, AXPWidgetRegistryService } from '@acorex/platform/layout/widget-core';\nimport { AXPCommand } from '@acorex/platform/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { cloneDeep } from 'lodash-es';\nimport { AXPLayoutBuilderService } from './layout-builder.service';\nimport type { AXPDialogRef, IDialogBuilder, IFormFieldBuilder } from './layout-builder.types';\n\n//#endregion\n\n//#region ---- Command key & input ----\n\n/** See `AXP_PREVIEW_WIDGET_FIELD_COMMAND_KEY` in `preview-widget-field.command.key.ts`. */\n\nexport interface AXPPreviewWidgetFieldCommandInput {\n /** Widget node to render (same shape as `widget-field-configurator` model). */\n widget?: AXPWidgetNode;\n /**\n * Alternate property name for the widget node (matches metadata definition `interface` field).\n */\n interface?: AXPWidgetNode | string;\n fieldName?: string;\n fieldTitle?: AXPMultiLanguageString;\n name?: string;\n title?: AXPMultiLanguageString;\n}\n\ntype AXPPreviewWidgetFieldInvocation = AXPPreviewWidgetFieldCommandInput & {\n __context__?: { data?: Record<string, unknown>; options?: Record<string, unknown> };\n};\n\n/**\n * `customWidget` only forwards keys from its options bag into the built node via `addSingleWidget`.\n * Designer / configurator persist `defaultValue` (and other extended fields) on the widget node root;\n * spreading `options` alone drops them, so preview never applied defaults.\n */\n/**\n * Widget options are sometimes persisted with an extra nesting (`options.options`) when context\n * was merged incorrectly. Flatten so list/data-source resolution sees `dataSource` at the top level.\n */\nfunction optionsBagForPreview(node: AXPWidgetNode): Record<string, unknown> {\n const raw = (node.options ?? {}) as Record<string, unknown>;\n const inner = raw['options'];\n if (inner !== undefined && typeof inner === 'object' && !Array.isArray(inner)) {\n const { options: _nested, ...rest } = raw;\n return { ...rest, ...(inner as Record<string, unknown>) };\n }\n return { ...raw };\n}\n\nfunction extendedNodePropsForPreview(node: AXPWidgetNode): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (node.defaultValue !== undefined) {\n out['defaultValue'] = node.defaultValue;\n }\n if (node.triggers !== undefined) {\n out['triggers'] = node.triggers;\n }\n if (node.meta !== undefined) {\n out['meta'] = node.meta;\n }\n if (node.valueTransforms !== undefined) {\n out['valueTransforms'] = node.valueTransforms;\n }\n if (node.visible !== undefined) {\n out['visible'] = node.visible;\n }\n if (node.mode !== undefined) {\n out['mode'] = node.mode;\n }\n if (node.children !== undefined) {\n out['children'] = node.children;\n }\n return out;\n}\n\n//#endregion\n\n//#region ---- Command ----\n\n/**\n * Opens a dialog that previews a widget configuration (same behavior as the preview button on\n * `axp-widget-field-configurator`). Invoked from that component and from entity list actions.\n */\n@Injectable()\nexport class AXPPreviewWidgetFieldCommand implements AXPCommand<AXPPreviewWidgetFieldCommandInput, void> {\n private readonly formBuilderService = inject(AXPLayoutBuilderService);\n private readonly widgetRegistry = inject(AXPWidgetRegistryService);\n private readonly translationService = inject(AXTranslationService);\n private readonly crudService = inject(AXP_ENTITY_DEFINITION_CRUD_SERVICE, { optional: true });\n\n async execute(input: AXPPreviewWidgetFieldInvocation): Promise<AXPExecuteCommandResult<void>> {\n try {\n const merged = this.mergeInvocation(input);\n const currentWidget = this.normalizeWidget(merged['widget'] ?? merged['interface']);\n if (!currentWidget?.type) {\n return {\n success: false,\n message: {\n text: (await this.translationService.translateAsync('@general:messages.invalid-data')) || 'Invalid data',\n },\n };\n }\n\n const fieldName = String(merged['fieldName'] ?? merged['name'] ?? 'Field');\n const rawTitle = (merged['fieldTitle'] ?? merged['title']) as AXPMultiLanguageString | undefined;\n const fieldTitleLabel = this.resolveFieldTitleLabel(rawTitle, fieldName);\n\n const dialogTitle =\n (await this.resolveWidgetDisplayTitle(currentWidget.type)) || currentWidget.type || fieldTitleLabel;\n\n const previewWidgetOptions = {\n ...optionsBagForPreview(currentWidget),\n name: fieldName,\n ...extendedNodePropsForPreview(currentWidget),\n } as any;\n\n const dialogOutcome = await this.formBuilderService\n .create()\n .dialog((dialog: IDialogBuilder) => {\n dialog\n .setTitle(dialogTitle)\n .setSize('md')\n .setCloseButton(true)\n .setContext({})\n .content((layoutBuilder) => {\n layoutBuilder.formField(fieldTitleLabel, (formField: IFormFieldBuilder) => {\n formField.customWidget(currentWidget.type, previewWidgetOptions);\n });\n })\n .setActions((actions) => actions.cancel('@general:actions.close.title'));\n })\n .show();\n\n const cancelled = this.isCancelDialogOutcome(dialogOutcome);\n return {\n success: !cancelled,\n message: { text: '' },\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n success: false,\n message: { text: message },\n };\n }\n }\n\n private mergeInvocation(input: AXPPreviewWidgetFieldInvocation): Record<string, unknown> {\n const contextOptions = input.__context__?.options as Record<string, unknown> | undefined;\n const ctxData = input.__context__?.data as Record<string, unknown> | undefined;\n const { __context__: _ctx, ...rest } = input as unknown as Record<string, unknown>;\n return {\n ...(ctxData ?? {}),\n ...(contextOptions ?? {}),\n ...rest,\n };\n }\n\n private normalizeWidget(raw: unknown): AXPWidgetNode | null {\n if (raw == null) return null;\n if (typeof raw === 'string') {\n const t = raw.trim();\n return t ? { type: t, options: {} } : null;\n }\n if (typeof raw === 'object' && !Array.isArray(raw) && 'type' in raw) {\n const w = raw as AXPWidgetNode;\n return w.type ? cloneDeep(w) : null;\n }\n return null;\n }\n\n private resolveFieldTitleLabel(raw: AXPMultiLanguageString | undefined, fallback: string): string {\n let source: AXPMultiLanguageString = fallback;\n if (raw !== undefined && raw !== null) {\n if (typeof raw === 'string') {\n if (raw.trim() !== '') {\n source = raw;\n }\n } else if (typeof raw === 'object' && !Array.isArray(raw) && Object.keys(raw).length > 0) {\n source = raw;\n }\n }\n return this.translationService.resolve(source);\n }\n\n private isCancelDialogOutcome(outcome: unknown): boolean {\n if (outcome == null) {\n return false;\n }\n const ref = outcome as Partial<AXPDialogRef>;\n if (typeof ref.action !== 'function') {\n return false;\n }\n return ref.action() === 'cancel';\n }\n\n private async resolveWidgetDisplayTitle(widgetType: string): Promise<string | undefined> {\n const crud = this.crudService as AXPEntityDefinitionCrudService | null | undefined;\n if (crud) {\n const interfaces = await crud.listInterfaces();\n const iface = interfaces.find((d) => d.name === widgetType);\n return iface?.title ?? iface?.name;\n }\n const config = this.widgetRegistry.getOptional(widgetType);\n if (!config) {\n return undefined;\n }\n const resolved = this.translationService.resolve(config.title);\n return resolved || undefined;\n }\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}