@acorex/platform 18.0.14 → 18.0.16

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 (264) hide show
  1. package/core/index.d.ts +1 -0
  2. package/core/utils/data-conditioner.d.ts +6 -0
  3. package/esm2022/auth/lib/session.service.mjs +7 -5
  4. package/esm2022/common/lib/schema/widget/widget-renderer.mjs +3 -3
  5. package/esm2022/core/index.mjs +2 -1
  6. package/esm2022/core/utils/data-conditioner.mjs +138 -0
  7. package/esm2022/layout/builder/lib/builder/widget-catalog.mjs +3 -2
  8. package/esm2022/layout/builder/lib/builder/widget-registery.service.mjs +2 -2
  9. package/esm2022/layout/builder/lib/builder/widget-renderer.component.mjs +3 -3
  10. package/esm2022/layout/builder/lib/builder/widget.types.mjs +17 -10
  11. package/esm2022/layout/designer/index.mjs +2 -7
  12. package/esm2022/layout/designer/lib/{helpers → designer/components}/add-widget-button/add-widget-button.component.mjs +2 -2
  13. package/esm2022/layout/designer/lib/designer/components/board/board.component.mjs +112 -0
  14. package/esm2022/layout/designer/lib/designer/components/breadcrumbs/breadcrumbs.component.mjs +64 -0
  15. package/esm2022/layout/designer/lib/designer/components/drawers/data-sources/data-sources.component.mjs +32 -0
  16. package/esm2022/layout/designer/lib/designer/components/drawers/history/history.component.mjs +30 -0
  17. package/esm2022/layout/designer/lib/designer/components/drawers/outline/outline.component.mjs +61 -0
  18. package/esm2022/layout/designer/lib/designer/components/drawers/pages/pages.component.mjs +28 -0
  19. package/esm2022/layout/designer/lib/designer/components/grid-drawer/grid-drawer.component.mjs +82 -0
  20. package/esm2022/layout/designer/lib/designer/components/header-menu/header-menu.component.mjs +24 -0
  21. package/esm2022/layout/designer/lib/{widget-picker → designer/components/widget-picker}/widget-picker.component.mjs +1 -1
  22. package/esm2022/layout/designer/lib/designer/designer.component.mjs +28 -17
  23. package/esm2022/layout/designer/lib/designer/index.mjs +8 -0
  24. package/esm2022/layout/designer/lib/designer/shared/command.mjs +185 -0
  25. package/esm2022/layout/designer/lib/designer/shared/designer-connector.service.mjs +10 -0
  26. package/esm2022/layout/designer/lib/designer/shared/designer.service.mjs +488 -0
  27. package/esm2022/layout/designer/lib/designer/shared/designer.typs.mjs +2 -0
  28. package/esm2022/layout/designer/lib/designer/shared/drawer-content/drawer-content.component.mjs +16 -0
  29. package/esm2022/layout/designer/lib/designer/shared/widget-designer-renderer.directive.mjs +224 -0
  30. package/esm2022/layout/designer/lib/preview/preview.component.mjs +3 -3
  31. package/esm2022/layout/designer/lib/property-viewer/widget-property-viewer.component.mjs +17 -5
  32. package/esm2022/layout/entity/lib/entity-master-create.viewmodel.mjs +2 -5
  33. package/esm2022/layout/entity/lib/entity-master-list.viewmodel.mjs +15 -5
  34. package/esm2022/layout/entity/lib/entity-registery.service.mjs +3 -3
  35. package/esm2022/layout/entity/lib/widgets/lookup-widget/lookup-widget.config.mjs +2 -1
  36. package/esm2022/themes/default/index.mjs +3 -2
  37. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-detail-list-view/entity-detail-list-view.component.mjs +29 -20
  38. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-create-view/entity-master-create-view.component.mjs +19 -9
  39. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/comments/comment-list-view.component.mjs +123 -0
  40. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/comments/comments.service.mjs +3 -0
  41. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/entity-master-single-view.component.mjs +22 -23
  42. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/overview/entity-single-overview.component.mjs +68 -0
  43. package/esm2022/themes/default/lib/layouts/entity-layouts/index.mjs +2 -0
  44. package/esm2022/widgets/lib/properties/data-source.props.mjs +21 -0
  45. package/esm2022/widgets/lib/properties/editors.props.mjs +27 -90
  46. package/esm2022/widgets/lib/properties/general.props.mjs +124 -0
  47. package/esm2022/widgets/lib/properties/index.mjs +4 -1
  48. package/esm2022/widgets/lib/properties/layout.props.mjs +138 -33
  49. package/esm2022/widgets/lib/properties/table-column.props.mjs +2 -2
  50. package/esm2022/widgets/lib/widgets/actions/button/button-widget-designer.component.mjs +54 -0
  51. package/esm2022/widgets/lib/widgets/actions/button/button-widget-view.component.mjs +3 -2
  52. package/esm2022/widgets/lib/widgets/actions/button/button-widget.config.mjs +3 -2
  53. package/esm2022/widgets/lib/widgets/advance/file/file-box-widget-edit.component.mjs +13 -4
  54. package/esm2022/widgets/lib/widgets/advance/file/file-box-widget.config.mjs +4 -2
  55. package/esm2022/widgets/lib/widgets/advance/gallery/gallery-widget-edit.component.mjs +13 -4
  56. package/esm2022/widgets/lib/widgets/advance/gallery/gallery-widget.config.mjs +2 -1
  57. package/esm2022/widgets/lib/widgets/advance/map/index.mjs +1 -4
  58. package/esm2022/widgets/lib/widgets/advance/map/map-box-widget-edit.component.mjs +54 -157
  59. package/esm2022/widgets/lib/widgets/advance/map/map-box-widget-view.component.mjs +40 -53
  60. package/esm2022/widgets/lib/widgets/advance/map/map-box-widget.config.mjs +100 -11
  61. package/esm2022/widgets/lib/widgets/advance/qrcode/qrcode-widget-view.component.mjs +23 -14
  62. package/esm2022/widgets/lib/widgets/advance/qrcode/qrcode-widget.config.mjs +9 -7
  63. package/esm2022/widgets/lib/widgets/advance/signature/signature-pad-widget-edit.component.mjs +12 -3
  64. package/esm2022/widgets/lib/widgets/advance/signature/signature-pad-widget.config.mjs +5 -6
  65. package/esm2022/widgets/lib/widgets/editors/checkbox/checkbox-widget-designer.component.mjs +54 -0
  66. package/esm2022/widgets/lib/widgets/editors/checkbox/checkbox-widget-edit.component.mjs +21 -21
  67. package/esm2022/widgets/lib/widgets/editors/checkbox/checkbox-widget-view.component.mjs +4 -1
  68. package/esm2022/widgets/lib/widgets/editors/checkbox/checkbox-widget.config.mjs +14 -5
  69. package/esm2022/widgets/lib/widgets/editors/color/color-box-widget-designer.component.mjs +53 -0
  70. package/esm2022/widgets/lib/widgets/editors/color/color-box-widget-edit.component.mjs +24 -12
  71. package/esm2022/widgets/lib/widgets/editors/color/color-box-widget.config.mjs +15 -6
  72. package/esm2022/widgets/lib/widgets/editors/contact/contact-widget-edit.component.mjs +13 -4
  73. package/esm2022/widgets/lib/widgets/editors/contact/contact-widget.config.mjs +2 -1
  74. package/esm2022/widgets/lib/widgets/editors/date-time/date-time-box-widget-edit.component.mjs +13 -4
  75. package/esm2022/widgets/lib/widgets/editors/date-time/date-time-box-widget.config.mjs +5 -2
  76. package/esm2022/widgets/lib/widgets/editors/email/email-box-widget-edit.component.mjs +13 -4
  77. package/esm2022/widgets/lib/widgets/editors/email/email-box-widget.config.mjs +4 -2
  78. package/esm2022/widgets/lib/widgets/editors/large-text/large-text-widget-edit.component.mjs +13 -4
  79. package/esm2022/widgets/lib/widgets/editors/large-text/large-text-widget.config.mjs +4 -2
  80. package/esm2022/widgets/lib/widgets/editors/link/link-widget-edit.component.mjs +13 -4
  81. package/esm2022/widgets/lib/widgets/editors/link/link-widget.config.mjs +2 -1
  82. package/esm2022/widgets/lib/widgets/editors/number/number-box-widget-edit.component.mjs +14 -5
  83. package/esm2022/widgets/lib/widgets/editors/number/number-box-widget.config.mjs +4 -2
  84. package/esm2022/widgets/lib/widgets/editors/password/password-box-widget-edit.component.mjs +12 -8
  85. package/esm2022/widgets/lib/widgets/editors/password/password-box-widget.config.mjs +4 -2
  86. package/esm2022/widgets/lib/widgets/editors/phone/phone-box-widget-edit.component.mjs +13 -4
  87. package/esm2022/widgets/lib/widgets/editors/phone/phone-box-widget.config.mjs +2 -1
  88. package/esm2022/widgets/lib/widgets/editors/rich-text/rich-text-widget-edit.component.mjs +14 -5
  89. package/esm2022/widgets/lib/widgets/editors/rich-text/rich-text-widget.config.mjs +4 -2
  90. package/esm2022/widgets/lib/widgets/editors/select/select-box-widget-edit.component.mjs +25 -4
  91. package/esm2022/widgets/lib/widgets/editors/select/select-box-widget-view.component.mjs +13 -4
  92. package/esm2022/widgets/lib/widgets/editors/select/select-box-widget.config.mjs +2 -1
  93. package/esm2022/widgets/lib/widgets/editors/selection-list/index.mjs +2 -1
  94. package/esm2022/widgets/lib/widgets/editors/selection-list/selection-list-widget-designer.component.mjs +75 -0
  95. package/esm2022/widgets/lib/widgets/editors/selection-list/selection-list-widget-edit.component.mjs +25 -13
  96. package/esm2022/widgets/lib/widgets/editors/selection-list/selection-list-widget-view.component.mjs +2 -3
  97. package/esm2022/widgets/lib/widgets/editors/selection-list/selection-list-widget.config.mjs +16 -3
  98. package/esm2022/widgets/lib/widgets/editors/text/text-box-widget-edit.component.mjs +13 -4
  99. package/esm2022/widgets/lib/widgets/editors/text/text-box-widget.config.mjs +4 -2
  100. package/esm2022/widgets/lib/widgets/editors/toggle/toggle-widget-edit.component.mjs +14 -4
  101. package/esm2022/widgets/lib/widgets/editors/toggle/toggle-widget.config.mjs +4 -2
  102. package/esm2022/widgets/lib/widgets/layout/block/block-widget-designer.component.mjs +40 -17
  103. package/esm2022/widgets/lib/widgets/layout/block/block-widget-view.component.mjs +17 -3
  104. package/esm2022/widgets/lib/widgets/layout/block/block-widget.config.mjs +9 -4
  105. package/esm2022/widgets/lib/widgets/layout/document/document-widget.config.mjs +2 -2
  106. package/esm2022/widgets/lib/widgets/layout/form-field/form-field-widget-designer.component.mjs +19 -9
  107. package/esm2022/widgets/lib/widgets/layout/form-field/form-field-widget.config.mjs +4 -3
  108. package/esm2022/widgets/lib/widgets/layout/grid/grid-widget-designer.component.mjs +21 -10
  109. package/esm2022/widgets/lib/widgets/layout/grid/grid-widget.config.mjs +8 -5
  110. package/esm2022/widgets/lib/widgets/layout/grid-item/grid-item-widget-designer.component.mjs +49 -41
  111. package/esm2022/widgets/lib/widgets/layout/grid-item/grid-item-widget.config.mjs +6 -9
  112. package/esm2022/widgets/lib/widgets/layout/grid-row/grid-row-widget-designer.component.mjs +84 -0
  113. package/esm2022/widgets/lib/widgets/layout/grid-row/grid-row-widget-print.component.mjs +19 -0
  114. package/esm2022/widgets/lib/widgets/layout/grid-row/grid-row-widget-view.component.mjs +18 -0
  115. package/esm2022/widgets/lib/widgets/layout/grid-row/grid-row-widget.config.mjs +28 -0
  116. package/esm2022/widgets/lib/widgets/layout/grid-row/index.mjs +5 -0
  117. package/esm2022/widgets/lib/widgets/layout/page/page-widget-designer.component.mjs +8 -9
  118. package/esm2022/widgets/lib/widgets/layout/page/page-widget-view.component.mjs +1 -2
  119. package/esm2022/widgets/lib/widgets/layout/page/page-widget.config.mjs +8 -4
  120. package/esm2022/widgets/lib/widgets/layout/repeater/repeater-widget-designer.component.mjs +6 -6
  121. package/esm2022/widgets/lib/widgets/layout/repeater/repeater-widget.config.mjs +2 -2
  122. package/esm2022/widgets/lib/widgets/layout/text-block/text-block-widget-designer.component.mjs +38 -0
  123. package/esm2022/widgets/lib/widgets/layout/text-block/text-block-widget-view.component.mjs +3 -2
  124. package/esm2022/widgets/lib/widgets/layout/text-block/text-block-widget.config.mjs +5 -5
  125. package/esm2022/widgets/lib/widgets.module.mjs +4 -1
  126. package/fesm2022/acorex-platform-auth.mjs +6 -4
  127. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  128. package/fesm2022/acorex-platform-common.mjs +1 -1
  129. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  130. package/fesm2022/acorex-platform-core.mjs +139 -1
  131. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  132. package/fesm2022/acorex-platform-layout-builder.mjs +21 -13
  133. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  134. package/fesm2022/acorex-platform-layout-designer-preview.component-CaRHf4x_.mjs +23 -0
  135. package/fesm2022/acorex-platform-layout-designer-preview.component-CaRHf4x_.mjs.map +1 -0
  136. package/fesm2022/{acorex-platform-layout-designer-widget-picker.component-DXgcm-fP.mjs → acorex-platform-layout-designer-widget-picker.component-BZryrCyh.mjs} +4 -4
  137. package/fesm2022/acorex-platform-layout-designer-widget-picker.component-BZryrCyh.mjs.map +1 -0
  138. package/fesm2022/acorex-platform-layout-designer.mjs +496 -345
  139. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  140. package/fesm2022/acorex-platform-layout-entity.mjs +14 -6
  141. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  142. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-DKNRxpQk.mjs → acorex-platform-themes-default-entity-master-create-view.component-Q8eTfAVx.mjs} +23 -13
  143. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Q8eTfAVx.mjs.map +1 -0
  144. package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-BDk03AnX.mjs → acorex-platform-themes-default-entity-master-modify-view.component-BijYXMme.mjs} +4 -4
  145. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BijYXMme.mjs.map +1 -0
  146. package/fesm2022/acorex-platform-themes-default.mjs +226 -66
  147. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  148. package/fesm2022/acorex-platform-widgets-button-widget-designer.component-C0S_HJkl.mjs +57 -0
  149. package/fesm2022/acorex-platform-widgets-button-widget-designer.component-C0S_HJkl.mjs.map +1 -0
  150. package/fesm2022/acorex-platform-widgets-checkbox-widget-designer.component-DAGbdSTk.mjs +57 -0
  151. package/fesm2022/acorex-platform-widgets-checkbox-widget-designer.component-DAGbdSTk.mjs.map +1 -0
  152. package/fesm2022/{acorex-platform-widgets-checkbox-widget-view.component-BCsej7C6.mjs → acorex-platform-widgets-checkbox-widget-view.component-tPk6Gylo.mjs} +4 -1
  153. package/fesm2022/acorex-platform-widgets-checkbox-widget-view.component-tPk6Gylo.mjs.map +1 -0
  154. package/fesm2022/acorex-platform-widgets-color-box-widget-designer.component-Bb3aXCNZ.mjs +56 -0
  155. package/fesm2022/acorex-platform-widgets-color-box-widget-designer.component-Bb3aXCNZ.mjs.map +1 -0
  156. package/fesm2022/{acorex-platform-widgets-page-widget-designer.component-DlfG4EP1.mjs → acorex-platform-widgets-page-widget-designer.component-6BMZ0qRw.mjs} +8 -9
  157. package/fesm2022/acorex-platform-widgets-page-widget-designer.component-6BMZ0qRw.mjs.map +1 -0
  158. package/fesm2022/acorex-platform-widgets-text-block-widget-designer.component-Bi9hlpvB.mjs +41 -0
  159. package/fesm2022/acorex-platform-widgets-text-block-widget-designer.component-Bi9hlpvB.mjs.map +1 -0
  160. package/fesm2022/acorex-platform-widgets.mjs +1391 -777
  161. package/fesm2022/acorex-platform-widgets.mjs.map +1 -1
  162. package/layout/builder/lib/builder/widget.types.d.ts +20 -8
  163. package/layout/designer/index.d.ts +1 -6
  164. package/layout/designer/lib/{board → designer/components/board}/board.component.d.ts +3 -1
  165. package/layout/designer/lib/{breadcrumbs → designer/components/breadcrumbs}/breadcrumbs.component.d.ts +1 -1
  166. package/layout/designer/lib/designer/components/drawers/data-sources/data-sources.component.d.ts +12 -0
  167. package/layout/designer/lib/{history → designer/components/drawers/history}/history.component.d.ts +1 -1
  168. package/layout/designer/lib/{outline → designer/components/drawers/outline}/outline.component.d.ts +1 -1
  169. package/layout/designer/lib/{pages → designer/components/drawers/pages}/pages.component.d.ts +1 -1
  170. package/layout/designer/lib/{header-menu → designer/components/header-menu}/header-menu.component.d.ts +1 -1
  171. package/layout/designer/lib/designer/designer.component.d.ts +1 -1
  172. package/layout/designer/lib/designer/index.d.ts +7 -0
  173. package/layout/designer/lib/designer/shared/designer-connector.service.d.ts +11 -0
  174. package/layout/designer/lib/{designer.service.d.ts → designer/shared/designer.service.d.ts} +9 -12
  175. package/layout/designer/lib/designer/shared/designer.typs.d.ts +4 -0
  176. package/layout/designer/lib/designer/shared/drawer-content/drawer-content.component.d.ts +8 -0
  177. package/layout/designer/lib/{widget-designer-renderer.component.d.ts → designer/shared/widget-designer-renderer.directive.d.ts} +6 -8
  178. package/layout/designer/lib/property-viewer/widget-property-viewer.component.d.ts +8 -0
  179. package/layout/entity/lib/entity-registery.service.d.ts +1 -1
  180. package/package.json +7 -7
  181. package/themes/default/index.d.ts +2 -1
  182. package/themes/default/lib/layouts/entity-layouts/entity-detail-list-view/entity-detail-list-view.component.d.ts +7 -2
  183. package/themes/default/lib/layouts/entity-layouts/entity-master-create-view/entity-master-create-view.component.d.ts +1 -1
  184. package/themes/default/lib/layouts/entity-layouts/entity-master-single-view/comments/comment-list-view.component.d.ts +33 -0
  185. package/themes/default/lib/layouts/entity-layouts/entity-master-single-view/comments/comments.service.d.ts +11 -0
  186. package/themes/default/lib/layouts/entity-layouts/entity-master-single-view/entity-master-single-view.component.d.ts +3 -2
  187. package/themes/default/lib/layouts/entity-layouts/entity-master-single-view/overview/entity-single-overview.component.d.ts +11 -0
  188. package/themes/default/lib/layouts/entity-layouts/index.d.ts +1 -0
  189. package/widgets/lib/properties/data-source.props.d.ts +2 -0
  190. package/widgets/lib/properties/editors.props.d.ts +2 -5
  191. package/widgets/lib/properties/general.props.d.ts +7 -0
  192. package/widgets/lib/properties/index.d.ts +3 -0
  193. package/widgets/lib/properties/layout.props.d.ts +12 -3
  194. package/widgets/lib/widgets/actions/button/button-widget-designer.component.d.ts +15 -0
  195. package/widgets/lib/widgets/actions/button/button-widget-view.component.d.ts +1 -1
  196. package/widgets/lib/widgets/advance/file/file-box-widget-edit.component.d.ts +1 -0
  197. package/widgets/lib/widgets/advance/gallery/gallery-widget-edit.component.d.ts +1 -0
  198. package/widgets/lib/widgets/advance/map/index.d.ts +0 -3
  199. package/widgets/lib/widgets/advance/map/map-box-widget-edit.component.d.ts +10 -32
  200. package/widgets/lib/widgets/advance/map/map-box-widget-view.component.d.ts +6 -11
  201. package/widgets/lib/widgets/advance/qrcode/qrcode-widget-view.component.d.ts +5 -4
  202. package/widgets/lib/widgets/advance/signature/signature-pad-widget-edit.component.d.ts +1 -0
  203. package/widgets/lib/widgets/editors/checkbox/checkbox-widget-designer.component.d.ts +10 -0
  204. package/widgets/lib/widgets/editors/checkbox/checkbox-widget-edit.component.d.ts +2 -5
  205. package/widgets/lib/widgets/editors/checkbox/checkbox-widget-view.component.d.ts +3 -0
  206. package/widgets/lib/widgets/editors/color/color-box-widget-designer.component.d.ts +11 -0
  207. package/widgets/lib/widgets/editors/color/color-box-widget-edit.component.d.ts +3 -0
  208. package/widgets/lib/widgets/editors/contact/contact-widget-edit.component.d.ts +1 -0
  209. package/widgets/lib/widgets/editors/date-time/date-time-box-widget-edit.component.d.ts +1 -0
  210. package/widgets/lib/widgets/editors/email/email-box-widget-edit.component.d.ts +1 -0
  211. package/widgets/lib/widgets/editors/large-text/large-text-widget-edit.component.d.ts +1 -0
  212. package/widgets/lib/widgets/editors/link/link-widget-edit.component.d.ts +1 -0
  213. package/widgets/lib/widgets/editors/number/number-box-widget-edit.component.d.ts +1 -0
  214. package/widgets/lib/widgets/editors/password/password-box-widget-edit.component.d.ts +1 -2
  215. package/widgets/lib/widgets/editors/phone/phone-box-widget-edit.component.d.ts +1 -0
  216. package/widgets/lib/widgets/editors/rich-text/rich-text-widget-edit.component.d.ts +1 -0
  217. package/widgets/lib/widgets/editors/select/select-box-widget-edit.component.d.ts +1 -0
  218. package/widgets/lib/widgets/editors/select/select-box-widget-view.component.d.ts +1 -0
  219. package/widgets/lib/widgets/editors/selection-list/index.d.ts +1 -0
  220. package/widgets/lib/widgets/editors/selection-list/selection-list-widget-designer.component.d.ts +16 -0
  221. package/widgets/lib/widgets/editors/selection-list/selection-list-widget-edit.component.d.ts +4 -2
  222. package/widgets/lib/widgets/editors/selection-list/selection-list-widget-view.component.d.ts +1 -1
  223. package/widgets/lib/widgets/editors/text/text-box-widget-edit.component.d.ts +1 -0
  224. package/widgets/lib/widgets/editors/toggle/toggle-widget-edit.component.d.ts +2 -1
  225. package/widgets/lib/widgets/layout/block/block-widget-designer.component.d.ts +5 -1
  226. package/widgets/lib/widgets/layout/block/block-widget-view.component.d.ts +3 -0
  227. package/widgets/lib/widgets/layout/form-field/form-field-widget-designer.component.d.ts +2 -1
  228. package/widgets/lib/widgets/layout/grid/grid-widget-designer.component.d.ts +3 -2
  229. package/widgets/lib/widgets/layout/grid-item/grid-item-widget-designer.component.d.ts +6 -4
  230. package/widgets/lib/widgets/layout/grid-row/grid-row-widget-designer.component.d.ts +15 -0
  231. package/widgets/lib/widgets/layout/grid-row/grid-row-widget-print.component.d.ts +6 -0
  232. package/widgets/lib/widgets/layout/grid-row/grid-row-widget-view.component.d.ts +6 -0
  233. package/widgets/lib/widgets/layout/grid-row/grid-row-widget.config.d.ts +7 -0
  234. package/widgets/lib/widgets/layout/grid-row/index.d.ts +4 -0
  235. package/widgets/lib/widgets/layout/page/page-widget-designer.component.d.ts +3 -2
  236. package/widgets/lib/widgets/layout/text-block/text-block-widget-designer.component.d.ts +11 -0
  237. package/widgets/lib/widgets/layout/text-block/text-block-widget-view.component.d.ts +1 -1
  238. package/esm2022/layout/designer/lib/board/board.component.mjs +0 -92
  239. package/esm2022/layout/designer/lib/breadcrumbs/breadcrumbs.component.mjs +0 -64
  240. package/esm2022/layout/designer/lib/command.mjs +0 -185
  241. package/esm2022/layout/designer/lib/designer.service.mjs +0 -399
  242. package/esm2022/layout/designer/lib/header-menu/header-menu.component.mjs +0 -24
  243. package/esm2022/layout/designer/lib/helpers/grid-drawer/grid-drawer.component.mjs +0 -82
  244. package/esm2022/layout/designer/lib/history/history.component.mjs +0 -28
  245. package/esm2022/layout/designer/lib/outline/outline.component.mjs +0 -56
  246. package/esm2022/layout/designer/lib/pages/pages.component.mjs +0 -28
  247. package/esm2022/layout/designer/lib/widget-designer-renderer.component.mjs +0 -251
  248. package/esm2022/widgets/lib/widgets/advance/map/map-box-widget-column.component.mjs +0 -19
  249. package/esm2022/widgets/lib/widgets/advance/map/map-box-widget-filter.component.mjs +0 -20
  250. package/esm2022/widgets/lib/widgets/advance/map/map-box-widget-print.component.mjs +0 -19
  251. package/fesm2022/acorex-platform-layout-designer-preview.component-xkvSLydm.mjs +0 -23
  252. package/fesm2022/acorex-platform-layout-designer-preview.component-xkvSLydm.mjs.map +0 -1
  253. package/fesm2022/acorex-platform-layout-designer-widget-picker.component-DXgcm-fP.mjs.map +0 -1
  254. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-DKNRxpQk.mjs.map +0 -1
  255. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BDk03AnX.mjs.map +0 -1
  256. package/fesm2022/acorex-platform-widgets-checkbox-widget-view.component-BCsej7C6.mjs.map +0 -1
  257. package/fesm2022/acorex-platform-widgets-page-widget-designer.component-DlfG4EP1.mjs.map +0 -1
  258. package/widgets/lib/widgets/advance/map/map-box-widget-column.component.d.ts +0 -6
  259. package/widgets/lib/widgets/advance/map/map-box-widget-filter.component.d.ts +0 -6
  260. package/widgets/lib/widgets/advance/map/map-box-widget-print.component.d.ts +0 -6
  261. /package/layout/designer/lib/{helpers → designer/components}/add-widget-button/add-widget-button.component.d.ts +0 -0
  262. /package/layout/designer/lib/{helpers → designer/components}/grid-drawer/grid-drawer.component.d.ts +0 -0
  263. /package/layout/designer/lib/{widget-picker → designer/components/widget-picker}/widget-picker.component.d.ts +0 -0
  264. /package/layout/designer/lib/{command.d.ts → designer/shared/command.d.ts} +0 -0
