@scion/workbench 17.0.0-beta.7 → 17.0.0-beta.9

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 (304) hide show
  1. package/README.md +1 -1
  2. package/esm2022/lib/activation-instant.provider.mjs +3 -3
  3. package/esm2022/lib/common/asserts.util.mjs +2 -2
  4. package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
  5. package/esm2022/lib/common/filter-by-predicate.pipe.mjs +3 -3
  6. package/esm2022/lib/common/filter-by-text.pipe.mjs +3 -3
  7. package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +6 -6
  8. package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
  9. package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
  10. package/esm2022/lib/common/null-if-empty.pipe.mjs +3 -3
  11. package/esm2022/lib/common/objects.util.mjs +34 -0
  12. package/esm2022/lib/common/typeof.pipe.mjs +3 -3
  13. package/esm2022/lib/common/uuid.util.mjs +17 -0
  14. package/esm2022/lib/content-projection/content-as-overlay.component.mjs +3 -3
  15. package/esm2022/lib/content-projection/content-projection.directive.mjs +3 -3
  16. package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +3 -3
  17. package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +3 -3
  18. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +9 -6
  19. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +9 -6
  20. package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -3
  21. package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +9 -6
  22. package/esm2022/lib/dialog/movable.directive.mjs +3 -3
  23. package/esm2022/lib/dialog/resizable.directive.mjs +3 -3
  24. package/esm2022/lib/dialog/workbench-dialog.component.mjs +53 -24
  25. package/esm2022/lib/dialog/workbench-dialog.mjs +1 -1
  26. package/esm2022/lib/dialog/workbench-dialog.options.mjs +1 -1
  27. package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
  28. package/esm2022/lib/dialog/workbench-dialog.service.mjs +5 -5
  29. package/esm2022/lib/dialog//311/265workbench-dialog.mjs +7 -7
  30. package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +3 -3
  31. package/esm2022/lib/executor/single-task-executor.mjs +26 -7
  32. package/esm2022/lib/filter-field/filter-field.component.mjs +6 -6
  33. package/esm2022/lib/glass-pane/glass-pane.directive.mjs +15 -7
  34. package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -10
  35. package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +6 -4
  36. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +11 -0
  37. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +11 -0
  38. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +11 -0
  39. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +11 -0
  40. package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +59 -0
  41. package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +117 -0
  42. package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +57 -0
  43. package/esm2022/lib/layout/workbench-layout.component.mjs +6 -4
  44. package/esm2022/lib/layout/workbench-layout.factory.mjs +4 -4
  45. package/esm2022/lib/layout/workbench-layout.mjs +1 -1
  46. package/esm2022/lib/layout/workbench-layout.model.mjs +5 -6
  47. package/esm2022/lib/layout/workbench-layout.service.mjs +3 -3
  48. package/esm2022/lib/layout/workbench-layouts.util.mjs +37 -1
  49. package/esm2022/lib/layout/workench-layout-serializer.service.mjs +53 -21
  50. package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +8 -5
  51. package/esm2022/lib/layout//311/265workbench-layout.mjs +382 -195
  52. package/esm2022/lib/logging/console-appender.service.mjs +3 -3
  53. package/esm2022/lib/logging/logger.mjs +3 -3
  54. package/esm2022/lib/logging/logging-support.mjs +4 -4
  55. package/esm2022/lib/logging/logging.model.mjs +3 -3
  56. package/esm2022/lib/logging//311/265logger.mjs +3 -3
  57. package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +18 -20
  58. package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
  59. package/esm2022/lib/message-box/workbench-message-box.component.mjs +15 -6
  60. package/esm2022/lib/message-box/workbench-message-box.options.mjs +1 -1
  61. package/esm2022/lib/message-box/workbench-message-box.service.mjs +5 -5
  62. package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +5 -5
  63. package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +26 -13
  64. package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +3 -3
  65. package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +25 -13
  66. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +3 -3
  67. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +11 -11
  68. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +5 -5
  69. package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +11 -9
  70. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +112 -0
  71. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +43 -0
  72. package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +16 -13
  73. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +34 -0
  74. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +88 -0
  75. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +32 -0
  76. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +121 -0
  77. package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
  78. package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +3 -3
  79. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +3 -3
  80. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +9 -6
  81. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +9 -15
  82. package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +3 -3
  83. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +4 -4
  84. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +37 -32
  85. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +3 -3
  86. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +3 -3
  87. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +13 -11
  88. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +14 -9
  89. package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +54 -23
  90. package/esm2022/lib/migration/workbench-migration.mjs +11 -0
  91. package/esm2022/lib/migration/workbench-migrator.mjs +38 -0
  92. package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
  93. package/esm2022/lib/notification/notification-list.component.mjs +3 -3
  94. package/esm2022/lib/notification/notification.component.mjs +3 -3
  95. package/esm2022/lib/notification/notification.config.mjs +1 -1
  96. package/esm2022/lib/notification/notification.mjs +1 -1
  97. package/esm2022/lib/notification/notification.service.mjs +9 -9
  98. package/esm2022/lib/notification/text-notification.component.mjs +3 -3
  99. package/esm2022/lib/page-not-found/format-url.pipe.mjs +26 -0
  100. package/esm2022/lib/page-not-found/page-not-found.component.mjs +28 -0
  101. package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +3 -3
  102. package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +3 -3
  103. package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
  104. package/esm2022/lib/part/part-bar/part-bar.component.mjs +10 -8
  105. package/esm2022/lib/part/part-portal.pipe.mjs +3 -3
  106. package/esm2022/lib/part/part.component.mjs +6 -4
  107. package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +3 -3
  108. package/esm2022/lib/part/view-context-menu/text.component.mjs +3 -3
  109. package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +3 -3
  110. package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +4 -4
  111. package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +18 -18
  112. package/esm2022/lib/part/view-list/view-list.component.mjs +3 -3
  113. package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +3 -3
  114. package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +9 -9
  115. package/esm2022/lib/part/view-tab/view-tab.component.mjs +13 -11
  116. package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -5
  117. package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +9 -9
  118. package/esm2022/lib/part/workbench-part-action.registry.mjs +3 -3
  119. package/esm2022/lib/part/workbench-part.model.mjs +1 -1
  120. package/esm2022/lib/part/workbench-part.registry.mjs +3 -3
  121. package/esm2022/lib/part//311/265workbench-part.model.mjs +3 -3
  122. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +11 -0
  123. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +11 -0
  124. package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +57 -0
  125. package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +19 -51
  126. package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +23 -18
  127. package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +27 -42
  128. package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
  129. package/esm2022/lib/perspective/workbench-perspective.registry.mjs +3 -3
  130. package/esm2022/lib/perspective/workbench-perspective.service.mjs +15 -10
  131. package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +62 -0
  132. package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +98 -78
  133. package/esm2022/lib/popup/popup.component.mjs +22 -10
  134. package/esm2022/lib/popup/popup.config.mjs +3 -1
  135. package/esm2022/lib/popup/popup.service.mjs +4 -4
  136. package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +6 -6
  137. package/esm2022/lib/public_api.mjs +3 -2
  138. package/esm2022/lib/registry/workbench-object-registry.mjs +3 -3
  139. package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +31 -0
  140. package/esm2022/lib/routing/public_api.mjs +1 -1
  141. package/esm2022/lib/routing/router.util.mjs +89 -35
  142. package/esm2022/lib/routing/routing.model.mjs +1 -1
  143. package/esm2022/lib/routing/url-segment-matcher.mjs +46 -0
  144. package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +58 -49
  145. package/esm2022/lib/routing/workbench-dialog-differ.mjs +6 -6
  146. package/esm2022/lib/routing/workbench-layout-differ.mjs +14 -17
  147. package/esm2022/lib/routing/workbench-message-box-differ.mjs +51 -0
  148. package/esm2022/lib/routing/workbench-navigational-states.mjs +4 -28
  149. package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
  150. package/esm2022/lib/routing/workbench-route-data.mjs +14 -4
  151. package/esm2022/lib/routing/workbench-router-link.directive.mjs +24 -32
  152. package/esm2022/lib/routing/workbench-router.service.mjs +13 -378
  153. package/esm2022/lib/routing/workbench-url-observer.service.mjs +69 -82
  154. package/esm2022/lib/routing//311/265location.mjs +3 -3
  155. package/esm2022/lib/routing//311/265workbench-router.service.mjs +314 -0
  156. package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
  157. package/esm2022/lib/startup/workbench-launcher.service.mjs +11 -11
  158. package/esm2022/lib/storage/workbench-storage.mjs +3 -3
  159. package/esm2022/lib/testing/public_api.mjs +2 -1
  160. package/esm2022/lib/testing/workbench-testing.module.mjs +13 -39
  161. package/esm2022/lib/testing/workbench.provider.mjs +60 -0
  162. package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +3 -3
  163. package/esm2022/lib/view/public_api.mjs +2 -1
  164. package/esm2022/lib/view/view-move-handler.service.mjs +42 -62
  165. package/esm2022/lib/view/view-portal.pipe.mjs +4 -4
  166. package/esm2022/lib/view/view.component.mjs +20 -40
  167. package/esm2022/lib/view/workbench-view-route-guards.mjs +47 -0
  168. package/esm2022/lib/view/workbench-view.model.mjs +6 -4
  169. package/esm2022/lib/view/workbench-view.registry.mjs +4 -4
  170. package/esm2022/lib/view//311/265workbench-view.model.mjs +106 -27
  171. package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +7 -7
  172. package/esm2022/lib/view-dnd/view-drag.service.mjs +6 -6
  173. package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +3 -3
  174. package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +4 -4
  175. package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +6 -4
  176. package/esm2022/lib/workbench-config.mjs +15 -0
  177. package/esm2022/lib/workbench-id.mjs +3 -3
  178. package/esm2022/lib/workbench.component.mjs +20 -12
  179. package/esm2022/lib/workbench.constants.mjs +7 -9
  180. package/esm2022/lib/workbench.model.mjs +1 -1
  181. package/esm2022/lib/workbench.module.mjs +15 -86
  182. package/esm2022/lib/workbench.provider.mjs +117 -0
  183. package/esm2022/lib/workbench.service.mjs +5 -5
  184. package/esm2022/lib//311/265workbench.service.mjs +15 -21
  185. package/fesm2022/scion-workbench.mjs +5490 -4166
  186. package/fesm2022/scion-workbench.mjs.map +1 -1
  187. package/lib/common/objects.util.d.ts +17 -0
  188. package/lib/common/uuid.util.d.ts +8 -0
  189. package/lib/dialog/workbench-dialog.component.d.ts +16 -7
  190. package/lib/dialog/workbench-dialog.d.ts +1 -1
  191. package/lib/dialog/workbench-dialog.options.d.ts +4 -3
  192. package/lib/dialog/workbench-dialog.registry.d.ts +4 -3
  193. package/lib/dialog/workbench-dialog.service.d.ts +1 -1
  194. package/lib/dialog//311/265workbench-dialog.d.ts +2 -2
  195. package/lib/executor/single-task-executor.d.ts +6 -1
  196. package/lib/filter-field/filter-field.component.d.ts +1 -1
  197. package/lib/glass-pane/glass-pane.directive.d.ts +21 -0
  198. package/lib/layout/grid-element/grid-element.component.d.ts +2 -2
  199. package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +16 -0
  200. package/lib/layout/migration/model/workbench-layout-migration-v2.model.d.ts +22 -0
  201. package/lib/layout/migration/model/workbench-layout-migration-v3.model.d.ts +30 -0
  202. package/lib/layout/migration/model/workbench-layout-migration-v4.model.d.ts +31 -0
  203. package/lib/layout/migration/workbench-layout-migration-v2.service.d.ts +13 -0
  204. package/lib/layout/migration/workbench-layout-migration-v3.service.d.ts +16 -0
  205. package/lib/layout/migration/workbench-layout-migration-v4.service.d.ts +12 -0
  206. package/lib/layout/workbench-layout.d.ts +61 -7
  207. package/lib/layout/workbench-layout.factory.d.ts +1 -1
  208. package/lib/layout/workbench-layout.model.d.ts +19 -9
  209. package/lib/layout/workbench-layouts.util.d.ts +18 -0
  210. package/lib/layout/workench-layout-serializer.service.d.ts +28 -7
  211. package/lib/layout//311/265workbench-layout.d.ts +172 -98
  212. package/lib/layout//311/265workbench-layout.factory.d.ts +4 -0
  213. package/lib/logging/logging-support.d.ts +2 -2
  214. package/lib/message-box/workbench-message-box.component.d.ts +3 -0
  215. package/lib/message-box/workbench-message-box.options.d.ts +4 -3
  216. package/lib/message-box/workbench-message-box.service.d.ts +1 -1
  217. package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -1
  218. package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +1 -0
  219. package/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.d.ts +39 -0
  220. package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +25 -0
  221. package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +4 -2
  222. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.d.ts +10 -0
  223. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.d.ts +28 -0
  224. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.d.ts +11 -0
  225. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.d.ts +48 -0
  226. package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +3 -7
  227. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +4 -9
  228. package/lib/microfrontend-platform/workbench-microfrontend-support.d.ts +3 -3
  229. package/lib/migration/workbench-migration.d.ts +9 -0
  230. package/lib/migration/workbench-migrator.d.ts +18 -0
  231. package/lib/notification/notification.config.d.ts +1 -1
  232. package/lib/notification/notification.d.ts +1 -3
  233. package/lib/page-not-found/format-url.pipe.d.ts +11 -0
  234. package/lib/page-not-found/page-not-found.component.d.ts +8 -0
  235. package/lib/part/part-action-bar/part-action.directive.d.ts +1 -1
  236. package/lib/part/part-bar/part-bar.component.d.ts +4 -3
  237. package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
  238. package/lib/part/view-context-menu/view-menu.service.d.ts +5 -4
  239. package/lib/part/view-list-item/view-list-item.component.d.ts +5 -4
  240. package/lib/part/view-tab/view-tab.component.d.ts +6 -5
  241. package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +3 -3
  242. package/lib/part/workbench-part.model.d.ts +5 -4
  243. package/lib/part//311/265workbench-part.model.d.ts +5 -4
  244. package/lib/perspective/migration/model/workbench-perspective-migration-v1.model.d.ts +8 -0
  245. package/lib/perspective/migration/model/workbench-perspective-migration-v2.model.d.ts +10 -0
  246. package/lib/perspective/migration/workbench-perspective-migration-v2.service.d.ts +13 -0
  247. package/lib/perspective/workbench-grid-merger.service.d.ts +9 -16
  248. package/lib/perspective/workbench-perspective-storage.service.d.ts +10 -28
  249. package/lib/perspective/workbench-perspective-view-conflict-resolver.service.d.ts +8 -25
  250. package/lib/perspective/workbench-perspective.model.d.ts +123 -14
  251. package/lib/perspective/workbench-perspective.service.d.ts +10 -3
  252. package/lib/perspective/workench-perspective-serializer.service.d.ts +26 -0
  253. package/lib/perspective//311/265workbench-perspective.model.d.ts +16 -14
  254. package/lib/popup/popup.component.d.ts +1 -0
  255. package/lib/popup/popup.config.d.ts +4 -3
  256. package/lib/portal/workbench-portal-outlet.directive.d.ts +2 -2
  257. package/lib/public_api.d.ts +4 -3
  258. package/lib/registry/workbench-object-registry.d.ts +2 -2
  259. package/lib/routing/empty-outlet/empty-outlet.component.d.ts +15 -0
  260. package/lib/routing/public_api.d.ts +2 -2
  261. package/lib/routing/router.util.d.ts +45 -19
  262. package/lib/routing/routing.model.d.ts +107 -8
  263. package/lib/routing/url-segment-matcher.d.ts +20 -0
  264. package/lib/routing/workbench-auxiliary-routes-registrator.service.d.ts +25 -15
  265. package/lib/routing/workbench-layout-differ.d.ts +4 -7
  266. package/lib/routing/workbench-message-box-differ.d.ts +25 -0
  267. package/lib/routing/workbench-navigational-states.d.ts +6 -19
  268. package/lib/routing/workbench-route-data.d.ts +13 -3
  269. package/lib/routing/workbench-router-link.directive.d.ts +22 -7
  270. package/lib/routing/workbench-router.service.d.ts +42 -142
  271. package/lib/routing/workbench-url-observer.service.d.ts +10 -28
  272. package/lib/routing//311/265workbench-router.service.d.ts +74 -0
  273. package/lib/startup/workbench-launcher.service.d.ts +4 -4
  274. package/lib/testing/public_api.d.ts +1 -0
  275. package/lib/testing/workbench-testing.module.d.ts +7 -6
  276. package/lib/testing/workbench.provider.d.ts +29 -0
  277. package/lib/view/public_api.d.ts +2 -1
  278. package/lib/view/view-move-handler.service.d.ts +2 -4
  279. package/lib/view/view-portal.pipe.d.ts +2 -1
  280. package/lib/view/view.component.d.ts +1 -11
  281. package/lib/view/workbench-view-route-guards.d.ts +36 -0
  282. package/lib/view/workbench-view.model.d.ts +37 -5
  283. package/lib/view/workbench-view.registry.d.ts +4 -3
  284. package/lib/view//311/265workbench-view.model.d.ts +61 -15
  285. package/lib/view-dnd/view-drag.service.d.ts +9 -4
  286. package/lib/view-dnd/view-drop-zone.directive.d.ts +1 -1
  287. package/lib/{workbench-module-config.d.ts → workbench-config.d.ts} +29 -71
  288. package/lib/workbench.component.d.ts +2 -2
  289. package/lib/workbench.constants.d.ts +6 -8
  290. package/lib/workbench.model.d.ts +20 -8
  291. package/lib/workbench.module.d.ts +12 -7
  292. package/lib/workbench.provider.d.ts +38 -0
  293. package/lib/workbench.service.d.ts +32 -8
  294. package/lib//311/265workbench.service.d.ts +9 -3
  295. package/package.json +8 -8
  296. package/esm2022/lib/layout/migration/workbench-layout-migrator.service.mjs +0 -38
  297. package/esm2022/lib/layout/migration/workbench-layout-v1-migrator.service.mjs +0 -59
  298. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.service.mjs +0 -46
  299. package/esm2022/lib/view/workbench-view-pre-destroy.guard.mjs +0 -36
  300. package/esm2022/lib/workbench-module-config.mjs +0 -15
  301. package/lib/layout/migration/workbench-layout-migrator.service.d.ts +0 -15
  302. package/lib/layout/migration/workbench-layout-v1-migrator.service.d.ts +0 -12
  303. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.service.d.ts +0 -17
  304. package/lib/view/workbench-view-pre-destroy.guard.d.ts +0 -5
