@trudb/tru-common-lib 0.0.725 → 0.0.728

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 (404) hide show
  1. package/{esm2020 → esm2022}/lib/assets/tru-icon-module.mjs +32 -32
  2. package/{esm2020 → esm2022}/lib/assets/tru-search-icon-module.mjs +36 -36
  3. package/{esm2020 → esm2022}/lib/base-classes/tru-component-config-base.mjs +3 -3
  4. package/{esm2020 → esm2022}/lib/base-classes/tru-control-component-config-base.mjs +3 -3
  5. package/{esm2020 → esm2022}/lib/base-classes/tru-edit-control-base.mjs +17 -17
  6. package/esm2022/lib/base-classes/tru-edit-control-config-base.mjs +6 -0
  7. package/{esm2020 → esm2022}/lib/base-classes/tru-edit-parent-control-config-base.mjs +3 -3
  8. package/{esm2020 → esm2022}/lib/base-classes/tru-edit-pkey-control-config-base.mjs +3 -3
  9. package/esm2022/lib/base-classes/tru-entity-base.mjs +14 -0
  10. package/esm2022/lib/base-classes/tru-list-control-config-base.mjs +6 -0
  11. package/{esm2020 → esm2022}/lib/base-classes/tru-property-config-base.mjs +14 -15
  12. package/{esm2020 → esm2022}/lib/base-classes/tru-search-config-base.mjs +3 -3
  13. package/esm2022/lib/base-classes/tru-search-control-base.mjs +45 -0
  14. package/esm2022/lib/base-classes/tru-search-control-config-base.mjs +5 -0
  15. package/esm2022/lib/base-classes/tru-search-control-range-base.mjs +45 -0
  16. package/esm2022/lib/base-classes/tru-table-config-base.mjs +12 -0
  17. package/{esm2020 → esm2022}/lib/base-views/detail/tru-detail-view-base-module.mjs +19 -19
  18. package/esm2022/lib/base-views/detail/tru-detail-view-base.mjs +83 -0
  19. package/esm2022/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +25 -0
  20. package/esm2022/lib/base-views/search/services/tru-search-view-event-handler.mjs +25 -0
  21. package/{esm2020 → esm2022}/lib/base-views/search/tru-search-view-base-module.mjs +19 -19
  22. package/esm2022/lib/base-views/search/tru-search-view-base.mjs +68 -0
  23. package/{esm2020 → esm2022}/lib/base-views/search-result/tru-search-result-view-base-module.mjs +19 -19
  24. package/esm2022/lib/base-views/search-result/tru-search-result-view-base.mjs +54 -0
  25. package/{esm2020 → esm2022}/lib/classes/tru-choice.mjs +2 -2
  26. package/esm2022/lib/classes/tru-context-filter-choice.mjs +11 -0
  27. package/esm2022/lib/classes/tru-context-filter.mjs +16 -0
  28. package/esm2022/lib/classes/tru-data-change-parser.mjs +287 -0
  29. package/esm2022/lib/classes/tru-data-change.mjs +5 -0
  30. package/{esm2020 → esm2022}/lib/classes/tru-formula-eval.mjs +156 -156
  31. package/esm2022/lib/classes/tru-merge-data-set.mjs +11 -0
  32. package/esm2022/lib/classes/tru-merge-data.mjs +20 -0
  33. package/{esm2020 → esm2022}/lib/classes/tru-name-value.mjs +2 -2
  34. package/esm2022/lib/classes/tru-predicate.mjs +47 -0
  35. package/{esm2020 → esm2022}/lib/classes/tru-property-config-cloud-file.mjs +4 -4
  36. package/esm2022/lib/classes/tru-property-config-date.mjs +7 -0
  37. package/esm2022/lib/classes/tru-property-config-decimal.mjs +9 -0
  38. package/{esm2020 → esm2022}/lib/classes/tru-property-config-file.mjs +6 -8
  39. package/esm2022/lib/classes/tru-property-config-foreign-key.mjs +8 -0
  40. package/esm2022/lib/classes/tru-property-config-integer.mjs +7 -0
  41. package/esm2022/lib/classes/tru-property-config-password.mjs +6 -0
  42. package/esm2022/lib/classes/tru-property-config-percentage.mjs +7 -0
  43. package/esm2022/lib/classes/tru-property-config-scientific.mjs +7 -0
  44. package/{esm2020 → esm2022}/lib/classes/tru-property-config-text-choices.mjs +6 -8
  45. package/{esm2020 → esm2022}/lib/classes/tru-property-config-text.mjs +8 -10
  46. package/{esm2020 → esm2022}/lib/classes/tru-property-config-usa-address.mjs +6 -8
  47. package/{esm2020 → esm2022}/lib/classes/tru-property-config-zip-code.mjs +6 -8
  48. package/esm2022/lib/classes/tru-query-predicate-manager.mjs +49 -0
  49. package/{esm2020 → esm2022}/lib/components/confirm-dialog/tru-confirm-dialog-module.mjs +20 -20
  50. package/esm2022/lib/components/confirm-dialog/tru-confirm-dialog.mjs +59 -0
  51. package/{esm2020 → esm2022}/lib/components/data-grid/classes/tru-data-grid-config.mjs +1 -1
  52. package/{esm2020 → esm2022}/lib/components/data-grid/enums/tru-data-grid-types.mjs +6 -6
  53. package/esm2022/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +40 -0
  54. package/esm2022/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +27 -0
  55. package/esm2022/lib/components/data-grid/tru-data-grid-module.mjs +67 -0
  56. package/esm2022/lib/components/data-grid/tru-data-grid.mjs +382 -0
  57. package/{esm2020 → esm2022}/lib/components/desktop/classes/tru-desktop-title.mjs +2 -2
  58. package/esm2022/lib/components/desktop/classes/tru-desktop-view-config.mjs +21 -0
  59. package/{esm2020 → esm2022}/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.mjs +19 -19
  60. package/esm2022/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +122 -0
  61. package/{esm2020 → esm2022}/lib/components/desktop/menubar/tru-desktop-menubar-module.mjs +56 -56
  62. package/esm2022/lib/components/desktop/menubar/tru-desktop-menubar.mjs +36 -0
  63. package/esm2022/lib/components/desktop/services/tru-desktop-manager.mjs +86 -0
  64. package/esm2022/lib/components/desktop/services/tru-desktop-service.mjs +108 -0
  65. package/esm2022/lib/components/desktop/services/tru-window-action-event-handler.mjs +25 -0
  66. package/esm2022/lib/components/desktop/services/tru-window-event-args.mjs +24 -0
  67. package/esm2022/lib/components/desktop/services/tru-window-event-handler.mjs +42 -0
  68. package/{esm2020 → esm2022}/lib/components/desktop/statusbar/tru-desktop-statusbar-module.mjs +19 -19
  69. package/esm2022/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +20 -0
  70. package/{esm2020 → esm2022}/lib/components/desktop/taskbar/tru-desktop-taskbar-module.mjs +21 -21
  71. package/esm2022/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +41 -0
  72. package/{esm2020 → esm2022}/lib/components/desktop/tru-desktop-module.mjs +72 -72
  73. package/esm2022/lib/components/desktop/tru-desktop.mjs +737 -0
  74. package/{esm2020 → esm2022}/lib/components/desktop/view/tru-desktop-view-module.mjs +19 -19
  75. package/esm2022/lib/components/desktop/view/tru-desktop-view.mjs +29 -0
  76. package/{esm2020 → esm2022}/lib/components/desktop/viewport/tru-desktop-viewport-module.mjs +20 -20
  77. package/esm2022/lib/components/desktop/viewport/tru-desktop-viewport.mjs +117 -0
  78. package/{esm2020 → esm2022}/lib/components/desktop/window/tru-desktop-window-module.mjs +58 -58
  79. package/esm2022/lib/components/desktop/window/tru-desktop-window.mjs +467 -0
  80. package/{esm2020 → esm2022}/lib/components/export-dialog/tru-export-dialog-module.mjs +20 -20
  81. package/esm2022/lib/components/export-dialog/tru-export-dialog.mjs +61 -0
  82. package/{esm2020 → esm2022}/lib/components/layout/column/tru-column-module.mjs +19 -19
  83. package/{esm2020 → esm2022}/lib/components/layout/column/tru-column.mjs +12 -12
  84. package/{esm2020 → esm2022}/lib/components/layout/form/tru-form-module.mjs +19 -19
  85. package/esm2022/lib/components/layout/form/tru-form.mjs +35 -0
  86. package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box-module.mjs +19 -19
  87. package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box.mjs +12 -12
  88. package/{esm2020 → esm2022}/lib/components/layout/row/tru-row-module.mjs +19 -19
  89. package/{esm2020 → esm2022}/lib/components/layout/row/tru-row.mjs +12 -12
  90. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-config.mjs +7 -7
  91. package/esm2022/lib/components/login/classes/tru-auth-jwt-strategy.mjs +63 -0
  92. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-login-request.mjs +5 -3
  93. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-logout-request.mjs +4 -3
  94. package/esm2022/lib/components/login/classes/tru-auth-session-strategy.mjs +21 -0
  95. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-strategy-provider.mjs +19 -19
  96. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-token.mjs +11 -8
  97. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-user-request.mjs +4 -3
  98. package/esm2022/lib/components/login/services/tru-auth-cache.mjs +20 -0
  99. package/esm2022/lib/components/login/services/tru-auth-interceptor.mjs +46 -0
  100. package/esm2022/lib/components/login/services/tru-auth.mjs +87 -0
  101. package/esm2022/lib/components/login/tru-login-module.mjs +46 -0
  102. package/esm2022/lib/components/login/tru-login.mjs +59 -0
  103. package/{esm2020 → esm2022}/lib/components/password-dialog/tru-password-dialog-module.mjs +20 -20
  104. package/esm2022/lib/components/password-dialog/tru-password-dialog.mjs +53 -0
  105. package/{esm2020 → esm2022}/lib/components/toolbar/button/tru-toolbar-button-module.mjs +32 -32
  106. package/esm2022/lib/components/toolbar/button/tru-toolbar-button.mjs +40 -0
  107. package/{esm2020 → esm2022}/lib/components/toolbar/classes/tru-toolbar-dropdown-option.mjs +1 -1
  108. package/{esm2020 → esm2022}/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.mjs +44 -44
  109. package/esm2022/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +26 -0
  110. package/{esm2020 → esm2022}/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.mjs +36 -36
  111. package/esm2022/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +45 -0
  112. package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.mjs +19 -19
  113. package/esm2022/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +17 -0
  114. package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.mjs +19 -19
  115. package/esm2022/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +26 -0
  116. package/{esm2020 → esm2022}/lib/components/toolbar/menu/tru-toolbar-menu-module.mjs +32 -32
  117. package/esm2022/lib/components/toolbar/menu/tru-toolbar-menu.mjs +33 -0
  118. package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator-module.mjs +19 -19
  119. package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator.mjs +12 -12
  120. package/{esm2020 → esm2022}/lib/components/toolbar/text/tru-toolbar-text-module.mjs +32 -32
  121. package/esm2022/lib/components/toolbar/text/tru-toolbar-text.mjs +27 -0
  122. package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar-module.mjs +73 -73
  123. package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar.mjs +20 -21
  124. package/{esm2020 → esm2022}/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.mjs +36 -36
  125. package/esm2022/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +38 -0
  126. package/esm2022/lib/components/validation-dialog/tru-validation-dialog-config.mjs +25 -0
  127. package/{esm2020 → esm2022}/lib/components/validation-dialog/tru-validation-dialog-module.mjs +19 -19
  128. package/esm2022/lib/components/validation-dialog/tru-validation-dialog.mjs +83 -0
  129. package/{esm2020 → esm2022}/lib/directives/breeze-validator/tru-breeze-validator-module.mjs +19 -19
  130. package/esm2022/lib/directives/breeze-validator/tru-breeze-validator.mjs +107 -0
  131. package/{esm2020 → esm2022}/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.mjs +19 -19
  132. package/esm2022/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +155 -0
  133. package/{esm2020 → esm2022}/lib/directives/select-panel/tru-mat-select-panel-module.mjs +19 -19
  134. package/esm2022/lib/directives/select-panel/tru-mat-select-panel.mjs +69 -0
  135. package/{esm2020 → esm2022}/lib/interfaces/tru-value.mjs +1 -1
  136. package/{esm2020 → esm2022}/lib/material.module.mjs +192 -192
  137. package/esm2022/lib/services/tru-app-environment.mjs +113 -0
  138. package/esm2022/lib/services/tru-breeze-context-factory.mjs +84 -0
  139. package/esm2022/lib/services/tru-breeze-metadata-provider.mjs +21 -0
  140. package/esm2022/lib/services/tru-component-lookup.mjs +23 -0
  141. package/esm2022/lib/services/tru-connection-hub.mjs +52 -0
  142. package/esm2022/lib/services/tru-context-filters.mjs +28 -0
  143. package/esm2022/lib/services/tru-data-context.mjs +263 -0
  144. package/esm2022/lib/services/tru-entity-accessor.mjs +292 -0
  145. package/esm2022/lib/services/tru-model-property-lookup.mjs +21 -0
  146. package/{esm2020 → esm2022}/lib/services/tru-predicate-map.mjs +11 -11
  147. package/esm2022/lib/services/tru-search-result-view-manager.mjs +18 -0
  148. package/esm2022/lib/services/tru-sort.mjs +113 -0
  149. package/esm2022/lib/services/tru-table-registry.mjs +15 -0
  150. package/esm2022/lib/services/tru-text-manager.mjs +148 -0
  151. package/esm2022/lib/services/tru-ui-notification.mjs +107 -0
  152. package/esm2022/lib/services/tru-user.mjs +62 -0
  153. package/esm2022/lib/services/tru-util.mjs +76 -0
  154. package/{esm2020 → esm2022}/lib/tru-common-module.mjs +16 -16
  155. package/{esm2020 → esm2022}/public-api.mjs +144 -144
  156. package/{esm2020 → esm2022}/trudb-tru-common-lib.mjs +4 -4
  157. package/fesm2022/trudb-tru-common-lib.mjs +6932 -0
  158. package/fesm2022/trudb-tru-common-lib.mjs.map +1 -0
  159. package/index.d.ts +5 -5
  160. package/lib/assets/tru-icon-module.d.ts +11 -11
  161. package/lib/assets/tru-search-icon-module.d.ts +11 -11
  162. package/lib/base-classes/tru-component-config-base.d.ts +3 -3
  163. package/lib/base-classes/tru-control-component-config-base.d.ts +20 -20
  164. package/lib/base-classes/tru-edit-control-base.d.ts +10 -10
  165. package/lib/base-classes/tru-edit-control-config-base.d.ts +21 -21
  166. package/lib/base-classes/tru-edit-parent-control-config-base.d.ts +9 -9
  167. package/lib/base-classes/tru-edit-pkey-control-config-base.d.ts +11 -11
  168. package/lib/base-classes/tru-entity-base.d.ts +14 -14
  169. package/lib/base-classes/tru-list-control-config-base.d.ts +21 -21
  170. package/lib/base-classes/tru-property-config-base.d.ts +13 -13
  171. package/lib/base-classes/tru-search-config-base.d.ts +9 -9
  172. package/lib/base-classes/tru-search-control-base.d.ts +21 -21
  173. package/lib/base-classes/tru-search-control-config-base.d.ts +13 -13
  174. package/lib/base-classes/tru-search-control-range-base.d.ts +25 -25
  175. package/lib/base-classes/tru-table-config-base.d.ts +11 -11
  176. package/lib/base-views/detail/tru-detail-view-base-module.d.ts +9 -9
  177. package/lib/base-views/detail/tru-detail-view-base.d.ts +32 -32
  178. package/lib/base-views/search/services/tru-search-view-control-event-handler.d.ts +12 -12
  179. package/lib/base-views/search/services/tru-search-view-event-handler.d.ts +11 -11
  180. package/lib/base-views/search/tru-search-view-base-module.d.ts +9 -9
  181. package/lib/base-views/search/tru-search-view-base.d.ts +36 -36
  182. package/lib/base-views/search-result/tru-search-result-view-base-module.d.ts +9 -9
  183. package/lib/base-views/search-result/tru-search-result-view-base.d.ts +25 -25
  184. package/lib/classes/tru-choice.d.ts +8 -8
  185. package/lib/classes/tru-context-filter-choice.d.ts +6 -6
  186. package/lib/classes/tru-context-filter.d.ts +10 -10
  187. package/lib/classes/tru-data-change-parser.d.ts +33 -33
  188. package/lib/classes/tru-data-change.d.ts +4 -4
  189. package/lib/classes/tru-formula-eval.d.ts +31 -31
  190. package/lib/classes/tru-merge-data-set.d.ts +7 -7
  191. package/lib/classes/tru-merge-data.d.ts +9 -9
  192. package/lib/classes/tru-name-value.d.ts +9 -9
  193. package/lib/classes/tru-predicate.d.ts +8 -8
  194. package/lib/classes/tru-property-config-cloud-file.d.ts +4 -4
  195. package/lib/classes/tru-property-config-date.d.ts +6 -6
  196. package/lib/classes/tru-property-config-decimal.d.ts +8 -8
  197. package/lib/classes/tru-property-config-file.d.ts +5 -5
  198. package/lib/classes/tru-property-config-foreign-key.d.ts +7 -7
  199. package/lib/classes/tru-property-config-integer.d.ts +6 -6
  200. package/lib/classes/tru-property-config-password.d.ts +5 -5
  201. package/lib/classes/tru-property-config-percentage.d.ts +6 -6
  202. package/lib/classes/tru-property-config-scientific.d.ts +6 -6
  203. package/lib/classes/tru-property-config-text-choices.d.ts +5 -5
  204. package/lib/classes/tru-property-config-text.d.ts +7 -7
  205. package/lib/classes/tru-property-config-usa-address.d.ts +5 -5
  206. package/lib/classes/tru-property-config-zip-code.d.ts +5 -5
  207. package/lib/classes/tru-query-predicate-manager.d.ts +26 -26
  208. package/lib/components/confirm-dialog/tru-confirm-dialog-module.d.ts +10 -10
  209. package/lib/components/confirm-dialog/tru-confirm-dialog.d.ts +28 -28
  210. package/lib/components/data-grid/classes/tru-data-grid-config.d.ts +7 -7
  211. package/lib/components/data-grid/enums/tru-data-grid-types.d.ts +5 -5
  212. package/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.d.ts +13 -13
  213. package/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.d.ts +13 -13
  214. package/lib/components/data-grid/tru-data-grid-module.d.ts +15 -15
  215. package/lib/components/data-grid/tru-data-grid.d.ts +67 -67
  216. package/lib/components/desktop/classes/tru-desktop-title.d.ts +4 -4
  217. package/lib/components/desktop/classes/tru-desktop-view-config.d.ts +16 -16
  218. package/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.d.ts +9 -9
  219. package/lib/components/desktop/directives/resizable/tru-desktop-resizable.d.ts +32 -32
  220. package/lib/components/desktop/menubar/tru-desktop-menubar-module.d.ts +17 -17
  221. package/lib/components/desktop/menubar/tru-desktop-menubar.d.ts +15 -15
  222. package/lib/components/desktop/services/tru-desktop-manager.d.ts +33 -33
  223. package/lib/components/desktop/services/tru-desktop-service.d.ts +95 -95
  224. package/lib/components/desktop/services/tru-window-action-event-handler.d.ts +12 -12
  225. package/lib/components/desktop/services/tru-window-event-args.d.ts +17 -17
  226. package/lib/components/desktop/services/tru-window-event-handler.d.ts +20 -20
  227. package/lib/components/desktop/statusbar/tru-desktop-statusbar-module.d.ts +9 -9
  228. package/lib/components/desktop/statusbar/tru-desktop-statusbar.d.ts +10 -10
  229. package/lib/components/desktop/taskbar/tru-desktop-taskbar-module.d.ts +11 -11
  230. package/lib/components/desktop/taskbar/tru-desktop-taskbar.d.ts +15 -15
  231. package/lib/components/desktop/tru-desktop-module.d.ts +20 -20
  232. package/lib/components/desktop/tru-desktop.d.ts +337 -337
  233. package/lib/components/desktop/view/tru-desktop-view-module.d.ts +9 -9
  234. package/lib/components/desktop/view/tru-desktop-view.d.ts +14 -14
  235. package/lib/components/desktop/viewport/tru-desktop-viewport-module.d.ts +10 -10
  236. package/lib/components/desktop/viewport/tru-desktop-viewport.d.ts +48 -48
  237. package/lib/components/desktop/window/tru-desktop-window-module.d.ts +17 -17
  238. package/lib/components/desktop/window/tru-desktop-window.d.ts +189 -189
  239. package/lib/components/export-dialog/tru-export-dialog-module.d.ts +10 -10
  240. package/lib/components/export-dialog/tru-export-dialog.d.ts +26 -26
  241. package/lib/components/layout/column/tru-column-module.d.ts +9 -9
  242. package/lib/components/layout/column/tru-column.d.ts +6 -6
  243. package/lib/components/layout/form/tru-form-module.d.ts +9 -9
  244. package/lib/components/layout/form/tru-form.d.ts +10 -10
  245. package/lib/components/layout/group-box/tru-group-box-module.d.ts +9 -9
  246. package/lib/components/layout/group-box/tru-group-box.d.ts +6 -6
  247. package/lib/components/layout/row/tru-row-module.d.ts +9 -9
  248. package/lib/components/layout/row/tru-row.d.ts +6 -6
  249. package/lib/components/login/classes/tru-auth-config.d.ts +16 -16
  250. package/lib/components/login/classes/tru-auth-jwt-strategy.d.ts +15 -15
  251. package/lib/components/login/classes/tru-auth-login-request.d.ts +4 -4
  252. package/lib/components/login/classes/tru-auth-logout-request.d.ts +3 -3
  253. package/lib/components/login/classes/tru-auth-session-strategy.d.ts +13 -13
  254. package/lib/components/login/classes/tru-auth-strategy-provider.d.ts +9 -9
  255. package/lib/components/login/classes/tru-auth-token.d.ts +6 -6
  256. package/lib/components/login/classes/tru-auth-user-request.d.ts +3 -3
  257. package/lib/components/login/services/tru-auth-cache.d.ts +11 -11
  258. package/lib/components/login/services/tru-auth-interceptor.d.ts +16 -16
  259. package/lib/components/login/services/tru-auth.d.ts +29 -29
  260. package/lib/components/login/tru-login-module.d.ts +11 -11
  261. package/lib/components/login/tru-login.d.ts +21 -21
  262. package/lib/components/password-dialog/tru-password-dialog-module.d.ts +10 -10
  263. package/lib/components/password-dialog/tru-password-dialog.d.ts +24 -23
  264. package/lib/components/toolbar/button/tru-toolbar-button-module.d.ts +11 -11
  265. package/lib/components/toolbar/button/tru-toolbar-button.d.ts +16 -16
  266. package/lib/components/toolbar/classes/tru-toolbar-dropdown-option.d.ts +4 -4
  267. package/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.d.ts +14 -14
  268. package/lib/components/toolbar/context-filter/tru-toolbar-context-filter.d.ts +13 -13
  269. package/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.d.ts +12 -12
  270. package/lib/components/toolbar/dropdown/tru-toolbar-dropdown.d.ts +18 -18
  271. package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.d.ts +9 -9
  272. package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.d.ts +7 -7
  273. package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.d.ts +9 -9
  274. package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.d.ts +8 -8
  275. package/lib/components/toolbar/menu/tru-toolbar-menu-module.d.ts +11 -11
  276. package/lib/components/toolbar/menu/tru-toolbar-menu.d.ts +10 -10
  277. package/lib/components/toolbar/separator/tru-toolbar-separator-module.d.ts +9 -9
  278. package/lib/components/toolbar/separator/tru-toolbar-separator.d.ts +6 -6
  279. package/lib/components/toolbar/text/tru-toolbar-text-module.d.ts +11 -11
  280. package/lib/components/toolbar/text/tru-toolbar-text.d.ts +12 -12
  281. package/lib/components/toolbar/tru-toolbar-module.d.ts +16 -16
  282. package/lib/components/toolbar/tru-toolbar.d.ts +9 -9
  283. package/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.d.ts +12 -12
  284. package/lib/components/toolbar/user-profile/tru-toolbar-user-profile.d.ts +17 -17
  285. package/lib/components/validation-dialog/tru-validation-dialog-config.d.ts +13 -13
  286. package/lib/components/validation-dialog/tru-validation-dialog-module.d.ts +9 -9
  287. package/lib/components/validation-dialog/tru-validation-dialog.d.ts +20 -20
  288. package/lib/directives/breeze-validator/tru-breeze-validator-module.d.ts +9 -9
  289. package/lib/directives/breeze-validator/tru-breeze-validator.d.ts +27 -27
  290. package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.d.ts +9 -9
  291. package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.d.ts +40 -40
  292. package/lib/directives/select-panel/tru-mat-select-panel-module.d.ts +9 -9
  293. package/lib/directives/select-panel/tru-mat-select-panel.d.ts +17 -17
  294. package/lib/interfaces/tru-value.d.ts +6 -6
  295. package/lib/material.module.d.ts +50 -50
  296. package/lib/services/tru-app-environment.d.ts +57 -57
  297. package/lib/services/tru-breeze-context-factory.d.ts +32 -32
  298. package/lib/services/tru-breeze-metadata-provider.d.ts +9 -9
  299. package/lib/services/tru-component-lookup.d.ts +9 -9
  300. package/lib/services/tru-connection-hub.d.ts +18 -18
  301. package/lib/services/tru-context-filters.d.ts +10 -10
  302. package/lib/services/tru-data-context.d.ts +42 -42
  303. package/lib/services/tru-entity-accessor.d.ts +46 -46
  304. package/lib/services/tru-model-property-lookup.d.ts +10 -10
  305. package/lib/services/tru-predicate-map.d.ts +6 -6
  306. package/lib/services/tru-search-result-view-manager.d.ts +10 -10
  307. package/lib/services/tru-sort.d.ts +56 -56
  308. package/lib/services/tru-table-registry.d.ts +8 -8
  309. package/lib/services/tru-text-manager.d.ts +68 -68
  310. package/lib/services/tru-ui-notification.d.ts +36 -36
  311. package/lib/services/tru-user.d.ts +29 -29
  312. package/lib/services/tru-util.d.ts +14 -14
  313. package/lib/tru-common-module.d.ts +6 -6
  314. package/package.json +5 -11
  315. package/public-api.d.ts +117 -117
  316. package/esm2020/lib/base-classes/tru-edit-control-config-base.mjs +0 -4
  317. package/esm2020/lib/base-classes/tru-entity-base.mjs +0 -13
  318. package/esm2020/lib/base-classes/tru-list-control-config-base.mjs +0 -4
  319. package/esm2020/lib/base-classes/tru-search-control-base.mjs +0 -47
  320. package/esm2020/lib/base-classes/tru-search-control-config-base.mjs +0 -4
  321. package/esm2020/lib/base-classes/tru-search-control-range-base.mjs +0 -47
  322. package/esm2020/lib/base-classes/tru-table-config-base.mjs +0 -13
  323. package/esm2020/lib/base-views/detail/tru-detail-view-base.mjs +0 -76
  324. package/esm2020/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +0 -27
  325. package/esm2020/lib/base-views/search/services/tru-search-view-event-handler.mjs +0 -27
  326. package/esm2020/lib/base-views/search/tru-search-view-base.mjs +0 -63
  327. package/esm2020/lib/base-views/search-result/tru-search-result-view-base.mjs +0 -51
  328. package/esm2020/lib/classes/tru-context-filter-choice.mjs +0 -8
  329. package/esm2020/lib/classes/tru-context-filter.mjs +0 -16
  330. package/esm2020/lib/classes/tru-data-change-parser.mjs +0 -277
  331. package/esm2020/lib/classes/tru-data-change.mjs +0 -7
  332. package/esm2020/lib/classes/tru-merge-data-set.mjs +0 -12
  333. package/esm2020/lib/classes/tru-merge-data.mjs +0 -17
  334. package/esm2020/lib/classes/tru-predicate.mjs +0 -47
  335. package/esm2020/lib/classes/tru-property-config-date.mjs +0 -9
  336. package/esm2020/lib/classes/tru-property-config-decimal.mjs +0 -11
  337. package/esm2020/lib/classes/tru-property-config-foreign-key.mjs +0 -10
  338. package/esm2020/lib/classes/tru-property-config-integer.mjs +0 -9
  339. package/esm2020/lib/classes/tru-property-config-password.mjs +0 -8
  340. package/esm2020/lib/classes/tru-property-config-percentage.mjs +0 -9
  341. package/esm2020/lib/classes/tru-property-config-scientific.mjs +0 -9
  342. package/esm2020/lib/classes/tru-query-predicate-manager.mjs +0 -49
  343. package/esm2020/lib/components/confirm-dialog/tru-confirm-dialog.mjs +0 -45
  344. package/esm2020/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +0 -39
  345. package/esm2020/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +0 -26
  346. package/esm2020/lib/components/data-grid/tru-data-grid-module.mjs +0 -67
  347. package/esm2020/lib/components/data-grid/tru-data-grid.mjs +0 -370
  348. package/esm2020/lib/components/desktop/classes/tru-desktop-view-config.mjs +0 -21
  349. package/esm2020/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +0 -109
  350. package/esm2020/lib/components/desktop/menubar/tru-desktop-menubar.mjs +0 -34
  351. package/esm2020/lib/components/desktop/services/tru-desktop-manager.mjs +0 -84
  352. package/esm2020/lib/components/desktop/services/tru-desktop-service.mjs +0 -116
  353. package/esm2020/lib/components/desktop/services/tru-window-action-event-handler.mjs +0 -27
  354. package/esm2020/lib/components/desktop/services/tru-window-event-args.mjs +0 -26
  355. package/esm2020/lib/components/desktop/services/tru-window-event-handler.mjs +0 -44
  356. package/esm2020/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +0 -18
  357. package/esm2020/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +0 -40
  358. package/esm2020/lib/components/desktop/tru-desktop.mjs +0 -731
  359. package/esm2020/lib/components/desktop/view/tru-desktop-view.mjs +0 -25
  360. package/esm2020/lib/components/desktop/viewport/tru-desktop-viewport.mjs +0 -113
  361. package/esm2020/lib/components/desktop/window/tru-desktop-window.mjs +0 -457
  362. package/esm2020/lib/components/export-dialog/tru-export-dialog.mjs +0 -57
  363. package/esm2020/lib/components/layout/form/tru-form.mjs +0 -34
  364. package/esm2020/lib/components/login/classes/tru-auth-jwt-strategy.mjs +0 -65
  365. package/esm2020/lib/components/login/classes/tru-auth-session-strategy.mjs +0 -19
  366. package/esm2020/lib/components/login/services/tru-auth-cache.mjs +0 -22
  367. package/esm2020/lib/components/login/services/tru-auth-interceptor.mjs +0 -43
  368. package/esm2020/lib/components/login/services/tru-auth.mjs +0 -81
  369. package/esm2020/lib/components/login/tru-login-module.mjs +0 -46
  370. package/esm2020/lib/components/login/tru-login.mjs +0 -58
  371. package/esm2020/lib/components/password-dialog/tru-password-dialog.mjs +0 -44
  372. package/esm2020/lib/components/toolbar/button/tru-toolbar-button.mjs +0 -41
  373. package/esm2020/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +0 -24
  374. package/esm2020/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +0 -43
  375. package/esm2020/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +0 -16
  376. package/esm2020/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +0 -26
  377. package/esm2020/lib/components/toolbar/menu/tru-toolbar-menu.mjs +0 -33
  378. package/esm2020/lib/components/toolbar/text/tru-toolbar-text.mjs +0 -28
  379. package/esm2020/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +0 -35
  380. package/esm2020/lib/components/validation-dialog/tru-validation-dialog-config.mjs +0 -21
  381. package/esm2020/lib/components/validation-dialog/tru-validation-dialog.mjs +0 -79
  382. package/esm2020/lib/directives/breeze-validator/tru-breeze-validator.mjs +0 -100
  383. package/esm2020/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +0 -151
  384. package/esm2020/lib/directives/select-panel/tru-mat-select-panel.mjs +0 -66
  385. package/esm2020/lib/services/tru-app-environment.mjs +0 -94
  386. package/esm2020/lib/services/tru-breeze-context-factory.mjs +0 -79
  387. package/esm2020/lib/services/tru-breeze-metadata-provider.mjs +0 -22
  388. package/esm2020/lib/services/tru-component-lookup.mjs +0 -25
  389. package/esm2020/lib/services/tru-connection-hub.mjs +0 -48
  390. package/esm2020/lib/services/tru-context-filters.mjs +0 -29
  391. package/esm2020/lib/services/tru-data-context.mjs +0 -258
  392. package/esm2020/lib/services/tru-entity-accessor.mjs +0 -287
  393. package/esm2020/lib/services/tru-model-property-lookup.mjs +0 -22
  394. package/esm2020/lib/services/tru-search-result-view-manager.mjs +0 -17
  395. package/esm2020/lib/services/tru-sort.mjs +0 -114
  396. package/esm2020/lib/services/tru-table-registry.mjs +0 -16
  397. package/esm2020/lib/services/tru-text-manager.mjs +0 -134
  398. package/esm2020/lib/services/tru-ui-notification.mjs +0 -103
  399. package/esm2020/lib/services/tru-user.mjs +0 -63
  400. package/esm2020/lib/services/tru-util.mjs +0 -77
  401. package/fesm2015/trudb-tru-common-lib.mjs +0 -6799
  402. package/fesm2015/trudb-tru-common-lib.mjs.map +0 -1
  403. package/fesm2020/trudb-tru-common-lib.mjs +0 -6776
  404. package/fesm2020/trudb-tru-common-lib.mjs.map +0 -1
