@pega/angular-sdk-components 24.2.10 → 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 (305) hide show
  1. package/fesm2022/pega-angular-sdk-components.mjs +5383 -3962
  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/banner/banner.component.d.ts +0 -1
  7. package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -1
  8. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
  9. package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +1 -0
  10. package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -3
  11. package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +0 -1
  12. package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +1 -0
  13. package/lib/_components/field/auto-complete/auto-complete.component.d.ts +14 -38
  14. package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +7 -6
  15. package/lib/_components/field/check-box/check-box.component.d.ts +10 -33
  16. package/lib/_components/field/currency/currency.component.d.ts +19 -35
  17. package/lib/_components/field/date/date.component.d.ts +7 -58
  18. package/lib/_components/field/date-time/date-time.component.d.ts +12 -40
  19. package/lib/_components/field/decimal/decimal.component.d.ts +17 -32
  20. package/lib/_components/field/dropdown/dropdown.component.d.ts +14 -38
  21. package/lib/_components/field/email/email.component.d.ts +7 -35
  22. package/lib/_components/field/field.base.d.ts +57 -0
  23. package/lib/_components/field/group/group.component.d.ts +5 -3
  24. package/lib/_components/field/integer/integer.component.d.ts +8 -35
  25. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -2
  26. package/lib/_components/field/location/location.component.d.ts +47 -0
  27. package/lib/_components/field/multiselect/multiselect.component.d.ts +7 -39
  28. package/lib/_components/field/object-reference/object-reference.component.d.ts +45 -0
  29. package/lib/_components/field/percentage/percentage.component.d.ts +19 -37
  30. package/lib/_components/field/phone/phone.component.d.ts +8 -38
  31. package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +13 -34
  32. package/lib/_components/field/rich-text/rich-text.component.d.ts +7 -31
  33. package/lib/_components/field/scalar-list/scalar-list.component.d.ts +6 -22
  34. package/lib/_components/field/selectable-card/selectable-card.component.d.ts +62 -0
  35. package/lib/_components/field/semantic-link/semantic-link.component.d.ts +21 -1
  36. package/lib/_components/field/text/text.component.d.ts +0 -1
  37. package/lib/_components/field/text-area/text-area.component.d.ts +7 -35
  38. package/lib/_components/field/text-content/text-content.component.d.ts +0 -1
  39. package/lib/_components/field/text-input/text-input.component.d.ts +7 -36
  40. package/lib/_components/field/time/time.component.d.ts +7 -36
  41. package/lib/_components/field/url/url.component.d.ts +7 -36
  42. package/lib/_components/field/user-reference/user-reference.component.d.ts +1 -2
  43. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +1 -2
  44. package/lib/_components/infra/Containers/flow-container/helpers.d.ts +1 -0
  45. package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -1
  46. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +5 -10
  47. package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -1
  48. package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -1
  49. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
  50. package/lib/_components/infra/assignment/assignment.component.d.ts +8 -6
  51. package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +3 -3
  52. package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -1
  53. package/lib/_components/infra/defer-load/defer-load.component.d.ts +7 -7
  54. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
  55. package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -1
  56. package/lib/_components/infra/navbar/navbar.component.d.ts +0 -2
  57. package/lib/_components/infra/reference/reference.component.d.ts +23 -3
  58. package/lib/_components/infra/region/region.component.d.ts +0 -1
  59. package/lib/_components/infra/root-container/root-container.component.d.ts +3 -2
  60. package/lib/_components/infra/stages/stages.component.d.ts +2 -2
  61. package/lib/_components/infra/view/view.component.d.ts +0 -1
  62. package/lib/_components/template/advanced-search/advanced-search.component.d.ts +21 -0
  63. package/lib/_components/template/advanced-search/search-group/persist-utils.d.ts +23 -0
  64. package/lib/_components/template/advanced-search/search-groups/search-groups.component.d.ts +47 -0
  65. package/lib/_components/template/advanced-search/search-groups/utils.d.ts +15 -0
  66. package/lib/_components/template/app-shell/app-shell.component.d.ts +6 -3
  67. package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -1
  68. package/lib/_components/template/base/details-template-base.d.ts +1 -2
  69. package/lib/_components/template/base/form-template-base.d.ts +3 -1
  70. package/lib/_components/template/case-summary/case-summary.component.d.ts +3 -3
  71. package/lib/_components/template/case-view/case-view.component.d.ts +0 -2
  72. package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -1
  73. package/lib/_components/template/data-reference/data-reference.component.d.ts +27 -3
  74. package/lib/_components/template/data-reference/search-form/search-form.component.d.ts +39 -0
  75. package/lib/_components/template/data-reference/search-form/tabsData.d.ts +2 -0
  76. package/lib/_components/template/data-reference/utils.d.ts +14 -0
  77. package/lib/_components/template/default-form/default-form.component.d.ts +9 -4
  78. package/lib/_components/template/default-page/default-page.component.d.ts +29 -0
  79. package/lib/_components/template/details/details.component.d.ts +0 -1
  80. package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +0 -1
  81. package/lib/_components/template/details-one-column/details-one-column.component.d.ts +0 -1
  82. package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +0 -1
  83. package/lib/_components/template/details-three-column/details-three-column.component.d.ts +0 -1
  84. package/lib/_components/template/details-two-column/details-two-column.component.d.ts +0 -1
  85. package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +0 -1
  86. package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +0 -1
  87. package/lib/_components/template/field-group-template/field-group-template.component.d.ts +9 -8
  88. package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -1
  89. package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -1
  90. package/lib/_components/template/list-page/list-page.component.d.ts +0 -1
  91. package/lib/_components/template/list-view/list-view.component.d.ts +22 -7
  92. package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -1
  93. package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -1
  94. package/lib/_components/template/object-page/object-page.component.d.ts +8 -0
  95. package/lib/_components/template/one-column/one-column.component.d.ts +0 -1
  96. package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -1
  97. package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -1
  98. package/lib/_components/template/page/page.component.d.ts +0 -1
  99. package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -1
  100. package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -1
  101. package/lib/_components/template/self-service-case-view/self-service-case-view.component.d.ts +58 -0
  102. package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -1
  103. package/lib/_components/template/simple-table-manual/helpers.d.ts +18 -3
  104. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +9 -4
  105. package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -1
  106. package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +18 -3
  107. package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -1
  108. package/lib/_components/template/three-column/three-column.component.d.ts +0 -1
  109. package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -1
  110. package/lib/_components/template/two-column/two-column.component.d.ts +0 -1
  111. package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -1
  112. package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -1
  113. package/lib/_components/template/utils.d.ts +11 -0
  114. package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +0 -1
  115. package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +0 -1
  116. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +3 -6
  117. package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -1
  118. package/lib/_components/widget/attachment/Attachment.types.d.ts +87 -0
  119. package/lib/_components/widget/attachment/AttachmentUtils.d.ts +17 -0
  120. package/lib/_components/widget/attachment/attachment.component.d.ts +18 -34
  121. package/lib/_components/widget/case-history/case-history.component.d.ts +0 -1
  122. package/lib/_components/widget/feed-container/feed-container.component.d.ts +2 -3
  123. package/lib/_components/widget/file-utility/file-utility.component.d.ts +3 -2
  124. package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -1
  125. package/lib/_components/widget/todo/todo.component.d.ts +5 -4
  126. package/lib/_components/widget/utility/utility.component.d.ts +0 -1
  127. package/lib/_helpers/field-group-utils.d.ts +1 -3
  128. package/lib/_helpers/filter-utils.d.ts +1 -3
  129. package/lib/_helpers/formatters/boolean.d.ts +1 -2
  130. package/lib/_helpers/formatters/common.d.ts +1 -1
  131. package/lib/_helpers/formatters/currency.d.ts +1 -2
  132. package/lib/_helpers/formatters/date.d.ts +1 -2
  133. package/lib/_helpers/formatters/index.d.ts +1 -2
  134. package/lib/_helpers/object-utils.d.ts +8 -0
  135. package/lib/_helpers/objectReference-utils.d.ts +6 -0
  136. package/lib/_helpers/semanticLink-utils.d.ts +9 -0
  137. package/lib/_helpers/tab-utils.d.ts +4 -0
  138. package/lib/_helpers/utils.d.ts +13 -1
  139. package/lib/_services/banner.service.d.ts +8 -0
  140. package/lib/_services/case.service.d.ts +1 -1
  141. package/lib/_services/data-reference-advanced-search.service.d.ts +9 -0
  142. package/lib/_services/datapage.service.d.ts +1 -1
  143. package/lib/_services/google-maps-loader.service.d.ts +7 -0
  144. package/package.json +20 -6
  145. package/public-api.d.ts +26 -9
  146. package/esm2022/lib/_bridge/angular-pconnect.mjs +0 -428
  147. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +0 -107
  148. package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +0 -239
  149. package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +0 -142
  150. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +0 -50
  151. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +0 -29
  152. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +0 -31
  153. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +0 -51
  154. package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +0 -31
  155. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +0 -83
  156. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +0 -37
  157. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +0 -34
  158. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +0 -36
  159. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +0 -25
  160. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +0 -28
  161. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +0 -42
  162. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +0 -143
  163. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +0 -33
  164. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +0 -93
  165. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +0 -18
  166. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +0 -288
  167. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +0 -96
  168. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +0 -225
  169. package/esm2022/lib/_components/field/currency/currency.component.mjs +0 -190
  170. package/esm2022/lib/_components/field/date/date.component.mjs +0 -205
  171. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +0 -183
  172. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +0 -187
  173. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +0 -292
  174. package/esm2022/lib/_components/field/email/email.component.mjs +0 -157
  175. package/esm2022/lib/_components/field/group/group.component.mjs +0 -64
  176. package/esm2022/lib/_components/field/integer/integer.component.mjs +0 -160
  177. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +0 -44
  178. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +0 -314
  179. package/esm2022/lib/_components/field/multiselect/utils.mjs +0 -187
  180. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +0 -182
  181. package/esm2022/lib/_components/field/phone/phone.component.mjs +0 -160
  182. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +0 -182
  183. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +0 -102
  184. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +0 -95
  185. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +0 -57
  186. package/esm2022/lib/_components/field/text/text.component.mjs +0 -140
  187. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +0 -157
  188. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +0 -69
  189. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +0 -157
  190. package/esm2022/lib/_components/field/time/time.component.mjs +0 -162
  191. package/esm2022/lib/_components/field/url/url.component.mjs +0 -157
  192. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +0 -207
  193. package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +0 -18
  194. package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +0 -71
  195. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +0 -490
  196. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +0 -68
  197. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +0 -24
  198. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +0 -342
  199. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +0 -32
  200. package/esm2022/lib/_components/infra/Containers/view-container/helper.mjs +0 -22
  201. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +0 -211
  202. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +0 -31
  203. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +0 -382
  204. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +0 -47
  205. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +0 -87
  206. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +0 -141
  207. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +0 -18
  208. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +0 -80
  209. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +0 -136
  210. package/esm2022/lib/_components/infra/reference/reference.component.mjs +0 -133
  211. package/esm2022/lib/_components/infra/region/region.component.mjs +0 -33
  212. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +0 -228
  213. package/esm2022/lib/_components/infra/stages/stages.component.mjs +0 -62
  214. package/esm2022/lib/_components/infra/view/view.component.mjs +0 -188
  215. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +0 -156
  216. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +0 -43
  217. package/esm2022/lib/_components/template/base/details-template-base.mjs +0 -56
  218. package/esm2022/lib/_components/template/base/form-template-base.mjs +0 -13
  219. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +0 -101
  220. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +0 -185
  221. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +0 -68
  222. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +0 -242
  223. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +0 -49
  224. package/esm2022/lib/_components/template/details/details.component.mjs +0 -76
  225. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +0 -45
  226. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +0 -42
  227. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +0 -39
  228. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +0 -51
  229. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +0 -48
  230. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +0 -48
  231. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +0 -65
  232. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +0 -23
  233. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +0 -122
  234. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +0 -24
  235. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +0 -22
  236. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +0 -40
  237. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +0 -14
  238. package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +0 -208
  239. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +0 -1217
  240. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +0 -60
  241. package/esm2022/lib/_components/template/list-view/utils.mjs +0 -662
  242. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +0 -44
  243. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +0 -30
  244. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +0 -31
  245. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +0 -16
  246. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +0 -30
  247. package/esm2022/lib/_components/template/page/page.component.mjs +0 -52
  248. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +0 -149
  249. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +0 -138
  250. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +0 -104
  251. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +0 -270
  252. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +0 -779
  253. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +0 -129
  254. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +0 -16
  255. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +0 -67
  256. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +0 -31
  257. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +0 -16
  258. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +0 -31
  259. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +0 -40
  260. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +0 -30
  261. package/esm2022/lib/_components/template/utils.mjs +0 -22
  262. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +0 -31
  263. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +0 -53
  264. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +0 -137
  265. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +0 -24
  266. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +0 -393
  267. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +0 -80
  268. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +0 -521
  269. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +0 -638
  270. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +0 -57
  271. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +0 -75
  272. package/esm2022/lib/_components/widget/todo/todo.component.mjs +0 -228
  273. package/esm2022/lib/_components/widget/utility/utility.component.mjs +0 -34
  274. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +0 -28
  275. package/esm2022/lib/_helpers/case-utils.mjs +0 -71
  276. package/esm2022/lib/_helpers/common.mjs +0 -20
  277. package/esm2022/lib/_helpers/createstage-utils.mjs +0 -15
  278. package/esm2022/lib/_helpers/currency-utils.mjs +0 -57
  279. package/esm2022/lib/_helpers/date-format-utils.mjs +0 -68
  280. package/esm2022/lib/_helpers/event-util.mjs +0 -18
  281. package/esm2022/lib/_helpers/field-group-utils.mjs +0 -47
  282. package/esm2022/lib/_helpers/filter-utils.mjs +0 -105
  283. package/esm2022/lib/_helpers/formatters/boolean.mjs +0 -20
  284. package/esm2022/lib/_helpers/formatters/common.mjs +0 -14
  285. package/esm2022/lib/_helpers/formatters/currency-map.mjs +0 -903
  286. package/esm2022/lib/_helpers/formatters/currency.mjs +0 -68
  287. package/esm2022/lib/_helpers/formatters/date.mjs +0 -69
  288. package/esm2022/lib/_helpers/formatters/format-utils.mjs +0 -68
  289. package/esm2022/lib/_helpers/formatters/index.mjs +0 -124
  290. package/esm2022/lib/_helpers/instructions-utils.mjs +0 -36
  291. package/esm2022/lib/_helpers/tab-utils.mjs +0 -59
  292. package/esm2022/lib/_helpers/template-utils.mjs +0 -56
  293. package/esm2022/lib/_helpers/utils.mjs +0 -386
  294. package/esm2022/lib/_helpers/versionHelpers.mjs +0 -12
  295. package/esm2022/lib/_messages/error-messages.service.mjs +0 -31
  296. package/esm2022/lib/_messages/progress-spinner.service.mjs +0 -30
  297. package/esm2022/lib/_messages/update-worklist.service.mjs +0 -30
  298. package/esm2022/lib/_services/case.service.mjs +0 -32
  299. package/esm2022/lib/_services/datapage.service.mjs +0 -52
  300. package/esm2022/lib/_services/endpoints.mjs +0 -60
  301. package/esm2022/lib/_services/server-config.service.mjs +0 -52
  302. package/esm2022/lib/_types/PConnProps.interface.mjs +0 -2
  303. package/esm2022/pega-angular-sdk-components.mjs +0 -5
  304. package/esm2022/public-api.mjs +0 -141
  305. package/esm2022/sdk-local-component-map.mjs +0 -9