@@ -7,10 +7,10 @@
7
7
  *
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  */
10
- import { BehaviorSubject, combineLatest, EMPTY, switchMap } from 'rxjs';
11
- import { ChildrenOutletContexts, Router } from '@angular/router';
10
+ import { BehaviorSubject, combineLatest, EMPTY, pairwise, switchMap } from 'rxjs';
11
+ import { ActivationStart, ChildrenOutletContexts, Router } from '@angular/router';
12
12
  import { ViewDragService } from '../view-dnd/view-drag.service';
13
- import { distinctUntilChanged, filter, map } from 'rxjs/operators';
13
+ import { distinctUntilChanged, filter, map, startWith } from 'rxjs/operators';
14
14
  import { filterArray, mapArray } from '@scion/toolkit/operators';
15
15
  import { Defined } from '@scion/toolkit/util';
16
16
  import { throwError } from '../common/throw-error.util';
@@ -29,18 +29,20 @@ import { ɵDestroyRef } from '../common/ɵdestroy-ref';
29
29
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
30
30
  import { provideViewContext } from './view-context-provider';
31
31
  import { WORKBENCH_ID } from '../workbench-id';
32
- import { WorkbenchNavigationalStates, WorkbenchNavigationalViewStates } from '../routing/workbench-navigational-states';
33
32
  import { ClassList } from '../common/class-list';