@@ -0,0 +1,737 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { TruDesktopService } from './services/tru-desktop-service';
3
+ import { TruDesktopViewConfig } from './classes/tru-desktop-view-config';
4
+ import { TruDesktopViewport } from './viewport/tru-desktop-viewport';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./services/tru-desktop-service";
7
+ import * as i2 from "../../services/tru-text-manager";
8
+ import * as i3 from "./services/tru-window-event-handler";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "./menubar/tru-desktop-menubar";
11
+ import * as i6 from "./taskbar/tru-desktop-taskbar";
12
+ import * as i7 from "./viewport/tru-desktop-viewport";
13
+ export class TruDesktop {
14
+ desktopService;
15
+ textManager;
16
+ truWindowEventHandler;
17
+ options;
18
+ viewportComponent;
19
+ constructor(desktopService, textManager, truWindowEventHandler) {
20
+ this.desktopService = desktopService;
21
+ this.textManager = textManager;
22
+ this.truWindowEventHandler = truWindowEventHandler;
23
+ this.desktop = this.desktopService.createDesktop();
24
+ }
25
+ minimizeAll = false;
26
+ desktop;
27
+ minWindowCascadePosition = 40;
28
+ maxWindowCascadePosition = 100;
29
+ lastWindowCascadePosition = { top: this.minWindowCascadePosition, left: this.minWindowCascadePosition };
30
+ shiftPressed = false;
31
+ altPressed = false;
32
+ xPressed = false;
33
+ keyboardMap = ["", "", "", "CANCEL", "", "", "HELP", "", "BACK_SPACE", "TAB", "", "", "CLEAR", "ENTER", "RETURN", "", "SHIFT", "CONTROL", "ALT", "PAUSE", "CAPS_LOCK", "KANA", "EISU", "JUNJA", "FINAL", "HANJA", "", "ESCAPE", "CONVERT", "NONCONVERT", "ACCEPT", "MODECHANGE", "SPACE", "PAGE_UP", "PAGE_DOWN", "END", "HOME", "LEFT", "UP", "RIGHT", "DOWN", "SELECT", "PRINT", "EXECUTE", "PRINTSCREEN", "INSERT", "DELETE", "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "COLON", "SEMICOLON", "LESS_THAN", "EQUALS", "GREATER_THAN", "QUESTION_MARK", "AT", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "WIN", "", "CONTEXT_MENU", "", "SLEEP", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "MULTIPLY", "ADD", "SEPARATOR", "SUBTRACT", "DECIMAL", "DIVIDE", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "", "", "", "", "", "", "", "", "NUM_LOCK", "SCROLL_LOCK", "WIN_OEM_FJ_JISHO", "WIN_OEM_FJ_MASSHOU", "WIN_OEM_FJ_TOUROKU", "WIN_OEM_FJ_LOYA", "WIN_OEM_FJ_ROYA", "", "", "", "", "", "", "", "", "", "CIRCUMFLEX", "EXCLAMATION", "DOUBLE_QUOTE", "HASH", "DOLLAR", "PERCENT", "AMPERSAND", "UNDERSCORE", "OPEN_PAREN", "CLOSE_PAREN", "ASTERISK", "PLUS", "PIPE", "HYPHEN_MINUS", "OPEN_CURLY_BRACKET", "CLOSE_CURLY_BRACKET", "TILDE", "", "", "", "", "VOLUME_MUTE", "VOLUME_DOWN", "VOLUME_UP", "", "", "", "", "COMMA", "", "PERIOD", "SLASH", "BACK_QUOTE", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "OPEN_BRACKET", "BACK_SLASH", "CLOSE_BRACKET", "QUOTE", "", "META", "ALTGR", "", "WIN_ICO_HELP", "WIN_ICO_00", "", "WIN_ICO_CLEAR", "", "", "WIN_OEM_RESET", "WIN_OEM_JUMP", "WIN_OEM_PA1", "WIN_OEM_PA2", "WIN_OEM_PA3", "WIN_OEM_WSCTRL", "WIN_OEM_CUSEL", "WIN_OEM_ATTN", "WIN_OEM_FINISH", "WIN_OEM_COPY", "WIN_OEM_AUTO", "WIN_OEM_ENLW", "WIN_OEM_BACKTAB", "ATTN", "CRSEL", "EXSEL", "EREOF", "PLAY", "ZOOM", "", "PA1", "WIN_OEM_CLEAR", ""];
34
+ logoUrl = null;
35
+ /**
36
+ * @tru.doc function
37
+ * @name truDesktopComponent.getDesktop
38
+ * @module tru.desktop
39
+ *
40
+ * @description
41
+ * Return an object of desktop.
42
+ *
43
+ * @returns {object} desktop.
44
+ */
45
+ getDesktop = () => {
46
+ return this.desktop;
47
+ };
48
+ /**
49
+ * @tru.doc function
50
+ * @name truDesktopComponent.getOptions
51
+ * @module tru.desktop
52
+ *
53
+ * @description
54
+ * Return an object of desktop options.
55
+ *
56
+ * @returns {object} options.
57
+ */
58
+ getOptions = () => {
59
+ return this.options;
60
+ };
61
+ /**
62
+ * @tru.doc function
63
+ * @name truDesktopComponent.getWindows
64
+ * @module tru.desktop
65
+ *
66
+ * @description
67
+ * Return an array of windows.
68
+ *
69
+ * @returns {array} windows.
70
+ */
71
+ getWindows = () => {
72
+ return this.windows;
73
+ };
74
+ /**
75
+ * @tru.doc function
76
+ * @name truDesktopComponent.getNextMaxZIndex
77
+ * @module tru.desktop
78
+ *
79
+ * @description
80
+ * Iterates through all window objects in the windows array to find the max z-index
81
+ * and increases the value found by 1.
82
+ *
83
+ * @returns {int}
84
+ */
85
+ getNextMaxZIndex = () => {
86
+ var max = 0;
87
+ var tmp;
88
+ for (var i = this.windows.length - 1; i >= 0; i--) {
89
+ tmp = this.windows[i].zIndex;
90
+ if (tmp > max)
91
+ max = tmp;
92
+ }
93
+ return ++max;
94
+ };
95
+ /**
96
+ * @tru.doc function
97
+ * @name truDesktopComponent.clearActive
98
+ * @module tru.desktop
99
+ *
100
+ * @description
101
+ * Iterates through all window objects in the windows
102
+ * and sets the active property to false.
103
+ *
104
+ */
105
+ clearActive = () => {
106
+ this.windows.forEach((window) => {
107
+ window.active = false;
108
+ });
109
+ };
110
+ /**
111
+ * @tru.doc function
112
+ * @name truDesktopComponent.getActiveWindow
113
+ * @module tru.desktop
114
+ *
115
+ * @description
116
+ * Gets the active window.
117
+ *
118
+ * @returns {object} view object.
119
+ */
120
+ getActiveWindow = () => {
121
+ var activeWindow = null;
122
+ this.windows.forEach((wdw) => {
123
+ if (wdw.active === true) {
124
+ activeWindow = wdw;
125
+ }
126
+ });
127
+ return activeWindow;
128
+ };
129
+ /**
130
+ * @tru.doc function
131
+ * @name truDesktopComponent.getActiveView
132
+ * @module tru.desktop
133
+ *
134
+ * @description
135
+ * Gets the active view.
136
+ *
137
+ * @returns {object} view object.
138
+ */
139
+ getActiveView = (wdw) => {
140
+ var activeView = null;
141
+ wdw.views.forEach((view) => {
142
+ if (view.active$.getValue() === true) {
143
+ activeView = view;
144
+ }
145
+ });
146
+ return activeView;
147
+ };
148
+ /**
149
+ * @tru.doc function
150
+ * @name truDesktopComponent.allWindowsAreMinimized
151
+ * @module tru.desktop
152
+ *
153
+ * @description
154
+ * Iterates through windows to determine if all are minimized.
155
+ *
156
+ */
157
+ allWindowsAreMinimized = () => {
158
+ var allMinimized = true;
159
+ this.windows.forEach((window) => {
160
+ if (!window.minimized) {
161
+ allMinimized = false;
162
+ }
163
+ });
164
+ return allMinimized;
165
+ };
166
+ /**
167
+ * @tru.doc function
168
+ * @name truDesktopComponent.hideShowAll
169
+ * @module tru.desktop
170
+ *
171
+ * @description
172
+ * Hides/shows all windows
173
+ *
174
+ */
175
+ hideShowAll = () => {
176
+ this.minimizeAll = this.allWindowsAreMinimized() ? false : !this.minimizeAll;
177
+ this.windows.forEach((wdw) => {
178
+ if (wdw.outOfBounds)
179
+ this.recover(wdw);
180
+ wdw.active = false;
181
+ wdw.minimized = this.minimizeAll;
182
+ });
183
+ this.activateForemostWindow();
184
+ return this.minimizeAll;
185
+ };
186
+ /**
187
+ * @tru.doc function
188
+ * @name truDesktopComponent.findWindowViewDirective
189
+ * @module tru.desktop
190
+ *
191
+ * @description
192
+ * Looks for previously open window with a view directive
193
+ *
194
+ */
195
+ findWindowViewDirective = (windowViewDirective) => {
196
+ for (let i = 0; i < this.windows.length; i++) {
197
+ for (let j = 0; j < this.windows[i].views.length; j++) {
198
+ if (this.windows[i].views[0].viewDirective === windowViewDirective)
199
+ return this.windows[i];
200
+ }
201
+ }
202
+ return null;
203
+ };
204
+ /**
205
+ * @tru.doc function
206
+ * @name truDesktopComponent.openWindow
207
+ * @module tru.desktop
208
+ *
209
+ * @description
210
+ * Displays a new window. All window properties defined by the application developer will be
211
+ * overlaid here before displaying the window
212
+ *
213
+ */
214
+ openWindow = (windowConfigOverlays, singleInstance) => {
215
+ let activeWindow = this.getActiveWindow();
216
+ if (activeWindow && activeWindow.isModal) {
217
+ activeWindow.invalidOperation = true;
218
+ return;
219
+ }
220
+ if (singleInstance) {
221
+ let window = this.findWindowViewDirective(windowConfigOverlays.views[0].viewDirective);
222
+ if (window) {
223
+ this.updateWindowState(window);
224
+ return;
225
+ }
226
+ }
227
+ if (windowConfigOverlays.isModal) {
228
+ let heightOffset = (parseInt(windowConfigOverlays.height, 10) / 2) + 30;
229
+ let widthOffset = (parseInt(windowConfigOverlays.width, 10) / 2);
230
+ windowConfigOverlays.top = 'calc(50% - ' + heightOffset + 'px )';
231
+ windowConfigOverlays.left = 'calc(50% - ' + widthOffset + 'px )';
232
+ }
233
+ this.clearActive();
234
+ let configuredWindow = this.configureWindow(windowConfigOverlays);
235
+ configuredWindow.views = this.configureViews(windowConfigOverlays, configuredWindow);
236
+ if (!configuredWindow.isModal) {
237
+ configuredWindow.cascadeWindow = false;
238
+ this.savePosition(configuredWindow);
239
+ this.maximize(configuredWindow);
240
+ this.windows.push(configuredWindow);
241
+ }
242
+ else {
243
+ this.windows.push(configuredWindow);
244
+ }
245
+ };
246
+ /**
247
+ * @tru.doc function
248
+ * @name truDesktopComponent.configureWindow
249
+ * @module tru.desktop
250
+ *
251
+ * @description
252
+ * Creates a new window instance.
253
+ *
254
+ */
255
+ configureWindow = (windowConfigOverlays) => {
256
+ var windowConfigInstance = Object.assign({}, this.desktop.windowConfig);
257
+ windowConfigInstance.savedPosition = Object.create({ top: 0, left: 0, right: 0, bottom: 0, height: 0, width: 0 });
258
+ windowConfigInstance.zIndex = this.getNextMaxZIndex();
259
+ //windowConfigInstance.globals = Object.assign({}, $rootScope.$eval(this.options.globals));
260
+ return Object.assign(windowConfigInstance, windowConfigOverlays);
261
+ };
262
+ /**
263
+ * @tru.doc function
264
+ * @name truDesktopComponent.configureViews
265
+ * @module tru.desktop
266
+ *
267
+ * @description
268
+ * Creates one or more view instances
269
+ *
270
+ */
271
+ configureViews = (windowConfigOverlays, configuredWindow) => {
272
+ let configuredViews = [];
273
+ windowConfigOverlays.views.forEach((view) => {
274
+ let configuredView = new TruDesktopViewConfig();
275
+ configuredView.componentName = view.componentName;
276
+ configuredView.entities = view.entities;
277
+ configuredView.entityIndex = view.entityIndex;
278
+ configuredView.isDirty = view.isDirty;
279
+ configuredView.isEditing = view.isEditing;
280
+ configuredView.isInvalid = view.isValid;
281
+ configuredView.openAsDetaiView = view.openAsDetailView;
282
+ //viewConfigInstance.globals = this.options.globals;
283
+ //let configuredView = Object.assign(viewConfigInstance, view);
284
+ configuredView.window = configuredWindow;
285
+ configuredViews.push(configuredView);
286
+ });
287
+ return configuredViews;
288
+ };
289
+ /**
290
+ * @tru.doc function
291
+ * @name truDesktopComponent.closeWindow
292
+ * @module tru.desktop
293
+ *
294
+ * @description
295
+ * Remove a window {object} from the windows array.
296
+ *
297
+ * @returns {boolean} returns true if window was closed, false if not closed.
298
+ */
299
+ closeWindow = (wdw) => {
300
+ if (!this.options.allowDirtyClose && wdw.isDirty) {
301
+ alert("Unsaved Changes. Save changes before closing window.");
302
+ return false;
303
+ }
304
+ if (!this.options.allowInvalidClose && wdw.isInvalid) {
305
+ alert("Data is invalid. Correct Invalid data before closing window.");
306
+ return false;
307
+ }
308
+ if (this.options.canCloseFn !== undefined) {
309
+ if (this.options.canCloseFn(wdw)) {
310
+ this.windows.splice(this.windows.indexOf(wdw), 1);
311
+ this.activateForemostWindow();
312
+ return true;
313
+ }
314
+ ;
315
+ }
316
+ else {
317
+ this.windows.splice(this.windows.indexOf(wdw), 1);
318
+ this.activateForemostWindow();
319
+ return true;
320
+ }
321
+ return false;
322
+ };
323
+ /**
324
+ * @tru.doc function
325
+ * @name truDesktopComponent.activateForemostWindow
326
+ * @module tru.desktop
327
+ *
328
+ * @description
329
+ * Set the foremost window to an active state
330
+ *
331
+ */
332
+ activateForemostWindow = () => {
333
+ var foremost = undefined;
334
+ for (var i = 0; i < this.windows.length; i++) {
335
+ if ((foremost === undefined || this.windows[i].zIndex > foremost.zIndex) && !this.windows[i].minimized && !this.windows[i].outOfBounds)
336
+ foremost = this.windows[i];
337
+ }
338
+ if (foremost)
339
+ foremost.active = true;
340
+ };
341
+ /**
342
+ * @tru.doc function
343
+ * @name truDesktopComponent.activateNextWindow
344
+ * @module tru.desktop
345
+ *
346
+ * @description
347
+ * Set the next window to an active state
348
+ *
349
+ */
350
+ activateNextWindow = (activeWindowLocation) => {
351
+ if (this.windows.length <= 1)
352
+ return;
353
+ var backend = this.windows.slice(activeWindowLocation);
354
+ var frontend = this.windows.slice(0, activeWindowLocation - 1);
355
+ var sorted = backend.concat(frontend);
356
+ var nextWindow = undefined;
357
+ for (var i = 0; i < sorted.length; i++) {
358
+ if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
359
+ nextWindow = sorted[i];
360
+ }
361
+ if (nextWindow) {
362
+ this.clearActive();
363
+ nextWindow.zIndex = this.getNextMaxZIndex();
364
+ nextWindow.active = true;
365
+ }
366
+ };
367
+ /**
368
+ * @tru.doc function
369
+ * @name truDesktopComponent.activatePreviousWindow
370
+ * @module tru.desktop
371
+ *
372
+ * @description
373
+ * Set the previous window to an active state
374
+ *
375
+ */
376
+ activatePreviousWindow = (activeWindowLocation) => {
377
+ if (this.windows.length <= 1)
378
+ return;
379
+ var backend = this.windows.slice(activeWindowLocation);
380
+ var frontend = this.windows.slice(0, activeWindowLocation - 1);
381
+ var sorted = backend.concat(frontend);
382
+ var nextWindow = undefined;
383
+ for (var i = sorted.length - 1; i >= 0; i--) {
384
+ if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
385
+ nextWindow = sorted[i];
386
+ }
387
+ if (nextWindow) {
388
+ this.clearActive();
389
+ nextWindow.zIndex = this.getNextMaxZIndex();
390
+ nextWindow.active = true;
391
+ }
392
+ };
393
+ /**
394
+ * @tru.doc function
395
+ * @name truDesktopComponent.minimize
396
+ * @module tru.desktop
397
+ *
398
+ * @description
399
+ * Visually removes window from the viewport.
400
+ *
401
+ */
402
+ minimize = (window) => {
403
+ this.savePosition(window);
404
+ window.active = false;
405
+ window.minimized = true;
406
+ this.activateForemostWindow();
407
+ };
408
+ /**
409
+ * @tru.doc function
410
+ * @name truDesktopComponent.maximize
411
+ * @module tru.desktop
412
+ *
413
+ * @description
414
+ * Positions window such that it fills the whole viewport.
415
+ *
416
+ */
417
+ maximize = (window) => {
418
+ window.top = 0;
419
+ window.left = 0;
420
+ window.right = 0;
421
+ window.bottom = 0;
422
+ window.height = 'auto';
423
+ window.width = '100%';
424
+ window.maximized = 'fill';
425
+ };
426
+ /**
427
+ * @tru.doc function
428
+ * @name truDesktopComponent.maximizeLeft
429
+ * @module tru.desktop
430
+ *
431
+ * @description
432
+ * Positions window such that it fills the left portion viewport.
433
+ *
434
+ */
435
+ maximizeLeft = (window) => {
436
+ window.split = true;
437
+ window.top = 0;
438
+ window.left = 0;
439
+ window.bottom = 0;
440
+ window.width = '50%';
441
+ window.height = 'auto';
442
+ window.maximized = 'left';
443
+ };
444
+ /**
445
+ * @tru.doc function
446
+ * @name truDesktopComponent.maximizeRight
447
+ * @module tru.desktop
448
+ *
449
+ * @description
450
+ * Positions window such that it fills the right portion viewport.
451
+ *
452
+ */
453
+ maximizeRight = (window) => {
454
+ window.top = 0;
455
+ window.left = '50%';
456
+ window.right = 0;
457
+ window.bottom = 0;
458
+ window.width = '50%';
459
+ window.height = 'auto';
460
+ window.maximized = 'right';
461
+ };
462
+ /**
463
+ * @tru.doc function
464
+ * @name truDesktopComponent.recover
465
+ * @module tru.desktop
466
+ *
467
+ * @description
468
+ * Brings window back into view when it has escaped the viewport.
469
+ *
470
+ */
471
+ recover = (window) => {
472
+ window.active = true;
473
+ window.outOfBounds = false;
474
+ window.minimized = false;
475
+ window.zIndex = this.getNextMaxZIndex();
476
+ this.cascadeWindow(window);
477
+ this.clearActive();
478
+ this.activateForemostWindow();
479
+ };
480
+ /**
481
+ * @tru.doc function
482
+ * @name truDesktopComponent.restore
483
+ * @module tru.desktop
484
+ *
485
+ * @description
486
+ *
487
+ */
488
+ restore = (wdw) => {
489
+ if (wdw.maximized === 'fill') {
490
+ this.maximize(wdw);
491
+ }
492
+ else if (wdw.maximized === 'left') {
493
+ this.maximizeLeft(wdw);
494
+ }
495
+ else if (wdw.maximized === 'right') {
496
+ this.maximizeRight(wdw);
497
+ }
498
+ this.updateWindowState(wdw);
499
+ };
500
+ /**
501
+ * @tru.doc function
502
+ * @name truDesktopComponent.bringToFront
503
+ * @module tru.desktop
504
+ *
505
+ * @description
506
+ *
507
+ */
508
+ updateWindowState = (wdw) => {
509
+ if (wdw.outOfBounds) {
510
+ this.recover(wdw);
511
+ return;
512
+ }
513
+ if (wdw.maximized === 'fill') {
514
+ this.maximize(wdw);
515
+ }
516
+ else if (wdw.maximized === 'left') {
517
+ this.maximizeLeft(wdw);
518
+ }
519
+ else if (wdw.maximized === 'right') {
520
+ this.maximizeRight(wdw);
521
+ }
522
+ this.clearActive();
523
+ wdw.active = true;
524
+ wdw.minimized = false;
525
+ wdw.zIndex = this.getNextMaxZIndex();
526
+ };
527
+ /**
528
+ * @tru.doc function
529
+ * @name truDesktopComponent.restoreSavedPosition
530
+ * @module tru.desktop
531
+ *
532
+ * @description
533
+ * Set the windows last know position to the current position.
534
+ *
535
+ */
536
+ restoreSavedPosition = (wdw) => {
537
+ this.clearActive();
538
+ wdw.top = wdw.savedPosition.top;
539
+ wdw.left = wdw.savedPosition.left;
540
+ wdw.right = wdw.savedPosition.right;
541
+ wdw.bottom = wdw.savedPosition.bottom;
542
+ wdw.height = wdw.savedPosition.height;
543
+ wdw.width = wdw.savedPosition.width;
544
+ wdw.maximized = undefined;
545
+ wdw.minimized = undefined;
546
+ wdw.active = true;
547
+ wdw.minimized = false;
548
+ wdw.zIndex = this.getNextMaxZIndex();
549
+ };
550
+ /**
551
+ * @tru.doc function
552
+ * @name truDesktopComponent.savePosition
553
+ * @module tru.desktop
554
+ *
555
+ * @description
556
+ * Save the windows last know position.
557
+ *
558
+ */
559
+ savePosition = (wdw) => {
560
+ wdw.savedPosition.top = wdw.top;
561
+ wdw.savedPosition.left = wdw.left;
562
+ wdw.savedPosition.right = wdw.right;
563
+ wdw.savedPosition.bottom = wdw.bottom;
564
+ wdw.savedPosition.height = wdw.height;
565
+ wdw.savedPosition.width = wdw.width;
566
+ };
567
+ /**
568
+ * @tru.doc function
569
+ * @name truDesktopComponent.closeWindow
570
+ * @module tru.desktop
571
+ *
572
+ * @description
573
+ * Moves a window to the next cascade position.
574
+ *
575
+ */
576
+ cascadeWindow = (window) => {
577
+ if (!this.options.enableWindowCascading || window.isModal)
578
+ return;
579
+ this.lastWindowCascadePosition.top += 10;
580
+ this.lastWindowCascadePosition.left += 10;
581
+ if (this.lastWindowCascadePosition.top > this.maxWindowCascadePosition)
582
+ this.lastWindowCascadePosition.top = this.minWindowCascadePosition;
583
+ if (this.lastWindowCascadePosition.left > this.maxWindowCascadePosition)
584
+ this.lastWindowCascadePosition.left = this.minWindowCascadePosition;
585
+ window.top = this.lastWindowCascadePosition.top + 'px';
586
+ window.left = this.lastWindowCascadePosition.left + 'px';
587
+ };
588
+ /**
589
+ * @tru.doc function
590
+ * @name truDesktopComponent.getKeyCode
591
+ * @module tru.desktop
592
+ *
593
+ * @description
594
+ *
595
+ */
596
+ getKeySequence = (event) => {
597
+ var keys = [];
598
+ if (event.shiftKey)
599
+ keys.push('shift');
600
+ if (event.ctrlKey)
601
+ keys.push('ctrl');
602
+ if (event.altKey)
603
+ keys.push('alt');
604
+ if (event.metaKey)
605
+ keys.push('meta');
606
+ var keyCode = event.keyCode || event.which;
607
+ if (keyCode)
608
+ keys.push(this.keyboardMap[keyCode].toLowerCase());
609
+ return keys.join('+');
610
+ };
611
+ /**
612
+ * @tru.doc event
613
+ * @module tru.desktop
614
+ *
615
+ * @description
616
+ *
617
+ */
618
+ onKeyDown = (event) => {
619
+ var keySequence = this.getKeySequence(event);
620
+ if (keySequence === 'alt+m') { //Maximize
621
+ var activeWindow = this.getActiveWindow();
622
+ if (activeWindow === null)
623
+ return;
624
+ if (!activeWindow.maximized) {
625
+ this.savePosition(activeWindow);
626
+ this.maximize(activeWindow);
627
+ }
628
+ else if (activeWindow.maximized === 'right' || activeWindow.maximized === 'left')
629
+ this.maximize(activeWindow);
630
+ else
631
+ this.restoreSavedPosition(activeWindow);
632
+ event.preventDefault();
633
+ }
634
+ if (keySequence === 'alt+n') { //Minimize
635
+ var activeWindow = this.getActiveWindow();
636
+ if (activeWindow === null || activeWindow.minimized)
637
+ return;
638
+ this.minimize(activeWindow);
639
+ event.preventDefault();
640
+ }
641
+ if (keySequence === 'alt+w') { //Cycles Forward
642
+ var index = this.windows.indexOf(this.getActiveWindow());
643
+ this.activateNextWindow(index + 1);
644
+ event.preventDefault();
645
+ }
646
+ if (keySequence === 'shift+alt+w') { //Cycles Backward
647
+ var index = this.windows.indexOf(this.getActiveWindow());
648
+ this.activatePreviousWindow(index + 1);
649
+ event.preventDefault();
650
+ }
651
+ if (keySequence === 'shift+alt+x' && !(this.shiftPressed && this.altPressed && this.xPressed)) { //Close
652
+ var activeWindow = this.getActiveWindow();
653
+ if (!activeWindow)
654
+ return;
655
+ this.closeWindow(activeWindow);
656
+ event.preventDefault();
657
+ }
658
+ if (keySequence === 'alt+d') { //Toggle Desktop
659
+ //this.desktopShown = this.hideShowAll();
660
+ event.preventDefault();
661
+ }
662
+ if (event.shiftKey)
663
+ this.shiftPressed = true;
664
+ if (event.altKey)
665
+ this.altPressed = true;
666
+ if (event.keyCode === 88)
667
+ this.xPressed = true;
668
+ };
669
+ onKeyUp = (event) => {
670
+ if (event.shiftKey)
671
+ this.shiftPressed = false;
672
+ if (event.altKey)
673
+ this.altPressed = false;
674
+ if (event.keyCode === 88)
675
+ this.xPressed = false;
676
+ };
677
+ /**
678
+ * @tru.doc function
679
+ * @name truDesktopComponent.handleSelectAttempt
680
+ * @module tru.desktop
681
+ *
682
+ * @description
683
+ * Prevents the user from highlight desktop elements.
684
+ *
685
+ */
686
+ handleSelectAttempt = (e) => {
687
+ var nodeName = e.target.nodeName.toLowerCase();
688
+ if (nodeName === 'input' || nodeName === 'textarea' || nodeName === 'select')
689
+ return true;
690
+ if (window.event) {
691
+ e.preventDefault();
692
+ }
693
+ return true;
694
+ };
695
+ windows = [];
696
+ ngOnInit() {
697
+ this.logoUrl = this.options.logoUrl;
698
+ this.options = Object.assign(this.desktop.options, this.options);
699
+ this.options.viewportTop = this.options.menubarConfig !== undefined ? this.options.menubarHeight + 1 : 0;
700
+ this.truWindowEventHandler.onOpen().subscribe((windiowEvent) => {
701
+ this.openWindow(windiowEvent, false);
702
+ });
703
+ document.onselectstart = this.handleSelectAttempt;
704
+ window.addEventListener('keydown', this.onKeyDown);
705
+ window.addEventListener('keyup', this.onKeyUp);
706
+ window.onbeforeunload = (e) => {
707
+ let hasChanges = this.viewportComponent.windowComponents.filter((w) => { return w.hasChanges() ? true : false; });
708
+ if (hasChanges.length) {
709
+ e = e || window.event;
710
+ var msg = this.textManager.msgConfirmExitWithChangesPending;
711
+ // For IE and Firefox
712
+ if (e) {
713
+ e.returnValue = msg;
714
+ }
715
+ // For Safari / chrome
716
+ return msg;
717
+ }
718
+ return false;
719
+ };
720
+ }
721
+ ngOnDestroy() {
722
+ window.removeEventListener('keydown', this.onKeyDown);
723
+ window.removeEventListener('keyup', this.onKeyUp);
724
+ }
725
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TruDesktop, deps: [{ token: i1.TruDesktopService }, { token: i2.TruTextManager }, { token: i3.TruWindowEventHandler }], target: i0.ɵɵFactoryTarget.Component });
726
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TruDesktop, selector: "tru-desktop", inputs: { options: "options" }, providers: [TruDesktopService], viewQueries: [{ propertyName: "viewportComponent", first: true, predicate: TruDesktopViewport, descendants: true }], ngImport: i0, template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"], dependencies: [{ kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.TruDesktopMenubar, selector: "tru-desktop-menubar", inputs: ["desktopCtrl"] }, { kind: "component", type: i6.TruDesktopTaskbar, selector: "tru-desktop-taskbar", inputs: ["windows", "desktopCtrl"] }, { kind: "component", type: i7.TruDesktopViewport, selector: "tru-desktop-viewport", inputs: ["windows", "desktopCtrl"] }] });
727
+ }
728
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TruDesktop, decorators: [{
729
+ type: Component,
730
+ args: [{ selector: 'tru-desktop', providers: [TruDesktopService], template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"] }]
731
+ }], ctorParameters: () => [{ type: i1.TruDesktopService }, { type: i2.TruTextManager }, { type: i3.TruWindowEventHandler }], propDecorators: { options: [{
732
+ type: Input
733
+ }], viewportComponent: [{
734
+ type: ViewChild,
735
+ args: [TruDesktopViewport]
736
+ }] } });
737
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRlc2t0b3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnUtY29tbW9uLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZGVza3RvcC90cnUtZGVza3RvcC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kZXNrdG9wL3RydS1kZXNrdG9wLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7QUFRckUsTUFBTSxPQUFPLFVBQVU7SUFLWDtJQUNBO0lBQ0E7SUFORCxPQUFPLENBQU07SUFDaUIsaUJBQWlCLENBQXNCO0lBRTlFLFlBQ1UsY0FBaUMsRUFDakMsV0FBMkIsRUFDM0IscUJBQTRDO1FBRjVDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDM0IsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsT0FBTyxDQUFNO0lBQ2Isd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztJQUMvQix5QkFBeUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3hHLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxF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IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcnVXaW5kb3dFdmVudEFyZ3MgfSBmcm9tICcuL3NlcnZpY2VzL3RydS13aW5kb3ctZXZlbnQtYXJncyc7XHJcbmltcG9ydCB7IFRydVdpbmRvd0V2ZW50SGFuZGxlciB9IGZyb20gJy4vc2VydmljZXMvdHJ1LXdpbmRvdy1ldmVudC1oYW5kbGVyJztcbmltcG9ydCB7IFRydURlc2t0b3BTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90cnUtZGVza3RvcC1zZXJ2aWNlJztcbmltcG9ydCB7IFRydURlc2t0b3BWaWV3Q29uZmlnIH0gZnJvbSAnLi9jbGFzc2VzL3RydS1kZXNrdG9wLXZpZXctY29uZmlnJztcclxuaW1wb3J0IHsgVHJ1VGV4dE1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtdGV4dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgVHJ1RGVza3RvcFdpbmRvdyB9IGZyb20gJy4vd2luZG93L3RydS1kZXNrdG9wLXdpbmRvdyc7XHJcbmltcG9ydCB7IFRydURlc2t0b3BWaWV3cG9ydCB9IGZyb20gJy4vdmlld3BvcnQvdHJ1LWRlc2t0b3Atdmlld3BvcnQnO1xyXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RydS1kZXNrdG9wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RydS1kZXNrdG9wLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cnUtZGVza3RvcC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbVHJ1RGVza3RvcFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFRydURlc2t0b3AgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBvcHRpb25zOiBhbnk7XG4gIEBWaWV3Q2hpbGQoVHJ1RGVza3RvcFZpZXdwb3J0KSBwcml2YXRlIHZpZXdwb3J0Q29tcG9uZW50ITogVHJ1RGVza3RvcFZpZXdwb3J0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGVza3RvcFNlcnZpY2U6IFRydURlc2t0b3BTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGV4dE1hbmFnZXI6IFRydVRleHRNYW5hZ2VyLFxuICAgIHByaXZhdGUgdHJ1V2luZG93RXZlbnRIYW5kbGVyOiBUcnVXaW5kb3dFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLmRlc2t0b3AgPSB0aGlzLmRlc2t0b3BTZXJ2aWNlLmNyZWF0ZURlc2t0b3AoKTtcbiAgfVxyXG5cbiAgbWluaW1pemVBbGwgPSBmYWxzZTtcbiAgZGVza3RvcDogYW55O1xuICBtaW5XaW5kb3dDYXNjYWRlUG9zaXRpb24gPSA0MDtcbiAgbWF4V2luZG93Q2FzY2FkZVBvc2l0aW9uID0gMTAwO1xuICBsYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uID0geyB0b3A6IHRoaXMubWluV2luZG93Q2FzY2FkZVBvc2l0aW9uLCBsZWZ0OiB0aGlzLm1pbldpbmRvd0Nhc2NhZGVQb3NpdGlvbiB9O1xuICBzaGlmdFByZXNzZWQgPSBmYWxzZTtcbiAgYWx0UHJlc3NlZCA9IGZhbHNlO1xuICB4UHJlc3NlZCA9IGZhbHNlO1xuICBrZXlib2FyZE1hcCA9IFtcIlwiLCBcIlwiLCBcIlwiLCBcIkNBTkNFTFwiLCBcIlwiLCBcIlwiLCBcIkhFTFBcIiwgXCJcIiwgXCJCQUNLX1NQQUNFXCIsIFwiVEFCXCIsIFwiXCIsIFwiXCIsIFwiQ0xFQVJcIiwgXCJFTlRFUlwiLCBcIlJFVFVSTlwiLCBcIlwiLCBcIlNISUZUXCIsIFwiQ09OVFJPTFwiLCBcIkFMVFwiLCBcIlBBVVNFXCIsIFwiQ0FQU19MT0NLXCIsIFwiS0FOQVwiLCBcIkVJU1VcIiwgXCJKVU5KQVwiLCBcIkZJTkFMXCIsIFwiSEFOSkFcIiwgXCJcIiwgXCJFU0NBUEVcIiwgXCJDT05WRVJUXCIsIFwiTk9OQ09OVkVSVFwiLCBcIkFDQ0VQVFwiLCBcIk1PREVDSEFOR0VcIiwgXCJTUEFDRVwiLCBcIlBBR0VfVVBcIiwgXCJQQUdFX0RPV05cIiwgXCJFTkRcIiwgXCJIT01FXCIsIFwiTEVGVFwiLCBcIlVQXCIsIFwiUklHSFRcIiwgXCJET1dOXCIsIFwiU0VMRUNUXCIsIFwiUFJJTlRcIiwgXCJFWEVDVVRFXCIsIFwiUFJJTlRTQ1JFRU5cIiwgXCJJTlNFUlRcIiwgXCJERUxFVEVcIiwgXCJcIiwgXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiQ09MT05cIiwgXCJTRU1JQ09MT05cIiwgXCJMRVNTX1RIQU5cIiwgXCJFUVVBTFNcIiwgXCJHUkVBVEVSX1RIQU5cIiwgXCJRVUVTVElPTl9NQVJLXCIsIFwiQVRcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIiwgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsIFwiTlwiLCBcIk9cIiwgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIiwgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLCBcIldJTlwiLCBcIlwiLCBcIkNPTlRFWFRfTUVOVVwiLCBcIlwiLCBcIlNMRUVQXCIsIFwiTlVNUEFEMFwiLCBcIk5VTVBBRDFcIiwgXCJOVU1QQUQyXCIsIFwiTlVNUEFEM1wiLCBcIk5VTVBBRDRcIiwgXCJOVU1QQUQ1XCIsIFwiTlVNUEFENlwiLCBcIk5VTVBBRDdcIiwgXCJOVU1QQUQ4XCIsIFwiTlVNUEFEOVwiLCBcIk1VTFRJUExZXCIsIFwiQUREXCIsIFwiU0VQQVJBVE9SXCIsIFwiU1VCVFJBQ1RcIiwgXCJERUNJTUFMXCIsIFwiRElWSURFXCIsIFwiRjFcIiwgXCJGMlwiLCBcIkYzXCIsIFwiRjRcIiwgXCJGNVwiLCBcIkY2XCIsIFwiRjdcIiwgXCJGOFwiLCBcIkY5XCIsIFwiRjEwXCIsIFwiRjExXCIsIFwiRjEyXCIsIFwiRjEzXCIsIFwiRjE0XCIsIFwiRjE1XCIsIFwiRjE2XCIsIFwiRjE3XCIsIFwiRjE4XCIsIFwiRjE5XCIsIFwiRjIwXCIsIFwiRjIxXCIsIFwiRjIyXCIsIFwiRjIzXCIsIFwiRjI0XCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiTlVNX0xPQ0tcIiwgXCJTQ1JPTExfTE9DS1wiLCBcIldJTl9PRU1fRkpfSklTSE9cIiwgXCJXSU5fT0VNX0ZKX01BU1NIT1VcIiwgXCJXSU5fT0VNX0ZKX1RPVVJPS1VcIiwgXCJXSU5fT0VNX0ZKX0xPWUFcIiwgXCJXSU5fT0VNX0ZKX1JPWUFcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJDSVJDVU1GTEVYXCIsIFwiRVhDTEFNQVRJT05cIiwgXCJET1VCTEVfUVVPVEVcIiwgXCJIQVNIXCIsIFwiRE9MTEFSXCIsIFwiUEVSQ0VOVFwiLCBcIkFNUEVSU0FORFwiLCBcIlVOREVSU0NPUkVcIiwgXCJPUEVOX1BBUkVOXCIsIFwiQ0xPU0VfUEFSRU5cIiwgXCJBU1RFUklTS1wiLCBcIlBMVVNcIiwgXCJQSVBFXCIsIFwiSFlQSEVOX01JTlVTXCIsIFwiT1BFTl9DVVJMWV9CUkFDS0VUXCIsIFwiQ0xPU0VfQ1VSTFlfQlJBQ0tFVFwiLCBcIlRJTERFXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiVk9MVU1FX01VVEVcIiwgXCJWT0xVTUVfRE9XTlwiLCBcIlZPTFVNRV9VUFwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIkNPTU1BXCIsIFwiXCIsIFwiUEVSSU9EXCIsIFwiU0xBU0hcIiwgXCJCQUNLX1FVT1RFXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiT1BFTl9CUkFDS0VUXCIsIFwiQkFDS19TTEFTSFwiLCBcIkNMT1NFX0JSQUNLRVRcIiwgXCJRVU9URVwiLCBcIlwiLCBcIk1FVEFcIiwgXCJBTFRHUlwiLCBcIlwiLCBcIldJTl9JQ09fSEVMUFwiLCBcIldJTl9JQ09fMDBcIiwgXCJcIiwgXCJXSU5fSUNPX0NMRUFSXCIsIFwiXCIsIFwiXCIsIFwiV0lOX09FTV9SRVNFVFwiLCBcIldJTl9PRU1fSlVNUFwiLCBcIldJTl9PRU1fUEExXCIsIFwiV0lOX09FTV9QQTJcIiwgXCJXSU5fT0VNX1BBM1wiLCBcIldJTl9PRU1fV1NDVFJMXCIsIFwiV0lOX09FTV9DVVNFTFwiLCBcIldJTl9PRU1fQVRUTlwiLCBcIldJTl9PRU1fRklOSVNIXCIsIFwiV0lOX09FTV9DT1BZXCIsIFwiV0lOX09FTV9BVVRPXCIsIFwiV0lOX09FTV9FTkxXXCIsIFwiV0lOX09FTV9CQUNLVEFCXCIsIFwiQVRUTlwiLCBcIkNSU0VMXCIsIFwiRVhTRUxcIiwgXCJFUkVPRlwiLCBcIlBMQVlcIiwgXCJaT09NXCIsIFwiXCIsIFwiUEExXCIsIFwiV0lOX09FTV9DTEVBUlwiLCBcIlwiXTtcbiAgbG9nb1VybCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0RGVza3RvcFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IG9mIGRlc2t0b3AuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IGRlc2t0b3AuXG4gICAqL1xuICBnZXREZXNrdG9wID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmRlc2t0b3A7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0T3B0aW9uc1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IG9mIGRlc2t0b3Agb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gb3B0aW9ucy5cbiAgICovXG4gIGdldE9wdGlvbnMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5nZXRXaW5kb3dzXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiB3aW5kb3dzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7YXJyYXl9IHdpbmRvd3MuXG4gICAqL1xuICBnZXRXaW5kb3dzID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLndpbmRvd3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0TmV4dE1heFpJbmRleFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB3aW5kb3cgb2JqZWN0cyBpbiB0aGUgd2luZG93cyBhcnJheSB0byBmaW5kIHRoZSBtYXggei1pbmRleFxuICAgKiBhbmQgaW5jcmVhc2VzIHRoZSB2YWx1ZSBmb3VuZCBieSAxLlxuICAgKlxuICAgKiBAcmV0dXJucyB7aW50fVxuICAgKi9cbiAgZ2V0TmV4dE1heFpJbmRleCA9ICgpID0+IHtcbiAgICB2YXIgbWF4ID0gMDtcbiAgICB2YXIgdG1wO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLndpbmRvd3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRtcCA9IHRoaXMud2luZG93c1tpXS56SW5kZXg7XG4gICAgICBpZiAodG1wID4gbWF4KSBtYXggPSB0bXA7XG4gICAgfVxuICAgIHJldHVybiArK21heDtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5jbGVhckFjdGl2ZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB3aW5kb3cgb2JqZWN0cyBpbiB0aGUgd2luZG93c1xuICAgKiBhbmQgc2V0cyB0aGUgYWN0aXZlIHByb3BlcnR5IHRvIGZhbHNlLlxuICAgKlxuICAgKi9cbiAgY2xlYXJBY3RpdmUgPSAoKSA9PiB7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdpbmRvdzogYW55KSA9PiB7XG4gICAgICB3aW5kb3cuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0QWN0aXZlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdldHMgdGhlIGFjdGl2ZSB3aW5kb3cuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IHZpZXcgb2JqZWN0LlxuICAgKi9cbiAgZ2V0QWN0aXZlV2luZG93ID0gKCk6IGFueSA9PiB7XG4gICAgdmFyIGFjdGl2ZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdkdzogYW55KSA9PiB7XG4gICAgICBpZiAod2R3LmFjdGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBhY3RpdmVXaW5kb3cgPSB3ZHc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZVdpbmRvdztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5nZXRBY3RpdmVWaWV3XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdldHMgdGhlIGFjdGl2ZSB2aWV3LlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSB2aWV3IG9iamVjdC5cbiAgICovXG4gIGdldEFjdGl2ZVZpZXcgPSAod2R3OiBhbnkpID0+IHtcbiAgICB2YXIgYWN0aXZlVmlldyA9IG51bGw7XG4gICAgd2R3LnZpZXdzLmZvckVhY2goKHZpZXc6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXcuYWN0aXZlJC5nZXRWYWx1ZSgpID09PSB0cnVlKSB7XG4gICAgICAgIGFjdGl2ZVZpZXcgPSB2aWV3O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY3RpdmVWaWV3O1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmFsbFdpbmRvd3NBcmVNaW5pbWl6ZWRcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSXRlcmF0ZXMgdGhyb3VnaCB3aW5kb3dzIHRvIGRldGVybWluZSBpZiBhbGwgYXJlIG1pbmltaXplZC5cbiAgICpcbiAgICovXG4gIGFsbFdpbmRvd3NBcmVNaW5pbWl6ZWQgPSAoKSA9PiB7XG4gICAgdmFyIGFsbE1pbmltaXplZCA9IHRydWU7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdpbmRvdzogYW55KSA9PiB7XG4gICAgICBpZiAoIXdpbmRvdy5taW5pbWl6ZWQpIHtcbiAgICAgICAgYWxsTWluaW1pemVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFsbE1pbmltaXplZDtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5oaWRlU2hvd0FsbFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBIaWRlcy9zaG93cyBhbGwgd2luZG93c1xuICAgKlxuICAgKi9cbiAgaGlkZVNob3dBbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5taW5pbWl6ZUFsbCA9IHRoaXMuYWxsV2luZG93c0FyZU1pbmltaXplZCgpID8gZmFsc2UgOiAhdGhpcy5taW5pbWl6ZUFsbDtcbiAgICB0aGlzLndpbmRvd3MuZm9yRWFjaCgod2R3OiBhbnkpID0+IHtcbiAgICAgIGlmICh3ZHcub3V0T2ZCb3VuZHMpIHRoaXMucmVjb3Zlcih3ZHcpO1xuICAgICAgd2R3LmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgd2R3Lm1pbmltaXplZCA9IHRoaXMubWluaW1pemVBbGw7XG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gICAgcmV0dXJuIHRoaXMubWluaW1pemVBbGw7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cclxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmZpbmRXaW5kb3dWaWV3RGlyZWN0aXZlXHJcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogTG9va3MgZm9yIHByZXZpb3VzbHkgb3BlbiB3aW5kb3cgd2l0aCBhIHZpZXcgZGlyZWN0aXZlXHJcbiAgICpcclxuICAgKi9cclxuICBmaW5kV2luZG93Vmlld0RpcmVjdGl2ZSA9ICh3aW5kb3dWaWV3RGlyZWN0aXZlOiBhbnkpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53aW5kb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy53aW5kb3dzW2ldLnZpZXdzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2luZG93c1tpXS52aWV3c1swXS52aWV3RGlyZWN0aXZlID09PSB3aW5kb3dWaWV3RGlyZWN0aXZlKVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMud2luZG93c1tpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5vcGVuV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc3BsYXlzIGEgbmV3IHdpbmRvdy4gQWxsIHdpbmRvdyBwcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciB3aWxsIGJlXG4gICAqIG92ZXJsYWlkIGhlcmUgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIHdpbmRvd1xuICAgKlxuICAgKi9cbiAgb3BlbldpbmRvdyA9ICh3aW5kb3dDb25maWdPdmVybGF5czogYW55LCBzaW5nbGVJbnN0YW5jZTogYW55KSA9PiB7XG4gICAgbGV0IGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XHJcbiAgICBpZiAoYWN0aXZlV2luZG93ICYmIGFjdGl2ZVdpbmRvdy5pc01vZGFsKSB7XHJcbiAgICAgIGFjdGl2ZVdpbmRvdy5pbnZhbGlkT3BlcmF0aW9uID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzaW5nbGVJbnN0YW5jZSkge1xyXG4gICAgICBsZXQgd2luZG93ID0gdGhpcy5maW5kV2luZG93Vmlld0RpcmVjdGl2ZSh3aW5kb3dDb25maWdPdmVybGF5cy52aWV3c1swXS52aWV3RGlyZWN0aXZlKTtcclxuICAgICAgaWYgKHdpbmRvdykge1xyXG4gICAgICAgIHRoaXMudXBkYXRlV2luZG93U3RhdGUod2luZG93KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93Q29uZmlnT3ZlcmxheXMuaXNNb2RhbCkge1xyXG4gICAgICBsZXQgaGVpZ2h0T2Zmc2V0ID0gKHBhcnNlSW50KHdpbmRvd0NvbmZpZ092ZXJsYXlzLmhlaWdodCwgMTApIC8gMikgKyAzMDtcclxuICAgICAgbGV0IHdpZHRoT2Zmc2V0ID0gKHBhcnNlSW50KHdpbmRvd0NvbmZpZ092ZXJsYXlzLndpZHRoLCAxMCkgLyAyKTtcclxuICAgICAgd2luZG93Q29uZmlnT3ZlcmxheXMudG9wID0gJ2NhbGMoNTAlIC0gJyArIGhlaWdodE9mZnNldCArICdweCApJztcclxuICAgICAgd2luZG93Q29uZmlnT3ZlcmxheXMubGVmdCA9ICdjYWxjKDUwJSAtICcgKyB3aWR0aE9mZnNldCArICdweCApJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICBsZXQgY29uZmlndXJlZFdpbmRvdyA9IHRoaXMuY29uZmlndXJlV2luZG93KHdpbmRvd0NvbmZpZ092ZXJsYXlzKTtcclxuICAgIGNvbmZpZ3VyZWRXaW5kb3cudmlld3MgPSB0aGlzLmNvbmZpZ3VyZVZpZXdzKHdpbmRvd0NvbmZpZ092ZXJsYXlzLCBjb25maWd1cmVkV2luZG93KTtcclxuICAgIGlmICghY29uZmlndXJlZFdpbmRvdy5pc01vZGFsKSB7XHJcbiAgICAgIGNvbmZpZ3VyZWRXaW5kb3cuY2FzY2FkZVdpbmRvdyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNhdmVQb3NpdGlvbihjb25maWd1cmVkV2luZG93KTtcclxuICAgICAgdGhpcy5tYXhpbWl6ZShjb25maWd1cmVkV2luZG93KTtcclxuICAgICAgdGhpcy53aW5kb3dzLnB1c2goY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndpbmRvd3MucHVzaChjb25maWd1cmVkV2luZG93KTtcclxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5jb25maWd1cmVXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ3JlYXRlcyBhIG5ldyB3aW5kb3cgaW5zdGFuY2UuXG4gICAqXG4gICAqL1xuICBjb25maWd1cmVXaW5kb3cgPSAod2luZG93Q29uZmlnT3ZlcmxheXM6IGFueSkgPT4ge1xuICAgIHZhciB3aW5kb3dDb25maWdJbnN0YW5jZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZGVza3RvcC53aW5kb3dDb25maWcpO1xuICAgIHdpbmRvd0NvbmZpZ0luc3RhbmNlLnNhdmVkUG9zaXRpb24gPSBPYmplY3QuY3JlYXRlKHsgdG9wOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgYm90dG9tOiAwLCBoZWlnaHQ6IDAsIHdpZHRoOiAwIH0pO1xuICAgIHdpbmRvd0NvbmZpZ0luc3RhbmNlLnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xuICAgIC8vd2luZG93Q29uZmlnSW5zdGFuY2UuZ2xvYmFscyA9IE9iamVjdC5hc3NpZ24oe30sICRyb290U2NvcGUuJGV2YWwodGhpcy5vcHRpb25zLmdsb2JhbHMpKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih3aW5kb3dDb25maWdJbnN0YW5jZSwgd2luZG93Q29uZmlnT3ZlcmxheXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmNvbmZpZ3VyZVZpZXdzXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENyZWF0ZXMgb25lIG9yIG1vcmUgdmlldyBpbnN0YW5jZXNcbiAgICpcbiAgICovXG4gIGNvbmZpZ3VyZVZpZXdzID0gKHdpbmRvd0NvbmZpZ092ZXJsYXlzOiBhbnksIGNvbmZpZ3VyZWRXaW5kb3c6IGFueSk6IEFycmF5PGFueT4gPT4ge1xuICAgIGxldCBjb25maWd1cmVkVmlld3M6IEFycmF5PGFueT4gPSBbXTtcbiAgICB3aW5kb3dDb25maWdPdmVybGF5cy52aWV3cy5mb3JFYWNoKCh2aWV3OiBhbnkpID0+IHtcbiAgICAgIGxldCBjb25maWd1cmVkVmlldyA9IG5ldyBUcnVEZXNrdG9wVmlld0NvbmZpZygpO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5jb21wb25lbnROYW1lID0gdmlldy5jb21wb25lbnROYW1lO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5lbnRpdGllcyA9IHZpZXcuZW50aXRpZXM7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmVudGl0eUluZGV4ID0gdmlldy5lbnRpdHlJbmRleDtcclxuICAgICAgY29uZmlndXJlZFZpZXcuaXNEaXJ0eSA9IHZpZXcuaXNEaXJ0eTtcclxuICAgICAgY29uZmlndXJlZFZpZXcuaXNFZGl0aW5nID0gdmlldy5pc0VkaXRpbmc7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmlzSW52YWxpZCA9IHZpZXcuaXNWYWxpZDtcclxuICAgICAgY29uZmlndXJlZFZpZXcub3BlbkFzRGV0YWlWaWV3ID0gdmlldy5vcGVuQXNEZXRhaWxWaWV3O1xuICAgICAgLy92aWV3Q29uZmlnSW5zdGFuY2UuZ2xvYmFscyA9IHRoaXMub3B0aW9ucy5nbG9iYWxzO1xuICAgICAgLy9sZXQgY29uZmlndXJlZFZpZXcgPSBPYmplY3QuYXNzaWduKHZpZXdDb25maWdJbnN0YW5jZSwgdmlldyk7XG4gICAgICBjb25maWd1cmVkVmlldy53aW5kb3cgPSBjb25maWd1cmVkV2luZG93O1xuICAgICAgY29uZmlndXJlZFZpZXdzLnB1c2goY29uZmlndXJlZFZpZXcpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb25maWd1cmVkVmlld3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY2xvc2VXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVtb3ZlIGEgd2luZG93IHtvYmplY3R9IGZyb20gdGhlIHdpbmRvd3MgYXJyYXkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm5zIHRydWUgaWYgd2luZG93IHdhcyBjbG9zZWQsIGZhbHNlIGlmIG5vdCBjbG9zZWQuXG4gICAqL1xuICBjbG9zZVdpbmRvdyA9ICh3ZHc6IGFueSkgPT4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93RGlydHlDbG9zZSAmJiB3ZHcuaXNEaXJ0eSkge1xuICAgICAgYWxlcnQoXCJVbnNhdmVkIENoYW5nZXMuIFNhdmUgY2hhbmdlcyBiZWZvcmUgY2xvc2luZyB3aW5kb3cuXCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93SW52YWxpZENsb3NlICYmIHdkdy5pc0ludmFsaWQpIHtcbiAgICAgIGFsZXJ0KFwiRGF0YSBpcyBpbnZhbGlkLiBDb3JyZWN0IEludmFsaWQgZGF0YSBiZWZvcmUgY2xvc2luZyB3aW5kb3cuXCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FuQ2xvc2VGbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNhbkNsb3NlRm4od2R3KSkge1xuICAgICAgICB0aGlzLndpbmRvd3Muc3BsaWNlKHRoaXMud2luZG93cy5pbmRleE9mKHdkdyksIDEpO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRm9yZW1vc3RXaW5kb3coKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndpbmRvd3Muc3BsaWNlKHRoaXMud2luZG93cy5pbmRleE9mKHdkdyksIDEpO1xuICAgICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmFjdGl2YXRlRm9yZW1vc3RXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0IHRoZSBmb3JlbW9zdCB3aW5kb3cgdG8gYW4gYWN0aXZlIHN0YXRlXG4gICAqXG4gICAqL1xuICBhY3RpdmF0ZUZvcmVtb3N0V2luZG93ID0gKCkgPT4ge1xuICAgIHZhciBmb3JlbW9zdCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMud2luZG93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKChmb3JlbW9zdCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMud2luZG93c1tpXS56SW5kZXggPiBmb3JlbW9zdC56SW5kZXgpICYmICF0aGlzLndpbmRvd3NbaV0ubWluaW1pemVkICYmICF0aGlzLndpbmRvd3NbaV0ub3V0T2ZCb3VuZHMpXG4gICAgICAgIGZvcmVtb3N0ID0gdGhpcy53aW5kb3dzW2ldO1xuICAgIH1cbiAgICBpZiAoZm9yZW1vc3QpXG4gICAgICBmb3JlbW9zdC5hY3RpdmUgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmFjdGl2YXRlTmV4dFdpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXQgdGhlIG5leHQgd2luZG93IHRvIGFuIGFjdGl2ZSBzdGF0ZVxuICAgKlxuICAgKi9cbiAgYWN0aXZhdGVOZXh0V2luZG93ID0gKGFjdGl2ZVdpbmRvd0xvY2F0aW9uOiBhbnkpID0+IHtcbiAgICBpZiAodGhpcy53aW5kb3dzLmxlbmd0aCA8PSAxKSByZXR1cm47XG4gICAgdmFyIGJhY2tlbmQgPSB0aGlzLndpbmRvd3Muc2xpY2UoYWN0aXZlV2luZG93TG9jYXRpb24pO1xuICAgIHZhciBmcm9udGVuZCA9IHRoaXMud2luZG93cy5zbGljZSgwLCBhY3RpdmVXaW5kb3dMb2NhdGlvbiAtIDEpO1xuICAgIHZhciBzb3J0ZWQgPSBiYWNrZW5kLmNvbmNhdChmcm9udGVuZCk7XG4gICAgdmFyIG5leHRXaW5kb3cgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc29ydGVkW2ldLm1pbmltaXplZCAmJiAhc29ydGVkW2ldLm91dE9mQm91bmRzICYmICFuZXh0V2luZG93KVxuICAgICAgICBuZXh0V2luZG93ID0gc29ydGVkW2ldO1xuICAgIH1cblxuICAgIGlmIChuZXh0V2luZG93KSB7XG4gICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICBuZXh0V2luZG93LnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xuICAgICAgbmV4dFdpbmRvdy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hY3RpdmF0ZVByZXZpb3VzV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldCB0aGUgcHJldmlvdXMgd2luZG93IHRvIGFuIGFjdGl2ZSBzdGF0ZVxuICAgKlxuICAgKi9cbiAgYWN0aXZhdGVQcmV2aW91c1dpbmRvdyA9IChhY3RpdmVXaW5kb3dMb2NhdGlvbjogYW55KSA9PiB7XG4gICAgaWYgKHRoaXMud2luZG93cy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuICAgIHZhciBiYWNrZW5kID0gdGhpcy53aW5kb3dzLnNsaWNlKGFjdGl2ZVdpbmRvd0xvY2F0aW9uKTtcbiAgICB2YXIgZnJvbnRlbmQgPSB0aGlzLndpbmRvd3Muc2xpY2UoMCwgYWN0aXZlV2luZG93TG9jYXRpb24gLSAxKTtcbiAgICB2YXIgc29ydGVkID0gYmFja2VuZC5jb25jYXQoZnJvbnRlbmQpO1xuICAgIHZhciBuZXh0V2luZG93ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICghc29ydGVkW2ldLm1pbmltaXplZCAmJiAhc29ydGVkW2ldLm91dE9mQm91bmRzICYmICFuZXh0V2luZG93KVxuICAgICAgICBuZXh0V2luZG93ID0gc29ydGVkW2ldO1xuICAgIH1cblxuICAgIGlmIChuZXh0V2luZG93KSB7XG4gICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICBuZXh0V2luZG93LnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xuICAgICAgbmV4dFdpbmRvdy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5taW5pbWl6ZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBWaXN1YWxseSByZW1vdmVzIHdpbmRvdyBmcm9tIHRoZSB2aWV3cG9ydC5cbiAgICpcbiAgICovXG4gIG1pbmltaXplID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgdGhpcy5zYXZlUG9zaXRpb24od2luZG93KTtcblxuICAgIHdpbmRvdy5hY3RpdmUgPSBmYWxzZTtcbiAgICB3aW5kb3cubWluaW1pemVkID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2YXRlRm9yZW1vc3RXaW5kb3coKTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5tYXhpbWl6ZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQb3NpdGlvbnMgd2luZG93IHN1Y2ggdGhhdCBpdCBmaWxscyB0aGUgd2hvbGUgdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtYXhpbWl6ZSA9ICh3aW5kb3c6IGFueSkgPT4ge1xuICAgIHdpbmRvdy50b3AgPSAwO1xuICAgIHdpbmRvdy5sZWZ0ID0gMDtcbiAgICB3aW5kb3cucmlnaHQgPSAwO1xuICAgIHdpbmRvdy5ib3R0b20gPSAwO1xuICAgIHdpbmRvdy5oZWlnaHQgPSAnYXV0byc7XG4gICAgd2luZG93LndpZHRoID0gJzEwMCUnO1xuICAgIHdpbmRvdy5tYXhpbWl6ZWQgPSAnZmlsbCc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWF4aW1pemVMZWZ0XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFBvc2l0aW9ucyB3aW5kb3cgc3VjaCB0aGF0IGl0IGZpbGxzIHRoZSBsZWZ0IHBvcnRpb24gdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtYXhpbWl6ZUxlZnQgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICB3aW5kb3cuc3BsaXQgPSB0cnVlO1xuICAgIHdpbmRvdy50b3AgPSAwO1xuICAgIHdpbmRvdy5sZWZ0ID0gMDtcbiAgICB3aW5kb3cuYm90dG9tID0gMDtcbiAgICB3aW5kb3cud2lkdGggPSAnNTAlJztcbiAgICB3aW5kb3cuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHdpbmRvdy5tYXhpbWl6ZWQgPSAnbGVmdCc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWF4aW1pemVSaWdodFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQb3NpdGlvbnMgd2luZG93IHN1Y2ggdGhhdCBpdCBmaWxscyB0aGUgcmlnaHQgcG9ydGlvbiB2aWV3cG9ydC5cbiAgICpcbiAgICovXG4gIG1heGltaXplUmlnaHQgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICB3aW5kb3cudG9wID0gMDtcbiAgICB3aW5kb3cubGVmdCA9ICc1MCUnO1xuICAgIHdpbmRvdy5yaWdodCA9IDA7XG4gICAgd2luZG93LmJvdHRvbSA9IDA7XG4gICAgd2luZG93LndpZHRoID0gJzUwJSc7XG4gICAgd2luZG93LmhlaWdodCA9ICdhdXRvJztcbiAgICB3aW5kb3cubWF4aW1pemVkID0gJ3JpZ2h0JztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5yZWNvdmVyXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEJyaW5ncyB3aW5kb3cgYmFjayBpbnRvIHZpZXcgd2hlbiBpdCBoYXMgZXNjYXBlZCB0aGUgdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICByZWNvdmVyID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgd2luZG93LmFjdGl2ZSA9IHRydWU7XG4gICAgd2luZG93Lm91dE9mQm91bmRzID0gZmFsc2U7XG4gICAgd2luZG93Lm1pbmltaXplZCA9IGZhbHNlO1xuICAgIHdpbmRvdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICB0aGlzLmNhc2NhZGVXaW5kb3cod2luZG93KTtcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQucmVzdG9yZVxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKi9cbiAgcmVzdG9yZSA9ICh3ZHc6IGFueSkgPT4ge1xuICAgIGlmICh3ZHcubWF4aW1pemVkID09PSAnZmlsbCcpIHtcbiAgICAgIHRoaXMubWF4aW1pemUod2R3KTtcbiAgICB9IGVsc2UgaWYgKHdkdy5tYXhpbWl6ZWQgPT09ICdsZWZ0Jykge1xuICAgICAgdGhpcy5tYXhpbWl6ZUxlZnQod2R3KTtcbiAgICB9IGVsc2UgaWYgKHdkdy5tYXhpbWl6ZWQgPT09ICdyaWdodCcpIHtcbiAgICAgIHRoaXMubWF4aW1pemVSaWdodCh3ZHcpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVdpbmRvd1N0YXRlKHdkdyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuYnJpbmdUb0Zyb250XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqL1xuICB1cGRhdGVXaW5kb3dTdGF0ZSA9ICh3ZHc6IGFueSkgPT4ge1xyXG4gICAgaWYgKHdkdy5vdXRPZkJvdW5kcykge1xyXG4gICAgICB0aGlzLnJlY292ZXIod2R3KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3ZHcubWF4aW1pemVkID09PSAnZmlsbCcpIHtcclxuICAgICAgdGhpcy5tYXhpbWl6ZSh3ZHcpO1xyXG4gICAgfSBlbHNlIGlmICh3ZHcubWF4aW1pemVkID09PSAnbGVmdCcpIHtcclxuICAgICAgdGhpcy5tYXhpbWl6ZUxlZnQod2R3KTtcclxuICAgIH0gZWxzZSBpZiAod2R3Lm1heGltaXplZCA9PT0gJ3JpZ2h0Jykge1xyXG4gICAgICB0aGlzLm1heGltaXplUmlnaHQod2R3KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcclxuICAgIHdkdy5hY3RpdmUgPSB0cnVlO1xyXG4gICAgd2R3Lm1pbmltaXplZCA9IGZhbHNlO1xyXG4gICAgd2R3LnpJbmRleCA9IHRoaXMuZ2V0TmV4dE1heFpJbmRleCgpO1xyXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQucmVzdG9yZVNhdmVkUG9zaXRpb25cbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0IHRoZSB3aW5kb3dzIGxhc3Qga25vdyBwb3NpdGlvbiB0byB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICpcbiAgICovXG4gIHJlc3RvcmVTYXZlZFBvc2l0aW9uID0gKHdkdzogYW55KSA9PiB7XG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgIHdkdy50b3AgPSB3ZHcuc2F2ZWRQb3NpdGlvbi50b3A7XG4gICAgd2R3LmxlZnQgPSB3ZHcuc2F2ZWRQb3NpdGlvbi5sZWZ0O1xuICAgIHdkdy5yaWdodCA9IHdkdy5zYXZlZFBvc2l0aW9uLnJpZ2h0O1xuICAgIHdkdy5ib3R0b20gPSB3ZHcuc2F2ZWRQb3NpdGlvbi5ib3R0b207XG4gICAgd2R3LmhlaWdodCA9IHdkdy5zYXZlZFBvc2l0aW9uLmhlaWdodDtcbiAgICB3ZHcud2lkdGggPSB3ZHcuc2F2ZWRQb3NpdGlvbi53aWR0aDtcbiAgICB3ZHcubWF4aW1pemVkID0gdW5kZWZpbmVkO1xuICAgIHdkdy5taW5pbWl6ZWQgPSB1bmRlZmluZWQ7XG4gICAgd2R3LmFjdGl2ZSA9IHRydWU7XG4gICAgd2R3Lm1pbmltaXplZCA9IGZhbHNlO1xuICAgIHdkdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5zYXZlUG9zaXRpb25cbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2F2ZSB0aGUgd2luZG93cyBsYXN0IGtub3cgcG9zaXRpb24uXG4gICAqXG4gICAqL1xuICBzYXZlUG9zaXRpb24gPSAod2R3OiBhbnkpID0+IHtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi50b3AgPSB3ZHcudG9wO1xuICAgIHdkdy5zYXZlZFBvc2l0aW9uLmxlZnQgPSB3ZHcubGVmdDtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5yaWdodCA9IHdkdy5yaWdodDtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5ib3R0b20gPSB3ZHcuYm90dG9tO1xuICAgIHdkdy5zYXZlZFBvc2l0aW9uLmhlaWdodCA9IHdkdy5oZWlnaHQ7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24ud2lkdGggPSB3ZHcud2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY2xvc2VXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTW92ZXMgYSB3aW5kb3cgdG8gdGhlIG5leHQgY2FzY2FkZSBwb3NpdGlvbi5cbiAgICpcbiAgICovXG4gIGNhc2NhZGVXaW5kb3cgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVXaW5kb3dDYXNjYWRpbmcgfHwgd2luZG93LmlzTW9kYWwpIHJldHVybjtcbiAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wICs9IDEwO1xuICAgIHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi5sZWZ0ICs9IDEwO1xuICAgIGlmICh0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wID4gdGhpcy5tYXhXaW5kb3dDYXNjYWRlUG9zaXRpb24pXG4gICAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wID0gdGhpcy5taW5XaW5kb3dDYXNjYWRlUG9zaXRpb247XG4gICAgaWYgKHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi5sZWZ0ID4gdGhpcy5tYXhXaW5kb3dDYXNjYWRlUG9zaXRpb24pXG4gICAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24ubGVmdCA9IHRoaXMubWluV2luZG93Q2FzY2FkZVBvc2l0aW9uO1xuXG4gICAgd2luZG93LnRvcCA9IHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi50b3AgKyAncHgnO1xuICAgIHdpbmRvdy5sZWZ0ID0gdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLmxlZnQgKyAncHgnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldEtleUNvZGVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICovXG4gIGdldEtleVNlcXVlbmNlID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChldmVudC5zaGlmdEtleSkga2V5cy5wdXNoKCdzaGlmdCcpO1xuICAgIGlmIChldmVudC5jdHJsS2V5KSBrZXlzLnB1c2goJ2N0cmwnKTtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KSBrZXlzLnB1c2goJ2FsdCcpO1xuICAgIGlmIChldmVudC5tZXRhS2V5KSBrZXlzLnB1c2goJ21ldGEnKTtcblxuICAgIHZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDtcbiAgICBpZiAoa2V5Q29kZSkga2V5cy5wdXNoKHRoaXMua2V5Ym9hcmRNYXBba2V5Q29kZV0udG9Mb3dlckNhc2UoKSk7XG5cbiAgICByZXR1cm4ga2V5cy5qb2luKCcrJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGV2ZW50XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqL1xuICBvbktleURvd24gPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIHZhciBrZXlTZXF1ZW5jZSA9IHRoaXMuZ2V0S2V5U2VxdWVuY2UoZXZlbnQpO1xuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ2FsdCttJykgeyAvL01heGltaXplXG4gICAgICB2YXIgYWN0aXZlV2luZG93ID0gdGhpcy5nZXRBY3RpdmVXaW5kb3coKTtcbiAgICAgIGlmIChhY3RpdmVXaW5kb3cgPT09IG51bGwpIHJldHVybjtcbiAgICAgIGlmICghYWN0aXZlV2luZG93Lm1heGltaXplZCkge1xuICAgICAgICB0aGlzLnNhdmVQb3NpdGlvbihhY3RpdmVXaW5kb3cpO1xuICAgICAgICB0aGlzLm1heGltaXplKGFjdGl2ZVdpbmRvdyk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVdpbmRvdy5tYXhpbWl6ZWQgPT09ICdyaWdodCcgfHwgYWN0aXZlV2luZG93Lm1heGltaXplZCA9PT0gJ2xlZnQnKVxuICAgICAgICB0aGlzLm1heGltaXplKGFjdGl2ZVdpbmRvdyk7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMucmVzdG9yZVNhdmVkUG9zaXRpb24oYWN0aXZlV2luZG93KTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ2FsdCtuJykgeyAvL01pbmltaXplXG4gICAgICB2YXIgYWN0aXZlV2luZG93ID0gdGhpcy5nZXRBY3RpdmVXaW5kb3coKTtcbiAgICAgIGlmIChhY3RpdmVXaW5kb3cgPT09IG51bGwgfHwgYWN0aXZlV2luZG93Lm1pbmltaXplZCkgcmV0dXJuO1xuICAgICAgdGhpcy5taW5pbWl6ZShhY3RpdmVXaW5kb3cpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgaWYgKGtleVNlcXVlbmNlID09PSAnYWx0K3cnKSB7IC8vQ3ljbGVzIEZvcndhcmRcbiAgICAgIHZhciBpbmRleCA9IHRoaXMud2luZG93cy5pbmRleE9mKHRoaXMuZ2V0QWN0aXZlV2luZG93KCkpO1xuICAgICAgdGhpcy5hY3RpdmF0ZU5leHRXaW5kb3coaW5kZXggKyAxKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ3NoaWZ0K2FsdCt3JykgeyAvL0N5Y2xlcyBCYWNrd2FyZFxuICAgICAgdmFyIGluZGV4ID0gdGhpcy53aW5kb3dzLmluZGV4T2YodGhpcy5nZXRBY3RpdmVXaW5kb3coKSk7XG4gICAgICB0aGlzLmFjdGl2YXRlUHJldmlvdXNXaW5kb3coaW5kZXggKyAxKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ3NoaWZ0K2FsdCt4JyAmJiAhKHRoaXMuc2hpZnRQcmVzc2VkICYmIHRoaXMuYWx0UHJlc3NlZCAmJiB0aGlzLnhQcmVzc2VkKSkgeyAvL0Nsb3NlXG4gICAgICB2YXIgYWN0aXZlV2luZG93ID0gdGhpcy5nZXRBY3RpdmVXaW5kb3coKTtcbiAgICAgIGlmICghYWN0aXZlV2luZG93KSByZXR1cm47XG4gICAgICB0aGlzLmNsb3NlV2luZG93KGFjdGl2ZVdpbmRvdyk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdhbHQrZCcpIHsgLy9Ub2dnbGUgRGVza3RvcFxuICAgICAgLy90aGlzLmRlc2t0b3BTaG93biA9IHRoaXMuaGlkZVNob3dBbGwoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgdGhpcy5zaGlmdFByZXNzZWQgPSB0cnVlO1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICB0aGlzLmFsdFByZXNzZWQgPSB0cnVlO1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSA4OClcbiAgICAgIHRoaXMueFByZXNzZWQgPSB0cnVlO1xuICB9XG5cbiAgb25LZXlVcCA9IChldmVudDogYW55KSA9PiB7XG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgdGhpcy5zaGlmdFByZXNzZWQgPSBmYWxzZTtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgdGhpcy5hbHRQcmVzc2VkID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDg4KVxuICAgICAgdGhpcy54UHJlc3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuaGFuZGxlU2VsZWN0QXR0ZW1wdFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQcmV2ZW50cyB0aGUgdXNlciBmcm9tIGhpZ2hsaWdodCBkZXNrdG9wIGVsZW1lbnRzLlxuICAgKlxuICAgKi9cbiAgaGFuZGxlU2VsZWN0QXR0ZW1wdCA9IChlOiBhbnkpID0+IHtcbiAgICB2YXIgbm9kZU5hbWUgPSBlLnRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBub2RlTmFtZSA9PT0gJ3NlbGVjdCcpIHJldHVybiB0cnVlO1xuICAgIGlmICh3aW5kb3cuZXZlbnQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB3aW5kb3dzOiBBcnJheTxhbnk+ID0gW107XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvZ29VcmwgPSB0aGlzLm9wdGlvbnMubG9nb1VybDtcclxuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24odGhpcy5kZXNrdG9wLm9wdGlvbnMsIHRoaXMub3B0aW9ucyk7XHJcbiAgICB0aGlzLm9wdGlvbnMudmlld3BvcnRUb3AgPSB0aGlzLm9wdGlvbnMubWVudWJhckNvbmZpZyAhPT0gdW5kZWZpbmVkID8gdGhpcy5vcHRpb25zLm1lbnViYXJIZWlnaHQgKyAxIDogMDtcclxuICAgIHRoaXMudHJ1V2luZG93RXZlbnRIYW5kbGVyLm9uT3BlbigpLnN1YnNjcmliZSgod2luZGlvd0V2ZW50OiBUcnVXaW5kb3dFdmVudEFyZ3MpID0+IHtcclxuICAgICAgdGhpcy5vcGVuV2luZG93KHdpbmRpb3dFdmVudCwgZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgICBkb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gdGhpcy5oYW5kbGVTZWxlY3RBdHRlbXB0O1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uS2V5VXApO1xyXG4gICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IHRoaXMudmlld3BvcnRDb21wb25lbnQud2luZG93Q29tcG9uZW50cy5maWx0ZXIoKHc6IFRydURlc2t0b3BXaW5kb3cpID0+IHsgcmV0dXJuIHcuaGFzQ2hhbmdlcygpID8gdHJ1ZSA6IGZhbHNlOyB9KVxyXG4gICAgICBpZiAoaGFzQ2hhbmdlcy5sZW5ndGgpIHtcclxuICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgICAgdmFyIG1zZyA9IHRoaXMudGV4dE1hbmFnZXIubXNnQ29uZmlybUV4aXRXaXRoQ2hhbmdlc1BlbmRpbmc7XHJcblxyXG4gICAgICAgIC8vIEZvciBJRSBhbmQgRmlyZWZveFxyXG4gICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICBlLnJldHVyblZhbHVlID0gbXNnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRm9yIFNhZmFyaSAvIGNocm9tZVxyXG4gICAgICAgIHJldHVybiBtc2c7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5vbktleVVwKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRlc2t0b3Atd3JhcHBlclwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZGVza3RvcC1tZW51YmFyLWNvbnRhaW5lclwiIFtuZ1N0eWxlXT1cInsnaGVpZ2h0Jzogb3B0aW9ucy5tZW51YmFySGVpZ2h0ICsgJ3B4J31cIj5cclxuICAgIDx0cnUtZGVza3RvcC1tZW51YmFyIFtkZXNrdG9wQ3RybF09XCJ0aGlzXCI+PC90cnUtZGVza3RvcC1tZW51YmFyPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8dHJ1LWRlc2t0b3Atdmlld3BvcnQgW3dpbmRvd3NdPVwid2luZG93c1wiIFtkZXNrdG9wQ3RybF09XCJ0aGlzXCI+PC90cnUtZGVza3RvcC12aWV3cG9ydD5cclxuXHJcbiAgPHRydS1kZXNrdG9wLXRhc2tiYXIgW3dpbmRvd3NdPVwid2luZG93c1wiIFtkZXNrdG9wQ3RybF09XCJ0aGlzXCI+PC90cnUtZGVza3RvcC10YXNrYmFyPlxyXG5cclxuICA8aW1nIGNsYXNzPVwiZGVza3RvcC12aWV3cG9ydC1sb2dvXCIgZGF0YS1uZy1zaG93PVwibG9nb1VybFwiIGFsdD1cIlwiPlxyXG48L2Rpdj5cclxuIl19