@impartner/design-components 3.0.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/README.md +9 -8
  2. package/fesm2022/impartner-design-components.mjs +1667 -972
  3. package/fesm2022/impartner-design-components.mjs.map +1 -1
  4. package/index.d.ts +3634 -3
  5. package/package.json +9 -12
  6. package/constants/fontawesome-icons.d.ts +0 -6
  7. package/constants/index.d.ts +0 -1
  8. package/esm2022/constants/fontawesome-icons.mjs +0 -3012
  9. package/esm2022/constants/index.mjs +0 -2
  10. package/esm2022/impartner-design-components.mjs +0 -5
  11. package/esm2022/lib/alert/alert.component.mjs +0 -106
  12. package/esm2022/lib/alert/alert.module.mjs +0 -19
  13. package/esm2022/lib/alert/index.mjs +0 -4
  14. package/esm2022/lib/alert/theme/alert-theme.mjs +0 -2
  15. package/esm2022/lib/alert/theme/index.mjs +0 -2
  16. package/esm2022/lib/avatar/avatar.component.mjs +0 -48
  17. package/esm2022/lib/avatar/avatar.module.mjs +0 -19
  18. package/esm2022/lib/avatar/index.mjs +0 -3
  19. package/esm2022/lib/avatar-group/avatar-group.component.mjs +0 -16
  20. package/esm2022/lib/avatar-group/avatar-group.module.mjs +0 -19
  21. package/esm2022/lib/avatar-group/index.mjs +0 -3
  22. package/esm2022/lib/backdrop/backdrop.component.mjs +0 -52
  23. package/esm2022/lib/backdrop/backdrop.module.mjs +0 -19
  24. package/esm2022/lib/backdrop/index.mjs +0 -3
  25. package/esm2022/lib/badge/badge.component.mjs +0 -121
  26. package/esm2022/lib/badge/badge.module.mjs +0 -20
  27. package/esm2022/lib/badge/index.mjs +0 -4
  28. package/esm2022/lib/badge/types/badge-icon.mjs +0 -2
  29. package/esm2022/lib/badge/types/badge-size.mjs +0 -7
  30. package/esm2022/lib/badge/types/index.mjs +0 -2
  31. package/esm2022/lib/branding/branded.directive.mjs +0 -19
  32. package/esm2022/lib/branding/branding.module.mjs +0 -19
  33. package/esm2022/lib/branding/index.mjs +0 -3
  34. package/esm2022/lib/breadcrumb/breadcrumb-item.component.mjs +0 -25
  35. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -37
  36. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +0 -19
  37. package/esm2022/lib/breadcrumb/index.mjs +0 -4
  38. package/esm2022/lib/button/button.component.mjs +0 -116
  39. package/esm2022/lib/button/button.module.mjs +0 -21
  40. package/esm2022/lib/button/index.mjs +0 -4
  41. package/esm2022/lib/button/themes/button-theme.mjs +0 -2
  42. package/esm2022/lib/button/themes/index.mjs +0 -2
  43. package/esm2022/lib/button-group/button-group.component.mjs +0 -52
  44. package/esm2022/lib/button-group/button-group.module.mjs +0 -20
  45. package/esm2022/lib/button-group/index.mjs +0 -3
  46. package/esm2022/lib/card-heading/card-heading.component.mjs +0 -30
  47. package/esm2022/lib/card-heading/card-heading.module.mjs +0 -19
  48. package/esm2022/lib/card-heading/index.mjs +0 -3
  49. package/esm2022/lib/data-card/data-card.component.mjs +0 -123
  50. package/esm2022/lib/data-card/data-card.module.mjs +0 -21
  51. package/esm2022/lib/data-card/index.mjs +0 -3
  52. package/esm2022/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.mjs +0 -105
  53. package/esm2022/lib/datetime-picker/components/datepicker-nav/index.mjs +0 -2
  54. package/esm2022/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.mjs +0 -33
  55. package/esm2022/lib/datetime-picker/components/datepicker-template-host/index.mjs +0 -2
  56. package/esm2022/lib/datetime-picker/components/datetime-picker/datetime-picker.component.mjs +0 -369
  57. package/esm2022/lib/datetime-picker/components/datetime-picker/index.mjs +0 -2
  58. package/esm2022/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.mjs +0 -367
  59. package/esm2022/lib/datetime-picker/components/datetime-picker-input/index.mjs +0 -2
  60. package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.mjs +0 -68
  61. package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/index.mjs +0 -2
  62. package/esm2022/lib/datetime-picker/components/index.mjs +0 -6
  63. package/esm2022/lib/datetime-picker/constants/datetime-picker-defaults.mjs +0 -12
  64. package/esm2022/lib/datetime-picker/constants/index.mjs +0 -2
  65. package/esm2022/lib/datetime-picker/datetime-picker.module.mjs +0 -22
  66. package/esm2022/lib/datetime-picker/index.mjs +0 -4
  67. package/esm2022/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.mjs +0 -40
  68. package/esm2022/lib/datetime-picker/services/datetime-formatter/index.mjs +0 -2
  69. package/esm2022/lib/datetime-picker/services/index.mjs +0 -2
  70. package/esm2022/lib/datetime-picker/types/datetime-picker-value.interface.mjs +0 -2
  71. package/esm2022/lib/datetime-picker/types/index.mjs +0 -2
  72. package/esm2022/lib/design-components.module.mjs +0 -132
  73. package/esm2022/lib/dropdown/components/dropdown-item/dropdown-item.component.mjs +0 -22
  74. package/esm2022/lib/dropdown/components/index.mjs +0 -2
  75. package/esm2022/lib/dropdown/dropdown.component.mjs +0 -143
  76. package/esm2022/lib/dropdown/dropdown.module.mjs +0 -21
  77. package/esm2022/lib/dropdown/index.mjs +0 -5
  78. package/esm2022/lib/dropdown/types/dropdown-position.mjs +0 -2
  79. package/esm2022/lib/dropdown/types/index.mjs +0 -2
  80. package/esm2022/lib/file-upload/directives/file-drop.directive.mjs +0 -50
  81. package/esm2022/lib/file-upload/directives/index.mjs +0 -2
  82. package/esm2022/lib/file-upload/file-upload.component.mjs +0 -335
  83. package/esm2022/lib/file-upload/file-upload.module.mjs +0 -38
  84. package/esm2022/lib/file-upload/index.mjs +0 -5
  85. package/esm2022/lib/file-upload/pipes/human-readable-byte-size.pipe.mjs +0 -23
  86. package/esm2022/lib/file-upload/pipes/index.mjs +0 -2
  87. package/esm2022/lib/form-field/component/directives/corner-hint.directive.mjs +0 -15
  88. package/esm2022/lib/form-field/component/directives/error.directive.mjs +0 -27
  89. package/esm2022/lib/form-field/component/directives/form-root.directive.mjs +0 -93
  90. package/esm2022/lib/form-field/component/directives/hint.directive.mjs +0 -25
  91. package/esm2022/lib/form-field/component/directives/index.mjs +0 -25
  92. package/esm2022/lib/form-field/component/directives/label.directive.mjs +0 -15
  93. package/esm2022/lib/form-field/component/directives/prefix.directive.mjs +0 -25
  94. package/esm2022/lib/form-field/component/directives/suffix.directive.mjs +0 -25
  95. package/esm2022/lib/form-field/component/form-field.component.mjs +0 -131
  96. package/esm2022/lib/form-field/component/form-field.module.mjs +0 -24
  97. package/esm2022/lib/form-field/component/index.mjs +0 -4
  98. package/esm2022/lib/form-field/controls/checkbox/checkbox.component.mjs +0 -345
  99. package/esm2022/lib/form-field/controls/checkbox/checkbox.module.mjs +0 -16
  100. package/esm2022/lib/form-field/controls/checkbox/index.mjs +0 -3
  101. package/esm2022/lib/form-field/controls/index.mjs +0 -6
  102. package/esm2022/lib/form-field/controls/input/index.mjs +0 -2
  103. package/esm2022/lib/form-field/controls/input/input.directive.mjs +0 -234
  104. package/esm2022/lib/form-field/controls/radio/index.mjs +0 -6
  105. package/esm2022/lib/form-field/controls/radio/injection-tokens.mjs +0 -4
  106. package/esm2022/lib/form-field/controls/radio/interfaces/index.mjs +0 -4
  107. package/esm2022/lib/form-field/controls/radio/interfaces/radio-button.interface.mjs +0 -2
  108. package/esm2022/lib/form-field/controls/radio/interfaces/radio-change-event.interface.mjs +0 -11
  109. package/esm2022/lib/form-field/controls/radio/interfaces/radio-group.interface.mjs +0 -2
  110. package/esm2022/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +0 -262
  111. package/esm2022/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +0 -290
  112. package/esm2022/lib/form-field/controls/radio/radio.module.mjs +0 -17
  113. package/esm2022/lib/form-field/controls/select/index.mjs +0 -9
  114. package/esm2022/lib/form-field/controls/select/interfaces/index.mjs +0 -2
  115. package/esm2022/lib/form-field/controls/select/interfaces/select-option.interface.mjs +0 -2
  116. package/esm2022/lib/form-field/controls/select/option/index.mjs +0 -2
  117. package/esm2022/lib/form-field/controls/select/option/select-option.component.mjs +0 -44
  118. package/esm2022/lib/form-field/controls/select/option-display/index.mjs +0 -2
  119. package/esm2022/lib/form-field/controls/select/option-display/select-option-display.component.mjs +0 -162
  120. package/esm2022/lib/form-field/controls/select/option-group/index.mjs +0 -2
  121. package/esm2022/lib/form-field/controls/select/option-group/select-option-group.component.mjs +0 -35
  122. package/esm2022/lib/form-field/controls/select/option-parent.mjs +0 -4
  123. package/esm2022/lib/form-field/controls/select/select-model.mjs +0 -150
  124. package/esm2022/lib/form-field/controls/select/select.component.mjs +0 -725
  125. package/esm2022/lib/form-field/controls/select/select.module.mjs +0 -37
  126. package/esm2022/lib/form-field/controls/select/value-tags-display/index.mjs +0 -2
  127. package/esm2022/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.mjs +0 -91
  128. package/esm2022/lib/form-field/controls/shared/index.mjs +0 -2
  129. package/esm2022/lib/form-field/controls/shared/toggle/components/index.mjs +0 -2
  130. package/esm2022/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +0 -17
  131. package/esm2022/lib/form-field/controls/shared/toggle/index.mjs +0 -4
  132. package/esm2022/lib/form-field/controls/shared/toggle/toggle.component.mjs +0 -112
  133. package/esm2022/lib/form-field/controls/shared/toggle/toggle.module.mjs +0 -18
  134. package/esm2022/lib/form-field/controls/tag-select/index.mjs +0 -2
  135. package/esm2022/lib/form-field/controls/tag-select/tag-select.component.mjs +0 -146
  136. package/esm2022/lib/form-field/form-field-errors.mjs +0 -5
  137. package/esm2022/lib/form-field/impdc-forms.mjs +0 -7
  138. package/esm2022/lib/form-field/impdc-forms.module.mjs +0 -53
  139. package/esm2022/lib/form-field/index.mjs +0 -2
  140. package/esm2022/lib/form-field/services/error-state-matcher.service.mjs +0 -28
  141. package/esm2022/lib/form-field/services/index.mjs +0 -3
  142. package/esm2022/lib/form-field/services/unique-selection-dispatcher.service.mjs +0 -48
  143. package/esm2022/lib/form-field/shared/constructors.type.mjs +0 -2
  144. package/esm2022/lib/form-field/shared/disabled.mixin.mjs +0 -15
  145. package/esm2022/lib/form-field/shared/error-state.mixin.mjs +0 -24
  146. package/esm2022/lib/form-field/shared/form-field-control.mjs +0 -10
  147. package/esm2022/lib/form-field/shared/index.mjs +0 -5
  148. package/esm2022/lib/form-field/shared/tab-index.mixin.mjs +0 -19
  149. package/esm2022/lib/icon/icon.component.mjs +0 -83
  150. package/esm2022/lib/icon/icon.module.mjs +0 -19
  151. package/esm2022/lib/icon/index.mjs +0 -3
  152. package/esm2022/lib/index.mjs +0 -29
  153. package/esm2022/lib/modal/index.mjs +0 -4
  154. package/esm2022/lib/modal/modal.component.mjs +0 -266
  155. package/esm2022/lib/modal/modal.module.mjs +0 -37
  156. package/esm2022/lib/modal/types/index.mjs +0 -3
  157. package/esm2022/lib/modal/types/modal-component-sizes.mjs +0 -9
  158. package/esm2022/lib/modal/types/modal-theme.mjs +0 -12
  159. package/esm2022/lib/pagination/index.mjs +0 -3
  160. package/esm2022/lib/pagination/pagination.component.mjs +0 -176
  161. package/esm2022/lib/pagination/pagination.module.mjs +0 -41
  162. package/esm2022/lib/progress-bar/index.mjs +0 -3
  163. package/esm2022/lib/progress-bar/progress-bar.component.mjs +0 -51
  164. package/esm2022/lib/progress-bar/progress-bar.module.mjs +0 -18
  165. package/esm2022/lib/scrollable/index.mjs +0 -3
  166. package/esm2022/lib/scrollable/scrollable.component.mjs +0 -187
  167. package/esm2022/lib/scrollable/scrollable.module.mjs +0 -22
  168. package/esm2022/lib/select-icon/index.mjs +0 -3
  169. package/esm2022/lib/select-icon/select-icon.component.mjs +0 -308
  170. package/esm2022/lib/select-icon/select-icon.module.mjs +0 -39
  171. package/esm2022/lib/size-detection/directive/element-size.interface.mjs +0 -2
  172. package/esm2022/lib/size-detection/directive/index.mjs +0 -3
  173. package/esm2022/lib/size-detection/directive/size-detector.directive.mjs +0 -43
  174. package/esm2022/lib/size-detection/index.mjs +0 -3
  175. package/esm2022/lib/size-detection/size-detection.module.mjs +0 -18
  176. package/esm2022/lib/spinner/index.mjs +0 -3
  177. package/esm2022/lib/spinner/spinner.component.mjs +0 -24
  178. package/esm2022/lib/spinner/spinner.module.mjs +0 -18
  179. package/esm2022/lib/table/components/bulk-actions/bulk-actions.component.mjs +0 -16
  180. package/esm2022/lib/table/components/column-heading/column-heading.component.mjs +0 -38
  181. package/esm2022/lib/table/components/index.mjs +0 -4
  182. package/esm2022/lib/table/components/row-actions/row-actions.component.mjs +0 -61
  183. package/esm2022/lib/table/constants/index.mjs +0 -3
  184. package/esm2022/lib/table/constants/public-table.constants.mjs +0 -2
  185. package/esm2022/lib/table/constants/table.constants.mjs +0 -23
  186. package/esm2022/lib/table/containers/index.mjs +0 -2
  187. package/esm2022/lib/table/containers/table.component.mjs +0 -474
  188. package/esm2022/lib/table/directives/collapse-monitor.directive.mjs +0 -42
  189. package/esm2022/lib/table/directives/index.mjs +0 -4
  190. package/esm2022/lib/table/directives/table-inject-component.directive.mjs +0 -46
  191. package/esm2022/lib/table/directives/table.directive.mjs +0 -55
  192. package/esm2022/lib/table/enumerations/index.mjs +0 -2
  193. package/esm2022/lib/table/enumerations/table-column-type.mjs +0 -21
  194. package/esm2022/lib/table/helpers/index.mjs +0 -2
  195. package/esm2022/lib/table/helpers/table-theme.helper.mjs +0 -31
  196. package/esm2022/lib/table/index.mjs +0 -8
  197. package/esm2022/lib/table/interfaces/cell-renderer.interface.mjs +0 -2
  198. package/esm2022/lib/table/interfaces/collapsible-row-content-context.interface.mjs +0 -2
  199. package/esm2022/lib/table/interfaces/custom-cell-renderer-components.type.mjs +0 -2
  200. package/esm2022/lib/table/interfaces/index.mjs +0 -13
  201. package/esm2022/lib/table/interfaces/sort-by-payload.interface.mjs +0 -2
  202. package/esm2022/lib/table/interfaces/table-cell-option.interface.mjs +0 -2
  203. package/esm2022/lib/table/interfaces/table-column-defs.type.mjs +0 -2
  204. package/esm2022/lib/table/interfaces/table-event-payload.interface.mjs +0 -2
  205. package/esm2022/lib/table/interfaces/table-row-action-payload.interface.mjs +0 -2
  206. package/esm2022/lib/table/interfaces/table-row-action.interface.mjs +0 -2
  207. package/esm2022/lib/table/interfaces/table-row-collapse-change.interface.mjs +0 -2
  208. package/esm2022/lib/table/interfaces/table-row-item.interface.mjs +0 -2
  209. package/esm2022/lib/table/table.module.mjs +0 -101
  210. package/esm2022/lib/tag/index.mjs +0 -2
  211. package/esm2022/lib/tag/tag.component.mjs +0 -104
  212. package/esm2022/lib/text-highlight/index.mjs +0 -3
  213. package/esm2022/lib/text-highlight/text-highlight.component.mjs +0 -101
  214. package/esm2022/lib/text-highlight/text-highlight.module.mjs +0 -17
  215. package/esm2022/public-api.mjs +0 -9
  216. package/esm2022/services/index.mjs +0 -2
  217. package/esm2022/services/interaction.service.mjs +0 -88
  218. package/esm2022/types/component-size.mjs +0 -12
  219. package/esm2022/types/component-theme.mjs +0 -22
  220. package/esm2022/types/index.mjs +0 -3
  221. package/esm2022/utilities/boolean-props.mjs +0 -7
  222. package/esm2022/utilities/dc.mjs +0 -9
  223. package/esm2022/utilities/index.mjs +0 -6
  224. package/esm2022/utilities/lc.mjs +0 -9
  225. package/esm2022/utilities/number-props.mjs +0 -18
  226. package/esm2022/utilities/sanitize.mjs +0 -7
  227. package/lib/alert/alert.component.d.ts +0 -50
  228. package/lib/alert/alert.module.d.ts +0 -9
  229. package/lib/alert/index.d.ts +0 -3
  230. package/lib/alert/theme/alert-theme.d.ts +0 -1
  231. package/lib/alert/theme/index.d.ts +0 -1
  232. package/lib/avatar/avatar.component.d.ts +0 -28
  233. package/lib/avatar/avatar.module.d.ts +0 -9
  234. package/lib/avatar/index.d.ts +0 -2
  235. package/lib/avatar-group/avatar-group.component.d.ts +0 -10
  236. package/lib/avatar-group/avatar-group.module.d.ts +0 -9
  237. package/lib/avatar-group/index.d.ts +0 -2
  238. package/lib/backdrop/backdrop.component.d.ts +0 -24
  239. package/lib/backdrop/backdrop.module.d.ts +0 -9
  240. package/lib/backdrop/index.d.ts +0 -2
  241. package/lib/badge/badge.component.d.ts +0 -63
  242. package/lib/badge/badge.module.d.ts +0 -10
  243. package/lib/badge/index.d.ts +0 -3
  244. package/lib/badge/types/badge-icon.d.ts +0 -1
  245. package/lib/badge/types/badge-size.d.ts +0 -6
  246. package/lib/badge/types/index.d.ts +0 -2
  247. package/lib/branding/branded.directive.d.ts +0 -6
  248. package/lib/branding/branding.module.d.ts +0 -9
  249. package/lib/branding/index.d.ts +0 -2
  250. package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -7
  251. package/lib/breadcrumb/breadcrumb.component.d.ts +0 -21
  252. package/lib/breadcrumb/breadcrumb.module.d.ts +0 -9
  253. package/lib/breadcrumb/index.d.ts +0 -3
  254. package/lib/button/button.component.d.ts +0 -47
  255. package/lib/button/button.module.d.ts +0 -11
  256. package/lib/button/index.d.ts +0 -3
  257. package/lib/button/themes/button-theme.d.ts +0 -1
  258. package/lib/button/themes/index.d.ts +0 -1
  259. package/lib/button-group/button-group.component.d.ts +0 -22
  260. package/lib/button-group/button-group.module.d.ts +0 -10
  261. package/lib/button-group/index.d.ts +0 -2
  262. package/lib/card-heading/card-heading.component.d.ts +0 -18
  263. package/lib/card-heading/card-heading.module.d.ts +0 -9
  264. package/lib/card-heading/index.d.ts +0 -2
  265. package/lib/data-card/data-card.component.d.ts +0 -68
  266. package/lib/data-card/data-card.module.d.ts +0 -11
  267. package/lib/data-card/index.d.ts +0 -2
  268. package/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.d.ts +0 -31
  269. package/lib/datetime-picker/components/datepicker-nav/index.d.ts +0 -1
  270. package/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.d.ts +0 -15
  271. package/lib/datetime-picker/components/datepicker-template-host/index.d.ts +0 -1
  272. package/lib/datetime-picker/components/datetime-picker/datetime-picker.component.d.ts +0 -155
  273. package/lib/datetime-picker/components/datetime-picker/index.d.ts +0 -1
  274. package/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.d.ts +0 -160
  275. package/lib/datetime-picker/components/datetime-picker-input/index.d.ts +0 -1
  276. package/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.d.ts +0 -24
  277. package/lib/datetime-picker/components/datetime-picker-input-footer/index.d.ts +0 -1
  278. package/lib/datetime-picker/components/index.d.ts +0 -5
  279. package/lib/datetime-picker/constants/datetime-picker-defaults.d.ts +0 -4
  280. package/lib/datetime-picker/constants/index.d.ts +0 -1
  281. package/lib/datetime-picker/datetime-picker.module.d.ts +0 -8
  282. package/lib/datetime-picker/index.d.ts +0 -4
  283. package/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.d.ts +0 -20
  284. package/lib/datetime-picker/services/datetime-formatter/index.d.ts +0 -1
  285. package/lib/datetime-picker/services/index.d.ts +0 -1
  286. package/lib/datetime-picker/types/datetime-picker-value.interface.d.ts +0 -5
  287. package/lib/datetime-picker/types/index.d.ts +0 -1
  288. package/lib/design-components.module.d.ts +0 -24
  289. package/lib/dropdown/components/dropdown-item/dropdown-item.component.d.ts +0 -11
  290. package/lib/dropdown/components/index.d.ts +0 -1
  291. package/lib/dropdown/dropdown.component.d.ts +0 -67
  292. package/lib/dropdown/dropdown.module.d.ts +0 -11
  293. package/lib/dropdown/index.d.ts +0 -4
  294. package/lib/dropdown/types/dropdown-position.d.ts +0 -1
  295. package/lib/dropdown/types/index.d.ts +0 -1
  296. package/lib/file-upload/directives/file-drop.directive.d.ts +0 -11
  297. package/lib/file-upload/directives/index.d.ts +0 -1
  298. package/lib/file-upload/file-upload.component.d.ts +0 -105
  299. package/lib/file-upload/file-upload.module.d.ts +0 -14
  300. package/lib/file-upload/index.d.ts +0 -4
  301. package/lib/file-upload/pipes/human-readable-byte-size.pipe.d.ts +0 -7
  302. package/lib/file-upload/pipes/index.d.ts +0 -1
  303. package/lib/form-field/component/directives/corner-hint.directive.d.ts +0 -5
  304. package/lib/form-field/component/directives/error.directive.d.ts +0 -8
  305. package/lib/form-field/component/directives/form-root.directive.d.ts +0 -26
  306. package/lib/form-field/component/directives/hint.directive.d.ts +0 -6
  307. package/lib/form-field/component/directives/index.d.ts +0 -15
  308. package/lib/form-field/component/directives/label.directive.d.ts +0 -5
  309. package/lib/form-field/component/directives/prefix.directive.d.ts +0 -9
  310. package/lib/form-field/component/directives/suffix.directive.d.ts +0 -9
  311. package/lib/form-field/component/form-field.component.d.ts +0 -37
  312. package/lib/form-field/component/form-field.module.d.ts +0 -14
  313. package/lib/form-field/component/index.d.ts +0 -3
  314. package/lib/form-field/controls/checkbox/checkbox.component.d.ts +0 -137
  315. package/lib/form-field/controls/checkbox/checkbox.module.d.ts +0 -7
  316. package/lib/form-field/controls/checkbox/index.d.ts +0 -2
  317. package/lib/form-field/controls/index.d.ts +0 -5
  318. package/lib/form-field/controls/input/index.d.ts +0 -1
  319. package/lib/form-field/controls/input/input.directive.d.ts +0 -84
  320. package/lib/form-field/controls/radio/index.d.ts +0 -5
  321. package/lib/form-field/controls/radio/injection-tokens.d.ts +0 -4
  322. package/lib/form-field/controls/radio/interfaces/index.d.ts +0 -3
  323. package/lib/form-field/controls/radio/interfaces/radio-button.interface.d.ts +0 -6
  324. package/lib/form-field/controls/radio/interfaces/radio-change-event.interface.d.ts +0 -12
  325. package/lib/form-field/controls/radio/interfaces/radio-group.interface.d.ts +0 -13
  326. package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +0 -98
  327. package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +0 -104
  328. package/lib/form-field/controls/radio/radio.module.d.ts +0 -8
  329. package/lib/form-field/controls/select/index.d.ts +0 -9
  330. package/lib/form-field/controls/select/interfaces/index.d.ts +0 -1
  331. package/lib/form-field/controls/select/interfaces/select-option.interface.d.ts +0 -6
  332. package/lib/form-field/controls/select/option/index.d.ts +0 -1
  333. package/lib/form-field/controls/select/option/select-option.component.d.ts +0 -21
  334. package/lib/form-field/controls/select/option-display/index.d.ts +0 -1
  335. package/lib/form-field/controls/select/option-display/select-option-display.component.d.ts +0 -64
  336. package/lib/form-field/controls/select/option-group/index.d.ts +0 -1
  337. package/lib/form-field/controls/select/option-group/select-option-group.component.d.ts +0 -11
  338. package/lib/form-field/controls/select/option-parent.d.ts +0 -16
  339. package/lib/form-field/controls/select/select-model.d.ts +0 -36
  340. package/lib/form-field/controls/select/select.component.d.ts +0 -232
  341. package/lib/form-field/controls/select/select.module.d.ts +0 -10
  342. package/lib/form-field/controls/select/value-tags-display/index.d.ts +0 -1
  343. package/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.d.ts +0 -46
  344. package/lib/form-field/controls/shared/index.d.ts +0 -1
  345. package/lib/form-field/controls/shared/toggle/components/index.d.ts +0 -1
  346. package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +0 -6
  347. package/lib/form-field/controls/shared/toggle/index.d.ts +0 -3
  348. package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +0 -29
  349. package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +0 -9
  350. package/lib/form-field/controls/tag-select/index.d.ts +0 -1
  351. package/lib/form-field/controls/tag-select/tag-select.component.d.ts +0 -43
  352. package/lib/form-field/form-field-errors.d.ts +0 -2
  353. package/lib/form-field/impdc-forms.d.ts +0 -6
  354. package/lib/form-field/impdc-forms.module.d.ts +0 -13
  355. package/lib/form-field/index.d.ts +0 -1
  356. package/lib/form-field/services/error-state-matcher.service.d.ts +0 -12
  357. package/lib/form-field/services/index.d.ts +0 -2
  358. package/lib/form-field/services/unique-selection-dispatcher.service.d.ts +0 -29
  359. package/lib/form-field/shared/constructors.type.d.ts +0 -7
  360. package/lib/form-field/shared/disabled.mixin.d.ts +0 -10
  361. package/lib/form-field/shared/error-state.mixin.d.ts +0 -31
  362. package/lib/form-field/shared/form-field-control.d.ts +0 -24
  363. package/lib/form-field/shared/index.d.ts +0 -5
  364. package/lib/form-field/shared/tab-index.mixin.d.ts +0 -13
  365. package/lib/icon/icon.component.d.ts +0 -36
  366. package/lib/icon/icon.module.d.ts +0 -9
  367. package/lib/icon/index.d.ts +0 -2
  368. package/lib/index.d.ts +0 -28
  369. package/lib/modal/index.d.ts +0 -3
  370. package/lib/modal/modal.component.d.ts +0 -116
  371. package/lib/modal/modal.module.d.ts +0 -13
  372. package/lib/modal/types/index.d.ts +0 -2
  373. package/lib/modal/types/modal-component-sizes.d.ts +0 -3
  374. package/lib/modal/types/modal-theme.d.ts +0 -7
  375. package/lib/pagination/index.d.ts +0 -2
  376. package/lib/pagination/pagination.component.d.ts +0 -58
  377. package/lib/pagination/pagination.module.d.ts +0 -14
  378. package/lib/progress-bar/index.d.ts +0 -2
  379. package/lib/progress-bar/progress-bar.component.d.ts +0 -31
  380. package/lib/progress-bar/progress-bar.module.d.ts +0 -8
  381. package/lib/scrollable/index.d.ts +0 -2
  382. package/lib/scrollable/scrollable.component.d.ts +0 -41
  383. package/lib/scrollable/scrollable.module.d.ts +0 -12
  384. package/lib/select-icon/index.d.ts +0 -2
  385. package/lib/select-icon/select-icon.component.d.ts +0 -123
  386. package/lib/select-icon/select-icon.module.d.ts +0 -12
  387. package/lib/size-detection/directive/element-size.interface.d.ts +0 -4
  388. package/lib/size-detection/directive/index.d.ts +0 -2
  389. package/lib/size-detection/directive/size-detector.directive.d.ts +0 -14
  390. package/lib/size-detection/index.d.ts +0 -3
  391. package/lib/size-detection/size-detection.module.d.ts +0 -8
  392. package/lib/spinner/index.d.ts +0 -2
  393. package/lib/spinner/spinner.component.d.ts +0 -13
  394. package/lib/spinner/spinner.module.d.ts +0 -8
  395. package/lib/table/components/bulk-actions/bulk-actions.component.d.ts +0 -10
  396. package/lib/table/components/column-heading/column-heading.component.d.ts +0 -14
  397. package/lib/table/components/index.d.ts +0 -3
  398. package/lib/table/components/row-actions/row-actions.component.d.ts +0 -21
  399. package/lib/table/constants/index.d.ts +0 -2
  400. package/lib/table/constants/public-table.constants.d.ts +0 -1
  401. package/lib/table/constants/table.constants.d.ts +0 -9
  402. package/lib/table/containers/index.d.ts +0 -1
  403. package/lib/table/containers/table.component.d.ts +0 -178
  404. package/lib/table/directives/collapse-monitor.directive.d.ts +0 -12
  405. package/lib/table/directives/index.d.ts +0 -3
  406. package/lib/table/directives/table-inject-component.directive.d.ts +0 -16
  407. package/lib/table/directives/table.directive.d.ts +0 -23
  408. package/lib/table/enumerations/index.d.ts +0 -1
  409. package/lib/table/enumerations/table-column-type.d.ts +0 -19
  410. package/lib/table/helpers/index.d.ts +0 -1
  411. package/lib/table/helpers/table-theme.helper.d.ts +0 -7
  412. package/lib/table/index.d.ts +0 -7
  413. package/lib/table/interfaces/cell-renderer.interface.d.ts +0 -13
  414. package/lib/table/interfaces/collapsible-row-content-context.interface.d.ts +0 -39
  415. package/lib/table/interfaces/custom-cell-renderer-components.type.d.ts +0 -3
  416. package/lib/table/interfaces/index.d.ts +0 -12
  417. package/lib/table/interfaces/sort-by-payload.interface.d.ts +0 -11
  418. package/lib/table/interfaces/table-cell-option.interface.d.ts +0 -4
  419. package/lib/table/interfaces/table-column-defs.type.d.ts +0 -53
  420. package/lib/table/interfaces/table-event-payload.interface.d.ts +0 -13
  421. package/lib/table/interfaces/table-row-action-payload.interface.d.ts +0 -13
  422. package/lib/table/interfaces/table-row-action.interface.d.ts +0 -17
  423. package/lib/table/interfaces/table-row-collapse-change.interface.d.ts +0 -11
  424. package/lib/table/interfaces/table-row-item.interface.d.ts +0 -8
  425. package/lib/table/table.module.d.ts +0 -24
  426. package/lib/tag/index.d.ts +0 -1
  427. package/lib/tag/tag.component.d.ts +0 -54
  428. package/lib/text-highlight/index.d.ts +0 -2
  429. package/lib/text-highlight/text-highlight.component.d.ts +0 -37
  430. package/lib/text-highlight/text-highlight.module.d.ts +0 -8
  431. package/public-api.d.ts +0 -4
  432. package/services/index.d.ts +0 -1
  433. package/services/interaction.service.d.ts +0 -28
  434. package/types/component-size.d.ts +0 -12
  435. package/types/component-theme.d.ts +0 -12
  436. package/types/index.d.ts +0 -2
  437. package/utilities/boolean-props.d.ts +0 -8
  438. package/utilities/dc.d.ts +0 -6
  439. package/utilities/index.d.ts +0 -5
  440. package/utilities/lc.d.ts +0 -6
  441. package/utilities/number-props.d.ts +0 -15
  442. package/utilities/sanitize.d.ts +0 -1