33
+ import { RouterUtils } from '../routing/router.util';
34
+ import { WorkbenchRouteData } from '../routing/workbench-route-data';
34
35
  export class ɵWorkbenchView {
35
36
  constructor(id, options) {
36
37
  this.id = id;
37
38
  this._workbenchId = inject(WORKBENCH_ID);
38
39
  this._workbenchService = inject(ɵWorkbenchService);
39
40
  this._workbenchLayoutService = inject(WorkbenchLayoutService);
41
+ this._router = inject(Router);
40
42
  this._workbenchRouter = inject(WorkbenchRouter);
43
+ this._childrenOutletContexts = inject(ChildrenOutletContexts);
41
44
  this._partRegistry = inject(WorkbenchPartRegistry);
42
45
  this._viewDragService = inject(ViewDragService);
43
- this._router = inject(Router);
44
46
  this._activationInstantProvider = inject(ActivationInstantProvider);
45
47
  this._workbenchDialogRegistry = inject(WorkbenchDialogRegistry);
46
48
  this._part$ = new BehaviorSubject(undefined);
@@ -49,12 +51,13 @@ export class ɵWorkbenchView {
49
51
  this._adapters = new Map();
50
52
  this._destroyRef = new ɵDestroyRef();
51
53
  this._closable = true;
54
+ this.urlSegments = [];
55
+ this.state = {};
52
56
  this.title = null;
53
57
  this.heading = null;
54
58
  this.dirty = false;
55
59
  this.scrollTop = 0;
56
60
  this.scrollLeft = 0;
57
- this.state = {};
58
61
  this.active$ = new BehaviorSubject(false);
59
62
  this.blockedBy$ = new BehaviorSubject(null);
60
63
  this.classList = new ClassList();
@@ -64,15 +67,16 @@ export class ɵWorkbenchView {
64
67
  this.trackViewActivation();
65
68
  this.touchOnActivate();
66
69
  this.blockWhenDialogOpened();
70
+ this.detectRouteActivation();
67
71
  }
68
72
  createPortal(viewComponent) {
69
73
  return new WbComponentPortal(viewComponent, {
70
74
  providers: [
71
75
  provideViewContext(this),
72
- // For each primary top-level route, the workbench registers corresponding secondary top-level view routes.
73
- // However, if the workbench component is displayed in a router outlet, view outlets are not top-level outlets anymore.
74
- // Therefore, we instruct the view's router outlet to act as a top-level outlet to be the target of the registered top-level view routes.
75
- { provide: ChildrenOutletContexts, useValue: inject(ChildrenOutletContexts) },
76
+ // For each view, the workbench registers auxiliary routes of all top-level routes, enabling routing on a per-view basis.
77
+ // But, if the workbench component itself is displayed in a router outlet, view outlets are not top-level outlets.
78
+ // Therefore, we instruct the outlet to act as a top-level outlet to be the target of the registered top-level view routes.
79
+ { provide: ChildrenOutletContexts, useValue: this._childrenOutletContexts },
76
80
  // Prevent injecting this part into the view because the view may be dragged to a different part.
77
81
  { provide: WorkbenchPart, useFactory: () => throwError(`[NullInjectorError] No provider for 'WorkbenchPart'`) },
78
82
  { provide: ɵWorkbenchPart, useFactory: () => throwError(`[NullInjectorError] No provider for 'ɵWorkbenchPart'`) },
@@ -80,57 +84,98 @@ export class ɵWorkbenchView {
80
84
  });
81
85
  }
82
86
  /**
83
- * Method invoked to update this workbench model object when the workbench layout changes.
87
+ * Method invoked when a route is about to be activated for this view.
88
+ */
89
+ onRouteActivate(route) {
90
+ this.title = RouterUtils.lookupRouteData(route, WorkbenchRouteData.title) ?? null;
91
+ this.heading = RouterUtils.lookupRouteData(route, WorkbenchRouteData.heading) ?? null;
92
+ this.dirty = false;
93
+ this.classList.set(RouterUtils.lookupRouteData(route, WorkbenchRouteData.cssClass), { scope: 'route' });
94
+ this.classList.remove({ scope: 'application' });
95
+ this.classList.remove({ scope: 'navigation' });
96
+ }
97
+ /**
98
+ * Method invoked when the workbench layout has changed.
99
+ *
100
+ * This method:
101
+ * - is called on every layout change, including changes not relevant for this view.
102
+ * - is called after successful navigation, i.e., after {@link onRouteActivate}.
84
103
  */
85
104
  onLayoutChange(layout) {
86
- const partId = layout.part({ by: { viewId: this.id } }).id;
87
- this._part$.next(this._partRegistry.get(partId));
88
- this.state = WorkbenchNavigationalStates.fromNavigation(this._router.getCurrentNavigation())?.viewStates[this.id] ?? this.state ?? {};
89
- this.classList.set(this.state[WorkbenchNavigationalViewStates.cssClass], { scope: 'navigation' });
105
+ const mPart = layout.part({ viewId: this.id });
106
+ const mView = layout.view({ viewId: this.id });
107
+ this.uid = mView.uid;
108
+ this.alternativeId = mView.alternativeId;
109
+ this.urlSegments = layout.urlSegments({ viewId: this.id });
110
+ this.navigationHint = mView.navigation?.hint;
111
+ this.state = layout.viewState({ viewId: this.id });
112
+ this.classList.set(mView.cssClass, { scope: 'layout' });
113
+ this.classList.set(mView.navigation?.cssClass, { scope: 'navigation' });
114
+ this._part$.next(this._partRegistry.get(mPart.id));
115
+ }
116
+ /**
117
+ * Returns the component of this view. Returns `null` if not navigated the view, or before it was activated for the first time.
118
+ */
119
+ getComponent() {
120
+ const outletContext = RouterUtils.resolveEffectiveOutletContext(this._childrenOutletContexts.getContext(this.id));
121
+ const outlet = outletContext?.outlet;
122
+ return outlet?.isActivated ? outlet.component : null;
123
+ }
124
+ /**
125
+ * Returns the injector of the component. Returns `null` if not navigated the view, or before it was activated for the first time.
126
+ */
127
+ getComponentInjector() {
128
+ const outletContext = RouterUtils.resolveEffectiveOutletContext(this._childrenOutletContexts.getContext(this.id));
129
+ return outletContext?.injector ?? null;
90
130
  }
131
+ /** @inheritDoc */
91
132
  get first() {
92
133
  return this.position === 0;
93
134
  }
135
+ /** @inheritDoc */
94
136
  get last() {
95
137
  return this.position === this.part.viewIds.length - 1;
96
138
  }
139
+ /** @inheritDoc */
97
140
  get position() {
98
141
  return this.part.viewIds.indexOf(this.id);
99
142
  }
143
+ /** @inheritDoc */
100
144
  set cssClass(cssClass) {
101
145
  this.classList.set(cssClass, { scope: 'application' });
102
146
  }
147
+ /** @inheritDoc */
103
148
  get cssClass() {
104
149
  return this.classList.get({ scope: 'application' });
105
150
  }
151
+ /** @inheritDoc */
106
152
  get active() {
107
153
  return this.active$.value;
108
154
  }
155
+ /** @inheritDoc */
109
156
  set closable(closable) {
110
157
  this._closable = closable;
111
158
  }
159
+ /** @inheritDoc */
112
160
  get closable() {
113
161
  return this._closable && !this.blockedBy$.value;
114
162
  }
163
+ /** @inheritDoc */
115
164
  async activate(options) {
116
165
  if (this.active && this.part.active) {
117
166
  return true;
118
167
  }
119
168
  const currentLayout = this._workbenchLayoutService.layout;
120
- return this._workbenchRouternavigate(layout => currentLayout === layout ? layout.activateView(this.id, { activatePart: true }) : null, // cancel navigation if the layout has become stale
169
+ return this._workbenchRouter.navigate(layout => currentLayout === layout ? layout.activateView(this.id, { activatePart: true }) : null, // cancel navigation if the layout has become stale
121
170
  { skipLocationChange: options?.skipLocationChange });
122
171
  }
123
- /**
124
- * Sets whether the tab of this view is scrolled into view in the tabbar.
125
- */
172
+ /** @inheritDoc */
126
173
  set scrolledIntoView(scrolledIntoView) {
127
174
  if (scrolledIntoView !== this._scrolledIntoView$.value) {
128
175
  this._scrolledIntoView$.next(scrolledIntoView);
129
176
  }
130
177
  }
131
- /**
132
- * @inheritDoc
133
- */
178
+ /** @inheritDoc */
134
179
  get scrolledIntoView() {
135
180
  return this._scrolledIntoView$.value;
136
181
  }
@@ -144,9 +189,11 @@ export class ɵWorkbenchView {
144
189
  get activationInstant() {
145
190
  return this._activationInstant;
146
191
  }
192
+ /** @inheritDoc */
147
193
  get part() {
148
194
  return Defined.orElseThrow(this._part$.value, () => Error(`[NullPartError] Part reference missing for view '${this.id}'.`));
149
195
  }
196
+ /** @inheritDoc */
150
197
  close(target) {
151
198
  switch (target || 'self') {
152
199
  case 'self': {
@@ -176,7 +223,9 @@ export class ɵWorkbenchView {
176
223
  workbenchId: this._workbenchId,
177
224
  partId: this.part.id,
178
225
  viewId: this.id,
226
+ alternativeViewId: this.alternativeId,
179
227
  viewUrlSegments: this.urlSegments,
228
+ navigationHint: this.navigationHint,
180
229
  classList: this.classList.toMap(),
181
230
  };
182
231
  if (target === 'new-window') {
@@ -193,10 +242,7 @@ export class ɵWorkbenchView {
193
242
  });
194
243
  }
195
244
  }
196
- get urlSegments() {
197
- const urlTree = this._router.parseUrl(this._router.url);
198
- return urlTree.root.children[this.id]?.segments ?? [];
199
- }
245
+ /** @inheritDoc */
200
246
  registerMenuItem(menuItem) {
201
247
  const factoryFn = () => menuItem;
202
248
  this._menuItemProviders$.next(this._menuItemProviders$.value.concat(factoryFn));
@@ -257,10 +303,43 @@ export class ɵWorkbenchView {
257
303
  .pipe(takeUntilDestroyed(this._destroyRef))
258
304
  .subscribe(this.blockedBy$);
259
305
  }
306
+ /**
307
+ * Detects when to activate a route for this view.
308
+ *
309
+ * Listening for route activations on the view's router outlet is not sufficient,
310
+ * as the outlet does not report subsequent activations of nested child routes.
311
+ *
312
+ * Example:
313
+ * ```html
314
+ * <router-outlet #router_outlet="outlet"
315
+ * (activate)="onActivateRoute(router_outlet.activatedRoute)">
316
+ * </router-outlet>
317
+ * ```
318
+ *
319
+ * Instead, we subscribe to Angular's `ActivationStart` router events and update the view properties accordingly.
320
+ */
321
+ detectRouteActivation() {
322
+ const activatedOutletRoute = this._router.routerState.root.children.find(route => route.outlet === this.id);
323
+ const activatedChildRoute = activatedOutletRoute ? RouterUtils.resolveEffectiveRoute(activatedOutletRoute).snapshot : null;
324
+ // The view handle is constructed at the end of the navigation (see WorkbenchUrlObserver#onNavigationEnd), i.e., after the route has been activated.
325
+ // Therefore, we call `onRouteActivate` manually.
326
+ if (activatedChildRoute) {
327
+ this.onRouteActivate(activatedChildRoute);
328
+ }
329
+ this._router.events
330
+ .pipe(filter((event) => event instanceof ActivationStart), filter(event => event.snapshot.pathFromRoot[1]?.outlet === this.id), map(event => event.snapshot), startWith(activatedChildRoute), pairwise(), takeUntilDestroyed(this._destroyRef))
331
+ .subscribe(([previous, current]) => {
332
+ // Only call `onRouteActivate` if the activated route has changed.
333
+ // Otherwise, e.g., when changing matrix parameters, the view properties set by the application would be overwritten.
334
+ if (previous?.routeConfig !== current.routeConfig) {
335
+ this.onRouteActivate(current);
336
+ }
337
+ });
338
+ }
260
339
  destroy() {
261
340
  this._destroyRef.destroy();
262
341
  this._workbenchDialogRegistry.dialogs({ viewId: this.id }).forEach(dialog => dialog.destroy());
263
342
  this.portal.destroy();
264
343
  }
265
344
  }
266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtdmlldy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEYsT0FBTyxFQUFDLHNCQUFzQixFQUFFLE1BQU0sRUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUd0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFlLE1BQU0sRUFBTyxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxxQkFBcUIs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QUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBFTVBUWSwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q2hpbGRyZW5PdXRsZXRDb250ZXh0cywgUm91dGVyLCBVcmxTZWdtZW50fSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtWaWV3RHJhZ1NlcnZpY2V9IGZyb20gJy4uL3ZpZXctZG5kL3ZpZXctZHJhZy5zZXJ2aWNlJztcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBtYXBBcnJheX0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7RGVmaW5lZH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge0Rpc3Bvc2FibGV9IGZyb20gJy4uL2NvbW1vbi9kaXNwb3NhYmxlJztcbmltcG9ydCB7dGhyb3dFcnJvcn0gZnJvbSAnLi4vY29tbW9uL3Rocm93LWVycm9yLnV0aWwnO1xuaW1wb3J0IHtXb3JrYmVuY2hNZW51SXRlbSwgV29ya2JlbmNoTWVudUl0ZW1GYWN0b3J5Rm59IGZyb20gJy4uL3dvcmtiZW5jaC5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaFZpZXd9IGZyb20gJy4vd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtXb3JrYmVuY2hQYXJ0fSBmcm9tICcuLi9wYXJ0L3dvcmtiZW5jaC1wYXJ0Lm1vZGVsJztcbmltcG9ydCB7ybVXb3JrYmVuY2hTZXJ2aWNlfSBmcm9tICcuLi/JtXdvcmtiZW5jaC5zZXJ2aWNlJztcbmltcG9ydCB7Q29tcG9uZW50VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1diQ29tcG9uZW50UG9ydGFsfSBmcm9tICcuLi9wb3J0YWwvd2ItY29tcG9uZW50LXBvcnRhbCc7XG5pbXBvcnQge0Fic3RyYWN0VHlwZSwgaW5qZWN0LCBUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7ybVXb3JrYmVuY2hQYXJ0fSBmcm9tICcuLi9wYXJ0L8m1d29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHtBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyfSBmcm9tICcuLi9hY3RpdmF0aW9uLWluc3RhbnQucHJvdmlkZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4uL3JvdXRpbmcvd29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7V29ya2JlbmNoUGFydFJlZ2lzdHJ5fSBmcm9tICcuLi9wYXJ0L3dvcmtiZW5jaC1wYXJ0LnJlZ2lzdHJ5JztcbmltcG9ydCB7ybVXb3JrYmVuY2hMYXlvdXR9IGZyb20gJy4uL2xheW91dC/JtXdvcmtiZW5jaC1sYXlvdXQnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7YnVmZmVyTGF0ZXN0VW50aWxMYXlvdXRDaGFuZ2V9IGZyb20gJy4uL2NvbW1vbi9vcGVyYXRvcnMnO1xuaW1wb3J0IHtXb3JrYmVuY2hEaWFsb2dSZWdpc3RyeX0gZnJvbSAnLi4vZGlhbG9nL3dvcmtiZW5jaC1kaWFsb2cucmVnaXN0cnknO1xuaW1wb3J0IHvJtURlc3Ryb3lSZWZ9IGZyb20gJy4uL2NvbW1vbi/JtWRlc3Ryb3ktcmVmJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHvJtVdvcmtiZW5jaERpYWxvZ30gZnJvbSAnLi4vZGlhbG9nL8m1d29ya2JlbmNoLWRpYWxvZyc7XG5pbXBvcnQge0Jsb2NrYWJsZX0gZnJvbSAnLi4vZ2xhc3MtcGFuZS9ibG9ja2FibGUnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfSUR9IGZyb20gJy4uL3dvcmtiZW5jaC1pZCc7XG5pbXBvcnQge1ZpZXdTdGF0ZX0gZnJvbSAnLi4vcm91dGluZy9yb3V0aW5nLm1vZGVsJztcbmltcG9ydCB7V29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLCBXb3JrYmVuY2hOYXZpZ2F0aW9uYWxWaWV3U3RhdGVzfSBmcm9tICcuLi9yb3V0aW5nL3dvcmtiZW5jaC1uYXZpZ2F0aW9uYWwtc3RhdGVzJztcbmltcG9ydCB7Q2xhc3NMaXN0fSBmcm9tICcuLi9jb21tb24vY2xhc3MtbGlzdCc7XG5cbmV4cG9ydCBjbGFzcyDJtVdvcmtiZW5jaFZpZXcgaW1wbGVtZW50cyBXb3JrYmVuY2hWaWV3LCBCbG9ja2FibGUge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaElkID0gaW5qZWN0KFdPUktCRU5DSF9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaFNlcnZpY2UgPSBpbmplY3QoybVXb3JrYmVuY2hTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTGF5b3V0U2VydmljZSA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoUm91dGVyID0gaW5qZWN0KFdvcmtiZW5jaFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnRSZWdpc3RyeSA9IGluamVjdChXb3JrYmVuY2hQYXJ0UmVnaXN0cnkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3RHJhZ1NlcnZpY2UgPSBpbmplY3QoVmlld0RyYWdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2YXRpb25JbnN0YW50UHJvdmlkZXIgPSBpbmplY3QoQWN0aXZhdGlvbkluc3RhbnRQcm92aWRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5ID0gaW5qZWN0KFdvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJ0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8ybVXb3JrYmVuY2hQYXJ0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZW51SXRlbVByb3ZpZGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdvcmtiZW5jaE1lbnVJdGVtRmFjdG9yeUZuW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2Nyb2xsZWRJbnRvVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVycyA9IG5ldyBNYXA8VHlwZTx1bmtub3duPiB8IEFic3RyYWN0VHlwZTx1bmtub3duPiwgdW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IG5ldyDJtURlc3Ryb3lSZWYoKTtcblxuICBwcml2YXRlIF9hY3RpdmF0aW9uSW5zdGFudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jbG9zYWJsZSA9IHRydWU7XG5cbiAgcHVibGljIHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGhlYWRpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgZGlydHkgPSBmYWxzZTtcbiAgcHVibGljIHNjcm9sbFRvcCA9IDA7XG4gIHB1YmxpYyBzY3JvbGxMZWZ0ID0gMDtcbiAgcHVibGljIHN0YXRlOiBWaWV3U3RhdGUgPSB7fTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgbWVudUl0ZW1zJDogT2JzZXJ2YWJsZTxXb3JrYmVuY2hNZW51SXRlbVtdPjtcbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrZWRCeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PMm1V29ya2JlbmNoRGlhbG9nIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBwb3J0YWw6IFdiQ29tcG9uZW50UG9ydGFsO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nLCBvcHRpb25zOiB7Y29tcG9uZW50OiBDb21wb25lbnRUeXBlPFZpZXdDb21wb25lbnQ+fSkge1xuICAgIHRoaXMubWVudUl0ZW1zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX21lbnVJdGVtUHJvdmlkZXJzJCwgdGhpcy5fd29ya2JlbmNoU2VydmljZS52aWV3TWVudUl0ZW1Qcm92aWRlcnMkXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKFtsb2NhbE1lbnVJdGVtUHJvdmlkZXJzLCBnbG9iYWxNZW51SXRlbVByb3ZpZGVyc10pID0+IGxvY2FsTWVudUl0ZW1Qcm92aWRlcnMuY29uY2F0KGdsb2JhbE1lbnVJdGVtUHJvdmlkZXJzKSksXG4gICAgICAgIG1hcEFycmF5KG1lbnVJdGVtRmFjdG9yeUZuID0+IG1lbnVJdGVtRmFjdG9yeUZuKHRoaXMpKSxcbiAgICAgICAgZmlsdGVyQXJyYXkoKG1lbnVJdGVtOiBXb3JrYmVuY2hNZW51SXRlbSB8IG51bGwpOiBtZW51SXRlbSBpcyBXb3JrYmVuY2hNZW51SXRlbSA9PiBtZW51SXRlbSAhPT0gbnVsbCksXG4gICAgICApO1xuICAgIHRoaXMucG9ydGFsID0gdGhpcy5jcmVhdGVQb3J0YWwob3B0aW9ucy5jb21wb25lbnQpO1xuICAgIHRoaXMudHJhY2tWaWV3QWN0aXZhdGlvbigpO1xuICAgIHRoaXMudG91Y2hPbkFjdGl2YXRlKCk7XG4gICAgdGhpcy5ibG9ja1doZW5EaWFsb2dPcGVuZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUG9ydGFsKHZpZXdDb21wb25lbnQ6IENvbXBvbmVudFR5cGU8Vmlld0NvbXBvbmVudD4pOiBXYkNvbXBvbmVudFBvcnRhbCB7XG4gICAgcmV0dXJuIG5ldyBXYkNvbXBvbmVudFBvcnRhbCh2aWV3Q29tcG9uZW50LCB7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZVZpZXdDb250ZXh0KHRoaXMpLFxuICAgICAgICAvLyBGb3IgZWFjaCBwcmltYXJ5IHRvcC1sZXZlbCByb3V0ZSwgdGhlIHdvcmtiZW5jaCByZWdpc3RlcnMgY29ycmVzcG9uZGluZyBzZWNvbmRhcnkgdG9wLWxldmVsIHZpZXcgcm91dGVzLlxuICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgd29ya2JlbmNoIGNvbXBvbmVudCBpcyBkaXNwbGF5ZWQgaW4gYSByb3V0ZXIgb3V0bGV0LCB2aWV3IG91dGxldHMgYXJlIG5vdCB0b3AtbGV2ZWwgb3V0bGV0cyBhbnltb3JlLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIGluc3RydWN0IHRoZSB2aWV3J3Mgcm91dGVyIG91dGxldCB0byBhY3QgYXMgYSB0b3AtbGV2ZWwgb3V0bGV0IHRvIGJlIHRoZSB0YXJnZXQgb2YgdGhlIHJlZ2lzdGVyZWQgdG9wLWxldmVsIHZpZXcgcm91dGVzLlxuICAgICAgICB7cHJvdmlkZTogQ2hpbGRyZW5PdXRsZXRDb250ZXh0cywgdXNlVmFsdWU6IGluamVjdChDaGlsZHJlbk91dGxldENvbnRleHRzKX0sXG4gICAgICAgIC8vIFByZXZlbnQgaW5qZWN0aW5nIHRoaXMgcGFydCBpbnRvIHRoZSB2aWV3IGJlY2F1c2UgdGhlIHZpZXcgbWF5IGJlIGRyYWdnZWQgdG8gYSBkaWZmZXJlbnQgcGFydC5cbiAgICAgICAge3Byb3ZpZGU6IFdvcmtiZW5jaFBhcnQsIHVzZUZhY3Rvcnk6ICgpID0+IHRocm93RXJyb3IoYFtOdWxsSW5qZWN0b3JFcnJvcl0gTm8gcHJvdmlkZXIgZm9yICdXb3JrYmVuY2hQYXJ0J2ApfSxcbiAgICAgICAge3Byb3ZpZGU6IMm1V29ya2JlbmNoUGFydCwgdXNlRmFjdG9yeTogKCkgPT4gdGhyb3dFcnJvcihgW051bGxJbmplY3RvckVycm9yXSBObyBwcm92aWRlciBmb3IgJ8m1V29ya2JlbmNoUGFydCdgKX0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpbnZva2VkIHRvIHVwZGF0ZSB0aGlzIHdvcmtiZW5jaCBtb2RlbCBvYmplY3Qgd2hlbiB0aGUgd29ya2JlbmNoIGxheW91dCBjaGFuZ2VzLlxuICAgKi9cbiAgcHVibGljIG9uTGF5b3V0Q2hhbmdlKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJ0SWQgPSBsYXlvdXQucGFydCh7Ynk6IHt2aWV3SWQ6IHRoaXMuaWR9fSkuaWQ7XG4gICAgdGhpcy5fcGFydCQubmV4dCh0aGlzLl9wYXJ0UmVnaXN0cnkuZ2V0KHBhcnRJZCkpO1xuICAgIHRoaXMuc3RhdGUgPSBXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXMuZnJvbU5hdmlnYXRpb24odGhpcy5fcm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uKCkhKT8udmlld1N0YXRlc1t0aGlzLmlkXSA/PyB0aGlzLnN0YXRlID8/IHt9O1xuICAgIHRoaXMuY2xhc3NMaXN0LnNldCh0aGlzLnN0YXRlW1dvcmtiZW5jaE5hdmlnYXRpb25hbFZpZXdTdGF0ZXMuY3NzQ2xhc3NdIGFzIHVuZGVmaW5lZCB8IHN0cmluZyB8IHN0cmluZ1tdLCB7c2NvcGU6ICduYXZpZ2F0aW9uJ30pO1xuICB9XG5cbiAgcHVibGljIGdldCBmaXJzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gdGhpcy5wYXJ0LnZpZXdJZHMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0LnZpZXdJZHMuaW5kZXhPZih0aGlzLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY3NzQ2xhc3MoY3NzQ2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5jbGFzc0xpc3Quc2V0KGNzc0NsYXNzLCB7c2NvcGU6ICdhcHBsaWNhdGlvbid9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5nZXQoe3Njb3BlOiAnYXBwbGljYXRpb24nfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUkLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIHNldCBjbG9zYWJsZShjbG9zYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Nsb3NhYmxlID0gY2xvc2FibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNsb3NhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jbG9zYWJsZSAmJiAhdGhpcy5ibG9ja2VkQnkkLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjdGl2YXRlKG9wdGlvbnM/OiB7c2tpcExvY2F0aW9uQ2hhbmdlPzogYm9vbGVhbn0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5hY3RpdmUgJiYgdGhpcy5wYXJ0LmFjdGl2ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0O1xuICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuybVuYXZpZ2F0ZShcbiAgICAgIGxheW91dCA9PiBjdXJyZW50TGF5b3V0ID09PSBsYXlvdXQgPyBsYXlvdXQuYWN0aXZhdGVWaWV3KHRoaXMuaWQsIHthY3RpdmF0ZVBhcnQ6IHRydWV9KSA6IG51bGwsIC8vIGNhbmNlbCBuYXZpZ2F0aW9uIGlmIHRoZSBsYXlvdXQgaGFzIGJlY29tZSBzdGFsZVxuICAgICAge3NraXBMb2NhdGlvbkNoYW5nZTogb3B0aW9ucz8uc2tpcExvY2F0aW9uQ2hhbmdlfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgdGFiIG9mIHRoaXMgdmlldyBpcyBzY3JvbGxlZCBpbnRvIHZpZXcgaW4gdGhlIHRhYmJhci5cbiAgICovXG4gIHB1YmxpYyBzZXQgc2Nyb2xsZWRJbnRvVmlldyhzY3JvbGxlZEludG9WaWV3OiBib29sZWFuKSB7XG4gICAgaWYgKHNjcm9sbGVkSW50b1ZpZXcgIT09IHRoaXMuX3Njcm9sbGVkSW50b1ZpZXckLnZhbHVlKSB7XG4gICAgICB0aGlzLl9zY3JvbGxlZEludG9WaWV3JC5uZXh0KHNjcm9sbGVkSW50b1ZpZXcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldCBzY3JvbGxlZEludG9WaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zY3JvbGxlZEludG9WaWV3JC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmZvcm1zIHdoZXRoZXIgdGhlIHRhYiBvZiB0aGlzIHZpZXcgaXMgc2Nyb2xsZWQgaW50byB2aWV3IGluIHRoZSB0YWJiYXIuXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50IHN0YXRlIHVwb24gc3Vic2NyaXB0aW9uLCBhbmQgdGhlbiBjb250aW51b3VzbHkgd2hlbiB0aGUgc3RhdGUgY2hhbmdlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsZWRJbnRvVmlldyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbGVkSW50b1ZpZXckO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmF0aW9uSW5zdGFudCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmF0aW9uSW5zdGFudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFydCgpOiBXb3JrYmVuY2hQYXJ0IHtcbiAgICByZXR1cm4gRGVmaW5lZC5vckVsc2VUaHJvdyh0aGlzLl9wYXJ0JC52YWx1ZSwgKCkgPT4gRXJyb3IoYFtOdWxsUGFydEVycm9yXSBQYXJ0IHJlZmVyZW5jZSBtaXNzaW5nIGZvciB2aWV3ICcke3RoaXMuaWR9Jy5gKSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UodGFyZ2V0PzogJ3NlbGYnIHwgJ2FsbC12aWV3cycgfCAnb3RoZXItdmlld3MnIHwgJ3ZpZXdzLXRvLXRoZS1yaWdodCcgfCAndmlld3MtdG8tdGhlLWxlZnQnKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgc3dpdGNoICh0YXJnZXQgfHwgJ3NlbGYnKSB7XG4gICAgICBjYXNlICdzZWxmJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKHRoaXMuaWQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYWxsLXZpZXdzJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnRoaXMucGFydC52aWV3SWRzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ290aGVyLXZpZXdzJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnRoaXMucGFydC52aWV3SWRzLmZpbHRlcih2aWV3SWQgPT4gdmlld0lkICE9PSB0aGlzLmlkKSk7XG4gICAgICB9XG4gICAgICBjYXNlICd2aWV3cy10by10aGUtcmlnaHQnOiB7XG4gICAgICAgIGNvbnN0IHZpZXdJZHMgPSB0aGlzLnBhcnQudmlld0lkcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UuY2xvc2VWaWV3cyguLi52aWV3SWRzLnNsaWNlKHZpZXdJZHMuaW5kZXhPZih0aGlzLmlkKSArIDEpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdzLXRvLXRoZS1sZWZ0Jzoge1xuICAgICAgICBjb25zdCB2aWV3SWRzID0gdGhpcy5wYXJ0LnZpZXdJZHM7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLmNsb3NlVmlld3MoLi4udmlld0lkcy5zbGljZSgwLCB2aWV3SWRzLmluZGV4T2YodGhpcy5pZCkpKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vdmUodGFyZ2V0OiAnbmV3LXdpbmRvdycpOiB2b2lkO1xuICBwdWJsaWMgbW92ZShwYXJ0SWQ6IHN0cmluZywgb3B0aW9ucz86IHtyZWdpb24/OiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICd3ZXN0JyB8ICdlYXN0Jzsgd29ya2JlbmNoSWQ/OiBzdHJpbmd9KTogdm9pZDtcbiAgcHVibGljIG1vdmUodGFyZ2V0OiAnbmV3LXdpbmRvdycgfCBzdHJpbmcsIG9wdGlvbnM/OiB7cmVnaW9uPzogJ25vcnRoJyB8ICdzb3V0aCcgfCAnd2VzdCcgfCAnZWFzdCc7IHdvcmtiZW5jaElkPzogc3RyaW5nfSk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgIHdvcmtiZW5jaElkOiB0aGlzLl93b3JrYmVuY2hJZCxcbiAgICAgIHBhcnRJZDogdGhpcy5wYXJ0LmlkLFxuICAgICAgdmlld0lkOiB0aGlzLmlkLFxuICAgICAgdmlld1VybFNlZ21lbnRzOiB0aGlzLnVybFNlZ21lbnRzLFxuICAgICAgY2xhc3NMaXN0OiB0aGlzLmNsYXNzTGlzdC50b01hcCgpLFxuICAgIH07XG5cbiAgICBpZiAodGFyZ2V0ID09PSAnbmV3LXdpbmRvdycpIHtcbiAgICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS5kaXNwYXRjaFZpZXdNb3ZlRXZlbnQoe3NvdXJjZSwgdGFyZ2V0OiB7d29ya2JlbmNoSWQ6ICduZXctd2luZG93J319KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl92aWV3RHJhZ1NlcnZpY2UuZGlzcGF0Y2hWaWV3TW92ZUV2ZW50KHtcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldCxcbiAgICAgICAgICByZWdpb246IG9wdGlvbnMhLnJlZ2lvbixcbiAgICAgICAgICB3b3JrYmVuY2hJZDogb3B0aW9ucyEud29ya2JlbmNoSWQgPz8gdGhpcy5fd29ya2JlbmNoSWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybFNlZ21lbnRzKCk6IFVybFNlZ21lbnRbXSB7XG4gICAgY29uc3QgdXJsVHJlZSA9IHRoaXMuX3JvdXRlci5wYXJzZVVybCh0aGlzLl9yb3V0ZXIudXJsKTtcbiAgICByZXR1cm4gdXJsVHJlZS5yb290LmNoaWxkcmVuW3RoaXMuaWRdPy5zZWdtZW50cyA/PyBbXTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck1lbnVJdGVtKG1lbnVJdGVtOiBXb3JrYmVuY2hNZW51SXRlbSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGZhY3RvcnlGbiA9ICgpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiBtZW51SXRlbTtcbiAgICB0aGlzLl9tZW51SXRlbVByb3ZpZGVycyQubmV4dCh0aGlzLl9tZW51SXRlbVByb3ZpZGVycyQudmFsdWUuY29uY2F0KGZhY3RvcnlGbikpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwb3NlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC5uZXh0KHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC52YWx1ZS5maWx0ZXIoaXQgPT4gaXQgIT09IGZhY3RvcnlGbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBhZGFwdGVyIGZvciB0aGlzIHZpZXcsIHJlcGxhY2luZyBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGFkYXB0ZXIgb2YgdGhlIHNhbWUgdHlwZS5cbiAgICpcbiAgICogQWRhcHRlcnMgZW5hYmxlIGxvb3NlbHkgY291cGxlZCBleHRlbnNpb24gb2YgYW4gb2JqZWN0LCBhbGxvd2luZyBvbmUgb2JqZWN0IHRvIGJlIGFkYXB0ZWQgdG8gYW5vdGhlci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckFkYXB0ZXI8VD4oYWRhcHRlclR5cGU6IEFic3RyYWN0VHlwZTxUPiB8IFR5cGU8VD4sIG9iamVjdDogVCk6IHZvaWQge1xuICAgIHRoaXMuX2FkYXB0ZXJzLnNldChhZGFwdGVyVHlwZSwgb2JqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyB0aGUgZ2l2ZW4gYWRhcHRlci4gSGFzIG5vIGVmZmVjdCBpZiBub3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyQWRhcHRlcihhZGFwdGVyVHlwZTogQWJzdHJhY3RUeXBlPHVua25vd24+IHwgVHlwZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuX2FkYXB0ZXJzLmRlbGV0ZShhZGFwdGVyVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRhcHRzIHRoaXMgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gUmV0dXJucyBgbnVsbGAgaWYgbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGFkYXB0PFQ+KGFkYXB0ZXJUeXBlOiBBYnN0cmFjdFR5cGU8VD4gfCBUeXBlPFQ+KTogVCB8IG51bGwge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVycy5nZXQoYWRhcHRlclR5cGUpO1xuICAgIHJldHVybiBhZGFwdGVyID8gYWRhcHRlciBhcyBUIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBvcnRhbC5pc0Rlc3Ryb3llZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb25pdG9ycyB0aGUgYXNzb2NpYXRlZCBwYXJ0IHRvIGNoZWNrIGlmIHRoaXMgdmlldyBpcyBjdXJyZW50bHkgYWN0aXZlLCB1cGRhdGluZyB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoaXMgdmlldyBhY2NvcmRpbmdseS5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tWaWV3QWN0aXZhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJ0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChwYXJ0ID0+IHBhcnQ/LmFjdGl2ZVZpZXdJZCQgPz8gRU1QVFkpLFxuICAgICAgICBtYXAoYWN0aXZlVmlld0lkID0+IGFjdGl2ZVZpZXdJZCA9PT0gdGhpcy5pZCksXG4gICAgICAgIGJ1ZmZlckxhdGVzdFVudGlsTGF5b3V0Q2hhbmdlKCksIC8vIFByZXZlbnQgdGhlIChkZS0pYWN0aXZhdGlvbiBvZiBwb3RlbnRpYWxseSB3cm9uZyB2aWV3cyB3aGlsZSB1cGRhdGluZyB0aGUgbGF5b3V0LlxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuYWN0aXZlJCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgYWN0aXZhdGlvbiBpbnN0YW50IHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgdG91Y2hPbkFjdGl2YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25JbnN0YW50ID0gdGhpcy5fYWN0aXZhdGlvbkluc3RhbnRQcm92aWRlci5ub3coKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB0aGlzIHZpZXcgd2hlbiBhIGRpYWxvZyBvdmVybGF5cyBpdC5cbiAgICovXG4gIHByaXZhdGUgYmxvY2tXaGVuRGlhbG9nT3BlbmVkKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5LnRvcCQoe3ZpZXdJZDogdGhpcy5pZH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuYmxvY2tlZEJ5JCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95UmVmLmRlc3Ryb3koKTtcbiAgICB0aGlzLl93b3JrYmVuY2hEaWFsb2dSZWdpc3RyeS5kaWFsb2dzKHt2aWV3SWQ6IHRoaXMuaWR9KS5mb3JFYWNoKGRpYWxvZyA9PiBkaWFsb2cuZGVzdHJveSgpKTtcbiAgICB0aGlzLnBvcnRhbC5kZXN0cm95KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcHNldWRvLXR5cGUgZm9yIHRoZSBhY3R1YWwge0BsaW5rIFZpZXdDb21wb25lbnR9IHdoaWNoIG11c3Qgbm90IGJlIHJlZmVyZW5jZWQgaW4gb3JkZXIgdG8gYXZvaWQgaW1wb3J0IGN5Y2xlcy5cbiAqL1xudHlwZSBWaWV3Q29tcG9uZW50ID0gYW55O1xuIl19
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtdmlldy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxRQUFRLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVGLE9BQU8sRUFBeUIsZUFBZSxFQUFFLHNCQUFzQixFQUFTLE1BQU0sRUFBMEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN4SSxPQUFPLEVBQUMsZUFBZSxFQUFzQixNQUFNLCtCQUErQixDQUFDO0FBQ25GLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUd0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFlLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxx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LEtBQTBCLEVBQTRCLEVBQUUsQ0FBQyxLQUFLLFlBQVksZUFBZSxDQUFDLEVBQ2xHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQ25FLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFDNUIsU0FBUyxDQUFDLG1CQUFvQixDQUFDLEVBQy9CLFFBQVEsRUFBRSxFQUNWLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDckM7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQTBELEVBQUUsRUFBRTtZQUMxRixrRUFBa0U7WUFDbEUscUhBQXFIO1lBQ3JILElBQUksUUFBUSxFQUFFLFdBQVcsS0FBSyxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9CO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIEVNUFRZLCBPYnNlcnZhYmxlLCBwYWlyd2lzZSwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQWN0aXZhdGlvblN0YXJ0LCBDaGlsZHJlbk91dGxldENvbnRleHRzLCBFdmVudCwgUm91dGVyLCBSb3V0ZXJFdmVudCwgVXJsU2VnbWVudH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Vmlld0RyYWdTZXJ2aWNlLCBWaWV3TW92ZUV2ZW50U291cmNlfSBmcm9tICcuLi92aWV3LWRuZC92aWV3LWRyYWcuc2VydmljZSc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc3RhcnRXaXRofSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBtYXBBcnJheX0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7RGVmaW5lZH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge0Rpc3Bvc2FibGV9IGZyb20gJy4uL2NvbW1vbi9kaXNwb3NhYmxlJztcbmltcG9ydCB7dGhyb3dFcnJvcn0gZnJvbSAnLi4vY29tbW9uL3Rocm93LWVycm9yLnV0aWwnO1xuaW1wb3J0IHtXb3JrYmVuY2hNZW51SXRlbSwgV29ya2JlbmNoTWVudUl0ZW1GYWN0b3J5Rm59IGZyb20gJy4uL3dvcmtiZW5jaC5tb2RlbCc7XG5pbXBvcnQge1ZpZXdJZCwgV29ya2JlbmNoVmlld30gZnJvbSAnLi93b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaFBhcnR9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFNlcnZpY2V9IGZyb20gJy4uL8m1d29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtDb21wb25lbnRUeXBlfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7V2JDb21wb25lbnRQb3J0YWx9IGZyb20gJy4uL3BvcnRhbC93Yi1jb21wb25lbnQtcG9ydGFsJztcbmltcG9ydCB7QWJzdHJhY3RUeXBlLCBpbmplY3QsIEluamVjdG9yLCBUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7ybVXb3JrYmVuY2hQYXJ0fSBmcm9tICcuLi9wYXJ0L8m1d29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHtBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyfSBmcm9tICcuLi9hY3RpdmF0aW9uLWluc3RhbnQucHJvdmlkZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4uL3JvdXRpbmcvd29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7V29ya2JlbmNoUGFydFJlZ2lzdHJ5fSBmcm9tICcuLi9wYXJ0L3dvcmtiZW5jaC1wYXJ0LnJlZ2lzdHJ5JztcbmltcG9ydCB7ybVXb3JrYmVuY2hMYXlvdXR9IGZyb20gJy4uL2xheW91dC/JtXdvcmtiZW5jaC1sYXlvdXQnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7YnVmZmVyTGF0ZXN0VW50aWxMYXlvdXRDaGFuZ2V9IGZyb20gJy4uL2NvbW1vbi9vcGVyYXRvcnMnO1xuaW1wb3J0IHtXb3JrYmVuY2hEaWFsb2dSZWdpc3RyeX0gZnJvbSAnLi4vZGlhbG9nL3dvcmtiZW5jaC1kaWFsb2cucmVnaXN0cnknO1xuaW1wb3J0IHvJtURlc3Ryb3lSZWZ9IGZyb20gJy4uL2NvbW1vbi/JtWRlc3Ryb3ktcmVmJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHvJtVdvcmtiZW5jaERpYWxvZ30gZnJvbSAnLi4vZGlhbG9nL8m1d29ya2JlbmNoLWRpYWxvZyc7XG5pbXBvcnQge0Jsb2NrYWJsZX0gZnJvbSAnLi4vZ2xhc3MtcGFuZS9ibG9ja2FibGUnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfSUR9IGZyb20gJy4uL3dvcmtiZW5jaC1pZCc7XG5pbXBvcnQge0NsYXNzTGlzdH0gZnJvbSAnLi4vY29tbW9uL2NsYXNzLWxpc3QnO1xuaW1wb3J0IHtWaWV3U3RhdGV9IGZyb20gJy4uL3JvdXRpbmcvcm91dGluZy5tb2RlbCc7XG5pbXBvcnQge1JvdXRlclV0aWxzfSBmcm9tICcuLi9yb3V0aW5nL3JvdXRlci51dGlsJztcbmltcG9ydCB7V29ya2JlbmNoUm91dGVEYXRhfSBmcm9tICcuLi9yb3V0aW5nL3dvcmtiZW5jaC1yb3V0ZS1kYXRhJztcbmltcG9ydCB7VVVJRH0gZnJvbSAnLi4vY29tbW9uL3V1aWQudXRpbCc7XG5cbmV4cG9ydCBjbGFzcyDJtVdvcmtiZW5jaFZpZXcgaW1wbGVtZW50cyBXb3JrYmVuY2hWaWV3LCBCbG9ja2FibGUge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaElkID0gaW5qZWN0KFdPUktCRU5DSF9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaFNlcnZpY2UgPSBpbmplY3QoybVXb3JrYmVuY2hTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTGF5b3V0U2VydmljZSA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaFJvdXRlciA9IGluamVjdChXb3JrYmVuY2hSb3V0ZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jaGlsZHJlbk91dGxldENvbnRleHRzID0gaW5qZWN0KENoaWxkcmVuT3V0bGV0Q29udGV4dHMpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJ0UmVnaXN0cnkgPSBpbmplY3QoV29ya2JlbmNoUGFydFJlZ2lzdHJ5KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmlld0RyYWdTZXJ2aWNlID0gaW5qZWN0KFZpZXdEcmFnU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2YXRpb25JbnN0YW50UHJvdmlkZXIgPSBpbmplY3QoQWN0aXZhdGlvbkluc3RhbnRQcm92aWRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5ID0gaW5qZWN0KFdvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJ0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8ybVXb3JrYmVuY2hQYXJ0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZW51SXRlbVByb3ZpZGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdvcmtiZW5jaE1lbnVJdGVtRmFjdG9yeUZuW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2Nyb2xsZWRJbnRvVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVycyA9IG5ldyBNYXA8VHlwZTx1bmtub3duPiB8IEFic3RyYWN0VHlwZTx1bmtub3duPiwgdW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IG5ldyDJtURlc3Ryb3lSZWYoKTtcblxuICBwcml2YXRlIF9hY3RpdmF0aW9uSW5zdGFudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jbG9zYWJsZSA9IHRydWU7XG5cbiAgcHVibGljIHVpZCE6IFVVSUQ7XG4gIHB1YmxpYyBhbHRlcm5hdGl2ZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBuYXZpZ2F0aW9uSGludDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdXJsU2VnbWVudHM6IFVybFNlZ21lbnRbXSA9IFtdO1xuICBwdWJsaWMgc3RhdGU6IFZpZXdTdGF0ZSA9IHt9O1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgaGVhZGluZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBkaXJ0eSA9IGZhbHNlO1xuICBwdWJsaWMgc2Nyb2xsVG9wID0gMDtcbiAgcHVibGljIHNjcm9sbExlZnQgPSAwO1xuXG4gIHB1YmxpYyByZWFkb25seSBhY3RpdmUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBtZW51SXRlbXMkOiBPYnNlcnZhYmxlPFdvcmtiZW5jaE1lbnVJdGVtW10+O1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tlZEJ5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8ybVXb3JrYmVuY2hEaWFsb2cgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHBvcnRhbDogV2JDb21wb25lbnRQb3J0YWw7XG4gIHB1YmxpYyByZWFkb25seSBjbGFzc0xpc3QgPSBuZXcgQ2xhc3NMaXN0KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBWaWV3SWQsIG9wdGlvbnM6IHtjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8Vmlld0NvbXBvbmVudD59KSB7XG4gICAgdGhpcy5tZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLCB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnZpZXdNZW51SXRlbVByb3ZpZGVycyRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoW2xvY2FsTWVudUl0ZW1Qcm92aWRlcnMsIGdsb2JhbE1lbnVJdGVtUHJvdmlkZXJzXSkgPT4gbG9jYWxNZW51SXRlbVByb3ZpZGVycy5jb25jYXQoZ2xvYmFsTWVudUl0ZW1Qcm92aWRlcnMpKSxcbiAgICAgICAgbWFwQXJyYXkobWVudUl0ZW1GYWN0b3J5Rm4gPT4gbWVudUl0ZW1GYWN0b3J5Rm4odGhpcykpLFxuICAgICAgICBmaWx0ZXJBcnJheSgobWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtIHwgbnVsbCk6IG1lbnVJdGVtIGlzIFdvcmtiZW5jaE1lbnVJdGVtID0+IG1lbnVJdGVtICE9PSBudWxsKSxcbiAgICAgICk7XG4gICAgdGhpcy5wb3J0YWwgPSB0aGlzLmNyZWF0ZVBvcnRhbChvcHRpb25zLmNvbXBvbmVudCk7XG4gICAgdGhpcy50cmFja1ZpZXdBY3RpdmF0aW9uKCk7XG4gICAgdGhpcy50b3VjaE9uQWN0aXZhdGUoKTtcbiAgICB0aGlzLmJsb2NrV2hlbkRpYWxvZ09wZW5lZCgpO1xuICAgIHRoaXMuZGV0ZWN0Um91dGVBY3RpdmF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBvcnRhbCh2aWV3Q29tcG9uZW50OiBDb21wb25lbnRUeXBlPFZpZXdDb21wb25lbnQ+KTogV2JDb21wb25lbnRQb3J0YWwge1xuICAgIHJldHVybiBuZXcgV2JDb21wb25lbnRQb3J0YWwodmlld0NvbXBvbmVudCwge1xuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVWaWV3Q29udGV4dCh0aGlzKSxcbiAgICAgICAgLy8gRm9yIGVhY2ggdmlldywgdGhlIHdvcmtiZW5jaCByZWdpc3RlcnMgYXV4aWxpYXJ5IHJvdXRlcyBvZiBhbGwgdG9wLWxldmVsIHJvdXRlcywgZW5hYmxpbmcgcm91dGluZyBvbiBhIHBlci12aWV3IGJhc2lzLlxuICAgICAgICAvLyBCdXQsIGlmIHRoZSB3b3JrYmVuY2ggY29tcG9uZW50IGl0c2VsZiBpcyBkaXNwbGF5ZWQgaW4gYSByb3V0ZXIgb3V0bGV0LCB2aWV3IG91dGxldHMgYXJlIG5vdCB0b3AtbGV2ZWwgb3V0bGV0cy5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBpbnN0cnVjdCB0aGUgb3V0bGV0IHRvIGFjdCBhcyBhIHRvcC1sZXZlbCBvdXRsZXQgdG8gYmUgdGhlIHRhcmdldCBvZiB0aGUgcmVnaXN0ZXJlZCB0b3AtbGV2ZWwgdmlldyByb3V0ZXMuXG4gICAgICAgIHtwcm92aWRlOiBDaGlsZHJlbk91dGxldENvbnRleHRzLCB1c2VWYWx1ZTogdGhpcy5fY2hpbGRyZW5PdXRsZXRDb250ZXh0c30sXG4gICAgICAgIC8vIFByZXZlbnQgaW5qZWN0aW5nIHRoaXMgcGFydCBpbnRvIHRoZSB2aWV3IGJlY2F1c2UgdGhlIHZpZXcgbWF5IGJlIGRyYWdnZWQgdG8gYSBkaWZmZXJlbnQgcGFydC5cbiAgICAgICAge3Byb3ZpZGU6IFdvcmtiZW5jaFBhcnQsIHVzZUZhY3Rvcnk6ICgpID0+IHRocm93RXJyb3IoYFtOdWxsSW5qZWN0b3JFcnJvcl0gTm8gcHJvdmlkZXIgZm9yICdXb3JrYmVuY2hQYXJ0J2ApfSxcbiAgICAgICAge3Byb3ZpZGU6IMm1V29ya2JlbmNoUGFydCwgdXNlRmFjdG9yeTogKCkgPT4gdGhyb3dFcnJvcihgW051bGxJbmplY3RvckVycm9yXSBObyBwcm92aWRlciBmb3IgJ8m1V29ya2JlbmNoUGFydCdgKX0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpbnZva2VkIHdoZW4gYSByb3V0ZSBpcyBhYm91dCB0byBiZSBhY3RpdmF0ZWQgZm9yIHRoaXMgdmlldy5cbiAgICovXG4gIHByaXZhdGUgb25Sb3V0ZUFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogdm9pZCB7XG4gICAgdGhpcy50aXRsZSA9IFJvdXRlclV0aWxzLmxvb2t1cFJvdXRlRGF0YShyb3V0ZSwgV29ya2JlbmNoUm91dGVEYXRhLnRpdGxlKSA/PyBudWxsO1xuICAgIHRoaXMuaGVhZGluZyA9IFJvdXRlclV0aWxzLmxvb2t1cFJvdXRlRGF0YShyb3V0ZSwgV29ya2JlbmNoUm91dGVEYXRhLmhlYWRpbmcpID8/IG51bGw7XG4gICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIHRoaXMuY2xhc3NMaXN0LnNldChSb3V0ZXJVdGlscy5sb29rdXBSb3V0ZURhdGEocm91dGUsIFdvcmtiZW5jaFJvdXRlRGF0YS5jc3NDbGFzcyksIHtzY29wZTogJ3JvdXRlJ30pO1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSh7c2NvcGU6ICdhcHBsaWNhdGlvbid9KTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoe3Njb3BlOiAnbmF2aWdhdGlvbid9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaW52b2tlZCB3aGVuIHRoZSB3b3JrYmVuY2ggbGF5b3V0IGhhcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZDpcbiAgICogLSBpcyBjYWxsZWQgb24gZXZlcnkgbGF5b3V0IGNoYW5nZSwgaW5jbHVkaW5nIGNoYW5nZXMgbm90IHJlbGV2YW50IGZvciB0aGlzIHZpZXcuXG4gICAqIC0gaXMgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvbiwgaS5lLiwgYWZ0ZXIge0BsaW5rIG9uUm91dGVBY3RpdmF0ZX0uXG4gICAqL1xuICBwdWJsaWMgb25MYXlvdXRDaGFuZ2UobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCk6IHZvaWQge1xuICAgIGNvbnN0IG1QYXJ0ID0gbGF5b3V0LnBhcnQoe3ZpZXdJZDogdGhpcy5pZH0pO1xuICAgIGNvbnN0IG1WaWV3ID0gbGF5b3V0LnZpZXcoe3ZpZXdJZDogdGhpcy5pZH0pO1xuICAgIHRoaXMudWlkID0gbVZpZXcudWlkO1xuICAgIHRoaXMuYWx0ZXJuYXRpdmVJZCA9IG1WaWV3LmFsdGVybmF0aXZlSWQ7XG4gICAgdGhpcy51cmxTZWdtZW50cyA9IGxheW91dC51cmxTZWdtZW50cyh7dmlld0lkOiB0aGlzLmlkfSk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uSGludCA9IG1WaWV3Lm5hdmlnYXRpb24/LmhpbnQ7XG4gICAgdGhpcy5zdGF0ZSA9IGxheW91dC52aWV3U3RhdGUoe3ZpZXdJZDogdGhpcy5pZH0pO1xuICAgIHRoaXMuY2xhc3NMaXN0LnNldChtVmlldy5jc3NDbGFzcywge3Njb3BlOiAnbGF5b3V0J30pO1xuICAgIHRoaXMuY2xhc3NMaXN0LnNldChtVmlldy5uYXZpZ2F0aW9uPy5jc3NDbGFzcywge3Njb3BlOiAnbmF2aWdhdGlvbid9KTtcbiAgICB0aGlzLl9wYXJ0JC5uZXh0KHRoaXMuX3BhcnRSZWdpc3RyeS5nZXQobVBhcnQuaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgb2YgdGhpcyB2aWV3LiBSZXR1cm5zIGBudWxsYCBpZiBub3QgbmF2aWdhdGVkIHRoZSB2aWV3LCBvciBiZWZvcmUgaXQgd2FzIGFjdGl2YXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcG9uZW50PFQgPSB1bmtub3duPigpOiBUIHwgbnVsbCB7XG4gICAgY29uc3Qgb3V0bGV0Q29udGV4dCA9IFJvdXRlclV0aWxzLnJlc29sdmVFZmZlY3RpdmVPdXRsZXRDb250ZXh0KHRoaXMuX2NoaWxkcmVuT3V0bGV0Q29udGV4dHMuZ2V0Q29udGV4dCh0aGlzLmlkKSk7XG4gICAgY29uc3Qgb3V0bGV0ID0gb3V0bGV0Q29udGV4dD8ub3V0bGV0O1xuICAgIHJldHVybiBvdXRsZXQ/LmlzQWN0aXZhdGVkID8gb3V0bGV0LmNvbXBvbmVudCBhcyBUIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmplY3RvciBvZiB0aGUgY29tcG9uZW50LiBSZXR1cm5zIGBudWxsYCBpZiBub3QgbmF2aWdhdGVkIHRoZSB2aWV3LCBvciBiZWZvcmUgaXQgd2FzIGFjdGl2YXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5qZWN0b3IoKTogSW5qZWN0b3IgfCBudWxsIHtcbiAgICBjb25zdCBvdXRsZXRDb250ZXh0ID0gUm91dGVyVXRpbHMucmVzb2x2ZUVmZmVjdGl2ZU91dGxldENvbnRleHQodGhpcy5fY2hpbGRyZW5PdXRsZXRDb250ZXh0cy5nZXRDb250ZXh0KHRoaXMuaWQpKTtcbiAgICByZXR1cm4gb3V0bGV0Q29udGV4dD8uaW5qZWN0b3IgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGZpcnN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uID09PSAwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgbGFzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gdGhpcy5wYXJ0LnZpZXdJZHMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFydC52aWV3SWRzLmluZGV4T2YodGhpcy5pZCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIHNldCBjc3NDbGFzcyhjc3NDbGFzczogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5zZXQoY3NzQ2xhc3MsIHtzY29wZTogJ2FwcGxpY2F0aW9uJ30pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5nZXQoe3Njb3BlOiAnYXBwbGljYXRpb24nfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlJC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgc2V0IGNsb3NhYmxlKGNsb3NhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2xvc2FibGUgPSBjbG9zYWJsZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGNsb3NhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jbG9zYWJsZSAmJiAhdGhpcy5ibG9ja2VkQnkkLnZhbHVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZShvcHRpb25zPzoge3NraXBMb2NhdGlvbkNoYW5nZT86IGJvb2xlYW59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWN0aXZlICYmIHRoaXMucGFydC5hY3RpdmUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dDtcbiAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoUm91dGVyLm5hdmlnYXRlKFxuICAgICAgbGF5b3V0ID0+IGN1cnJlbnRMYXlvdXQgPT09IGxheW91dCA/IGxheW91dC5hY3RpdmF0ZVZpZXcodGhpcy5pZCwge2FjdGl2YXRlUGFydDogdHJ1ZX0pIDogbnVsbCwgLy8gY2FuY2VsIG5hdmlnYXRpb24gaWYgdGhlIGxheW91dCBoYXMgYmVjb21lIHN0YWxlXG4gICAgICB7c2tpcExvY2F0aW9uQ2hhbmdlOiBvcHRpb25zPy5za2lwTG9jYXRpb25DaGFuZ2V9LFxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIHNldCBzY3JvbGxlZEludG9WaWV3KHNjcm9sbGVkSW50b1ZpZXc6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2Nyb2xsZWRJbnRvVmlldyAhPT0gdGhpcy5fc2Nyb2xsZWRJbnRvVmlldyQudmFsdWUpIHtcbiAgICAgIHRoaXMuX3Njcm9sbGVkSW50b1ZpZXckLm5leHQoc2Nyb2xsZWRJbnRvVmlldyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsZWRJbnRvVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsZWRJbnRvVmlldyQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSW5mb3JtcyB3aGV0aGVyIHRoZSB0YWIgb2YgdGhpcyB2aWV3IGlzIHNjcm9sbGVkIGludG8gdmlldyBpbiB0aGUgdGFiYmFyLlxuICAgKiBFbWl0cyB0aGUgY3VycmVudCBzdGF0ZSB1cG9uIHN1YnNjcmlwdGlvbiwgYW5kIHRoZW4gY29udGludW91c2x5IHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNjcm9sbGVkSW50b1ZpZXckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9zY3JvbGxlZEludG9WaWV3JDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZhdGlvbkluc3RhbnQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZhdGlvbkluc3RhbnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBwYXJ0KCk6IFdvcmtiZW5jaFBhcnQge1xuICAgIHJldHVybiBEZWZpbmVkLm9yRWxzZVRocm93KHRoaXMuX3BhcnQkLnZhbHVlLCAoKSA9PiBFcnJvcihgW051bGxQYXJ0RXJyb3JdIFBhcnQgcmVmZXJlbmNlIG1pc3NpbmcgZm9yIHZpZXcgJyR7dGhpcy5pZH0nLmApKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgY2xvc2UodGFyZ2V0PzogJ3NlbGYnIHwgJ2FsbC12aWV3cycgfCAnb3RoZXItdmlld3MnIHwgJ3ZpZXdzLXRvLXRoZS1yaWdodCcgfCAndmlld3MtdG8tdGhlLWxlZnQnKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgc3dpdGNoICh0YXJnZXQgfHwgJ3NlbGYnKSB7XG4gICAgICBjYXNlICdzZWxmJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKHRoaXMuaWQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYWxsLXZpZXdzJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnRoaXMucGFydC52aWV3SWRzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ290aGVyLXZpZXdzJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnRoaXMucGFydC52aWV3SWRzLmZpbHRlcih2aWV3SWQgPT4gdmlld0lkICE9PSB0aGlzLmlkKSk7XG4gICAgICB9XG4gICAgICBjYXNlICd2aWV3cy10by10aGUtcmlnaHQnOiB7XG4gICAgICAgIGNvbnN0IHZpZXdJZHMgPSB0aGlzLnBhcnQudmlld0lkcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UuY2xvc2VWaWV3cyguLi52aWV3SWRzLnNsaWNlKHZpZXdJZHMuaW5kZXhPZih0aGlzLmlkKSArIDEpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdzLXRvLXRoZS1sZWZ0Jzoge1xuICAgICAgICBjb25zdCB2aWV3SWRzID0gdGhpcy5wYXJ0LnZpZXdJZHM7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLmNsb3NlVmlld3MoLi4udmlld0lkcy5zbGljZSgwLCB2aWV3SWRzLmluZGV4T2YodGhpcy5pZCkpKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBtb3ZlKHRhcmdldDogJ25ldy13aW5kb3cnKTogdm9pZDtcbiAgcHVibGljIG1vdmUocGFydElkOiBzdHJpbmcsIG9wdGlvbnM/OiB7cmVnaW9uPzogJ25vcnRoJyB8ICdzb3V0aCcgfCAnd2VzdCcgfCAnZWFzdCc7IHdvcmtiZW5jaElkPzogc3RyaW5nfSk6IHZvaWQ7XG4gIHB1YmxpYyBtb3ZlKHRhcmdldDogJ25ldy13aW5kb3cnIHwgc3RyaW5nLCBvcHRpb25zPzoge3JlZ2lvbj86ICdub3J0aCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2Vhc3QnOyB3b3JrYmVuY2hJZD86IHN0cmluZ30pOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2U6IFZpZXdNb3ZlRXZlbnRTb3VyY2UgPSB7XG4gICAgICB3b3JrYmVuY2hJZDogdGhpcy5fd29ya2JlbmNoSWQsXG4gICAgICBwYXJ0SWQ6IHRoaXMucGFydC5pZCxcbiAgICAgIHZpZXdJZDogdGhpcy5pZCxcbiAgICAgIGFsdGVybmF0aXZlVmlld0lkOiB0aGlzLmFsdGVybmF0aXZlSWQsXG4gICAgICB2aWV3VXJsU2VnbWVudHM6IHRoaXMudXJsU2VnbWVudHMsXG4gICAgICBuYXZpZ2F0aW9uSGludDogdGhpcy5uYXZpZ2F0aW9uSGludCxcbiAgICAgIGNsYXNzTGlzdDogdGhpcy5jbGFzc0xpc3QudG9NYXAoKSxcbiAgICB9O1xuXG4gICAgaWYgKHRhcmdldCA9PT0gJ25ldy13aW5kb3cnKSB7XG4gICAgICB0aGlzLl92aWV3RHJhZ1NlcnZpY2UuZGlzcGF0Y2hWaWV3TW92ZUV2ZW50KHtzb3VyY2UsIHRhcmdldDoge3dvcmtiZW5jaElkOiAnbmV3LXdpbmRvdyd9fSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLmRpc3BhdGNoVmlld01vdmVFdmVudCh7XG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQsXG4gICAgICAgICAgcmVnaW9uOiBvcHRpb25zIS5yZWdpb24sXG4gICAgICAgICAgd29ya2JlbmNoSWQ6IG9wdGlvbnMhLndvcmtiZW5jaElkID8/IHRoaXMuX3dvcmtiZW5jaElkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyByZWdpc3Rlck1lbnVJdGVtKG1lbnVJdGVtOiBXb3JrYmVuY2hNZW51SXRlbSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGZhY3RvcnlGbiA9ICgpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiBtZW51SXRlbTtcbiAgICB0aGlzLl9tZW51SXRlbVByb3ZpZGVycyQubmV4dCh0aGlzLl9tZW51SXRlbVByb3ZpZGVycyQudmFsdWUuY29uY2F0KGZhY3RvcnlGbikpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwb3NlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC5uZXh0KHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC52YWx1ZS5maWx0ZXIoaXQgPT4gaXQgIT09IGZhY3RvcnlGbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBhZGFwdGVyIGZvciB0aGlzIHZpZXcsIHJlcGxhY2luZyBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGFkYXB0ZXIgb2YgdGhlIHNhbWUgdHlwZS5cbiAgICpcbiAgICogQWRhcHRlcnMgZW5hYmxlIGxvb3NlbHkgY291cGxlZCBleHRlbnNpb24gb2YgYW4gb2JqZWN0LCBhbGxvd2luZyBvbmUgb2JqZWN0IHRvIGJlIGFkYXB0ZWQgdG8gYW5vdGhlci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckFkYXB0ZXI8VD4oYWRhcHRlclR5cGU6IEFic3RyYWN0VHlwZTxUPiB8IFR5cGU8VD4sIG9iamVjdDogVCk6IHZvaWQge1xuICAgIHRoaXMuX2FkYXB0ZXJzLnNldChhZGFwdGVyVHlwZSwgb2JqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyB0aGUgZ2l2ZW4gYWRhcHRlci4gSGFzIG5vIGVmZmVjdCBpZiBub3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyQWRhcHRlcihhZGFwdGVyVHlwZTogQWJzdHJhY3RUeXBlPHVua25vd24+IHwgVHlwZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuX2FkYXB0ZXJzLmRlbGV0ZShhZGFwdGVyVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRhcHRzIHRoaXMgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gUmV0dXJucyBgbnVsbGAgaWYgbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGFkYXB0PFQ+KGFkYXB0ZXJUeXBlOiBBYnN0cmFjdFR5cGU8VD4gfCBUeXBlPFQ+KTogVCB8IG51bGwge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVycy5nZXQoYWRhcHRlclR5cGUpO1xuICAgIHJldHVybiBhZGFwdGVyID8gYWRhcHRlciBhcyBUIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBvcnRhbC5pc0Rlc3Ryb3llZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb25pdG9ycyB0aGUgYXNzb2NpYXRlZCBwYXJ0IHRvIGNoZWNrIGlmIHRoaXMgdmlldyBpcyBjdXJyZW50bHkgYWN0aXZlLCB1cGRhdGluZyB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoaXMgdmlldyBhY2NvcmRpbmdseS5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tWaWV3QWN0aXZhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJ0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChwYXJ0ID0+IHBhcnQ/LmFjdGl2ZVZpZXdJZCQgPz8gRU1QVFkpLFxuICAgICAgICBtYXAoYWN0aXZlVmlld0lkID0+IGFjdGl2ZVZpZXdJZCA9PT0gdGhpcy5pZCksXG4gICAgICAgIGJ1ZmZlckxhdGVzdFVudGlsTGF5b3V0Q2hhbmdlKCksIC8vIFByZXZlbnQgdGhlIChkZS0pYWN0aXZhdGlvbiBvZiBwb3RlbnRpYWxseSB3cm9uZyB2aWV3cyB3aGlsZSB1cGRhdGluZyB0aGUgbGF5b3V0LlxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuYWN0aXZlJCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgYWN0aXZhdGlvbiBpbnN0YW50IHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgdG91Y2hPbkFjdGl2YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25JbnN0YW50ID0gdGhpcy5fYWN0aXZhdGlvbkluc3RhbnRQcm92aWRlci5ub3coKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB0aGlzIHZpZXcgd2hlbiBhIGRpYWxvZyBvdmVybGF5cyBpdC5cbiAgICovXG4gIHByaXZhdGUgYmxvY2tXaGVuRGlhbG9nT3BlbmVkKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5LnRvcCQoe3ZpZXdJZDogdGhpcy5pZH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuYmxvY2tlZEJ5JCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0cyB3aGVuIHRvIGFjdGl2YXRlIGEgcm91dGUgZm9yIHRoaXMgdmlldy5cbiAgICpcbiAgICogTGlzdGVuaW5nIGZvciByb3V0ZSBhY3RpdmF0aW9ucyBvbiB0aGUgdmlldydzIHJvdXRlciBvdXRsZXQgaXMgbm90IHN1ZmZpY2llbnQsXG4gICAqIGFzIHRoZSBvdXRsZXQgZG9lcyBub3QgcmVwb3J0IHN1YnNlcXVlbnQgYWN0aXZhdGlvbnMgb2YgbmVzdGVkIGNoaWxkIHJvdXRlcy5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgaHRtbFxuICAgKiA8cm91dGVyLW91dGxldCAjcm91dGVyX291dGxldD1cIm91dGxldFwiXG4gICAqICAgICAgICAgICAgICAgIChhY3RpdmF0ZSk9XCJvbkFjdGl2YXRlUm91dGUocm91dGVyX291dGxldC5hY3RpdmF0ZWRSb3V0ZSlcIj5cbiAgICogPC9yb3V0ZXItb3V0bGV0PlxuICAgKiBgYGBcbiAgICpcbiAgICogSW5zdGVhZCwgd2Ugc3Vic2NyaWJlIHRvIEFuZ3VsYXIncyBgQWN0aXZhdGlvblN0YXJ0YCByb3V0ZXIgZXZlbnRzIGFuZCB1cGRhdGUgdGhlIHZpZXcgcHJvcGVydGllcyBhY2NvcmRpbmdseS5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0Um91dGVBY3RpdmF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2YXRlZE91dGxldFJvdXRlID0gdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnJvb3QuY2hpbGRyZW4uZmluZChyb3V0ZSA9PiByb3V0ZS5vdXRsZXQgPT09IHRoaXMuaWQpO1xuICAgIGNvbnN0IGFjdGl2YXRlZENoaWxkUm91dGUgPSBhY3RpdmF0ZWRPdXRsZXRSb3V0ZSA/IFJvdXRlclV0aWxzLnJlc29sdmVFZmZlY3RpdmVSb3V0ZShhY3RpdmF0ZWRPdXRsZXRSb3V0ZSkuc25hcHNob3QgOiBudWxsO1xuICAgIC8vIFRoZSB2aWV3IGhhbmRsZSBpcyBjb25zdHJ1Y3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBuYXZpZ2F0aW9uIChzZWUgV29ya2JlbmNoVXJsT2JzZXJ2ZXIjb25OYXZpZ2F0aW9uRW5kKSwgaS5lLiwgYWZ0ZXIgdGhlIHJvdXRlIGhhcyBiZWVuIGFjdGl2YXRlZC5cbiAgICAvLyBUaGVyZWZvcmUsIHdlIGNhbGwgYG9uUm91dGVBY3RpdmF0ZWAgbWFudWFsbHkuXG4gICAgaWYgKGFjdGl2YXRlZENoaWxkUm91dGUpIHtcbiAgICAgIHRoaXMub25Sb3V0ZUFjdGl2YXRlKGFjdGl2YXRlZENoaWxkUm91dGUpO1xuICAgIH1cblxuICAgIHRoaXMuX3JvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50OiBFdmVudCB8IFJvdXRlckV2ZW50KTogZXZlbnQgaXMgQWN0aXZhdGlvblN0YXJ0ID0+IGV2ZW50IGluc3RhbmNlb2YgQWN0aXZhdGlvblN0YXJ0KSxcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnNuYXBzaG90LnBhdGhGcm9tUm9vdFsxXT8ub3V0bGV0ID09PSB0aGlzLmlkKSxcbiAgICAgICAgbWFwKGV2ZW50ID0+IGV2ZW50LnNuYXBzaG90KSxcbiAgICAgICAgc3RhcnRXaXRoKGFjdGl2YXRlZENoaWxkUm91dGUhKSxcbiAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW3ByZXZpb3VzLCBjdXJyZW50XTogW0FjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90XSkgPT4ge1xuICAgICAgICAvLyBPbmx5IGNhbGwgYG9uUm91dGVBY3RpdmF0ZWAgaWYgdGhlIGFjdGl2YXRlZCByb3V0ZSBoYXMgY2hhbmdlZC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBlLmcuLCB3aGVuIGNoYW5naW5nIG1hdHJpeCBwYXJhbWV0ZXJzLCB0aGUgdmlldyBwcm9wZXJ0aWVzIHNldCBieSB0aGUgYXBwbGljYXRpb24gd291bGQgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgIGlmIChwcmV2aW91cz8ucm91dGVDb25maWcgIT09IGN1cnJlbnQucm91dGVDb25maWcpIHtcbiAgICAgICAgICB0aGlzLm9uUm91dGVBY3RpdmF0ZShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95UmVmLmRlc3Ryb3koKTtcbiAgICB0aGlzLl93b3JrYmVuY2hEaWFsb2dSZWdpc3RyeS5kaWFsb2dzKHt2aWV3SWQ6IHRoaXMuaWR9KS5mb3JFYWNoKGRpYWxvZyA9PiBkaWFsb2cuZGVzdHJveSgpKTtcbiAgICB0aGlzLnBvcnRhbC5kZXN0cm95KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcHNldWRvLXR5cGUgZm9yIHRoZSBhY3R1YWwge0BsaW5rIFZpZXdDb21wb25lbnR9IHdoaWNoIG11c3Qgbm90IGJlIHJlZmVyZW5jZWQgaW4gb3JkZXIgdG8gYXZvaWQgaW1wb3J0IGN5Y2xlcy5cbiAqL1xudHlwZSBWaWV3Q29tcG9uZW50ID0gYW55O1xuIl19
@@ -10,7 +10,7 @@
10
10
  import { Pipe } from '@angular/core';
11
11
  import { MPart } from '../layout/workbench-layout.model';
12
12
  import { MAIN_AREA } from '../layout/workbench-layout';
13
- import { isGridElementVisible } from '../layoutworkbench-layout';
13
+ import { WorkbenchLayouts } from '../layout/workbench-layouts.util';
14
14
  import * as i0 from "@angular/core";
15
15
  /**
16
16
  * Determines whether the given element requires a drop zone in the specified region.
@@ -21,10 +21,10 @@ export class RequiresDropZonePipe {
21
21
  transform(element, region) {
22
22
  return requiresDropZone(element, region);
23
23
  }
24
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: RequiresDropZonePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
25
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.3", ngImport: i0, type: RequiresDropZonePipe, isStandalone: true, name: "wbRequiresDropZone" }); }
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RequiresDropZonePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
25
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: RequiresDropZonePipe, isStandalone: true, name: "wbRequiresDropZone" }); }
26
26
  }
27
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: RequiresDropZonePipe, decorators: [{
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RequiresDropZonePipe, decorators: [{
28
28
  type: Pipe,
29
29
  args: [{ name: 'wbRequiresDropZone', standalone: true }]
30
30
  }] });
@@ -33,8 +33,8 @@ function requiresDropZone(element, region) {
33
33
  // Return `false` for every part except the main area part, allowing for dragging a first part to that side in the workbench grid.
34
34
  return element.id === MAIN_AREA;
35
35
  }
36
- const child1Visible = isGridElementVisible(element.child1);
37
- const child2Visible = isGridElementVisible(element.child2);
36
+ const child1Visible = WorkbenchLayouts.isGridElementVisible(element.child1);
37
+ const child2Visible = WorkbenchLayouts.isGridElementVisible(element.child2);
38
38
  if (child1Visible && child2Visible) {
39
39
  switch (region) {
40
40
  case 'north':
@@ -55,4 +55,4 @@ function requiresDropZone(element, region) {
55
55
  }
56
56
  return requiresDropZone(child1Visible ? element.child1 : element.child2, region);
57
57
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZXMtZHJvcC16b25lLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi92aWV3LWRuZC9yZXF1aXJlcy1kcm9wLXpvbmUucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7O0FBRWpFOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBRXhCLFNBQVMsQ0FBQyxPQUEwQixFQUFFLE1BQTJDO1FBQ3RGLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7OEdBSlUsb0JBQW9COzRHQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLElBQUk7bUJBQUMsRUFBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQzs7QUFRcEQsU0FBUyxnQkFBZ0IsQ0FBQyxPQUEwQixFQUFFLE1BQTJDO0lBQy9GLElBQUksT0FBTyxZQUFZLEtBQUssRUFBRTtRQUM1QixrSUFBa0k7UUFDbEksT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQztLQUNqQztJQUVELE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxNQUFNLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0QsSUFBSSxhQUFhLElBQUksYUFBYSxFQUFFO1FBQ2xDLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxPQUFPO2dCQUNWLG9IQUFvSDtnQkFDcEgsT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pGLEtBQUssT0FBTztnQkFDVixxSEFBcUg7Z0JBQ3JILE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRixLQUFLLE1BQU07Z0JBQ1Qsa0hBQWtIO2dCQUNsSCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEYsS0FBSyxNQUFNO2dCQUNULG1IQUFtSDtnQkFDbkgsT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BGO2dCQUNFLE9BQU8sS0FBSyxDQUFDLENBQUMsY0FBYztTQUMvQjtLQUNGO0lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TVBhcnQsIE1UcmVlTm9kZX0gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHtNQUlOX0FSRUF9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7aXNHcmlkRWxlbWVudFZpc2libGV9IGZyb20gJy4uL2xheW91dC/JtXdvcmtiZW5jaC1sYXlvdXQnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCByZXF1aXJlcyBhIGRyb3Agem9uZSBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbi5cbiAqXG4gKiBBbiBlbGVtZW50IHJlcXVpcmVzIGEgZHJvcCB6b25lIGlmIGl0cyBsYXlvdXQgaXMgZGl2aWRlZCBpbnRvIG11bHRpcGxlIHBhcnRzIGluIHRoYXQgcmVnaW9uLlxuICovXG5AUGlwZSh7bmFtZTogJ3diUmVxdWlyZXNEcm9wWm9uZScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVzRHJvcFpvbmVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgcHVibGljIHRyYW5zZm9ybShlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCwgcmVnaW9uOiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICdlYXN0JyB8ICd3ZXN0Jyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXF1aXJlc0Ryb3Bab25lKGVsZW1lbnQsIHJlZ2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZXNEcm9wWm9uZShlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCwgcmVnaW9uOiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICdlYXN0JyB8ICd3ZXN0Jyk6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KSB7XG4gICAgLy8gUmV0dXJuIGBmYWxzZWAgZm9yIGV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBtYWluIGFyZWEgcGFydCwgYWxsb3dpbmcgZm9yIGRyYWdnaW5nIGEgZmlyc3QgcGFydCB0byB0aGF0IHNpZGUgaW4gdGhlIHdvcmtiZW5jaCBncmlkLlxuICAgIHJldHVybiBlbGVtZW50LmlkID09PSBNQUlOX0FSRUE7XG4gIH1cblxuICBjb25zdCBjaGlsZDFWaXNpYmxlID0gaXNHcmlkRWxlbWVudFZpc2libGUoZWxlbWVudC5jaGlsZDEpO1xuICBjb25zdCBjaGlsZDJWaXNpYmxlID0gaXNHcmlkRWxlbWVudFZpc2libGUoZWxlbWVudC5jaGlsZDIpO1xuXG4gIGlmIChjaGlsZDFWaXNpYmxlICYmIGNoaWxkMlZpc2libGUpIHtcbiAgICBzd2l0Y2ggKHJlZ2lvbikge1xuICAgICAgY2FzZSAnbm9ydGgnOlxuICAgICAgICAvLyBUaGUgZWxlbWVudCByZXF1aXJlcyBhIGRyb3Agem9uZSBpZiB0aGUgZWxlbWVudCAob3IgaXRzIGZpcnN0IGNoaWxkKSBpcyBkaXZpZGVkIGhvcml6b250YWxseSBpbnRvIG11bHRpcGxlIHBhcnRzLlxuICAgICAgICByZXR1cm4gZWxlbWVudC5kaXJlY3Rpb24gPT09ICdyb3cnIHx8IHJlcXVpcmVzRHJvcFpvbmUoZWxlbWVudC5jaGlsZDEsIHJlZ2lvbik7XG4gICAgICBjYXNlICdzb3V0aCc6XG4gICAgICAgIC8vIFRoZSBlbGVtZW50IHJlcXVpcmVzIGEgZHJvcCB6b25lIGlmIHRoZSBlbGVtZW50IChvciBpdHMgc2Vjb25kIGNoaWxkKSBpcyBkaXZpZGVkIGhvcml6b250YWxseSBpbnRvIG11bHRpcGxlIHBhcnRzLlxuICAgICAgICByZXR1cm4gZWxlbWVudC5kaXJlY3Rpb24gPT09ICdyb3cnIHx8IHJlcXVpcmVzRHJvcFpvbmUoZWxlbWVudC5jaGlsZDIsIHJlZ2lvbik7XG4gICAgICBjYXNlICd3ZXN0JzpcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgcmVxdWlyZXMgYSBkcm9wIHpvbmUgaWYgdGhlIGVsZW1lbnQgKG9yIGl0cyBmaXJzdCBjaGlsZCkgaXMgZGl2aWRlZCB2ZXJ0aWNhbGx5IGludG8gbXVsdGlwbGUgcGFydHMuXG4gICAgICAgIHJldHVybiBlbGVtZW50LmRpcmVjdGlvbiA9PT0gJ2NvbHVtbicgfHwgcmVxdWlyZXNEcm9wWm9uZShlbGVtZW50LmNoaWxkMSwgcmVnaW9uKTtcbiAgICAgIGNhc2UgJ2Vhc3QnOlxuICAgICAgICAvLyBUaGUgZWxlbWVudCByZXF1aXJlcyBhIGRyb3Agem9uZSBpZiB0aGUgZWxlbWVudCAob3IgaXRzIHNlY29uZCBjaGlsZCkgaXMgZGl2aWRlZCB2ZXJ0aWNhbGx5IGludG8gbXVsdGlwbGUgcGFydHMuXG4gICAgICAgIHJldHVybiBlbGVtZW50LmRpcmVjdGlvbiA9PT0gJ2NvbHVtbicgfHwgcmVxdWlyZXNEcm9wWm9uZShlbGVtZW50LmNoaWxkMiwgcmVnaW9uKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gdW5zdXBwb3J0ZWRcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcXVpcmVzRHJvcFpvbmUoY2hpbGQxVmlzaWJsZSA/IGVsZW1lbnQuY2hpbGQxIDogZWxlbWVudC5jaGlsZDIsIHJlZ2lvbik7XG59XG4iXX0=
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZXMtZHJvcC16b25lLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi92aWV3LWRuZC9yZXF1aXJlcy1kcm9wLXpvbmUucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7O0FBRWxFOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBRXhCLFNBQVMsQ0FBQyxPQUEwQixFQUFFLE1BQTJDO1FBQ3RGLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7OEdBSlUsb0JBQW9COzRHQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLElBQUk7bUJBQUMsRUFBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQzs7QUFRcEQsU0FBUyxnQkFBZ0IsQ0FBQyxPQUEwQixFQUFFLE1BQTJDO0lBQy9GLElBQUksT0FBTyxZQUFZLEtBQUssRUFBRTtRQUM1QixrSUFBa0k7UUFDbEksT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQztLQUNqQztJQUVELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RSxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUUsSUFBSSxhQUFhLElBQUksYUFBYSxFQUFFO1FBQ2xDLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxPQUFPO2dCQUNWLG9IQUFvSDtnQkFDcEgsT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pGLEtBQUssT0FBTztnQkFDVixxSEFBcUg7Z0JBQ3JILE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRixLQUFLLE1BQU07Z0JBQ1Qsa0hBQWtIO2dCQUNsSCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEYsS0FBSyxNQUFNO2dCQUNULG1IQUFtSDtnQkFDbkgsT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BGO2dCQUNFLE9BQU8sS0FBSyxDQUFDLENBQUMsY0FBYztTQUMvQjtLQUNGO0lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TVBhcnQsIE1UcmVlTm9kZX0gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHtNQUlOX0FSRUF9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7V29ya2JlbmNoTGF5b3V0c30gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXRzLnV0aWwnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCByZXF1aXJlcyBhIGRyb3Agem9uZSBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbi5cbiAqXG4gKiBBbiBlbGVtZW50IHJlcXVpcmVzIGEgZHJvcCB6b25lIGlmIGl0cyBsYXlvdXQgaXMgZGl2aWRlZCBpbnRvIG11bHRpcGxlIHBhcnRzIGluIHRoYXQgcmVnaW9uLlxuICovXG5AUGlwZSh7bmFtZTogJ3diUmVxdWlyZXNEcm9wWm9uZScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVzRHJvcFpvbmVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgcHVibGljIHRyYW5zZm9ybShlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCwgcmVnaW9uOiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICdlYXN0JyB8ICd3ZXN0Jyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXF1aXJlc0Ryb3Bab25lKGVsZW1lbnQsIHJlZ2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZXNEcm9wWm9uZShlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCwgcmVnaW9uOiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICdlYXN0JyB8ICd3ZXN0Jyk6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KSB7XG4gICAgLy8gUmV0dXJuIGBmYWxzZWAgZm9yIGV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBtYWluIGFyZWEgcGFydCwgYWxsb3dpbmcgZm9yIGRyYWdnaW5nIGEgZmlyc3QgcGFydCB0byB0aGF0IHNpZGUgaW4gdGhlIHdvcmtiZW5jaCBncmlkLlxuICAgIHJldHVybiBlbGVtZW50LmlkID09PSBNQUlOX0FSRUE7XG4gIH1cblxuICBjb25zdCBjaGlsZDFWaXNpYmxlID0gV29ya2JlbmNoTGF5b3V0cy5pc0dyaWRFbGVtZW50VmlzaWJsZShlbGVtZW50LmNoaWxkMSk7XG4gIGNvbnN0IGNoaWxkMlZpc2libGUgPSBXb3JrYmVuY2hMYXlvdXRzLmlzR3JpZEVsZW1lbnRWaXNpYmxlKGVsZW1lbnQuY2hpbGQyKTtcblxuICBpZiAoY2hpbGQxVmlzaWJsZSAmJiBjaGlsZDJWaXNpYmxlKSB7XG4gICAgc3dpdGNoIChyZWdpb24pIHtcbiAgICAgIGNhc2UgJ25vcnRoJzpcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgcmVxdWlyZXMgYSBkcm9wIHpvbmUgaWYgdGhlIGVsZW1lbnQgKG9yIGl0cyBmaXJzdCBjaGlsZCkgaXMgZGl2aWRlZCBob3Jpem9udGFsbHkgaW50byBtdWx0aXBsZSBwYXJ0cy5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZGlyZWN0aW9uID09PSAncm93JyB8fCByZXF1aXJlc0Ryb3Bab25lKGVsZW1lbnQuY2hpbGQxLCByZWdpb24pO1xuICAgICAgY2FzZSAnc291dGgnOlxuICAgICAgICAvLyBUaGUgZWxlbWVudCByZXF1aXJlcyBhIGRyb3Agem9uZSBpZiB0aGUgZWxlbWVudCAob3IgaXRzIHNlY29uZCBjaGlsZCkgaXMgZGl2aWRlZCBob3Jpem9udGFsbHkgaW50byBtdWx0aXBsZSBwYXJ0cy5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZGlyZWN0aW9uID09PSAncm93JyB8fCByZXF1aXJlc0Ryb3Bab25lKGVsZW1lbnQuY2hpbGQyLCByZWdpb24pO1xuICAgICAgY2FzZSAnd2VzdCc6XG4gICAgICAgIC8vIFRoZSBlbGVtZW50IHJlcXVpcmVzIGEgZHJvcCB6b25lIGlmIHRoZSBlbGVtZW50IChvciBpdHMgZmlyc3QgY2hpbGQpIGlzIGRpdmlkZWQgdmVydGljYWxseSBpbnRvIG11bHRpcGxlIHBhcnRzLlxuICAgICAgICByZXR1cm4gZWxlbWVudC5kaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IHJlcXVpcmVzRHJvcFpvbmUoZWxlbWVudC5jaGlsZDEsIHJlZ2lvbik7XG4gICAgICBjYXNlICdlYXN0JzpcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgcmVxdWlyZXMgYSBkcm9wIHpvbmUgaWYgdGhlIGVsZW1lbnQgKG9yIGl0cyBzZWNvbmQgY2hpbGQpIGlzIGRpdmlkZWQgdmVydGljYWxseSBpbnRvIG11bHRpcGxlIHBhcnRzLlxuICAgICAgICByZXR1cm4gZWxlbWVudC5kaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IHJlcXVpcmVzRHJvcFpvbmUoZWxlbWVudC5jaGlsZDIsIHJlZ2lvbik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHVuc3VwcG9ydGVkXG4gICAgfVxuICB9XG4gIHJldHVybiByZXF1aXJlc0Ryb3Bab25lKGNoaWxkMVZpc2libGUgPyBlbGVtZW50LmNoaWxkMSA6IGVsZW1lbnQuY2hpbGQyLCByZWdpb24pO1xufVxuIl19