@@ -1,1217 +0,0 @@
1
- import { Component, Input, ViewChild, forwardRef } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { MatDatepickerModule } from '@angular/material/datepicker';
4
- import { MatOptionModule } from '@angular/material/core';
5
- import { MatSelectModule } from '@angular/material/select';
6
- import { MatCheckboxModule } from '@angular/material/checkbox';
7
- import { MatRadioModule } from '@angular/material/radio';
8
- import { MatIconModule } from '@angular/material/icon';
9
- import { MatMenuModule } from '@angular/material/menu';
10
- import { MatButtonModule } from '@angular/material/button';
11
- import { MatInputModule } from '@angular/material/input';
12
- import { MatFormFieldModule } from '@angular/material/form-field';
13
- import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
14
- import { MatSort, MatSortModule } from '@angular/material/sort';
15
- import { MatTableDataSource, MatTableModule } from '@angular/material/table';
16
- import { DragDropModule, moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
17
- import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
18
- import { getCurrencyOptions } from '../../../_helpers/currency-utils';
19
- import { getLocale, getSeconds } from '../../../_helpers/common';
20
- import { formatters } from '../../../_helpers/formatters/format-utils';
21
- import { init } from './listViewHelpers';
22
- import * as i0 from "@angular/core";
23
- import * as i1 from "../../../_messages/progress-spinner.service";
24
- import * as i2 from "../../../_helpers/utils";
25
- import * as i3 from "@angular/common";
26
- import * as i4 from "@angular/material/form-field";
27
- import * as i5 from "@angular/material/input";
28
- import * as i6 from "@angular/material/table";
29
- import * as i7 from "@angular/material/sort";
30
- import * as i8 from "@angular/cdk/drag-drop";
31
- import * as i9 from "@angular/material/button";
32
- import * as i10 from "@angular/material/menu";
33
- import * as i11 from "@angular/material/icon";
34
- import * as i12 from "@angular/material/radio";
35
- import * as i13 from "@angular/material/checkbox";
36
- import * as i14 from "@angular/material/paginator";
37
- import * as i15 from "@angular/material/select";
38
- import * as i16 from "@angular/material/core";
39
- import * as i17 from "@angular/material/datepicker";
40
- const SELECTION_MODE = { SINGLE: 'single', MULTI: 'multi' };
41
- export class Group {
42
- constructor() {
43
- this.level = 0;
44
- this.expanded = true;
45
- this.totalCounts = 0;
46
- }
47
- get visible() {
48
- return !this.parent || (this.parent.visible && this.parent.expanded);
49
- }
50
- }
51
- export class ListViewComponent {
52
- constructor(psService, utils) {
53
- this.psService = psService;
54
- this.utils = utils;
55
- this.bInForm$ = true;
56
- this.displayedColumns$ = Array();
57
- this.groupByColumns$ = [];
58
- this.repeatListData = [];
59
- this.bShowSearch$ = false;
60
- this.bColumnReorder$ = false;
61
- this.bGrouping$ = false;
62
- this.arrowSvgIcon$ = '';
63
- this.arrowDirection = 'down';
64
- this.filterByColumns = [];
65
- this.bShowFilterPopover$ = false;
66
- this.bContains$ = true;
67
- this.bDateTime$ = false;
68
- this.filterContainsLabel$ = '';
69
- this.filterContainsType$ = 'contains';
70
- this.bIsDate$ = false;
71
- this.bIsDateTime$ = false;
72
- this.bIsTime$ = false;
73
- this.arFilterMainButtons$ = [];
74
- this.arFilterSecondaryButtons$ = [];
75
- this.filters = {};
76
- this.selectParam = [];
77
- this.ref = {};
78
- this.listContext = {};
79
- this.query = null;
80
- this.xRayApis = PCore.getDebugger().getXRayRuntime();
81
- this.xRayUid = this.xRayApis.startXRay();
82
- this.label = '';
83
- }
84
- ngOnInit() {
85
- this.configProps$ = this.pConn$.getConfigProps();
86
- /** By default, pyGUID is used for Data classes and pyID is for Work classes as row-id/key */
87
- const defRowID = this.configProps$?.referenceType === 'Case' ? 'pyID' : 'pyGUID';
88
- /** If compositeKeys is defined, use dynamic value, else fallback to pyID or pyGUID. */
89
- this.compositeKeys = this.configProps$?.compositeKeys;
90
- this.rowID = this.compositeKeys && this.compositeKeys?.length === 1 ? this.compositeKeys[0] : defRowID;
91
- this.bShowSearch$ = this.utils.getBooleanValue(this.configProps$?.globalSearch ? this.configProps$.globalSearch : this.payload?.globalSearch);
92
- this.bColumnReorder$ = this.utils.getBooleanValue(this.configProps$.reorderFields);
93
- this.bGrouping$ = this.utils.getBooleanValue(this.configProps$.grouping);
94
- this.showDynamicFields = this.configProps$?.showDynamicFields;
95
- this.menuSvgIcon$ = this.utils.getImageSrc('more', this.utils.getSDKStaticContentUrl());
96
- this.arrowDownSvgIcon$ = this.utils.getImageSrc('arrow-down', this.utils.getSDKStaticContentUrl());
97
- this.arrowUpSvgIcon$ = this.utils.getImageSrc('arrow-up', this.utils.getSDKStaticContentUrl());
98
- this.filterSvgIcon$ = this.utils.getImageSrc('filter', this.utils.getSDKStaticContentUrl());
99
- this.filterOnSvgIcon$ = this.utils.getImageSrc('filter-on', this.utils.getSDKStaticContentUrl());
100
- this.groupBySvgIcon$ = this.utils.getImageSrc('row', this.utils.getSDKStaticContentUrl());
101
- this.selectionMode = this.configProps$.selectionMode;
102
- this.checkBoxValue = this.configProps$.value;
103
- this.arFilterMainButtons$.push({ actionID: 'submit', jsAction: 'submit', name: 'Submit' });
104
- this.arFilterSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: 'Cancel' });
105
- let title = this.configProps$?.title || this.configProps$?.label || 'List';
106
- const inheritedProps = this.configProps$?.inheritedProps;
107
- if (title === 'List' && inheritedProps) {
108
- for (const inheritedProp of inheritedProps) {
109
- if (inheritedProp?.prop === 'label') {
110
- title = inheritedProp?.value;
111
- break;
112
- }
113
- }
114
- }
115
- this.label = title;
116
- this.searchIcon$ = this.utils.getImageSrc('search', this.utils.getSDKStaticContentUrl());
117
- setTimeout(() => {
118
- PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.EVENT_DASHBOARD_FILTER_CHANGE, data => {
119
- this.processFilterChange(data);
120
- }, `dashboard-component-${'id'}`, false, this.pConn$.getContextName());
121
- PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.EVENT_DASHBOARD_FILTER_CLEAR_ALL, () => {
122
- this.filters = {};
123
- this.processFilterClear();
124
- }, `dashboard-component-${'id'}`, false, this.pConn$.getContextName());
125
- }, 0);
126
- if (this.configProps$) {
127
- if (!this.payload) {
128
- this.payload = { referenceList: this.configProps$.referenceList };
129
- }
130
- init({
131
- pConn$: this.pConn$,
132
- bInForm$: this.bInForm$,
133
- ...this.payload,
134
- listContext: this.listContext,
135
- ref: this.ref,
136
- showDynamicFields: this.showDynamicFields,
137
- xRayUid: this.xRayUid,
138
- cosmosTableRef: this.cosmosTableRef,
139
- selectionMode: this.selectionMode
140
- }).then(response => {
141
- this.listContext = response;
142
- this.getListData();
143
- });
144
- }
145
- }
146
- getFieldFromFilter(filter, dateRange = false) {
147
- let fieldValue;
148
- if (dateRange) {
149
- fieldValue = filter?.AND[0]?.condition.lhs.field;
150
- }
151
- else {
152
- fieldValue = filter?.condition.lhs.field;
153
- }
154
- return fieldValue;
155
- }
156
- // Will be triggered when EVENT_DASHBOARD_FILTER_CHANGE fires
157
- processFilterChange(data) {
158
- const { filterId, filterExpression } = data;
159
- let dashboardFilterPayload = {
160
- query: {
161
- filter: {},
162
- select: []
163
- }
164
- };
165
- this.filters[filterId] = filterExpression;
166
- let isDateRange = !!data.filterExpression?.AND;
167
- // Will be AND by default but making it dynamic in case we support dynamic relational ops in future
168
- const relationalOp = 'AND';
169
- let field = this.getFieldFromFilter(filterExpression, isDateRange);
170
- const selectParam = [];
171
- // Constructing the select parameters list (will be sent in dashboardFilterPayload)
172
- this.displayedColumns$?.forEach(col => {
173
- selectParam.push({
174
- field: col
175
- });
176
- });
177
- // Checking if the triggered filter is applicable for this list
178
- if (data.filterExpression !== null && !(this.displayedColumns$?.length && this.displayedColumns$?.includes(field))) {
179
- return;
180
- }
181
- // This is a flag which will be used to reset dashboardFilterPayload in case we don't find any valid filters
182
- let validFilter = false;
183
- let index = 1;
184
- // Iterating over the current filters list to create filter data which will be POSTed
185
- const filterKeys = Object.keys(this.filters);
186
- const filterValues = Object.values(this.filters);
187
- for (let filterIndex = 0; filterIndex < filterKeys.length; filterIndex++) {
188
- const filter = filterValues[filterIndex];
189
- // If the filter is null then we can skip this iteration
190
- if (filter === null) {
191
- // eslint-disable-next-line no-continue
192
- continue;
193
- }
194
- // Checking if the filter is of type- Date Range
195
- isDateRange = !!filter?.AND;
196
- field = this.getFieldFromFilter(filter, isDateRange);
197
- if (!(this.displayedColumns$?.length && this.displayedColumns$?.includes(field))) {
198
- // eslint-disable-next-line no-continue
199
- continue;
200
- }
201
- // If we reach here that implies we've at least one valid filter, hence setting the flag
202
- validFilter = true;
203
- /** Below are the 2 cases for- Text & Date-Range filter types where we'll construct filter data which will be sent in the dashboardFilterPayload
204
- * In Constellation DX Components, through Repeating Structures they might be using several APIs to do it. We're doing it here
205
- */
206
- if (isDateRange) {
207
- dashboardFilterPayload = this.filterBasedOnDateRange(dashboardFilterPayload, filter, relationalOp, selectParam, index);
208
- }
209
- else {
210
- dashboardFilterPayload.query.filter.filterConditions = {
211
- ...dashboardFilterPayload.query.filter.filterConditions,
212
- [`T${index++}`]: { ...filter.condition, ignoreCase: true }
213
- };
214
- if (dashboardFilterPayload.query.filter.logic) {
215
- dashboardFilterPayload.query.filter.logic = `${dashboardFilterPayload.query.filter.logic} ${relationalOp} T${index - 1}`;
216
- }
217
- else {
218
- dashboardFilterPayload.query.filter.logic = `T${index - 1}`;
219
- }
220
- dashboardFilterPayload.query.select = selectParam;
221
- }
222
- }
223
- // Reset the dashboardFilterPayload if we end up with no valid filters for the list
224
- if (!validFilter) {
225
- dashboardFilterPayload = undefined;
226
- }
227
- this.filterPayload = dashboardFilterPayload;
228
- this.getListData();
229
- }
230
- filterBasedOnDateRange(dashboardFilterPayload, filter, relationalOp, selectParam, index) {
231
- const dateRelationalOp = filter?.AND ? 'AND' : 'OR';
232
- dashboardFilterPayload.query.filter.filterConditions = {
233
- ...dashboardFilterPayload.query.filter.filterConditions,
234
- [`T${index++}`]: { ...filter[relationalOp][0].condition },
235
- [`T${index++}`]: { ...filter[relationalOp][1].condition }
236
- };
237
- if (dashboardFilterPayload.query.filter.logic) {
238
- dashboardFilterPayload.query.filter.logic = `${dashboardFilterPayload.query.filter.logic} ${relationalOp} (T${index - 2} ${dateRelationalOp} T${index - 1})`;
239
- }
240
- else {
241
- dashboardFilterPayload.query.filter.logic = `(T${index - 2} ${relationalOp} T${index - 1})`;
242
- }
243
- dashboardFilterPayload.query.select = selectParam;
244
- return dashboardFilterPayload;
245
- }
246
- processFilterClear() {
247
- this.filterPayload = undefined;
248
- this.getListData();
249
- }
250
- getFieldsMetadata(refList) {
251
- // @ts-ignore - 3rd parameter "associationFilter" should be optional for getDataViewMetadata method
252
- return PCore.getAnalyticsUtils().getDataViewMetadata(refList, this.showDynamicFields);
253
- }
254
- getListData() {
255
- const componentConfig = this.pConn$.getComponentConfig();
256
- if (this.configProps$) {
257
- this.preparePayload();
258
- const refList = this.configProps$.referenceList;
259
- const fieldsMetaDataPromise = this.getFieldsMetadata(refList);
260
- // returns a promise
261
- const payload = this.payload || this.filterPayload || {};
262
- const dataViewParameters = this.payload.parameters;
263
- const workListDataPromise = !this.bInForm$
264
- ? PCore.getDataApiUtils().getData(refList, payload)
265
- : PCore.getDataPageUtils().getDataAsync(refList, this.pConn$.getContextName(), payload.dataViewParameters ? payload.dataViewParameters : dataViewParameters, this.paging, this.query);
266
- this.bShowFilterPopover$ = false;
267
- this.psService.sendMessage(true);
268
- Promise.all([fieldsMetaDataPromise, workListDataPromise])
269
- .then((results) => {
270
- const fieldsMetaData = results[0];
271
- const workListData = results[1];
272
- this.fields$ = this.configProps$.presets[0].children[0].children;
273
- // this is an unresovled version of this.fields$, need unresolved, so can get the property reference
274
- const columnFields = componentConfig.presets[0].children[0].children;
275
- const tableDataResults = !this.bInForm$ ? workListData.data.data : workListData.data;
276
- const columns = this.getHeaderCells(columnFields, this.fieldDefs);
277
- this.fields$ = this.updateFields(this.fields$, fieldsMetaData.data.fields, columns);
278
- this.displayedColumns$ = columns.map(col => {
279
- return col.id;
280
- });
281
- this.response = tableDataResults;
282
- this.updatedRefList = this.updateData(tableDataResults, this.fields$);
283
- if (this.selectionMode === SELECTION_MODE.SINGLE && this.updatedRefList?.length > 0) {
284
- this.displayedColumns$?.unshift('select');
285
- this.singleSelectionMode = true;
286
- }
287
- else if (this.selectionMode === SELECTION_MODE.MULTI && this.updatedRefList?.length > 0) {
288
- this.displayedColumns$?.unshift('select');
289
- this.multiSelectionMode = true;
290
- }
291
- this.repeatList$ = new MatTableDataSource(this.updatedRefList);
292
- this.repeatList$.filterPredicate = this.customFilterPredicate.bind(this);
293
- // keeping an original copy to get back after possible sorts, filters and groupBy
294
- this.repeatListData = this.repeatList$.data.slice();
295
- this.repeatList$.paginator = this.paginator;
296
- this.repeatList$.sort = this.sort;
297
- this.psService.sendMessage(false);
298
- })
299
- .catch(() => {
300
- console.error("Couldn't fetch either the fieldsMetaData or workListData");
301
- this.psService.sendMessage(false);
302
- });
303
- }
304
- }
305
- preparePayload() {
306
- const { fieldDefs, itemKey, patchQueryFields } = this.listContext.meta;
307
- this.fieldDefs = fieldDefs;
308
- let listFields = fieldDefs ? this.buildSelect(fieldDefs, undefined, patchQueryFields, this.payload?.compositeKeys) : [];
309
- listFields = this.addItemKeyInSelect(fieldDefs, itemKey, listFields, this.payload?.compositeKeys);
310
- if (this.payload.query) {
311
- this.query = this.payload.query;
312
- }
313
- else if (listFields?.length && this.listContext.meta.isQueryable) {
314
- if (this.filterPayload) {
315
- this.query = {
316
- select: listFields,
317
- filter: this.filterPayload?.query?.filter
318
- };
319
- }
320
- else {
321
- this.query = { select: listFields };
322
- }
323
- }
324
- else if (this.filterPayload) {
325
- this.query = this.filterPayload?.query;
326
- }
327
- }
328
- // ngOnChanges(changes) {
329
- // if (changes && changes.payload) {
330
- // const currentPayloadVal = changes.payload?.currentValue;
331
- // const previousPayloadVal = changes.payload?.previousValue;
332
- // if (currentPayloadVal !== previousPayloadVal) {
333
- // this.getListData();
334
- // }
335
- // }
336
- // }
337
- ngOnDestroy() {
338
- PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.EVENT_DASHBOARD_FILTER_CHANGE, `dashboard-component-${'id'}`, this.pConn$.getContextName());
339
- PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.EVENT_DASHBOARD_FILTER_CLEAR_ALL, `dashboard-component-${'id'}`, this.pConn$.getContextName());
340
- }
341
- // ngAfterViewInit() {
342
- // // paginator has to exist for this to work,
343
- // // so called after init (paginator drawn)
344
- // // Calls are now in workListData promise
345
- // // this.repeatList$.paginator = this.paginator;
346
- // // this.repeatList$.sort = this.sort;
347
- // }
348
- drop(event) {
349
- moveItemInArray(this.displayedColumns$, event.previousIndex, event.currentIndex);
350
- }
351
- updateFields(arFields, arColumns, fields) {
352
- const arReturn = arFields;
353
- arReturn.forEach((field, i) => {
354
- field.config = { ...field.config, ...fields[i], name: fields[i].id };
355
- });
356
- return arReturn;
357
- }
358
- applySearch(event) {
359
- const filterValue = event.target.value;
360
- this.searchFilter = filterValue.trim().toLowerCase();
361
- if (this.groupByColumns$.length > 0) {
362
- this.repeatList$.data = this.repeatListData.slice();
363
- this.repeatList$.filter = this.searchFilter;
364
- const repeatData = this.repeatList$.sortData(this.repeatList$.filteredData, this.repeatList$.sort);
365
- this.repeatList$.data = this.addGroups(repeatData, this.groupByColumns$);
366
- this.perfFilter = performance.now().toString();
367
- this.repeatList$.filter = this.perfFilter;
368
- }
369
- else {
370
- this.repeatList$.filter = this.searchFilter;
371
- }
372
- if (this.repeatList$.paginator) {
373
- this.repeatList$.paginator.firstPage();
374
- }
375
- }
376
- isChecked(rowIn) {
377
- const initialVal = false;
378
- return this.configProps$?.readonlyContextList?.reduce((acc, currRow) => {
379
- return acc || rowIn[this.rowID] === currRow[this.rowID];
380
- }, initialVal);
381
- }
382
- fieldOnChange(row) {
383
- const value = row[this.rowID];
384
- const reqObj = {};
385
- if (this.compositeKeys?.length > 1) {
386
- const index = this.response.findIndex(element => element[this.rowID] === value);
387
- const selectedRow = this.response[index];
388
- this.compositeKeys.forEach(element => {
389
- reqObj[element] = selectedRow[element];
390
- });
391
- }
392
- else {
393
- reqObj[this.rowID] = value;
394
- }
395
- this.checkBoxValue = value;
396
- this.pConn$?.getListActions?.()?.setSelectedRows([reqObj]);
397
- }
398
- onCheckboxClick(row, event) {
399
- const value = row[this.rowID];
400
- const checked = event?.checked;
401
- const reqObj = {};
402
- if (this.compositeKeys?.length > 1) {
403
- const index = this.response.findIndex(element => element[this.rowID] === value);
404
- const selectedRow = this.response[index];
405
- this.compositeKeys.forEach(element => {
406
- reqObj[element] = selectedRow[element];
407
- });
408
- reqObj.$selected = checked;
409
- }
410
- else {
411
- reqObj[this.rowID] = value;
412
- reqObj.$selected = checked;
413
- }
414
- this.pConn$?.getListActions()?.setSelectedRows([reqObj]);
415
- }
416
- // rowClick(row) {
417
- // switch (this.configProps$.rowClickAction) {
418
- // case 'openAssignment':
419
- // this.psService.sendMessage(true);
420
- // this.openAssignment(row);
421
- // break;
422
- // }
423
- // }
424
- _getIconStyle(level) {
425
- let sReturn = '';
426
- let nLevel = parseInt(level, 10);
427
- nLevel--;
428
- nLevel *= 15;
429
- sReturn = `padding-left: ${nLevel}px; vertical-align: middle`;
430
- return sReturn;
431
- }
432
- _getGroupName(fieldName) {
433
- for (let fieldIndex = 0; fieldIndex < this.fields$.length; fieldIndex++) {
434
- const field = this.fields$[fieldIndex];
435
- if (field.config.name == fieldName) {
436
- return field.config.label;
437
- }
438
- }
439
- return '';
440
- }
441
- _showButton(name, row) {
442
- let bReturn = false;
443
- const { pxRefObjectClass, pzInsKey, pxRefObjectKey } = row;
444
- switch (name) {
445
- case 'pxTaskLabel':
446
- if (pxRefObjectClass != '' && pzInsKey != '') {
447
- bReturn = true;
448
- }
449
- break;
450
- case 'pxRefObjectInsName':
451
- if (pxRefObjectClass != '' && pxRefObjectKey != '') {
452
- bReturn = true;
453
- }
454
- break;
455
- default:
456
- break;
457
- }
458
- return bReturn;
459
- }
460
- _listViewClick(column, row) {
461
- const name = column.id;
462
- if (column.displayAsLink) {
463
- const { pxObjClass } = row;
464
- let { pzInsKey } = row;
465
- if (column.isAssociation) {
466
- const associationCategory = name.split(':')[0];
467
- pzInsKey = row[`${associationCategory}:pzInsKey`];
468
- }
469
- if (column.isAssignmentLink) {
470
- this.pConn$.getActionsApi().openAssignment(pzInsKey, pxObjClass, {
471
- containerName: 'primary',
472
- channelName: ''
473
- });
474
- }
475
- else {
476
- this.pConn$.getActionsApi().openWorkByHandle(pzInsKey, pxObjClass);
477
- }
478
- }
479
- else {
480
- switch (name) {
481
- case 'pxTaskLabel':
482
- this.openAssignment(row);
483
- break;
484
- case 'pxRefObjectInsName':
485
- this.openWork(row);
486
- break;
487
- default:
488
- break;
489
- }
490
- }
491
- }
492
- _headerSortClick(event, columnData) {
493
- // images 0 - filter, 1 - arrow, 2 - more
494
- /** Commenting this code for now as it is giving errors not sure if it ever worked */
495
- // let arrowImage = event.srcElement.getElementsByTagName('img')[1];
496
- // let arrowAttr = arrowImage.getAttribute('arrow');
497
- // this.clearOutArrows(event, columnData);
498
- // switch (arrowAttr) {
499
- // case 'up':
500
- // arrowImage.src = this.arrowDownSvgIcon$;
501
- // arrowImage.setAttribute('arrow', 'down');
502
- // break;
503
- // case 'down':
504
- // arrowImage.src = '';
505
- // arrowImage.setAttribute('arrow', 'none');
506
- // break;
507
- // default:
508
- // arrowImage.src = this.arrowUpSvgIcon$;
509
- // arrowImage.setAttribute('arrow', 'up');
510
- // break;
511
- // }
512
- this.compareType = columnData.type;
513
- this.compareRef = columnData.config.name;
514
- // this.arrowDirection = arrowImage.getAttribute('arrow');
515
- this.arrowDirection = this.arrowDirection === 'up' ? 'down' : 'up';
516
- this.filterSortGroupBy();
517
- }
518
- // Commenting below method, since the code which is using it, is already commented
519
- // clearOutArrows(event, columnData) {
520
- // const arImages = event.srcElement.parentElement.getElementsByTagName('img');
521
- // for (const theImage of arImages) {
522
- // // let theImage = arImages[i]
523
- // const arrow = theImage.getAttribute('arrow');
524
- // if (arrow) {
525
- // const arrowId = theImage.getAttribute('arrowid');
526
- // if (arrow != 'none' && arrowId != columnData.config.name) {
527
- // theImage.setAttribute('arrow', 'none');
528
- // theImage.src = '';
529
- // }
530
- // }
531
- // }
532
- // }
533
- sortCompare(a, b) {
534
- let aValue = a[this.compareRef];
535
- let bValue = b[this.compareRef];
536
- if (this.compareType == 'Date' || this.compareType == 'DateTime') {
537
- aValue = getSeconds(aValue);
538
- bValue = getSeconds(bValue);
539
- }
540
- if (this.compareRef == 'pxRefObjectInsName') {
541
- const result = this.compareByColumnPxRefObjectInsName(aValue, bValue);
542
- if (result !== undefined) {
543
- return result;
544
- }
545
- }
546
- switch (this.arrowDirection) {
547
- case 'up':
548
- if (!aValue || aValue < bValue) {
549
- return -1;
550
- }
551
- if (!bValue || aValue > bValue) {
552
- return 1;
553
- }
554
- break;
555
- case 'down':
556
- if (!bValue || aValue > bValue) {
557
- return -1;
558
- }
559
- if (!aValue || aValue < bValue) {
560
- return 1;
561
- }
562
- break;
563
- default:
564
- break;
565
- }
566
- return 0;
567
- }
568
- compareByColumnPxRefObjectInsName(aValue, bValue) {
569
- const prefixX = aValue.split('-');
570
- const prefixY = bValue.split('-');
571
- switch (this.arrowDirection) {
572
- case 'up':
573
- if (prefixX[0] !== prefixY[0]) {
574
- if (prefixX[0] < prefixY[0])
575
- return -1;
576
- if (prefixX[0] > prefixY[0])
577
- return 1;
578
- return 0;
579
- }
580
- return prefixX[1] - prefixY[1];
581
- case 'down':
582
- if (prefixX[0] !== prefixY[0]) {
583
- if (prefixX[0] > prefixY[0])
584
- return -1;
585
- if (prefixX[0] < prefixY[0])
586
- return 1;
587
- return 0;
588
- }
589
- return prefixY[1] - prefixX[1];
590
- default:
591
- break;
592
- }
593
- return undefined;
594
- }
595
- updateFilterDisplay(type) {
596
- switch (type) {
597
- case 'Date':
598
- this.filterContainsType$ = 'notequal';
599
- this.bContains$ = false;
600
- this.bDateTime$ = true;
601
- this.bIsDate$ = true;
602
- this.bIsDateTime$ = false;
603
- this.bIsTime$ = false;
604
- break;
605
- case 'DateTime':
606
- this.filterContainsType$ = 'notequal';
607
- this.bContains$ = false;
608
- this.bDateTime$ = true;
609
- this.bIsDate$ = false;
610
- this.bIsDateTime$ = true;
611
- this.bIsTime$ = false;
612
- break;
613
- case 'Time':
614
- this.filterContainsType$ = 'notequal';
615
- this.bContains$ = false;
616
- this.bDateTime$ = true;
617
- this.bIsDate$ = false;
618
- this.bIsDateTime$ = false;
619
- this.bIsTime$ = true;
620
- break;
621
- default:
622
- this.filterContainsType$ = 'contains';
623
- this.bContains$ = true;
624
- this.bDateTime$ = false;
625
- this.bIsDate$ = false;
626
- this.bIsDateTime$ = false;
627
- this.bIsTime$ = false;
628
- break;
629
- }
630
- }
631
- _filter(event, columnData) {
632
- // add clickAway listener
633
- window.addEventListener('mouseup', this._clickAway.bind(this));
634
- this.currentFilterRefData = columnData;
635
- this.filterContainsLabel$ = columnData.config.label;
636
- setTimeout(() => {
637
- this.updateFilterDisplay(columnData.type);
638
- this.updateFilterVarsWithCurrent(columnData);
639
- this.bShowFilterPopover$ = true;
640
- });
641
- }
642
- _clickAway(event) {
643
- let bInPopUp = false;
644
- // run through list of elements in path, if menu not in th path, then want to
645
- // hide (toggle) the menu
646
- const eventPath = event.path;
647
- for (let pathIndex = 0; pathIndex < eventPath.length; pathIndex++) {
648
- if (eventPath[pathIndex].className == 'psdk-modal-file-top' ||
649
- eventPath[pathIndex].tagName == 'BUTTON' ||
650
- eventPath[pathIndex].tagName == 'MAT-OPTION' ||
651
- eventPath[pathIndex].tagName == 'MAT-INPUT') {
652
- bInPopUp = true;
653
- break;
654
- }
655
- }
656
- if (!bInPopUp) {
657
- // this.bShowFilterPopover$ = false;
658
- window.removeEventListener('mouseup', this._clickAway.bind(this));
659
- }
660
- }
661
- _filterContainsType(event) {
662
- this.filterContainsType$ = event.value;
663
- }
664
- _filterContainsValue(event) {
665
- this.filterContainsValue$ = event.target.value;
666
- }
667
- _filterContainsDateValue(event, value) {
668
- this.filterContainsValue$ = value;
669
- }
670
- _filterContainsDateTimeValue(event) {
671
- this.filterContainsValue$ = event.target.value;
672
- }
673
- _filterContainsTimeValue(event) {
674
- this.filterContainsValue$ = event.target.value;
675
- }
676
- _onFilterActionButtonClick(event) {
677
- // modal buttons
678
- switch (event.action) {
679
- case 'cancel':
680
- this.currentFilterRefData = [];
681
- break;
682
- case 'submit':
683
- this.updateFilterWithInfo();
684
- this.filterSortGroupBy();
685
- break;
686
- default:
687
- break;
688
- }
689
- this.bShowFilterPopover$ = false;
690
- window.removeEventListener('mouseup', this._clickAway.bind(this));
691
- }
692
- updateFilterWithInfo() {
693
- let bFound = false;
694
- for (const filterObj of this.filterByColumns) {
695
- if (filterObj.ref === this.currentFilterRefData.config.name) {
696
- filterObj.type = this.currentFilterRefData.type;
697
- filterObj.containsFilter = this.filterContainsType$;
698
- filterObj.containsFilterValue = this.filterContainsValue$;
699
- bFound = true;
700
- break;
701
- }
702
- }
703
- if (!bFound) {
704
- // add in
705
- const filterObj = {};
706
- filterObj.ref = this.currentFilterRefData.config.name;
707
- filterObj.type = this.currentFilterRefData.type;
708
- filterObj.containsFilter = this.filterContainsType$;
709
- filterObj.containsFilterValue = this.filterContainsValue$;
710
- this.filterByColumns.push(filterObj);
711
- }
712
- // iterate through filters and update filterOn icon
713
- for (const filterObj of this.filterByColumns) {
714
- const containsFilterValue = filterObj.containsFilterValue;
715
- const containsFilter = filterObj.containsFilter;
716
- const filterRef = filterObj.ref;
717
- const filterIndex = this.displayedColumns$.indexOf(filterRef);
718
- const arFilterImg = document.getElementsByName('filterOnIcon');
719
- const filterImg = arFilterImg[filterIndex];
720
- if (containsFilterValue == '' && containsFilter != 'null' && containsFilter != 'notnull') {
721
- // clear icon
722
- filterImg.src = '';
723
- }
724
- else {
725
- // show icon
726
- filterImg.src = this.filterOnSvgIcon$;
727
- }
728
- }
729
- }
730
- updateFilterVarsWithCurrent(columnData) {
731
- // find current ref, if exists, move data to variable to display
732
- let bFound = false;
733
- for (const filterObj of this.filterByColumns) {
734
- if (filterObj.ref === this.currentFilterRefData.config.name) {
735
- this.filterContainsType$ = filterObj.containsFilter;
736
- this.filterContainsValue$ = filterObj.containsFilterValue;
737
- bFound = true;
738
- break;
739
- }
740
- }
741
- if (!bFound) {
742
- switch (columnData.type) {
743
- case 'Date':
744
- case 'DateTime':
745
- case 'Time':
746
- this.filterContainsType$ = 'notequal';
747
- break;
748
- default:
749
- this.filterContainsType$ = 'contains';
750
- break;
751
- }
752
- this.filterContainsValue$ = '';
753
- }
754
- }
755
- filterData(item) {
756
- let bKeep = true;
757
- for (const filterObj of this.filterByColumns) {
758
- if (filterObj.containsFilterValue != '' || filterObj.containsFilter == 'null' || filterObj.containsFilter == 'notnull') {
759
- let filterValue;
760
- switch (filterObj.type) {
761
- case 'Date':
762
- case 'DateTime':
763
- case 'Time':
764
- bKeep = this.filterDataWithDate(item, filterObj, filterValue);
765
- break;
766
- default:
767
- bKeep = this.filterDataWithCommonTypes(item, filterObj, filterValue);
768
- break;
769
- }
770
- }
771
- // if don't keep stop filtering
772
- if (!bKeep) {
773
- break;
774
- }
775
- }
776
- return bKeep;
777
- }
778
- filterDataWithDate(item, filterObj, filterValue) {
779
- let bKeep;
780
- let value = item[filterObj.ref] != null || item[filterObj.ref] != '' ? getSeconds(item[filterObj.ref]) : null;
781
- filterValue = filterObj.containsFilterValue != null && filterObj.containsFilterValue != '' ? getSeconds(filterObj.containsFilterValue) : null;
782
- switch (filterObj.containsFilter) {
783
- case 'notequal':
784
- // becasue filterValue is in minutes, need to have a range of less than 60 secons
785
- if (value != null && filterValue != null) {
786
- // get rid of millisecons
787
- value /= 1000;
788
- filterValue /= 1000;
789
- const diff = value - filterValue;
790
- if (diff >= 0 && diff < 60) {
791
- bKeep = false;
792
- }
793
- }
794
- break;
795
- case 'after':
796
- if (value < filterValue) {
797
- bKeep = false;
798
- }
799
- break;
800
- case 'before':
801
- if (value > filterValue) {
802
- bKeep = false;
803
- }
804
- break;
805
- case 'null':
806
- if (value != null) {
807
- bKeep = false;
808
- }
809
- break;
810
- case 'notnull':
811
- if (value == null) {
812
- bKeep = false;
813
- }
814
- break;
815
- default:
816
- break;
817
- }
818
- return bKeep;
819
- }
820
- filterDataWithCommonTypes(item, filterObj, filterValue) {
821
- let bKeep;
822
- const value = item[filterObj.ref].toLowerCase();
823
- filterValue = filterObj.containsFilterValue.toLowerCase();
824
- switch (filterObj.containsFilter) {
825
- case 'contains':
826
- if (value.indexOf(filterValue) < 0) {
827
- bKeep = false;
828
- }
829
- break;
830
- case 'equals':
831
- if (value != filterValue) {
832
- bKeep = false;
833
- }
834
- break;
835
- case 'startswith':
836
- if (value.indexOf(filterValue) != 0) {
837
- bKeep = false;
838
- }
839
- break;
840
- default:
841
- break;
842
- }
843
- return bKeep;
844
- }
845
- filterSortGroupBy() {
846
- // get original data set
847
- let theData = this.repeatListData.slice();
848
- // last filter config data is global
849
- theData = theData.filter(this.filterData.bind(this));
850
- // last sort config data is global
851
- theData.sort(this.sortCompare.bind(this));
852
- const reGroupData = this.addGroups(theData, this.groupByColumns$);
853
- this.repeatList$.data = [];
854
- this.repeatList$.data.push(...reGroupData);
855
- if (this.searchFilter && this.searchFilter != '') {
856
- this.repeatList$.filter = this.searchFilter;
857
- }
858
- else {
859
- this.perfFilter = performance.now().toString();
860
- this.repeatList$.filter = this.perfFilter;
861
- }
862
- this.repeatList$.filter = '';
863
- if (this.repeatList$.paginator) {
864
- this.repeatList$.paginator.firstPage();
865
- }
866
- }
867
- //
868
- // Grouping code inspired by this example
869
- // https://stackblitz.com/edit/angular-material-table-row-grouping
870
- //
871
- _showUnGroupBy(columnData) {
872
- for (const val of this.groupByColumns$) {
873
- if (val == columnData.config.name) {
874
- return true;
875
- }
876
- }
877
- return false;
878
- }
879
- _groupBy(event, columnData) {
880
- this.checkGroupByColumn(columnData.config.name, true);
881
- this.filterSortGroupBy();
882
- }
883
- _unGroupBy(event, columnData) {
884
- // event.stopPropagation();
885
- this.checkGroupByColumn(columnData.config.name, false);
886
- this.filterSortGroupBy();
887
- }
888
- checkGroupByColumn(field, add) {
889
- let found = null;
890
- for (const column of this.groupByColumns$) {
891
- if (column === field) {
892
- found = this.groupByColumns$.indexOf(column, 0);
893
- }
894
- }
895
- if (found != null && found >= 0) {
896
- if (!add) {
897
- this.groupByColumns$.splice(found, 1);
898
- }
899
- }
900
- else if (add) {
901
- this.groupByColumns$.push(field);
902
- }
903
- }
904
- addGroups(data, groupByColumns) {
905
- const rootGroup = new Group();
906
- rootGroup.expanded = true;
907
- return this.getSublevel(data, 0, groupByColumns, rootGroup);
908
- }
909
- getSublevel(data, level, groupByColumns, parent) {
910
- if (level >= groupByColumns.length) {
911
- return data;
912
- }
913
- const groups = this.uniqueBy(data.map(row => {
914
- const result = new Group();
915
- result.level = level + 1;
916
- result.parent = parent;
917
- for (let i = 0; i <= level; i++) {
918
- result[groupByColumns[i]] = row[groupByColumns[i]];
919
- }
920
- return result;
921
- }), JSON.stringify);
922
- const currentColumn = groupByColumns[level];
923
- let subGroups = [];
924
- groups.forEach(group => {
925
- const rowsInGroup = data.filter(row => group[currentColumn] === row[currentColumn]);
926
- group.totalCounts = rowsInGroup.length;
927
- const subGroup = this.getSublevel(rowsInGroup, level + 1, groupByColumns, group);
928
- subGroup.unshift(group);
929
- subGroups = subGroups.concat(subGroup);
930
- });
931
- return subGroups;
932
- }
933
- uniqueBy(a, key) {
934
- const seen = {};
935
- return a.filter(item => {
936
- const k = key(item);
937
- // eslint-disable-next-line no-return-assign, no-prototype-builtins
938
- return seen.hasOwnProperty(k) ? false : (seen[k] = true);
939
- });
940
- }
941
- isGroup(index, item) {
942
- return item.level;
943
- }
944
- _groupHeaderClick(row) {
945
- row.expanded = !row.expanded;
946
- // this.repeatList$.filter = "";
947
- this.perfFilter = performance.now().toString();
948
- this.repeatList$.filter = this.perfFilter;
949
- }
950
- // below is for grid row grouping
951
- customFilterPredicate(data, filter) {
952
- return data instanceof Group ? data.visible : this.getDataRowVisibleWithFilter(data, filter);
953
- }
954
- getDataRowVisible(data) {
955
- const groupRows = this.repeatList$.data.filter(row => {
956
- if (!(row instanceof Group)) {
957
- return false;
958
- }
959
- let match = true;
960
- this.groupByColumns$.forEach(column => {
961
- if (!row[column] || !data[column] || row[column] !== data[column]) {
962
- match = false;
963
- }
964
- });
965
- return match;
966
- });
967
- if (groupRows.length === 0) {
968
- return true;
969
- }
970
- const parent = groupRows[0];
971
- return parent.visible && parent.expanded;
972
- }
973
- getDataRowVisibleWithFilter(data, filter) {
974
- // fist check if row is visible with grouping
975
- let bVisible = this.getDataRowVisible(data);
976
- if (bVisible && filter && filter != '' && filter != this.perfFilter) {
977
- // now check if row is filtered.
978
- // assume not there unless we find it
979
- bVisible = false;
980
- for (const col of this.displayedColumns$) {
981
- // filter is lower case
982
- if (data[col] && data[col].toString().toLowerCase().indexOf(filter) >= 0) {
983
- bVisible = true;
984
- break;
985
- }
986
- }
987
- }
988
- return bVisible;
989
- }
990
- updateData(listData, fieldData) {
991
- const returnList = new Array();
992
- listData.forEach(row => {
993
- // copy
994
- const rowData = JSON.parse(JSON.stringify(row));
995
- for (let fieldIndex = 0; fieldIndex < fieldData.length; fieldIndex++) {
996
- const config = fieldData[fieldIndex].config;
997
- let fieldName;
998
- let formattedDate;
999
- let myFormat;
1000
- let theCurrencyOptions;
1001
- switch (fieldData[fieldIndex].type) {
1002
- case 'Date':
1003
- fieldName = config.name;
1004
- myFormat = config.formatter;
1005
- if (!myFormat) {
1006
- myFormat = 'Date';
1007
- }
1008
- formattedDate = this.utils.generateDate(rowData[fieldName], myFormat);
1009
- rowData[fieldName] = formattedDate;
1010
- break;
1011
- case 'DateTime':
1012
- fieldName = config.name;
1013
- myFormat = config.formatter;
1014
- if (!myFormat) {
1015
- myFormat = 'DateTime-Long';
1016
- }
1017
- formattedDate = this.utils.generateDateTime(rowData[fieldName], myFormat);
1018
- rowData[fieldName] = formattedDate;
1019
- break;
1020
- case 'Currency':
1021
- fieldName = config.name;
1022
- theCurrencyOptions = getCurrencyOptions(PCore.getEnvironmentInfo().getLocale());
1023
- // eslint-disable-next-line no-case-declarations
1024
- const defaultOptions = {
1025
- locale: getLocale(),
1026
- position: 'before',
1027
- decPlaces: 2
1028
- };
1029
- // eslint-disable-next-line no-case-declarations
1030
- const params = { ...defaultOptions, ...theCurrencyOptions };
1031
- rowData[fieldName] = formatters.Currency(rowData[fieldName], params);
1032
- // val = format(value, column.type, theCurrencyOptions);
1033
- break;
1034
- default:
1035
- break;
1036
- }
1037
- }
1038
- returnList.push(rowData);
1039
- });
1040
- return returnList;
1041
- }
1042
- openAssignment(row) {
1043
- const { pxRefObjectClass, pzInsKey } = row;
1044
- const sTarget = this.pConn$.getContainerName();
1045
- const options = { containerName: sTarget };
1046
- this.pConn$.getActionsApi().openAssignment(pzInsKey, pxRefObjectClass, options);
1047
- }
1048
- openWork(row) {
1049
- const pxRefObjectClass = row.pxRefObjectClass || row.pxObjClass;
1050
- const { pxRefObjectKey } = row;
1051
- if (pxRefObjectClass !== '' && pxRefObjectKey !== '') {
1052
- this.pConn$.getActionsApi().openWorkByHandle(pxRefObjectKey, pxRefObjectClass);
1053
- }
1054
- }
1055
- initializeData(data) {
1056
- data.forEach((item, idx) => {
1057
- item.__original_index = idx;
1058
- item.__level = 1;
1059
- });
1060
- return data;
1061
- }
1062
- getType(field) {
1063
- const { config = {}, type } = field;
1064
- const { formatType } = config;
1065
- if (formatType === 'datetime' || formatType === 'date') {
1066
- // currently cosmos has only support for date ... it also need to support dateTime
1067
- return 'date';
1068
- }
1069
- return type.toLowerCase();
1070
- }
1071
- initializeColumns(fields = []) {
1072
- return fields.map((field, originalColIndex) => ({
1073
- ...field,
1074
- type: this.getType(field),
1075
- name: field.config.value.substring(4),
1076
- label: field.config.label.substring(3),
1077
- id: originalColIndex,
1078
- groupingEnabled: true,
1079
- grouped: false,
1080
- minWidth: 50,
1081
- cellRenderer: this.getType(field) === 'text' ? null : field.type,
1082
- filter: true
1083
- }));
1084
- }
1085
- getHeaderCells(colFields, fields) {
1086
- const AssignDashObjects = ['Assign-Worklist', 'Assign-WorkBasket'];
1087
- return colFields.map((field, index) => {
1088
- let theField = field.config.value.substring(field.config.value.indexOf(' ') + 1);
1089
- if (theField.indexOf('.') === 0) {
1090
- theField = theField.substring(1);
1091
- }
1092
- const colIndex = fields.findIndex(ele => ele.name === theField);
1093
- const displayAsLink = field.config.displayAsLink;
1094
- const headerRow = {};
1095
- headerRow.id = fields[index].id;
1096
- headerRow.type = field.type;
1097
- headerRow.displayAsLink = displayAsLink;
1098
- headerRow.numeric = field.type === 'Decimal' || field.type === 'Integer' || field.type === 'Percentage' || field.type === 'Currency' || false;
1099
- headerRow.disablePadding = false;
1100
- headerRow.label = fields[index].label;
1101
- if (colIndex > -1) {
1102
- headerRow.classID = fields[colIndex].classID;
1103
- }
1104
- if (displayAsLink) {
1105
- headerRow.isAssignmentLink = AssignDashObjects.includes(headerRow.classID);
1106
- if (field.config.value?.startsWith('@CA')) {
1107
- headerRow.isAssociation = true;
1108
- }
1109
- }
1110
- return headerRow;
1111
- });
1112
- }
1113
- buildSelect(fieldDefs, colId, patchQueryFields = [], compositeKeys = []) {
1114
- const listFields = [];
1115
- if (colId) {
1116
- const field = this.getField(fieldDefs, colId);
1117
- listFields.push({
1118
- field: field.name
1119
- });
1120
- }
1121
- else {
1122
- // NOTE: If we ever decide to not set up all the `fieldDefs` on select, ensure that the fields
1123
- // corresponding to `state.groups` are set up. Needed in Client-mode grouping/pagination.
1124
- fieldDefs.forEach(field => {
1125
- if (!listFields.find(f => f.field === field.name)) {
1126
- listFields.push({
1127
- field: field.name
1128
- });
1129
- }
1130
- });
1131
- patchQueryFields.forEach(k => {
1132
- if (!listFields.find(f => f.field === k)) {
1133
- listFields.push({
1134
- field: k
1135
- });
1136
- }
1137
- });
1138
- }
1139
- compositeKeys.forEach(k => {
1140
- if (!listFields.find(f => f.field === k)) {
1141
- listFields.push({
1142
- field: k
1143
- });
1144
- }
1145
- });
1146
- return listFields;
1147
- }
1148
- getResultsText() {
1149
- const recordsCount = this.repeatList$?.paginator?.length || 0;
1150
- return `${recordsCount || 0} result${recordsCount > 1 ? 's' : ''}`;
1151
- }
1152
- getField(fieldDefs, columnId) {
1153
- const fieldsMap = this.getFieldsMap(fieldDefs);
1154
- return fieldsMap.get(columnId);
1155
- }
1156
- getFieldsMap(fieldDefs) {
1157
- const fieldsMap = new Map();
1158
- fieldDefs.forEach(element => {
1159
- fieldsMap.set(element.id, element);
1160
- });
1161
- return fieldsMap;
1162
- }
1163
- addItemKeyInSelect(fieldDefs, itemKey, select, compositeKeys) {
1164
- const elementFound = this.getField(fieldDefs, itemKey);
1165
- if (itemKey &&
1166
- !elementFound &&
1167
- Array.isArray(select) &&
1168
- !(compositeKeys !== null && compositeKeys?.length) &&
1169
- !select.find(sel => sel.field === itemKey)) {
1170
- return [
1171
- ...select,
1172
- {
1173
- field: itemKey
1174
- }
1175
- ];
1176
- }
1177
- return select;
1178
- }
1179
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ListViewComponent, deps: [{ token: i1.ProgressSpinnerService }, { token: i2.Utils }], target: i0.ɵɵFactoryTarget.Component }); }
1180
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ListViewComponent, isStandalone: true, selector: "app-list-view", inputs: { pConn$: "pConn$", bInForm$: "bInForm$", payload: "payload" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div class=\"psdk-list-header\">\n <div>\n <h3 *ngIf=\"label\" class=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" [checked]=\"row[rowID] === checkBoxValue\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" [checked]=\"isChecked(row)\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}.label{margin:8px}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i4.MatLabel), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(() => i4.MatSuffix), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i5.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatTableModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatTable), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCellDef), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderRowDef), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatColumnDef), selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatCellDef), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatRowDef), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCell), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatCell), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(() => i6.MatHeaderRow), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(() => i6.MatRow), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSortModule) }, { kind: "directive", type: i0.forwardRef(() => i7.MatSort), selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(() => i7.MatSortHeader), selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(() => DragDropModule) }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDropList), selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDrag), selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i9.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i9.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i10.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i10.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i10.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i11.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatRadioModule) }, { kind: "component", type: i0.forwardRef(() => i12.MatRadioButton), selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatCheckboxModule) }, { kind: "component", type: i0.forwardRef(() => i13.MatCheckbox), selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatPaginatorModule) }, { kind: "component", type: i0.forwardRef(() => i14.MatPaginator), selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSelectModule) }, { kind: "component", type: i0.forwardRef(() => i15.MatSelect), selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i0.forwardRef(() => i16.MatOption), selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatOptionModule) }, { kind: "ngmodule", type: i0.forwardRef(() => MatDatepickerModule) }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepicker), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(() => i17.MatDatepickerInput), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepickerToggle), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
1181
- }
1182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ListViewComponent, decorators: [{
1183
- type: Component,
1184
- args: [{ selector: 'app-list-view', standalone: true, imports: [
1185
- CommonModule,
1186
- MatFormFieldModule,
1187
- MatInputModule,
1188
- MatTableModule,
1189
- MatSortModule,
1190
- DragDropModule,
1191
- CdkDropList,
1192
- CdkDrag,
1193
- MatButtonModule,
1194
- MatMenuModule,
1195
- MatIconModule,
1196
- MatRadioModule,
1197
- MatCheckboxModule,
1198
- MatPaginatorModule,
1199
- MatSelectModule,
1200
- MatOptionModule,
1201
- MatDatepickerModule,
1202
- forwardRef(() => ComponentMapperComponent)
1203
- ], template: "<div class=\"psdk-list-header\">\n <div>\n <h3 *ngIf=\"label\" class=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" [checked]=\"row[rowID] === checkBoxValue\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" [checked]=\"isChecked(row)\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}.label{margin:8px}\n"] }]
1204
- }], ctorParameters: () => [{ type: i1.ProgressSpinnerService }, { type: i2.Utils }], propDecorators: { paginator: [{
1205
- type: ViewChild,
1206
- args: [MatPaginator]
1207
- }], sort: [{
1208
- type: ViewChild,
1209
- args: [MatSort]
1210
- }], pConn$: [{
1211
- type: Input
1212
- }], bInForm$: [{
1213
- type: Input
1214
- }], payload: [{
1215
- type: Input
1216
- }] } });
1217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFB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QUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7cUJBQzNDOytHQUd3QixTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0gsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUVULE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNb2R1bGUsIENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXksIENka0Ryb3BMaXN0LCBDZGtEcmFnIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX21lc3NhZ2VzL3Byb2dyZXNzLXNwaW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRDdXJyZW5jeU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9jdXJyZW5jeS11dGlscyc7XG5pbXBvcnQgeyBnZXRMb2NhbGUsIGdldFNlY29uZHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9jb21tb24nO1xuaW1wb3J0IHsgZm9ybWF0dGVycyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL2Zvcm1hdHRlcnMvZm9ybWF0LXV0aWxzJztcblxuaW1wb3J0IHsgaW5pdCB9IGZyb20gJy4vbGlzdFZpZXdIZWxwZXJzJztcblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcblxuY29uc3QgU0VMRUNUSU9OX01PREUgPSB7IFNJTkdMRTogJ3NpbmdsZScsIE1VTFRJOiAnbXVsdGknIH07XG5cbmludGVyZmFjZSBMaXN0Vmlld1Byb3BzIHtcbiAgaW5oZXJpdGVkUHJvcHM6IGFueTtcbiAgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gSWYgYW55LCBlbnRlciBhZGRpdGlvbmFsIHByb3BzIHRoYXQgb25seSBleGlzdCBvbiB0aGlzIGNvbXBvbmVudFxuICBnbG9iYWxTZWFyY2g/OiBib29sZWFuO1xuICByZWZlcmVuY2VMaXN0PzogYW55O1xuICByb3dDbGlja0FjdGlvbj86IGFueTtcbiAgc2VsZWN0aW9uTW9kZT86IHN0cmluZztcbiAgcmVmZXJlbmNlVHlwZT86IHN0cmluZztcbiAgY29tcG9zaXRlS2V5cz86IGFueTtcbiAgc2hvd0R5bmFtaWNGaWVsZHM/OiBib29sZWFuO1xuICBwcmVzZXRzPzogYW55O1xuICByZW9yZGVyRmllbGRzOiBzdHJpbmcgfCBib29sZWFuO1xuICBncm91cGluZzogc3RyaW5nIHwgYm9vbGVhbjtcbiAgdmFsdWU6IGFueTtcbiAgcmVhZG9ubHlDb250ZXh0TGlzdDogYW55O1xuICBsYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdyb3VwIHtcbiAgbGV2ZWwgPSAwO1xuICBwYXJlbnQ6IEdyb3VwO1xuICBleHBhbmRlZCA9IHRydWU7XG4gIHRvdGFsQ291bnRzID0gMDtcbiAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhcmVudCB8fCAodGhpcy5wYXJlbnQudmlzaWJsZSAmJiB0aGlzLnBhcmVudC5leHBhbmRlZCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxpc3QtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LXZpZXcuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0U29ydE1vZHVsZSxcbiAgICBEcmFnRHJvcE1vZHVsZSxcbiAgICBDZGtEcm9wTGlzdCxcbiAgICBDZGtEcmFnLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0UmFkaW9Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBmb3J3YXJkUmVmKCgpID0+IENvbXBvbmVudE1hcHBlckNvbXBvbmVudClcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQ7XG5cbiAgQElucHV0KCkgcENvbm4kOiB0eXBlb2YgUENvbm5lY3Q7XG4gIEBJbnB1dCgpIGJJbkZvcm0kID0gdHJ1ZTtcbiAgQElucHV0KCkgcGF5bG9hZDtcblxuICByZXBlYXRMaXN0JDogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIGZpZWxkcyQ6IGFueVtdO1xuXG4gIGRpc3BsYXllZENvbHVtbnMkID0gQXJyYXk8YW55PigpO1xuICBncm91cEJ5Q29sdW1ucyQ6IHN0cmluZ1tdID0gW107XG5cbiAgY29uZmlnUHJvcHMkOiBMaXN0Vmlld1Byb3BzO1xuXG4gIHVwZGF0ZWRSZWZMaXN0OiBhbnk7XG5cbiAgcmVwZWF0TGlzdERhdGE6IGFueVtdID0gW107XG5cbiAgc2VhcmNoSWNvbiQ6IHN0cmluZztcblxuICBiU2hvd1NlYXJjaCQgPSBmYWxzZTtcbiAgYkNvbHVtblJlb3JkZXIkID0gZmFsc2U7XG4gIGJHcm91cGluZyQgPSBmYWxzZTtcblxuICBwZXJmRmlsdGVyOiBzdHJpbmc7XG4gIHNlYXJjaEZpbHRlcjogc3RyaW5nO1xuXG4gIG1lbnVTdmdJY29uJDogc3RyaW5nO1xuICBhcnJvd1N2Z0ljb24kID0gJyc7XG4gIGFycm93RG93blN2Z0ljb24kOiBzdHJpbmc7XG4gIGFycm93VXBTdmdJY29uJDogc3RyaW5nO1xuXG4gIGZpbHRlclN2Z0ljb24kOiBzdHJpbmc7XG4gIGZpbHRlck9uU3ZnSWNvbiQ6IHN0cmluZztcbiAgZ3JvdXBCeVN2Z0ljb24kOiBzdHJpbmc7XG5cbiAgY29tcGFyZVR5cGU6IHN0cmluZztcbiAgY29tcGFyZVJlZjogc3RyaW5nO1xuICBhcnJvd0RpcmVjdGlvbiA9ICdkb3duJztcblxuICBmaWx0ZXJCeUNvbHVtbnM6IGFueVtdID0gW107XG4gIGJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcbiAgYkNvbnRhaW5zJCA9IHRydWU7XG4gIGJEYXRlVGltZSQgPSBmYWxzZTtcblxuICBmaWx0ZXJDb250YWluc0xhYmVsJCA9ICcnO1xuICBmaWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgZmlsdGVyQ29udGFpbnNWYWx1ZSQ6IGFueTtcblxuICBiSXNEYXRlJCA9IGZhbHNlO1xuICBiSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgYklzVGltZSQgPSBmYWxzZTtcblxuICBjdXJyZW50RmlsdGVyUmVmRGF0YTogYW55O1xuICBjdXJyZW50RmlsdGVySW1hZ2VFbDogYW55O1xuXG4gIGFyRmlsdGVyTWFpbkJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBhckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBzZWxlY3Rpb25Nb2RlPzogc3RyaW5nO1xuICBzaW5nbGVTZWxlY3Rpb25Nb2RlOiBib29sZWFuO1xuICBtdWx0aVNlbGVjdGlvbk1vZGU6IGJvb2xlYW47XG4gIHJvd0lEOiBhbnk7XG4gIHJlc3BvbnNlOiBhbnk7XG4gIGNvbXBvc2l0ZUtleXM6IGFueTtcbiAgc2hvd0R5bmFtaWNGaWVsZHM6IGFueTtcbiAgZmlsdGVyczogYW55ID0ge307XG4gIHNlbGVjdFBhcmFtOiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJQYXlsb2FkOiBhbnk7XG4gIHJlZjogYW55ID0ge307XG4gIGNvc21vc1RhYmxlUmVmOiBhbnk7XG4gIGxpc3RDb250ZXh0OiBhbnkgPSB7fTtcbiAgcXVlcnk6IGFueSA9IG51bGw7XG4gIHBhZ2luZzogYW55O1xuICBmaWVsZERlZnM6IGFueTtcbiAgeFJheUFwaXMgPSBQQ29yZS5nZXREZWJ1Z2dlcigpLmdldFhSYXlSdW50aW1lKCk7XG4gIHhSYXlVaWQgPSB0aGlzLnhSYXlBcGlzLnN0YXJ0WFJheSgpO1xuICBjaGVja0JveFZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwc1NlcnZpY2U6IFByb2dyZXNzU3Bpbm5lclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHNcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnUHJvcHMkID0gdGhpcy5wQ29ubiQuZ2V0Q29uZmlnUHJvcHMoKSBhcyBMaXN0Vmlld1Byb3BzO1xuICAgIC8qKiBCeSBkZWZhdWx0LCBweUdVSUQgaXMgdXNlZCBmb3IgRGF0YSBjbGFzc2VzIGFuZCBweUlEIGlzIGZvciBXb3JrIGNsYXNzZXMgYXMgcm93LWlkL2tleSAqL1xuICAgIGNvbnN0IGRlZlJvd0lEID0gdGhpcy5jb25maWdQcm9wcyQ/LnJlZmVyZW5jZVR5cGUgPT09ICdDYXNlJyA/ICdweUlEJyA6ICdweUdVSUQnO1xuICAgIC8qKiBJZiBjb21wb3NpdGVLZXlzIGlzIGRlZmluZWQsIHVzZSBkeW5hbWljIHZhbHVlLCBlbHNlIGZhbGxiYWNrIHRvIHB5SUQgb3IgcHlHVUlELiAqL1xuICAgIHRoaXMuY29tcG9zaXRlS2V5cyA9IHRoaXMuY29uZmlnUHJvcHMkPy5jb21wb3NpdGVLZXlzO1xuICAgIHRoaXMucm93SUQgPSB0aGlzLmNvbXBvc2l0ZUtleXMgJiYgdGhpcy5jb21wb3NpdGVLZXlzPy5sZW5ndGggPT09IDEgPyB0aGlzLmNvbXBvc2l0ZUtleXNbMF0gOiBkZWZSb3dJRDtcbiAgICB0aGlzLmJTaG93U2VhcmNoJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkPy5nbG9iYWxTZWFyY2ggPyB0aGlzLmNvbmZpZ1Byb3BzJC5nbG9iYWxTZWFyY2ggOiB0aGlzLnBheWxvYWQ/Lmdsb2JhbFNlYXJjaCk7XG4gICAgdGhpcy5iQ29sdW1uUmVvcmRlciQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZSh0aGlzLmNvbmZpZ1Byb3BzJC5yZW9yZGVyRmllbGRzKTtcbiAgICB0aGlzLmJHcm91cGluZyQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZSh0aGlzLmNvbmZpZ1Byb3BzJC5ncm91cGluZyk7XG4gICAgdGhpcy5zaG93RHluYW1pY0ZpZWxkcyA9IHRoaXMuY29uZmlnUHJvcHMkPy5zaG93RHluYW1pY0ZpZWxkcztcblxuICAgIHRoaXMubWVudVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnbW9yZScsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICB0aGlzLmFycm93RG93blN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnYXJyb3ctZG93bicsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICB0aGlzLmFycm93VXBTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ2Fycm93LXVwJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5maWx0ZXJTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ2ZpbHRlcicsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICB0aGlzLmZpbHRlck9uU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXItb24nLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5ncm91cEJ5U3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdyb3cnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSB0aGlzLmNvbmZpZ1Byb3BzJC5zZWxlY3Rpb25Nb2RlO1xuXG4gICAgdGhpcy5jaGVja0JveFZhbHVlID0gdGhpcy5jb25maWdQcm9wcyQudmFsdWU7XG5cbiAgICB0aGlzLmFyRmlsdGVyTWFpbkJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ3N1Ym1pdCcsIGpzQWN0aW9uOiAnc3VibWl0JywgbmFtZTogJ1N1Ym1pdCcgfSk7XG4gICAgdGhpcy5hckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ2NhbmNlbCcsIGpzQWN0aW9uOiAnY2FuY2VsJywgbmFtZTogJ0NhbmNlbCcgfSk7XG5cbiAgICBsZXQgdGl0bGUgPSB0aGlzLmNvbmZpZ1Byb3BzJD8udGl0bGUgfHwgdGhpcy5jb25maWdQcm9wcyQ/LmxhYmVsIHx8ICdMaXN0JztcbiAgICBjb25zdCBpbmhlcml0ZWRQcm9wcyA9IHRoaXMuY29uZmlnUHJvcHMkPy5pbmhlcml0ZWRQcm9wcztcbiAgICBpZiAodGl0bGUgPT09ICdMaXN0JyAmJiBpbmhlcml0ZWRQcm9wcykge1xuICAgICAgZm9yIChjb25zdCBpbmhlcml0ZWRQcm9wIG9mIGluaGVyaXRlZFByb3BzKSB7XG4gICAgICAgIGlmIChpbmhlcml0ZWRQcm9wPy5wcm9wID09PSAnbGFiZWwnKSB7XG4gICAgICAgICAgdGl0bGUgPSBpbmhlcml0ZWRQcm9wPy52YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxhYmVsID0gdGl0bGU7XG5cbiAgICB0aGlzLnNlYXJjaEljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnc2VhcmNoJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkVWRU5UX0RBU0hCT0FSRF9GSUxURVJfQ0hBTkdFLFxuICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXJDaGFuZ2UoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIGBkYXNoYm9hcmQtY29tcG9uZW50LSR7J2lkJ31gLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgKTtcbiAgICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkuc3Vic2NyaWJlKFxuICAgICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5FVkVOVF9EQVNIQk9BUkRfRklMVEVSX0NMRUFSX0FMTCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHt9O1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGBkYXNoYm9hcmQtY29tcG9uZW50LSR7J2lkJ31gLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgKTtcbiAgICB9LCAwKTtcbiAgICBpZiAodGhpcy5jb25maWdQcm9wcyQpIHtcbiAgICAgIGlmICghdGhpcy5wYXlsb2FkKSB7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHsgcmVmZXJlbmNlTGlzdDogdGhpcy5jb25maWdQcm9wcyQucmVmZXJlbmNlTGlzdCB9O1xuICAgICAgfVxuICAgICAgaW5pdCh7XG4gICAgICAgIHBDb25uJDogdGhpcy5wQ29ubiQsXG4gICAgICAgIGJJbkZvcm0kOiB0aGlzLmJJbkZvcm0kLFxuICAgICAgICAuLi50aGlzLnBheWxvYWQsXG4gICAgICAgIGxpc3RDb250ZXh0OiB0aGlzLmxpc3RDb250ZXh0LFxuICAgICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgICBzaG93RHluYW1pY0ZpZWxkczogdGhpcy5zaG93RHluYW1pY0ZpZWxkcyxcbiAgICAgICAgeFJheVVpZDogdGhpcy54UmF5VWlkLFxuICAgICAgICBjb3Ntb3NUYWJsZVJlZjogdGhpcy5jb3Ntb3NUYWJsZVJlZixcbiAgICAgICAgc2VsZWN0aW9uTW9kZTogdGhpcy5zZWxlY3Rpb25Nb2RlXG4gICAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5saXN0Q29udGV4dCA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmdldExpc3REYXRhKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRGaWVsZEZyb21GaWx0ZXIoZmlsdGVyLCBkYXRlUmFuZ2UgPSBmYWxzZSkge1xuICAgIGxldCBmaWVsZFZhbHVlO1xuICAgIGlmIChkYXRlUmFuZ2UpIHtcbiAgICAgIGZpZWxkVmFsdWUgPSBmaWx0ZXI/LkFORFswXT8uY29uZGl0aW9uLmxocy5maWVsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRWYWx1ZSA9IGZpbHRlcj8uY29uZGl0aW9uLmxocy5maWVsZDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkVmFsdWU7XG4gIH1cblxuICAvLyBXaWxsIGJlIHRyaWdnZXJlZCB3aGVuIEVWRU5UX0RBU0hCT0FSRF9GSUxURVJfQ0hBTkdFIGZpcmVzXG4gIHByb2Nlc3NGaWx0ZXJDaGFuZ2UoZGF0YSkge1xuICAgIGNvbnN0IHsgZmlsdGVySWQsIGZpbHRlckV4cHJlc3Npb24gfSA9IGRhdGE7XG4gICAgbGV0IGRhc2hib2FyZEZpbHRlclBheWxvYWQ6IGFueSA9IHtcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIGZpbHRlcjoge30sXG4gICAgICAgIHNlbGVjdDogW11cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5maWx0ZXJzW2ZpbHRlcklkXSA9IGZpbHRlckV4cHJlc3Npb247XG4gICAgbGV0IGlzRGF0ZVJhbmdlID0gISFkYXRhLmZpbHRlckV4cHJlc3Npb24/LkFORDtcbiAgICAvLyBXaWxsIGJlIEFORCBieSBkZWZhdWx0IGJ1dCBtYWtpbmcgaXQgZHluYW1pYyBpbiBjYXNlIHdlIHN1cHBvcnQgZHluYW1pYyByZWxhdGlvbmFsIG9wcyBpbiBmdXR1cmVcbiAgICBjb25zdCByZWxhdGlvbmFsT3AgPSAnQU5EJztcblxuICAgIGxldCBmaWVsZCA9IHRoaXMuZ2V0RmllbGRGcm9tRmlsdGVyKGZpbHRlckV4cHJlc3Npb24sIGlzRGF0ZVJhbmdlKTtcbiAgICBjb25zdCBzZWxlY3RQYXJhbTogYW55W10gPSBbXTtcbiAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIHNlbGVjdCBwYXJhbWV0ZXJzIGxpc3QgKHdpbGwgYmUgc2VudCBpbiBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkKVxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/LmZvckVhY2goY29sID0+IHtcbiAgICAgIHNlbGVjdFBhcmFtLnB1c2goe1xuICAgICAgICBmaWVsZDogY29sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGlmIHRoZSB0cmlnZ2VyZWQgZmlsdGVyIGlzIGFwcGxpY2FibGUgZm9yIHRoaXMgbGlzdFxuICAgIGlmIChkYXRhLmZpbHRlckV4cHJlc3Npb24gIT09IG51bGwgJiYgISh0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5sZW5ndGggJiYgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8uaW5jbHVkZXMoZmllbGQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGlzIGlzIGEgZmxhZyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVzZXQgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCBpbiBjYXNlIHdlIGRvbid0IGZpbmQgYW55IHZhbGlkIGZpbHRlcnNcbiAgICBsZXQgdmFsaWRGaWx0ZXIgPSBmYWxzZTtcblxuICAgIGxldCBpbmRleCA9IDE7XG4gICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGN1cnJlbnQgZmlsdGVycyBsaXN0IHRvIGNyZWF0ZSBmaWx0ZXIgZGF0YSB3aGljaCB3aWxsIGJlIFBPU1RlZFxuICAgIGNvbnN0IGZpbHRlcktleXM6IGFueVtdID0gT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKTtcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZXM6IGFueVtdID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZpbHRlcnMpO1xuICAgIGZvciAobGV0IGZpbHRlckluZGV4ID0gMDsgZmlsdGVySW5kZXggPCBmaWx0ZXJLZXlzLmxlbmd0aDsgZmlsdGVySW5kZXgrKykge1xuICAgICAgY29uc3QgZmlsdGVyID0gZmlsdGVyVmFsdWVzW2ZpbHRlckluZGV4XTtcbiAgICAgIC8vIElmIHRoZSBmaWx0ZXIgaXMgbnVsbCB0aGVuIHdlIGNhbiBza2lwIHRoaXMgaXRlcmF0aW9uXG4gICAgICBpZiAoZmlsdGVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIGZpbHRlciBpcyBvZiB0eXBlLSBEYXRlIFJhbmdlXG4gICAgICBpc0RhdGVSYW5nZSA9ICEhZmlsdGVyPy5BTkQ7XG4gICAgICBmaWVsZCA9IHRoaXMuZ2V0RmllbGRGcm9tRmlsdGVyKGZpbHRlciwgaXNEYXRlUmFuZ2UpO1xuXG4gICAgICBpZiAoISh0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5sZW5ndGggJiYgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8uaW5jbHVkZXMoZmllbGQpKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSByZWFjaCBoZXJlIHRoYXQgaW1wbGllcyB3ZSd2ZSBhdCBsZWFzdCBvbmUgdmFsaWQgZmlsdGVyLCBoZW5jZSBzZXR0aW5nIHRoZSBmbGFnXG4gICAgICB2YWxpZEZpbHRlciA9IHRydWU7XG4gICAgICAvKiogQmVsb3cgYXJlIHRoZSAyIGNhc2VzIGZvci0gVGV4dCAmIERhdGUtUmFuZ2UgZmlsdGVyIHR5cGVzIHdoZXJlIHdlJ2xsIGNvbnN0cnVjdCBmaWx0ZXIgZGF0YSB3aGljaCB3aWxsIGJlIHNlbnQgaW4gdGhlIGRhc2hib2FyZEZpbHRlclBheWxvYWRcbiAgICAgICAqIEluIENvbnN0ZWxsYXRpb24gRFggQ29tcG9uZW50cywgdGhyb3VnaCBSZXBlYXRpbmcgU3RydWN0dXJlcyB0aGV5IG1pZ2h0IGJlIHVzaW5nIHNldmVyYWwgQVBJcyB0byBkbyBpdC4gV2UncmUgZG9pbmcgaXQgaGVyZVxuICAgICAgICovXG4gICAgICBpZiAoaXNEYXRlUmFuZ2UpIHtcbiAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCA9IHRoaXMuZmlsdGVyQmFzZWRPbkRhdGVSYW5nZShkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLCBmaWx0ZXIsIHJlbGF0aW9uYWxPcCwgc2VsZWN0UGFyYW0sIGluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmZpbHRlckNvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgLi4uZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyxcbiAgICAgICAgICBbYFQke2luZGV4Kyt9YF06IHsgLi4uZmlsdGVyLmNvbmRpdGlvbiwgaWdub3JlQ2FzZTogdHJ1ZSB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljKSB7XG4gICAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgJHtkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpY30gJHtyZWxhdGlvbmFsT3B9IFQke2luZGV4IC0gMX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljID0gYFQke2luZGV4IC0gMX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5zZWxlY3QgPSBzZWxlY3RQYXJhbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCBpZiB3ZSBlbmQgdXAgd2l0aCBubyB2YWxpZCBmaWx0ZXJzIGZvciB0aGUgbGlzdFxuICAgIGlmICghdmFsaWRGaWx0ZXIpIHtcbiAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyUGF5bG9hZCA9IGRhc2hib2FyZEZpbHRlclBheWxvYWQ7XG4gICAgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICB9XG5cbiAgZmlsdGVyQmFzZWRPbkRhdGVSYW5nZShkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLCBmaWx0ZXIsIHJlbGF0aW9uYWxPcCwgc2VsZWN0UGFyYW0sIGluZGV4KSB7XG4gICAgY29uc3QgZGF0ZVJlbGF0aW9uYWxPcCA9IGZpbHRlcj8uQU5EID8gJ0FORCcgOiAnT1InO1xuICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmZpbHRlckNvbmRpdGlvbnMgPSB7XG4gICAgICAuLi5kYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5maWx0ZXJDb25kaXRpb25zLFxuICAgICAgW2BUJHtpbmRleCsrfWBdOiB7IC4uLmZpbHRlcltyZWxhdGlvbmFsT3BdWzBdLmNvbmRpdGlvbiB9LFxuICAgICAgW2BUJHtpbmRleCsrfWBdOiB7IC4uLmZpbHRlcltyZWxhdGlvbmFsT3BdWzFdLmNvbmRpdGlvbiB9XG4gICAgfTtcbiAgICBpZiAoZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMpIHtcbiAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljID0gYCR7ZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWN9ICR7cmVsYXRpb25hbE9wfSAoVCR7aW5kZXggLSAyfSAke2RhdGVSZWxhdGlvbmFsT3B9IFQke1xuICAgICAgICBpbmRleCAtIDFcbiAgICAgIH0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgKFQke2luZGV4IC0gMn0gJHtyZWxhdGlvbmFsT3B9IFQke2luZGV4IC0gMX0pYDtcbiAgICB9XG5cbiAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LnNlbGVjdCA9IHNlbGVjdFBhcmFtO1xuXG4gICAgcmV0dXJuIGRhc2hib2FyZEZpbHRlclBheWxvYWQ7XG4gIH1cblxuICBwcm9jZXNzRmlsdGVyQ2xlYXIoKSB7XG4gICAgdGhpcy5maWx0ZXJQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgfVxuXG4gIGdldEZpZWxkc01ldGFkYXRhKHJlZkxpc3QpIHtcbiAgICAvLyBAdHMtaWdub3JlIC0gM3JkIHBhcmFtZXRlciBcImFzc29jaWF0aW9uRmlsdGVyXCIgc2hvdWxkIGJlIG9wdGlvbmFsIGZvciBnZXREYXRhVmlld01ldGFkYXRhIG1ldGhvZFxuICAgIHJldHVybiBQQ29yZS5nZXRBbmFseXRpY3NVdGlscygpLmdldERhdGFWaWV3TWV0YWRhdGEocmVmTGlzdCwgdGhpcy5zaG93RHluYW1pY0ZpZWxkcyk7XG4gIH1cblxuICBnZXRMaXN0RGF0YSgpIHtcbiAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSB0aGlzLnBDb25uJC5nZXRDb21wb25lbnRDb25maWcoKTtcbiAgICBpZiAodGhpcy5jb25maWdQcm9wcyQpIHtcbiAgICAgIHRoaXMucHJlcGFyZVBheWxvYWQoKTtcbiAgICAgIGNvbnN0IHJlZkxpc3QgPSB0aGlzLmNvbmZpZ1Byb3BzJC5yZWZlcmVuY2VMaXN0O1xuICAgICAgY29uc3QgZmllbGRzTWV0YURhdGFQcm9taXNlID0gdGhpcy5nZXRGaWVsZHNNZXRhZGF0YShyZWZMaXN0KTtcbiAgICAgIC8vIHJldHVybnMgYSBwcm9taXNlXG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5wYXlsb2FkIHx8IHRoaXMuZmlsdGVyUGF5bG9hZCB8fCB7fTtcbiAgICAgIGNvbnN0IGRhdGFWaWV3UGFyYW1ldGVycyA9IHRoaXMucGF5bG9hZC5wYXJhbWV0ZXJzO1xuXG4gICAgICBjb25zdCB3b3JrTGlzdERhdGFQcm9taXNlID0gIXRoaXMuYkluRm9ybSRcbiAgICAgICAgPyBQQ29yZS5nZXREYXRhQXBpVXRpbHMoKS5nZXREYXRhKHJlZkxpc3QsIHBheWxvYWQpXG4gICAgICAgIDogUENvcmUuZ2V0RGF0YVBhZ2VVdGlscygpLmdldERhdGFBc3luYyhcbiAgICAgICAgICAgIHJlZkxpc3QsXG4gICAgICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpLFxuICAgICAgICAgICAgcGF5bG9hZC5kYXRhVmlld1BhcmFtZXRlcnMgPyBwYXlsb2FkLmRhdGFWaWV3UGFyYW1ldGVycyA6IGRhdGFWaWV3UGFyYW1ldGVycyxcbiAgICAgICAgICAgIHRoaXMucGFnaW5nLFxuICAgICAgICAgICAgdGhpcy5xdWVyeVxuICAgICAgICAgICk7XG5cbiAgICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLnBzU2VydmljZS5zZW5kTWVzc2FnZSh0cnVlKTtcblxuICAgICAgUHJvbWlzZS5hbGwoW2ZpZWxkc01ldGFEYXRhUHJvbWlzZSwgd29ya0xpc3REYXRhUHJvbWlzZV0pXG4gICAgICAgIC50aGVuKChyZXN1bHRzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWVsZHNNZXRhRGF0YSA9IHJlc3VsdHNbMF07XG4gICAgICAgICAgY29uc3Qgd29ya0xpc3REYXRhID0gcmVzdWx0c1sxXTtcblxuICAgICAgICAgIHRoaXMuZmllbGRzJCA9IHRoaXMuY29uZmlnUHJvcHMkLnByZXNldHNbMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW47XG4gICAgICAgICAgLy8gdGhpcyBpcyBhbiB1bnJlc292bGVkIHZlcnNpb24gb2YgdGhpcy5maWVsZHMkLCBuZWVkIHVucmVzb2x2ZWQsIHNvIGNhbiBnZXQgdGhlIHByb3BlcnR5IHJlZmVyZW5jZVxuICAgICAgICAgIGNvbnN0IGNvbHVtbkZpZWxkcyA9IGNvbXBvbmVudENvbmZpZy5wcmVzZXRzWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuO1xuXG4gICAgICAgICAgY29uc3QgdGFibGVEYXRhUmVzdWx0cyA9ICF0aGlzLmJJbkZvcm0kID8gd29ya0xpc3REYXRhLmRhdGEuZGF0YSA6IHdvcmtMaXN0RGF0YS5kYXRhO1xuXG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0SGVhZGVyQ2VsbHMoY29sdW1uRmllbGRzLCB0aGlzLmZpZWxkRGVmcyk7XG4gICAgICAgICAgdGhpcy5maWVsZHMkID0gdGhpcy51cGRhdGVGaWVsZHModGhpcy5maWVsZHMkLCBmaWVsZHNNZXRhRGF0YS5kYXRhLmZpZWxkcywgY29sdW1ucyk7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJCA9IGNvbHVtbnMubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29sLmlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB0YWJsZURhdGFSZXN1bHRzO1xuICAgICAgICAgIHRoaXMudXBkYXRlZFJlZkxpc3QgPSB0aGlzLnVwZGF0ZURhdGEodGFibGVEYXRhUmVzdWx0cywgdGhpcy5maWVsZHMkKTtcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBTRUxFQ1RJT05fTU9ERS5TSU5HTEUgJiYgdGhpcy51cGRhdGVkUmVmTGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8udW5zaGlmdCgnc2VsZWN0Jyk7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZVNlbGVjdGlvbk1vZGUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBTRUxFQ1RJT05fTU9ERS5NVUxUSSAmJiB0aGlzLnVwZGF0ZWRSZWZMaXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy51bnNoaWZ0KCdzZWxlY3QnKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3Rpb25Nb2RlID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnJlcGVhdExpc3QkID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLnVwZGF0ZWRSZWZMaXN0KTtcbiAgICAgICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlclByZWRpY2F0ZSA9IHRoaXMuY3VzdG9tRmlsdGVyUHJlZGljYXRlLmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAvLyBrZWVwaW5nIGFuIG9yaWdpbmFsIGNvcHkgdG8gZ2V0IGJhY2sgYWZ0ZXIgcG9zc2libGUgc29ydHMsIGZpbHRlcnMgYW5kIGdyb3VwQnlcbiAgICAgICAgICB0aGlzLnJlcGVhdExpc3REYXRhID0gdGhpcy5yZXBlYXRMaXN0JC5kYXRhLnNsaWNlKCk7XG5cbiAgICAgICAgICB0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQuc29ydCA9IHRoaXMuc29ydDtcbiAgICAgICAgICB0aGlzLnBzU2VydmljZS5zZW5kTWVzc2FnZShmYWxzZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkbid0IGZldGNoIGVpdGhlciB0aGUgZmllbGRzTWV0YURhdGEgb3Igd29ya0xpc3REYXRhXCIpO1xuICAgICAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZVBheWxvYWQoKSB7XG4gICAgY29uc3QgeyBmaWVsZERlZnMsIGl0ZW1LZXksIHBhdGNoUXVlcnlGaWVsZHMgfSA9IHRoaXMubGlzdENvbnRleHQubWV0YTtcbiAgICB0aGlzLmZpZWxkRGVmcyA9IGZpZWxkRGVmcztcbiAgICBsZXQgbGlzdEZpZWxkcyA9IGZpZWxkRGVmcyA/IHRoaXMuYnVpbGRTZWxlY3QoZmllbGREZWZzLCB1bmRlZmluZWQsIHBhdGNoUXVlcnlGaWVsZHMsIHRoaXMucGF5bG9hZD8uY29tcG9zaXRlS2V5cykgOiBbXTtcbiAgICBsaXN0RmllbGRzID0gdGhpcy5hZGRJdGVtS2V5SW5TZWxlY3QoZmllbGREZWZzLCBpdGVtS2V5LCBsaXN0RmllbGRzLCB0aGlzLnBheWxvYWQ/LmNvbXBvc2l0ZUtleXMpO1xuICAgIGlmICh0aGlzLnBheWxvYWQucXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnBheWxvYWQucXVlcnk7XG4gICAgfSBlbHNlIGlmIChsaXN0RmllbGRzPy5sZW5ndGggJiYgdGhpcy5saXN0Q29udGV4dC5tZXRhLmlzUXVlcnlhYmxlKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJQYXlsb2FkKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7XG4gICAgICAgICAgc2VsZWN0OiBsaXN0RmllbGRzLFxuICAgICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXJQYXlsb2FkPy5xdWVyeT8uZmlsdGVyXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0geyBzZWxlY3Q6IGxpc3RGaWVsZHMgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZmlsdGVyUGF5bG9hZCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuZmlsdGVyUGF5bG9hZD8ucXVlcnk7XG4gICAgfVxuICB9XG4gIC8vIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgLy8gICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLnBheWxvYWQpIHtcbiAgLy8gICAgIGNvbnN0IGN1cnJlbnRQYXlsb2FkVmFsID0gY2hhbmdlcy5wYXlsb2FkPy5jdXJyZW50VmFsdWU7XG4gIC8vICAgICBjb25zdCBwcmV2aW91c1BheWxvYWRWYWwgPSBjaGFuZ2VzLnBheWxvYWQ/LnByZXZpb3VzVmFsdWU7XG4gIC8vICAgICBpZiAoY3VycmVudFBheWxvYWRWYWwgIT09IHByZXZpb3VzUGF5bG9hZFZhbCkge1xuICAvLyAgICAgICB0aGlzLmdldExpc3REYXRhKCk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS51bnN1YnNjcmliZShcbiAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkVWRU5UX0RBU0hCT0FSRF9GSUxURVJfQ0hBTkdFLFxuICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgKTtcbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFxuICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DTEVBUl9BTEwsXG4gICAgICBgZGFzaGJvYXJkLWNvbXBvbmVudC0keydpZCd9YCxcbiAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKClcbiAgICApO1xuICB9XG5cbiAgLy8gbmdBZnRlclZpZXdJbml0KCkge1xuICAvLyAgIC8vIHBhZ2luYXRvciBoYXMgdG8gZXhpc3QgZm9yIHRoaXMgdG8gd29yayxcbiAgLy8gICAvLyBzbyBjYWxsZWQgYWZ0ZXIgaW5pdCAocGFnaW5hdG9yIGRyYXduKVxuICAvLyAgIC8vIENhbGxzIGFyZSBub3cgaW4gd29ya0xpc3REYXRhIHByb21pc2VcbiAgLy8gICAvLyB0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAvLyAgIC8vIHRoaXMucmVwZWF0TGlzdCQuc29ydCA9IHRoaXMuc29ydDtcbiAgLy8gfVxuXG4gIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPikge1xuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmRpc3BsYXllZENvbHVtbnMkLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICB9XG5cbiAgdXBkYXRlRmllbGRzKGFyRmllbGRzOiBhbnlbXSwgYXJDb2x1bW5zLCBmaWVsZHMpOiBhbnlbXSB7XG4gICAgY29uc3QgYXJSZXR1cm4gPSBhckZpZWxkcztcbiAgICBhclJldHVybi5mb3JFYWNoKChmaWVsZCwgaSkgPT4ge1xuICAgICAgZmllbGQuY29uZmlnID0geyAuLi5maWVsZC5jb25maWcsIC4uLmZpZWxkc1tpXSwgbmFtZTogZmllbGRzW2ldLmlkIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIGFyUmV0dXJuO1xuICB9XG5cbiAgYXBwbHlTZWFyY2goZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMuc2VhcmNoRmlsdGVyID0gZmlsdGVyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAodGhpcy5ncm91cEJ5Q29sdW1ucyQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5kYXRhID0gdGhpcy5yZXBlYXRMaXN0RGF0YS5zbGljZSgpO1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnNlYXJjaEZpbHRlcjtcbiAgICAgIGNvbnN0IHJlcGVhdERhdGEgPSB0aGlzLnJlcGVhdExpc3QkLnNvcnREYXRhKHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyZWREYXRhLCB0aGlzLnJlcGVhdExpc3QkLnNvcnQgYXMgTWF0U29ydCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEgPSB0aGlzLmFkZEdyb3VwcyhyZXBlYXREYXRhLCB0aGlzLmdyb3VwQnlDb2x1bW5zJCk7XG5cbiAgICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMucGVyZkZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnNlYXJjaEZpbHRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIGlzQ2hlY2tlZChyb3dJbik6IGFueSB7XG4gICAgY29uc3QgaW5pdGlhbFZhbCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1Byb3BzJD8ucmVhZG9ubHlDb250ZXh0TGlzdD8ucmVkdWNlKChhY2MsIGN1cnJSb3cpID0+IHtcbiAgICAgIHJldHVybiBhY2MgfHwgcm93SW5bdGhpcy5yb3dJRF0gPT09IGN1cnJSb3dbdGhpcy5yb3dJRF07XG4gICAgfSwgaW5pdGlhbFZhbCk7XG4gIH1cblxuICBmaWVsZE9uQ2hhbmdlKHJvdykge1xuICAgIGNvbnN0IHZhbHVlID0gcm93W3RoaXMucm93SURdO1xuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xuICAgIGlmICh0aGlzLmNvbXBvc2l0ZUtleXM/Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNwb25zZS5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50W3RoaXMucm93SURdID09PSB2YWx1ZSk7XG4gICAgICBjb25zdCBzZWxlY3RlZFJvdyA9IHRoaXMucmVzcG9uc2VbaW5kZXhdO1xuICAgICAgdGhpcy5jb21wb3NpdGVLZXlzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIHJlcU9ialtlbGVtZW50XSA9IHNlbGVjdGVkUm93W2VsZW1lbnRdO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcU9ialt0aGlzLnJvd0lEXSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrQm94VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnBDb25uJD8uZ2V0TGlzdEFjdGlvbnM/LigpPy5zZXRTZWxlY3RlZFJvd3MoW3JlcU9ial0pO1xuICB9XG5cbiAgb25DaGVja2JveENsaWNrKHJvdywgZXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1t0aGlzLnJvd0lEXTtcbiAgICBjb25zdCBjaGVja2VkID0gZXZlbnQ/LmNoZWNrZWQ7XG4gICAgY29uc3QgcmVxT2JqOiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5jb21wb3NpdGVLZXlzPy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzcG9uc2UuZmluZEluZGV4KGVsZW1lbnQgPT4gZWxlbWVudFt0aGlzLnJvd0lEXSA9PT0gdmFsdWUpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRSb3cgPSB0aGlzLnJlc3BvbnNlW2luZGV4XTtcbiAgICAgIHRoaXMuY29tcG9zaXRlS2V5cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICByZXFPYmpbZWxlbWVudF0gPSBzZWxlY3RlZFJvd1tlbGVtZW50XTtcbiAgICAgIH0pO1xuICAgICAgcmVxT2JqLiRzZWxlY3RlZCA9IGNoZWNrZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcU9ialt0aGlzLnJvd0lEXSA9IHZhbHVlO1xuICAgICAgcmVxT2JqLiRzZWxlY3RlZCA9IGNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMucENvbm4kPy5nZXRMaXN0QWN0aW9ucygpPy5zZXRTZWxlY3RlZFJvd3MoW3JlcU9ial0pO1xuICB9XG5cbiAgLy8gcm93Q2xpY2socm93KSB7XG4gIC8vICAgc3dpdGNoICh0aGlzLmNvbmZpZ1Byb3BzJC5yb3dDbGlja0FjdGlvbikge1xuICAvLyAgICAgY2FzZSAnb3BlbkFzc2lnbm1lbnQnOlxuICAvLyAgICAgICB0aGlzLnBzU2VydmljZS5zZW5kTWVzc2FnZSh0cnVlKTtcbiAgLy8gICAgICAgdGhpcy5vcGVuQXNzaWdubWVudChyb3cpO1xuICAvLyAgICAgICBicmVhaztcbiAgLy8gICB9XG4gIC8vIH1cblxuICBfZ2V0SWNvblN0eWxlKGxldmVsKTogc3RyaW5nIHtcbiAgICBsZXQgc1JldHVybiA9ICcnO1xuICAgIGxldCBuTGV2ZWwgPSBwYXJzZUludChsZXZlbCwgMTApO1xuICAgIG5MZXZlbC0tO1xuICAgIG5MZXZlbCAqPSAxNTtcbiAgICBzUmV0dXJuID0gYHBhZGRpbmctbGVmdDogJHtuTGV2ZWx9cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGVgO1xuXG4gICAgcmV0dXJuIHNSZXR1cm47XG4gIH1cblxuICBfZ2V0R3JvdXBOYW1lKGZpZWxkTmFtZSkge1xuICAgIGZvciAobGV0IGZpZWxkSW5kZXggPSAwOyBmaWVsZEluZGV4IDwgdGhpcy5maWVsZHMkLmxlbmd0aDsgZmllbGRJbmRleCsrKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzJFtmaWVsZEluZGV4XTtcbiAgICAgIGlmIChmaWVsZC5jb25maWcubmFtZSA9PSBmaWVsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmNvbmZpZy5sYWJlbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgX3Nob3dCdXR0b24obmFtZSwgcm93KSB7XG4gICAgbGV0IGJSZXR1cm4gPSBmYWxzZTtcbiAgICBjb25zdCB7IHB4UmVmT2JqZWN0Q2xhc3MsIHB6SW5zS2V5LCBweFJlZk9iamVjdEtleSB9ID0gcm93O1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAncHhUYXNrTGFiZWwnOlxuICAgICAgICBpZiAocHhSZWZPYmplY3RDbGFzcyAhPSAnJyAmJiBwekluc0tleSAhPSAnJykge1xuICAgICAgICAgIGJSZXR1cm4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHhSZWZPYmplY3RJbnNOYW1lJzpcbiAgICAgICAgaWYgKHB4UmVmT2JqZWN0Q2xhc3MgIT0gJycgJiYgcHhSZWZPYmplY3RLZXkgIT0gJycpIHtcbiAgICAgICAgICBiUmV0dXJuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBiUmV0dXJuO1xuICB9XG5cbiAgX2xpc3RWaWV3Q2xpY2soY29sdW1uLCByb3cpIHtcbiAgICBjb25zdCBuYW1lID0gY29sdW1uLmlkO1xuICAgIGlmIChjb2x1bW4uZGlzcGxheUFzTGluaykge1xuICAgICAgY29uc3QgeyBweE9iakNsYXNzIH0gPSByb3c7XG4gICAgICBsZXQgeyBwekluc0tleSB9ID0gcm93O1xuICAgICAgaWYgKGNvbHVtbi5pc0Fzc29jaWF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFzc29jaWF0aW9uQ2F0ZWdvcnkgPSBuYW1lLnNwbGl0KCc6JylbMF07XG4gICAgICAgIHB6SW5zS2V5ID0gcm93W2Ake2Fzc29jaWF0aW9uQ2F0ZWdvcnl9OnB6SW5zS2V5YF07XG4gICAgICB9XG4gICAgICBpZiAoY29sdW1uLmlzQXNzaWdubWVudExpbmspIHtcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Bc3NpZ25tZW50KHB6SW5zS2V5LCBweE9iakNsYXNzLCB7XG4gICAgICAgICAgY29udGFpbmVyTmFtZTogJ3ByaW1hcnknLFxuICAgICAgICAgIGNoYW5uZWxOYW1lOiAnJ1xuICAgICAgICB9IGFzIGFueSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBDb25uJC5nZXRBY3Rpb25zQXBpKCkub3BlbldvcmtCeUhhbmRsZShwekluc0tleSwgcHhPYmpDbGFzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlICdweFRhc2tMYWJlbCc6XG4gICAgICAgICAgdGhpcy5vcGVuQXNzaWdubWVudChyb3cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdweFJlZk9iamVjdEluc05hbWUnOlxuICAgICAgICAgIHRoaXMub3Blbldvcmsocm93KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfaGVhZGVyU29ydENsaWNrKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gaW1hZ2VzIDAgLSBmaWx0ZXIsIDEgLSBhcnJvdywgMiAtIG1vcmVcblxuICAgIC8qKiBDb21tZW50aW5nIHRoaXMgY29kZSBmb3Igbm93IGFzIGl0IGlzIGdpdmluZyBlcnJvcnMgbm90IHN1cmUgaWYgaXQgZXZlciB3b3JrZWQgKi9cbiAgICAvLyBsZXQgYXJyb3dJbWFnZSA9IGV2ZW50LnNyY0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpWzFdO1xuICAgIC8vIGxldCBhcnJvd0F0dHIgPSBhcnJvd0ltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3cnKTtcblxuICAgIC8vIHRoaXMuY2xlYXJPdXRBcnJvd3MoZXZlbnQsIGNvbHVtbkRhdGEpO1xuXG4gICAgLy8gc3dpdGNoIChhcnJvd0F0dHIpIHtcbiAgICAvLyAgIGNhc2UgJ3VwJzpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSB0aGlzLmFycm93RG93blN2Z0ljb24kO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnZG93bicpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGNhc2UgJ2Rvd24nOlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9ICcnO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnbm9uZScpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGRlZmF1bHQ6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gdGhpcy5hcnJvd1VwU3ZnSWNvbiQ7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICd1cCcpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyB9XG5cbiAgICB0aGlzLmNvbXBhcmVUeXBlID0gY29sdW1uRGF0YS50eXBlO1xuICAgIHRoaXMuY29tcGFyZVJlZiA9IGNvbHVtbkRhdGEuY29uZmlnLm5hbWU7XG4gICAgLy8gdGhpcy5hcnJvd0RpcmVjdGlvbiA9IGFycm93SW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuICAgIHRoaXMuYXJyb3dEaXJlY3Rpb24gPSB0aGlzLmFycm93RGlyZWN0aW9uID09PSAndXAnID8gJ2Rvd24nIDogJ3VwJztcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIC8vIENvbW1lbnRpbmcgYmVsb3cgbWV0aG9kLCBzaW5jZSB0aGUgY29kZSB3aGljaCBpcyB1c2luZyBpdCwgaXMgYWxyZWFkeSBjb21tZW50ZWRcbiAgLy8gY2xlYXJPdXRBcnJvd3MoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgLy8gICBjb25zdCBhckltYWdlcyA9IGV2ZW50LnNyY0VsZW1lbnQucGFyZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG5cbiAgLy8gICBmb3IgKGNvbnN0IHRoZUltYWdlIG9mIGFySW1hZ2VzKSB7XG4gIC8vICAgICAvLyBsZXQgdGhlSW1hZ2UgPSBhckltYWdlc1tpXVxuICAvLyAgICAgY29uc3QgYXJyb3cgPSB0aGVJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG4gIC8vICAgICBpZiAoYXJyb3cpIHtcbiAgLy8gICAgICAgY29uc3QgYXJyb3dJZCA9IHRoZUltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3dpZCcpO1xuICAvLyAgICAgICBpZiAoYXJyb3cgIT0gJ25vbmUnICYmIGFycm93SWQgIT0gY29sdW1uRGF0YS5jb25maWcubmFtZSkge1xuICAvLyAgICAgICAgIHRoZUltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnbm9uZScpO1xuICAvLyAgICAgICAgIHRoZUltYWdlLnNyYyA9ICcnO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgc29ydENvbXBhcmUoYSwgYik6IG51bWJlciB7XG4gICAgbGV0IGFWYWx1ZSA9IGFbdGhpcy5jb21wYXJlUmVmXTtcbiAgICBsZXQgYlZhbHVlID0gYlt0aGlzLmNvbXBhcmVSZWZdO1xuXG4gICAgaWYgKHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGUnIHx8IHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGVUaW1lJykge1xuICAgICAgYVZhbHVlID0gZ2V0U2Vjb25kcyhhVmFsdWUpO1xuICAgICAgYlZhbHVlID0gZ2V0U2Vjb25kcyhiVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBhcmVSZWYgPT0gJ3B4UmVmT2JqZWN0SW5zTmFtZScpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29tcGFyZUJ5Q29sdW1uUHhSZWZPYmplY3RJbnNOYW1lKGFWYWx1ZSwgYlZhbHVlKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5hcnJvd0RpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBpZiAoIWFWYWx1ZSB8fCBhVmFsdWUgPCBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFiVmFsdWUgfHwgYVZhbHVlID4gYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgaWYgKCFiVmFsdWUgfHwgYVZhbHVlID4gYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYVZhbHVlIHx8IGFWYWx1ZSA8IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXhYID0gYVZhbHVlLnNwbGl0KCctJyk7XG4gICAgY29uc3QgcHJlZml4WSA9IGJWYWx1ZS5zcGxpdCgnLScpO1xuICAgIHN3aXRjaCAodGhpcy5hcnJvd0RpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBpZiAocHJlZml4WFswXSAhPT0gcHJlZml4WVswXSkge1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdIDwgcHJlZml4WVswXSkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdID4gcHJlZml4WVswXSkgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeFhbMV0gLSBwcmVmaXhZWzFdO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGlmIChwcmVmaXhYWzBdICE9PSBwcmVmaXhZWzBdKSB7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPiBwcmVmaXhZWzBdKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPCBwcmVmaXhZWzBdKSByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4WVsxXSAtIHByZWZpeFhbMV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyRGlzcGxheSh0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gYWRkIGNsaWNrQXdheSBsaXN0ZW5lclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc0xhYmVsJCA9IGNvbHVtbkRhdGEuY29uZmlnLmxhYmVsO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlckRpc3BsYXkoY29sdW1uRGF0YS50eXBlKTtcblxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJWYXJzV2l0aEN1cnJlbnQoY29sdW1uRGF0YSk7XG5cbiAgICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBfY2xpY2tBd2F5KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgYkluUG9wVXAgPSBmYWxzZTtcblxuICAgIC8vIHJ1biB0aHJvdWdoIGxpc3Qgb2YgZWxlbWVudHMgaW4gcGF0aCwgaWYgbWVudSBub3QgaW4gdGggcGF0aCwgdGhlbiB3YW50IHRvXG4gICAgLy8gaGlkZSAodG9nZ2xlKSB0aGUgbWVudVxuICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50LnBhdGg7XG4gICAgZm9yIChsZXQgcGF0aEluZGV4ID0gMDsgcGF0aEluZGV4IDwgZXZlbnRQYXRoLmxlbmd0aDsgcGF0aEluZGV4KyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRQYXRoW3BhdGhJbmRleF0uY2xhc3NOYW1lID09ICdwc2RrLW1vZGFsLWZpbGUtdG9wJyB8fFxuICAgICAgICBldmVudFBhdGhbcGF0aEluZGV4XS50YWdOYW1lID09ICdCVVRUT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLnRhZ05hbWUgPT0gJ01BVC1PUFRJT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLnRhZ05hbWUgPT0gJ01BVC1JTlBVVCdcbiAgICAgICkge1xuICAgICAgICBiSW5Qb3BVcCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWJJblBvcFVwKSB7XG4gICAgICAvLyB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVHlwZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9IGV2ZW50LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zRGF0ZVZhbHVlKGV2ZW50LCB2YWx1ZSkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSB2YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc0RhdGVUaW1lVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVGltZVZhbHVlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9vbkZpbHRlckFjdGlvbkJ1dHRvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBtb2RhbCBidXR0b25zXG4gICAgc3dpdGNoIChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAgIHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEgPSBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdWJtaXQnOlxuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcldpdGhJbmZvKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyV2l0aEluZm8oKSB7XG4gICAgbGV0IGJGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLnJlZiA9PT0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICBmaWx0ZXJPYmoudHlwZSA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEudHlwZTtcbiAgICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID0gdGhpcy5maWx0ZXJDb250YWluc1R5cGUkO1xuICAgICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQ7XG5cbiAgICAgICAgYkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFiRm91bmQpIHtcbiAgICAgIC8vIGFkZCBpblxuICAgICAgY29uc3QgZmlsdGVyT2JqOiBhbnkgPSB7fTtcbiAgICAgIGZpbHRlck9iai5yZWYgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lO1xuICAgICAgZmlsdGVyT2JqLnR5cGUgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLnR5cGU7XG4gICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPSB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQ7XG4gICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQ7XG5cbiAgICAgIHRoaXMuZmlsdGVyQnlDb2x1bW5zLnB1c2goZmlsdGVyT2JqKTtcbiAgICB9XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZmlsdGVycyBhbmQgdXBkYXRlIGZpbHRlck9uIGljb25cbiAgICBmb3IgKGNvbnN0IGZpbHRlck9iaiBvZiB0aGlzLmZpbHRlckJ5Q29sdW1ucykge1xuICAgICAgY29uc3QgY29udGFpbnNGaWx0ZXJWYWx1ZSA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlO1xuICAgICAgY29uc3QgY29udGFpbnNGaWx0ZXIgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXI7XG4gICAgICBjb25zdCBmaWx0ZXJSZWYgPSBmaWx0ZXJPYmoucmVmO1xuICAgICAgY29uc3QgZmlsdGVySW5kZXggPSB0aGlzLmRpc3BsYXllZENvbHVtbnMkLmluZGV4T2YoZmlsdGVyUmVmKTtcbiAgICAgIGNvbnN0IGFyRmlsdGVySW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2ZpbHRlck9uSWNvbicpO1xuICAgICAgY29uc3QgZmlsdGVySW1nOiBhbnkgPSBhckZpbHRlckltZ1tmaWx0ZXJJbmRleF07XG4gICAgICBpZiAoY29udGFpbnNGaWx0ZXJWYWx1ZSA9PSAnJyAmJiBjb250YWluc0ZpbHRlciAhPSAnbnVsbCcgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ25vdG51bGwnKSB7XG4gICAgICAgIC8vIGNsZWFyIGljb25cbiAgICAgICAgZmlsdGVySW1nLnNyYyA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2hvdyBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSB0aGlzLmZpbHRlck9uU3ZnSWNvbiQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyVmFyc1dpdGhDdXJyZW50KGNvbHVtbkRhdGEpIHtcbiAgICAvLyBmaW5kIGN1cnJlbnQgcmVmLCBpZiBleGlzdHMsIG1vdmUgZGF0YSB0byB2YXJpYWJsZSB0byBkaXNwbGF5XG5cbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlO1xuXG4gICAgICAgIGJGb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYkZvdW5kKSB7XG4gICAgICBzd2l0Y2ggKGNvbHVtbkRhdGEudHlwZSkge1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSAnJztcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJEYXRhKGl0ZW06IGFueSkge1xuICAgIGxldCBiS2VlcCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSAnJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ251bGwnIHx8IGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9PSAnbm90bnVsbCcpIHtcbiAgICAgICAgbGV0IGZpbHRlclZhbHVlOiBhbnk7XG5cbiAgICAgICAgc3dpdGNoIChmaWx0ZXJPYmoudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICAgIGJLZWVwID0gdGhpcy5maWx0ZXJEYXRhV2l0aERhdGUoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYktlZXAgPSB0aGlzLmZpbHRlckRhdGFXaXRoQ29tbW9uVHlwZXMoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBkb24ndCBrZWVwIHN0b3AgZmlsdGVyaW5nXG4gICAgICBpZiAoIWJLZWVwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlckRhdGFXaXRoRGF0ZShpdGVtLCBmaWx0ZXJPYmosIGZpbHRlclZhbHVlKSB7XG4gICAgbGV0IGJLZWVwO1xuICAgIGxldCB2YWx1ZSA9IGl0ZW1bZmlsdGVyT2JqLnJlZl0gIT0gbnVsbCB8fCBpdGVtW2ZpbHRlck9iai5yZWZdICE9ICcnID8gZ2V0U2Vjb25kcyhpdGVtW2ZpbHRlck9iai5yZWZdKSA6IG51bGw7XG4gICAgZmlsdGVyVmFsdWUgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSBudWxsICYmIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlICE9ICcnID8gZ2V0U2Vjb25kcyhmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSkgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIpIHtcbiAgICAgIGNhc2UgJ25vdGVxdWFsJzpcbiAgICAgICAgLy8gYmVjYXN1ZSBmaWx0ZXJWYWx1ZSBpcyBpbiBtaW51dGVzLCBuZWVkIHRvIGhhdmUgYSByYW5nZSBvZiBsZXNzIHRoYW4gNjAgc2Vjb25zXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGZpbHRlclZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBnZXQgcmlkIG9mIG1pbGxpc2Vjb25zXG4gICAgICAgICAgdmFsdWUgLz0gMTAwMDtcbiAgICAgICAgICBmaWx0ZXJWYWx1ZSAvPSAxMDAwO1xuXG4gICAgICAgICAgY29uc3QgZGlmZiA9IHZhbHVlIC0gZmlsdGVyVmFsdWU7XG4gICAgICAgICAgaWYgKGRpZmYgPj0gMCAmJiBkaWZmIDwgNjApIHtcbiAgICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgICBpZiAodmFsdWUgPCBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICBpZiAodmFsdWUgPiBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm90bnVsbCc6XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlckRhdGFXaXRoQ29tbW9uVHlwZXMoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSkge1xuICAgIGxldCBiS2VlcDtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bZmlsdGVyT2JqLnJlZl0udG9Mb3dlckNhc2UoKTtcbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBzd2l0Y2ggKGZpbHRlck9iai5jb250YWluc0ZpbHRlcikge1xuICAgICAgY2FzZSAnY29udGFpbnMnOlxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPCAwKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VxdWFscyc6XG4gICAgICAgIGlmICh2YWx1ZSAhPSBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGFydHN3aXRoJzpcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoZmlsdGVyVmFsdWUpICE9IDApIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJLZWVwO1xuICB9XG5cbiAgZmlsdGVyU29ydEdyb3VwQnkoKSB7XG4gICAgLy8gZ2V0IG9yaWdpbmFsIGRhdGEgc2V0XG4gICAgbGV0IHRoZURhdGEgPSB0aGlzLnJlcGVhdExpc3REYXRhLnNsaWNlKCk7XG5cbiAgICAvLyBsYXN0IGZpbHRlciBjb25maWcgZGF0YSBpcyBnbG9iYWxcbiAgICB0aGVEYXRhID0gdGhlRGF0YS5maWx0ZXIodGhpcy5maWx0ZXJEYXRhLmJpbmQodGhpcykpO1xuXG4gICAgLy8gbGFzdCBzb3J0IGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEuc29ydCh0aGlzLnNvcnRDb21wYXJlLmJpbmQodGhpcykpO1xuXG4gICAgY29uc3QgcmVHcm91cERhdGEgPSB0aGlzLmFkZEdyb3Vwcyh0aGVEYXRhLCB0aGlzLmdyb3VwQnlDb2x1bW5zJCk7XG5cbiAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEgPSBbXTtcbiAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEucHVzaCguLi5yZUdyb3VwRGF0YSk7XG5cbiAgICBpZiAodGhpcy5zZWFyY2hGaWx0ZXIgJiYgdGhpcy5zZWFyY2hGaWx0ZXIgIT0gJycpIHtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5zZWFyY2hGaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMucGVyZkZpbHRlcjtcbiAgICB9XG4gICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSAnJztcblxuICAgIGlmICh0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gR3JvdXBpbmcgY29kZSBpbnNwaXJlZCBieSB0aGlzIGV4YW1wbGVcbiAgLy8gaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2FuZ3VsYXItbWF0ZXJpYWwtdGFibGUtcm93LWdyb3VwaW5nXG4gIC8vXG5cbiAgX3Nob3dVbkdyb3VwQnkoY29sdW1uRGF0YSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKSB7XG4gICAgICBpZiAodmFsID09IGNvbHVtbkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2dyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCB0cnVlKTtcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIF91bkdyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCBmYWxzZSk7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBjaGVja0dyb3VwQnlDb2x1bW4oZmllbGQsIGFkZCkge1xuICAgIGxldCBmb3VuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cEJ5Q29sdW1ucyQpIHtcbiAgICAgIGlmIChjb2x1bW4gPT09IGZpZWxkKSB7XG4gICAgICAgIGZvdW5kID0gdGhpcy5ncm91cEJ5Q29sdW1ucyQuaW5kZXhPZihjb2x1bW4sIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZCA+PSAwKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWRkKSB7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5wdXNoKGZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBhZGRHcm91cHMoZGF0YTogYW55W10sIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSk6IGFueVtdIHtcbiAgICBjb25zdCByb290R3JvdXAgPSBuZXcgR3JvdXAoKTtcbiAgICByb290R3JvdXAuZXhwYW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmdldFN1YmxldmVsKGRhdGEsIDAsIGdyb3VwQnlDb2x1bW5zLCByb290R3JvdXApO1xuICB9XG5cbiAgZ2V0U3VibGV2ZWwoZGF0YTogYW55W10sIGxldmVsOiBudW1iZXIsIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSwgcGFyZW50OiBHcm91cCk6IGFueVtdIHtcbiAgICBpZiAobGV2ZWwgPj0gZ3JvdXBCeUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy51bmlxdWVCeShcbiAgICAgIGRhdGEubWFwKHJvdyA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBHcm91cCgpO1xuICAgICAgICByZXN1bHQubGV2ZWwgPSBsZXZlbCArIDE7XG4gICAgICAgIHJlc3VsdC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICByZXN1bHRbZ3JvdXBCeUNvbHVtbnNbaV1dID0gcm93W2dyb3VwQnlDb2x1bW5zW2ldXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICBKU09OLnN0cmluZ2lmeVxuICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gZ3JvdXBCeUNvbHVtbnNbbGV2ZWxdO1xuICAgIGxldCBzdWJHcm91cHM6IGFueVtdID0gW107XG4gICAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgY29uc3Qgcm93c0luR3JvdXAgPSBkYXRhLmZpbHRlcihyb3cgPT4gZ3JvdXBbY3VycmVudENvbHVtbl0gPT09IHJvd1tjdXJyZW50Q29sdW1uXSk7XG4gICAgICBncm91cC50b3RhbENvdW50cyA9IHJvd3NJbkdyb3VwLmxlbmd0aDtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gdGhpcy5nZXRTdWJsZXZlbChyb3dzSW5Hcm91cCwgbGV2ZWwgKyAxLCBncm91cEJ5Q29sdW1ucywgZ3JvdXApO1xuICAgICAgc3ViR3JvdXAudW5zaGlmdChncm91cCk7XG4gICAgICBzdWJHcm91cHMgPSBzdWJHcm91cHMuY29uY2F0KHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3ViR3JvdXBzO1xuICB9XG5cbiAgdW5pcXVlQnkoYSwga2V5KSB7XG4gICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgIHJldHVybiBhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGsgPSBrZXkoaXRlbSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmV0dXJuLWFzc2lnbiwgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXR1cm4gc2Vlbi5oYXNPd25Qcm9wZXJ0eShrKSA/IGZhbHNlIDogKHNlZW5ba10gPSB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS5sZXZlbDtcbiAgfVxuXG4gIF9ncm91cEhlYWRlckNsaWNrKHJvdykge1xuICAgIHJvdy5leHBhbmRlZCA9ICFyb3cuZXhwYW5kZWQ7XG4gICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSBcIlwiO1xuICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnBlcmZGaWx0ZXI7XG4gIH1cblxuICAvLyBiZWxvdyBpcyBmb3IgZ3JpZCByb3cgZ3JvdXBpbmdcbiAgY3VzdG9tRmlsdGVyUHJlZGljYXRlKGRhdGE6IGFueSB8IEdyb3VwLCBmaWx0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhIGluc3RhbmNlb2YgR3JvdXAgPyBkYXRhLnZpc2libGUgOiB0aGlzLmdldERhdGFSb3dWaXNpYmxlV2l0aEZpbHRlcihkYXRhLCBmaWx0ZXIpO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGUoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JvdXBSb3dzID0gdGhpcy5yZXBlYXRMaXN0JC5kYXRhLmZpbHRlcihyb3cgPT4ge1xuICAgICAgaWYgKCEocm93IGluc3RhbmNlb2YgR3JvdXApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmICghcm93W2NvbHVtbl0gfHwgIWRhdGFbY29sdW1uXSB8fCByb3dbY29sdW1uXSAhPT0gZGF0YVtjb2x1bW5dKSB7XG4gICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICBpZiAoZ3JvdXBSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGdyb3VwUm93c1swXSBhcyBHcm91cDtcbiAgICByZXR1cm4gcGFyZW50LnZpc2libGUgJiYgcGFyZW50LmV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGVXaXRoRmlsdGVyKGRhdGEsIGZpbHRlcikge1xuICAgIC8vIGZpc3QgY2hlY2sgaWYgcm93IGlzIHZpc2libGUgd2l0aCBncm91cGluZ1xuICAgIGxldCBiVmlzaWJsZSA9IHRoaXMuZ2V0RGF0YVJvd1Zpc2libGUoZGF0YSk7XG5cbiAgICBpZiAoYlZpc2libGUgJiYgZmlsdGVyICYmIGZpbHRlciAhPSAnJyAmJiBmaWx0ZXIgIT0gdGhpcy5wZXJmRmlsdGVyKSB7XG4gICAgICAvLyBub3cgY2hlY2sgaWYgcm93IGlzIGZpbHRlcmVkLlxuXG4gICAgICAvLyBhc3N1bWUgbm90IHRoZXJlIHVubGVzcyB3ZSBmaW5kIGl0XG4gICAgICBiVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJCkge1xuICAgICAgICAvLyBmaWx0ZXIgaXMgbG93ZXIgY2FzZVxuICAgICAgICBpZiAoZGF0YVtjb2xdICYmIGRhdGFbY29sXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXIpID49IDApIHtcbiAgICAgICAgICBiVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYlZpc2libGU7XG4gIH1cblxuICB1cGRhdGVEYXRhKGxpc3REYXRhOiBhbnlbXSwgZmllbGREYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCByZXR1cm5MaXN0OiBhbnlbXSA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgbGlzdERhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgLy8gY29weVxuICAgICAgY29uc3Qgcm93RGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocm93KSk7XG5cbiAgICAgIGZvciAobGV0IGZpZWxkSW5kZXggPSAwOyBmaWVsZEluZGV4IDwgZmllbGREYXRhLmxlbmd0aDsgZmllbGRJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGZpZWxkRGF0YVtmaWVsZEluZGV4XS5jb25maWc7XG4gICAgICAgIGxldCBmaWVsZE5hbWU7XG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlO1xuICAgICAgICBsZXQgbXlGb3JtYXQ7XG4gICAgICAgIGxldCB0aGVDdXJyZW5jeU9wdGlvbnM7XG5cbiAgICAgICAgc3dpdGNoIChmaWVsZERhdGFbZmllbGRJbmRleF0udHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgZmllbGROYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICBteUZvcm1hdCA9IGNvbmZpZy5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoIW15Rm9ybWF0KSB7XG4gICAgICAgICAgICAgIG15Rm9ybWF0ID0gJ0RhdGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMudXRpbHMuZ2VuZXJhdGVEYXRlKHJvd0RhdGFbZmllbGROYW1lXSwgbXlGb3JtYXQpO1xuXG4gICAgICAgICAgICByb3dEYXRhW2ZpZWxkTmFtZV0gPSBmb3JtYXR0ZWREYXRlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICAgICAgZmllbGROYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICBteUZvcm1hdCA9IGNvbmZpZy5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoIW15Rm9ybWF0KSB7XG4gICAgICAgICAgICAgIG15Rm9ybWF0ID0gJ0RhdGVUaW1lLUxvbmcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMudXRpbHMuZ2VuZXJhdGVEYXRlVGltZShyb3dEYXRhW2ZpZWxkTmFtZV0sIG15Rm9ybWF0KTtcblxuICAgICAgICAgICAgcm93RGF0YVtmaWVsZE5hbWVdID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0N1cnJlbmN5JzpcbiAgICAgICAgICAgIGZpZWxkTmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICAgICAgdGhlQ3VycmVuY3lPcHRpb25zID0gZ2V0Q3VycmVuY3lPcHRpb25zKFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldExvY2FsZSgpIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICAgICAgICBsb2NhbGU6IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2JlZm9yZScsXG4gICAgICAgICAgICAgIGRlY1BsYWNlczogMlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4udGhlQ3VycmVuY3lPcHRpb25zIH07XG4gICAgICAgICAgICByb3dEYXRhW2ZpZWxkTmFtZV0gPSBmb3JtYXR0ZXJzLkN1cnJlbmN5KHJvd0RhdGFbZmllbGROYW1lXSwgcGFyYW1zKTtcbiAgICAgICAgICAgIC8vIHZhbCA9IGZvcm1hdCh2YWx1ZSwgY29sdW1uLnR5cGUsIHRoZUN1cnJlbmN5T3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybkxpc3QucHVzaChyb3dEYXRhKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXR1cm5MaXN0O1xuICB9XG5cbiAgb3BlbkFzc2lnbm1lbnQocm93KSB7XG4gICAgY29uc3QgeyBweFJlZk9iamVjdENsYXNzLCBwekluc0tleSB9ID0gcm93O1xuICAgIGNvbnN0IHNUYXJnZXQgPSB0aGlzLnBDb25uJC5nZXRDb250YWluZXJOYW1lKCk7XG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0geyBjb250YWluZXJOYW1lOiBzVGFyZ2V0IH07XG4gICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Bc3NpZ25tZW50KHB6SW5zS2V5LCBweFJlZk9iamVjdENsYXNzLCBvcHRpb25zKTtcbiAgfVxuXG4gIG9wZW5Xb3JrKHJvdykge1xuICAgIGNvbnN0IHB4UmVmT2JqZWN0Q2xhc3MgPSByb3cucHhSZWZPYmplY3RDbGFzcyB8fCByb3cucHhPYmpDbGFzcztcbiAgICBjb25zdCB7IHB4UmVmT2JqZWN0S2V5IH0gPSByb3c7XG4gICAgaWYgKHB4UmVmT2JqZWN0Q2xhc3MgIT09ICcnICYmIHB4UmVmT2JqZWN0S2V5ICE9PSAnJykge1xuICAgICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Xb3JrQnlIYW5kbGUocHhSZWZPYmplY3RLZXksIHB4UmVmT2JqZWN0Q2xhc3MpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVEYXRhKGRhdGEpIHtcbiAgICBkYXRhLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgaXRlbS5fX29yaWdpbmFsX2luZGV4ID0gaWR4O1xuICAgICAgaXRlbS5fX2xldmVsID0gMTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0VHlwZShmaWVsZCkge1xuICAgIGNvbnN0IHsgY29uZmlnID0ge30sIHR5cGUgfSA9IGZpZWxkO1xuICAgIGNvbnN0IHsgZm9ybWF0VHlwZSB9ID0gY29uZmlnO1xuICAgIGlmIChmb3JtYXRUeXBlID09PSAnZGF0ZXRpbWUnIHx8IGZvcm1hdFR5cGUgPT09ICdkYXRlJykge1xuICAgICAgLy8gY3VycmVudGx5IGNvc21vcyBoYXMgb25seSBzdXBwb3J0IGZvciBkYXRlIC4uLiBpdCBhbHNvIG5lZWQgdG8gc3VwcG9ydCBkYXRlVGltZVxuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUNvbHVtbnMoZmllbGRzID0gW10pIHtcbiAgICByZXR1cm4gZmllbGRzLm1hcCgoZmllbGQ6IGFueSwgb3JpZ2luYWxDb2xJbmRleCkgPT4gKHtcbiAgICAgIC4uLmZpZWxkLFxuICAgICAgdHlwZTogdGhpcy5nZXRUeXBlKGZpZWxkKSxcbiAgICAgIG5hbWU6IGZpZWxkLmNvbmZpZy52YWx1ZS5zdWJzdHJpbmcoNCksXG4gICAgICBsYWJlbDogZmllbGQuY29uZmlnLmxhYmVsLnN1YnN0cmluZygzKSxcbiAgICAgIGlkOiBvcmlnaW5hbENvbEluZGV4LFxuICAgICAgZ3JvdXBpbmdFbmFibGVkOiB0cnVlLFxuICAgICAgZ3JvdXBlZDogZmFsc2UsXG4gICAgICBtaW5XaWR0aDogNTAsXG4gICAgICBjZWxsUmVuZGVyZXI6IHRoaXMuZ2V0VHlwZShmaWVsZCkgPT09ICd0ZXh0JyA/IG51bGwgOiBmaWVsZC50eXBlLFxuICAgICAgZmlsdGVyOiB0cnVlXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2VsbHMoY29sRmllbGRzLCBmaWVsZHMpIHtcbiAgICBjb25zdCBBc3NpZ25EYXNoT2JqZWN0cyA9IFsnQXNzaWduLVdvcmtsaXN0JywgJ0Fzc2lnbi1Xb3JrQmFza2V0J107XG4gICAgcmV0dXJuIGNvbEZpZWxkcy5tYXAoKGZpZWxkOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBsZXQgdGhlRmllbGQgPSBmaWVsZC5jb25maWcudmFsdWUuc3Vic3RyaW5nKGZpZWxkLmNvbmZpZy52YWx1ZS5pbmRleE9mKCcgJykgKyAxKTtcbiAgICAgIGlmICh0aGVGaWVsZC5pbmRleE9mKCcuJykgPT09IDApIHtcbiAgICAgICAgdGhlRmllbGQgPSB0aGVGaWVsZC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb2xJbmRleCA9IGZpZWxkcy5maW5kSW5kZXgoZWxlID0+IGVsZS5uYW1lID09PSB0aGVGaWVsZCk7XG4gICAgICBjb25zdCBkaXNwbGF5QXNMaW5rID0gZmllbGQuY29uZmlnLmRpc3BsYXlBc0xpbms7XG4gICAgICBjb25zdCBoZWFkZXJSb3c6IGFueSA9IHt9O1xuICAgICAgaGVhZGVyUm93LmlkID0gZmllbGRzW2luZGV4XS5pZDtcbiAgICAgIGhlYWRlclJvdy50eXBlID0gZmllbGQudHlwZTtcbiAgICAgIGhlYWRlclJvdy5kaXNwbGF5QXNMaW5rID0gZGlzcGxheUFzTGluaztcbiAgICAgIGhlYWRlclJvdy5udW1lcmljID0gZmllbGQudHlwZSA9PT0gJ0RlY2ltYWwnIHx8IGZpZWxkLnR5cGUgPT09ICdJbnRlZ2VyJyB8fCBmaWVsZC50eXBlID09PSAnUGVyY2VudGFnZScgfHwgZmllbGQudHlwZSA9PT0gJ0N1cnJlbmN5JyB8fCBmYWxzZTtcbiAgICAgIGhlYWRlclJvdy5kaXNhYmxlUGFkZGluZyA9IGZhbHNlO1xuICAgICAgaGVhZGVyUm93LmxhYmVsID0gZmllbGRzW2luZGV4XS5sYWJlbDtcbiAgICAgIGlmIChjb2xJbmRleCA+IC0xKSB7XG4gICAgICAgIGhlYWRlclJvdy5jbGFzc0lEID0gZmllbGRzW2NvbEluZGV4XS5jbGFzc0lEO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3BsYXlBc0xpbmspIHtcbiAgICAgICAgaGVhZGVyUm93LmlzQXNzaWdubWVudExpbmsgPSBBc3NpZ25EYXNoT2JqZWN0cy5pbmNsdWRlcyhoZWFkZXJSb3cuY2xhc3NJRCk7XG4gICAgICAgIGlmIChmaWVsZC5jb25maWcudmFsdWU/LnN0YXJ0c1dpdGgoJ0BDQScpKSB7XG4gICAgICAgICAgaGVhZGVyUm93LmlzQXNzb2NpYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGVhZGVyUm93O1xuICAgIH0pO1xuICB9XG5cbiAgYnVpbGRTZWxlY3QoZmllbGREZWZzLCBjb2xJZCwgcGF0Y2hRdWVyeUZpZWxkcyA9IFtdLCBjb21wb3NpdGVLZXlzID0gW10pIHtcbiAgICBjb25zdCBsaXN0RmllbGRzOiBhbnkgPSBbXTtcbiAgICBpZiAoY29sSWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZXRGaWVsZChmaWVsZERlZnMsIGNvbElkKTtcbiAgICAgIGxpc3RGaWVsZHMucHVzaCh7XG4gICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTk9URTogSWYgd2UgZXZlciBkZWNpZGUgdG8gbm90IHNldCB1cCBhbGwgdGhlIGBmaWVsZERlZnNgIG9uIHNlbGVjdCwgZW5zdXJlIHRoYXQgdGhlIGZpZWxkc1xuICAgICAgLy8gIGNvcnJlc3BvbmRpbmcgdG8gYHN0YXRlLmdyb3Vwc2AgYXJlIHNldCB1cC4gTmVlZGVkIGluIENsaWVudC1tb2RlIGdyb3VwaW5nL3BhZ2luYXRpb24uXG4gICAgICBmaWVsZERlZnMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmICghbGlzdEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gZmllbGQubmFtZSkpIHtcbiAgICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwYXRjaFF1ZXJ5RmllbGRzLmZvckVhY2goayA9PiB7XG4gICAgICAgIGlmICghbGlzdEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gaykpIHtcbiAgICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6IGtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29tcG9zaXRlS2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKCFsaXN0RmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBrKSkge1xuICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgIGZpZWxkOiBrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBsaXN0RmllbGRzO1xuICB9XG5cbiAgZ2V0UmVzdWx0c1RleHQoKSB7XG4gICAgY29uc3QgcmVjb3Jkc0NvdW50ID0gdGhpcy5yZXBlYXRMaXN0JD8ucGFnaW5hdG9yPy5sZW5ndGggfHwgMDtcbiAgICByZXR1cm4gYCR7cmVjb3Jkc0NvdW50IHx8IDB9IHJlc3VsdCR7cmVjb3Jkc0NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gIH1cblxuICBnZXRGaWVsZChmaWVsZERlZnMsIGNvbHVtbklkKSB7XG4gICAgY29uc3QgZmllbGRzTWFwID0gdGhpcy5nZXRGaWVsZHNNYXAoZmllbGREZWZzKTtcbiAgICByZXR1cm4gZmllbGRzTWFwLmdldChjb2x1bW5JZCk7XG4gIH1cblxuICBnZXRGaWVsZHNNYXAoZmllbGREZWZzKSB7XG4gICAgY29uc3QgZmllbGRzTWFwID0gbmV3IE1hcCgpO1xuICAgIGZpZWxkRGVmcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgZmllbGRzTWFwLnNldChlbGVtZW50LmlkLCBlbGVtZW50KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGRzTWFwO1xuICB9XG5cbiAgYWRkSXRlbUtleUluU2VsZWN0KGZpZWxkRGVmcywgaXRlbUtleSwgc2VsZWN0LCBjb21wb3NpdGVLZXlzKSB7XG4gICAgY29uc3QgZWxlbWVudEZvdW5kID0gdGhpcy5nZXRGaWVsZChmaWVsZERlZnMsIGl0ZW1LZXkpO1xuXG4gICAgaWYgKFxuICAgICAgaXRlbUtleSAmJlxuICAgICAgIWVsZW1lbnRGb3VuZCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShzZWxlY3QpICYmXG4gICAgICAhKGNvbXBvc2l0ZUtleXMgIT09IG51bGwgJiYgY29tcG9zaXRlS2V5cz8ubGVuZ3RoKSAmJlxuICAgICAgIXNlbGVjdC5maW5kKHNlbCA9PiBzZWwuZmllbGQgPT09IGl0ZW1LZXkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgIHtcbiAgICAgICAgICBmaWVsZDogaXRlbUtleVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Q7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwc2RrLWxpc3QtaGVhZGVyXCI+XG4gIDxkaXY+XG4gICAgPGgzICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cImxhYmVsXCIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZFwiPlxuICAgICAge3sgbGFiZWwgfX0gPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNvdW50XCI+e3sgZ2V0UmVzdWx0c1RleHQoKSB9fTwvc3Bhbj5cbiAgICA8L2gzPlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstc2VhcmNoXCIgKm5nSWY9XCJiU2hvd1NlYXJjaCRcIj5cbiAgICAgIDxtYXQtbGFiZWw+PGltZyBjbGFzcz1cInBzZGstaWNvbi1zZWFyY2hcIiBzcmM9XCJ7eyBzZWFyY2hJY29uJCB9fVwiIC8+IDxzcGFuIGNsYXNzPVwicHNkay1zZWFyY2gtbGFiZWxcIj5TZWFyY2g8L3NwYW4+IDwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IG1hdElucHV0IGlkPVwic2VhcmNoXCIgKGtleXVwKT1cImFwcGx5U2VhcmNoKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlwiIC8+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxkaXYgKm5nSWY9XCIhYkluRm9ybSRcIiBjbGFzcz1cInBzZGstb3V0ZXItZGl2LWluLWZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWlubmVyLWRpdi1pbi1mb3JtXCIgKm5nSWY9XCJiQ29sdW1uUmVvcmRlciRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgIG1hdC10YWJsZVxuICAgICAgICAgICAgaWQ9XCJsaXN0LXZpZXdcIlxuICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIlxuICAgICAgICAgICAgbWF0U29ydFxuICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIiBzdGlja3k9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXJcIiAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiIGNka0RyYWc+XG4gICAgICAgICAgICAgICAge3sgZENvbC5jb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstZmlsdGVyLXN2Zy1pY29uXCIgbmFtZT1cImZpbHRlck9uSWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1hcnJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstYXJyb3ctc3ZnLWljb25cIiBhcnJvdz1cIm5vbmVcIiBbYXR0ci5hcnJvd2lkXT1cImRDb2wuY29uZmlnLm5hbWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYnV0dG9uXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3VwTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51U3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2dyb3VwTWVudT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2dyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+R3JvdXAgQnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl91bkdyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+VW5ncm91cDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2ZpbHRlcigkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZmlsdGVyU3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX3Nob3dCdXR0b24oZENvbC5jb25maWcubmFtZSwgZENvbCk7IGVsc2UgcmVndWxhclwiXG4gICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9saXN0Vmlld0NsaWNrKGRDb2wuY29uZmlnLCBlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcj5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyQ7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuXG4gICAgICAgICAgICA8IS0tIEdyb3VwIGhlYWRlciAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNvbHNwYW49XCI5OTlcIiAqbWF0Q2VsbERlZj1cImxldCBncm91cFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHN0cm9uZ1xuICAgICAgICAgICAgICAgICAgPnt7IF9nZXRHcm91cE5hbWUoZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV0pIH19OiB7eyBncm91cFtncm91cEJ5Q29sdW1ucyRbZ3JvdXAubGV2ZWwgLSAxXV0gfX0gKHt7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnRvdGFsQ291bnRzXG4gICAgICAgICAgICAgICAgICB9fSk8L3N0cm9uZ1xuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydncm91cEhlYWRlciddOyB3aGVuOiBpc0dyb3VwXCIgKGNsaWNrKT1cIl9ncm91cEhlYWRlckNsaWNrKHJvdylcIj48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHNkay1pbm5lci1kaXYtaW4tZm9ybVwiICpuZ0lmPVwiIWJDb2x1bW5SZW9yZGVyJFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgaWQ9XCJsaXN0LXZpZXdcIiBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiIG1hdFNvcnQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIiBzdGlja3k9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXJcIiAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiPlxuICAgICAgICAgICAgICAgIHt7IGRDb2wuY29uZmlnLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWZpbHRlci1zdmctaWNvblwiIG5hbWU9XCJmaWx0ZXJPbkljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYXJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWFycm93LXN2Zy1pY29uXCIgYXJyb3c9XCJub25lXCIgW2F0dHIuYXJyb3dpZF09XCJkQ29sLmNvbmZpZy5uYW1lXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJncm91cE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgbWVudVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNncm91cE1lbnU+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9ncm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkdyb3VwIEJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIl9zaG93VW5Hcm91cEJ5KGRDb2wpICYmIGJHcm91cGluZyRcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfdW5Hcm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPlVuZ3JvdXA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9maWx0ZXIoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGZpbHRlclN2Z0ljb24kIH19XCIgLz48c3Bhbj5GaWx0ZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIl9zaG93QnV0dG9uKGRDb2wuY29uZmlnLm5hbWUsIGRDb2wpOyBlbHNlIHJlZ3VsYXJcIlxuICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfbGlzdFZpZXdDbGljayhkQ29sLmNvbmZpZywgZWxlbWVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXI+XG4gICAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2RDb2wuY29uZmlnLm5hbWVdIHx8ICctLS0nIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnMkXCI+PC90cj5cblxuICAgICAgICAgICAgPCEtLSBHcm91cCBoZWFkZXIgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImdyb3VwSGVhZGVyXCI+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjb2xzcGFuPVwiOTk5XCIgKm1hdENlbGxEZWY9XCJsZXQgZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX2xlc3M8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxzdHJvbmdcbiAgICAgICAgICAgICAgICAgID57eyBfZ2V0R3JvdXBOYW1lKGdyb3VwQnlDb2x1bW5zJFtncm91cC5sZXZlbCAtIDFdKSB9fToge3sgZ3JvdXBbZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV1dIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICBncm91cC50b3RhbENvdW50c1xuICAgICAgICAgICAgICAgICAgfX0pPC9zdHJvbmdcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cFwiIChjbGljayk9XCJfZ3JvdXBIZWFkZXJDbGljayhyb3cpXCI+PC90cj5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJiSW5Gb3JtJFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstaW5uZXItZGl2LWluLWZvcm1cIj5cbiAgICAgICAgICA8dGFibGUgaWQ9XCJsaXN0LXZpZXdcIiAqbmdJZj1cInJlcGVhdExpc3REYXRhLmxlbmd0aCA+IDBcIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIiBtYXRTb3J0PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNpbmdsZVNlbGVjdGlvbk1vZGVcIiBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cInJvd1tyb3dJRF1cIiBbY2hlY2tlZF09XCJyb3dbcm93SURdID09PSBjaGVja0JveFZhbHVlXCIgKGNoYW5nZSk9XCJmaWVsZE9uQ2hhbmdlKHJvdylcIj48L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aVNlbGVjdGlvbk1vZGVcIiBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbdmFsdWVdPVwicm93W3Jvd0lEXVwiIFtjaGVja2VkXT1cImlzQ2hlY2tlZChyb3cpXCIgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2xpY2socm93LCAkZXZlbnQpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgZmllbGRzJFwiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5jb25maWcubmFtZVwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiPlxuICAgICAgICAgICAgICAgIHt7IGRDb2wuY29uZmlnLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fTwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJFwiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlcGVhdExpc3REYXRhPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDx0YWJsZSBpZD1cImxpc3Qtdmlld1wiICpuZ0lmPVwicmVwZWF0TGlzdERhdGE/Lmxlbmd0aCA9PT0gMFwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPnt7IGRDb2wuY29uZmlnLmxhYmVsIH19PC90aD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1uby1yZWNvcmRzXCIgKm5nSWY9XCJyZXBlYXRMaXN0RGF0YT8ubGVuZ3RoID09PSAwXCI+Tm8gUmVjb3JkcyBGb3VuZC48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtcGFnaW5hdG9yIGlkPVwicGFnaW5hdGlvblwiICpuZ0lmPVwiYkluRm9ybSRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwLCAxMDAsIDUwMCwgMTAwMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG4gICAgPG1hdC1wYWdpbmF0b3IgaWQ9XCJwYWdpbmF0aW9uXCIgKm5nSWY9XCIhYkluRm9ybSRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwLCAxMDAsIDUwMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG4gIDwvZGl2PlxuXG4gIDwhLS0gcG9wIG92ZXJzIGZvciBmaWx0ZXJzLS0+XG4gIDxkaXYgKm5nSWY9XCJiU2hvd0ZpbHRlclBvcG92ZXIkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtZmlsZS10b3BcIj5cbiAgICAgIDxoND5cbiAgICAgICAgRmlsdGVyOjxiPiB7eyBmaWx0ZXJDb250YWluc0xhYmVsJCB9fTwvYj5cbiAgICAgIDwvaDQ+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYkNvbnRhaW5zJFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImNvbnRhaW5zXCI+Q29udGFpbnM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImVxdWFsc1wiPkVxdWFsczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwic3RhcnRzd2l0aFwiPlN0YXJ0cyB3aXRoPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIiAoY2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1ZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJiRGF0ZVRpbWUkXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1R5cGUkXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUeXBlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibm90ZXF1YWxcIj5pcyBub3QgZXF1YWwgdG88L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImFmdGVyXCI+YWZ0ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImJlZm9yZVwiPmJlZm9yZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibnVsbFwiPmlzIG51bGw8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdG51bGxcIj5pcyBub3QgbnVsbDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkRhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAjZGF0ZUlucHV0XG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwZWdhZGF0ZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIlxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zRGF0ZVZhbHVlKCRldmVudCwgZGF0ZUlucHV0LnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBlZ2FkYXRlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwZWdhZGF0ZSBbc3RhcnRBdF09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZVRpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5EYXRlIHRpbWU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNEYXRlVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc1RpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5UaW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0aW1lXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgICBbcHJvcHNdPVwieyBhck1haW5CdXR0b25zJDogYXJGaWx0ZXJNYWluQnV0dG9ucyQsIGFyU2Vjb25kYXJ5QnV0dG9ucyQ6IGFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICAgIFtwYXJlbnRdPVwidGhpc1wiXG4gICAgICAgIFtvdXRwdXRFdmVudHNdPVwieyBhY3Rpb25CdXR0b25DbGljazogX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2sgfVwiXG4gICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19