@@ -1,474 +0,0 @@
1
- import { Component, ContentChild, EventEmitter, Host, Input, Optional, Output } from '@angular/core';
2
- import { get as getNestedValue, set as setNestedValue } from 'lodash';
3
- import { debounceTime } from 'rxjs/operators';
4
- import { DEBOUNCE_TIME } from '../constants/index';
5
- import { TableColumnType } from '../enumerations/index';
6
- import { TableThemeHelper } from '../helpers';
7
- import { ComponentTheme } from '../../../types';
8
- import { PaginationComponent } from '../../pagination';
9
- import { TableBulkActionsComponent } from '../components';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/common";
12
- import * as i2 from "../../branding";
13
- import * as i3 from "../../branding/branded.directive";
14
- import * as i4 from "../../icon/icon.component";
15
- import * as i5 from "../../form-field/controls/checkbox/checkbox.component";
16
- import * as i6 from "../../form-field/controls/select/option/select-option.component";
17
- import * as i7 from "../../form-field/controls/select/select.component";
18
- import * as i8 from "../../form-field/controls/input/input.directive";
19
- import * as i9 from "@angular/forms";
20
- import * as i10 from "../../spinner/spinner.component";
21
- import * as i11 from "../../badge/badge.component";
22
- import * as i12 from "../directives/collapse-monitor.directive";
23
- import * as i13 from "../directives/table.directive";
24
- import * as i14 from "../components/column-heading/column-heading.component";
25
- import * as i15 from "../directives/table-inject-component.directive";
26
- import * as i16 from "../components/row-actions/row-actions.component";
27
- /**
28
- * The `TableComponent` (`<impdc-table`) is a data table component.
29
- * To use, import `TableModule` from `@impartner/design-components`.
30
- */
31
- export class TableComponent {
32
- /**
33
- * Whether individual rows can be selected. Will be `true` if explicitly set to `true` or `canSelectAllRows` is `true`.
34
- */
35
- set canSelectRows(value) {
36
- this._canSelectRows = value;
37
- }
38
- get canSelectRows() {
39
- return this.canSelectAllRows || this._canSelectRows || !!this.bulkActions;
40
- }
41
- /**
42
- * Whether all rows can be selected at once. Will be `true` if explicitly set to `true` or if `TableBulkActionsComponent` is content projected.
43
- */
44
- set canSelectAllRows(value) {
45
- this._canSelectAllRows = value;
46
- }
47
- get canSelectAllRows() {
48
- return this._canSelectAllRows || !!this.bulkActions;
49
- }
50
- /**
51
- * An array of currently selected IDs from the `tableData` input. Array must be of type `(string | number)[]`.
52
- */
53
- set selectedRowIds(value) {
54
- this._selectedRowIds = [...value];
55
- }
56
- get selectedRowIds() {
57
- return [...this._selectedRowIds];
58
- }
59
- /** @ignore */
60
- get someSelected() {
61
- return (!!this._selectedRowIds &&
62
- this._selectedRowIds.length > 0 &&
63
- !!this.tableData &&
64
- this.tableData.length > 0 &&
65
- this._selectedRowIds.length < this.tableData.length);
66
- }
67
- /** @ignore */
68
- get tableSpan() {
69
- let cols = this.columnDefs.length;
70
- if (this.canSelectRows) {
71
- cols++;
72
- }
73
- if (this.collapsibleTemplate) {
74
- cols++;
75
- }
76
- return cols;
77
- }
78
- constructor(_datePipe, _percentPipe, _decmialPipe, _changeDetectorRef, _branded) {
79
- this._datePipe = _datePipe;
80
- this._percentPipe = _percentPipe;
81
- this._decmialPipe = _decmialPipe;
82
- this._changeDetectorRef = _changeDetectorRef;
83
- this._branded = _branded;
84
- /**
85
- * Whether the table data is currently being loaded. The `<impdc-spinner>` will show if data is loading.
86
- */
87
- this.loading = false;
88
- /**
89
- * The visible columns of the table. Each `ITableColumnDef` defines properties regarding the display, formatting and interaction of the column's cells.
90
- * Column/cell color precedence is:
91
- * 1) `fieldColor` - allows an `ITableColumnDef` to delegate the responsibility of cell color to an `ITableRowItem` property.
92
- * 2) `colorGetter`- allows an `ITableColumnDef` to delegate the responsibility of cell color to a function of the `ITableRowItem` determined by the developer.
93
- * 3) `color` - a property of an `ITableColumnDef`.
94
- */
95
- this.columnDefs = [];
96
- /**
97
- * Whether the table is striped.
98
- */
99
- this.striped = true;
100
- /**
101
- * Whether table rows should apply hover styles when hovered over via cursor.
102
- */
103
- this.hover = true;
104
- /**
105
- * The layout algorithm to be used when rendering the table.
106
- */
107
- this.layout = 'auto';
108
- /**
109
- * The placeholder text and empty value display text for `<impdc-select>` instances in cells with a `ITableColumnDef` `columnType` = `SingleSelect` or `MultiSelect`.
110
- */
111
- this.selectPlaceholder = '';
112
- /**
113
- * The `columnDefs` index of the currently sorted column.
114
- */
115
- this.sortColumnIndex = 0;
116
- /**
117
- * The direction of the currently sorted column.
118
- */
119
- this.sortDirection = 'asc';
120
- /**
121
- * The table row data as an array of `ITableRowItem`.
122
- */
123
- this.tableData = [];
124
- /**
125
- * An optional template for content that may be rendered below a row in an collapsible view. Value can either be an Angular template or a function that can evaluated
126
- * to resolve to a template. The template will be rendered with a provided `ICollapsibleRowContentContext` object as template context, with the current `ITableRowData`
127
- * implicitly available as a default template key.
128
- */
129
- this.collapsibleTemplate = null;
130
- /**
131
- * The clickable control that will trigger expansion and collapse of content when using `collapsibleTemplate` functionality.
132
- * When set to `button`, the collapsible content's state can only be toggled from a clickable button at the start of the row.
133
- * When set to `row`, the entire row will become a clickable trigger.
134
- */
135
- this.collapsibleTrigger = 'button';
136
- /**
137
- * Event emitted when one or multiple rows are selected. Emits `(string | number)[]` payload.
138
- */
139
- this.rowSelect = new EventEmitter();
140
- /**
141
- * Event emitted when a column is sorted. Emits `ISortByPayload` payload.
142
- */
143
- this.sortBy = new EventEmitter();
144
- /**
145
- * Event emitted when a row link is clicked. Emits `ITableEventPayload` payload.
146
- */
147
- this.linkClick = new EventEmitter();
148
- /**
149
- * Event emitted when a row action is clicked. Emits an `ITableRowActionPayload` payload.
150
- */
151
- this.rowActionClick = new EventEmitter();
152
- /**
153
- * Event emitted when a row input value is changed. Emitted cells of `columnType` `SingleSelect`, `MultiSelect`, `Input`, `Boolean` or `Icon`.
154
- * Not emitted if column definition property `disabled` = `true`. Emits `ITableEventPayload` payload.
155
- */
156
- this.inputChange = new EventEmitter();
157
- /**
158
- * Event emitted when a row with collapsible content has its collapse state changed.
159
- */
160
- this.rowCollapseChange = new EventEmitter();
161
- /** @ignore */
162
- this.paginationComponent = undefined;
163
- /** @ignore */
164
- this.bulkActions = undefined;
165
- /** @ignore */
166
- this.cellType = TableColumnType;
167
- /** @ignore */
168
- this.allSelected = true;
169
- /** @ignore */
170
- this.branded = false;
171
- this._canSelectRows = false;
172
- this._canSelectAllRows = false;
173
- this._selectedRowIds = [];
174
- this._inputChange = new EventEmitter();
175
- this.branded = _branded ? true : false;
176
- this._inputChange
177
- .pipe(debounceTime(DEBOUNCE_TIME))
178
- .subscribe(this.inputChange);
179
- }
180
- ngOnChanges(changes) {
181
- if (changes['selectedRowIds'] || changes['tableData']) {
182
- if (!this.tableData ||
183
- !this.tableData.length ||
184
- !this.selectedRowIds ||
185
- !this.selectedRowIds.length) {
186
- this.allSelected = false;
187
- }
188
- else {
189
- this.allSelected = this.selectedRowIds.length >= this.tableData.length;
190
- }
191
- }
192
- }
193
- /** @ignore */
194
- getMailToValue(columnIndex, currentRow) {
195
- const { columnType, truncated: truncated } = this._getColumnDefByIndex(columnIndex);
196
- let value = this._getValue(columnIndex, currentRow);
197
- if (columnType !== TableColumnType.Email) {
198
- return String(value);
199
- }
200
- value = value ? `mailto:${value}` : value;
201
- return String(value);
202
- }
203
- /** @ignore */
204
- getStringValue(columnIndex, currentRow) {
205
- const value = this.getValue(columnIndex, currentRow);
206
- if (Array.isArray(value)) {
207
- return value.join(';');
208
- }
209
- return String(value);
210
- }
211
- /** @ignore */
212
- getValue(columnIndex, currentRow) {
213
- const { columnType, truncated: truncated } = this._getColumnDefByIndex(columnIndex);
214
- let value = this._getValue(columnIndex, currentRow);
215
- switch (columnType) {
216
- case TableColumnType.Decimal: {
217
- value = this._decmialPipe.transform(Number(value) || 0) || '';
218
- break;
219
- }
220
- case TableColumnType.Date: {
221
- const date = new Date(String(value));
222
- const validDate = date instanceof Date && !isNaN(date.getTime());
223
- value = validDate
224
- ? this._datePipe.transform(date, 'MM/dd/yyyy') || ''
225
- : String(value);
226
- break;
227
- }
228
- case TableColumnType.DateTime: {
229
- const dateTime = new Date(String(value));
230
- const validDateTime = dateTime instanceof Date && !isNaN(dateTime.getTime());
231
- value = validDateTime
232
- ? this._datePipe.transform(dateTime, 'MM/dd/yyyy h:mm:ss a') || ''
233
- : String(value);
234
- break;
235
- }
236
- case TableColumnType.Link: {
237
- value = String(value).replace(/(^\w+:|^)\/\//, '');
238
- break;
239
- }
240
- case TableColumnType.Percentage: {
241
- value = this._percentPipe.transform(Number(value) || 0) || '';
242
- break;
243
- }
244
- case TableColumnType.Url: {
245
- if (!/(http(s?)):\/\//i.test(String(value))) {
246
- value = `https://${value}`;
247
- }
248
- break;
249
- }
250
- case TableColumnType.Text: {
251
- if (Array.isArray(value)) {
252
- value = value.join('; ');
253
- }
254
- if (!truncated) {
255
- return value;
256
- }
257
- const truncateString = (string = '', maxLength = truncated) => string.length > maxLength
258
- ? `${string.substring(0, maxLength)}…`
259
- : string;
260
- !!truncated
261
- ? (value = truncateString(String(value), truncated))
262
- : value;
263
- break;
264
- }
265
- case TableColumnType.MultiSelect:
266
- if (typeof value === 'string') {
267
- value = value.split(';')?.map(v => v.trim()) || [];
268
- }
269
- return value;
270
- }
271
- return String(value);
272
- }
273
- /** @ignore */
274
- getRawValue(columnIndex, currentRow) {
275
- const { field } = this._getColumnDefByIndex(columnIndex);
276
- if (!field) {
277
- return '';
278
- }
279
- return currentRow[field] || '';
280
- }
281
- /** @ignore */
282
- getCellColor(columnDefinition, item) {
283
- return TableThemeHelper.getCellColor(columnDefinition, item);
284
- }
285
- /** @ignore */
286
- getTheme(columnDefinition, item) {
287
- return (TableThemeHelper.getTheme(columnDefinition, item) ||
288
- ComponentTheme.Primary);
289
- }
290
- /** @ignore */
291
- isSortedColumn(columnIndex) {
292
- return columnIndex === this.sortColumnIndex;
293
- }
294
- /** @ignore */
295
- isRowSelected(id) {
296
- return this.selectedRowIds.includes(id);
297
- }
298
- /** @ignore */
299
- handleSelectAll(event) {
300
- if (!this.canSelectAllRows || !this.tableData) {
301
- return;
302
- }
303
- if (event.checked) {
304
- this._selectedRowIds = this.tableData?.map(row => row.id) || [];
305
- }
306
- else {
307
- this._selectedRowIds = [];
308
- }
309
- this._selectedRowIds.sort();
310
- this.allSelected = this.selectedRowIds.length >= this.tableData.length;
311
- this.rowSelect.emit(this.selectedRowIds);
312
- }
313
- /** @ignore */
314
- handleSort(columnIndex) {
315
- if (columnIndex === this.sortColumnIndex) {
316
- this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
317
- }
318
- else {
319
- this.sortColumnIndex = columnIndex;
320
- this.sortDirection = 'asc';
321
- }
322
- const field = this._getColumnDefByIndex(columnIndex).field || '';
323
- this.sortBy.emit({
324
- columnIndex,
325
- field,
326
- direction: this.sortDirection
327
- });
328
- }
329
- /** @ignore */
330
- handleRowSelect(event, rowId) {
331
- if (!this.canSelectRows) {
332
- return;
333
- }
334
- if (event.checked && !this._selectedRowIds.includes(rowId)) {
335
- this._selectedRowIds.push(rowId);
336
- }
337
- else if (!event.checked && this._selectedRowIds.includes(rowId)) {
338
- const idx = this._selectedRowIds.indexOf(rowId);
339
- if (idx > -1) {
340
- this._selectedRowIds.splice(idx, 1);
341
- }
342
- }
343
- if (this._selectedRowIds.length) {
344
- this._selectedRowIds.sort();
345
- }
346
- this.allSelected = this.selectedRowIds.length >= this.tableData.length;
347
- this.rowSelect.emit(this.selectedRowIds);
348
- }
349
- /** @ignore */
350
- handleCellValueChange(columnIndex, rowIndex, value) {
351
- const { field, columnType } = this._getColumnDefByIndex(columnIndex);
352
- let currentValue = value;
353
- if (columnType !== TableColumnType.Boolean && !Array.isArray(value)) {
354
- currentValue = isNaN(Number(value)) ? value : Number(value);
355
- }
356
- const item = this.tableData[rowIndex];
357
- setNestedValue(item, String(field), currentValue);
358
- this._inputChange.emit({
359
- columnIndex,
360
- item,
361
- value: currentValue
362
- });
363
- this._changeDetectorRef.detectChanges();
364
- }
365
- /** @ignore */
366
- handleLinkClick(columnIndex, item, event) {
367
- event.preventDefault();
368
- event.stopPropagation();
369
- this.linkClick.emit({
370
- item,
371
- columnIndex
372
- });
373
- }
374
- /** @ignore */
375
- handleActionClick(columnIndex, item, actionApiName) {
376
- this.rowActionClick.emit({
377
- item,
378
- columnIndex,
379
- actionApiName
380
- });
381
- }
382
- columnDefIsActions(columnDef) {
383
- return columnDef.columnType === TableColumnType.Actions;
384
- }
385
- tryToggleCollapse(collapsibleForRowResult, ngbCollapse, event, source) {
386
- if (collapsibleForRowResult.template &&
387
- (this.collapsibleTrigger === 'row' || this.collapsibleTrigger === source)) {
388
- ngbCollapse.toggle();
389
- event.stopPropagation();
390
- }
391
- }
392
- getCollapsibleTemplateForRow(row) {
393
- return {
394
- template: this.collapsibleTemplate &&
395
- typeof this.collapsibleTemplate === 'function'
396
- ? this.collapsibleTemplate(row)
397
- : this.collapsibleTemplate
398
- };
399
- }
400
- _getColumnDefByIndex(columnIndex) {
401
- return this.columnDefs[columnIndex];
402
- }
403
- _getValue(columnIndex, currentRow) {
404
- try {
405
- const { field, valueGetter } = this._getColumnDefByIndex(columnIndex);
406
- const value = valueGetter
407
- ? valueGetter(currentRow)
408
- : getNestedValue(currentRow, String(field), '');
409
- return value || '';
410
- }
411
- catch (e) {
412
- return '';
413
- }
414
- }
415
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: TableComponent, deps: [{ token: i1.DatePipe }, { token: i1.PercentPipe }, { token: i1.DecimalPipe }, { token: i0.ChangeDetectorRef }, { token: i2.BrandedDirective, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
416
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: TableComponent, selector: "impdc-table", inputs: { loading: "loading", columnDefs: "columnDefs", striped: "striped", hover: "hover", layout: "layout", canSelectRows: "canSelectRows", canSelectAllRows: "canSelectAllRows", selectPlaceholder: "selectPlaceholder", sortColumnIndex: "sortColumnIndex", sortDirection: "sortDirection", tableData: "tableData", selectedRowIds: "selectedRowIds", customCellComponents: "customCellComponents", collapsibleTemplate: "collapsibleTemplate", collapsibleTrigger: "collapsibleTrigger" }, outputs: { rowSelect: "rowSelect", sortBy: "sortBy", linkClick: "linkClick", rowActionClick: "rowActionClick", inputChange: "inputChange", rowCollapseChange: "rowCollapseChange" }, queries: [{ propertyName: "paginationComponent", first: true, predicate: PaginationComponent, descendants: true }, { propertyName: "bulkActions", first: true, predicate: TableBulkActionsComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (tableData) {\n <table\n impdcTable\n [striped]=\"striped && !collapsibleTemplate\"\n [layout]=\"layout\"\n [hover]=\"hover\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (collapsibleTemplate) {\n <th\n scope=\"col\"\n [class.heading-below-bulk-actions]=\"!!bulkActions\"\n class=\"impdc-table-collapsible-content-row-button-container\"></th>\n }\n @if (canSelectRows) {\n <th\n scope=\"col\"\n class=\"impdc-table-selectable-row-toggle-container\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n }\n @for (\n columnDef of columnDefs;\n track columnDef;\n let columnIndex = $index\n ) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else {\n @for (\n row of tableData;\n track row.id;\n let rowIndex = $index;\n let rowFirst = $first;\n let rowLast = $last;\n let rowEven = $even;\n let rowOdd = $odd\n ) {\n @if (\n getCollapsibleTemplateForRow(row);\n as collapsibleTemplateForRow\n ) {\n <tr\n [class.impdc-table-collapsible-row-trigger]=\"\n collapsibleTrigger === 'row'\n \"\n [class.table-active]=\"isRowSelected(row.id)\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'row'\n )\n \">\n @if (collapsibleTemplate) {\n <td\n class=\"impdc-table-collapsible-content-row-button-container\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <button\n type=\"button\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'button'\n )\n \"\n class=\"impdc-table-collapsible-content-row-button btn btn-link\">\n <span\n class=\"far fa-chevron-right\"\n [class.fa-rotate-90]=\"\n !collapseMonitor.ngbCollapsing()\n \"></span>\n </button>\n </div>\n }\n </td>\n }\n @if (canSelectRows) {\n <td class=\"impdc-table-selectable-row-toggle-container\">\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"\n let columnDef of columnDefs;\n index as colIndex;\n last as isLast\n \"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) {\n @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n }\n @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row, $event)\">\n @if (!branded) {\n <a class=\"link-primary\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n [attr.href]=\"getMailToValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \"\n (click)=\"$event.stopPropagation()\" />\n </span>\n }\n @case (cellType.Boolean) {\n <span>\n @if (\n columnDef.disabled &&\n getValue(colIndex, row) === 'true'\n ) {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.checked\n )\n \"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n }\n </span>\n }\n @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n allowClear=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.MultiSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n multiple=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.CellRender) {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n <ng-template\n impdcTableInjectComponent\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [customCellComponents]=\"customCellComponents || {}\"\n [value]=\"getRawValue(colIndex, row)\"></ng-template>\n </span>\n }\n @case (cellType.Icon) {\n <span>\n <span\n impdc-icon\n [name]=\"columnDef.iconName\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n </span>\n }\n @case (cellType.Actions) {\n <span>\n <!-- will always return 'true', but needed to satisfy the type engine -->\n @if (columnDefIsActions(columnDef)) {\n <impdc-row-actions\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [lastColumn]=\"isLast\"\n (actionClick)=\"\n handleActionClick(colIndex, row, $event)\n \"\n (click)=\"\n $event.stopPropagation()\n \"></impdc-row-actions>\n }\n </span>\n }\n @default {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n {{ getValue(colIndex, row) }}\n </span>\n }\n }\n </div>\n </td>\n </tr>\n <tr\n class=\"impdc-table-collapsible-content-row\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n <td class=\"w-100 p-0\" [attr.colspan]=\"tableSpan\">\n <div\n class=\"impdc-table-collapsible-content-container\"\n #ngbCollapse=\"ngbCollapse\"\n #collapseMonitor=\"impdcCollapseMonitor\"\n [impdcCollapseMonitor]=\"true\"\n (collapseChange)=\"\n rowCollapseChange.emit({ row, collapsed: $event })\n \">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n collapsibleTemplateForRow.template;\n context: {\n $implicit: row,\n collapsed: collapseMonitor.collapsed(),\n selected: isRowSelected(row.id),\n index: rowIndex,\n first: !!rowFirst,\n last: !!rowLast,\n even: !!rowEven,\n odd: !!rowOdd\n }\n \"></ng-container>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n } @empty {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"no-data\">\n <ng-content select=\"[noData]\"></ng-content>\n </td>\n </tr>\n }\n }\n </tbody>\n <tfoot>\n @if (paginationComponent) {\n <tr>\n <td [attr.colspan]=\"tableSpan\">\n <ng-content\n select=\"impdc-pagination, div[impdc-pagination]\"></ng-content>\n </td>\n </tr>\n }\n </tfoot>\n </table>\n}\n", styles: [".bulk-action-container{display:flex;flex-direction:row;border:1px solid var(--impd-color-gray-200);border-top-left-radius:.6rem;border-top-right-radius:.6rem;border-bottom:0px}.bulk-action-container .bulk-action-checkbox{padding:1.6rem 2rem}.bulk-action-container .bulk-actions{display:flex;flex-direction:row;gap:.4rem}.col-no-padding{padding:0!important}.data-loading{height:var(--impd-size-80);vertical-align:middle;text-align:center}.no-data{vertical-align:middle;text-align:center}.select-row{display:flex;height:var(--impd-size-4);align-items:center;justify-items:end;border-radius:var(--impd-border-radius-default)}.heading-with-checkbox{padding-left:5px;padding-right:10px}.actions-column{width:.1%;white-space:nowrap}tr.impdc-table-collapsible-content-row:has(>td>div.impdc-table-collapsible-content-container.collapse:not(.show)){display:none}tr:has(td.impdc-table-collapsible-content-row-button-container),tr.impdc-table-collapsible-content-row{transition:background-color .35s ease-in-out}tr:has(td.impdc-table-collapsible-content-row-button-container.opened),tr.impdc-table-collapsible-content-row.opened{background-color:var(--impd-color-gray-50)}tr.impdc-table-collapsible-row-trigger{cursor:pointer}table ::ng-deep tbody>tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-5);padding-right:var(--impd-size-1);width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container{padding-left:var(--impd-size-5);padding-right:0;width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container:empty{padding:0}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-3);width:var(--impd-size-8)}.impdc-table-collapsible-content-row-button{align-items:center;border-radius:var(--impd-border-radius-2xl);color:var(--impd-color-gray-700)!important;display:flex;height:var(--impd-size-5);justify-content:center;padding:0;width:var(--impd-size-5);box-shadow:none}.impdc-table-collapsible-content-row-button:hover,.impdc-table-collapsible-content-row-button:focus,.impdc-table-collapsible-content-row-button:active{background-color:var(--impd-color-gray-100)}.impdc-table-collapsible-content-row-button impdc-icon{line-height:1}.impdc-table-collapsible-content-row-button>span.fa-chevron-right{font-size:1.6rem;transition:transform .35s}table.table-striped>tbody>tr:nth-of-type(4n+3)>*{--impartner-hex-table-bg-type: var(--impd-color-gray-50)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.BrandedDirective, selector: "[impdcBranded]" }, { kind: "component", type: i4.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }, { kind: "component", type: i5.CheckboxComponent, selector: "impdc-checkbox", inputs: ["tabIndex", "id", "label", "description", "isSwitch", "switchIcons", "inline", "layout", "checked", "indeterminate", "disabled", "errorStateMatcher", "required"], outputs: ["change", "indeterminateChange"], exportAs: ["impdcCheckControl"] }, { kind: "component", type: i6.SelectOptionComponent, selector: "impdc-select-option", inputs: ["value", "label", "disabled"] }, { kind: "component", type: i7.SelectComponent, selector: "impdc-select", inputs: ["disabled", "tabIndex", "search", "placeholder", "required", "compareWith", "dropdownContainer", "errorStateMatcher", "allowClear", "multiple", "multipleDisplay"], outputs: ["selectionChange", "valueChange", "searchTextChanges"], exportAs: ["impdcSelect"] }, { kind: "directive", type: i8.InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.SpinnerComponent, selector: "impdc-spinner, div[impdc-spinner]", inputs: ["accessibilityText"] }, { kind: "component", type: i11.BadgeComponent, selector: "impdc-badge, [impdc-badge]", inputs: ["text", "icon", "theme", "size", "hideBg", "rounded", "dismissable"], outputs: ["dismiss"] }, { kind: "directive", type: i12.CollapseMonitorDirective, selector: "[impdcCollapseMonitor]", outputs: ["collapseChange"], exportAs: ["impdcCollapseMonitor"] }, { kind: "directive", type: i13.TableDirective, selector: "table[impdcTable]", inputs: ["striped", "hover", "layout"] }, { kind: "component", type: i14.ColumnHeadingComponent, selector: "impdc-column-heading", inputs: ["isSortable", "columnIndex", "sortColumnIndex", "direction", "text"], outputs: ["sort"] }, { kind: "directive", type: i15.TableInjectComponentDirective, selector: "[impdcTableInjectComponent]", inputs: ["columnDef", "value", "rowItem", "customCellComponents"] }, { kind: "component", type: i16.RowActionsComponent, selector: "impdc-row-actions", inputs: ["columnDef", "rowItem", "lastColumn"], outputs: ["actionClick"] }] }); }
417
- }
418
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: TableComponent, decorators: [{
419
- type: Component,
420
- args: [{ selector: 'impdc-table', template: "@if (tableData) {\n <table\n impdcTable\n [striped]=\"striped && !collapsibleTemplate\"\n [layout]=\"layout\"\n [hover]=\"hover\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (collapsibleTemplate) {\n <th\n scope=\"col\"\n [class.heading-below-bulk-actions]=\"!!bulkActions\"\n class=\"impdc-table-collapsible-content-row-button-container\"></th>\n }\n @if (canSelectRows) {\n <th\n scope=\"col\"\n class=\"impdc-table-selectable-row-toggle-container\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n }\n @for (\n columnDef of columnDefs;\n track columnDef;\n let columnIndex = $index\n ) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else {\n @for (\n row of tableData;\n track row.id;\n let rowIndex = $index;\n let rowFirst = $first;\n let rowLast = $last;\n let rowEven = $even;\n let rowOdd = $odd\n ) {\n @if (\n getCollapsibleTemplateForRow(row);\n as collapsibleTemplateForRow\n ) {\n <tr\n [class.impdc-table-collapsible-row-trigger]=\"\n collapsibleTrigger === 'row'\n \"\n [class.table-active]=\"isRowSelected(row.id)\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'row'\n )\n \">\n @if (collapsibleTemplate) {\n <td\n class=\"impdc-table-collapsible-content-row-button-container\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <button\n type=\"button\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'button'\n )\n \"\n class=\"impdc-table-collapsible-content-row-button btn btn-link\">\n <span\n class=\"far fa-chevron-right\"\n [class.fa-rotate-90]=\"\n !collapseMonitor.ngbCollapsing()\n \"></span>\n </button>\n </div>\n }\n </td>\n }\n @if (canSelectRows) {\n <td class=\"impdc-table-selectable-row-toggle-container\">\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"\n let columnDef of columnDefs;\n index as colIndex;\n last as isLast\n \"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) {\n @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n }\n @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row, $event)\">\n @if (!branded) {\n <a class=\"link-primary\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n [attr.href]=\"getMailToValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \"\n (click)=\"$event.stopPropagation()\" />\n </span>\n }\n @case (cellType.Boolean) {\n <span>\n @if (\n columnDef.disabled &&\n getValue(colIndex, row) === 'true'\n ) {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.checked\n )\n \"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n }\n </span>\n }\n @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n allowClear=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.MultiSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n multiple=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.CellRender) {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n <ng-template\n impdcTableInjectComponent\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [customCellComponents]=\"customCellComponents || {}\"\n [value]=\"getRawValue(colIndex, row)\"></ng-template>\n </span>\n }\n @case (cellType.Icon) {\n <span>\n <span\n impdc-icon\n [name]=\"columnDef.iconName\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n </span>\n }\n @case (cellType.Actions) {\n <span>\n <!-- will always return 'true', but needed to satisfy the type engine -->\n @if (columnDefIsActions(columnDef)) {\n <impdc-row-actions\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [lastColumn]=\"isLast\"\n (actionClick)=\"\n handleActionClick(colIndex, row, $event)\n \"\n (click)=\"\n $event.stopPropagation()\n \"></impdc-row-actions>\n }\n </span>\n }\n @default {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n {{ getValue(colIndex, row) }}\n </span>\n }\n }\n </div>\n </td>\n </tr>\n <tr\n class=\"impdc-table-collapsible-content-row\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n <td class=\"w-100 p-0\" [attr.colspan]=\"tableSpan\">\n <div\n class=\"impdc-table-collapsible-content-container\"\n #ngbCollapse=\"ngbCollapse\"\n #collapseMonitor=\"impdcCollapseMonitor\"\n [impdcCollapseMonitor]=\"true\"\n (collapseChange)=\"\n rowCollapseChange.emit({ row, collapsed: $event })\n \">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n collapsibleTemplateForRow.template;\n context: {\n $implicit: row,\n collapsed: collapseMonitor.collapsed(),\n selected: isRowSelected(row.id),\n index: rowIndex,\n first: !!rowFirst,\n last: !!rowLast,\n even: !!rowEven,\n odd: !!rowOdd\n }\n \"></ng-container>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n } @empty {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"no-data\">\n <ng-content select=\"[noData]\"></ng-content>\n </td>\n </tr>\n }\n }\n </tbody>\n <tfoot>\n @if (paginationComponent) {\n <tr>\n <td [attr.colspan]=\"tableSpan\">\n <ng-content\n select=\"impdc-pagination, div[impdc-pagination]\"></ng-content>\n </td>\n </tr>\n }\n </tfoot>\n </table>\n}\n", styles: [".bulk-action-container{display:flex;flex-direction:row;border:1px solid var(--impd-color-gray-200);border-top-left-radius:.6rem;border-top-right-radius:.6rem;border-bottom:0px}.bulk-action-container .bulk-action-checkbox{padding:1.6rem 2rem}.bulk-action-container .bulk-actions{display:flex;flex-direction:row;gap:.4rem}.col-no-padding{padding:0!important}.data-loading{height:var(--impd-size-80);vertical-align:middle;text-align:center}.no-data{vertical-align:middle;text-align:center}.select-row{display:flex;height:var(--impd-size-4);align-items:center;justify-items:end;border-radius:var(--impd-border-radius-default)}.heading-with-checkbox{padding-left:5px;padding-right:10px}.actions-column{width:.1%;white-space:nowrap}tr.impdc-table-collapsible-content-row:has(>td>div.impdc-table-collapsible-content-container.collapse:not(.show)){display:none}tr:has(td.impdc-table-collapsible-content-row-button-container),tr.impdc-table-collapsible-content-row{transition:background-color .35s ease-in-out}tr:has(td.impdc-table-collapsible-content-row-button-container.opened),tr.impdc-table-collapsible-content-row.opened{background-color:var(--impd-color-gray-50)}tr.impdc-table-collapsible-row-trigger{cursor:pointer}table ::ng-deep tbody>tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-5);padding-right:var(--impd-size-1);width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container{padding-left:var(--impd-size-5);padding-right:0;width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container:empty{padding:0}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-3);width:var(--impd-size-8)}.impdc-table-collapsible-content-row-button{align-items:center;border-radius:var(--impd-border-radius-2xl);color:var(--impd-color-gray-700)!important;display:flex;height:var(--impd-size-5);justify-content:center;padding:0;width:var(--impd-size-5);box-shadow:none}.impdc-table-collapsible-content-row-button:hover,.impdc-table-collapsible-content-row-button:focus,.impdc-table-collapsible-content-row-button:active{background-color:var(--impd-color-gray-100)}.impdc-table-collapsible-content-row-button impdc-icon{line-height:1}.impdc-table-collapsible-content-row-button>span.fa-chevron-right{font-size:1.6rem;transition:transform .35s}table.table-striped>tbody>tr:nth-of-type(4n+3)>*{--impartner-hex-table-bg-type: var(--impd-color-gray-50)}\n"] }]
421
- }], ctorParameters: () => [{ type: i1.DatePipe }, { type: i1.PercentPipe }, { type: i1.DecimalPipe }, { type: i0.ChangeDetectorRef }, { type: i2.BrandedDirective, decorators: [{
422
- type: Optional
423
- }, {
424
- type: Host
425
- }] }], propDecorators: { loading: [{
426
- type: Input
427
- }], columnDefs: [{
428
- type: Input
429
- }], striped: [{
430
- type: Input
431
- }], hover: [{
432
- type: Input
433
- }], layout: [{
434
- type: Input
435
- }], canSelectRows: [{
436
- type: Input
437
- }], canSelectAllRows: [{
438
- type: Input
439
- }], selectPlaceholder: [{
440
- type: Input
441
- }], sortColumnIndex: [{
442
- type: Input
443
- }], sortDirection: [{
444
- type: Input
445
- }], tableData: [{
446
- type: Input
447
- }], selectedRowIds: [{
448
- type: Input
449
- }], customCellComponents: [{
450
- type: Input
451
- }], collapsibleTemplate: [{
452
- type: Input
453
- }], collapsibleTrigger: [{
454
- type: Input
455
- }], rowSelect: [{
456
- type: Output
457
- }], sortBy: [{
458
- type: Output
459
- }], linkClick: [{
460
- type: Output
461
- }], rowActionClick: [{
462
- type: Output
463
- }], inputChange: [{
464
- type: Output
465
- }], rowCollapseChange: [{
466
- type: Output
467
- }], paginationComponent: [{
468
- type: ContentChild,
469
- args: [PaginationComponent]
470
- }], bulkActions: [{
471
- type: ContentChild,
472
- args: [TableBulkActionsComponent]
473
- }] } });
474
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi90YWJsZS9jb250YWluZXJzL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvdGFibGUvY29udGFpbmVycy90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osSUFBSSxFQUNKLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxHQUFHLElBQUksY0FBYyxFQUFFLEdBQUcsSUFBSSxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFjeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUcxRDs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sY0FBYztJQThCekI7O09BRUc7SUFDSCxJQUFvQixhQUFhLENBQUMsS0FBYztRQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBQ0QsSUFB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QUFLO2dCQVlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFNb0IsU0FBUztzQkFBbEMsTUFBTTtnQkFNbUIsTUFBTTtzQkFBL0IsTUFBTTtnQkFNbUIsU0FBUztzQkFBbEMsTUFBTTtnQkFPUyxjQUFjO3NCQUQ3QixNQUFNO2dCQVNTLFdBQVc7c0JBRDFCLE1BQU07Z0JBUVMsaUJBQWlCO3NCQURoQyxNQUFNO2dCQU9BLG1CQUFtQjtzQkFEekIsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBSzFCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUsIERlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXQgYXMgZ2V0TmVzdGVkVmFsdWUsIHNldCBhcyBzZXROZXN0ZWRWYWx1ZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IERFQk9VTkNFX1RJTUUgfSBmcm9tICcuLi9jb25zdGFudHMvaW5kZXgnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5UeXBlIH0gZnJvbSAnLi4vZW51bWVyYXRpb25zL2luZGV4JztcbmltcG9ydCB7XG4gIElDb2xsYXBzaWJsZVJvd0NvbnRlbnRDb250ZXh0LFxuICBJQ3VzdG9tQ2VsbFJlbmRlcmVyQ29tcG9uZW50cyxcbiAgSVNvcnRCeVBheWxvYWQsXG4gIElUYWJsZUFjdGlvbnNDb2x1bW5EZWYsXG4gIElUYWJsZUV2ZW50UGF5bG9hZCxcbiAgSVRhYmxlUm93QWN0aW9uUGF5bG9hZCxcbiAgSVRhYmxlUm93Q29sbGFwc2VDaGFuZ2UsXG4gIElUYWJsZVJvd0l0ZW0sXG4gIElUYWJsZVJvd0l0ZW1WYWx1ZVR5cGVzLFxuICBUYWJsZUNvbHVtbkRlZlxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2luZGV4JztcbmltcG9ydCB7IENoZWNrYm94Q2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkJztcbmltcG9ydCB7IFRhYmxlVGhlbWVIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IENvbXBvbmVudFRoZW1lIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQnJhbmRlZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2JyYW5kaW5nJztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdpbmF0aW9uJztcbmltcG9ydCB7IFRhYmxlQnVsa0FjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IE5nYkNvbGxhcHNlIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuXG4vKipcbiAqIFRoZSBgVGFibGVDb21wb25lbnRgIChgPGltcGRjLXRhYmxlYCkgaXMgYSBkYXRhIHRhYmxlIGNvbXBvbmVudC5cbiAqIFRvIHVzZSwgaW1wb3J0IGBUYWJsZU1vZHVsZWAgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXRhYmxlJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuIFRoZSBgPGltcGRjLXNwaW5uZXI+YCB3aWxsIHNob3cgaWYgZGF0YSBpcyBsb2FkaW5nLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUuICBFYWNoIGBJVGFibGVDb2x1bW5EZWZgIGRlZmluZXMgcHJvcGVydGllcyByZWdhcmRpbmcgdGhlIGRpc3BsYXksIGZvcm1hdHRpbmcgYW5kIGludGVyYWN0aW9uIG9mIHRoZSBjb2x1bW4ncyBjZWxscy5cbiAgICogQ29sdW1uL2NlbGwgY29sb3IgcHJlY2VkZW5jZSBpczpcbiAgICogMSkgYGZpZWxkQ29sb3JgIC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGFuIGBJVGFibGVSb3dJdGVtYCBwcm9wZXJ0eS5cbiAgICogMikgYGNvbG9yR2V0dGVyYC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGEgZnVuY3Rpb24gb2YgdGhlIGBJVGFibGVSb3dJdGVtYCBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZlbG9wZXIuXG4gICAqIDMpIGBjb2xvcmAgLSBhIHByb3BlcnR5IG9mIGFuIGBJVGFibGVDb2x1bW5EZWZgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGNvbHVtbkRlZnM6IFRhYmxlQ29sdW1uRGVmPGFueT5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBpcyBzdHJpcGVkLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHN0cmlwZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRhYmxlIHJvd3Mgc2hvdWxkIGFwcGx5IGhvdmVyIHN0eWxlcyB3aGVuIGhvdmVyZWQgb3ZlciB2aWEgY3Vyc29yLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGhvdmVyID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGxheW91dCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgdGFibGUuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbGF5b3V0OiAnYXV0bycgfCAnZml4ZWQnID0gJ2F1dG8nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGluZGl2aWR1YWwgcm93cyBjYW4gYmUgc2VsZWN0ZWQuIFdpbGwgYmUgYHRydWVgIGlmIGV4cGxpY2l0bHkgc2V0IHRvIGB0cnVlYCBvciBgY2FuU2VsZWN0QWxsUm93c2AgaXMgYHRydWVgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNldCBjYW5TZWxlY3RSb3dzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2FuU2VsZWN0Um93cyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgY2FuU2VsZWN0Um93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWxlY3RBbGxSb3dzIHx8IHRoaXMuX2NhblNlbGVjdFJvd3MgfHwgISF0aGlzLmJ1bGtBY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYWxsIHJvd3MgY2FuIGJlIHNlbGVjdGVkIGF0IG9uY2UuIFdpbGwgYmUgYHRydWVgIGlmIGV4cGxpY2l0bHkgc2V0IHRvIGB0cnVlYCBvciBpZiBgVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudGAgaXMgY29udGVudCBwcm9qZWN0ZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNhblNlbGVjdEFsbFJvd3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jYW5TZWxlY3RBbGxSb3dzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhblNlbGVjdEFsbFJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhblNlbGVjdEFsbFJvd3MgfHwgISF0aGlzLmJ1bGtBY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFjZWhvbGRlciB0ZXh0IGFuZCBlbXB0eSB2YWx1ZSBkaXNwbGF5IHRleHQgZm9yIGA8aW1wZGMtc2VsZWN0PmAgaW5zdGFuY2VzIGluIGNlbGxzIHdpdGggYSBgSVRhYmxlQ29sdW1uRGVmYCBgY29sdW1uVHlwZWAgPSBgU2luZ2xlU2VsZWN0YCBvciBgTXVsdGlTZWxlY3RgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNlbGVjdFBsYWNlaG9sZGVyID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBgY29sdW1uRGVmc2AgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBzb3J0ZWQgY29sdW1uLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNvcnRDb2x1bW5JbmRleDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudGx5IHNvcnRlZCBjb2x1bW4uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogVGhlIHRhYmxlIHJvdyBkYXRhIGFzIGFuIGFycmF5IG9mIGBJVGFibGVSb3dJdGVtYC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZURhdGE6IElUYWJsZVJvd0l0ZW1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgSURzIGZyb20gdGhlIGB0YWJsZURhdGFgIGlucHV0LiAgQXJyYXkgbXVzdCBiZSBvZiB0eXBlIGAoc3RyaW5nIHwgbnVtYmVyKVtdYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dJZHModmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IFsuLi52YWx1ZV07XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZFJvd0lkcygpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3NlbGVjdGVkUm93SWRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gY2VsbCByZW5kZXJlciBjb21wb25lbnRzIGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSB0YWJsZSBpbnN0YW5jZS5cbiAgICogRm9yIGEgZ2l2ZW4gYElUYWJsZUNvbHVtbkRlZmAgaW4gdGhlIGBjb2x1bW5EZWZzYCBpbnB1dCwgdGhlIGBjZWxsUmVuZGVyZXJDb21wb25lbnRgIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleSBvZiB0aGUgcmVnaXN0ZXJlZCBjb21wb25lbnQgaW4gdGhpcyBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21DZWxsQ29tcG9uZW50cz86IElDdXN0b21DZWxsUmVuZGVyZXJDb21wb25lbnRzO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0ZW1wbGF0ZSBmb3IgY29udGVudCB0aGF0IG1heSBiZSByZW5kZXJlZCBiZWxvdyBhIHJvdyBpbiBhbiBjb2xsYXBzaWJsZSB2aWV3LiBWYWx1ZSBjYW4gZWl0aGVyIGJlIGFuIEFuZ3VsYXIgdGVtcGxhdGUgb3IgYSBmdW5jdGlvbiB0aGF0IGNhbiBldmFsdWF0ZWRcbiAgICogdG8gcmVzb2x2ZSB0byBhIHRlbXBsYXRlLiBUaGUgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGEgcHJvdmlkZWQgYElDb2xsYXBzaWJsZVJvd0NvbnRlbnRDb250ZXh0YCBvYmplY3QgYXMgdGVtcGxhdGUgY29udGV4dCwgd2l0aCB0aGUgY3VycmVudCBgSVRhYmxlUm93RGF0YWBcbiAgICogaW1wbGljaXRseSBhdmFpbGFibGUgYXMgYSBkZWZhdWx0IHRlbXBsYXRlIGtleS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xsYXBzaWJsZVRlbXBsYXRlOlxuICAgIHwgVGVtcGxhdGVSZWY8SUNvbGxhcHNpYmxlUm93Q29udGVudENvbnRleHQ8YW55Pj5cbiAgICB8IG51bGxcbiAgICB8ICgocm93OiBhbnkpID0+IFRlbXBsYXRlUmVmPElDb2xsYXBzaWJsZVJvd0NvbnRlbnRDb250ZXh0PGFueT4+IHwgbnVsbCkgPVxuICAgIG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBjbGlja2FibGUgY29udHJvbCB0aGF0IHdpbGwgdHJpZ2dlciBleHBhbnNpb24gYW5kIGNvbGxhcHNlIG9mIGNvbnRlbnQgd2hlbiB1c2luZyBgY29sbGFwc2libGVUZW1wbGF0ZWAgZnVuY3Rpb25hbGl0eS5cbiAgICogV2hlbiBzZXQgdG8gYGJ1dHRvbmAsIHRoZSBjb2xsYXBzaWJsZSBjb250ZW50J3Mgc3RhdGUgY2FuIG9ubHkgYmUgdG9nZ2xlZCBmcm9tIGEgY2xpY2thYmxlIGJ1dHRvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHJvdy5cbiAgICogV2hlbiBzZXQgdG8gYHJvd2AsIHRoZSBlbnRpcmUgcm93IHdpbGwgYmVjb21lIGEgY2xpY2thYmxlIHRyaWdnZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY29sbGFwc2libGVUcmlnZ2VyOiAnYnV0dG9uJyB8ICdyb3cnID0gJ2J1dHRvbic7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBvbmUgb3IgbXVsdGlwbGUgcm93cyBhcmUgc2VsZWN0ZWQuIEVtaXRzIGAoc3RyaW5nIHwgbnVtYmVyKVtdYCBwYXlsb2FkLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSByb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjwoc3RyaW5nIHwgbnVtYmVyKVtdPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjwoc3RyaW5nIHwgbnVtYmVyKVtdPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBjb2x1bW4gaXMgc29ydGVkLiBFbWl0cyBgSVNvcnRCeVBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNvcnRCeTogRXZlbnRFbWl0dGVyPElTb3J0QnlQYXlsb2FkPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxJU29ydEJ5UGF5bG9hZD4oKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcm93IGxpbmsgaXMgY2xpY2tlZC4gRW1pdHMgYElUYWJsZUV2ZW50UGF5bG9hZGAgcGF5bG9hZC5cbiAgICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgbGlua0NsaWNrOiBFdmVudEVtaXR0ZXI8SVRhYmxlRXZlbnRQYXlsb2FkPGFueT4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZDxhbnk+PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgYWN0aW9uIGlzIGNsaWNrZWQuIEVtaXRzIGFuIGBJVGFibGVSb3dBY3Rpb25QYXlsb2FkYCBwYXlsb2FkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSByb3dBY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPElUYWJsZVJvd0FjdGlvblBheWxvYWQ8YW55Pj4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8SVRhYmxlUm93QWN0aW9uUGF5bG9hZDxhbnk+PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgaW5wdXQgdmFsdWUgaXMgY2hhbmdlZC4gRW1pdHRlZCBjZWxscyBvZiBgY29sdW1uVHlwZWAgYFNpbmdsZVNlbGVjdGAsIGBNdWx0aVNlbGVjdGAsIGBJbnB1dGAsIGBCb29sZWFuYCBvciBgSWNvbmAuXG4gICAqIE5vdCBlbWl0dGVkIGlmIGNvbHVtbiBkZWZpbml0aW9uIHByb3BlcnR5IGBkaXNhYmxlZGAgPSBgdHJ1ZWAuIEVtaXRzIGBJVGFibGVFdmVudFBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IGlucHV0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8SVRhYmxlRXZlbnRQYXlsb2FkPGFueT4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZDxhbnk+PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgd2l0aCBjb2xsYXBzaWJsZSBjb250ZW50IGhhcyBpdHMgY29sbGFwc2Ugc3RhdGUgY2hhbmdlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgcm93Q29sbGFwc2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxcbiAgICBJVGFibGVSb3dDb2xsYXBzZUNoYW5nZTxhbnk+XG4gID4gPSBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZVJvd0NvbGxhcHNlQ2hhbmdlPGFueT4+KCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQENvbnRlbnRDaGlsZChQYWdpbmF0aW9uQ29tcG9uZW50KVxuICBwdWJsaWMgcGFnaW5hdGlvbkNvbXBvbmVudD86IFBhZ2luYXRpb25Db21wb25lbnQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQENvbnRlbnRDaGlsZChUYWJsZUJ1bGtBY3Rpb25zQ29tcG9uZW50KVxuICBwdWJsaWMgYnVsa0FjdGlvbnM/OiBUYWJsZUJ1bGtBY3Rpb25zQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWFkb25seSBjZWxsVHlwZSA9IFRhYmxlQ29sdW1uVHlwZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGFsbFNlbGVjdGVkID0gdHJ1ZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5fc2VsZWN0ZWRSb3dJZHMgJiZcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICEhdGhpcy50YWJsZURhdGEgJiZcbiAgICAgIHRoaXMudGFibGVEYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmxlbmd0aCA8IHRoaXMudGFibGVEYXRhLmxlbmd0aFxuICAgICk7XG4gIH1cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJyYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0IHRhYmxlU3BhbigpOiBudW1iZXIge1xuICAgIGxldCBjb2xzID0gdGhpcy5jb2x1bW5EZWZzLmxlbmd0aDtcblxuICAgIGlmICh0aGlzLmNhblNlbGVjdFJvd3MpIHtcbiAgICAgIGNvbHMrKztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2xsYXBzaWJsZVRlbXBsYXRlKSB7XG4gICAgICBjb2xzKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHM7XG4gIH1cblxuICBwcml2YXRlIF9jYW5TZWxlY3RSb3dzID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhblNlbGVjdEFsbFJvd3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcGVyY2VudFBpcGU6IFBlcmNlbnRQaXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlY21pYWxQaXBlOiBEZWNpbWFsUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcml2YXRlIF9icmFuZGVkOiBCcmFuZGVkRGlyZWN0aXZlXG4gICkge1xuICAgIHRoaXMuYnJhbmRlZCA9IF9icmFuZGVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMuX2lucHV0Q2hhbmdlXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoREVCT1VOQ0VfVElNRSkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaW5wdXRDaGFuZ2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFJvd0lkcyddIHx8IGNoYW5nZXNbJ3RhYmxlRGF0YSddKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnRhYmxlRGF0YSB8fFxuICAgICAgICAhdGhpcy50YWJsZURhdGEubGVuZ3RoIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aCA+PSB0aGlzLnRhYmxlRGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldE1haWxUb1ZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY29sdW1uVHlwZSwgdHJ1bmNhdGVkOiB0cnVuY2F0ZWQgfSA9XG4gICAgICB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLl9nZXRWYWx1ZShjb2x1bW5JbmRleCwgY3VycmVudFJvdyk7XG5cbiAgICBpZiAoY29sdW1uVHlwZSAhPT0gVGFibGVDb2x1bW5UeXBlLkVtYWlsKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZSA/IGBtYWlsdG86JHt2YWx1ZX1gIDogdmFsdWU7XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBnZXRTdHJpbmdWYWx1ZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRSb3c6IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoY29sdW1uSW5kZXgsIGN1cnJlbnRSb3cpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuam9pbignOycpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldFZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgY29uc3QgeyBjb2x1bW5UeXBlLCB0cnVuY2F0ZWQ6IHRydW5jYXRlZCB9ID1cbiAgICAgIHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlKGNvbHVtbkluZGV4LCBjdXJyZW50Um93KTtcblxuICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGVjaW1hbDoge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX2RlY21pYWxQaXBlLnRyYW5zZm9ybShOdW1iZXIodmFsdWUpIHx8IDApIHx8ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkRhdGU6IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB2YWxpZERhdGUgPSBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVxuICAgICAgICAgID8gdGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdNTS9kZC95eXl5JykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGF0ZVRpbWU6IHtcbiAgICAgICAgY29uc3QgZGF0ZVRpbWUgPSBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdmFsaWREYXRlVGltZSA9XG4gICAgICAgICAgZGF0ZVRpbWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihkYXRlVGltZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVRpbWVcbiAgICAgICAgICA/IHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShkYXRlVGltZSwgJ01NL2RkL3l5eXkgaDptbTpzcyBhJykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuTGluazoge1xuICAgICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvKF5cXHcrOnxeKVxcL1xcLy8sICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5QZXJjZW50YWdlOiB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5fcGVyY2VudFBpcGUudHJhbnNmb3JtKE51bWJlcih2YWx1ZSkgfHwgMCkgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVXJsOiB7XG4gICAgICAgIGlmICghLyhodHRwKHM/KSk6XFwvXFwvL2kudGVzdChTdHJpbmcodmFsdWUpKSkge1xuICAgICAgICAgIHZhbHVlID0gYGh0dHBzOi8vJHt2YWx1ZX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVGV4dDoge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJzsgJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRydW5jYXRlZCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRydW5jYXRlU3RyaW5nID0gKHN0cmluZyA9ICcnLCBtYXhMZW5ndGggPSB0cnVuY2F0ZWQpID0+XG4gICAgICAgICAgc3RyaW5nLmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgICAgICAgPyBgJHtzdHJpbmcuc3Vic3RyaW5nKDAsIG1heExlbmd0aCl94oCmYFxuICAgICAgICAgICAgOiBzdHJpbmc7XG5cbiAgICAgICAgISF0cnVuY2F0ZWRcbiAgICAgICAgICA/ICh2YWx1ZSA9IHRydW5jYXRlU3RyaW5nKFN0cmluZyh2YWx1ZSksIHRydW5jYXRlZCkpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5NdWx0aVNlbGVjdDpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCc7Jyk/Lm1hcCh2ID0+IHYudHJpbSgpKSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0UmF3VmFsdWUoXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjdXJyZW50Um93OiBJVGFibGVSb3dJdGVtXG4gICk6IElUYWJsZVJvd0l0ZW1WYWx1ZVR5cGVzIHtcbiAgICBjb25zdCB7IGZpZWxkIH0gPSB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcblxuICAgIGlmICghZmllbGQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFJvd1tmaWVsZF0gfHwgJyc7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0Q2VsbENvbG9yKFxuICAgIGNvbHVtbkRlZmluaXRpb246IFRhYmxlQ29sdW1uRGVmLFxuICAgIGl0ZW06IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVGFibGVUaGVtZUhlbHBlci5nZXRDZWxsQ29sb3IoY29sdW1uRGVmaW5pdGlvbiwgaXRlbSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0VGhlbWUoXG4gICAgY29sdW1uRGVmaW5pdGlvbjogVGFibGVDb2x1bW5EZWYsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbVxuICApOiBDb21wb25lbnRUaGVtZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIFRhYmxlVGhlbWVIZWxwZXIuZ2V0VGhlbWUoY29sdW1uRGVmaW5pdGlvbiwgaXRlbSkgfHxcbiAgICAgIENvbXBvbmVudFRoZW1lLlByaW1hcnlcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGlzU29ydGVkQ29sdW1uKGNvbHVtbkluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1uSW5kZXggPT09IHRoaXMuc29ydENvbHVtbkluZGV4O1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGlzUm93U2VsZWN0ZWQoaWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm93SWRzLmluY2x1ZGVzKGlkKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBoYW5kbGVTZWxlY3RBbGwoZXZlbnQ6IENoZWNrYm94Q2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0QWxsUm93cyB8fCAhdGhpcy50YWJsZURhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMgPSB0aGlzLnRhYmxlRGF0YT8ubWFwKHJvdyA9PiByb3cuaWQpIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnNvcnQoKTtcbiAgICB0aGlzLmFsbFNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFJvd0lkcy5sZW5ndGggPj0gdGhpcy50YWJsZURhdGEubGVuZ3RoO1xuXG4gICAgdGhpcy5yb3dTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkUm93SWRzKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBoYW5kbGVTb3J0KGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uSW5kZXggPT09IHRoaXMuc29ydENvbHVtbkluZGV4KSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydENvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSAnYXNjJztcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpLmZpZWxkIHx8ICcnO1xuXG4gICAgdGhpcy5zb3J0QnkuZW1pdCh7XG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGZpZWxkLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLnNvcnREaXJlY3Rpb25cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBoYW5kbGVSb3dTZWxlY3QoXG4gICAgZXZlbnQ6IENoZWNrYm94Q2hhbmdlRXZlbnQsXG4gICAgcm93SWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0Um93cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jaGVja2VkICYmICF0aGlzLl9zZWxlY3RlZFJvd0lkcy5pbmNsdWRlcyhyb3dJZCkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnB1c2gocm93SWQpO1xuICAgIH0gZWxzZSBpZiAoIWV2ZW50LmNoZWNrZWQgJiYgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuaW5jbHVkZXMocm93SWQpKSB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLl9zZWxlY3RlZFJvd0lkcy5pbmRleE9mKHJvd0lkKTtcbiAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRSb3dJZHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5zb3J0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRSb3dJZHMubGVuZ3RoID49IHRoaXMudGFibGVEYXRhLmxlbmd0aDtcbiAgICB0aGlzLnJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dJZHMpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmdbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGZpZWxkLCBjb2x1bW5UeXBlIH0gPSB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICBsZXQgY3VycmVudFZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3RyaW5nW10gPSB2YWx1ZTtcblxuICAgIGlmIChjb2x1bW5UeXBlICE9PSBUYWJsZUNvbHVtblR5cGUuQm9vbGVhbiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlzTmFOKE51bWJlcih2YWx1ZSkpID8gdmFsdWUgOiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBpdGVtID0gdGhpcy50YWJsZURhdGFbcm93SW5kZXhdO1xuXG4gICAgc2V0TmVzdGVkVmFsdWUoaXRlbSwgU3RyaW5nKGZpZWxkKSwgY3VycmVudFZhbHVlKTtcblxuICAgIHRoaXMuX2lucHV0Q2hhbmdlLmVtaXQoe1xuICAgICAgY29sdW1uSW5kZXgsXG4gICAgICBpdGVtLFxuICAgICAgdmFsdWU6IGN1cnJlbnRWYWx1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGhhbmRsZUxpbmtDbGljayhcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGl0ZW06IElUYWJsZVJvd0l0ZW0sXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmxpbmtDbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGhhbmRsZUFjdGlvbkNsaWNrKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbSxcbiAgICBhY3Rpb25BcGlOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5yb3dBY3Rpb25DbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGFjdGlvbkFwaU5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5EZWZJc0FjdGlvbnMoXG4gICAgY29sdW1uRGVmOiBUYWJsZUNvbHVtbkRlZjxhbnk+XG4gICk6IGNvbHVtbkRlZiBpcyBJVGFibGVBY3Rpb25zQ29sdW1uRGVmPGFueT4ge1xuICAgIHJldHVybiBjb2x1bW5EZWYuY29sdW1uVHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkFjdGlvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJ5VG9nZ2xlQ29sbGFwc2UoXG4gICAgY29sbGFwc2libGVGb3JSb3dSZXN1bHQ6IHtcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJQ29sbGFwc2libGVSb3dDb250ZW50Q29udGV4dD4gfCBudWxsO1xuICAgIH0sXG4gICAgbmdiQ29sbGFwc2U6IE5nYkNvbGxhcHNlLFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBzb3VyY2U6ICdidXR0b24nIHwgJ3JvdydcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgY29sbGFwc2libGVGb3JSb3dSZXN1bHQudGVtcGxhdGUgJiZcbiAgICAgICh0aGlzLmNvbGxhcHNpYmxlVHJpZ2dlciA9PT0gJ3JvdycgfHwgdGhpcy5jb2xsYXBzaWJsZVRyaWdnZXIgPT09IHNvdXJjZSlcbiAgICApIHtcbiAgICAgIG5nYkNvbGxhcHNlLnRvZ2dsZSgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvbGxhcHNpYmxlVGVtcGxhdGVGb3JSb3cocm93OiBJVGFibGVSb3dJdGVtKToge1xuICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJQ29sbGFwc2libGVSb3dDb250ZW50Q29udGV4dD4gfCBudWxsO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6XG4gICAgICAgIHRoaXMuY29sbGFwc2libGVUZW1wbGF0ZSAmJlxuICAgICAgICB0eXBlb2YgdGhpcy5jb2xsYXBzaWJsZVRlbXBsYXRlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0aGlzLmNvbGxhcHNpYmxlVGVtcGxhdGUocm93KVxuICAgICAgICAgIDogdGhpcy5jb2xsYXBzaWJsZVRlbXBsYXRlXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXg6IG51bWJlcik6IFRhYmxlQ29sdW1uRGVmIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5EZWZzW2NvbHVtbkluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIHZhbHVlR2V0dGVyIH0gPSB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcblxuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdID0gdmFsdWVHZXR0ZXJcbiAgICAgICAgPyB2YWx1ZUdldHRlcihjdXJyZW50Um93KVxuICAgICAgICA6IChnZXROZXN0ZWRWYWx1ZShjdXJyZW50Um93LCBTdHJpbmcoZmllbGQpLCAnJykgYXMgc3RyaW5nIHwgc3RyaW5nW10pO1xuXG4gICAgICByZXR1cm4gdmFsdWUgfHwgJyc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxufVxuIiwiQGlmICh0YWJsZURhdGEpIHtcbiAgPHRhYmxlXG4gICAgaW1wZGNUYWJsZVxuICAgIFtzdHJpcGVkXT1cInN0cmlwZWQgJiYgIWNvbGxhcHNpYmxlVGVtcGxhdGVcIlxuICAgIFtsYXlvdXRdPVwibGF5b3V0XCJcbiAgICBbaG92ZXJdPVwiaG92ZXJcIj5cbiAgICA8dGhlYWQ+XG4gICAgICBAaWYgKCEhYnVsa0FjdGlvbnMpIHtcbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJidWxrLWFjdGlvbi1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImltcGRjLXRhYmxlLWJ1bGstYWN0aW9uc1wiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpbXBkY1RhYmxlQnVsa0FjdGlvbnNdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgICA8dHI+XG4gICAgICAgIEBpZiAoY29sbGFwc2libGVUZW1wbGF0ZSkge1xuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgW2NsYXNzLmhlYWRpbmctYmVsb3ctYnVsay1hY3Rpb25zXT1cIiEhYnVsa0FjdGlvbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJpbXBkYy10YWJsZS1jb2xsYXBzaWJsZS1jb250ZW50LXJvdy1idXR0b24tY29udGFpbmVyXCI+PC90aD5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGNhblNlbGVjdFJvd3MpIHtcbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW1wZGMtdGFibGUtc2VsZWN0YWJsZS1yb3ctdG9nZ2xlLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdoZWFkaW5nLWJlbG93LWJ1bGstYWN0aW9ucyc6ICEhYnVsa0FjdGlvbnNcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIEBpZiAoY2FuU2VsZWN0QWxsUm93cykge1xuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxpbXBkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgbmdNb2RlbFxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsKCRldmVudClcIj48L2ltcGRjLWNoZWNrYm94PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKFxuICAgICAgICAgIGNvbHVtbkRlZiBvZiBjb2x1bW5EZWZzO1xuICAgICAgICAgIHRyYWNrIGNvbHVtbkRlZjtcbiAgICAgICAgICBsZXQgY29sdW1uSW5kZXggPSAkaW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdzb3J0ZWQtY29sdW1uJzogaXNTb3J0ZWRDb2x1bW4oY29sdW1uSW5kZXgpLFxuICAgICAgICAgICAgICAnc29ydGFibGUtY29sdW1uJzogY29sdW1uRGVmLnNvcnRlZCxcbiAgICAgICAgICAgICAgJ2hlYWRpbmctYmVsb3ctYnVsay1hY3Rpb25zJzogISFidWxrQWN0aW9uc1xuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU29ydChjb2x1bW5JbmRleClcIj5cbiAgICAgICAgICAgIDxpbXBkYy1jb2x1bW4taGVhZGluZ1xuICAgICAgICAgICAgICBbaXNTb3J0YWJsZV09XCJjb2x1bW5EZWYuc29ydGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgICAgW3NvcnRDb2x1bW5JbmRleF09XCJzb3J0Q29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICBbZGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxuICAgICAgICAgICAgICBbdGV4dF09XCJjb2x1bW5EZWYudGl0bGVcIlxuICAgICAgICAgICAgICAoc29ydCk9XCJoYW5kbGVTb3J0KCRldmVudClcIj5cbiAgICAgICAgICAgIDwvaW1wZGMtY29sdW1uLWhlYWRpbmc+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgfVxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgIEBpZiAobG9hZGluZykge1xuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwidGFibGVTcGFuXCIgY2xhc3M9XCJkYXRhLWxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxpbXBkYy1zcGlubmVyPjwvaW1wZGMtc3Bpbm5lcj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBmb3IgKFxuICAgICAgICAgIHJvdyBvZiB0YWJsZURhdGE7XG4gICAgICAgICAgdHJhY2sgcm93LmlkO1xuICAgICAgICAgIGxldCByb3dJbmRleCA9ICRpbmRleDtcbiAgICAgICAgICBsZXQgcm93Rmlyc3QgPSAkZmlyc3Q7XG4gICAgICAgICAgbGV0IHJvd0xhc3QgPSAkbGFzdDtcbiAgICAgICAgICBsZXQgcm93RXZlbiA9ICRldmVuO1xuICAgICAgICAgIGxldCByb3dPZGQgPSAkb2RkXG4gICAgICAgICkge1xuICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICBnZXRDb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93KHJvdyk7XG4gICAgICAgICAgICBhcyBjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgW2NsYXNzLmltcGRjLXRhYmxlLWNvbGxhcHNpYmxlLXJvdy10cmlnZ2VyXT1cIlxuICAgICAgICAgICAgICAgIGNvbGxhcHNpYmxlVHJpZ2dlciA9PT0gJ3JvdydcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRhYmxlLWFjdGl2ZV09XCJpc1Jvd1NlbGVjdGVkKHJvdy5pZClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgdHJ5VG9nZ2xlQ29sbGFwc2UoXG4gICAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93LFxuICAgICAgICAgICAgICAgICAgbmdiQ29sbGFwc2UsXG4gICAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgICAncm93J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgIEBpZiAoY29sbGFwc2libGVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbXBkYy10YWJsZS1jb2xsYXBzaWJsZS1jb250ZW50LXJvdy1idXR0b24tY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuZWRdPVwiIWNvbGxhcHNlTW9uaXRvci5uZ2JDb2xsYXBzaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sbGFwc2libGVUZW1wbGF0ZUZvclJvdy50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb2dnbGVDb2xsYXBzZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nYkNvbGxhcHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbXBkYy10YWJsZS1jb2xsYXBzaWJsZS1jb250ZW50LXJvdy1idXR0b24gYnRuIGJ0bi1saW5rXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhciBmYS1jaGV2cm9uLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZhLXJvdGF0ZS05MF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29sbGFwc2VNb25pdG9yLm5nYkNvbGxhcHNpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChjYW5TZWxlY3RSb3dzKSB7XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaW1wZGMtdGFibGUtc2VsZWN0YWJsZS1yb3ctdG9nZ2xlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltcGRjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaXNSb3dTZWxlY3RlZChyb3cuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVJvd1NlbGVjdCgkZXZlbnQsIHJvdy5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj48L2ltcGRjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW5EZWYgb2YgY29sdW1uRGVmcztcbiAgICAgICAgICAgICAgICAgIGluZGV4IGFzIGNvbEluZGV4O1xuICAgICAgICAgICAgICAgICAgbGFzdCBhcyBpc0xhc3RcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICdjb2wtbm8tcGFkZGluZyc6ICEhY29sdW1uRGVmLm5vUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICdhY3Rpb25zLWNvbHVtbic6IGNvbHVtbkRlZi5jb2x1bW5UeXBlID09PSBjZWxsVHlwZS5BY3Rpb25zXG4gICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICBAc3dpdGNoIChjb2x1bW5EZWYuY29sdW1uVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoY2VsbFR5cGUuQmFkZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbXBkYy1iYWRnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJnZXRTdHJpbmdWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJnZXRUaGVtZShjb2x1bW5EZWYsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW1wZGMtYmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5MaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImhhbmRsZUxpbmtDbGljayhjb2xJbmRleCwgcm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFicmFuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGltcGRjQnJhbmRlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5VcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWJyYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBkY0JyYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5FbWFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghYnJhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCInbWFpbHRvOicgKyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFZhbHVlKGNvbEluZGV4LCByb3cpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGRjQnJhbmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiZ2V0TWFpbFRvVmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGltcGRjSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShjb2xJbmRleCwgcm93SW5kZXgsICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgPT09ICd0cnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wZGMtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBnZXRDZWxsQ29sb3IoY29sdW1uRGVmLCByb3cpIH19XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoIWNvbHVtbkRlZi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1wZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KSA9PT0gJ3RydWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNTd2l0Y2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPjwvaW1wZGMtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5TaW5nbGVTZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbXBkYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uRGVmLmRpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlbGVjdFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDbGVhcj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgY29sdW1uRGVmLnZhbHVlcyB8fCBbXTsgdHJhY2sgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ2YWx1ZS5sYWJlbFwiPjwvaW1wZGMtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pbXBkYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5NdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltcGRjLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW5EZWYuZGlzYWJsZWQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0UGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgY29sdW1uRGVmLnZhbHVlcyB8fCBbXTsgdHJhY2sgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ2YWx1ZS5sYWJlbFwiPjwvaW1wZGMtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pbXBkYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5DZWxsUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7eyBnZXRDZWxsQ29sb3IoY29sdW1uRGVmLCByb3cpIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wZGNUYWJsZUluamVjdENvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRGVmXT1cImNvbHVtbkRlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dJdGVtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21DZWxsQ29tcG9uZW50c109XCJjdXN0b21DZWxsQ29tcG9uZW50cyB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRSYXdWYWx1ZShjb2xJbmRleCwgcm93KVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5JY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBkYy1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNvbHVtbkRlZi5pY29uTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3sgZ2V0Q2VsbENvbG9yKGNvbHVtbkRlZiwgcm93KSB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKGNlbGxUeXBlLkFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2lsbCBhbHdheXMgcmV0dXJuICd0cnVlJywgYnV0IG5lZWRlZCB0byBzYXRpc2Z5IHRoZSB0eXBlIGVuZ2luZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uRGVmSXNBY3Rpb25zKGNvbHVtbkRlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGltcGRjLXJvdy1hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbkRlZl09XCJjb2x1bW5EZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dJdGVtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhc3RDb2x1bW5dPVwiaXNMYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVBY3Rpb25DbGljayhjb2xJbmRleCwgcm93LCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L2ltcGRjLXJvdy1hY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7eyBnZXRDZWxsQ29sb3IoY29sdW1uRGVmLCByb3cpIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICBjbGFzcz1cImltcGRjLXRhYmxlLWNvbGxhcHNpYmxlLWNvbnRlbnQtcm93XCJcbiAgICAgICAgICAgICAgW2NsYXNzLm9wZW5lZF09XCIhY29sbGFwc2VNb25pdG9yLm5nYkNvbGxhcHNpbmcoKVwiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3LTEwMCBwLTBcIiBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1wZGMtdGFibGUtY29sbGFwc2libGUtY29udGVudC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgI25nYkNvbGxhcHNlPVwibmdiQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgI2NvbGxhcHNlTW9uaXRvcj1cImltcGRjQ29sbGFwc2VNb25pdG9yXCJcbiAgICAgICAgICAgICAgICAgIFtpbXBkY0NvbGxhcHNlTW9uaXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChjb2xsYXBzZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgcm93Q29sbGFwc2VDaGFuZ2UuZW1pdCh7IHJvdywgY29sbGFwc2VkOiAkZXZlbnQgfSlcbiAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2libGVUZW1wbGF0ZUZvclJvdy50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogY29sbGFwc2VNb25pdG9yLmNvbGxhcHNlZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBpc1Jvd1NlbGVjdGVkKHJvdy5pZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0OiAhIXJvd0ZpcnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6ICEhcm93TGFzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVuOiAhIXJvd0V2ZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RkOiAhIXJvd09kZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiIGNsYXNzPVwibm8tZGF0YVwiPlxuICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbm9EYXRhXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvdGJvZHk+XG4gICAgPHRmb290PlxuICAgICAgQGlmIChwYWdpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJ0YWJsZVNwYW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50XG4gICAgICAgICAgICAgIHNlbGVjdD1cImltcGRjLXBhZ2luYXRpb24sIGRpdltpbXBkYy1wYWdpbmF0aW9uXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgfVxuICAgIDwvdGZvb3Q+XG4gIDwvdGFibGU+XG59XG4iXX0=