@energycap/components 0.31.5 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/energycap-components.min.css +2 -2
  2. package/energycap-email.min.css +1 -1
  3. package/esm2020/energycap-components.mjs +5 -0
  4. package/esm2020/lib/components.module.mjs +386 -0
  5. package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
  6. package/esm2020/lib/controls/button/button.component.mjs +106 -0
  7. package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
  8. package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
  9. package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
  10. package/esm2020/lib/controls/combobox/combobox.component.mjs +841 -0
  11. package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
  12. package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
  13. package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
  14. package/esm2020/lib/controls/form-control-base.mjs +143 -0
  15. package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
  16. package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
  17. package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
  18. package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
  19. package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
  20. package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
  21. package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
  22. package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
  23. package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
  24. package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
  25. package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
  26. package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
  27. package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
  28. package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
  29. package/esm2020/lib/controls/select/select.component.mjs +87 -0
  30. package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
  31. package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
  32. package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
  33. package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
  34. package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
  35. package/esm2020/lib/core/error.service.mjs +57 -0
  36. package/esm2020/lib/core/scroll.service.mjs +89 -0
  37. package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
  38. package/esm2020/lib/core/telemetry.service.mjs +38 -0
  39. package/esm2020/lib/core/validation-message.service.mjs +181 -0
  40. package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
  41. package/esm2020/lib/core/window.service.mjs +182 -0
  42. package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
  43. package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
  44. package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
  45. package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
  46. package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
  47. package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
  48. package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
  49. package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
  50. package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
  51. package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
  52. package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
  53. package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
  54. package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
  55. package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
  56. package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
  57. package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
  58. package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
  59. package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
  60. package/esm2020/lib/display/splash/splash.component.mjs +42 -0
  61. package/esm2020/lib/display/splash/splash.service.mjs +35 -0
  62. package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
  63. package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
  64. package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
  65. package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
  66. package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
  67. package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
  68. package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
  69. package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
  70. package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
  71. package/esm2020/lib/display/table/table.component.mjs +244 -0
  72. package/esm2020/lib/display/tags/tag.mjs +15 -0
  73. package/esm2020/lib/display/tags/tags.component.mjs +77 -0
  74. package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
  75. package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
  76. package/esm2020/lib/display/toast/toast.service.mjs +35 -0
  77. package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
  78. package/esm2020/lib/display/tooltip/tooltip.component.mjs +25 -0
  79. package/esm2020/lib/display/tooltip/tooltip.service.mjs +63 -0
  80. package/esm2020/lib/display/tree/tree.component.mjs +125 -0
  81. package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
  82. package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
  83. package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
  84. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
  85. package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
  86. package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
  87. package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
  88. package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
  89. package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
  90. package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
  91. package/esm2020/lib/shared/form-group.helper.mjs +67 -0
  92. package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
  93. package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
  94. package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
  95. package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
  96. package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
  97. package/esm2020/lib/shared/page/page-view/page-view.component.mjs +121 -0
  98. package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
  99. package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
  100. package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
  101. package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
  102. package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
  103. package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
  104. package/esm2020/lib/shared/user-preference.service.mjs +17 -0
  105. package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
  106. package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
  107. package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
  108. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  109. package/fesm2015/energycap-components.mjs +10090 -0
  110. package/fesm2015/energycap-components.mjs.map +1 -0
  111. package/fesm2020/energycap-components.mjs +9999 -0
  112. package/fesm2020/energycap-components.mjs.map +1 -0
  113. package/index.d.ts +5 -0
  114. package/lib/components.module.d.ts +72 -0
  115. package/lib/controls/banner/banner.component.d.ts +3 -0
  116. package/lib/controls/button/button.component.d.ts +3 -0
  117. package/lib/controls/button/copy-button.directive.d.ts +3 -0
  118. package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
  119. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
  120. package/lib/controls/combobox/combobox.component.d.ts +5 -2
  121. package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
  122. package/lib/controls/file-upload/file-upload.component.d.ts +5 -2
  123. package/lib/controls/form-control/form-control.component.d.ts +3 -0
  124. package/lib/controls/form-control-base.d.ts +3 -0
  125. package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
  126. package/lib/controls/form-group/form-group.component.d.ts +6 -3
  127. package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
  128. package/lib/controls/item-picker/item-picker.component.d.ts +5 -2
  129. package/lib/controls/link-button/link-button.component.d.ts +3 -0
  130. package/lib/controls/menu/menu.component.d.ts +3 -0
  131. package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
  132. package/lib/controls/numericbox/numericbox.component.d.ts +5 -2
  133. package/lib/controls/popover/popover.component.d.ts +3 -0
  134. package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
  135. package/lib/controls/select/select.component.d.ts +3 -0
  136. package/lib/controls/tabs/tabs.component.d.ts +3 -0
  137. package/lib/controls/textbox/textbox.component.d.ts +3 -0
  138. package/lib/core/cache.service.d.ts +3 -0
  139. package/lib/core/error.service.d.ts +3 -0
  140. package/lib/core/scroll.service.d.ts +3 -0
  141. package/lib/core/telemetry-tracker.service.d.ts +3 -0
  142. package/lib/core/telemetry.service.d.ts +3 -0
  143. package/lib/core/validation-message.service.d.ts +3 -0
  144. package/lib/core/window.service.d.ts +3 -0
  145. package/lib/display/app-bar/app-bar.component.d.ts +3 -0
  146. package/lib/display/avatar/avatar.component.d.ts +3 -0
  147. package/lib/display/avatar/avatar.service.d.ts +3 -0
  148. package/lib/display/confirm/confirm.component.d.ts +5 -2
  149. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
  150. package/lib/display/dialog/dialog.component.d.ts +3 -0
  151. package/lib/display/dialog/dialog.service.d.ts +3 -0
  152. package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
  153. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
  154. package/lib/display/item-display/item-display.component.d.ts +3 -0
  155. package/lib/display/json-display/json-display.component.d.ts +5 -2
  156. package/lib/display/resizable/resizable-base.d.ts +3 -0
  157. package/lib/display/resizable/resizable.component.d.ts +3 -0
  158. package/lib/display/spinner/spinner.component.d.ts +3 -0
  159. package/lib/display/splash/splash.component.d.ts +3 -0
  160. package/lib/display/splash/splash.service.d.ts +3 -0
  161. package/lib/display/table/resizable-column.component.d.ts +3 -0
  162. package/lib/display/table/resizable-table.directive.d.ts +3 -0
  163. package/lib/display/table/searchable-table.component.d.ts +6 -3
  164. package/lib/display/table/table-detail-row.component.d.ts +3 -0
  165. package/lib/display/table/table-locked-column.component.d.ts +3 -0
  166. package/lib/display/table/table-master-header-row.component.d.ts +3 -0
  167. package/lib/display/table/table-master-row.component.d.ts +3 -0
  168. package/lib/display/table/table-pagination.component.d.ts +3 -0
  169. package/lib/display/table/table-selectable-row.component.d.ts +5 -2
  170. package/lib/display/table/table.component.d.ts +3 -0
  171. package/lib/display/tags/tags.component.d.ts +3 -0
  172. package/lib/display/toast/toast/toast.component.d.ts +3 -0
  173. package/lib/display/toast/toast.service.d.ts +3 -0
  174. package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
  175. package/lib/display/tooltip/tooltip.component.d.ts +3 -0
  176. package/lib/display/tooltip/tooltip.service.d.ts +3 -0
  177. package/lib/display/tree/tree.component.d.ts +3 -0
  178. package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
  179. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
  180. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
  181. package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
  182. package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
  183. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
  184. package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
  185. package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
  186. package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
  187. package/lib/shared/form-group.helper.d.ts +5 -2
  188. package/lib/shared/page/page-base/page-base.component.d.ts +5 -2
  189. package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
  190. package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
  191. package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
  192. package/lib/shared/user-preference.service.d.ts +3 -0
  193. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
  194. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
  195. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
  196. package/package.json +27 -15
  197. package/src/styles/_functions.scss +6 -4
  198. package/src/styles/_icons.scss +1 -1
  199. package/src/styles/mixins/_control-base.scss +2 -2
  200. package/src/styles/mixins/_form-control-base.scss +3 -1
  201. package/src/styles/mixins/_spinner-base.scss +3 -1
  202. package/bundles/energycap-components.umd.js +0 -10646
  203. package/bundles/energycap-components.umd.js.map +0 -1
  204. package/bundles/energycap-components.umd.min.js +0 -17
  205. package/bundles/energycap-components.umd.min.js.map +0 -1
  206. package/energycap-components.d.ts +0 -7
  207. package/energycap-components.metadata.json +0 -1
  208. package/esm2015/energycap-components.js +0 -8
  209. package/esm2015/lib/components.module.js +0 -238
  210. package/esm2015/lib/controls/banner/banner.component.js +0 -94
  211. package/esm2015/lib/controls/button/button.component.js +0 -89
  212. package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
  213. package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
  214. package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
  215. package/esm2015/lib/controls/combobox/combobox.component.js +0 -819
  216. package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
  217. package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
  218. package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
  219. package/esm2015/lib/controls/form-control-base.js +0 -140
  220. package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
  221. package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
  222. package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
  223. package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
  224. package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
  225. package/esm2015/lib/controls/menu/menu.component.js +0 -424
  226. package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
  227. package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
  228. package/esm2015/lib/controls/popover/popover.component.js +0 -85
  229. package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
  230. package/esm2015/lib/controls/select/select.component.js +0 -89
  231. package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
  232. package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
  233. package/esm2015/lib/core/error.service.js +0 -56
  234. package/esm2015/lib/core/scroll.service.js +0 -88
  235. package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
  236. package/esm2015/lib/core/telemetry.service.js +0 -40
  237. package/esm2015/lib/core/validation-message.service.js +0 -185
  238. package/esm2015/lib/core/window.service.js +0 -191
  239. package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
  240. package/esm2015/lib/display/avatar/avatar.component.js +0 -73
  241. package/esm2015/lib/display/confirm/confirm.component.js +0 -127
  242. package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
  243. package/esm2015/lib/display/dialog/dialog.component.js +0 -229
  244. package/esm2015/lib/display/dialog/dialog.service.js +0 -69
  245. package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
  246. package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
  247. package/esm2015/lib/display/item-display/item-display.component.js +0 -57
  248. package/esm2015/lib/display/json-display/json-display.component.js +0 -44
  249. package/esm2015/lib/display/resizable/resizable-base.js +0 -119
  250. package/esm2015/lib/display/resizable/resizable.component.js +0 -57
  251. package/esm2015/lib/display/spinner/spinner.component.js +0 -12
  252. package/esm2015/lib/display/splash/splash.component.js +0 -45
  253. package/esm2015/lib/display/splash/splash.service.js +0 -34
  254. package/esm2015/lib/display/table/resizable-column.component.js +0 -23
  255. package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
  256. package/esm2015/lib/display/table/searchable-table.component.js +0 -303
  257. package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
  258. package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
  259. package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
  260. package/esm2015/lib/display/table/table-master-row.component.js +0 -141
  261. package/esm2015/lib/display/table/table-pagination.component.js +0 -146
  262. package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
  263. package/esm2015/lib/display/table/table.component.js +0 -210
  264. package/esm2015/lib/display/tags/tag.js +0 -15
  265. package/esm2015/lib/display/tags/tags.component.js +0 -73
  266. package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
  267. package/esm2015/lib/display/toast/toast.service.js +0 -34
  268. package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
  269. package/esm2015/lib/display/tooltip/tooltip.component.js +0 -24
  270. package/esm2015/lib/display/tooltip/tooltip.service.js +0 -64
  271. package/esm2015/lib/display/tree/tree.component.js +0 -100
  272. package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
  273. package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
  274. package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
  275. package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
  276. package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
  277. package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
  278. package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
  279. package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
  280. package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
  281. package/esm2015/lib/shared/form-group.helper.js +0 -65
  282. package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
  283. package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
  284. package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -94
  285. package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
  286. package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
  287. package/esm2015/lib/shared/user-preference.service.js +0 -15
  288. package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
  289. package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
  290. package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
  291. package/fesm2015/energycap-components.js +0 -9638
  292. package/fesm2015/energycap-components.js.map +0 -1
