@pega/angular-sdk-components 24.2.12 → 25.1.10

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 (248) hide show
  1. package/fesm2022/pega-angular-sdk-components.mjs +4828 -3717
  2. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
  3. package/lib/_bridge/angular-pconnect.d.ts +1 -1
  4. package/lib/_bridge/component-mapper/component-mapper.component.d.ts +1 -1
  5. package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +18 -0
  6. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
  7. package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +1 -0
  8. package/lib/_components/field/auto-complete/auto-complete.component.d.ts +9 -37
  9. package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +7 -5
  10. package/lib/_components/field/check-box/check-box.component.d.ts +10 -32
  11. package/lib/_components/field/currency/currency.component.d.ts +19 -34
  12. package/lib/_components/field/date/date.component.d.ts +7 -57
  13. package/lib/_components/field/date-time/date-time.component.d.ts +12 -40
  14. package/lib/_components/field/decimal/decimal.component.d.ts +16 -31
  15. package/lib/_components/field/dropdown/dropdown.component.d.ts +13 -37
  16. package/lib/_components/field/email/email.component.d.ts +7 -34
  17. package/lib/_components/field/field.base.d.ts +57 -0
  18. package/lib/_components/field/group/group.component.d.ts +5 -2
  19. package/lib/_components/field/integer/integer.component.d.ts +7 -33
  20. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -1
  21. package/lib/_components/field/location/location.component.d.ts +47 -0
  22. package/lib/_components/field/multiselect/multiselect.component.d.ts +7 -38
  23. package/lib/_components/field/object-reference/object-reference.component.d.ts +45 -0
  24. package/lib/_components/field/percentage/percentage.component.d.ts +18 -35
  25. package/lib/_components/field/phone/phone.component.d.ts +8 -31
  26. package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +13 -33
  27. package/lib/_components/field/rich-text/rich-text.component.d.ts +6 -29
  28. package/lib/_components/field/scalar-list/scalar-list.component.d.ts +6 -21
  29. package/lib/_components/field/selectable-card/selectable-card.component.d.ts +62 -0
  30. package/lib/_components/field/semantic-link/semantic-link.component.d.ts +21 -0
  31. package/lib/_components/field/text-area/text-area.component.d.ts +6 -33
  32. package/lib/_components/field/text-input/text-input.component.d.ts +6 -34
  33. package/lib/_components/field/time/time.component.d.ts +6 -34
  34. package/lib/_components/field/url/url.component.d.ts +6 -34
  35. package/lib/_components/field/user-reference/user-reference.component.d.ts +1 -1
  36. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +1 -0
  37. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +4 -6
  38. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
  39. package/lib/_components/infra/assignment/assignment.component.d.ts +3 -3
  40. package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +3 -2
  41. package/lib/_components/infra/defer-load/defer-load.component.d.ts +6 -6
  42. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
  43. package/lib/_components/infra/navbar/navbar.component.d.ts +0 -1
  44. package/lib/_components/infra/stages/stages.component.d.ts +2 -1
  45. package/lib/_components/template/advanced-search/advanced-search.component.d.ts +21 -0
  46. package/lib/_components/template/advanced-search/search-group/persist-utils.d.ts +23 -0
  47. package/lib/_components/template/advanced-search/search-groups/search-groups.component.d.ts +47 -0
  48. package/lib/_components/template/advanced-search/search-groups/utils.d.ts +15 -0
  49. package/lib/_components/template/app-shell/app-shell.component.d.ts +6 -2
  50. package/lib/_components/template/base/details-template-base.d.ts +1 -1
  51. package/lib/_components/template/base/form-template-base.d.ts +1 -1
  52. package/lib/_components/template/case-summary/case-summary.component.d.ts +3 -2
  53. package/lib/_components/template/case-view/case-view.component.d.ts +0 -1
  54. package/lib/_components/template/data-reference/data-reference.component.d.ts +27 -2
  55. package/lib/_components/template/data-reference/search-form/search-form.component.d.ts +39 -0
  56. package/lib/_components/template/data-reference/search-form/tabsData.d.ts +2 -0
  57. package/lib/_components/template/data-reference/utils.d.ts +14 -0
  58. package/lib/_components/template/default-form/default-form.component.d.ts +3 -2
  59. package/lib/_components/template/default-page/default-page.component.d.ts +29 -0
  60. package/lib/_components/template/field-group-template/field-group-template.component.d.ts +3 -5
  61. package/lib/_components/template/list-view/list-view.component.d.ts +21 -5
  62. package/lib/_components/template/object-page/object-page.component.d.ts +8 -0
  63. package/lib/_components/template/self-service-case-view/self-service-case-view.component.d.ts +58 -0
  64. package/lib/_components/template/simple-table-manual/helpers.d.ts +15 -1
  65. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +2 -2
  66. package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +18 -2
  67. package/lib/_components/template/utils.d.ts +4 -0
  68. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +3 -5
  69. package/lib/_components/widget/attachment/Attachment.types.d.ts +87 -0
  70. package/lib/_components/widget/attachment/AttachmentUtils.d.ts +17 -0
  71. package/lib/_components/widget/attachment/attachment.component.d.ts +18 -33
  72. package/lib/_components/widget/feed-container/feed-container.component.d.ts +2 -2
  73. package/lib/_components/widget/file-utility/file-utility.component.d.ts +3 -1
  74. package/lib/_components/widget/todo/todo.component.d.ts +4 -2
  75. package/lib/_helpers/field-group-utils.d.ts +1 -3
  76. package/lib/_helpers/filter-utils.d.ts +1 -3
  77. package/lib/_helpers/object-utils.d.ts +8 -0
  78. package/lib/_helpers/objectReference-utils.d.ts +6 -0
  79. package/lib/_helpers/semanticLink-utils.d.ts +9 -0
  80. package/lib/_helpers/tab-utils.d.ts +4 -0
  81. package/lib/_helpers/utils.d.ts +5 -1
  82. package/lib/_services/case.service.d.ts +1 -1
  83. package/lib/_services/data-reference-advanced-search.service.d.ts +9 -0
  84. package/lib/_services/datapage.service.d.ts +1 -1
  85. package/lib/_services/google-maps-loader.service.d.ts +7 -0
  86. package/package.json +20 -6
  87. package/public-api.d.ts +14 -1
  88. package/esm2022/lib/_bridge/angular-pconnect.mjs +0 -428
  89. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +0 -107
  90. package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +0 -239
  91. package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +0 -142
  92. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +0 -50
  93. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +0 -29
  94. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +0 -31
  95. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +0 -51
  96. package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +0 -31
  97. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +0 -82
  98. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +0 -37
  99. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +0 -38
  100. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +0 -36
  101. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +0 -25
  102. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +0 -28
  103. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +0 -42
  104. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +0 -145
  105. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +0 -33
  106. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +0 -93
  107. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +0 -18
  108. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +0 -296
  109. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +0 -96
  110. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +0 -225
  111. package/esm2022/lib/_components/field/currency/currency.component.mjs +0 -195
  112. package/esm2022/lib/_components/field/date/date.component.mjs +0 -205
  113. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +0 -196
  114. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +0 -205
  115. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +0 -300
  116. package/esm2022/lib/_components/field/email/email.component.mjs +0 -165
  117. package/esm2022/lib/_components/field/group/group.component.mjs +0 -64
  118. package/esm2022/lib/_components/field/integer/integer.component.mjs +0 -168
  119. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +0 -45
  120. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +0 -314
  121. package/esm2022/lib/_components/field/multiselect/utils.mjs +0 -187
  122. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +0 -190
  123. package/esm2022/lib/_components/field/phone/phone.component.mjs +0 -155
  124. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +0 -182
  125. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +0 -109
  126. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +0 -95
  127. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +0 -57
  128. package/esm2022/lib/_components/field/text/text.component.mjs +0 -142
  129. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +0 -165
  130. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +0 -69
  131. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +0 -165
  132. package/esm2022/lib/_components/field/time/time.component.mjs +0 -174
  133. package/esm2022/lib/_components/field/url/url.component.mjs +0 -165
  134. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +0 -266
  135. package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +0 -18
  136. package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +0 -71
  137. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +0 -461
  138. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +0 -68
  139. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +0 -24
  140. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +0 -335
  141. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +0 -32
  142. package/esm2022/lib/_components/infra/Containers/view-container/helper.mjs +0 -22
  143. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +0 -211
  144. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +0 -31
  145. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +0 -407
  146. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +0 -47
  147. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +0 -87
  148. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +0 -143
  149. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +0 -18
  150. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +0 -80
  151. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +0 -136
  152. package/esm2022/lib/_components/infra/reference/reference.component.mjs +0 -126
  153. package/esm2022/lib/_components/infra/region/region.component.mjs +0 -33
  154. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +0 -223
  155. package/esm2022/lib/_components/infra/stages/stages.component.mjs +0 -62
  156. package/esm2022/lib/_components/infra/view/view.component.mjs +0 -188
  157. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +0 -156
  158. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +0 -43
  159. package/esm2022/lib/_components/template/base/details-template-base.mjs +0 -56
  160. package/esm2022/lib/_components/template/base/form-template-base.mjs +0 -16
  161. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +0 -101
  162. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +0 -185
  163. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +0 -68
  164. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +0 -242
  165. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +0 -73
  166. package/esm2022/lib/_components/template/details/details.component.mjs +0 -76
  167. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +0 -45
  168. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +0 -42
  169. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +0 -39
  170. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +0 -51
  171. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +0 -48
  172. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +0 -48
  173. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +0 -65
  174. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +0 -23
  175. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +0 -131
  176. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +0 -24
  177. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +0 -22
  178. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +0 -40
  179. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +0 -14
  180. package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +0 -208
  181. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +0 -1217
  182. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +0 -60
  183. package/esm2022/lib/_components/template/list-view/utils.mjs +0 -662
  184. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +0 -44
  185. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +0 -30
  186. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +0 -31
  187. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +0 -16
  188. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +0 -30
  189. package/esm2022/lib/_components/template/page/page.component.mjs +0 -52
  190. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +0 -149
  191. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +0 -138
  192. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +0 -104
  193. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +0 -271
  194. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +0 -813
  195. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +0 -129
  196. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +0 -16
  197. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +0 -67
  198. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +0 -31
  199. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +0 -16
  200. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +0 -31
  201. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +0 -40
  202. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +0 -30
  203. package/esm2022/lib/_components/template/utils.mjs +0 -38
  204. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +0 -31
  205. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +0 -53
  206. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +0 -137
  207. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +0 -24
  208. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +0 -393
  209. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +0 -80
  210. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +0 -521
  211. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +0 -638
  212. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +0 -57
  213. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +0 -75
  214. package/esm2022/lib/_components/widget/todo/todo.component.mjs +0 -230
  215. package/esm2022/lib/_components/widget/utility/utility.component.mjs +0 -34
  216. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +0 -28
  217. package/esm2022/lib/_helpers/case-utils.mjs +0 -71
  218. package/esm2022/lib/_helpers/common.mjs +0 -20
  219. package/esm2022/lib/_helpers/createstage-utils.mjs +0 -15
  220. package/esm2022/lib/_helpers/currency-utils.mjs +0 -57
  221. package/esm2022/lib/_helpers/date-format-utils.mjs +0 -68
  222. package/esm2022/lib/_helpers/event-util.mjs +0 -18
  223. package/esm2022/lib/_helpers/field-group-utils.mjs +0 -47
  224. package/esm2022/lib/_helpers/filter-utils.mjs +0 -105
  225. package/esm2022/lib/_helpers/formatters/boolean.mjs +0 -20
  226. package/esm2022/lib/_helpers/formatters/common.mjs +0 -17
  227. package/esm2022/lib/_helpers/formatters/currency-map.mjs +0 -903
  228. package/esm2022/lib/_helpers/formatters/currency.mjs +0 -68
  229. package/esm2022/lib/_helpers/formatters/date.mjs +0 -69
  230. package/esm2022/lib/_helpers/formatters/format-utils.mjs +0 -76
  231. package/esm2022/lib/_helpers/formatters/index.mjs +0 -124
  232. package/esm2022/lib/_helpers/instructions-utils.mjs +0 -36
  233. package/esm2022/lib/_helpers/tab-utils.mjs +0 -59
  234. package/esm2022/lib/_helpers/template-utils.mjs +0 -56
  235. package/esm2022/lib/_helpers/utils.mjs +0 -412
  236. package/esm2022/lib/_helpers/versionHelpers.mjs +0 -12
  237. package/esm2022/lib/_messages/error-messages.service.mjs +0 -31
  238. package/esm2022/lib/_messages/progress-spinner.service.mjs +0 -30
  239. package/esm2022/lib/_messages/update-worklist.service.mjs +0 -30
  240. package/esm2022/lib/_services/banner.service.mjs +0 -35
  241. package/esm2022/lib/_services/case.service.mjs +0 -32
  242. package/esm2022/lib/_services/datapage.service.mjs +0 -52
  243. package/esm2022/lib/_services/endpoints.mjs +0 -60
  244. package/esm2022/lib/_services/server-config.service.mjs +0 -52
  245. package/esm2022/lib/_types/PConnProps.interface.mjs +0 -2
  246. package/esm2022/pega-angular-sdk-components.mjs +0 -5
  247. package/esm2022/public-api.mjs +0 -145
  248. package/esm2022/sdk-local-component-map.mjs +0 -9