@@ -0,0 +1,488 @@
1
+ import { AXPopupService } from '@acorex/components/popup';
2
+ import { AXPWidgetRegistryService, AXPWidgetsCatalog, } from '@acorex/platform/layout/builder';
3
+ import { computed, inject, Injectable, signal } from '@angular/core';
4
+ import { cloneDeep, get, merge, set, sortBy } from 'lodash-es';
5
+ import { Subject } from 'rxjs';
6
+ import { AddWidgetCommand, CommandManager, RemoveWidgetCommand, UpdateWidgetCommand } from './command';
7
+ import { AXFileService } from '@acorex/core/file';
8
+ import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
9
+ import * as i0 from "@angular/core";
10
+ export class AXPDesignerService {
11
+ constructor() {
12
+ this.popupService = inject(AXPopupService);
13
+ this.fileService = inject(AXFileService);
14
+ this.loadingService = inject(AXLoadingDialogService);
15
+ this.widgetRegisteryService = inject(AXPWidgetRegistryService);
16
+ this.document = signal(this.createDoc());
17
+ this.currentPageIndex = signal(0);
18
+ this.currentPage = signal(this.document().children?.[0]);
19
+ this.commandManager = inject(CommandManager);
20
+ this.clipboard = signal(null);
21
+ this.canCutCopy = computed(() => this.selectedNode() != null && this.selectedNode()?.name != 'page');
22
+ this.canPaste = computed(() => this.clipboard() != null);
23
+ this.history = computed(() => this.commandManager.history());
24
+ this.canUndo = computed(() => this.commandManager.canUndo());
25
+ this.canRedo = computed(() => this.commandManager.canRedo());
26
+ this.breadcrumbs = computed(() => {
27
+ return this.selectedNode() ? this.findBreadcrumbs(this.currentPage(), this.selectedNode()) ?? [] : [];
28
+ });
29
+ this.selectedNode = signal(null);
30
+ this._focusedNode = null;
31
+ this.focusedNode = () => this._focusedNode;
32
+ this.mode = signal('designer');
33
+ this.size = signal('xl');
34
+ this.onSelected = new Subject();
35
+ this.onRefresh = new Subject();
36
+ this.onUpdate = new Subject();
37
+ this.onFocused = new Subject();
38
+ }
39
+ register(command) {
40
+ this.select({ widget: command.widget });
41
+ }
42
+ select(command) {
43
+ this.selectedNode.set(command.widget);
44
+ this.onSelected.next(command);
45
+ }
46
+ update(command) {
47
+ const node = command.widget ?? this.selectedNode();
48
+ if (command.mode == 'update' && node) {
49
+ this.commandManager.executeCommand(new UpdateWidgetCommand(node, command.values, node));
50
+ }
51
+ this.selectedNode.update((c) => merge(node, command.values));
52
+ this.onUpdate.next({ widget: node, values: command.values });
53
+ }
54
+ focus(command) {
55
+ if (this._focusedNode != command.widget) {
56
+ this._focusedNode = command.widget;
57
+ this.onFocused.next({ widget: this._focusedNode });
58
+ }
59
+ }
60
+ refresh(command) {
61
+ this.onRefresh.next({ widget: command.widget });
62
+ }
63
+ findBreadcrumbs(node, targetNode, breadcrumb = []) {
64
+ // Add the current node to the breadcrumb path
65
+ const currentBreadcrumb = [...breadcrumb, node];
66
+ // Check if the current node is the target node
67
+ if (node === targetNode) {
68
+ return currentBreadcrumb;
69
+ }
70
+ // If the node has children, recursively search them
71
+ if (node.children) {
72
+ for (const child of node.children) {
73
+ const result = this.findBreadcrumbs(child, targetNode, currentBreadcrumb);
74
+ if (result) {
75
+ return result;
76
+ }
77
+ }
78
+ }
79
+ // Return undefined if no match is found
80
+ return undefined;
81
+ }
82
+ async showPicker(currentNode) {
83
+ const com = await import('../components/widget-picker/widget-picker.component').then((c) => c.AXPDesignerWidgetPickerComponent);
84
+ const result = await this.popupService.open(com, {
85
+ title: 'Widget Gallery',
86
+ size: 'md',
87
+ closeButton: true,
88
+ data: {
89
+ widgets: sortBy(this.widgetRegisteryService.all().filter((c) => c.visible != false), (c) => c.title),
90
+ },
91
+ });
92
+ const widgets = [];
93
+ if ((result.data?.widgets ?? []).length) {
94
+ const selected = result.data?.widgets;
95
+ selected.forEach((c) => {
96
+ widgets.push(this.addWidget(currentNode, { type: c.name }));
97
+ });
98
+ }
99
+ return widgets;
100
+ }
101
+ new() {
102
+ this.commandManager.clear();
103
+ this.document.set(this.createDoc());
104
+ this.currentPage.set(this.document().children?.[0]);
105
+ this.reRenderPage();
106
+ }
107
+ createDoc() {
108
+ const doc = {
109
+ type: AXPWidgetsCatalog.document,
110
+ children: [this.createPage()],
111
+ name: 'document',
112
+ };
113
+ set(doc, '__meta__.id', this.generateUniqueId());
114
+ return doc;
115
+ }
116
+ createPage() {
117
+ const config = this.widgetRegisteryService.resolve('page-layout');
118
+ const page = {
119
+ type: 'page-layout',
120
+ children: [],
121
+ name: 'page-layout1',
122
+ };
123
+ set(page, '__meta__.id', this.generateUniqueId());
124
+ set(page, '__meta__.config', config);
125
+ return page;
126
+ }
127
+ addNewPage() {
128
+ this.addWidget(this.document(), this.createPage());
129
+ this.goToPage(this.currentPageIndex() + 1);
130
+ }
131
+ removePage(index) {
132
+ const page = this.document().children?.[index];
133
+ this.removeWidget(page);
134
+ this.goToPage(index - 1);
135
+ }
136
+ clonePage(index) {
137
+ const page = this.document().children?.[index];
138
+ this.clone(page);
139
+ this.goToPage((this.document().children?.length ?? 1) - 1);
140
+ }
141
+ goToPage(index) {
142
+ this.currentPageIndex.set(index);
143
+ setTimeout(() => {
144
+ this.currentPage.set(this.document().children?.[this.currentPageIndex()]);
145
+ this.select({ widget: this.currentPage() });
146
+ });
147
+ }
148
+ reRenderPage() {
149
+ this.currentPage.set({ ...this.currentPage() });
150
+ setTimeout(() => {
151
+ this.refresh({ widget: this.currentPage() });
152
+ });
153
+ }
154
+ findWidgetById(root, id) {
155
+ if (get(root, '__meta__.id') === id) {
156
+ return root; // Return the root if it matches the ID
157
+ }
158
+ if (!root.children)
159
+ return null;
160
+ for (const child of root.children) {
161
+ const found = this.findWidgetById(child, id);
162
+ if (found) {
163
+ return found; // Return the found child
164
+ }
165
+ }
166
+ return null; // Node not found
167
+ }
168
+ findParent(id, parent = this.currentPage()) {
169
+ if (!parent.children)
170
+ return null;
171
+ if (parent.children.some((child) => get(child, '__meta__.id') === id)) {
172
+ return parent; // Return this node as it's the parent of the node with the given ID
173
+ }
174
+ for (const child of parent.children) {
175
+ const foundParent = this.findParent(id, child);
176
+ if (foundParent)
177
+ return foundParent;
178
+ }
179
+ return null; // No parent found
180
+ }
181
+ findNearestContainer(node, searchUpward = true) {
182
+ if (searchUpward) {
183
+ let current = node;
184
+ while (current) {
185
+ const config = this.widgetRegisteryService.resolve(current.type);
186
+ if (config && config.type == 'container') {
187
+ return current;
188
+ }
189
+ current = this.findParent(get(current, '__meta__.id')); // Use findParent to navigate upwards
190
+ }
191
+ }
192
+ else {
193
+ // Recursive search to find the first container among children
194
+ if (node.children) {
195
+ for (const child of node.children) {
196
+ const config = this.widgetRegisteryService.resolve(child.type);
197
+ if (config && config.type == 'container') {
198
+ return child;
199
+ }
200
+ const foundContainer = this.findNearestContainer(child, false); // Continue searching downwards
201
+ if (foundContainer)
202
+ return foundContainer;
203
+ }
204
+ }
205
+ }
206
+ return null; // Return null if no container found
207
+ }
208
+ addWidget(currentNode, node) {
209
+ if (!currentNode)
210
+ return null;
211
+ //
212
+ const cloned = cloneDeep(node);
213
+ const config = this.widgetRegisteryService.resolve(node.type);
214
+ //
215
+ this.commandManager.executeCommand(new AddWidgetCommand(cloned, currentNode, currentNode));
216
+ //
217
+ cloned.name = this.generateUniqueName(node.type);
218
+ set(cloned, '__meta__.id', this.generateUniqueId());
219
+ set(cloned, '__meta__.config', config);
220
+ //
221
+ this.reRenderPage();
222
+ //
223
+ this.refresh({ widget: currentNode });
224
+ this.select({ widget: cloned });
225
+ return cloned;
226
+ }
227
+ removeWidget(node) {
228
+ if (node.type === 'document-layout' || (node.type === 'page-layout' && (this.document().children?.length ?? 1) == 1)) {
229
+ console.error('Cannot remove the page node.');
230
+ return; // Prevent removing the root page node or document
231
+ }
232
+ const nodeIdToRemove = get(node, '__meta__.id');
233
+ if (!nodeIdToRemove) {
234
+ throw new Error('Node does not have a valid __meta__.id to identify it for removal.');
235
+ }
236
+ // Find the parent of the node to remove it
237
+ const parent = this.findParent(nodeIdToRemove, this.document());
238
+ if (!parent) {
239
+ throw new Error('Parent node not found. The node might be the root node or does not exist.');
240
+ }
241
+ const previousSelection = this.selectedNode(); // Capture the currently selected node before removal
242
+ const command = new RemoveWidgetCommand(node, parent, previousSelection);
243
+ this.commandManager.executeCommand(command);
244
+ this.refresh({ widget: parent }); // Refresh the UI to reflect changes
245
+ this.select({ widget: parent }); // Select the parent node after removal
246
+ }
247
+ navigateTo(index) {
248
+ this.commandManager.goToCommand(index);
249
+ this.reRenderPage();
250
+ const currentSelection = this.commandManager.selectedNode();
251
+ this.refresh({ widget: this.currentPage() });
252
+ this.select({ widget: currentSelection });
253
+ }
254
+ redo() {
255
+ this.commandManager.redo();
256
+ this.reRenderPage();
257
+ const currentSelection = this.commandManager.selectedNode();
258
+ this.refresh({ widget: this.currentPage() });
259
+ this.select({ widget: currentSelection });
260
+ }
261
+ undo() {
262
+ this.commandManager.undo();
263
+ this.reRenderPage();
264
+ const currentSelection = this.commandManager.selectedNode();
265
+ this.refresh({ widget: this.currentPage() });
266
+ this.select({ widget: currentSelection });
267
+ }
268
+ clearHistory() {
269
+ this.commandManager.clear();
270
+ }
271
+ removeMetaProp(obj) {
272
+ const nodeName = '__meta__';
273
+ // Check if the object is an array
274
+ if (Array.isArray(obj)) {
275
+ return obj.map((item) => this.removeMetaProp(item));
276
+ }
277
+ else if (typeof obj === 'object' && obj !== null) {
278
+ // Create a new object to store the result
279
+ let newObj = {};
280
+ for (let key in obj) {
281
+ // Only add the key if it's not the nodeName we want to remove
282
+ if (key !== nodeName) {
283
+ newObj[key] = this.removeMetaProp(obj[key]);
284
+ }
285
+ }
286
+ return newObj;
287
+ }
288
+ // If the value is not an object or array, return it as is
289
+ return obj;
290
+ }
291
+ async addMetaToNodes(node, processedNodes, progressCallback) {
292
+ // Apply your meta logic here
293
+ const config = this.widgetRegisteryService.resolve(node.type);
294
+ //
295
+ set(node, '__meta__.id', this.generateUniqueId());
296
+ set(node, '__meta__.config', config);
297
+ //
298
+ // Increment the processed node count and update the progress dialog
299
+ processedNodes.count++;
300
+ progressCallback(processedNodes.count);
301
+ // Recursively process child nodes using Promise.all
302
+ if (node.children && node.children.length > 0) {
303
+ node.children = await Promise.all(node.children.map(async (child) => await this.addMetaToNodes(child, processedNodes, progressCallback)));
304
+ }
305
+ return node;
306
+ }
307
+ copy(widget = this.selectedNode()) {
308
+ if (!widget)
309
+ return;
310
+ this.clipboard.set(cloneDeep(widget)); // Use lodash's cloneDeep to ensure a deep copy
311
+ }
312
+ cut(widget = this.selectedNode()) {
313
+ if (!widget)
314
+ return;
315
+ this.copy(widget); // Copy the widget to the clipboard
316
+ this.removeWidget(widget); // Reuse the removeWidget method which should handle undo internally
317
+ }
318
+ clone(widget = this.selectedNode()) {
319
+ if (!widget)
320
+ return;
321
+ this.copy(widget); // Copy the widget to the clipboard
322
+ if (widget.type == 'page-layout') {
323
+ this.paste(this.document());
324
+ }
325
+ else {
326
+ this.paste(widget);
327
+ }
328
+ }
329
+ paste(parentNode = this.selectedNode() ?? this.currentPage()) {
330
+ if (!this.clipboard() || !this.selectedNode()) {
331
+ console.error('Clipboard is empty or no node is selected.');
332
+ return;
333
+ }
334
+ const newNode = cloneDeep(this.clipboard());
335
+ const nearestContainer = this.findNearestContainer(parentNode, true);
336
+ if (!nearestContainer) {
337
+ console.error('No suitable container found.');
338
+ return;
339
+ }
340
+ //
341
+ if (!nearestContainer.children) {
342
+ nearestContainer.children = [];
343
+ }
344
+ //
345
+ const setNameId = (node) => {
346
+ set(node, 'name', this.generateUniqueName(node.type));
347
+ set(node, '__meta__.id', this.generateUniqueId());
348
+ node.children?.forEach(n => {
349
+ setNameId(n);
350
+ });
351
+ };
352
+ setNameId(newNode);
353
+ //
354
+ this.commandManager.executeCommand(new AddWidgetCommand(newNode, nearestContainer, nearestContainer));
355
+ //
356
+ setTimeout(() => {
357
+ this.refresh({ widget: nearestContainer }); // Refresh the UI
358
+ this.select({ widget: newNode }); // Select the newly pasted node
359
+ });
360
+ }
361
+ export() {
362
+ const json = this.removeMetaProp(this.document());
363
+ return JSON.stringify(json);
364
+ }
365
+ downloadJson() {
366
+ // Convert the object to a JSON string
367
+ const jsonStr = this.export();
368
+ // Create a blob object from the JSON string
369
+ const blob = new Blob([jsonStr], { type: 'application/json' });
370
+ // Create a URL for the blob object
371
+ const url = URL.createObjectURL(blob);
372
+ // Create a temporary <a> element to trigger the download
373
+ const a = document.createElement('a');
374
+ a.href = url;
375
+ a.download = 'export.json';
376
+ // Append the <a> element to the document body (necessary for some browsers)
377
+ document.body.appendChild(a);
378
+ // Trigger the download by clicking the <a> element
379
+ a.click();
380
+ // Clean up by revoking the object URL and removing the <a> element
381
+ URL.revokeObjectURL(url);
382
+ document.body.removeChild(a);
383
+ }
384
+ async importJSon() {
385
+ const files = await this.fileService.choose({ multiple: false, accept: 'application/json' });
386
+ if (files && files.length) {
387
+ const file = files[0];
388
+ const content = await file.text();
389
+ const rootNode = JSON.parse(content);
390
+ const totalNode = this.countTotalNodes(rootNode);
391
+ const processedNodes = { count: 0 };
392
+ const button = {
393
+ text: "Cancel",
394
+ autofocus: true,
395
+ color: 'primary',
396
+ onClick: (e) => {
397
+ dialog.close();
398
+ },
399
+ };
400
+ const dialog = this.loadingService.show({
401
+ mode: 'determinate',
402
+ title: "Import Json File",
403
+ progressColor: 'primary',
404
+ text: "Processing json file",
405
+ status: `0 of ${totalNode}`,
406
+ buttons: [
407
+ button
408
+ ]
409
+ });
410
+ try {
411
+ const root = await this.addMetaToNodes(rootNode, processedNodes, (count) => {
412
+ dialog.setProgressValue(Math.ceil(count / totalNode * 100));
413
+ dialog.setProgressStatus(`${count} of ${totalNode}`);
414
+ });
415
+ const page = root.children?.[0];
416
+ this.document.set(root);
417
+ this.currentPage.set(page);
418
+ dialog.setProgressColor("success");
419
+ dialog.setProgressText("Json file processed successfully");
420
+ button.text = "Okay";
421
+ button.color = "success";
422
+ dialog.setProgressValue(100);
423
+ setTimeout(() => {
424
+ this.reRenderPage();
425
+ dialog.close();
426
+ }, 1000);
427
+ }
428
+ catch (error) {
429
+ dialog.setProgressColor("danger");
430
+ dialog.setProgressText(error instanceof Error ? error.message : "Cannot process json file");
431
+ button.text = "Close";
432
+ button.color = "danger";
433
+ }
434
+ }
435
+ }
436
+ countTotalNodes(node) {
437
+ let count = 1; // Count the current node
438
+ if (node.children && node.children.length > 0) {
439
+ count += node.children.reduce((sum, child) => sum + this.countTotalNodes(child), 0);
440
+ }
441
+ return count;
442
+ }
443
+ generateUniqueName(type) {
444
+ // Normalize the type to follow camelCase convention
445
+ const baseName = type.charAt(0).toLowerCase() + type.slice(1);
446
+ let index = 1;
447
+ let uniqueName = `${baseName}${index}`;
448
+ // Gather all existing names to check against
449
+ const existingNames = new Set();
450
+ this.collectAllNames(this.document(), existingNames);
451
+ // Increment the index until a unique name is found
452
+ while (existingNames.has(uniqueName)) {
453
+ index++;
454
+ uniqueName = `${baseName}${index}`;
455
+ }
456
+ return uniqueName;
457
+ }
458
+ generateUniqueId() {
459
+ return Math.random() * Math.pow(10, 18);
460
+ }
461
+ collectAllNames(node, names) {
462
+ if (node.name) {
463
+ names.add(node.name);
464
+ }
465
+ if (node.children) {
466
+ for (const child of node.children) {
467
+ this.collectAllNames(child, names);
468
+ }
469
+ }
470
+ }
471
+ async openPreview() {
472
+ const com = await import('../../preview/preview.component').then((c) => c.AXPLayoutDesignerPreviewComponent);
473
+ await this.popupService.open(com, {
474
+ header: false,
475
+ size: 'full',
476
+ closeButton: true,
477
+ data: {
478
+ widgets: sortBy(this.widgetRegisteryService.all().filter((c) => c.visible != false), (c) => c.title),
479
+ },
480
+ });
481
+ }
482
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
483
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerService }); }
484
+ }
485
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerService, decorators: [{
486
+ type: Injectable
487
+ }] });
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2Rlc2lnbmVyL3NyYy9saWIvZGVzaWduZXIvc2hhcmVkL2Rlc2lnbmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFJTCx3QkFBd0IsRUFFeEIsaUJBQWlCLEdBQ2xCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBNkIsc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFvRHRHLE1BQU0sT0FBTyxrQkFBa0I7SUFEL0I7UUFFVSxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0QyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwQyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hELDJCQUFzQixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRWxELGFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMs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TUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUM3RyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNoQyxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxNQUFNO1lBQ1osV0FBVyxFQUFFLElBQUk7WUFDakIsSUFBSSxFQUFFO2dCQUNKLE9BQU8sRUFBRSxNQUFNLENBQ2IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsRUFDbkUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ2Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBbGlCVSxrQkFBa0I7a0hBQWxCLGtCQUFrQjs7MkZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYUG9wdXBTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3BvcHVwJztcbmltcG9ydCB7XG4gIEFYUFdpZGdldENvbXBvbmVudCxcbiAgQVhQV2lkZ2V0Q29uZmlnLFxuICBBWFBXaWRnZXROb2RlLFxuICBBWFBXaWRnZXRSZWdpc3RyeVNlcnZpY2UsXG4gIEFYUFdpZGdldFJlbmRlck1vZGUsXG4gIEFYUFdpZGdldHNDYXRhbG9nLFxufSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9idWlsZGVyJztcbmltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIG1lcmdlLCBzZXQsIHNvcnRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBZGRXaWRnZXRDb21tYW5kLCBDb21tYW5kTWFuYWdlciwgUmVtb3ZlV2lkZ2V0Q29tbWFuZCwgVXBkYXRlV2lkZ2V0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZCc7XG5pbXBvcnQgeyBBWEZpbGVTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9jb3JlL2ZpbGUnO1xuaW1wb3J0IHsgQVhMb2FkaW5nRGlhbG9nQnV0dG9uSXRlbSwgQVhMb2FkaW5nRGlhbG9nU2VydmljZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9sb2FkaW5nLWRpYWxvZyc7XG5cbmV4cG9ydCB0eXBlIEFYUERlc2lnbmVyUHJldmlld1NpemUgPSAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnIHwgJ3h4bCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJGb2N1c0NvbW1hbmQge1xuICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyVXBkYXRlQ29tbWFuZCB7XG4gIHZhbHVlczogYW55O1xuICB3aWRnZXQ/OiBBWFBXaWRnZXROb2RlIHwgbnVsbDtcbiAgbW9kZTogJ2luaXQnIHwgJ3VwZGF0ZSc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyVXBkYXRlRXZlbnQge1xuICB2YWx1ZXM6IGFueTtcbiAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyU2VsZWN0Q29tbWFuZCB7XG4gIHdpZGdldDogQVhQV2lkZ2V0Tm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lclJlZ2lzdGVyQ29tbWFuZCB7XG4gIGlkOiBudW1iZXI7XG4gIHdpZGdldDogQVhQV2lkZ2V0Tm9kZTtcbiAgY29uZmlnOiBBWFBXaWRnZXRDb25maWc7XG4gIGluc3RhbmNlOiBBWFBXaWRnZXRDb21wb25lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJTZWxlY3RFdmVudCB7XG4gIHdpZGdldDogQVhQV2lkZ2V0Tm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lclJlZnJlc2hDb21tYW5kIHtcbiAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlO1xufVxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lclJlZnJlc2hFdmVudCB7XG4gIHdpZGdldDogQVhQV2lkZ2V0Tm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lckFkZE5vZGVDb21tYW5kIHtcbiAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlO1xufVxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lckFkZE5vZGVFdmVudCB7XG4gIHdpZGdldDogQVhQV2lkZ2V0Tm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lckZvY3VzRXZlbnQge1xuICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQVhQRGVzaWduZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBwb3B1cFNlcnZpY2UgPSBpbmplY3QoQVhQb3B1cFNlcnZpY2UpO1xuICBwcml2YXRlIGZpbGVTZXJ2aWNlID0gaW5qZWN0KEFYRmlsZVNlcnZpY2UpO1xuICBwcml2YXRlIGxvYWRpbmdTZXJ2aWNlID0gaW5qZWN0KEFYTG9hZGluZ0RpYWxvZ1NlcnZpY2UpO1xuICBwcml2YXRlIHdpZGdldFJlZ2lzdGVyeVNlcnZpY2UgPSBpbmplY3QoQVhQV2lkZ2V0UmVnaXN0cnlTZXJ2aWNlKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnQgPSBzaWduYWwodGhpcy5jcmVhdGVEb2MoKSk7XG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW50UGFnZUluZGV4ID0gc2lnbmFsKDApO1xuXG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW50UGFnZSA9IHNpZ25hbCh0aGlzLmRvY3VtZW50KCkuY2hpbGRyZW4/LlswXSEpO1xuXG4gIHByaXZhdGUgY29tbWFuZE1hbmFnZXIgPSBpbmplY3QoQ29tbWFuZE1hbmFnZXIpO1xuXG4gIHByaXZhdGUgY2xpcGJvYXJkID0gc2lnbmFsPEFYUFdpZGdldE5vZGUgfCBudWxsPihudWxsKTtcbiAgcHVibGljIGNhbkN1dENvcHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlbGVjdGVkTm9kZSgpICE9IG51bGwgJiYgdGhpcy5zZWxlY3RlZE5vZGUoKT8ubmFtZSAhPSAncGFnZScpO1xuICBwdWJsaWMgY2FuUGFzdGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNsaXBib2FyZCgpICE9IG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBoaXN0b3J5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21tYW5kTWFuYWdlci5oaXN0b3J5KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuVW5kbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tbWFuZE1hbmFnZXIuY2FuVW5kbygpKTtcbiAgcHVibGljIHJlYWRvbmx5IGNhblJlZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbW1hbmRNYW5hZ2VyLmNhblJlZG8oKSk7XG5cbiAgcHVibGljIGJyZWFkY3J1bWJzID0gY29tcHV0ZWQ8QVhQV2lkZ2V0Tm9kZVtdPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlKCkgPyB0aGlzLmZpbmRCcmVhZGNydW1icyh0aGlzLmN1cnJlbnRQYWdlKCksIHRoaXMuc2VsZWN0ZWROb2RlKCkhKSA/PyBbXSA6IFtdO1xuICB9KTtcblxuICBwdWJsaWMgc2VsZWN0ZWROb2RlID0gc2lnbmFsPEFYUFdpZGdldE5vZGUgfCBudWxsPihudWxsKTtcblxuICBwcml2YXRlIF9mb2N1c2VkTm9kZTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgZm9jdXNlZE5vZGUgPSAoKSA9PiB0aGlzLl9mb2N1c2VkTm9kZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbW9kZSA9IHNpZ25hbDxBWFBXaWRnZXRSZW5kZXJNb2RlPignZGVzaWduZXInKTtcbiAgcHVibGljIHJlYWRvbmx5IHNpemUgPSBzaWduYWw8QVhQRGVzaWduZXJQcmV2aWV3U2l6ZT4oJ3hsJyk7XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxBWFBEZXNpZ25lclNlbGVjdEV2ZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZWZyZXNoID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJSZWZyZXNoRXZlbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvblVwZGF0ZSA9IG5ldyBTdWJqZWN0PEFYUERlc2lnbmVyVXBkYXRlRXZlbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvbkZvY3VzZWQgPSBuZXcgU3ViamVjdDxBWFBEZXNpZ25lckZvY3VzRXZlbnQ+KCk7XG5cbiAgcHVibGljIHJlZ2lzdGVyKGNvbW1hbmQ6IEFYUERlc2lnbmVyUmVnaXN0ZXJDb21tYW5kKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3QoeyB3aWRnZXQ6IGNvbW1hbmQud2lkZ2V0IH0pO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdChjb21tYW5kOiBBWFBEZXNpZ25lclNlbGVjdENvbW1hbmQpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTm9kZS5zZXQoY29tbWFuZC53aWRnZXQpO1xuICAgIHRoaXMub25TZWxlY3RlZC5uZXh0KGNvbW1hbmQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZShjb21tYW5kOiBBWFBEZXNpZ25lclVwZGF0ZUNvbW1hbmQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gY29tbWFuZC53aWRnZXQgPz8gdGhpcy5zZWxlY3RlZE5vZGUoKTtcblxuICAgIGlmIChjb21tYW5kLm1vZGUgPT0gJ3VwZGF0ZScgJiYgbm9kZSkge1xuICAgICAgdGhpcy5jb21tYW5kTWFuYWdlci5leGVjdXRlQ29tbWFuZChuZXcgVXBkYXRlV2lkZ2V0Q29tbWFuZChub2RlISwgY29tbWFuZC52YWx1ZXMsIG5vZGUhKSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWROb2RlLnVwZGF0ZSgoYykgPT4gbWVyZ2Uobm9kZSwgY29tbWFuZC52YWx1ZXMpKTtcbiAgICB0aGlzLm9uVXBkYXRlLm5leHQoeyB3aWRnZXQ6IG5vZGUhLCB2YWx1ZXM6IGNvbW1hbmQudmFsdWVzIH0pO1xuICB9XG5cbiAgcHVibGljIGZvY3VzKGNvbW1hbmQ6IEFYUERlc2lnbmVyRm9jdXNDb21tYW5kKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2ZvY3VzZWROb2RlICE9IGNvbW1hbmQud2lkZ2V0KSB7XG4gICAgICB0aGlzLl9mb2N1c2VkTm9kZSA9IGNvbW1hbmQud2lkZ2V0O1xuICAgICAgdGhpcy5vbkZvY3VzZWQubmV4dCh7IHdpZGdldDogdGhpcy5fZm9jdXNlZE5vZGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZnJlc2goY29tbWFuZDogQVhQRGVzaWduZXJSZWZyZXNoQ29tbWFuZCkge1xuICAgIHRoaXMub25SZWZyZXNoLm5leHQoeyB3aWRnZXQ6IGNvbW1hbmQud2lkZ2V0IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQnJlYWRjcnVtYnMobm9kZTogQVhQV2lkZ2V0Tm9kZSwgdGFyZ2V0Tm9kZTogQVhQV2lkZ2V0Tm9kZSwgYnJlYWRjcnVtYjogQVhQV2lkZ2V0Tm9kZVtdID0gW10pOiBBWFBXaWRnZXROb2RlW10gfCB1bmRlZmluZWQge1xuICAgIC8vIEFkZCB0aGUgY3VycmVudCBub2RlIHRvIHRoZSBicmVhZGNydW1iIHBhdGhcbiAgICBjb25zdCBjdXJyZW50QnJlYWRjcnVtYiA9IFsuLi5icmVhZGNydW1iLCBub2RlXTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdGhlIHRhcmdldCBub2RlXG4gICAgaWYgKG5vZGUgPT09IHRhcmdldE5vZGUpIHtcbiAgICAgIHJldHVybiBjdXJyZW50QnJlYWRjcnVtYjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBoYXMgY2hpbGRyZW4sIHJlY3Vyc2l2ZWx5IHNlYXJjaCB0aGVtXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRCcmVhZGNydW1icyhjaGlsZCwgdGFyZ2V0Tm9kZSwgY3VycmVudEJyZWFkY3J1bWIpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgc2hvd1BpY2tlcihjdXJyZW50Tm9kZTogQVhQV2lkZ2V0Tm9kZSk6IFByb21pc2U8QVhQV2lkZ2V0Tm9kZVtdPiB7XG4gICAgY29uc3QgY29tID0gYXdhaXQgaW1wb3J0KCcuLi9jb21wb25lbnRzL3dpZGdldC1waWNrZXIvd2lkZ2V0LXBpY2tlci5jb21wb25lbnQnKS50aGVuKChjKSA9PiBjLkFYUERlc2lnbmVyV2lkZ2V0UGlja2VyQ29tcG9uZW50KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBvcHVwU2VydmljZS5vcGVuKGNvbSwge1xuICAgICAgdGl0bGU6ICdXaWRnZXQgR2FsbGVyeScsXG4gICAgICBzaXplOiAnbWQnLFxuICAgICAgY2xvc2VCdXR0b246IHRydWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHdpZGdldHM6IHNvcnRCeShcbiAgICAgICAgICB0aGlzLndpZGdldFJlZ2lzdGVyeVNlcnZpY2UuYWxsKCkuZmlsdGVyKChjKSA9PiBjLnZpc2libGUgIT0gZmFsc2UpLFxuICAgICAgICAgIChjKSA9PiBjLnRpdGxlXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IHdpZGdldHM6IEFYUFdpZGdldE5vZGVbXSA9IFtdO1xuICAgIGlmICgocmVzdWx0LmRhdGE/LndpZGdldHMgPz8gW10pLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZGF0YT8ud2lkZ2V0cyBhcyBBWFBXaWRnZXRDb25maWdbXTtcbiAgICAgIHNlbGVjdGVkLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgd2lkZ2V0cy5wdXNoKHRoaXMuYWRkV2lkZ2V0KGN1cnJlbnROb2RlLCB7IHR5cGU6IGMubmFtZSB9KSEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB3aWRnZXRzO1xuICB9XG5cbiAgcHVibGljIG5ldygpIHtcbiAgICB0aGlzLmNvbW1hbmRNYW5hZ2VyLmNsZWFyKCk7XG4gICAgdGhpcy5kb2N1bWVudC5zZXQodGhpcy5jcmVhdGVEb2MoKSk7XG4gICAgdGhpcy5jdXJyZW50UGFnZS5zZXQodGhpcy5kb2N1bWVudCgpLmNoaWxkcmVuPy5bMF0hKTtcbiAgICB0aGlzLnJlUmVuZGVyUGFnZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2MoKTogQVhQV2lkZ2V0Tm9kZSB7XG4gICAgY29uc3QgZG9jOiBBWFBXaWRnZXROb2RlID0ge1xuICAgICAgdHlwZTogQVhQV2lkZ2V0c0NhdGFsb2cuZG9jdW1lbnQsXG4gICAgICBjaGlsZHJlbjogW3RoaXMuY3JlYXRlUGFnZSgpXSxcbiAgICAgIG5hbWU6ICdkb2N1bWVudCcsXG4gICAgfTtcbiAgICBzZXQoZG9jLCAnX19tZXRhX18uaWQnLCB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoKSk7XG4gICAgcmV0dXJuIGRvYztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGFnZSgpOiBBWFBXaWRnZXROb2RlIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLndpZGdldFJlZ2lzdGVyeVNlcnZpY2UucmVzb2x2ZSgncGFnZS1sYXlvdXQnKTtcblxuICAgIGNvbnN0IHBhZ2U6IEFYUFdpZGdldE5vZGUgPSB7XG4gICAgICB0eXBlOiAncGFnZS1sYXlvdXQnLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgbmFtZTogJ3BhZ2UtbGF5b3V0MScsXG4gICAgfTtcblxuICAgIHNldChwYWdlLCAnX19tZXRhX18uaWQnLCB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoKSk7XG4gICAgc2V0KHBhZ2UsICdfX21ldGFfXy5jb25maWcnLCBjb25maWcpO1xuICAgIHJldHVybiBwYWdlO1xuICB9XG5cblxuXG4gIHB1YmxpYyBhZGROZXdQYWdlKCkge1xuICAgIHRoaXMuYWRkV2lkZ2V0KHRoaXMuZG9jdW1lbnQoKSwgdGhpcy5jcmVhdGVQYWdlKCkpO1xuICAgIHRoaXMuZ29Ub1BhZ2UodGhpcy5jdXJyZW50UGFnZUluZGV4KCkgKyAxKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVQYWdlKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5kb2N1bWVudCgpLmNoaWxkcmVuPy5baW5kZXhdITtcbiAgICB0aGlzLnJlbW92ZVdpZGdldChwYWdlKTtcbiAgICB0aGlzLmdvVG9QYWdlKGluZGV4IC0gMSk7XG4gIH1cblxuICBwdWJsaWMgY2xvbmVQYWdlKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5kb2N1bWVudCgpLmNoaWxkcmVuPy5baW5kZXhdITtcbiAgICB0aGlzLmNsb25lKHBhZ2UpO1xuICAgIHRoaXMuZ29Ub1BhZ2UoKHRoaXMuZG9jdW1lbnQoKS5jaGlsZHJlbj8ubGVuZ3RoID8/IDEpIC0gMSk7XG4gIH1cblxuICBwdWJsaWMgZ29Ub1BhZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleC5zZXQoaW5kZXgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5zZXQodGhpcy5kb2N1bWVudCgpLmNoaWxkcmVuPy5bdGhpcy5jdXJyZW50UGFnZUluZGV4KCldISk7XG4gICAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogdGhpcy5jdXJyZW50UGFnZSgpIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZVJlbmRlclBhZ2UoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZS5zZXQoeyAuLi50aGlzLmN1cnJlbnRQYWdlKCkgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2goeyB3aWRnZXQ6IHRoaXMuY3VycmVudFBhZ2UoKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kV2lkZ2V0QnlJZChyb290OiBBWFBXaWRnZXROb2RlLCBpZDogc3RyaW5nKTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwge1xuICAgIGlmIChnZXQocm9vdCwgJ19fbWV0YV9fLmlkJykgPT09IGlkKSB7XG4gICAgICByZXR1cm4gcm9vdDsgLy8gUmV0dXJuIHRoZSByb290IGlmIGl0IG1hdGNoZXMgdGhlIElEXG4gICAgfVxuICAgIGlmICghcm9vdC5jaGlsZHJlbikgcmV0dXJuIG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3QuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kV2lkZ2V0QnlJZChjaGlsZCwgaWQpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIHJldHVybiBmb3VuZDsgLy8gUmV0dXJuIHRoZSBmb3VuZCBjaGlsZFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsOyAvLyBOb2RlIG5vdCBmb3VuZFxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyZW50KGlkOiBzdHJpbmcsIHBhcmVudDogQVhQV2lkZ2V0Tm9kZSA9IHRoaXMuY3VycmVudFBhZ2UoKSk6IEFYUFdpZGdldE5vZGUgfCBudWxsIHtcbiAgICBpZiAoIXBhcmVudC5jaGlsZHJlbikgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAocGFyZW50LmNoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBnZXQoY2hpbGQsICdfX21ldGFfXy5pZCcpID09PSBpZCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7IC8vIFJldHVybiB0aGlzIG5vZGUgYXMgaXQncyB0aGUgcGFyZW50IG9mIHRoZSBub2RlIHdpdGggdGhlIGdpdmVuIElEXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBwYXJlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kUGFyZW50ID0gdGhpcy5maW5kUGFyZW50KGlkLCBjaGlsZCk7XG4gICAgICBpZiAoZm91bmRQYXJlbnQpIHJldHVybiBmb3VuZFBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDsgLy8gTm8gcGFyZW50IGZvdW5kXG4gIH1cblxuICBwcml2YXRlIGZpbmROZWFyZXN0Q29udGFpbmVyKG5vZGU6IEFYUFdpZGdldE5vZGUsIHNlYXJjaFVwd2FyZDogYm9vbGVhbiA9IHRydWUpOiBBWFBXaWRnZXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKHNlYXJjaFVwd2FyZCkge1xuICAgICAgbGV0IGN1cnJlbnQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gbm9kZTtcbiAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMud2lkZ2V0UmVnaXN0ZXJ5U2VydmljZS5yZXNvbHZlKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnR5cGUgPT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gdGhpcy5maW5kUGFyZW50KGdldChjdXJyZW50LCAnX19tZXRhX18uaWQnKSEpOyAvLyBVc2UgZmluZFBhcmVudCB0byBuYXZpZ2F0ZSB1cHdhcmRzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZSBzZWFyY2ggdG8gZmluZCB0aGUgZmlyc3QgY29udGFpbmVyIGFtb25nIGNoaWxkcmVuXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLndpZGdldFJlZ2lzdGVyeVNlcnZpY2UucmVzb2x2ZShjaGlsZC50eXBlKTtcbiAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy50eXBlID09ICdjb250YWluZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGFpbmVyID0gdGhpcy5maW5kTmVhcmVzdENvbnRhaW5lcihjaGlsZCwgZmFsc2UpOyAvLyBDb250aW51ZSBzZWFyY2hpbmcgZG93bndhcmRzXG4gICAgICAgICAgaWYgKGZvdW5kQ29udGFpbmVyKSByZXR1cm4gZm91bmRDb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7IC8vIFJldHVybiBudWxsIGlmIG5vIGNvbnRhaW5lciBmb3VuZFxuICB9XG5cbiAgYWRkV2lkZ2V0KGN1cnJlbnROb2RlOiBBWFBXaWRnZXROb2RlLCBub2RlOiBBWFBXaWRnZXROb2RlKTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwge1xuICAgIGlmICghY3VycmVudE5vZGUpIHJldHVybiBudWxsO1xuICAgIC8vXG4gICAgY29uc3QgY2xvbmVkID0gY2xvbmVEZWVwKG5vZGUpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMud2lkZ2V0UmVnaXN0ZXJ5U2VydmljZS5yZXNvbHZlKG5vZGUudHlwZSk7XG5cbiAgICAvL1xuICAgIHRoaXMuY29tbWFuZE1hbmFnZXIuZXhlY3V0ZUNvbW1hbmQobmV3IEFkZFdpZGdldENvbW1hbmQoY2xvbmVkLCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUpKTtcbiAgICAvL1xuICAgIGNsb25lZC5uYW1lID0gdGhpcy5nZW5lcmF0ZVVuaXF1ZU5hbWUobm9kZS50eXBlKTtcbiAgICBzZXQoY2xvbmVkLCAnX19tZXRhX18uaWQnLCB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoKSk7XG4gICAgc2V0KGNsb25lZCwgJ19fbWV0YV9fLmNvbmZpZycsIGNvbmZpZyk7XG4gICAgLy9cbiAgICB0aGlzLnJlUmVuZGVyUGFnZSgpO1xuICAgIC8vXG4gICAgdGhpcy5yZWZyZXNoKHsgd2lkZ2V0OiBjdXJyZW50Tm9kZSB9KTtcbiAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogY2xvbmVkIH0pO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlV2lkZ2V0KG5vZGU6IEFYUFdpZGdldE5vZGUpOiB2b2lkIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnZG9jdW1lbnQtbGF5b3V0JyB8fCAobm9kZS50eXBlID09PSAncGFnZS1sYXlvdXQnICYmICh0aGlzLmRvY3VtZW50KCkuY2hpbGRyZW4/Lmxlbmd0aCA/PyAxKSA9PSAxKSkge1xuICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJlbW92ZSB0aGUgcGFnZSBub2RlLicpO1xuICAgICAgcmV0dXJuOyAvLyBQcmV2ZW50IHJlbW92aW5nIHRoZSByb290IHBhZ2Ugbm9kZSBvciBkb2N1bWVudFxuICAgIH1cblxuICAgIGNvbnN0IG5vZGVJZFRvUmVtb3ZlID0gZ2V0KG5vZGUsICdfX21ldGFfXy5pZCcpO1xuICAgIGlmICghbm9kZUlkVG9SZW1vdmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm9kZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgX19tZXRhX18uaWQgdG8gaWRlbnRpZnkgaXQgZm9yIHJlbW92YWwuJyk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGFyZW50IG9mIHRoZSBub2RlIHRvIHJlbW92ZSBpdFxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZmluZFBhcmVudChub2RlSWRUb1JlbW92ZSwgdGhpcy5kb2N1bWVudCgpKTtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgbm9kZSBub3QgZm91bmQuIFRoZSBub2RlIG1pZ2h0IGJlIHRoZSByb290IG5vZGUgb3IgZG9lcyBub3QgZXhpc3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkTm9kZSgpOyAvLyBDYXB0dXJlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBiZWZvcmUgcmVtb3ZhbFxuICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgUmVtb3ZlV2lkZ2V0Q29tbWFuZChub2RlLCBwYXJlbnQsIHByZXZpb3VzU2VsZWN0aW9uISk7XG4gICAgdGhpcy5jb21tYW5kTWFuYWdlci5leGVjdXRlQ29tbWFuZChjb21tYW5kKTtcblxuICAgIHRoaXMucmVmcmVzaCh7IHdpZGdldDogcGFyZW50IH0pOyAvLyBSZWZyZXNoIHRoZSBVSSB0byByZWZsZWN0IGNoYW5nZXNcbiAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogcGFyZW50IH0pOyAvLyBTZWxlY3QgdGhlIHBhcmVudCBub2RlIGFmdGVyIHJlbW92YWxcbiAgfVxuXG4gIG5hdmlnYXRlVG8oaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuY29tbWFuZE1hbmFnZXIuZ29Ub0NvbW1hbmQoaW5kZXgpO1xuICAgIHRoaXMucmVSZW5kZXJQYWdlKCk7XG4gICAgY29uc3QgY3VycmVudFNlbGVjdGlvbiA9IHRoaXMuY29tbWFuZE1hbmFnZXIuc2VsZWN0ZWROb2RlKCk7XG4gICAgdGhpcy5yZWZyZXNoKHsgd2lkZ2V0OiB0aGlzLmN1cnJlbnRQYWdlKCkgfSk7XG4gICAgdGhpcy5zZWxlY3QoeyB3aWRnZXQ6IGN1cnJlbnRTZWxlY3Rpb24hIH0pO1xuICB9XG5cbiAgcHVibGljIHJlZG8oKSB7XG4gICAgdGhpcy5jb21tYW5kTWFuYWdlci5yZWRvKCk7XG4gICAgdGhpcy5yZVJlbmRlclBhZ2UoKTtcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gdGhpcy5jb21tYW5kTWFuYWdlci5zZWxlY3RlZE5vZGUoKTtcbiAgICB0aGlzLnJlZnJlc2goeyB3aWRnZXQ6IHRoaXMuY3VycmVudFBhZ2UoKSB9KTtcbiAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogY3VycmVudFNlbGVjdGlvbiEgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5kbygpIHtcbiAgICB0aGlzLmNvbW1hbmRNYW5hZ2VyLnVuZG8oKTtcbiAgICB0aGlzLnJlUmVuZGVyUGFnZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb24gPSB0aGlzLmNvbW1hbmRNYW5hZ2VyLnNlbGVjdGVkTm9kZSgpO1xuICAgIHRoaXMucmVmcmVzaCh7IHdpZGdldDogdGhpcy5jdXJyZW50UGFnZSgpIH0pO1xuICAgIHRoaXMuc2VsZWN0KHsgd2lkZ2V0OiBjdXJyZW50U2VsZWN0aW9uISB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckhpc3RvcnkoKSB7XG4gICAgdGhpcy5jb21tYW5kTWFuYWdlci5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNZXRhUHJvcChvYmo6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgbm9kZU5hbWUgPSAnX19tZXRhX18nO1xuICAgIC8vIENoZWNrIGlmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICByZXR1cm4gb2JqLm1hcCgoaXRlbSkgPT4gdGhpcy5yZW1vdmVNZXRhUHJvcChpdGVtKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3QgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICAgICAgbGV0IG5ld09iajogYW55ID0ge307XG4gICAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIC8vIE9ubHkgYWRkIHRoZSBrZXkgaWYgaXQncyBub3QgdGhlIG5vZGVOYW1lIHdlIHdhbnQgdG8gcmVtb3ZlXG4gICAgICAgIGlmIChrZXkgIT09IG5vZGVOYW1lKSB7XG4gICAgICAgICAgbmV3T2JqW2tleV0gPSB0aGlzLnJlbW92ZU1ldGFQcm9wKG9ialtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld09iajtcbiAgICB9XG4gICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBhbiBvYmplY3Qgb3IgYXJyYXksIHJldHVybiBpdCBhcyBpc1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZE1ldGFUb05vZGVzKG5vZGU6IEFYUFdpZGdldE5vZGUsIHByb2Nlc3NlZE5vZGVzOiB7IGNvdW50OiBudW1iZXIgfSwgcHJvZ3Jlc3NDYWxsYmFjazogKHByb2Nlc3NlZDogbnVtYmVyKSA9PiB2b2lkKTogUHJvbWlzZTxBWFBXaWRnZXROb2RlPiB7XG4gICAgLy8gQXBwbHkgeW91ciBtZXRhIGxvZ2ljIGhlcmVcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLndpZGdldFJlZ2lzdGVyeVNlcnZpY2UucmVzb2x2ZShub2RlLnR5cGUpO1xuICAgIC8vXG4gICAgc2V0KG5vZGUsICdfX21ldGFfXy5pZCcsIHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgpKTtcbiAgICBzZXQobm9kZSwgJ19fbWV0YV9fLmNvbmZpZycsIGNvbmZpZyk7XG4gICAgLy9cbiAgICAvLyBJbmNyZW1lbnQgdGhlIHByb2Nlc3NlZCBub2RlIGNvdW50IGFuZCB1cGRhdGUgdGhlIHByb2dyZXNzIGRpYWxvZ1xuICAgIHByb2Nlc3NlZE5vZGVzLmNvdW50Kys7XG4gICAgcHJvZ3Jlc3NDYWxsYmFjayhwcm9jZXNzZWROb2Rlcy5jb3VudCk7XG4gICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBjaGlsZCBub2RlcyB1c2luZyBQcm9taXNlLmFsbFxuICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBub2RlLmNoaWxkcmVuLm1hcChhc3luYyBjaGlsZCA9PiBhd2FpdCB0aGlzLmFkZE1ldGFUb05vZGVzKGNoaWxkLCBwcm9jZXNzZWROb2RlcywgcHJvZ3Jlc3NDYWxsYmFjaykpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHB1YmxpYyBjb3B5KHdpZGdldDogQVhQV2lkZ2V0Tm9kZSB8IG51bGwgPSB0aGlzLnNlbGVjdGVkTm9kZSgpKTogdm9pZCB7XG4gICAgaWYgKCF3aWRnZXQpIHJldHVybjtcbiAgICB0aGlzLmNsaXBib2FyZC5zZXQoY2xvbmVEZWVwKHdpZGdldCkpOyAvLyBVc2UgbG9kYXNoJ3MgY2xvbmVEZWVwIHRvIGVuc3VyZSBhIGRlZXAgY29weVxuICB9XG5cbiAgcHVibGljIGN1dCh3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gdGhpcy5zZWxlY3RlZE5vZGUoKSk6IHZvaWQge1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG4gICAgdGhpcy5jb3B5KHdpZGdldCk7IC8vIENvcHkgdGhlIHdpZGdldCB0byB0aGUgY2xpcGJvYXJkXG4gICAgdGhpcy5yZW1vdmVXaWRnZXQod2lkZ2V0KTsgLy8gUmV1c2UgdGhlIHJlbW92ZVdpZGdldCBtZXRob2Qgd2hpY2ggc2hvdWxkIGhhbmRsZSB1bmRvIGludGVybmFsbHlcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSh3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gdGhpcy5zZWxlY3RlZE5vZGUoKSk6IHZvaWQge1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG4gICAgdGhpcy5jb3B5KHdpZGdldCk7IC8vIENvcHkgdGhlIHdpZGdldCB0byB0aGUgY2xpcGJvYXJkXG4gICAgaWYgKHdpZGdldC50eXBlID09ICdwYWdlLWxheW91dCcpIHtcbiAgICAgIHRoaXMucGFzdGUodGhpcy5kb2N1bWVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXN0ZSh3aWRnZXQhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFzdGUocGFyZW50Tm9kZTogQVhQV2lkZ2V0Tm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlKCkgPz8gdGhpcy5jdXJyZW50UGFnZSgpKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaXBib2FyZCgpIHx8ICF0aGlzLnNlbGVjdGVkTm9kZSgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDbGlwYm9hcmQgaXMgZW1wdHkgb3Igbm8gbm9kZSBpcyBzZWxlY3RlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3Tm9kZSA9IGNsb25lRGVlcCh0aGlzLmNsaXBib2FyZCgpKSE7XG4gICAgY29uc3QgbmVhcmVzdENvbnRhaW5lciA9IHRoaXMuZmluZE5lYXJlc3RDb250YWluZXIocGFyZW50Tm9kZSwgdHJ1ZSk7XG4gICAgaWYgKCFuZWFyZXN0Q29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBzdWl0YWJsZSBjb250YWluZXIgZm91bmQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vXG4gICAgaWYgKCFuZWFyZXN0Q29udGFpbmVyLmNoaWxkcmVuKSB7XG4gICAgICBuZWFyZXN0Q29udGFpbmVyLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIC8vXG4gICAgY29uc3Qgc2V0TmFtZUlkID0gKG5vZGU6IEFYUFdpZGdldE5vZGUpID0+IHtcbiAgICAgIHNldChub2RlLCAnbmFtZScsIHRoaXMuZ2VuZXJhdGVVbmlxdWVOYW1lKG5vZGUudHlwZSkpO1xuICAgICAgc2V0KG5vZGUsICdfX21ldGFfXy5pZCcsIHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgpKTtcbiAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2gobiA9PiB7XG4gICAgICAgIHNldE5hbWVJZChuKTtcbiAgICAgIH0pXG4gICAgfVxuICAgIHNldE5hbWVJZChuZXdOb2RlKTtcbiAgICAvL1xuICAgIHRoaXMuY29tbWFuZE1hbmFnZXIuZXhlY3V0ZUNvbW1hbmQobmV3IEFkZFdpZGdldENvbW1hbmQobmV3Tm9kZSwgbmVhcmVzdENvbnRhaW5lciwgbmVhcmVzdENvbnRhaW5lcikpO1xuICAgIC8vXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2goeyB3aWRnZXQ6IG5lYXJlc3RDb250YWluZXIgfSk7IC8vIFJlZnJlc2ggdGhlIFVJXG4gICAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogbmV3Tm9kZSB9KTsgLy8gU2VsZWN0IHRoZSBuZXdseSBwYXN0ZWQgbm9kZVxuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0KCk6IHN0cmluZyB7XG4gICAgY29uc3QganNvbiA9IHRoaXMucmVtb3ZlTWV0YVByb3AodGhpcy5kb2N1bWVudCgpKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbik7XG4gIH1cblxuICBkb3dubG9hZEpzb24oKSB7XG4gICAgLy8gQ29udmVydCB0aGUgb2JqZWN0IHRvIGEgSlNPTiBzdHJpbmdcbiAgICBjb25zdCBqc29uU3RyID0gdGhpcy5leHBvcnQoKTtcblxuICAgIC8vIENyZWF0ZSBhIGJsb2Igb2JqZWN0IGZyb20gdGhlIEpTT04gc3RyaW5nXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtqc29uU3RyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG5cbiAgICAvLyBDcmVhdGUgYSBVUkwgZm9yIHRoZSBibG9iIG9iamVjdFxuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgPGE+IGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZG93bmxvYWRcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBhLmRvd25sb2FkID0gJ2V4cG9ydC5qc29uJztcblxuICAgIC8vIEFwcGVuZCB0aGUgPGE+IGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50IGJvZHkgKG5lY2Vzc2FyeSBmb3Igc29tZSBicm93c2VycylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuXG4gICAgLy8gVHJpZ2dlciB0aGUgZG93bmxvYWQgYnkgY2xpY2tpbmcgdGhlIDxhPiBlbGVtZW50XG4gICAgYS5jbGljaygpO1xuICAgIC8vIENsZWFuIHVwIGJ5IHJldm9raW5nIHRoZSBvYmplY3QgVVJMIGFuZCByZW1vdmluZyB0aGUgPGE+IGVsZW1lbnRcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgfVxuXG5cbiAgYXN5bmMgaW1wb3J0SlNvbigpIHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuZmlsZVNlcnZpY2UuY2hvb3NlKHsgbXVsdGlwbGU6IGZhbHNlLCBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyB9KVxuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1swXTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmaWxlLnRleHQoKTtcbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyBBWFBXaWRnZXROb2RlO1xuICAgICAgY29uc3QgdG90YWxOb2RlID0gdGhpcy5jb3VudFRvdGFsTm9kZXMocm9vdE5vZGUpXG4gICAgICBjb25zdCBwcm9jZXNzZWROb2RlcyA9IHsgY291bnQ6IDAgfTtcblxuICAgICAgY29uc3QgYnV0dG9uOiBBWExvYWRpbmdEaWFsb2dCdXR0b25JdGVtID0ge1xuICAgICAgICB0ZXh0OiBcIkNhbmNlbFwiLFxuICAgICAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XG4gICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNob3coe1xuICAgICAgICBtb2RlOiAnZGV0ZXJtaW5hdGUnLFxuICAgICAgICB0aXRsZTogXCJJbXBvcnQgSnNvbiBGaWxlXCIsXG4gICAgICAgIHByb2dyZXNzQ29sb3I6ICdwcmltYXJ5JyxcbiAgICAgICAgdGV4dDogXCJQcm9jZXNzaW5nIGpzb24gZmlsZVwiLFxuICAgICAgICBzdGF0dXM6IGAwIG9mICR7dG90YWxOb2RlfWAsXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICBidXR0b25cbiAgICAgICAgXVxuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBhd2FpdCB0aGlzLmFkZE1ldGFUb05vZGVzKHJvb3ROb2RlLCBwcm9jZXNzZWROb2RlcywgKGNvdW50KSA9PiB7XG4gICAgICAgICAgZGlhbG9nLnNldFByb2dyZXNzVmFsdWUoTWF0aC5jZWlsKGNvdW50IC8gdG90YWxOb2RlICogMTAwKSk7XG4gICAgICAgICAgZGlhbG9nLnNldFByb2dyZXNzU3RhdHVzKGAke2NvdW50fSBvZiAke3RvdGFsTm9kZX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByb290LmNoaWxkcmVuPy5bMF0hO1xuICAgICAgICB0aGlzLmRvY3VtZW50LnNldChyb290KTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZS5zZXQocGFnZSk7XG4gICAgICAgIGRpYWxvZy5zZXRQcm9ncmVzc0NvbG9yKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgZGlhbG9nLnNldFByb2dyZXNzVGV4dChcIkpzb24gZmlsZSBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5XCIpO1xuICAgICAgICBidXR0b24udGV4dCA9IFwiT2theVwiO1xuICAgICAgICBidXR0b24uY29sb3IgPSBcInN1Y2Nlc3NcIjtcbiAgICAgICAgZGlhbG9nLnNldFByb2dyZXNzVmFsdWUoMTAwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZVJlbmRlclBhZ2UoKTtcbiAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBkaWFsb2cuc2V0UHJvZ3Jlc3NDb2xvcihcImRhbmdlclwiKTtcbiAgICAgICAgZGlhbG9nLnNldFByb2dyZXNzVGV4dChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiQ2Fubm90IHByb2Nlc3MganNvbiBmaWxlXCIpO1xuICAgICAgICBidXR0b24udGV4dCA9IFwiQ2xvc2VcIjtcbiAgICAgICAgYnV0dG9uLmNvbG9yID0gXCJkYW5nZXJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvdW50VG90YWxOb2Rlcyhub2RlOiBBWFBXaWRnZXROb2RlKTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAxOyAvLyBDb3VudCB0aGUgY3VycmVudCBub2RlXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb3VudCArPSBub2RlLmNoaWxkcmVuLnJlZHVjZSgoc3VtLCBjaGlsZCkgPT4gc3VtICsgdGhpcy5jb3VudFRvdGFsTm9kZXMoY2hpbGQpLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cblxuICBwcml2YXRlIGdlbmVyYXRlVW5pcXVlTmFtZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBmb2xsb3cgY2FtZWxDYXNlIGNvbnZlbnRpb25cbiAgICBjb25zdCBiYXNlTmFtZSA9IHR5cGUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyB0eXBlLnNsaWNlKDEpO1xuICAgIGxldCBpbmRleCA9IDE7XG4gICAgbGV0IHVuaXF1ZU5hbWUgPSBgJHtiYXNlTmFtZX0ke2luZGV4fWA7XG5cbiAgICAvLyBHYXRoZXIgYWxsIGV4aXN0aW5nIG5hbWVzIHRvIGNoZWNrIGFnYWluc3RcbiAgICBjb25zdCBleGlzdGluZ05hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5jb2xsZWN0QWxsTmFtZXModGhpcy5kb2N1bWVudCgpLCBleGlzdGluZ05hbWVzKTtcblxuICAgIC8vIEluY3JlbWVudCB0aGUgaW5kZXggdW50aWwgYSB1bmlxdWUgbmFtZSBpcyBmb3VuZFxuICAgIHdoaWxlIChleGlzdGluZ05hbWVzLmhhcyh1bmlxdWVOYW1lKSkge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHVuaXF1ZU5hbWUgPSBgJHtiYXNlTmFtZX0ke2luZGV4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZU5hbWU7XG4gIH1cblxuICBnZW5lcmF0ZVVuaXF1ZUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygxMCwgMTgpO1xuICB9XG5cblxuICBwcml2YXRlIGNvbGxlY3RBbGxOYW1lcyhub2RlOiBBWFBXaWRnZXROb2RlLCBuYW1lczogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICBuYW1lcy5hZGQobm9kZS5uYW1lKTtcbiAgICB9XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLmNvbGxlY3RBbGxOYW1lcyhjaGlsZCwgbmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgcHVibGljIGFzeW5jIG9wZW5QcmV2aWV3KCkge1xuICAgIGNvbnN0IGNvbSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vcHJldmlldy9wcmV2aWV3LmNvbXBvbmVudCcpLnRoZW4oKGMpID0+IGMuQVhQTGF5b3V0RGVzaWduZXJQcmV2aWV3Q29tcG9uZW50KTtcbiAgICBhd2FpdCB0aGlzLnBvcHVwU2VydmljZS5vcGVuKGNvbSwge1xuICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgIHNpemU6ICdmdWxsJyxcbiAgICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgZGF0YToge1xuICAgICAgICB3aWRnZXRzOiBzb3J0QnkoXG4gICAgICAgICAgdGhpcy53aWRnZXRSZWdpc3RlcnlTZXJ2aWNlLmFsbCgpLmZpbHRlcigoYykgPT4gYy52aXNpYmxlICE9IGZhbHNlKSxcbiAgICAgICAgICAoYykgPT4gYy50aXRsZVxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIudHlwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2Rlc2lnbmVyL3NyYy9saWIvZGVzaWduZXIvc2hhcmVkL2Rlc2lnbmVyLnR5cHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJEYXRhU291cmNlTmFtZSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nXG59Il19
@@ -0,0 +1,16 @@
1
+ import { AXDecoratorModule } from '@acorex/components/decorators';
2
+ import { CommonModule } from '@angular/common';
3
+ import { Component } from '@angular/core';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@acorex/components/decorators";
6
+ export class AXPLayoutDesignerDrawerContentComponent {
7
+ constructor() { }
8
+ ngOnInit() { }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPLayoutDesignerDrawerContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: AXPLayoutDesignerDrawerContentComponent, isStandalone: true, selector: "axp-designer-drawer-content", ngImport: i0, template: "<div class=\"ax-flex ax-flex-col ax-border-e ax-w-72 ax-h-full\">\n <div class=\"ax-flex ax-flex-row ax-w-full ax-justify-between ax-text-white ax-p-2 ax-border-b\">\n <div class=\"ax-flex ax-flex-row ax-gap-2 ax-items-center ax-font-semibold\">\n <ng-content select=\"ax-title\"></ng-content>\n </div>\n <div class=\"ax-flex ax-gap-1 ax-items-center\">\n <ng-content select=\"ax-content[header]\">\n </ng-content>\n <ax-close-button></ax-close-button>\n </div>\n </div>\n <div class=\"ax-flex-1 ax-h-full ax-overflow-auto\">\n <ng-content select=\"ax-content[body]\">\n\n </ng-content>\n </div>\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorCloseButtonComponent, selector: "ax-close-button", inputs: ["icon"] }] }); }
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPLayoutDesignerDrawerContentComponent, decorators: [{
13
+ type: Component,
14
+ args: [{ standalone: true, imports: [CommonModule, AXDecoratorModule], selector: 'axp-designer-drawer-content', template: "<div class=\"ax-flex ax-flex-col ax-border-e ax-w-72 ax-h-full\">\n <div class=\"ax-flex ax-flex-row ax-w-full ax-justify-between ax-text-white ax-p-2 ax-border-b\">\n <div class=\"ax-flex ax-flex-row ax-gap-2 ax-items-center ax-font-semibold\">\n <ng-content select=\"ax-title\"></ng-content>\n </div>\n <div class=\"ax-flex ax-gap-1 ax-items-center\">\n <ng-content select=\"ax-content[header]\">\n </ng-content>\n <ax-close-button></ax-close-button>\n </div>\n </div>\n <div class=\"ax-flex-1 ax-h-full ax-overflow-auto\">\n <ng-content select=\"ax-content[body]\">\n\n </ng-content>\n </div>\n</div>" }]
15
+ }], ctorParameters: () => [] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLWNvbnRlbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9sYXlvdXQvZGVzaWduZXIvc3JjL2xpYi9kZXNpZ25lci9zaGFyZWQvZHJhd2VyLWNvbnRlbnQvZHJhd2VyLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9sYXlvdXQvZGVzaWduZXIvc3JjL2xpYi9kZXNpZ25lci9zaGFyZWQvZHJhd2VyLWNvbnRlbnQvZHJhd2VyLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7OztBQVNsRCxNQUFNLE9BQU8sdUNBQXVDO0lBQ2hELGdCQUFnQixDQUFDO0lBRWpCLFFBQVEsS0FBSyxDQUFDOzhHQUhMLHVDQUF1QztrR0FBdkMsdUNBQXVDLHVGQ1hwRCwrckJBZ0JNLDJDRFZRLFlBQVksOEJBQUMsaUJBQWlCOzsyRkFLL0IsdUNBQXVDO2tCQVBuRCxTQUFTO2lDQUNNLElBQUksV0FDUCxDQUFDLFlBQVksRUFBQyxpQkFBaUIsQ0FBQyxZQUMvQiw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWERlY29yYXRvck1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsQVhEZWNvcmF0b3JNb2R1bGVdLFxuICAgIHNlbGVjdG9yOiAnYXhwLWRlc2lnbmVyLWRyYXdlci1jb250ZW50JyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RyYXdlci1jb250ZW50LmNvbXBvbmVudC5odG1sJ1xufSlcblxuZXhwb3J0IGNsYXNzIEFYUExheW91dERlc2lnbmVyRHJhd2VyQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIG5nT25Jbml0KCkgeyB9XG59IiwiPGRpdiBjbGFzcz1cImF4LWZsZXggYXgtZmxleC1jb2wgYXgtYm9yZGVyLWUgYXgtdy03MiBheC1oLWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1mbGV4LXJvdyBheC13LWZ1bGwgYXgtanVzdGlmeS1iZXR3ZWVuIGF4LXRleHQtd2hpdGUgYXgtcC0yIGF4LWJvcmRlci1iXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJheC1mbGV4IGF4LWZsZXgtcm93IGF4LWdhcC0yIGF4LWl0ZW1zLWNlbnRlciBheC1mb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJheC10aXRsZVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJheC1mbGV4IGF4LWdhcC0xIGF4LWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtY29udGVudFtoZWFkZXJdXCI+XG4gICAgICAgICAgICA8L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8YXgtY2xvc2UtYnV0dG9uPjwvYXgtY2xvc2UtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleC0xIGF4LWgtZnVsbCBheC1vdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImF4LWNvbnRlbnRbYm9keV1cIj5cblxuICAgICAgICA8L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=