@@ -1,424 +0,0 @@
1
- import { Component, Input, Output, TemplateRef, ViewChild, EventEmitter, Renderer2, ElementRef, HostBinding } from '@angular/core';
2
- import { WindowService } from '../../core/window.service';
3
- import { ScrollService } from '../../core/scroll.service';
4
- ;
5
- export const menuAnimationSpeed = 350;
6
- /**
7
- * Primitive Menu component that encapsulates known templates
8
- *
9
- * @export
10
- */
11
- export class MenuComponent {
12
- constructor(el, renderer, windowService, scrollService) {
13
- this.el = el;
14
- this.renderer = renderer;
15
- this.windowService = windowService;
16
- this.scrollService = scrollService;
17
- /**
18
- * Array of items to display
19
- *
20
- * @memberof MenuComponent
21
- */
22
- this.items = [];
23
- /**
24
- * Selected item; annotates the item
25
- * when displayed with 'selected' class
26
- *
27
- * @memberof MenuComponent
28
- */
29
- this.selected = null;
30
- /**
31
- * Display template
32
- *
33
- * @memberof MenuComponent
34
- */
35
- this.templateType = 'label';
36
- /**
37
- * Show message when there are no items
38
- */
39
- this.showNoItems = false;
40
- /**
41
- * Text to show when menu is empty and showNoItems is true
42
- */
43
- this.noDataText = 'NoItems_TC';
44
- /**
45
- * Controls whether keyboard navigation is enabled
46
- */
47
- this.enableKeyNav = false;
48
- /**
49
- * Item currently highlighted by keyboard navigation
50
- */
51
- this.highlightedItem = null;
52
- /**
53
- * Tells the menu to maintain the selected/lastSelected item. Turning this off is useful for
54
- * action type menus that are displayed on the screen at all times and you do not
55
- * want the item to be selected when clicked.
56
- */
57
- this.maintainSelectedItem = true;
58
- /**
59
- * Will prevent text-wrapping of menu items and truncate instead. Also turns on a tooltip for the menu item. Default: false;
60
- */
61
- this.truncateItems = false;
62
- /**
63
- * When true, the space for the icon is preserved for menu items that do not have icons.
64
- * Only applicable for iconAndLabel menus.
65
- */
66
- this.preserveIconSpace = false;
67
- /**
68
- * Emitted when `selected` is changed. Emits the referenced object.
69
- *
70
- * @memberof MenuComponent
71
- */
72
- this.selectedChanged = new EventEmitter();
73
- /**
74
- * Emitted when the menu has a parent and back is clicked
75
- * @memberof MenuComponent
76
- */
77
- this.menuClosed = new EventEmitter();
78
- /**
79
- * Index of the item currently highlighted using keyboard nav
80
- */
81
- this.highlightedItemIndex = -1;
82
- /**
83
- * Last item this.selected was set to via selectItem().
84
- * This isn't necessarily the same as this.selected, because this.selected is an input property
85
- * and could have been changed by a consumer through some means other than selectItem().
86
- * This allows us to prevent double-calls to selectItem() with the same input.
87
- */
88
- this.lastSelected = null;
89
- }
90
- /**
91
- * Sets & displays the interalized template based on
92
- * the set template.
93
- * @see { @link https://angular.io/guide/lifecycle-hooks|Angular Lifecycle Hooks}
94
- *
95
- * @memberof MenuComponent
96
- */
97
- ngAfterContentInit() {
98
- switch (this.templateType) {
99
- case ("label"):
100
- this.internalizedTemplate = this.iconAndLabelTemplate;
101
- break;
102
- case ("iconAndLabel"):
103
- this.internalizedTemplate = this.iconAndLabelTemplate;
104
- break;
105
- case ("checkAndLabel"):
106
- this.internalizedTemplate = this.checkAndLabelTemplate;
107
- break;
108
- default:
109
- throw new Error(`Invalid templateType for MenuComponent. Please use either: 'label', 'iconAndLabel' or 'checkAndLabel'`);
110
- }
111
- //if the consumer provided a menuItemTemplate, override the internalizedTemplate with that.
112
- if (this.customMenuTemplate) {
113
- this.internalizedTemplate = this.customMenuTemplate;
114
- }
115
- if (this.id) {
116
- this.attrId = this.id;
117
- }
118
- this.setItemIds();
119
- if (this.highlightedItem && this.items.length) {
120
- this.highlightedItemIndex = this.items.findIndex(item => { return this.highlightedItem === item; });
121
- }
122
- this.addKeydownListener();
123
- }
124
- ngOnDestroy() {
125
- // Remove the listener when the component is destroyed
126
- if (this.removeKeydownListener) {
127
- this.removeKeydownListener();
128
- }
129
- }
130
- /**
131
- * When a menu item is selected, open a child menu if the item has items, call
132
- * the item's click method if defined, or emit the selected item.
133
- *
134
- * @param item The selected item
135
- * @memberof MenuComponent
136
- */
137
- selectItem(event, item, isKeyEvent) {
138
- var _a;
139
- event.stopPropagation();
140
- //In the case that the user clicks an item, selectItem() will be called from the click handler
141
- //and through onRouterLinkActivated. Only one of these will make it through this if statement
142
- //because the first one will set this.lastSelected = item.
143
- if (!item.disabled && !item.readonly && this.lastSelected !== item) {
144
- if (!item.url) {
145
- if (item.onClick) {
146
- item.onClick(item, false);
147
- }
148
- if (item.items) {
149
- this.toggleChildMenu(true);
150
- }
151
- else {
152
- this.onSelection(item);
153
- }
154
- // We need to manually handle the url navigation if the keyboard was used
155
- }
156
- else if (isKeyEvent || ((_a = event.target) === null || _a === void 0 ? void 0 : _a.tagName) === 'LI') {
157
- if (item.target) {
158
- window.open(item.url, item.target);
159
- }
160
- else {
161
- this.windowService.navigateToUrl(item.url);
162
- }
163
- // Emit so upstream components know an item was selected
164
- this.onSelection(item);
165
- }
166
- else {
167
- this.onSelection(item);
168
- }
169
- if (this.maintainSelectedItem) {
170
- this.selected = item;
171
- this.lastSelected = item;
172
- }
173
- else {
174
- this.selected = null;
175
- this.lastSelected = null;
176
- }
177
- }
178
- }
179
- /**
180
- * Close the current menu and open the parent menu
181
- * @memberof MenuComponent
182
- */
183
- back(event) {
184
- event.stopPropagation();
185
- if (this.parent && this.parent.onClick) {
186
- this.parent.onClick(null, true);
187
- }
188
- this.menuClosed.emit();
189
- }
190
- /**
191
- * Emit the selected item
192
- * @param item The selected item
193
- */
194
- onSelection(item) {
195
- if (item.display !== 'heading') {
196
- this.selectedChanged.emit(item);
197
- }
198
- }
199
- /**
200
- * Open or close the child menu. When the child menu closes, the selected
201
- * item is reset.
202
- * @memberof MenuComponent
203
- */
204
- toggleChildMenu(open) {
205
- let navEl = this.el.nativeElement.querySelector('nav');
206
- if (open) {
207
- // Remove the listener on the parent menu when a child menu is opened
208
- // This is to avoid interference between the parent and child menus
209
- if (this.removeKeydownListener) {
210
- this.removeKeydownListener();
211
- }
212
- let height = navEl.offsetHeight;
213
- let width = navEl.offsetWidth;
214
- // In order to animate the child menu, we need to set height on the nav element
215
- // so we can absolutely position the two menus and maintain the current menu's height
216
- this.renderer.setStyle(navEl, 'height', `${height}px`);
217
- this.renderer.setStyle(navEl, 'width', `${width}px`);
218
- this.renderer.addClass(this.el.nativeElement, 'open');
219
- setTimeout(() => {
220
- this.renderer.addClass(this.el.nativeElement, 'open-active');
221
- });
222
- }
223
- else {
224
- // Re-add the listener once the child menu closes
225
- this.addKeydownListener();
226
- this.renderer.removeClass(this.el.nativeElement, 'open-active');
227
- setTimeout(() => {
228
- this.renderer.removeClass(this.el.nativeElement, 'open');
229
- // Reset the nav element's height to auto
230
- this.renderer.setStyle(navEl, 'height', '100%');
231
- this.selected = null;
232
- }, menuAnimationSpeed);
233
- }
234
- }
235
- /**
236
- * Handle key presses to navigate the menu
237
- */
238
- keyNavigate(event) {
239
- if (this.enableKeyNav) {
240
- switch (event.key) {
241
- case 'ArrowUp':
242
- case 'Up':
243
- case 'ArrowDown':
244
- case 'Down':
245
- event.stopPropagation();
246
- event.preventDefault();
247
- this.moveHighlightedUpOrDown(event);
248
- break;
249
- case 'ArrowRight':
250
- case 'Right':
251
- event.stopPropagation();
252
- event.preventDefault();
253
- // Select the item if it has child items
254
- if (this.highlightedItem && this.highlightedItem.items) {
255
- this.selectItem(event, this.highlightedItem, true);
256
- }
257
- break;
258
- case 'ArrowLeft':
259
- case 'Left':
260
- event.stopPropagation();
261
- event.preventDefault();
262
- // Close the menu if it is a child menu
263
- if (this.parent) {
264
- this.back(event);
265
- }
266
- break;
267
- case ' ':
268
- case 'Spacebar':
269
- case 'Enter':
270
- // Prevent 'enter' from doing whatever it does on the currently focused element
271
- event.preventDefault();
272
- if (this.highlightedItemIndex > -1 && this.highlightedItem) {
273
- this.selectItem(event, this.highlightedItem, true);
274
- // If the header is highlighted
275
- }
276
- else if (this.highlightedItemIndex === -1) {
277
- // Close the menu if it's a child
278
- if (this.parent) {
279
- this.back(event);
280
- }
281
- }
282
- break;
283
- default:
284
- return;
285
- }
286
- }
287
- }
288
- /**
289
- * Scroll to the item currently marked as 'is-selected'. Wait a tick for the
290
- * NgClassDirecitve or NavItemActiveDirective to respond to the model changes
291
- * and update the view.
292
- */
293
- scrollToSelectedItem() {
294
- window.setTimeout(() => {
295
- const linkSelector = `li.is-selected`;
296
- this.scrollService.scrollToItem(`#${this.id}_list`, linkSelector);
297
- });
298
- }
299
- moveHighlightedUpOrDown(event) {
300
- switch (event.key) {
301
- case 'ArrowUp':
302
- case 'Up':
303
- if (this.highlightedItemIndex > -1) {
304
- this.highlightedItemIndex--;
305
- // Skip any in-menu heading items
306
- if (this.highlightedItemIndex > -1 && this.items[this.highlightedItemIndex].display === 'heading') {
307
- this.highlightedItemIndex--;
308
- }
309
- }
310
- break;
311
- case 'ArrowDown':
312
- case 'Down':
313
- if (this.highlightedItemIndex < this.items.length - 1) {
314
- this.highlightedItemIndex++;
315
- // Skip any in-menu heading items
316
- if (this.highlightedItemIndex < this.items.length - 1 && this.items[this.highlightedItemIndex].display === 'heading') {
317
- this.highlightedItemIndex++;
318
- }
319
- }
320
- break;
321
- default:
322
- return;
323
- }
324
- if (this.highlightedItemIndex > -1) {
325
- // Store the item at the current highlight index
326
- this.highlightedItem = this.items[this.highlightedItemIndex];
327
- }
328
- else {
329
- this.highlightedItem = null;
330
- }
331
- this.scrollToHighlightedItem();
332
- }
333
- /**
334
- * Scroll to the specified menu item.
335
- * If no item is provided, it will scroll to the first item.
336
- *
337
- * @param item The menu item to scroll to.
338
- * @memberof MenuComponent
339
- */
340
- scrollMenu(item) {
341
- if (this.items.length > 0) {
342
- item = item ? item : this.items[0];
343
- let itemIndex = this.findItemIndex(item);
344
- if (this.id) {
345
- let itemSelector = item.id ? `#${item.id}` : `#${this.id}_item${itemIndex}`;
346
- this.scrollService.scrollItemCentered(`#${this.id}_list`, itemSelector);
347
- }
348
- }
349
- }
350
- scrollToHighlightedItem() {
351
- this.scrollMenu(this.highlightedItem);
352
- }
353
- /**
354
- * Find a given item's index in the filtered items array.
355
- *
356
- * Returns -1 if not found
357
- * @param itemToFind The matching item to find in the items array.
358
- * @memberof MenuComponent
359
- */
360
- findItemIndex(itemToFind) {
361
- if (itemToFind) {
362
- return this.items.findIndex(item => {
363
- return item.label === itemToFind.label;
364
- });
365
- }
366
- else {
367
- return -1;
368
- }
369
- }
370
- addKeydownListener() {
371
- // Only attempt to add the listener if keyboard nav is enabled
372
- if (this.enableKeyNav) {
373
- // renderer.listen adds the listener and returns a function to remove it from the renderer.
374
- // The listener remains active until this function is called.
375
- this.removeKeydownListener = this.renderer.listen('document', 'keydown', (event) => this.keyNavigate(event));
376
- }
377
- }
378
- /**
379
- * Sets the menu item ids using its index if item doesn't already have one
380
- */
381
- setItemIds() {
382
- if (this.items) {
383
- this.items.forEach((item, index) => {
384
- item.id = item.id ? item.id : this.id + '_item' + index;
385
- });
386
- }
387
- }
388
- }
389
- MenuComponent.decorators = [
390
- { type: Component, args: [{
391
- selector: 'ec-menu',
392
- template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\" class=\"py-1\">\r\n <li *ngFor=\"let item of items; index as i\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\" *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\" *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\" *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\" *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\" *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\" *ngIf=\"item?.items\"></i>\r\n</ng-template>",
393
- styles: ["@-webkit-keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:root{--ec-color-icon:rgba(26,26,35,0.66);--ec-font-size-icon:1rem}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{background-color:var(--ec-background-color);display:block;font-size:var(--ec-font-size-action);font-weight:400}:host.open>nav>.child,:host.open>nav>.parent{height:100%;left:0;position:absolute;right:0;top:0;transition:transform .25s ease}:host.open>nav>.parent{transform:translateX(0)}:host.open>nav>.child{transform:translateX(100%)}:host.open-active>nav>.parent{transform:translateX(-100%)}:host.open-active>nav>.child{transform:translateX(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{height:100%;overflow:hidden}.parent,nav{display:flex;position:relative}.parent{flex:auto;flex-direction:column;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-highlighted .item-wrapper,.parent>header.is-selected .item-wrapper{background-color:#d9edf2}.parent>header:hover .item-wrapper{background-color:#bfe0e9}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{flex:auto;height:100%;list-style:none;margin:0;overflow-y:auto;padding:0}ul li{cursor:pointer;padding:0 .25rem}ul li a{border-bottom:0;color:inherit;text-decoration:none}ul li.is-highlighted .item-wrapper,ul li.is-selected .item-wrapper{background-color:#d9edf2}ul li:hover .item-wrapper{background-color:#bfe0e9}ul li:focus .item-wrapper{background-color:var(--ec-color-disabled-dark);outline:none;position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-secondary-dark);opacity:.65}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider{border-bottom:1px solid var(--ec-border-color);margin-bottom:.25rem;padding-bottom:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{border-radius:var(--ec-border-radius);color:inherit;cursor:inherit;display:flex;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{flex:none;margin-top:calc(.625rem - var(--ec-font-size-icon)/2)}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc(.625rem - var(--ec-font-size-icon)*0.75/2)}.item-wrapper .icon-check{opacity:0}.no-data-message{color:var(--ec-color-hint-dark);display:none;font-size:var(--ec-font-size-body);margin-bottom:0;padding:1rem;text-align:center}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-highlighted,:host-context(ec-tree) li.is-selected{font-weight:700}:host-context(ec-tree) li.is-highlighted:not(:hover),:host-context(ec-tree) li.is-selected:not(:hover){background-color:transparent}"]
394
- },] }
395
- ];
396
- MenuComponent.ctorParameters = () => [
397
- { type: ElementRef },
398
- { type: Renderer2 },
399
- { type: WindowService },
400
- { type: ScrollService }
401
- ];
402
- MenuComponent.propDecorators = {
403
- id: [{ type: Input }],
404
- attrId: [{ type: HostBinding, args: ['attr.id',] }],
405
- items: [{ type: Input }],
406
- selected: [{ type: Input }],
407
- parent: [{ type: Input }],
408
- templateType: [{ type: Input }],
409
- customMenuTemplate: [{ type: Input }],
410
- title: [{ type: Input }],
411
- showNoItems: [{ type: Input }],
412
- noDataText: [{ type: Input }],
413
- enableKeyNav: [{ type: Input }],
414
- highlightedItem: [{ type: Input }],
415
- maintainSelectedItem: [{ type: Input }],
416
- truncateItems: [{ type: Input }],
417
- preserveIconSpace: [{ type: Input }],
418
- selectedChanged: [{ type: Output }],
419
- menuClosed: [{ type: Output }],
420
- labelTemplate: [{ type: ViewChild, args: ['label', { static: true },] }],
421
- iconAndLabelTemplate: [{ type: ViewChild, args: ['iconAndLabel', { static: true },] }],
422
- checkAndLabelTemplate: [{ type: ViewChild, args: ['checkAndLabel', { static: true },] }]
423
- };
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQW9CLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRWhLLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFxQnpELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFFdEM7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyxhQUFhO0lBbUt0QixZQUNZLEVBQWMsRUFDZCxRQUFtQixFQUNuQixhQUE0QixFQUM1QixhQUE0QjtRQUg1QixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXhKeEM7Ozs7V0FJRztRQUNhLFVBQUssR0FBb0IsRUFBRSxDQUFDO1FBRzVDOzs7OztXQUtHO1FBQ2EsYUFBUSxHQUFvQixJQUFJLENBQUM7UUFVakQ7Ozs7V0FJRztRQUNhLGlCQUFZLEdBQXFCLE9BQU8sQ0FBQztRQW1CekQ7O1dBRUc7UUFDYSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3Qzs7V0FFRztRQUNhLGVBQVUsR0FBVyxZQUFZLENBQUM7UUFHbEQ7O1dBRUc7UUFDYSxpQkFBWSxHQUFhLEtBQUssQ0FBQztRQUcvQzs7V0FFRztRQUNhLG9CQUFlLEdBQW9CLElBQUksQ0FBQztR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S0FBb0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQy9IO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUM1RCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7O1lBeGZKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsU0FBUztnQkFDbkIsbzlKQUFvQzs7YUFFdkM7OztZQXJDcUcsVUFBVTtZQUFyQixTQUFTO1lBRTNGLGFBQWE7WUFDYixhQUFhOzs7aUJBeUNqQixLQUFLO3FCQU1MLFdBQVcsU0FBQyxTQUFTO29CQVFyQixLQUFLO3VCQVNMLEtBQUs7cUJBT0wsS0FBSzsyQkFRTCxLQUFLO2lDQVVMLEtBQUs7b0JBTUwsS0FBSzswQkFNTCxLQUFLO3lCQUtMLEtBQUs7MkJBTUwsS0FBSzs4QkFNTCxLQUFLO21DQU9MLEtBQUs7NEJBS0wsS0FBSztnQ0FNTCxLQUFLOzhCQU9MLE1BQU07eUJBT04sTUFBTTs0QkFtQkwsU0FBUyxTQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7bUNBTXBDLFNBQVMsU0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO29DQU0xQyxTQUFTLFNBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgRXZlbnRFbWl0dGVyLCBBZnRlckNvbnRlbnRJbml0LCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmF2SXRlbSB9IGZyb20gJy4uL25hdmlnYXRpb24vbmF2LWl0ZW0nO1xyXG5pbXBvcnQgeyBXaW5kb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS93aW5kb3cuc2VydmljZSc7XHJcbmltcG9ydCB7IFNjcm9sbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Njcm9sbC5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCB0eXBlIE1lbnVUZW1wbGF0ZVR5cGUgPSBcImxhYmVsXCIgfCBcImljb25BbmRMYWJlbFwiIHwgXCJjaGVja0FuZExhYmVsXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51SG9zdEVsZW1lbnRDbGFzc2VzID0gJ2JnLXRyYW5zcGFyZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW08VFZhbHVlPWFueSwgU0l0ZW1zPWFueT4gZXh0ZW5kcyBOYXZJdGVtIHtcclxuICAvLyBMYWJlbCBpcyBvcHRpb25hbCBpbiBOYXZJdGVtIGJ1dCB3YXMgbm90IGluIE1lbnVJdGVtLFxyXG4gIC8vIG92ZXJyaWRpbmcgdG8gYmUgcmVxdWlyZWRcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIFxyXG4gIGl0ZW1zPzogTWVudUl0ZW08U0l0ZW1zPltdLFxyXG4gIGNoZWNrZWQ/OiBib29sZWFuLFxyXG4gIGRpc3BsYXk/OiAnZGVmYXVsdCd8J2hlYWRpbmcnfCdkaXZpZGVyJyxcclxuICB2YWx1ZT86VFZhbHVlLFxyXG4gIGNsYXNzTGlzdD86c3RyaW5nLFxyXG4gIGRpc2FibGVkPzogYm9vbGVhbixcclxuICBoaWRkZW4/OiBib29sZWFuLFxyXG4gIHJlYWRvbmx5PzogYm9vbGVhblxyXG4gIHRhcmdldD86ICdfc2VsZicgfCAnX2JsYW5rJyB8ICdfcGFyZW50JyB8ICdfdG9wJyxcclxuICBleHRlcm5hbExpbms/OiBib29sZWFuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbWVudUFuaW1hdGlvblNwZWVkID0gMzUwO1xyXG5cclxuLyoqXHJcbiAqIFByaW1pdGl2ZSBNZW51IGNvbXBvbmVudCB0aGF0IGVuY2Fwc3VsYXRlcyBrbm93biB0ZW1wbGF0ZXNcclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLW1lbnUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnB1dCBmb3IgdGhlIG1lbnUncyB0ZW1wbGF0ZSBpZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgYm91bmQgdG8gdGhlIGhvc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBwdWJsaWMgYXR0cklkPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIGl0ZW1zIHRvIGRpc3BsYXlcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM6IEFycmF5PE1lbnVJdGVtPiA9IFtdO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqICBTZWxlY3RlZCBpdGVtOyBhbm5vdGF0ZXMgdGhlIGl0ZW1cclxuICAgICAqICB3aGVuIGRpc3BsYXllZCB3aXRoICdzZWxlY3RlZCcgY2xhc3NcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQ6IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBhcmVudCBtZW51IGl0ZW0uIElmIGRlZmluZWQsIGEgaGVhZGVyIHdpdGggdGhlIHBhcmVudCdzIGxhYmVsIGFuZCBhXHJcbiAgICAgKiBiYWNrIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBhcmVudD86IE1lbnVJdGVtO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXkgdGVtcGxhdGVcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcblx0LyoqXHJcbiAgICAgKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBtZW51IGl0ZW1zLiBNdXN0IGRlY2xhcmUgYSB0ZW1wbGF0ZSBcclxuXHQgKiBpbnB1dCB2YXJpYWJsZSBjYWxsZWQgXCJpdGVtXCIgbGlrZSBzbzogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5hbWUgbGV0LWl0ZW0+LCBcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZW51J3MgdGl0bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRpdGxlPzpzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Tm9JdGVtcz86Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBzaG93IHdoZW4gbWVudSBpcyBlbXB0eSBhbmQgc2hvd05vSXRlbXMgaXMgdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbm9EYXRhVGV4dDogc3RyaW5nID0gJ05vSXRlbXNfVEMnO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyBlbmFibGVkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVLZXlOYXY/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXRlbSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGlnaGxpZ2h0ZWRJdGVtOiBNZW51SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgdGhlIG1lbnUgdG8gbWFpbnRhaW4gdGhlIHNlbGVjdGVkL2xhc3RTZWxlY3RlZCBpdGVtLiBUdXJuaW5nIHRoaXMgb2ZmIGlzIHVzZWZ1bCBmb3JcclxuICAgICAqIGFjdGlvbiB0eXBlIG1lbnVzIHRoYXQgYXJlIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIGF0IGFsbCB0aW1lcyBhbmQgeW91IGRvIG5vdFxyXG4gICAgICogd2FudCB0aGUgaXRlbSB0byBiZSBzZWxlY3RlZCB3aGVuIGNsaWNrZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYWludGFpblNlbGVjdGVkSXRlbTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWxsIHByZXZlbnQgdGV4dC13cmFwcGluZyBvZiBtZW51IGl0ZW1zIGFuZCB0cnVuY2F0ZSBpbnN0ZWFkLiBBbHNvIHR1cm5zIG9uIGEgdG9vbHRpcCBmb3IgdGhlIG1lbnUgaXRlbS4gRGVmYXVsdDogZmFsc2U7XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cnVuY2F0ZUl0ZW1zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogV2hlbiB0cnVlLCB0aGUgc3BhY2UgZm9yIHRoZSBpY29uIGlzIHByZXNlcnZlZCBmb3IgbWVudSBpdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGljb25zLlxyXG4gICAgICogT25seSBhcHBsaWNhYmxlIGZvciBpY29uQW5kTGFiZWwgbWVudXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmVzZXJ2ZUljb25TcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHRlZCB3aGVuIGBzZWxlY3RlZGAgaXMgY2hhbmdlZC4gRW1pdHMgdGhlIHJlZmVyZW5jZWQgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8TWVudUl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4oKTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIG1lbnUgaGFzIGEgcGFyZW50IGFuZCBiYWNrIGlzIGNsaWNrZWRcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbWVudUNsb3NlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpdGVtIHRlbXBsYXRlIHRoYXQgaXMgbG9hZGVkIGludG8gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcm5hbGl6ZWRUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRleCBvZiB0aGUgaXRlbSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgdXNpbmcga2V5Ym9hcmQgbmF2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoaWdobGlnaHRlZEl0ZW1JbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgIEBWaWV3Q2hpbGQoJ2xhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBsYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBpY29uIGFuZCBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdpY29uQW5kTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGljb25BbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBjaGVjayBhbmQgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnY2hlY2tBbmRMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2hlY2tBbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyB0aGUgZnVuY3Rpb24gdXNlZCB0byByZW1vdmUgdGhlIGV2ZW4gbGlzdGVuZXIgZnJvbSB0aGUgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVLZXlkb3duTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGFzdCBpdGVtIHRoaXMuc2VsZWN0ZWQgd2FzIHNldCB0byB2aWEgc2VsZWN0SXRlbSgpLlxyXG4gICAgICogVGhpcyBpc24ndCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGlzLnNlbGVjdGVkLCBiZWNhdXNlIHRoaXMuc2VsZWN0ZWQgaXMgYW4gaW5wdXQgcHJvcGVydHlcclxuICAgICAqIGFuZCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBieSBhIGNvbnN1bWVyIHRocm91Z2ggc29tZSBtZWFucyBvdGhlciB0aGFuIHNlbGVjdEl0ZW0oKS5cclxuICAgICAqIFRoaXMgYWxsb3dzIHVzIHRvIHByZXZlbnQgZG91YmxlLWNhbGxzIHRvIHNlbGVjdEl0ZW0oKSB3aXRoIHRoZSBzYW1lIGlucHV0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxhc3RTZWxlY3RlZDogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxyXG4gICAgKXtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgJiBkaXNwbGF5cyB0aGUgaW50ZXJhbGl6ZWQgdGVtcGxhdGUgYmFzZWQgb25cclxuICAgICAqIHRoZSBzZXQgdGVtcGxhdGUuXHJcbiAgICAgKiBAc2VlIHsgQGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc3xBbmd1bGFyIExpZmVjeWNsZSBIb29rc31cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50ZW1wbGF0ZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAoXCJsYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25BbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiaWNvbkFuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkFuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJjaGVja0FuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuY2hlY2tBbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGVUeXBlIGZvciBNZW51Q29tcG9uZW50LiBQbGVhc2UgdXNlIGVpdGhlcjogJ2xhYmVsJywgJ2ljb25BbmRMYWJlbCcgb3IgJ2NoZWNrQW5kTGFiZWwnYClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIGEgbWVudUl0ZW1UZW1wbGF0ZSwgb3ZlcnJpZGUgdGhlIGludGVybmFsaXplZFRlbXBsYXRlIHdpdGggdGhhdC5cclxuICAgICAgICBpZih0aGlzLmN1c3RvbU1lbnVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5jdXN0b21NZW51VGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF0dHJJZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEl0ZW1JZHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHsgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID09PSBpdGVtfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFkZEtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3RlbmVyIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgICAgICBpZiAodGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBhIG1lbnUgaXRlbSBpcyBzZWxlY3RlZCwgb3BlbiBhIGNoaWxkIG1lbnUgaWYgdGhlIGl0ZW0gaGFzIGl0ZW1zLCBjYWxsXHJcbiAgICAgKiB0aGUgaXRlbSdzIGNsaWNrIG1ldGhvZCBpZiBkZWZpbmVkLCBvciBlbWl0IHRoZSBzZWxlY3RlZCBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VsZWN0SXRlbShldmVudDogRXZlbnQsIGl0ZW06IE1lbnVJdGVtLCBpc0tleUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvL0luIHRoZSBjYXNlIHRoYXQgdGhlIHVzZXIgY2xpY2tzIGFuIGl0ZW0sIHNlbGVjdEl0ZW0oKSB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBjbGljayBoYW5kbGVyXHJcbiAgICAgICAgLy9hbmQgdGhyb3VnaCBvblJvdXRlckxpbmtBY3RpdmF0ZWQuIE9ubHkgb25lIG9mIHRoZXNlIHdpbGwgbWFrZSBpdCB0aHJvdWdoIHRoaXMgaWYgc3RhdGVtZW50XHJcbiAgICAgICAgLy9iZWNhdXNlIHRoZSBmaXJzdCBvbmUgd2lsbCBzZXQgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtLlxyXG4gICAgICAgIGlmKCFpdGVtLmRpc2FibGVkICYmICFpdGVtLnJlYWRvbmx5ICYmIHRoaXMubGFzdFNlbGVjdGVkICE9PSBpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0udXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5vbkNsaWNrKGl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hpbGRNZW51KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSB0aGUgdXJsIG5hdmlnYXRpb24gaWYgdGhlIGtleWJvYXJkIHdhcyB1c2VkXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNLZXlFdmVudCB8fCAoPEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KT8udGFnTmFtZSA9PT0gJ0xJJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS51cmwsIGl0ZW0udGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3dTZXJ2aWNlLm5hdmlnYXRlVG9VcmwoaXRlbS51cmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gRW1pdCBzbyB1cHN0cmVhbSBjb21wb25lbnRzIGtub3cgYW4gaXRlbSB3YXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYWludGFpblNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IG1lbnUgYW5kIG9wZW4gdGhlIHBhcmVudCBtZW51XHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYmFjayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vbkNsaWNrKG51bGwsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lbnVDbG9zZWQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgdGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNlbGVjdGlvbihpdGVtOiBNZW51SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlZC5lbWl0KGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIG9yIGNsb3NlIHRoZSBjaGlsZCBtZW51LiBXaGVuIHRoZSBjaGlsZCBtZW51IGNsb3NlcywgdGhlIHNlbGVjdGVkXHJcbiAgICAgKiBpdGVtIGlzIHJlc2V0LlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZ2dsZUNoaWxkTWVudShvcGVuOmJvb2xlYW4pOnZvaWQge1xyXG4gICAgICAgIGxldCBuYXZFbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCduYXYnKTtcclxuXHJcbiAgICAgICAgaWYgKG9wZW4pIHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciBvbiB0aGUgcGFyZW50IG1lbnUgd2hlbiBhIGNoaWxkIG1lbnUgaXMgb3BlbmVkXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgbWVudXNcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0Om51bWJlciA9IG5hdkVsLm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgbGV0IHdpZHRoOm51bWJlciA9IG5hdkVsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gYW5pbWF0ZSB0aGUgY2hpbGQgbWVudSwgd2UgbmVlZCB0byBzZXQgaGVpZ2h0IG9uIHRoZSBuYXYgZWxlbWVudFxyXG4gICAgICAgICAgICAvLyBzbyB3ZSBjYW4gYWJzb2x1dGVseSBwb3NpdGlvbiB0aGUgdHdvIG1lbnVzIGFuZCBtYWludGFpbiB0aGUgY3VycmVudCBtZW51J3MgaGVpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXZFbCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3BlbicpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3Blbi1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBSZS1hZGQgdGhlIGxpc3RlbmVyIG9uY2UgdGhlIGNoaWxkIG1lbnUgY2xvc2VzXHJcbiAgICAgICAgICAgIHRoaXMuYWRkS2V5ZG93bkxpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4tYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIG5hdiBlbGVtZW50J3MgaGVpZ2h0IHRvIGF1dG9cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCAnMTAwJScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sIG1lbnVBbmltYXRpb25TcGVlZClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUga2V5IHByZXNzZXMgdG8gbmF2aWdhdGUgdGhlIG1lbnVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleU5hdmlnYXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5TmF2KSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1VwJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdEb3duJzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZUhpZ2hsaWdodGVkVXBPckRvd24oZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnUmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBpdGVtIGlmIGl0IGhhcyBjaGlsZCBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbSAmJiB0aGlzLmhpZ2hsaWdodGVkSXRlbS5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG1lbnUgaWYgaXQgaXMgYSBjaGlsZCBtZW51XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnU3BhY2ViYXInOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgJ2VudGVyJyBmcm9tIGRvaW5nIHdoYXRldmVyIGl0IGRvZXMgb24gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xICYmIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgdGhpcy5oaWdobGlnaHRlZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBoZWFkZXIgaXMgaGlnaGxpZ2h0ZWRcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPT09IC0xKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbWVudSBpZiBpdCdzIGEgY2hpbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Nyb2xsIHRvIHRoZSBpdGVtIGN1cnJlbnRseSBtYXJrZWQgYXMgJ2lzLXNlbGVjdGVkJy4gV2FpdCBhIHRpY2sgZm9yIHRoZVxyXG4gICAgICogTmdDbGFzc0RpcmVjaXR2ZSBvciBOYXZJdGVtQWN0aXZlRGlyZWN0aXZlIHRvIHJlc3BvbmQgdG8gdGhlIG1vZGVsIGNoYW5nZXNcclxuICAgICAqIGFuZCB1cGRhdGUgdGhlIHZpZXcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY3JvbGxUb1NlbGVjdGVkSXRlbSgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmtTZWxlY3RvciA9IGBsaS5pcy1zZWxlY3RlZGA7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxUb0l0ZW0oYCMke3RoaXMuaWR9X2xpc3RgLCBsaW5rU2VsZWN0b3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbW92ZUhpZ2hsaWdodGVkVXBPckRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgY2FzZSAnVXAnOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgtLTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xICYmIHRoaXMuaXRlbXNbdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgtLTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgIGNhc2UgJ0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbnkgaW4tbWVudSBoZWFkaW5nIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEgJiYgdGhpcy5pdGVtc1t0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4XS5kaXNwbGF5ID09PSAnaGVhZGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGl0ZW0gYXQgdGhlIGN1cnJlbnQgaGlnaGxpZ2h0IGluZGV4XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gdGhpcy5pdGVtc1t0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9IaWdobGlnaHRlZEl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBTY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBtZW51IGl0ZW0uXHJcbiAgICogSWYgbm8gaXRlbSBpcyBwcm92aWRlZCwgaXQgd2lsbCBzY3JvbGwgdG8gdGhlIGZpcnN0IGl0ZW0uXHJcblx0ICpcclxuICAgKiBAcGFyYW0gaXRlbSBUaGUgbWVudSBpdGVtIHRvIHNjcm9sbCB0by5cclxuXHQgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2Nyb2xsTWVudShpdGVtPzogTWVudUl0ZW0gfCBudWxsKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGl0ZW0gPSBpdGVtID8gaXRlbSA6IHRoaXMuaXRlbXNbMF07XHJcbiAgICAgICAgICAgIGxldCBpdGVtSW5kZXggPSB0aGlzLmZpbmRJdGVtSW5kZXgoaXRlbSk7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5pZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1TZWxlY3RvciA9IGl0ZW0uaWQgPyBgIyR7aXRlbS5pZH1gIDogYCMke3RoaXMuaWR9X2l0ZW0ke2l0ZW1JbmRleH1gO1xyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxJdGVtQ2VudGVyZWQoYCMke3RoaXMuaWR9X2xpc3RgLCBpdGVtU2VsZWN0b3IpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzY3JvbGxUb0hpZ2hsaWdodGVkSXRlbSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNjcm9sbE1lbnUodGhpcy5oaWdobGlnaHRlZEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCAqIEZpbmQgYSBnaXZlbiBpdGVtJ3MgaW5kZXggaW4gdGhlIGZpbHRlcmVkIGl0ZW1zIGFycmF5LlxyXG5cdCAqXHJcblx0ICogUmV0dXJucyAtMSBpZiBub3QgZm91bmRcclxuXHQgKiBAcGFyYW0gaXRlbVRvRmluZCBUaGUgbWF0Y2hpbmcgaXRlbSB0byBmaW5kIGluIHRoZSBpdGVtcyBhcnJheS5cclxuXHQgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZmluZEl0ZW1JbmRleChpdGVtVG9GaW5kPzogTWVudUl0ZW0gfCBudWxsKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoaXRlbVRvRmluZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZEtleWRvd25MaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgICAgICAvLyBPbmx5IGF0dGVtcHQgdG8gYWRkIHRoZSBsaXN0ZW5lciBpZiBrZXlib2FyZCBuYXYgaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUtleU5hdikge1xyXG4gICAgICAgICAgICAvLyByZW5kZXJlci5saXN0ZW4gYWRkcyB0aGUgbGlzdGVuZXIgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0byByZW1vdmUgaXQgZnJvbSB0aGUgcmVuZGVyZXIuXHJcbiAgICAgICAgICAgIC8vIFRoZSBsaXN0ZW5lciByZW1haW5zIGFjdGl2ZSB1bnRpbCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5rZXlOYXZpZ2F0ZShldmVudCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1lbnUgaXRlbSBpZHMgdXNpbmcgaXRzIGluZGV4IGlmIGl0ZW0gZG9lc24ndCBhbHJlYWR5IGhhdmUgb25lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0SXRlbUlkcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmlkID0gaXRlbS5pZCA/IGl0ZW0uaWQgOiB0aGlzLmlkICsgJ19pdGVtJyArIGluZGV4O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -1,86 +0,0 @@
1
- import { Directive, Input, ElementRef, Renderer2, Output, EventEmitter } from '@angular/core';
2
- import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
3
- import { Subject } from 'rxjs';
4
- import { takeUntil, filter } from 'rxjs/operators';
5
- export class NavItemActiveDirective {
6
- constructor(router, el, renderer, route) {
7
- this.router = router;
8
- this.el = el;
9
- this.renderer = renderer;
10
- this.route = route;
11
- this._exact = true;
12
- /** Emits when the url becomes active */
13
- this.routerLinkActivated = new EventEmitter();
14
- /** Subject that emits when component is destroyed to unsubscribe from any subscriptions */
15
- this.destroyed = new Subject();
16
- }
17
- /**
18
- * Determines whether the directive will try to make an exact match on the url or not
19
- * If false, the directive will add the active class if the first part of the url matches
20
- * the active route.
21
- * see: https://angular.io/api/router/Router#isactive
22
- */
23
- set exact(value) {
24
- if (value === undefined) {
25
- this._exact = true;
26
- }
27
- else {
28
- this._exact = value;
29
- }
30
- this.update();
31
- }
32
- /**
33
- * The url of the NavItem to check for activeness. Convert the item url into a
34
- * UrlTree relative to the ActivatedRoute so router#isActive works even with relative urls.
35
- * See Angular's [routerLink](https://github.com/angular/angular/blob/8282e15c2becbe42a49befa07d6407247e8243d8/packages/router/src/directives/router_link.ts#L249)
36
- * and [routerLinkActive](https://github.com/angular/angular/blob/8282e15c2becbe42a49befa07d6407247e8243d8/packages/router/src/directives/router_link_active.ts#L139)
37
- * for a similiar implementation.
38
- */
39
- set url(value) {
40
- if (value !== null && value !== undefined) {
41
- this._url = this.router.createUrlTree([value], { relativeTo: this.route, queryParams: this.queryParams });
42
- this.update();
43
- }
44
- }
45
- /** Check if url is active on NavigationEnd events */
46
- ngOnInit() {
47
- this.router.events.pipe(takeUntil(this.destroyed), filter(e => e instanceof NavigationEnd)).subscribe(() => {
48
- this.update();
49
- });
50
- }
51
- ngOnDestroy() {
52
- this.destroyed.next();
53
- this.destroyed.unsubscribe();
54
- }
55
- /** If url is active apply the defined class to the element, otherwise remove it */
56
- update() {
57
- if (this._url && this.classValue) {
58
- if (this.router.isActive(this._url, this._exact)) {
59
- this.renderer.addClass(this.el.nativeElement, this.classValue);
60
- this.routerLinkActivated.emit(new Event('routerLinkActivated'));
61
- }
62
- else {
63
- this.renderer.removeClass(this.el.nativeElement, this.classValue);
64
- }
65
- }
66
- }
67
- }
68
- NavItemActiveDirective.decorators = [
69
- { type: Directive, args: [{
70
- selector: '[ecNavItemActive]'
71
- },] }
72
- ];
73
- NavItemActiveDirective.ctorParameters = () => [
74
- { type: Router },
75
- { type: ElementRef },
76
- { type: Renderer2 },
77
- { type: ActivatedRoute }
78
- ];
79
- NavItemActiveDirective.propDecorators = {
80
- classValue: [{ type: Input, args: ['ecNavItemActive',] }],
81
- exact: [{ type: Input, args: ['ecNavItemActiveExactMatch',] }],
82
- queryParams: [{ type: Input, args: ['ecNavItemActiveQueryParams',] }],
83
- url: [{ type: Input, args: ['ecNavItemActiveUrl',] }],
84
- routerLinkActivated: [{ type: Output }]
85
- };
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LWl0ZW0tYWN0aXZlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9uYXZpZ2F0aW9uL25hdi1pdGVtLWFjdGl2ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS25ELE1BQU0sT0FBTyxzQkFBc0I7SUErQ2pDLFlBQW9CLE1BQWMsRUFBVSxFQUFjLEVBQVUsUUFBbUIsRUFBVSxLQUFxQjtRQUFsRyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQTNCOUcsV0FBTSxHQUFZLElBQUksQ0FBQztRQXFCL0Isd0NBQXdDO1FBQzlCLHdCQUFtQixHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXhFLDJGQUEyRjtRQUNuRixjQUFTLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7SUFFd0UsQ0FBQztJQTFDMUg7Ozs7O09BS0c7SUFDSCxJQUNJLEtBQUssQ0FBQyxLQUEwQjtRQUNsQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDcEI7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFNRDs7Ozs7O09BTUc7SUFDSCxJQUNJLEdBQUcsQ0FBQyxLQUF5QjtRQUMvQixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUM7WUFDeEcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBV0QscURBQXFEO0lBQzlDLFFBQVE7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JCLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxhQUFhLENBQUMsQ0FDeEMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxtRkFBbUY7SUFDM0UsTUFBTTtRQUNaLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2hDLElBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ25FO1NBQ0Y7SUFDSCxDQUFDOzs7WUE3RUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7YUFDOUI7OztZQU5RLE1BQU07WUFEWSxVQUFVO1lBQUUsU0FBUztZQUNoQixjQUFjOzs7eUJBVTNDLEtBQUssU0FBQyxpQkFBaUI7b0JBUXZCLEtBQUssU0FBQywyQkFBMkI7MEJBWWpDLEtBQUssU0FBQyw0QkFBNEI7a0JBU2xDLEtBQUssU0FBQyxvQkFBb0I7a0NBVTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQsIEFjdGl2YXRlZFJvdXRlLCBVcmxUcmVlLCBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZWNOYXZJdGVtQWN0aXZlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE5hdkl0ZW1BY3RpdmVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8qKiBUaGUgQ1NTIGNsYXNzIHRvIGFwcGx5IHRvIHRoZSBob3N0IGVsZW1lbnQgd2hlbiB0aGUgdXJsIGlzIGFjdGl2ZSAqL1xyXG4gIEBJbnB1dCgnZWNOYXZJdGVtQWN0aXZlJykgY2xhc3NWYWx1ZT86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkaXJlY3RpdmUgd2lsbCB0cnkgdG8gbWFrZSBhbiBleGFjdCBtYXRjaCBvbiB0aGUgdXJsIG9yIG5vdFxyXG4gICAqIElmIGZhbHNlLCB0aGUgZGlyZWN0aXZlIHdpbGwgYWRkIHRoZSBhY3RpdmUgY2xhc3MgaWYgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHVybCBtYXRjaGVzXHJcbiAgICogdGhlIGFjdGl2ZSByb3V0ZS5cclxuICAgKiBzZWU6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkvcm91dGVyL1JvdXRlciNpc2FjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnZWNOYXZJdGVtQWN0aXZlRXhhY3RNYXRjaCcpXHJcbiAgc2V0IGV4YWN0KHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9leGFjdCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9leGFjdCA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZXhhY3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogUm91dGVyIGxpbmsgcXVlcnkgcGFyYW1zICovXHJcbiAgQElucHV0KCdlY05hdkl0ZW1BY3RpdmVRdWVyeVBhcmFtcycpIHF1ZXJ5UGFyYW1zPzogUGFyYW1zIHwgbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHVybCBvZiB0aGUgTmF2SXRlbSB0byBjaGVjayBmb3IgYWN0aXZlbmVzcy4gQ29udmVydCB0aGUgaXRlbSB1cmwgaW50byBhXHJcbiAgICogVXJsVHJlZSByZWxhdGl2ZSB0byB0aGUgQWN0aXZhdGVkUm91dGUgc28gcm91dGVyI2lzQWN0aXZlIHdvcmtzIGV2ZW4gd2l0aCByZWxhdGl2ZSB1cmxzLlxyXG4gICAqIFNlZSBBbmd1bGFyJ3MgW3JvdXRlckxpbmtdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi84MjgyZTE1YzJiZWNiZTQyYTQ5YmVmYTA3ZDY0MDcyNDdlODI0M2Q4L3BhY2thZ2VzL3JvdXRlci9zcmMvZGlyZWN0aXZlcy9yb3V0ZXJfbGluay50cyNMMjQ5KVxyXG4gICAqIGFuZCBbcm91dGVyTGlua0FjdGl2ZV0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzgyODJlMTVjMmJlY2JlNDJhNDliZWZhMDdkNjQwNzI0N2U4MjQzZDgvcGFja2FnZXMvcm91dGVyL3NyYy9kaXJlY3RpdmVzL3JvdXRlcl9saW5rX2FjdGl2ZS50cyNMMTM5KVxyXG4gICAqIGZvciBhIHNpbWlsaWFyIGltcGxlbWVudGF0aW9uLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgnZWNOYXZJdGVtQWN0aXZlVXJsJylcclxuICBzZXQgdXJsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX3VybCA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW3ZhbHVlXSwge3JlbGF0aXZlVG86IHRoaXMucm91dGUsIHF1ZXJ5UGFyYW1zOiB0aGlzLnF1ZXJ5UGFyYW1zfSk7XHJcbiAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgX3VybD86IFVybFRyZWU7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1cmwgYmVjb21lcyBhY3RpdmUgKi9cclxuICBAT3V0cHV0KCkgcm91dGVyTGlua0FjdGl2YXRlZDogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqIFN1YmplY3QgdGhhdCBlbWl0cyB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgdG8gdW5zdWJzY3JpYmUgZnJvbSBhbnkgc3Vic2NyaXB0aW9ucyAqL1xyXG4gIHByaXZhdGUgZGVzdHJveWVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge31cclxuXHJcbiAgLyoqIENoZWNrIGlmIHVybCBpcyBhY3RpdmUgb24gTmF2aWdhdGlvbkVuZCBldmVudHMgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSxcclxuICAgICAgZmlsdGVyKGUgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBJZiB1cmwgaXMgYWN0aXZlIGFwcGx5IHRoZSBkZWZpbmVkIGNsYXNzIHRvIHRoZSBlbGVtZW50LCBvdGhlcndpc2UgcmVtb3ZlIGl0ICovXHJcbiAgcHJpdmF0ZSB1cGRhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXJsICYmIHRoaXMuY2xhc3NWYWx1ZSkge1xyXG4gICAgICBpZih0aGlzLnJvdXRlci5pc0FjdGl2ZSh0aGlzLl91cmwsIHRoaXMuX2V4YWN0KSkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmNsYXNzVmFsdWUpO1xyXG4gICAgICAgIHRoaXMucm91dGVyTGlua0FjdGl2YXRlZC5lbWl0KG5ldyBFdmVudCgncm91dGVyTGlua0FjdGl2YXRlZCcpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5jbGFzc1ZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=