@@ -1,428 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { interval } from 'rxjs';
3
- import isEqual from 'fast-deep-equal';
4
- import { Utils } from '../_helpers/utils';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../_messages/progress-spinner.service";
7
- import * as i2 from "../_messages/error-messages.service";
8
- import * as i3 from "../_helpers/utils";
9
- export class AngularPConnectService {
10
- /* Used to toggle some class-wide logging */
11
- static { this.bLogging = false; }
12
- constructor(psService, erService, utils) {
13
- this.psService = psService;
14
- this.erService = erService;
15
- this.utils = utils;
16
- /**
17
- * Local variable for access to the store once the service is connected to it.
18
- */
19
- this.theStore = null;
20
- /**
21
- * Local variable used to compute the next componentID
22
- */
23
- this.counterComponentID = 0;
24
- /**
25
- * Local array used to store the association of an component to its most recent "props"
26
- * where "props" is the object containing the component's getConfigProps along with
27
- * anything added by populateAdditionalProps.
28
- * Each entry is: { __componentID__: _the component's most recent props_ }
29
- */
30
- this.componentPropsArr = [];
31
- // Establish necessary override flags for our use of Core
32
- // const coreOverrides = { "dynamicLoadComponents": false };
33
- // let coreOverrides = PCore.getBehaviorOverrides();
34
- // coreOverrides["dynamicLoadComponents"] = false;
35
- // PCore.setBehaviorOverrides( coreOverrides );
36
- PCore.setBehaviorOverride('dynamicLoadComponents', false);
37
- // Always best to use deep object compare when it's available
38
- // if (isEqual !== undefined) {
39
- // console.log(`AngularPConnect is using deep object compare`);
40
- // } else {
41
- // console.log(`AngularPConnect is using JSON.stringify compare`);
42
- // }
43
- }
44
- /**
45
- * Returns a unique (for this session) ComponentID that should
46
- * be used for that component to update its most recent props
47
- * (which can also be compared against its previous value
48
- * before updating). Note that this returns a string so we can use
49
- * it as a key in an associative array
50
- * @returns the next componentID
51
- */
52
- getNextComponentId() {
53
- this.counterComponentID += 1;
54
- // Note that we use the string version of the number so we have an
55
- // associative array that we can clean up later, if needed.
56
- return this.counterComponentID.toString();
57
- }
58
- /**
59
- * The Calling object (inComp) subscribes to store changes.
60
- * @param inComp The component that's subscribing to the store
61
- * @param inCallback The component's callback function (typically called onStateChange) that will
62
- * be called when the store changes.
63
- * @returns The **unsubscribe** function that should be called when the component needs
64
- * to unsubscribe from the store. (Typically during ngOnDestroy)
65
- */
66
- subscribeToStore(inComp = null, inCallback = null) {
67
- // const theCompName: string = inComp ? `${inComp.constructor.name}` : 'no component provided';
68
- let fnUnsubscribe;
69
- // console.log( `Bridge subscribing: ${theCompName} `);
70
- if (inComp) {
71
- fnUnsubscribe = this.getStore().subscribe(inCallback);
72
- }
73
- return fnUnsubscribe;
74
- }
75
- /**
76
- * Gets the Component's properties that are used (a) to populate componentPropsArr
77
- // and (b) to determine whether the component should update itself (re-render)
78
- * @param inComp The component whose properties are being obtained
79
- */
80
- getComponentProps(inComp = null) {
81
- let compProps = {};
82
- let addProps = {};
83
- if (inComp === null) {
84
- console.error(`AngularPConnect: getComponentProps called with bad component: ${inComp}`);
85
- }
86
- // if ((inComp.constructor.name === "FlowContainerComponent") || (inComp.constructor.name === "ViewContainerComponent")
87
- // || (inComp.constructor.name === "ViewComponent") || (inComp.constructor.name === "DeferLoadComponent")) {
88
- // console.log(`--> AngularPConnect getComponentProps: ${inComp.constructor.name}`);
89
- // }
90
- if (inComp.additionalProps !== undefined) {
91
- if (typeof inComp.additionalProps === 'object') {
92
- addProps = inComp.pConn$.resolveConfigProps(inComp.additionalProps);
93
- }
94
- else if (typeof inComp.additionalProps === 'function') {
95
- const propsToAdd = inComp.additionalProps(PCore.getStore().getState(), inComp.pConn$);
96
- addProps = inComp.pConn$.resolveConfigProps(propsToAdd);
97
- }
98
- }
99
- compProps = inComp.pConn$.getConfigProps();
100
- // const componentName = inComp.constructor.name;
101
- // The following comment is from the Nebula/Constellation version of this code. Meant as a reminder to check this occasionally
102
- // populate additional props which are component specific and not present in configurations
103
- // This block can be removed once all these props will be added as part of configs
104
- inComp.pConn$.populateAdditionalProps(compProps);
105
- compProps = inComp.pConn$.resolveConfigProps(compProps);
106
- if (compProps && undefined !== compProps.validatemessage && compProps.validatemessage != '') {
107
- // console.log( ` validatemessage for ${inComp.constructor.name} ${inComp.angularPConnectData.compID}: ${compProps.validatemessage}`);
108
- }
109
- return {
110
- ...compProps,
111
- ...addProps
112
- };
113
- }
114
- /**
115
- * Returns the unique id for given component created when registering
116
- * Otherwise, return undefined.
117
- * @param inComp The component whose property is being requested.
118
- */
119
- getComponentID(inComp) {
120
- return inComp.bridgeComponentID || inComp.angularPConnectData.compID;
121
- }
122
- /**
123
- * Returns the value of requested property for the component if it exists.
124
- * Otherwise, return undefined.
125
- * @param inComp The component whose property is being requested.
126
- * @param inProp The property being requested.
127
- */
128
- getComponentProp(inComp = null, inProp = '') {
129
- if (inComp === null) {
130
- console.error(`AngularPConnect: getComponentProp called with bad component: ${inComp}`);
131
- }
132
- const compID = inComp.angularPConnectData.compID;
133
- // Look up property in the component's entry in componentPropArray (which should have the most recent value)
134
- return this.componentPropsArr[compID][inProp];
135
- }
136
- /**
137
- *
138
- * @returns The current complete set of resolved properties that are associated with
139
- * this component.
140
- * This is the full set of properties that are tracked in Redux for this component.
141
- */
142
- getCurrentCompleteProps(inComp = null) {
143
- if (inComp === null) {
144
- console.error(`AngularPConnect: getCurrentCompleteProps called with bad component: ${inComp}`);
145
- }
146
- return this.componentPropsArr[inComp.angularPConnectData.compID];
147
- }
148
- /**
149
- * Registers the component and its callback function. When a component calls this method
150
- * (typically from its ngOnInit), the component is given a unique componentID (for this session)
151
- * and subscribes the component to the store. As a side effect, it also assigns the component's
152
- * actions (from its metadata) to the component's ___actions___ and binds the component's callback
153
- * (passed in as ___inCallback___) to the component. If a problem is encountered, an empty object,
154
- * {}, is returned.
155
- * @param inComp The component being registered and subscribed
156
- * @param inCallback The component's callback function (typically called onStateChange) that
157
- * will be called whenever the state changes.
158
- * @returns A JSON object with the following keys:
159
- * compID: the unique ID associated with this component,
160
- * unsubscribeFn: the function to be called when the component needs to unsubscribe from the store,
161
- * validateMessage: any validation/error message that gets generated for this object,
162
- * actions: any actions that are defined for this object
163
- */
164
- registerAndSubscribeComponent(inComp, inCallback = null) {
165
- // Create an initial object to be returned.
166
- const returnObject = {
167
- compID: '',
168
- unsubscribeFn: undefined,
169
- validateMessage: '',
170
- actions: undefined
171
- };
172
- if (inComp === null || inCallback === null) {
173
- console.error(`AngularPConnect: bad call to registerAndSubscribe: inComp: ${inComp} inCallback: ${inCallback}`);
174
- return returnObject;
175
- }
176
- const compType = inComp.constructor.name;
177
- if (AngularPConnectService.bLogging) {
178
- console.log(`registerAndSubscribeComponent: ${compType}`);
179
- }
180
- if (undefined !== inComp.bridgeComponentID) {
181
- console.error(`OLD SCHOOL: ${compType}`);
182
- }
183
- if (undefined === inComp.actions && undefined === inComp.angularPConnectData) {
184
- console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: actions not defined as a class variable for inComp`);
185
- return returnObject;
186
- }
187
- if (undefined === inComp.bridgeComponentID && undefined === inComp.angularPConnectData) {
188
- console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: bridgeComponentID not defined as a class variable for inComp`);
189
- return returnObject;
190
- }
191
- if (undefined === inComp.unsubscribeStore && undefined === inComp.angularPConnectData) {
192
- console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: unsubscribeStore not defined as a class variable for inComp`);
193
- return returnObject;
194
- }
195
- if (undefined === inComp.validateMessage && undefined === inComp.angularPConnectData) {
196
- console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: validateMessage not defined as a class variable for inComp`);
197
- return returnObject;
198
- }
199
- // call processActions to populate metadata with actions as in PConnectHOR initialize
200
- this.processActions(inComp);
201
- if (undefined === inComp.actions) {
202
- returnObject.actions = inComp.pConn$.getActions();
203
- }
204
- else {
205
- inComp.actions = inComp.pConn$.getActions();
206
- }
207
- // bind the provided callback to the component it's associated with
208
- inCallback = inCallback.bind(inComp);
209
- // Now proceed to register and subscribe...
210
- const theCompID = this.getNextComponentId();
211
- const theUnsub = this.subscribeToStore(inComp, inCallback);
212
- if (undefined === inComp.angularPConnectData) {
213
- inComp.bridgeComponentID = theCompID;
214
- }
215
- else {
216
- returnObject.compID = theCompID;
217
- returnObject.unsubscribeFn = () => {
218
- this.removeFormField(inComp);
219
- theUnsub();
220
- };
221
- }
222
- // initialize this components entry in the componentPropsArr
223
- this.componentPropsArr[theCompID] = {};
224
- this.addFormField(inComp);
225
- // return object with compID and unsubscribe...
226
- return returnObject;
227
- }
228
- addFormField(inComp) {
229
- inComp.pConn$?.addFormField();
230
- }
231
- removeFormField(inComp) {
232
- if (inComp.pConn$?.removeFormField) {
233
- inComp.pConn$?.removeFormField();
234
- }
235
- }
236
- // Returns true if the component's entry in ___componentPropsArr___ is
237
- // the same as the inCompProps passed in.
238
- // As a side effect, update the component's entry in componentPropsArr
239
- // NOTE: It is assumed that the incoming component has the following:
240
- // * a bridgeComponentID <string> property - used as lookup key in componentPropsArr
241
- // * a pConn$ <?> property - used to access functions accessed in getComponentProps
242
- // Return true: means the component props are different and the component should update itself (re-render)
243
- // Return false: means the component props are the same and the component doesn't need to update (re-render)
244
- // On bad input, return false;
245
- /**
246
- * Returns **true** if the component's entry in ___componentPropsArr___ is
247
- * the same as the properties that are current associated with the component (___inComp___) passed in.
248
- * As a side effect, the component's entry in ___componentPropsArr___ is updated.
249
- * **Note**: It is assumed that the incoming component has the following:
250
- * (a) a bridgeComponentID _string_ property used as lookup key in ___componentPropsArr___
251
- * and (b) a ___pConn$___ property used to access functions called in ___getComponentProps___
252
- *
253
- * @param inComp The component asking if it should update itself
254
- * @returns Return **true**: means the component props are different and the component should update itself (re-render).
255
- * Return **false**: means the component props are the same and the component doesn't need to update (re-render).
256
- * If the ***inComp*** input is bad, false is also returned.
257
- */
258
- shouldComponentUpdate(inComp) {
259
- // const bShowLogging = false;
260
- let bRet = false;
261
- // check for reasonable input
262
- if (Utils.isEmptyObject(inComp)) {
263
- console.error(`AngularPConnect: bad call to shouldComponentUpdate: inComp: ${JSON.stringify(inComp)}`);
264
- return bRet;
265
- }
266
- if (undefined === inComp.validateMessage && undefined === inComp.angularPConnectData) {
267
- console.error(`AngularPConnect: bad call to shouldComponentUpdate: ${inComp.constructor.name} does not have a validateMessage property.`);
268
- }
269
- const compID = this.getComponentID(inComp);
270
- const currentProps = this.componentPropsArr[compID];
271
- const currentPropsAsStr = JSON.stringify(currentProps);
272
- const incomingProps = this.getComponentProps(inComp);
273
- // if have pageMessages, and it is blank, remove it. This causes issues of making it appear
274
- // that a will cause an update, when there is no change
275
- if (this.isPageMessagesEmpty(incomingProps)) {
276
- inComp.angularPConnectData.pageMessages = incomingProps.pageMessages;
277
- delete incomingProps.pageMessages;
278
- }
279
- if (incomingProps.httpMessages) {
280
- inComp.angularPConnectData.httpMessages = incomingProps.httpMessages;
281
- incomingProps.httpMessages = undefined;
282
- }
283
- const incomingPropsAsStr = JSON.stringify(incomingProps);
284
- bRet = isEqual ? !isEqual(currentProps, incomingProps) : currentPropsAsStr != incomingPropsAsStr;
285
- // Below piece of code is needed to re-render the component since we wanna evaluate the Visibility expression within View component in such cases
286
- if (inComp.pConn$.meta.config.context?.length > 0 && inComp.pConn$.getPageReference().length > 'caseInfo.content'.length) {
287
- return true;
288
- }
289
- // Now update the entry in componentPropsArr with the incoming value so
290
- // we can compare against that next time...
291
- this.componentPropsArr[compID] = incomingProps;
292
- const validatemessage = incomingProps.validatemessage === undefined ? '' : this.utils.htmlDecode(incomingProps.validatemessage);
293
- // and update the component's validation message (if undefined, it should be set to "")
294
- if (undefined !== inComp.angularPConnectData) {
295
- inComp.angularPConnectData.validateMessage = validatemessage;
296
- if (inComp.angularPConnectData.validateMessage != '') {
297
- // if have a validate message, turn off spinner
298
- const timer = interval(100).subscribe(() => {
299
- this.psService.sendMessage(false);
300
- timer.unsubscribe();
301
- });
302
- let sErrorMessage = currentProps && currentProps.label ? currentProps.label.concat(' - ') : '';
303
- sErrorMessage = sErrorMessage.concat(inComp.angularPConnectData.validateMessage);
304
- this.erService.sendMessage('update', sErrorMessage);
305
- }
306
- }
307
- else {
308
- inComp.validateMessage = validatemessage;
309
- }
310
- if (bRet && compID === undefined) {
311
- bRet = false;
312
- }
313
- // console.log( `AngularPConnect component ${compID} - ${inComp.constructor.name} - shouldComponentUpdate: ${bRet}`);
314
- // console.log("current props: " + currentPropsAsStr);
315
- if (bRet) {
316
- // console.log(`**** change for: ${inComp.constructor.name}`);
317
- // console.log("current props: " + currentPropsAsStr);
318
- // console.log("incoming props: " + incomingPropsAsStr);
319
- // console.log(` ${inComp.constructor.name}: shouldComponentUpdate returning: ${bRet}, compId: ${compID}` );
320
- // console.log( ` Updating with componentProps for ${inComp.constructor.name}: ${JSON.stringify(this.componentPropsArr[compID])}`);
321
- // console.log( ` and validateMessage: ${inComp.validateMessage}`);
322
- }
323
- // else if (inComp.constructor.name.indexOf("View") >= 0 || inComp.constructor.name.indexOf("Root") >= 0) {
324
- // console.log("no change");
325
- // console.log("current props: " + currentPropsAsStr);
326
- // console.log("incoming props: " + incomingPropsAsStr);
327
- // console.log(` ${inComp.constructor.name}: shouldComponentUpdate returning: ${bRet}, compId: ${compID}` );
328
- // }
329
- // console.log(` ${inComp.constructor.name}: shouldComponentUpdate returning: ${bRet}`);
330
- return bRet;
331
- }
332
- isPageMessagesEmpty(incomingProps) {
333
- return incomingProps.pageMessages && incomingProps.pageMessages.length === 0;
334
- }
335
- /**
336
- * Can be called when the component has encountered a change event
337
- * @param inComp The component calling the change event
338
- * @param event The event
339
- */
340
- changeHandler(inComp, event) {
341
- const bLogging = false;
342
- if (bLogging) {
343
- // console.log(`AngularPConnect.changeHandler`);
344
- }
345
- // check for reasonable input
346
- if (undefined === inComp || Utils.isEmptyObject(inComp)) {
347
- console.error(`AngularPConnect: bad call to changeHandler: inComp: ${JSON.stringify(inComp)}`);
348
- return;
349
- }
350
- const pConnect = inComp.pConn$;
351
- if (undefined === pConnect) {
352
- console.error(`AngularPConnect: bad call to changeHandler: inComp.pConn$: ${pConnect}`);
353
- return;
354
- }
355
- // clear out errors
356
- this.erService.sendMessage('dismiss', '');
357
- pConnect.getActionsApi().changeHandler(pConnect, event);
358
- }
359
- /**
360
- * Can be called when the component has encountered an event (such as blur)
361
- * @param inComp The component calling the event
362
- * @param event The event
363
- */
364
- eventHandler(inComp, event) {
365
- const bLogging = false;
366
- if (bLogging) {
367
- // console.log(`AngularPConnect.eventHandler`);
368
- }
369
- // check for reasonable input
370
- if (undefined === inComp || Utils.isEmptyObject(inComp)) {
371
- console.error(`AngularPConnect: bad call to eventHandler: inComp: ${JSON.stringify(inComp)}`);
372
- return;
373
- }
374
- const pConnect = inComp.pConn$;
375
- if (undefined === pConnect) {
376
- console.error(`AngularPConnect: bad call to eventHandler: inComp.pConn$: ${pConnect}`);
377
- return;
378
- }
379
- pConnect.getActionsApi().eventHandler(pConnect, event);
380
- }
381
- /**
382
- * @returns A handle to the application's store
383
- */
384
- getStore() {
385
- if (this.theStore === null) {
386
- this.theStore = PCore.getStore();
387
- }
388
- return this.theStore;
389
- }
390
- /**
391
- * @param bLogMsg If true, will write the stringified state to the store for debugging/inspection
392
- * @param inComp If supplied, the component that is requesting the store's state
393
- * @returns A handle to the __state__ of application's store
394
- */
395
- getState(bLogMsg = false, inComp = null) {
396
- const theState = this.getStore().getState();
397
- if (bLogMsg) {
398
- const theCompName = inComp ? `${inComp.constructor.name}: ` : '';
399
- console.log(`${theCompName} Store state: ${JSON.stringify(theState)}`);
400
- }
401
- return theState;
402
- }
403
- // processActions - carried over from PConnectHOC initialize
404
- /**
405
- * processActions exposes all actions in the metadata.
406
- * Attaches common handler (eventHandler) for all actions.
407
- */
408
- processActions(inComp) {
409
- const pConnect = inComp.pConn$;
410
- if (undefined === pConnect) {
411
- console.error(`AngularPConnect: bad call to processActions: pConn$: ${pConnect} from component: ${inComp.constructor.name}`);
412
- return;
413
- }
414
- if (inComp.pConn$.isEditable()) {
415
- inComp.pConn$.setAction('onChange', this.changeHandler.bind(this));
416
- inComp.pConn$.setAction('onBlur', this.eventHandler.bind(this));
417
- }
418
- }
419
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AngularPConnectService, deps: [{ token: i1.ProgressSpinnerService }, { token: i2.ErrorMessagesService }, { token: i3.Utils }], target: i0.ɵɵFactoryTarget.Injectable }); }
420
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AngularPConnectService, providedIn: 'root' }); }
421
- }
422
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AngularPConnectService, decorators: [{
423
- type: Injectable,
424
- args: [{
425
- providedIn: 'root'
426
- }]
427
- }], ctorParameters: () => [{ type: i1.ProgressSpinnerService }, { type: i2.ErrorMessagesService }, { type: i3.Utils }] });
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1wY29ubmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fYnJpZGdlL2FuZ3VsYXItcGNvbm5lY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sT0FBTyxNQUFNLGlCQUFpQixDQUFDO0FBR3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFlMUMsTUFBTSxPQUFPLHNCQUFzQjtJQW1CakMsNENBQTRDO2FBQzdCLGFBQVEsR0FBRyxLQUFLLEFBQVIsQ0FBUztJQUVoQyxZQUNVLFNBQWlDLEVBQ2pDLFNBQStCLEVBQy9CLEtBQVk7UUFGWixjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUNqQyxjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBeEJ0Qjs7V0FFRztRQUNLLGFBQVEsR0FBUSxJQUFJLENBQUM7UUFFN0I7O1dBRUc7UUFDSyx1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFFL0I7Ozs7O1dBS0c7UUFDSyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFVdkMseURBQXlEO1FBQ3pELDREQUE0RDtRQUM1RCxvREFBb0Q7UUFDcEQsa0RBQWtEO1FBQ2xELCtDQUErQztRQUMvQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFMUQsNkRBQTZEO1FBQzdELCtCQUErQjtRQUMvQiwrREFBK0Q7UUFDL0QsV0FBVztRQUNYLGtFQUFrRTtRQUNsRSxJQUFJO0lBQ04sQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixJ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QW9CLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3SCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDOytHQTlkVSxzQkFBc0I7bUhBQXRCLHNCQUFzQixjQUZyQixNQUFNOzs0RkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vX21lc3NhZ2VzL3Byb2dyZXNzLXNwaW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2VzU2VydmljZSB9IGZyb20gJy4uL19tZXNzYWdlcy9lcnJvci1tZXNzYWdlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vX2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFuZ3VsYXJQQ29ubmVjdERhdGEge1xuICBjb21wSUQ/OiBzdHJpbmc7XG4gIHVuc3Vic2NyaWJlRm4/OiBGdW5jdGlvbjtcbiAgdmFsaWRhdGVNZXNzYWdlPzogc3RyaW5nO1xuICBhY3Rpb25zPzoge1xuICAgIG9uQ2hhbmdlOiBGdW5jdGlvbjtcbiAgICBvbkJsdXI6IEZ1bmN0aW9uO1xuICB9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIExvY2FsIHZhcmlhYmxlIGZvciBhY2Nlc3MgdG8gdGhlIHN0b3JlIG9uY2UgdGhlIHNlcnZpY2UgaXMgY29ubmVjdGVkIHRvIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSB0aGVTdG9yZTogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogTG9jYWwgdmFyaWFibGUgdXNlZCB0byBjb21wdXRlIHRoZSBuZXh0IGNvbXBvbmVudElEXG4gICAqL1xuICBwcml2YXRlIGNvdW50ZXJDb21wb25lbnRJRCA9IDA7XG5cbiAgLyoqXG4gICAqIExvY2FsIGFycmF5IHVzZWQgdG8gc3RvcmUgdGhlIGFzc29jaWF0aW9uIG9mIGFuIGNvbXBvbmVudCB0byBpdHMgbW9zdCByZWNlbnQgXCJwcm9wc1wiXG4gICAqICB3aGVyZSBcInByb3BzXCIgaXMgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBjb21wb25lbnQncyBnZXRDb25maWdQcm9wcyBhbG9uZyB3aXRoXG4gICAqIGFueXRoaW5nIGFkZGVkIGJ5IHBvcHVsYXRlQWRkaXRpb25hbFByb3BzLlxuICAgKiBFYWNoIGVudHJ5IGlzOiB7IF9fY29tcG9uZW50SURfXzogX3RoZSBjb21wb25lbnQncyBtb3N0IHJlY2VudCBwcm9wc18gfVxuICAgKi9cbiAgcHJpdmF0ZSBjb21wb25lbnRQcm9wc0FycjogT2JqZWN0W10gPSBbXTtcblxuICAvKiBVc2VkIHRvIHRvZ2dsZSBzb21lIGNsYXNzLXdpZGUgbG9nZ2luZyAqL1xuICBwcml2YXRlIHN0YXRpYyBiTG9nZ2luZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcHNTZXJ2aWNlOiBQcm9ncmVzc1NwaW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXJTZXJ2aWNlOiBFcnJvck1lc3NhZ2VzU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxzOiBVdGlsc1xuICApIHtcbiAgICAvLyBFc3RhYmxpc2ggbmVjZXNzYXJ5IG92ZXJyaWRlIGZsYWdzIGZvciBvdXIgdXNlIG9mIENvcmVcbiAgICAvLyBjb25zdCBjb3JlT3ZlcnJpZGVzID0geyBcImR5bmFtaWNMb2FkQ29tcG9uZW50c1wiOiBmYWxzZSB9O1xuICAgIC8vIGxldCBjb3JlT3ZlcnJpZGVzID0gUENvcmUuZ2V0QmVoYXZpb3JPdmVycmlkZXMoKTtcbiAgICAvLyBjb3JlT3ZlcnJpZGVzW1wiZHluYW1pY0xvYWRDb21wb25lbnRzXCJdID0gZmFsc2U7XG4gICAgLy8gUENvcmUuc2V0QmVoYXZpb3JPdmVycmlkZXMoIGNvcmVPdmVycmlkZXMgKTtcbiAgICBQQ29yZS5zZXRCZWhhdmlvck92ZXJyaWRlKCdkeW5hbWljTG9hZENvbXBvbmVudHMnLCBmYWxzZSk7XG5cbiAgICAvLyBBbHdheXMgYmVzdCB0byB1c2UgZGVlcCBvYmplY3QgY29tcGFyZSB3aGVuIGl0J3MgYXZhaWxhYmxlXG4gICAgLy8gaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGBBbmd1bGFyUENvbm5lY3QgaXMgdXNpbmcgZGVlcCBvYmplY3QgY29tcGFyZWApO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gY29uc29sZS5sb2coYEFuZ3VsYXJQQ29ubmVjdCBpcyB1c2luZyBKU09OLnN0cmluZ2lmeSBjb21wYXJlYCk7XG4gICAgLy8gfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB1bmlxdWUgKGZvciB0aGlzIHNlc3Npb24pIENvbXBvbmVudElEIHRoYXQgc2hvdWxkXG4gICAqIGJlIHVzZWQgZm9yIHRoYXQgY29tcG9uZW50IHRvIHVwZGF0ZSBpdHMgbW9zdCByZWNlbnQgcHJvcHNcbiAgICogKHdoaWNoIGNhbiBhbHNvIGJlIGNvbXBhcmVkIGFnYWluc3QgaXRzIHByZXZpb3VzIHZhbHVlXG4gICAqIGJlZm9yZSB1cGRhdGluZykuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgYSBzdHJpbmcgc28gd2UgY2FuIHVzZVxuICAgKiBpdCBhcyBhIGtleSBpbiBhbiBhc3NvY2lhdGl2ZSBhcnJheVxuICAgKiBAcmV0dXJucyB0aGUgbmV4dCBjb21wb25lbnRJRFxuICAgKi9cbiAgcHJpdmF0ZSBnZXROZXh0Q29tcG9uZW50SWQoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNvdW50ZXJDb21wb25lbnRJRCArPSAxO1xuICAgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBudW1iZXIgc28gd2UgaGF2ZSBhblxuICAgIC8vICBhc3NvY2lhdGl2ZSBhcnJheSB0aGF0IHdlIGNhbiBjbGVhbiB1cCBsYXRlciwgaWYgbmVlZGVkLlxuICAgIHJldHVybiB0aGlzLmNvdW50ZXJDb21wb25lbnRJRC50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBDYWxsaW5nIG9iamVjdCAoaW5Db21wKSBzdWJzY3JpYmVzIHRvIHN0b3JlIGNoYW5nZXMuXG4gICAqIEBwYXJhbSBpbkNvbXAgVGhlIGNvbXBvbmVudCB0aGF0J3Mgc3Vic2NyaWJpbmcgdG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBpbkNhbGxiYWNrIFRoZSBjb21wb25lbnQncyBjYWxsYmFjayBmdW5jdGlvbiAodHlwaWNhbGx5IGNhbGxlZCBvblN0YXRlQ2hhbmdlKSB0aGF0IHdpbGxcbiAgICogYmUgY2FsbGVkIHdoZW4gdGhlIHN0b3JlIGNoYW5nZXMuXG4gICAqIEByZXR1cm5zIFRoZSAqKnVuc3Vic2NyaWJlKiogZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBuZWVkc1xuICAgKiB0byB1bnN1YnNjcmliZSBmcm9tIHRoZSBzdG9yZS4gKFR5cGljYWxseSBkdXJpbmcgbmdPbkRlc3Ryb3kpXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvU3RvcmUoaW5Db21wOiBhbnkgPSBudWxsLCBpbkNhbGxiYWNrOiBGdW5jdGlvbiB8IG51bGwgPSBudWxsKTogRnVuY3Rpb24ge1xuICAgIC8vIGNvbnN0IHRoZUNvbXBOYW1lOiBzdHJpbmcgPSBpbkNvbXAgPyBgJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX1gIDogJ25vIGNvbXBvbmVudCBwcm92aWRlZCc7XG4gICAgbGV0IGZuVW5zdWJzY3JpYmU7XG4gICAgLy8gY29uc29sZS5sb2coIGBCcmlkZ2Ugc3Vic2NyaWJpbmc6ICR7dGhlQ29tcE5hbWV9IGApO1xuICAgIGlmIChpbkNvbXApIHtcbiAgICAgIGZuVW5zdWJzY3JpYmUgPSB0aGlzLmdldFN0b3JlKCkuc3Vic2NyaWJlKGluQ2FsbGJhY2spO1xuICAgIH1cbiAgICByZXR1cm4gZm5VbnN1YnNjcmliZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBDb21wb25lbnQncyBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWQgKGEpIHRvIHBvcHVsYXRlIGNvbXBvbmVudFByb3BzQXJyXG4gIC8vICBhbmQgKGIpIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgKHJlLXJlbmRlcilcbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIG9idGFpbmVkXG4gICAqL1xuICBwcml2YXRlIGdldENvbXBvbmVudFByb3BzKGluQ29tcDogYW55ID0gbnVsbCk6IE9iamVjdCB7XG4gICAgbGV0IGNvbXBQcm9wczogYW55ID0ge307XG4gICAgbGV0IGFkZFByb3BzID0ge307XG5cbiAgICBpZiAoaW5Db21wID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGdldENvbXBvbmVudFByb3BzIGNhbGxlZCB3aXRoIGJhZCBjb21wb25lbnQ6ICR7aW5Db21wfWApO1xuICAgIH1cblxuICAgIC8vIGlmICgoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRmxvd0NvbnRhaW5lckNvbXBvbmVudFwiKSB8fCAoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVmlld0NvbnRhaW5lckNvbXBvbmVudFwiKVxuICAgIC8vICAgICB8fCAoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVmlld0NvbXBvbmVudFwiKSB8fCAoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRGVmZXJMb2FkQ29tcG9uZW50XCIpKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhgLS0+IEFuZ3VsYXJQQ29ubmVjdCBnZXRDb21wb25lbnRQcm9wczogJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICAvLyB9XG5cbiAgICBpZiAoaW5Db21wLmFkZGl0aW9uYWxQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGluQ29tcC5hZGRpdGlvbmFsUHJvcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFkZFByb3BzID0gaW5Db21wLnBDb25uJC5yZXNvbHZlQ29uZmlnUHJvcHMoaW5Db21wLmFkZGl0aW9uYWxQcm9wcyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbkNvbXAuYWRkaXRpb25hbFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHByb3BzVG9BZGQgPSBpbkNvbXAuYWRkaXRpb25hbFByb3BzKFBDb3JlLmdldFN0b3JlKCkuZ2V0U3RhdGUoKSwgaW5Db21wLnBDb25uJCk7XG4gICAgICAgIGFkZFByb3BzID0gaW5Db21wLnBDb25uJC5yZXNvbHZlQ29uZmlnUHJvcHMocHJvcHNUb0FkZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcFByb3BzID0gaW5Db21wLnBDb25uJC5nZXRDb25maWdQcm9wcygpO1xuXG4gICAgLy8gY29uc3QgY29tcG9uZW50TmFtZSA9IGluQ29tcC5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21tZW50IGlzIGZyb20gdGhlIE5lYnVsYS9Db25zdGVsbGF0aW9uIHZlcnNpb24gb2YgdGhpcyBjb2RlLiBNZWFudCBhcyBhIHJlbWluZGVyIHRvIGNoZWNrIHRoaXMgb2NjYXNpb25hbGx5XG4gICAgLy8gcG9wdWxhdGUgYWRkaXRpb25hbCBwcm9wcyB3aGljaCBhcmUgY29tcG9uZW50IHNwZWNpZmljIGFuZCBub3QgcHJlc2VudCBpbiBjb25maWd1cmF0aW9uc1xuICAgIC8vIFRoaXMgYmxvY2sgY2FuIGJlIHJlbW92ZWQgb25jZSBhbGwgdGhlc2UgcHJvcHMgd2lsbCBiZSBhZGRlZCBhcyBwYXJ0IG9mIGNvbmZpZ3NcbiAgICBpbkNvbXAucENvbm4kLnBvcHVsYXRlQWRkaXRpb25hbFByb3BzKGNvbXBQcm9wcyk7XG5cbiAgICBjb21wUHJvcHMgPSBpbkNvbXAucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyhjb21wUHJvcHMpO1xuXG4gICAgaWYgKGNvbXBQcm9wcyAmJiB1bmRlZmluZWQgIT09IGNvbXBQcm9wcy52YWxpZGF0ZW1lc3NhZ2UgJiYgY29tcFByb3BzLnZhbGlkYXRlbWVzc2FnZSAhPSAnJykge1xuICAgICAgLy8gY29uc29sZS5sb2coIGAgICB2YWxpZGF0ZW1lc3NhZ2UgZm9yICR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9ICR7aW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEuY29tcElEfTogJHtjb21wUHJvcHMudmFsaWRhdGVtZXNzYWdlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wUHJvcHMsXG4gICAgICAuLi5hZGRQcm9wc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIGlkIGZvciBnaXZlbiBjb21wb25lbnQgY3JlYXRlZCB3aGVuIHJlZ2lzdGVyaW5nXG4gICAqIE90aGVyd2lzZSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IHdob3NlIHByb3BlcnR5IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wb25lbnRJRChpbkNvbXApOiBzdHJpbmcge1xuICAgIHJldHVybiBpbkNvbXAuYnJpZGdlQ29tcG9uZW50SUQgfHwgaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEuY29tcElEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHJlcXVlc3RlZCBwcm9wZXJ0eSBmb3IgdGhlIGNvbXBvbmVudCBpZiBpdCBleGlzdHMuXG4gICAqIE90aGVyd2lzZSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IHdob3NlIHByb3BlcnR5IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICogQHBhcmFtIGluUHJvcCBUaGUgcHJvcGVydHkgYmVpbmcgcmVxdWVzdGVkLlxuICAgKi9cbiAgcHVibGljIGdldENvbXBvbmVudFByb3AoaW5Db21wOiBhbnkgPSBudWxsLCBpblByb3AgPSAnJykge1xuICAgIGlmIChpbkNvbXAgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogZ2V0Q29tcG9uZW50UHJvcCBjYWxsZWQgd2l0aCBiYWQgY29tcG9uZW50OiAke2luQ29tcH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wSUQgPSBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YS5jb21wSUQ7XG5cbiAgICAvLyBMb29rIHVwIHByb3BlcnR5IGluIHRoZSBjb21wb25lbnQncyBlbnRyeSBpbiBjb21wb25lbnRQcm9wQXJyYXkgKHdoaWNoIHNob3VsZCBoYXZlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSlcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRQcm9wc0Fycltjb21wSURdW2luUHJvcF07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgY29tcGxldGUgc2V0IG9mIHJlc29sdmVkIHByb3BlcnRpZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoXG4gICAqIHRoaXMgY29tcG9uZW50LlxuICAgKiBUaGlzIGlzIHRoZSBmdWxsIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIHRyYWNrZWQgaW4gUmVkdXggZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGdldEN1cnJlbnRDb21wbGV0ZVByb3BzKGluQ29tcDogYW55ID0gbnVsbCkge1xuICAgIGlmIChpbkNvbXAgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogZ2V0Q3VycmVudENvbXBsZXRlUHJvcHMgY2FsbGVkIHdpdGggYmFkIGNvbXBvbmVudDogJHtpbkNvbXB9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFByb3BzQXJyW2luQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhLmNvbXBJRF07XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBjb21wb25lbnQgYW5kIGl0cyBjYWxsYmFjayBmdW5jdGlvbi4gV2hlbiBhIGNvbXBvbmVudCBjYWxscyB0aGlzIG1ldGhvZFxuICAgKiAodHlwaWNhbGx5IGZyb20gaXRzIG5nT25Jbml0KSwgdGhlIGNvbXBvbmVudCBpcyBnaXZlbiBhIHVuaXF1ZSBjb21wb25lbnRJRCAoZm9yIHRoaXMgc2Vzc2lvbilcbiAgICogYW5kIHN1YnNjcmliZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgc3RvcmUuIEFzIGEgc2lkZSBlZmZlY3QsIGl0IGFsc28gYXNzaWducyB0aGUgY29tcG9uZW50J3NcbiAgICogYWN0aW9ucyAoZnJvbSBpdHMgbWV0YWRhdGEpIHRvIHRoZSBjb21wb25lbnQncyBfX19hY3Rpb25zX19fIGFuZCBiaW5kcyB0aGUgY29tcG9uZW50J3MgY2FsbGJhY2tcbiAgICogKHBhc3NlZCBpbiBhcyBfX19pbkNhbGxiYWNrX19fKSB0byB0aGUgY29tcG9uZW50LiBJZiBhIHByb2JsZW0gaXMgZW5jb3VudGVyZWQsIGFuIGVtcHR5IG9iamVjdCxcbiAgICoge30sIGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0gaW5Db21wIFRoZSBjb21wb25lbnQgYmVpbmcgcmVnaXN0ZXJlZCBhbmQgc3Vic2NyaWJlZFxuICAgKiBAcGFyYW0gaW5DYWxsYmFjayBUaGUgY29tcG9uZW50J3MgY2FsbGJhY2sgZnVuY3Rpb24gKHR5cGljYWxseSBjYWxsZWQgb25TdGF0ZUNoYW5nZSkgdGhhdFxuICAgKiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RhdGUgY2hhbmdlcy5cbiAgICogQHJldHVybnMgQSBKU09OIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czpcbiAgICogY29tcElEOiB0aGUgdW5pcXVlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudCxcbiAgICogdW5zdWJzY3JpYmVGbjogdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gdW5zdWJzY3JpYmUgZnJvbSB0aGUgc3RvcmUsXG4gICAqIHZhbGlkYXRlTWVzc2FnZTogYW55IHZhbGlkYXRpb24vZXJyb3IgbWVzc2FnZSB0aGF0IGdldHMgZ2VuZXJhdGVkIGZvciB0aGlzIG9iamVjdCxcbiAgICogYWN0aW9uczogYW55IGFjdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCBmb3IgdGhpcyBvYmplY3RcbiAgICovXG4gIHJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KGluQ29tcCwgaW5DYWxsYmFjazogRnVuY3Rpb24gfCBudWxsID0gbnVsbCk6IEFuZ3VsYXJQQ29ubmVjdERhdGEge1xuICAgIC8vIENyZWF0ZSBhbiBpbml0aWFsIG9iamVjdCB0byBiZSByZXR1cm5lZC5cbiAgICBjb25zdCByZXR1cm5PYmplY3Q6IEFuZ3VsYXJQQ29ubmVjdERhdGEgPSB7XG4gICAgICBjb21wSUQ6ICcnLFxuICAgICAgdW5zdWJzY3JpYmVGbjogdW5kZWZpbmVkLFxuICAgICAgdmFsaWRhdGVNZXNzYWdlOiAnJyxcbiAgICAgIGFjdGlvbnM6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICBpZiAoaW5Db21wID09PSBudWxsIHx8IGluQ2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gcmVnaXN0ZXJBbmRTdWJzY3JpYmU6IGluQ29tcDogJHtpbkNvbXB9IGluQ2FsbGJhY2s6ICR7aW5DYWxsYmFja31gKTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcFR5cGUgPSBpbkNvbXAuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGlmIChBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLmJMb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhgcmVnaXN0ZXJBbmRTdWJzY3JpYmVDb21wb25lbnQ6ICR7Y29tcFR5cGV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHVuZGVmaW5lZCAhPT0gaW5Db21wLmJyaWRnZUNvbXBvbmVudElEKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBPTEQgU0NIT09MOiAke2NvbXBUeXBlfWApO1xuICAgIH1cblxuICAgIGlmICh1bmRlZmluZWQgPT09IGluQ29tcC5hY3Rpb25zICYmIHVuZGVmaW5lZCA9PT0gaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gcmVnaXN0ZXJBbmRTdWJzY3JpYmUgZnJvbSAke2NvbXBUeXBlfTogYWN0aW9ucyBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgKTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7XG4gICAgfVxuICAgIGlmICh1bmRlZmluZWQgPT09IGluQ29tcC5icmlkZ2VDb21wb25lbnRJRCAmJiB1bmRlZmluZWQgPT09IGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgQW5ndWxhclBDb25uZWN0OiBiYWQgY2FsbCB0byByZWdpc3RlckFuZFN1YnNjcmliZSBmcm9tICR7Y29tcFR5cGV9OiBicmlkZ2VDb21wb25lbnRJRCBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdDtcbiAgICB9XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gaW5Db21wLnVuc3Vic2NyaWJlU3RvcmUgJiYgdW5kZWZpbmVkID09PSBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gcmVnaXN0ZXJBbmRTdWJzY3JpYmUgZnJvbSAke2NvbXBUeXBlfTogdW5zdWJzY3JpYmVTdG9yZSBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdDtcbiAgICB9XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gaW5Db21wLnZhbGlkYXRlTWVzc2FnZSAmJiB1bmRlZmluZWQgPT09IGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIHJlZ2lzdGVyQW5kU3Vic2NyaWJlIGZyb20gJHtjb21wVHlwZX06IHZhbGlkYXRlTWVzc2FnZSBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgKTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gY2FsbCBwcm9jZXNzQWN0aW9ucyB0byBwb3B1bGF0ZSBtZXRhZGF0YSB3aXRoIGFjdGlvbnMgYXMgaW4gUENvbm5lY3RIT1IgaW5pdGlhbGl6ZVxuICAgIHRoaXMucHJvY2Vzc0FjdGlvbnMoaW5Db21wKTtcbiAgICBpZiAodW5kZWZpbmVkID09PSBpbkNvbXAuYWN0aW9ucykge1xuICAgICAgcmV0dXJuT2JqZWN0LmFjdGlvbnMgPSBpbkNvbXAucENvbm4kLmdldEFjdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5Db21wLmFjdGlvbnMgPSBpbkNvbXAucENvbm4kLmdldEFjdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvLyBiaW5kIHRoZSBwcm92aWRlZCBjYWxsYmFjayB0byB0aGUgY29tcG9uZW50IGl0J3MgYXNzb2NpYXRlZCB3aXRoXG4gICAgaW5DYWxsYmFjayA9IGluQ2FsbGJhY2suYmluZChpbkNvbXApO1xuXG4gICAgLy8gTm93IHByb2NlZWQgdG8gcmVnaXN0ZXIgYW5kIHN1YnNjcmliZS4uLlxuICAgIGNvbnN0IHRoZUNvbXBJRDogc3RyaW5nID0gdGhpcy5nZXROZXh0Q29tcG9uZW50SWQoKTtcbiAgICBjb25zdCB0aGVVbnN1YjogRnVuY3Rpb24gfCBudWxsID0gdGhpcy5zdWJzY3JpYmVUb1N0b3JlKGluQ29tcCwgaW5DYWxsYmFjayk7XG5cbiAgICBpZiAodW5kZWZpbmVkID09PSBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YSkge1xuICAgICAgaW5Db21wLmJyaWRnZUNvbXBvbmVudElEID0gdGhlQ29tcElEO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5PYmplY3QuY29tcElEID0gdGhlQ29tcElEO1xuICAgICAgcmV0dXJuT2JqZWN0LnVuc3Vic2NyaWJlRm4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlRm9ybUZpZWxkKGluQ29tcCk7XG4gICAgICAgIHRoZVVuc3ViKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgdGhpcyBjb21wb25lbnRzIGVudHJ5IGluIHRoZSBjb21wb25lbnRQcm9wc0FyclxuICAgIHRoaXMuY29tcG9uZW50UHJvcHNBcnJbdGhlQ29tcElEXSA9IHt9O1xuXG4gICAgdGhpcy5hZGRGb3JtRmllbGQoaW5Db21wKTtcblxuICAgIC8vIHJldHVybiBvYmplY3Qgd2l0aCBjb21wSUQgYW5kIHVuc3Vic2NyaWJlLi4uXG4gICAgcmV0dXJuIHJldHVybk9iamVjdDtcbiAgfVxuXG4gIGFkZEZvcm1GaWVsZChpbkNvbXApIHtcbiAgICBpbkNvbXAucENvbm4kPy5hZGRGb3JtRmllbGQoKTtcbiAgfVxuXG4gIHJlbW92ZUZvcm1GaWVsZChpbkNvbXApIHtcbiAgICBpZiAoaW5Db21wLnBDb25uJD8ucmVtb3ZlRm9ybUZpZWxkKSB7XG4gICAgICBpbkNvbXAucENvbm4kPy5yZW1vdmVGb3JtRmllbGQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCdzIGVudHJ5IGluIF9fX2NvbXBvbmVudFByb3BzQXJyX19fIGlzXG4gIC8vICB0aGUgc2FtZSBhcyB0aGUgaW5Db21wUHJvcHMgcGFzc2VkIGluLlxuICAvLyAgQXMgYSBzaWRlIGVmZmVjdCwgdXBkYXRlIHRoZSBjb21wb25lbnQncyBlbnRyeSBpbiBjb21wb25lbnRQcm9wc0FyclxuICAvLyAgTk9URTogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBpbmNvbWluZyBjb21wb25lbnQgaGFzIHRoZSBmb2xsb3dpbmc6XG4gIC8vICAqIGEgYnJpZGdlQ29tcG9uZW50SUQgPHN0cmluZz4gcHJvcGVydHkgLSB1c2VkIGFzIGxvb2t1cCBrZXkgaW4gY29tcG9uZW50UHJvcHNBcnJcbiAgLy8gICogYSBwQ29ubiQgPD8+IHByb3BlcnR5IC0gdXNlZCB0byBhY2Nlc3MgZnVuY3Rpb25zIGFjY2Vzc2VkIGluIGdldENvbXBvbmVudFByb3BzXG4gIC8vIFJldHVybiB0cnVlOiBtZWFucyB0aGUgY29tcG9uZW50IHByb3BzIGFyZSBkaWZmZXJlbnQgYW5kIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgKHJlLXJlbmRlcilcbiAgLy8gUmV0dXJuIGZhbHNlOiBtZWFucyB0aGUgY29tcG9uZW50IHByb3BzIGFyZSB0aGUgc2FtZSBhbmQgdGhlIGNvbXBvbmVudCBkb2Vzbid0IG5lZWQgdG8gdXBkYXRlIChyZS1yZW5kZXIpXG4gIC8vICBPbiBiYWQgaW5wdXQsIHJldHVybiBmYWxzZTtcbiAgLyoqXG4gICAqIFJldHVybnMgKip0cnVlKiogaWYgdGhlIGNvbXBvbmVudCdzIGVudHJ5IGluIF9fX2NvbXBvbmVudFByb3BzQXJyX19fIGlzXG4gICAqIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21wb25lbnQgKF9fX2luQ29tcF9fXykgcGFzc2VkIGluLlxuICAgKiBBcyBhIHNpZGUgZWZmZWN0LCB0aGUgY29tcG9uZW50J3MgZW50cnkgaW4gX19fY29tcG9uZW50UHJvcHNBcnJfX18gaXMgdXBkYXRlZC5cbiAgICogKipOb3RlKio6IEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgaW5jb21pbmcgY29tcG9uZW50IGhhcyB0aGUgZm9sbG93aW5nOlxuICAgKiAoYSkgYSBicmlkZ2VDb21wb25lbnRJRCBfc3RyaW5nXyBwcm9wZXJ0eSB1c2VkIGFzIGxvb2t1cCBrZXkgaW4gX19fY29tcG9uZW50UHJvcHNBcnJfX19cbiAgICogYW5kIChiKSBhIF9fX3BDb25uJF9fXyBwcm9wZXJ0eSB1c2VkIHRvIGFjY2VzcyBmdW5jdGlvbnMgY2FsbGVkIGluIF9fX2dldENvbXBvbmVudFByb3BzX19fXG4gICAqXG4gICAqIEBwYXJhbSBpbkNvbXAgVGhlIGNvbXBvbmVudCBhc2tpbmcgaWYgaXQgc2hvdWxkIHVwZGF0ZSBpdHNlbGZcbiAgICogQHJldHVybnMgUmV0dXJuICoqdHJ1ZSoqOiBtZWFucyB0aGUgY29tcG9uZW50IHByb3BzIGFyZSBkaWZmZXJlbnQgYW5kIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgKHJlLXJlbmRlcikuXG4gICAqIFJldHVybiAqKmZhbHNlKio6IG1lYW5zIHRoZSBjb21wb25lbnQgcHJvcHMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgY29tcG9uZW50IGRvZXNuJ3QgbmVlZCB0byB1cGRhdGUgKHJlLXJlbmRlcikuXG4gICAqIElmIHRoZSAqKippbkNvbXAqKiogaW5wdXQgaXMgYmFkLCBmYWxzZSBpcyBhbHNvIHJldHVybmVkLlxuICAgKi9cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKGluQ29tcCk6IGJvb2xlYW4ge1xuICAgIC8vIGNvbnN0IGJTaG93TG9nZ2luZyA9IGZhbHNlO1xuICAgIGxldCBiUmV0ID0gZmFsc2U7XG4gICAgLy8gY2hlY2sgZm9yIHJlYXNvbmFibGUgaW5wdXRcbiAgICBpZiAoVXRpbHMuaXNFbXB0eU9iamVjdChpbkNvbXApKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIHNob3VsZENvbXBvbmVudFVwZGF0ZTogaW5Db21wOiAke0pTT04uc3RyaW5naWZ5KGluQ29tcCl9YCk7XG4gICAgICByZXR1cm4gYlJldDtcbiAgICB9XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gaW5Db21wLnZhbGlkYXRlTWVzc2FnZSAmJiB1bmRlZmluZWQgPT09IGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIHNob3VsZENvbXBvbmVudFVwZGF0ZTogJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX0gZG9lcyBub3QgaGF2ZSBhIHZhbGlkYXRlTWVzc2FnZSBwcm9wZXJ0eS5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wSUQgPSB0aGlzLmdldENvbXBvbmVudElEKGluQ29tcCk7XG5cbiAgICBjb25zdCBjdXJyZW50UHJvcHM6IGFueSA9IHRoaXMuY29tcG9uZW50UHJvcHNBcnJbY29tcElEXTtcbiAgICBjb25zdCBjdXJyZW50UHJvcHNBc1N0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoY3VycmVudFByb3BzKTtcblxuICAgIGNvbnN0IGluY29taW5nUHJvcHM6IGFueSA9IHRoaXMuZ2V0Q29tcG9uZW50UHJvcHMoaW5Db21wKTtcblxuICAgIC8vIGlmIGhhdmUgcGFnZU1lc3NhZ2VzLCBhbmQgaXQgaXMgYmxhbmssIHJlbW92ZSBpdC4gIFRoaXMgY2F1c2VzIGlzc3VlcyBvZiBtYWtpbmcgaXQgYXBwZWFyXG4gICAgLy8gdGhhdCBhIHdpbGwgY2F1c2UgYW4gdXBkYXRlLCB3aGVuIHRoZXJlIGlzIG5vIGNoYW5nZVxuICAgIGlmICh0aGlzLmlzUGFnZU1lc3NhZ2VzRW1wdHkoaW5jb21pbmdQcm9wcykpIHtcbiAgICAgIGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhLnBhZ2VNZXNzYWdlcyA9IGluY29taW5nUHJvcHMucGFnZU1lc3NhZ2VzO1xuICAgICAgZGVsZXRlIGluY29taW5nUHJvcHMucGFnZU1lc3NhZ2VzO1xuICAgIH1cblxuICAgIGlmIChpbmNvbWluZ1Byb3BzLmh0dHBNZXNzYWdlcykge1xuICAgICAgaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEuaHR0cE1lc3NhZ2VzID0gaW5jb21pbmdQcm9wcy5odHRwTWVzc2FnZXM7XG4gICAgICBpbmNvbWluZ1Byb3BzLmh0dHBNZXNzYWdlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBpbmNvbWluZ1Byb3BzQXNTdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGluY29taW5nUHJvcHMpO1xuXG4gICAgYlJldCA9IGlzRXF1YWwgPyAhaXNFcXVhbChjdXJyZW50UHJvcHMsIGluY29taW5nUHJvcHMpIDogY3VycmVudFByb3BzQXNTdHIgIT0gaW5jb21pbmdQcm9wc0FzU3RyO1xuXG4gICAgLy8gQmVsb3cgcGllY2Ugb2YgY29kZSBpcyBuZWVkZWQgdG8gcmUtcmVuZGVyIHRoZSBjb21wb25lbnQgc2luY2Ugd2Ugd2FubmEgZXZhbHVhdGUgdGhlIFZpc2liaWxpdHkgZXhwcmVzc2lvbiB3aXRoaW4gVmlldyBjb21wb25lbnQgaW4gc3VjaCBjYXNlc1xuICAgIGlmIChpbkNvbXAucENvbm4kLm1ldGEuY29uZmlnLmNvbnRleHQ/Lmxlbmd0aCA+IDAgJiYgaW5Db21wLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCkubGVuZ3RoID4gJ2Nhc2VJbmZvLmNvbnRlbnQnLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTm93IHVwZGF0ZSB0aGUgZW50cnkgaW4gY29tcG9uZW50UHJvcHNBcnIgd2l0aCB0aGUgaW5jb21pbmcgdmFsdWUgc29cbiAgICAvLyAgd2UgY2FuIGNvbXBhcmUgYWdhaW5zdCB0aGF0IG5leHQgdGltZS4uLlxuICAgIHRoaXMuY29tcG9uZW50UHJvcHNBcnJbY29tcElEXSA9IGluY29taW5nUHJvcHM7XG4gICAgY29uc3QgdmFsaWRhdGVtZXNzYWdlID0gaW5jb21pbmdQcm9wcy52YWxpZGF0ZW1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcy51dGlscy5odG1sRGVjb2RlKGluY29taW5nUHJvcHMudmFsaWRhdGVtZXNzYWdlKTtcbiAgICAvLyBhbmQgdXBkYXRlIHRoZSBjb21wb25lbnQncyB2YWxpZGF0aW9uIG1lc3NhZ2UgKGlmIHVuZGVmaW5lZCwgaXQgc2hvdWxkIGJlIHNldCB0byBcIlwiKVxuICAgIGlmICh1bmRlZmluZWQgIT09IGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhKSB7XG4gICAgICBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YS52YWxpZGF0ZU1lc3NhZ2UgPSB2YWxpZGF0ZW1lc3NhZ2U7XG5cbiAgICAgIGlmIChpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YS52YWxpZGF0ZU1lc3NhZ2UgIT0gJycpIHtcbiAgICAgICAgLy8gaWYgaGF2ZSBhIHZhbGlkYXRlIG1lc3NhZ2UsIHR1cm4gb2ZmIHNwaW5uZXJcbiAgICAgICAgY29uc3QgdGltZXIgPSBpbnRlcnZhbCgxMDApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UoZmFsc2UpO1xuXG4gICAgICAgICAgdGltZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHNFcnJvck1lc3NhZ2UgPSBjdXJyZW50UHJvcHMgJiYgY3VycmVudFByb3BzLmxhYmVsID8gY3VycmVudFByb3BzLmxhYmVsLmNvbmNhdCgnIC0gJykgOiAnJztcbiAgICAgICAgc0Vycm9yTWVzc2FnZSA9IHNFcnJvck1lc3NhZ2UuY29uY2F0KGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhLnZhbGlkYXRlTWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZXJTZXJ2aWNlLnNlbmRNZXNzYWdlKCd1cGRhdGUnLCBzRXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5Db21wLnZhbGlkYXRlTWVzc2FnZSA9IHZhbGlkYXRlbWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoYlJldCAmJiBjb21wSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYlJldCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCBgQW5ndWxhclBDb25uZWN0IGNvbXBvbmVudCAke2NvbXBJRH0gLSAke2luQ29tcC5jb25zdHJ1Y3Rvci5uYW1lfSAtIHNob3VsZENvbXBvbmVudFVwZGF0ZTogJHtiUmV0fWApO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiY3VycmVudCBwcm9wczogXCIgKyBjdXJyZW50UHJvcHNBc1N0cik7XG5cbiAgICBpZiAoYlJldCkge1xuICAgICAgLy8gY29uc29sZS5sb2coYCoqKiogY2hhbmdlIGZvcjogJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiY3VycmVudCBwcm9wczogXCIgKyBjdXJyZW50UHJvcHNBc1N0cik7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcImluY29taW5nIHByb3BzOiBcIiArIGluY29taW5nUHJvcHNBc1N0cik7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgICAgICR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9OiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuaW5nOiAke2JSZXR9LCBjb21wSWQ6ICR7Y29tcElEfWAgKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCBgICAgIFVwZGF0aW5nIHdpdGggY29tcG9uZW50UHJvcHMgZm9yICR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29tcG9uZW50UHJvcHNBcnJbY29tcElEXSl9YCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyggYCAgICAgICAgICBhbmQgdmFsaWRhdGVNZXNzYWdlOiAke2luQ29tcC52YWxpZGF0ZU1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIC8vIGVsc2UgaWYgKGluQ29tcC5jb25zdHJ1Y3Rvci5uYW1lLmluZGV4T2YoXCJWaWV3XCIpID49IDAgfHwgaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUuaW5kZXhPZihcIlJvb3RcIikgPj0gMCkge1xuICAgIC8vICAgY29uc29sZS5sb2coXCJubyBjaGFuZ2VcIik7XG4gICAgLy8gICBjb25zb2xlLmxvZyhcImN1cnJlbnQgcHJvcHM6IFwiICsgY3VycmVudFByb3BzQXNTdHIpO1xuICAgIC8vICAgY29uc29sZS5sb2coXCJpbmNvbWluZyBwcm9wczogXCIgKyBpbmNvbWluZ1Byb3BzQXNTdHIpO1xuICAgIC8vICAgY29uc29sZS5sb2coYCAgICAke2luQ29tcC5jb25zdHJ1Y3Rvci5uYW1lfTogc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmluZzogJHtiUmV0fSwgY29tcElkOiAke2NvbXBJRH1gICk7XG5cbiAgICAvLyB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyhgICAgICR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9OiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuaW5nOiAke2JSZXR9YCk7XG5cbiAgICByZXR1cm4gYlJldDtcbiAgfVxuXG4gIGlzUGFnZU1lc3NhZ2VzRW1wdHkoaW5jb21pbmdQcm9wcykge1xuICAgIHJldHVybiBpbmNvbWluZ1Byb3BzLnBhZ2VNZXNzYWdlcyAmJiBpbmNvbWluZ1Byb3BzLnBhZ2VNZXNzYWdlcy5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGVuY291bnRlcmVkIGEgY2hhbmdlIGV2ZW50XG4gICAqIEBwYXJhbSBpbkNvbXAgVGhlIGNvbXBvbmVudCBjYWxsaW5nIHRoZSBjaGFuZ2UgZXZlbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudFxuICAgKi9cbiAgY2hhbmdlSGFuZGxlcihpbkNvbXAsIGV2ZW50KSB7XG4gICAgY29uc3QgYkxvZ2dpbmcgPSBmYWxzZTtcbiAgICBpZiAoYkxvZ2dpbmcpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBBbmd1bGFyUENvbm5lY3QuY2hhbmdlSGFuZGxlcmApO1xuICAgIH1cbiAgICAvLyBjaGVjayBmb3IgcmVhc29uYWJsZSBpbnB1dFxuICAgIGlmICh1bmRlZmluZWQgPT09IGluQ29tcCB8fCBVdGlscy5pc0VtcHR5T2JqZWN0KGluQ29tcCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gY2hhbmdlSGFuZGxlcjogaW5Db21wOiAke0pTT04uc3RyaW5naWZ5KGluQ29tcCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcENvbm5lY3QgPSBpbkNvbXAucENvbm4kO1xuICAgIGlmICh1bmRlZmluZWQgPT09IHBDb25uZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIGNoYW5nZUhhbmRsZXI6IGluQ29tcC5wQ29ubiQ6ICR7cENvbm5lY3R9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgb3V0IGVycm9yc1xuICAgIHRoaXMuZXJTZXJ2aWNlLnNlbmRNZXNzYWdlKCdkaXNtaXNzJywgJycpO1xuXG4gICAgcENvbm5lY3QuZ2V0QWN0aW9uc0FwaSgpLmNoYW5nZUhhbmRsZXIocENvbm5lY3QsIGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW4gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgZW5jb3VudGVyZWQgYW4gZXZlbnQgKHN1Y2ggYXMgYmx1cilcbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IGNhbGxpbmcgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnRcbiAgICovXG4gIGV2ZW50SGFuZGxlcihpbkNvbXAsIGV2ZW50KSB7XG4gICAgY29uc3QgYkxvZ2dpbmcgPSBmYWxzZTtcbiAgICBpZiAoYkxvZ2dpbmcpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBBbmd1bGFyUENvbm5lY3QuZXZlbnRIYW5kbGVyYCk7XG4gICAgfVxuICAgIC8vIGNoZWNrIGZvciByZWFzb25hYmxlIGlucHV0XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gaW5Db21wIHx8IFV0aWxzLmlzRW1wdHlPYmplY3QoaW5Db21wKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgQW5ndWxhclBDb25uZWN0OiBiYWQgY2FsbCB0byBldmVudEhhbmRsZXI6IGluQ29tcDogJHtKU09OLnN0cmluZ2lmeShpbkNvbXApfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBDb25uZWN0ID0gaW5Db21wLnBDb25uJDtcbiAgICBpZiAodW5kZWZpbmVkID09PSBwQ29ubmVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgQW5ndWxhclBDb25uZWN0OiBiYWQgY2FsbCB0byBldmVudEhhbmRsZXI6IGluQ29tcC5wQ29ubiQ6ICR7cENvbm5lY3R9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcENvbm5lY3QuZ2V0QWN0aW9uc0FwaSgpLmV2ZW50SGFuZGxlcihwQ29ubmVjdCwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEEgaGFuZGxlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHN0b3JlXG4gICAqL1xuICBnZXRTdG9yZSgpIHtcbiAgICBpZiAodGhpcy50aGVTdG9yZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy50aGVTdG9yZSA9IFBDb3JlLmdldFN0b3JlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRoZVN0b3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBiTG9nTXNnIElmIHRydWUsIHdpbGwgd3JpdGUgdGhlIHN0cmluZ2lmaWVkIHN0YXRlIHRvIHRoZSBzdG9yZSBmb3IgZGVidWdnaW5nL2luc3BlY3Rpb25cbiAgICogQHBhcmFtIGluQ29tcCBJZiBzdXBwbGllZCwgdGhlIGNvbXBvbmVudCB0aGF0IGlzIHJlcXVlc3RpbmcgdGhlIHN0b3JlJ3Mgc3RhdGVcbiAgICogQHJldHVybnMgQSBoYW5kbGUgdG8gdGhlIF9fc3RhdGVfXyBvZiBhcHBsaWNhdGlvbidzIHN0b3JlXG4gICAqL1xuICBnZXRTdGF0ZShiTG9nTXNnOiBib29sZWFuID0gZmFsc2UsIGluQ29tcDogYW55ID0gbnVsbCkge1xuICAgIGNvbnN0IHRoZVN0YXRlOiBvYmplY3QgPSB0aGlzLmdldFN0b3JlKCkuZ2V0U3RhdGUoKTtcbiAgICBpZiAoYkxvZ01zZykge1xuICAgICAgY29uc3QgdGhlQ29tcE5hbWU6IHN0cmluZyA9IGluQ29tcCA/IGAke2luQ29tcC5jb25zdHJ1Y3Rvci5uYW1lfTogYCA6ICcnO1xuICAgICAgY29uc29sZS5sb2coYCR7dGhlQ29tcE5hbWV9IFN0b3JlIHN0YXRlOiAke0pTT04uc3RyaW5naWZ5KHRoZVN0YXRlKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoZVN0YXRlO1xuICB9XG5cbiAgLy8gcHJvY2Vzc0FjdGlvbnMgLSBjYXJyaWVkIG92ZXIgZnJvbSBQQ29ubmVjdEhPQyBpbml0aWFsaXplXG4gIC8qKlxuICAgKiAgcHJvY2Vzc0FjdGlvbnMgZXhwb3NlcyBhbGwgYWN0aW9ucyBpbiB0aGUgbWV0YWRhdGEuXG4gICAqICBBdHRhY2hlcyBjb21tb24gaGFuZGxlciAoZXZlbnRIYW5kbGVyKSBmb3IgYWxsIGFjdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NBY3Rpb25zKGluQ29tcCkge1xuICAgIGNvbnN0IHBDb25uZWN0ID0gaW5Db21wLnBDb25uJDtcbiAgICBpZiAodW5kZWZpbmVkID09PSBwQ29ubmVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgQW5ndWxhclBDb25uZWN0OiBiYWQgY2FsbCB0byBwcm9jZXNzQWN0aW9uczogcENvbm4kOiAke3BDb25uZWN0fSBmcm9tIGNvbXBvbmVudDogJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5Db21wLnBDb25uJC5pc0VkaXRhYmxlKCkpIHtcbiAgICAgIGluQ29tcC5wQ29ubiQuc2V0QWN0aW9uKCdvbkNoYW5nZScsIHRoaXMuY2hhbmdlSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgIGluQ29tcC5wQ29ubiQuc2V0QWN0aW9uKCdvbkJsdXInLCB0aGlzLmV2ZW50SGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,107 +0,0 @@
1
- import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { getComponentFromMap } from '../helpers/sdk_component_map';
4
- import { ErrorBoundaryComponent } from '../../_components/infra/error-boundary/error-boundary.component';
5
- import * as i0 from "@angular/core";
6
- const componentsRequireDisplayOnlyFAProp = ['HybridViewContainer', 'ModalViewContainer', 'ViewContainer', 'RootContainer', 'View'];
7
- export class ComponentMapperComponent {
8
- constructor() {
9
- this.isInitialized = false;
10
- this.name = '';
11
- this.errorMsg = '';
12
- }
13
- ngOnInit() {
14
- this.loadComponent();
15
- this.isInitialized = true;
16
- }
17
- ngOnChanges(changes) {
18
- const { name } = changes;
19
- if (name) {
20
- const { previousValue, currentValue } = name;
21
- if (previousValue && previousValue !== currentValue) {
22
- this.loadComponent();
23
- }
24
- }
25
- else if (this.isInitialized) {
26
- this.bindInputProps();
27
- }
28
- }
29
- loadComponent() {
30
- const component = getComponentFromMap(this.name);
31
- if (this.dynamicComponent) {
32
- this.dynamicComponent.clear();
33
- this.componentRef = this.dynamicComponent.createComponent(component);
34
- if (component === ErrorBoundaryComponent) {
35
- this.componentRef.instance.message = this.errorMsg;
36
- }
37
- else {
38
- this.bindInputProps();
39
- this.bindOutputEvents();
40
- }
41
- }
42
- }
43
- bindInputProps() {
44
- try {
45
- if (this.props) {
46
- const propsKeys = Object.keys(this.props);
47
- const propsValues = Object.values(this.props);
48
- for (let i = 0; i < propsKeys.length; i++) {
49
- if (propsValues[i] !== undefined) {
50
- // We'll set 'displayOnlyFA$' prop only to the components which really need it
51
- // Eventual plan is to get rid of this particular prop
52
- if (propsKeys[i] === 'displayOnlyFA$' && !componentsRequireDisplayOnlyFAProp.includes(this.name)) {
53
- // eslint-disable-next-line no-continue
54
- continue;
55
- }
56
- this.componentRef?.setInput(propsKeys[i], propsValues[i]);
57
- }
58
- }
59
- }
60
- }
61
- catch (e) {
62
- console.log(e);
63
- }
64
- }
65
- bindOutputEvents() {
66
- try {
67
- if (this.outputEvents) {
68
- const propsKeys = Object.keys(this.outputEvents);
69
- const propsValues = Object.values(this.outputEvents);
70
- for (let i = 0; i < propsKeys.length; i++) {
71
- this.componentRef?.instance[propsKeys[i]].subscribe(value => {
72
- const callbackFn = propsValues[i].bind(this.parent);
73
- callbackFn(value);
74
- });
75
- }
76
- }
77
- }
78
- catch (e) {
79
- console.log(e);
80
- }
81
- }
82
- ngOnDestroy() {
83
- if (this.componentRef) {
84
- this.componentRef.destroy();
85
- }
86
- }
87
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComponentMapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
88
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ComponentMapperComponent, isStandalone: true, selector: "component-mapper", inputs: { name: "name", props: "props", errorMsg: "errorMsg", outputEvents: "outputEvents", parent: "parent" }, viewQueries: [{ propertyName: "dynamicComponent", first: true, predicate: ["dynamicComponent"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container #dynamicComponent></ng-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
89
- }
90
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComponentMapperComponent, decorators: [{
91
- type: Component,
92
- args: [{ selector: 'component-mapper', standalone: true, imports: [CommonModule], template: "<ng-container #dynamicComponent></ng-container>\n" }]
93
- }], propDecorators: { dynamicComponent: [{
94
- type: ViewChild,
95
- args: ['dynamicComponent', { read: ViewContainerRef, static: true }]
96
- }], name: [{
97
- type: Input
98
- }], props: [{
99
- type: Input
100
- }], errorMsg: [{
101
- type: Input
102
- }], outputEvents: [{
103
- type: Input
104
- }], parent: [{
105
- type: Input
106
- }] } });
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LW1hcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2JyaWRnZS9jb21wb25lbnQtbWFwcGVyL2NvbXBvbmVudC1tYXBwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci1zZGstY29tcG9uZW50cy9zcmMvbGliL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWdCLEtBQUssRUFBK0MsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQzs7QUFFekcsTUFBTSxrQ0FBa0MsR0FBYSxDQUFDLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFTN0ksTUFBTSxPQUFPLHdCQUF3QjtJQVByQztRQVlTLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRXBCLFNBQUksR0FBRyxFQUFFLENBQUM7UUFFVixhQUFRLEdBQUcsRUFBRSxDQUFDO0tBa0Z4QjtJQTdFQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUN6QixJ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QzFELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNwRCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BCLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7K0dBMUZVLHdCQUF3QjttR0FBeEIsd0JBQXdCLDZSQUNJLGdCQUFnQixnRUNmekQsbURBQ0EseUREV1ksWUFBWTs7NEZBRVgsd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNFLGtCQUFrQixjQUdoQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7OEJBSWhCLGdCQUFnQjtzQkFEdEIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU05RCxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGdldENvbXBvbmVudEZyb21NYXAgfSBmcm9tICcuLi9oZWxwZXJzL3Nka19jb21wb25lbnRfbWFwJztcbmltcG9ydCB7IEVycm9yQm91bmRhcnlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9fY29tcG9uZW50cy9pbmZyYS9lcnJvci1ib3VuZGFyeS9lcnJvci1ib3VuZGFyeS5jb21wb25lbnQnO1xuXG5jb25zdCBjb21wb25lbnRzUmVxdWlyZURpc3BsYXlPbmx5RkFQcm9wOiBzdHJpbmdbXSA9IFsnSHlicmlkVmlld0NvbnRhaW5lcicsICdNb2RhbFZpZXdDb250YWluZXInLCAnVmlld0NvbnRhaW5lcicsICdSb290Q29udGFpbmVyJywgJ1ZpZXcnXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29tcG9uZW50LW1hcHBlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LW1hcHBlci5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRNYXBwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbXBvbmVudCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIHB1YmxpYyBkeW5hbWljQ29tcG9uZW50OiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG5hbWUgPSAnJztcbiAgQElucHV0KCkgcHJvcHM6IGFueTtcbiAgQElucHV0KCkgZXJyb3JNc2cgPSAnJztcbiAgQElucHV0KCkgb3V0cHV0RXZlbnRzOiBhbnk7XG4gIC8vIHBhcmVudCBwcm9wIGlzIGNvbXB1bHNvcnkgd2hlbiBvdXRwdXRFdmVudHMgaXMgcHJlc2VudFxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gY2hhbmdlcztcbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgeyBwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUgfSA9IG5hbWU7XG4gICAgICBpZiAocHJldmlvdXNWYWx1ZSAmJiBwcmV2aW91c1ZhbHVlICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuYmluZElucHV0UHJvcHMoKTtcbiAgICB9XG4gIH1cblxuICBsb2FkQ29tcG9uZW50KCkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGdldENvbXBvbmVudEZyb21NYXAodGhpcy5uYW1lKTtcblxuICAgIGlmICh0aGlzLmR5bmFtaWNDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudC5jbGVhcigpO1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgPT09IEVycm9yQm91bmRhcnlDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UubWVzc2FnZSA9IHRoaXMuZXJyb3JNc2c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRJbnB1dFByb3BzKCk7XG4gICAgICAgIHRoaXMuYmluZE91dHB1dEV2ZW50cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJpbmRJbnB1dFByb3BzKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5wcm9wcykge1xuICAgICAgICBjb25zdCBwcm9wc0tleXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BzKTtcbiAgICAgICAgY29uc3QgcHJvcHNWYWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMucHJvcHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChwcm9wc1ZhbHVlc1tpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBXZSdsbCBzZXQgJ2Rpc3BsYXlPbmx5RkEkJyBwcm9wIG9ubHkgdG8gdGhlIGNvbXBvbmVudHMgd2hpY2ggcmVhbGx5IG5lZWQgaXRcbiAgICAgICAgICAgIC8vIEV2ZW50dWFsIHBsYW4gaXMgdG8gZ2V0IHJpZCBvZiB0aGlzIHBhcnRpY3VsYXIgcHJvcFxuICAgICAgICAgICAgaWYgKHByb3BzS2V5c1tpXSA9PT0gJ2Rpc3BsYXlPbmx5RkEkJyAmJiAhY29tcG9uZW50c1JlcXVpcmVEaXNwbGF5T25seUZBUHJvcC5pbmNsdWRlcyh0aGlzLm5hbWUpKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5zZXRJbnB1dChwcm9wc0tleXNbaV0sIHByb3BzVmFsdWVzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9XG4gIH1cblxuICBiaW5kT3V0cHV0RXZlbnRzKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5vdXRwdXRFdmVudHMpIHtcbiAgICAgICAgY29uc3QgcHJvcHNLZXlzID0gT2JqZWN0LmtleXModGhpcy5vdXRwdXRFdmVudHMpO1xuICAgICAgICBjb25zdCBwcm9wc1ZhbHVlczogYW55ID0gT2JqZWN0LnZhbHVlcyh0aGlzLm91dHB1dEV2ZW50cyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/Lmluc3RhbmNlW3Byb3BzS2V5c1tpXV0uc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrRm4gPSBwcm9wc1ZhbHVlc1tpXS5iaW5kKHRoaXMucGFyZW50KTtcbiAgICAgICAgICAgIGNhbGxiYWNrRm4odmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICNkeW5hbWljQ29tcG9uZW50PjwvbmctY29udGFpbmVyPlxuIl19