@ardium-ui/ui 1.0.2 → 2.0.1

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 (390) hide show
  1. package/esm2022/lib/_internal/boolean-component.mjs +28 -42
  2. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +5 -5
  3. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +4 -4
  4. package/esm2022/lib/_internal/disablable-component.mjs +24 -22
  5. package/esm2022/lib/_internal/focusable-component.mjs +12 -25
  6. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +172 -169
  7. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +115 -120
  8. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +56 -53
  9. package/esm2022/lib/_internal/models/pagination.model.mjs +72 -106
  10. package/esm2022/lib/_internal/ngmodel-component.mjs +5 -5
  11. package/esm2022/lib/_internal/queue.mjs +1 -1
  12. package/esm2022/lib/_internal/selectable-list-component.mjs +74 -98
  13. package/esm2022/lib/badge/badge.directive.mjs +70 -99
  14. package/esm2022/lib/badge/badge.module.mjs +4 -4
  15. package/esm2022/lib/badge/index.mjs +4 -0
  16. package/esm2022/lib/buttons/_button-base.mjs +13 -35
  17. package/esm2022/lib/buttons/button/button.component.mjs +22 -37
  18. package/esm2022/lib/buttons/button/button.module.mjs +4 -4
  19. package/esm2022/lib/buttons/button/index.mjs +3 -0
  20. package/esm2022/lib/buttons/fab/fab.component.mjs +16 -28
  21. package/esm2022/lib/buttons/fab/fab.module.mjs +4 -4
  22. package/esm2022/lib/buttons/fab/index.mjs +3 -0
  23. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
  24. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +4 -4
  25. package/esm2022/lib/buttons/icon-button/index.mjs +3 -0
  26. package/esm2022/lib/card/card.children.mjs +32 -33
  27. package/esm2022/lib/card/card.component.mjs +14 -17
  28. package/esm2022/lib/card/card.module.mjs +4 -4
  29. package/esm2022/lib/card/index.mjs +5 -0
  30. package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
  31. package/esm2022/lib/checkbox/checkbox.module.mjs +4 -4
  32. package/esm2022/lib/checkbox/index.mjs +4 -0
  33. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +31 -57
  34. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +4 -4
  35. package/esm2022/lib/checkbox-list/index.mjs +4 -0
  36. package/esm2022/lib/chip/chip.component.mjs +22 -42
  37. package/esm2022/lib/chip/chip.module.mjs +4 -4
  38. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +28 -53
  39. package/esm2022/lib/chip/index.mjs +5 -0
  40. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +25 -49
  41. package/esm2022/lib/color/color-display/color-display.component.mjs +15 -32
  42. package/esm2022/lib/color/color-display/color-display.module.mjs +4 -4
  43. package/esm2022/lib/color/color-display/index.mjs +4 -0
  44. package/esm2022/lib/color/color-picker/color-picker.types.mjs +1 -1
  45. package/esm2022/lib/dialog/dialog.component.mjs +54 -130
  46. package/esm2022/lib/dialog/dialog.directives.mjs +3 -3
  47. package/esm2022/lib/dialog/dialog.module.mjs +4 -4
  48. package/esm2022/lib/dialog/dialog.types.mjs +1 -1
  49. package/esm2022/lib/dialog/index.mjs +5 -0
  50. package/esm2022/lib/divider/divider.component.mjs +9 -14
  51. package/esm2022/lib/divider/divider.module.mjs +4 -4
  52. package/esm2022/lib/divider/index.mjs +3 -0
  53. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +40 -59
  54. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +4 -4
  55. package/esm2022/lib/dropdown-panel/index.mjs +4 -0
  56. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +12 -17
  57. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +9 -9
  58. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +6 -6
  59. package/esm2022/lib/file-inputs/file-drop-area/index.mjs +4 -0
  60. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +24 -50
  61. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +18 -18
  62. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +4 -4
  63. package/esm2022/lib/file-inputs/file-input/index.mjs +4 -0
  64. package/esm2022/lib/file-inputs/file-input-base.mjs +38 -72
  65. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +20 -47
  66. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +6 -6
  67. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +4 -4
  68. package/esm2022/lib/form-field-frame/index.mjs +4 -0
  69. package/esm2022/lib/icon/icon.component.mjs +32 -67
  70. package/esm2022/lib/icon/icon.module.mjs +4 -4
  71. package/esm2022/lib/icon/icon.pipe.mjs +3 -3
  72. package/esm2022/lib/icon/index.mjs +4 -0
  73. package/esm2022/lib/inputs/color-input/color-input.directives.mjs +24 -24
  74. package/esm2022/lib/inputs/color-input/color-input.types.mjs +1 -1
  75. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +65 -115
  76. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +83 -92
  77. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +4 -4
  78. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +1 -1
  79. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +1 -1
  80. package/esm2022/lib/inputs/digit-input/index.mjs +4 -0
  81. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +59 -122
  82. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +9 -9
  83. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +24 -8
  84. package/esm2022/lib/inputs/hex-input/index.mjs +4 -0
  85. package/esm2022/lib/inputs/hex-input.model.mjs +24 -33
  86. package/esm2022/lib/inputs/input/index.mjs +4 -0
  87. package/esm2022/lib/inputs/input/input.component.mjs +95 -154
  88. package/esm2022/lib/inputs/input/input.directives.mjs +16 -16
  89. package/esm2022/lib/inputs/input/input.module.mjs +21 -7
  90. package/esm2022/lib/inputs/input-transformers.mjs +6 -6
  91. package/esm2022/lib/inputs/input-utils.mjs +75 -94
  92. package/esm2022/lib/inputs/number-input/index.mjs +4 -0
  93. package/esm2022/lib/inputs/number-input/number-input.component.mjs +106 -170
  94. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +3 -3
  95. package/esm2022/lib/inputs/number-input/number-input.module.mjs +4 -4
  96. package/esm2022/lib/inputs/password-input/index.mjs +5 -0
  97. package/esm2022/lib/inputs/password-input/password-input.component.mjs +74 -144
  98. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +12 -12
  99. package/esm2022/lib/inputs/password-input/password-input.module.mjs +4 -4
  100. package/esm2022/lib/inputs/password-input/password-input.types.mjs +1 -1
  101. package/esm2022/lib/inputs/simple-input/index.mjs +4 -0
  102. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +57 -110
  103. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +9 -9
  104. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +4 -4
  105. package/esm2022/lib/kbd/index.mjs +4 -0
  106. package/esm2022/lib/kbd/kbd.component.mjs +15 -29
  107. package/esm2022/lib/kbd/kbd.module.mjs +4 -4
  108. package/esm2022/lib/kbd/kbd.pipe.mjs +3 -3
  109. package/esm2022/lib/kbd-shortcut/index.mjs +3 -0
  110. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +23 -40
  111. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +4 -4
  112. package/esm2022/lib/modal/index.mjs +3 -0
  113. package/esm2022/lib/modal/modal.component.mjs +42 -83
  114. package/esm2022/lib/modal/modal.module.mjs +4 -4
  115. package/esm2022/lib/option/index.mjs +3 -0
  116. package/esm2022/lib/option/option.component.mjs +24 -46
  117. package/esm2022/lib/option/option.module.mjs +4 -4
  118. package/esm2022/lib/progress-bar/index.mjs +5 -0
  119. package/esm2022/lib/progress-bar/progress-bar.component.mjs +43 -81
  120. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +3 -3
  121. package/esm2022/lib/progress-bar/progress-bar.module.mjs +4 -4
  122. package/esm2022/lib/progress-bar/progress-bar.types.mjs +1 -1
  123. package/esm2022/lib/progress-circle/index.mjs +5 -0
  124. package/esm2022/lib/progress-circle/progress-circle.component.mjs +33 -78
  125. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +3 -3
  126. package/esm2022/lib/progress-circle/progress-circle.module.mjs +4 -4
  127. package/esm2022/lib/progress-circle/progress-circle.types.mjs +1 -1
  128. package/esm2022/lib/radio/index.mjs +4 -0
  129. package/esm2022/lib/radio/radio/radio.component.mjs +16 -25
  130. package/esm2022/lib/radio/radio-group.component.mjs +71 -85
  131. package/esm2022/lib/radio/radio.module.mjs +4 -4
  132. package/esm2022/lib/search-functions.mjs +7 -7
  133. package/esm2022/lib/segment/index.mjs +5 -0
  134. package/esm2022/lib/segment/segment.component.mjs +70 -137
  135. package/esm2022/lib/segment/segment.directives.mjs +4 -4
  136. package/esm2022/lib/segment/segment.module.mjs +4 -4
  137. package/esm2022/lib/select/index.mjs +5 -0
  138. package/esm2022/lib/select/select.component.mjs +348 -655
  139. package/esm2022/lib/select/select.directive.mjs +46 -46
  140. package/esm2022/lib/select/select.module.mjs +4 -4
  141. package/esm2022/lib/select/select.types.mjs +1 -1
  142. package/esm2022/lib/slide-toggle/index.mjs +4 -0
  143. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +19 -24
  144. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +4 -4
  145. package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +5 -0
  146. package/esm2022/lib/slider/abstract-slider.mjs +111 -200
  147. package/esm2022/lib/slider/index.mjs +7 -0
  148. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +26 -23
  149. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +4 -4
  150. package/esm2022/lib/slider/slider.component.mjs +13 -10
  151. package/esm2022/lib/slider/slider.directive.mjs +3 -3
  152. package/esm2022/lib/slider/slider.module.mjs +7 -7
  153. package/esm2022/lib/slider/slider.types.mjs +1 -1
  154. package/esm2022/lib/snackbar/snackbar-ref.mjs +1 -1
  155. package/esm2022/lib/snackbar/snackbar.component.mjs +8 -8
  156. package/esm2022/lib/snackbar/snackbar.service.mjs +13 -12
  157. package/esm2022/lib/snackbar/snackbar.types.mjs +1 -1
  158. package/esm2022/lib/spinner/index.mjs +3 -0
  159. package/esm2022/lib/spinner/spinner.component.mjs +9 -13
  160. package/esm2022/lib/spinner/spinner.module.mjs +4 -4
  161. package/esm2022/lib/star/index.mjs +4 -0
  162. package/esm2022/lib/star/star-button/index.mjs +3 -0
  163. package/esm2022/lib/star/star-button/star-button.component.mjs +17 -26
  164. package/esm2022/lib/star/star-button/star-button.module.mjs +4 -4
  165. package/esm2022/lib/star/star-display/index.mjs +3 -0
  166. package/esm2022/lib/star/star-display/star-display.component.mjs +48 -55
  167. package/esm2022/lib/star/star-display/star-display.module.mjs +4 -4
  168. package/esm2022/lib/star/star-input/index.mjs +3 -0
  169. package/esm2022/lib/star/star-input/star-input.component.mjs +70 -106
  170. package/esm2022/lib/star/star-input/star-input.module.mjs +4 -4
  171. package/esm2022/lib/star/star.component.mjs +12 -20
  172. package/esm2022/lib/star/star.module.mjs +4 -4
  173. package/esm2022/lib/statebox/index.mjs +3 -0
  174. package/esm2022/lib/statebox/statebox.component.mjs +64 -102
  175. package/esm2022/lib/statebox/statebox.module.mjs +4 -4
  176. package/esm2022/lib/statebox/statebox.types.mjs +1 -1
  177. package/esm2022/lib/tabber/index.mjs +4 -0
  178. package/esm2022/lib/tabber/tab/tab.component.mjs +42 -0
  179. package/esm2022/lib/tabber/tabber.component.mjs +83 -0
  180. package/esm2022/lib/tabber/tabber.module.mjs +19 -0
  181. package/esm2022/lib/table/index.mjs +5 -0
  182. package/esm2022/lib/table/table-item-storage.mjs +204 -200
  183. package/esm2022/lib/table/table.component.mjs +184 -304
  184. package/esm2022/lib/table/table.directives.mjs +19 -21
  185. package/esm2022/lib/table/table.module.mjs +4 -4
  186. package/esm2022/lib/table/utils.mjs +1 -1
  187. package/esm2022/lib/table-from-csv/index.mjs +3 -0
  188. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +85 -29
  189. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +4 -4
  190. package/esm2022/lib/table-pagination/index.mjs +4 -0
  191. package/esm2022/lib/table-pagination/table-pagination.component.mjs +46 -114
  192. package/esm2022/lib/table-pagination/table-pagination.module.mjs +4 -4
  193. package/esm2022/lib/types/item-storage.types.mjs +1 -1
  194. package/esm2022/lib/types/utility.types.mjs +2 -2
  195. package/esm2022/public-api.mjs +58 -182
  196. package/fesm2022/ardium-ui-ui.mjs +7847 -11692
  197. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  198. package/lib/_internal/boolean-component.d.ts +8 -9
  199. package/lib/_internal/clear-button/clear-button.component.d.ts +1 -1
  200. package/lib/_internal/disablable-component.d.ts +12 -7
  201. package/lib/_internal/focusable-component.d.ts +5 -7
  202. package/lib/_internal/item-storages/dropdown-item-storage.d.ts +43 -41
  203. package/lib/_internal/item-storages/simple-item-storage.d.ts +28 -25
  204. package/lib/_internal/item-storages/simplest-item-storage.d.ts +14 -9
  205. package/lib/_internal/models/pagination.model.d.ts +38 -42
  206. package/lib/_internal/ngmodel-component.d.ts +1 -1
  207. package/lib/_internal/selectable-list-component.d.ts +30 -30
  208. package/lib/badge/badge.directive.d.ts +15 -20
  209. package/lib/badge/index.d.ts +3 -0
  210. package/lib/buttons/_button-base.d.ts +9 -12
  211. package/lib/buttons/button/button.component.d.ts +6 -8
  212. package/lib/buttons/button/index.d.ts +2 -0
  213. package/lib/buttons/fab/fab.component.d.ts +4 -6
  214. package/lib/buttons/fab/index.d.ts +2 -0
  215. package/lib/buttons/icon-button/icon-button.component.d.ts +6 -7
  216. package/lib/buttons/icon-button/index.d.ts +2 -0
  217. package/lib/card/card.children.d.ts +4 -3
  218. package/lib/card/card.component.d.ts +5 -4
  219. package/lib/card/index.d.ts +4 -0
  220. package/lib/checkbox/checkbox.component.d.ts +8 -12
  221. package/lib/checkbox/index.d.ts +3 -0
  222. package/lib/checkbox-list/checkbox-list.component.d.ts +22 -21
  223. package/lib/checkbox-list/index.d.ts +3 -0
  224. package/lib/chip/chip.component.d.ts +8 -10
  225. package/lib/chip/deletable-chip/deletable-chip.component.d.ts +11 -14
  226. package/lib/chip/index.d.ts +4 -0
  227. package/lib/chip/selectable-chip/selectable-chip.component.d.ts +10 -12
  228. package/lib/color/color-display/color-display.component.d.ts +6 -9
  229. package/lib/color/color-display/index.d.ts +3 -0
  230. package/lib/color/color-picker/color-picker.types.d.ts +4 -4
  231. package/lib/dialog/dialog.component.d.ts +25 -35
  232. package/lib/dialog/dialog.types.d.ts +2 -2
  233. package/lib/dialog/index.d.ts +4 -0
  234. package/lib/divider/divider.component.d.ts +3 -4
  235. package/lib/divider/index.d.ts +2 -0
  236. package/lib/dropdown-panel/dropdown-panel.component.d.ts +17 -20
  237. package/lib/dropdown-panel/index.d.ts +3 -0
  238. package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +5 -4
  239. package/lib/file-inputs/file-drop-area/index.d.ts +3 -0
  240. package/lib/file-inputs/file-input/file-input.component.d.ts +13 -17
  241. package/lib/file-inputs/file-input/index.d.ts +3 -0
  242. package/lib/file-inputs/file-input-base.d.ts +13 -18
  243. package/lib/form-field-frame/form-field-frame.component.d.ts +12 -16
  244. package/lib/form-field-frame/index.d.ts +3 -0
  245. package/lib/icon/icon.component.d.ts +10 -19
  246. package/lib/icon/index.d.ts +3 -0
  247. package/lib/inputs/color-input/color-input.types.d.ts +2 -2
  248. package/lib/inputs/digit-input/digit-input.component.d.ts +22 -30
  249. package/lib/inputs/digit-input/digit-input.model.d.ts +8 -12
  250. package/lib/inputs/digit-input/digit-input.types.d.ts +4 -4
  251. package/lib/inputs/digit-input/digit-input.utils.d.ts +4 -5
  252. package/lib/inputs/digit-input/index.d.ts +3 -0
  253. package/lib/inputs/hex-input/hex-input.component.d.ts +32 -38
  254. package/lib/inputs/hex-input/index.d.ts +3 -0
  255. package/lib/inputs/hex-input.model.d.ts +10 -11
  256. package/lib/inputs/input/index.d.ts +3 -0
  257. package/lib/inputs/input/input.component.d.ts +34 -40
  258. package/lib/inputs/input/input.directives.d.ts +3 -3
  259. package/lib/inputs/input-utils.d.ts +24 -27
  260. package/lib/inputs/number-input/index.d.ts +3 -0
  261. package/lib/inputs/number-input/number-input.component.d.ts +38 -48
  262. package/lib/inputs/password-input/index.d.ts +4 -0
  263. package/lib/inputs/password-input/password-input.component.d.ts +28 -40
  264. package/lib/inputs/password-input/password-input.types.d.ts +2 -2
  265. package/lib/inputs/simple-input/index.d.ts +3 -0
  266. package/lib/inputs/simple-input/simple-input.component.d.ts +30 -35
  267. package/lib/kbd/index.d.ts +3 -0
  268. package/lib/kbd/kbd.component.d.ts +6 -8
  269. package/lib/kbd-shortcut/index.d.ts +2 -0
  270. package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +7 -10
  271. package/lib/modal/index.d.ts +2 -0
  272. package/lib/modal/modal.component.d.ts +22 -30
  273. package/lib/option/index.d.ts +2 -0
  274. package/lib/option/option.component.d.ts +11 -16
  275. package/lib/progress-bar/index.d.ts +4 -0
  276. package/lib/progress-bar/progress-bar.component.d.ts +14 -20
  277. package/lib/progress-bar/progress-bar.types.d.ts +2 -2
  278. package/lib/progress-circle/index.d.ts +4 -0
  279. package/lib/progress-circle/progress-circle.component.d.ts +12 -20
  280. package/lib/progress-circle/progress-circle.types.d.ts +2 -2
  281. package/lib/radio/index.d.ts +3 -0
  282. package/lib/radio/radio/radio.component.d.ts +7 -8
  283. package/lib/radio/radio-group.component.d.ts +13 -16
  284. package/lib/segment/index.d.ts +4 -0
  285. package/lib/segment/segment.component.d.ts +22 -34
  286. package/lib/segment/segment.directives.d.ts +2 -3
  287. package/lib/select/index.d.ts +4 -0
  288. package/lib/select/select.component.d.ts +114 -160
  289. package/lib/select/select.directive.d.ts +3 -3
  290. package/lib/select/select.types.d.ts +2 -76
  291. package/lib/slide-toggle/index.d.ts +3 -0
  292. package/lib/slide-toggle/slide-toggle.component.d.ts +9 -7
  293. package/lib/slide-toggle/slide-toggle.types.d.ts +5 -0
  294. package/lib/slider/abstract-slider.d.ts +38 -55
  295. package/lib/slider/index.d.ts +6 -0
  296. package/lib/slider/range-slider/range-slider.component.d.ts +3 -1
  297. package/lib/slider/slider.component.d.ts +2 -0
  298. package/lib/slider/slider.types.d.ts +8 -8
  299. package/lib/snackbar/snackbar-ref.d.ts +1 -2
  300. package/lib/snackbar/snackbar.component.d.ts +3 -3
  301. package/lib/snackbar/snackbar.service.d.ts +2 -2
  302. package/lib/snackbar/snackbar.types.d.ts +4 -4
  303. package/lib/spinner/index.d.ts +2 -0
  304. package/lib/spinner/spinner.component.d.ts +3 -3
  305. package/lib/star/index.d.ts +3 -0
  306. package/lib/star/star-button/index.d.ts +2 -0
  307. package/lib/star/star-button/star-button.component.d.ts +7 -7
  308. package/lib/star/star-display/index.d.ts +2 -0
  309. package/lib/star/star-display/star-display.component.d.ts +8 -12
  310. package/lib/star/star-input/index.d.ts +2 -0
  311. package/lib/star/star-input/star-input.component.d.ts +17 -22
  312. package/lib/star/star.component.d.ts +5 -5
  313. package/lib/statebox/index.d.ts +3 -0
  314. package/lib/statebox/statebox.component.d.ts +15 -21
  315. package/lib/statebox/statebox.types.d.ts +12 -8
  316. package/lib/tabber/index.d.ts +3 -0
  317. package/lib/tabber/tab/tab.component.d.ts +18 -0
  318. package/lib/tabber/tabber.component.d.ts +25 -0
  319. package/lib/tabber/tabber.module.d.ts +9 -0
  320. package/lib/table/index.d.ts +4 -0
  321. package/lib/table/table-item-storage.d.ts +70 -58
  322. package/lib/table/table.component.d.ts +59 -78
  323. package/lib/table/table.directives.d.ts +4 -3
  324. package/lib/table-from-csv/index.d.ts +2 -0
  325. package/lib/table-from-csv/table-from-csv.component.d.ts +46 -9
  326. package/lib/table-pagination/index.d.ts +3 -0
  327. package/lib/table-pagination/table-pagination.component.d.ts +21 -30
  328. package/lib/types/item-storage.types.d.ts +19 -18
  329. package/lib/types/utility.types.d.ts +2 -1
  330. package/package.json +8 -9
  331. package/prebuilt-themes/default/badge.css +5 -5
  332. package/prebuilt-themes/default/buttons/fab.css +4 -3
  333. package/prebuilt-themes/default/buttons/fab.css.map +1 -1
  334. package/prebuilt-themes/default/card.css +7 -7
  335. package/prebuilt-themes/default/chips.css +3 -8
  336. package/prebuilt-themes/default/chips.css.map +1 -1
  337. package/prebuilt-themes/default/core.css +6 -3
  338. package/prebuilt-themes/default/core.css.map +1 -1
  339. package/prebuilt-themes/default/inputs/color-input.css +1 -1
  340. package/prebuilt-themes/default/inputs/digit-input.css +1 -1
  341. package/prebuilt-themes/default/inputs/file-input.css +139 -2
  342. package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
  343. package/prebuilt-themes/default/inputs/hex-input.css +2 -2
  344. package/prebuilt-themes/default/inputs/input.css +1 -1
  345. package/prebuilt-themes/default/inputs/search-bar.css +1 -1
  346. package/prebuilt-themes/default/inputs/simple-input.css +1 -1
  347. package/prebuilt-themes/default/modal.css +1 -1
  348. package/prebuilt-themes/default/segment.css +2 -2
  349. package/prebuilt-themes/default/segment.css.map +1 -1
  350. package/prebuilt-themes/default/select.css +5 -3
  351. package/prebuilt-themes/default/select.css.map +1 -1
  352. package/prebuilt-themes/default/snackbar.css +0 -1
  353. package/prebuilt-themes/default/snackbar.css.map +1 -1
  354. package/prebuilt-themes/default/tabber.css +207 -0
  355. package/prebuilt-themes/default/tabber.css.map +1 -0
  356. package/public-api.d.ts +43 -136
  357. package/themes/default/_clear-button.scss +1 -1
  358. package/themes/default/badge.scss +5 -5
  359. package/themes/default/buttons/fab.scss +5 -3
  360. package/themes/default/card.scss +7 -7
  361. package/themes/default/chips.scss +2 -8
  362. package/themes/default/core.scss +6 -3
  363. package/themes/default/inputs/digit-input.scss +1 -1
  364. package/themes/default/inputs/file-input.scss +8 -1
  365. package/themes/default/inputs/hex-input.scss +1 -1
  366. package/themes/default/modal.scss +1 -1
  367. package/themes/default/segment.scss +2 -1
  368. package/themes/default/select.scss +4 -2
  369. package/themes/default/snackbar.scss +0 -2
  370. package/themes/default/tabber.scss +86 -0
  371. package/esm2022/lib/calendar/calendar.component.mjs +0 -979
  372. package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
  373. package/esm2022/lib/calendar/calendar.helpers.mjs +0 -47
  374. package/esm2022/lib/calendar/calendar.module.mjs +0 -21
  375. package/esm2022/lib/calendar/calendar.types.mjs +0 -11
  376. package/esm2022/lib/color/color-picker/color-picker.component.mjs +0 -484
  377. package/esm2022/lib/color/color-picker/color-picker.directives.mjs +0 -55
  378. package/esm2022/lib/color/color-picker/color-picker.module.mjs +0 -43
  379. package/esm2022/lib/inputs/color-input/color-input.component.mjs +0 -421
  380. package/esm2022/lib/inputs/color-input/color-input.module.mjs +0 -85
  381. package/lib/calendar/calendar.component.d.ts +0 -155
  382. package/lib/calendar/calendar.directives.d.ts +0 -51
  383. package/lib/calendar/calendar.helpers.d.ts +0 -15
  384. package/lib/calendar/calendar.module.d.ts +0 -11
  385. package/lib/calendar/calendar.types.d.ts +0 -80
  386. package/lib/color/color-picker/color-picker.component.d.ts +0 -125
  387. package/lib/color/color-picker/color-picker.directives.d.ts +0 -27
  388. package/lib/color/color-picker/color-picker.module.d.ts +0 -13
  389. package/lib/inputs/color-input/color-input.component.d.ts +0 -147
  390. package/lib/inputs/color-input/color-input.module.d.ts +0 -16
@@ -1,6 +1,6 @@
1
- import { OverlayConfig } from '@angular/cdk/overlay';
1
+ import { Overlay, OverlayConfig, ScrollStrategyOptions } from '@angular/cdk/overlay';
2
2
  import { TemplatePortal } from '@angular/cdk/portal';
3
- import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, TemplateRef, ViewChild, ViewEncapsulation, forwardRef, } from '@angular/core';
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, HostBinding, HostListener, Input, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation, computed, contentChild, forwardRef, inject, input, model, output, signal, viewChild, } from '@angular/core';
4
4
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
  import { coerceArrayProperty, coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
6
6
  import { Subject, merge, startWith, takeUntil } from 'rxjs';
@@ -16,149 +16,228 @@ import { FormElementAppearance } from '../types/theming.types';
16
16
  import { FormElementVariant } from './../types/theming.types';
17
17
  import { ArdAddCustomTemplateDirective, ArdDropdownFooterTemplateDirective, ArdDropdownHeaderTemplateDirective, ArdItemDisplayLimitTemplateDirective, ArdItemLimitReachedTemplateDirective, ArdLoadingPlaceholderTemplateDirective, ArdLoadingSpinnerTemplateDirective, ArdNoItemsFoundTemplateDirective, ArdOptgroupTemplateDirective, ArdOptionTemplateDirective, ArdSelectPlaceholderTemplateDirective, ArdSelectPrefixTemplateDirective, ArdSelectSuffixTemplateDirective, ArdValueTemplateDirective, } from './select.directive';
18
18
  import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/cdk/overlay";
20
- import * as i2 from "@angular/common";
21
- import * as i3 from "../form-field-frame/form-field-frame.component";
22
- import * as i4 from "../dropdown-panel/dropdown-panel.component";
23
- import * as i5 from "../chip/deletable-chip/deletable-chip.component";
24
- import * as i6 from "@ardium-ui/devkit";
25
- import * as i7 from "../_internal/clear-button/clear-button.component";
19
+ import * as i1 from "@angular/common";
20
+ import * as i2 from "../form-field-frame/form-field-frame.component";
21
+ import * as i3 from "../dropdown-panel/dropdown-panel.component";
22
+ import * as i4 from "../chip/deletable-chip/deletable-chip.component";
23
+ import * as i5 from "@ardium-ui/devkit";
24
+ import * as i6 from "../_internal/clear-button/clear-button.component";
26
25
  export class ArdiumSelectComponent extends _NgModelComponentBase {
27
- get itemsAlreadyGrouped() {
28
- return this._itemsAlreadyGrouped;
29
- }
30
- set itemsAlreadyGrouped(v) {
31
- this._itemsAlreadyGrouped = coerceBooleanProperty(v);
32
- }
33
- get invertDisabled() {
34
- return this._invertDisabled;
35
- }
36
- set invertDisabled(v) {
37
- this._invertDisabled = coerceBooleanProperty(v);
38
- }
39
- get noGroupActions() {
40
- return this._noGroupActions;
41
- }
42
- set noGroupActions(v) {
43
- this._noGroupActions = coerceBooleanProperty(v);
44
- }
45
- get autoHighlightFirst() {
46
- return this._autoHighlightFirst;
47
- }
48
- set autoHighlightFirst(v) {
49
- this._autoHighlightFirst = coerceBooleanProperty(v);
50
- }
51
- get autoFocus() {
52
- return this._autoFocus;
53
- }
54
- set autoFocus(v) {
55
- this._autoFocus = coerceBooleanProperty(v);
56
- }
57
- get keepOpen() {
58
- return this._keepOpen;
59
- }
60
- set keepOpen(v) {
61
- this._keepOpen = coerceBooleanProperty(v);
62
- }
63
- get hideSelected() {
64
- return this._hideSelected;
65
- }
66
- set hideSelected(v) {
67
- this._hideSelected = coerceBooleanProperty(v);
68
- }
69
- get noBackspaceClear() {
70
- return this._clearOnBackspace;
71
- }
72
- set noBackspaceClear(v) {
73
- this._clearOnBackspace = coerceBooleanProperty(v);
74
- }
75
- get sortMultipleValues() {
76
- return this._sortMultipleValues;
77
- }
78
- set sortMultipleValues(v) {
79
- this._sortMultipleValues = coerceBooleanProperty(v);
80
- }
81
- get searchCaseSensitive() {
82
- return this._searchCaseSensitive;
83
- }
84
- set searchCaseSensitive(v) {
85
- this._searchCaseSensitive = coerceBooleanProperty(v);
86
- }
87
- get keepSearchAfterSelect() {
88
- return this._keepSearchAfterSelect;
89
- }
90
- set keepSearchAfterSelect(v) {
91
- this._keepSearchAfterSelect = coerceBooleanProperty(v);
92
- }
93
- get maxSelectedItems() {
94
- return this._maxSelectedItems;
95
- }
96
- set maxSelectedItems(v) {
97
- this._maxSelectedItems = coerceNumberProperty(v, undefined);
98
- }
99
- get itemDisplayLimit() {
100
- return this._itemDisplayLimit;
101
- }
102
- set itemDisplayLimit(v) {
103
- this._itemDisplayLimit = coerceNumberProperty(v, Infinity);
104
- }
105
- get searchFn() {
106
- return this._searchFn;
107
- }
108
- set searchFn(fn) {
109
- if (fn !== undefined && fn !== null && !isFunction(fn)) {
110
- throw Error('`searchFn` must be a function.');
111
- }
112
- this._searchFn = fn;
113
- }
114
- get compareWith() {
115
- return this._compareWith;
116
- }
117
- set compareWith(fn) {
118
- if (fn !== undefined && fn !== null && !isFunction(fn)) {
119
- throw Error('`compareWith` must be a function.');
120
- }
121
- this._compareWith = fn;
122
- }
123
- get compact() {
124
- return this._compact;
125
- }
126
- set compact(v) {
127
- this._compact = coerceBooleanProperty(v);
128
- }
129
- get ngClasses() {
130
- return [
26
+ constructor() {
27
+ super(...arguments);
28
+ this._componentId = '000';
29
+ //! public constants
30
+ this.itemStorage = new ItemStorage(this);
31
+ this.DEFAULTS = {
32
+ valueFrom: 'value',
33
+ labelFrom: 'label',
34
+ disabledFrom: 'disabled',
35
+ groupLabelFrom: 'group',
36
+ groupDisabledFrom: 'disabled',
37
+ childrenFrom: 'children',
38
+ searchFn: searchFunctions.byLabel,
39
+ clearButtonTitle: 'Clear',
40
+ noItemsFoundText: 'No items found.',
41
+ loadingPlaceholderText: 'Loading...',
42
+ };
43
+ //! privates
44
+ this._items = [];
45
+ this._isMouseBeingUsed = signal(false);
46
+ this._searchBarFocused = signal(false);
47
+ this._destroy$ = new Subject();
48
+ //! publics
49
+ this.searchTerm = signal('');
50
+ this.isItemsInputUsed = false;
51
+ //! binding-related inputs
52
+ //value/label/disabled/group/pre-grouped children paths
53
+ this.valueFrom = input(undefined);
54
+ this.labelFrom = input(undefined);
55
+ this.disabledFrom = input(undefined);
56
+ //! group-related inputs
57
+ this.groupLabelFrom = input(undefined);
58
+ this.groupDisabledFrom = input(undefined);
59
+ this.childrenFrom = input(undefined);
60
+ //! settings
61
+ this.placeholder = input('Select item');
62
+ this.searchPlaceholder = input('Search...');
63
+ this.clearButtonTitle = input(this.DEFAULTS.clearButtonTitle);
64
+ this.dropdownPosition = input(ArdPanelPosition.Auto);
65
+ //! template-related settings
66
+ this.noItemsFoundText = input(this.DEFAULTS.noItemsFoundText);
67
+ this.loadingPlaceholderText = input(this.DEFAULTS.loadingPlaceholderText);
68
+ //! search-related options
69
+ this.searchInputId = input(undefined);
70
+ this.inputAttrs = input({});
71
+ //! other inputs
72
+ this.isLoading = input(false, { transform: v => coerceBooleanProperty(v) });
73
+ this.inputProps = input({});
74
+ this.htmlId = input(crypto.randomUUID());
75
+ //! boolean settings
76
+ this.itemsAlreadyGrouped = input(false, { transform: v => coerceBooleanProperty(v) });
77
+ //should the value that the "disabledFrom" path lead to be inverted?
78
+ //useful when the property is e.g. "active", which is the oposite of "disabled"
79
+ this.invertDisabled = input(false, { transform: v => coerceBooleanProperty(v) });
80
+ this.noGroupActions = input(false, { transform: v => coerceBooleanProperty(v) });
81
+ this.autoHighlightFirst = input(false, { transform: v => coerceBooleanProperty(v) });
82
+ this.autoFocus = input(false, { transform: v => coerceBooleanProperty(v) });
83
+ this.keepOpen = input(false, { transform: v => coerceBooleanProperty(v) });
84
+ this.hideSelected = input(false, { transform: v => coerceBooleanProperty(v) });
85
+ this.noBackspaceClear = input(false, { transform: v => coerceBooleanProperty(v) });
86
+ this.sortMultipleValues = input(false, { transform: v => coerceBooleanProperty(v) });
87
+ this.searchCaseSensitive = input(false, { transform: v => coerceBooleanProperty(v) });
88
+ this.keepSearchAfterSelect = input(false, { transform: v => coerceBooleanProperty(v) });
89
+ //! number inputs
90
+ this.maxSelectedItems = input(Infinity, { transform: v => coerceNumberProperty(v, Infinity) });
91
+ this.itemDisplayLimit = input(Infinity, { transform: v => coerceNumberProperty(v, Infinity) });
92
+ //! function inputs
93
+ this.searchFn = input(this.DEFAULTS.searchFn);
94
+ this.compareWith = input(undefined);
95
+ //! appearance
96
+ this.appearance = input(FormElementAppearance.Outlined);
97
+ this.variant = input(FormElementVariant.Rounded);
98
+ this.compact = input(false, { transform: v => coerceBooleanProperty(v) });
99
+ this.ngClasses = computed(() => [
131
100
  //appearance, variant handled in ard-form-field-frame component
132
- this.compact ? 'ard-compact' : '',
133
- this.multiselectable ? 'ard-multiselect' : 'ard-singleselect',
134
- this.clearable ? 'ard-clearable' : '',
135
- this.searchable ? 'ard-searchable' : '',
136
- this.filtered ? 'ard-filtered' : '',
137
- this.touched ? 'ard-touched' : '',
138
- this.isDropdownOpen ? 'ard-dropdown-open' : '',
139
- this._searchBarFocused ? 'ard-select-focused' : '',
140
- this._searchBarFocused ? 'ard-select-focused' : '',
141
- ].join(' ');
142
- }
143
- set dropdowonAppearance(v) {
144
- this._dropdownAppearance = v;
145
- }
146
- get dropdownAppearance() {
147
- if (this._dropdownAppearance)
148
- return this._dropdownAppearance;
149
- if (this.appearance == FormElementAppearance.Outlined)
150
- return DropdownPanelAppearance.Outlined;
151
- return DropdownPanelAppearance.Raised;
152
- }
153
- set dropdowonVariant(v) {
154
- this._dropdownVariant = v;
101
+ this.compact() ? 'ard-compact' : '',
102
+ this.multiselectable() ? 'ard-multiselect' : 'ard-singleselect',
103
+ this.clearable() ? 'ard-clearable' : '',
104
+ this.searchable() ? 'ard-searchable' : '',
105
+ this.filtered() ? 'ard-filtered' : '',
106
+ this.touched() ? 'ard-touched' : '',
107
+ this.isOpen() ? 'ard-dropdown-open' : '',
108
+ this._searchBarFocused() ? 'ard-select-focused' : '',
109
+ this._searchBarFocused() ? 'ard-select-focused' : '',
110
+ ].join(' '));
111
+ this.dropdownAppearance = input(undefined);
112
+ this.dropdownAppearanceOrDefault = computed(() => {
113
+ if (this.dropdownAppearance())
114
+ return this.dropdownAppearance();
115
+ if (this.appearance() === FormElementAppearance.Outlined)
116
+ return DropdownPanelAppearance.Outlined;
117
+ return DropdownPanelAppearance.Raised;
118
+ });
119
+ this.dropdownVariant = input(undefined);
120
+ this.dropdownVariantOrDefault = computed(() => {
121
+ if (this.dropdownVariant())
122
+ return this.dropdownVariant();
123
+ const variant = this.variant();
124
+ if (variant === FormElementVariant.Pill)
125
+ return DropdownPanelVariant.Rounded;
126
+ return variant;
127
+ });
128
+ //! attribute and/or class setters/getters
129
+ this.multiselectable = input(false, { transform: v => coerceBooleanProperty(v) });
130
+ this.clearable = input(false, { transform: v => coerceBooleanProperty(v) });
131
+ this.searchable = input(false, { transform: v => coerceBooleanProperty(v) });
132
+ this.filtered = computed(() => this.searchable() && this.searchTerm() !== '');
133
+ this.touched = signal(false);
134
+ //! custom options
135
+ this._defaultAddCustomFn = (value) => value;
136
+ this.addCustom = input(false, {
137
+ transform: v => {
138
+ if (isFunction(v)) {
139
+ return v;
140
+ }
141
+ //coerce the value into a boolean
142
+ //if "true", use the default function. Otherwise, just set to "false".
143
+ return coerceBooleanProperty(v) && this._defaultAddCustomFn;
144
+ },
145
+ });
146
+ this.shouldShowAddCustom = computed(() => this.addCustom() !== false && this.searchTerm().length > 0 && this.itemStorage.isNoItemsFound());
147
+ this.valueChange = output();
148
+ //! output events
149
+ this.changeEvent = output({ alias: 'change' });
150
+ this.addEvent = output({ alias: 'add' });
151
+ this.failedToAddEvent = output({ alias: 'failedToAdd' });
152
+ this.removeEvent = output({ alias: 'remove' });
153
+ this.clearEvent = output({ alias: 'clear' });
154
+ this.openEvent = output({ alias: 'open' });
155
+ this.closeEvent = output({ alias: 'close' });
156
+ this.scrollEvent = output({ alias: 'scroll' });
157
+ this.scrollToEndEvent = output({ alias: 'scrollToEnd' });
158
+ this.searchEvent = output({ alias: 'search' });
159
+ this.isOpen = model(false);
160
+ //! view children
161
+ this.searchInput = viewChild('searchInput');
162
+ this.dropdownPanel = viewChild(ArdiumDropdownPanelComponent);
163
+ //! templates
164
+ this.optionTemplate = contentChild(ArdOptionTemplateDirective);
165
+ this.optgroupTemplate = contentChild(ArdOptgroupTemplateDirective);
166
+ this.valueTemplate = contentChild(ArdValueTemplateDirective);
167
+ this.placeholderTemplate = contentChild(ArdSelectPlaceholderTemplateDirective);
168
+ this.loadingSpinnerTemplate = contentChild(ArdLoadingSpinnerTemplateDirective);
169
+ this.loadingPlaceholderTemplate = contentChild(ArdLoadingPlaceholderTemplateDirective);
170
+ this.dropdownHeaderTemplate = contentChild(ArdDropdownHeaderTemplateDirective);
171
+ this.dropdownFooterTemplate = contentChild(ArdDropdownFooterTemplateDirective);
172
+ this.noItemsFoundTemplate = contentChild(ArdNoItemsFoundTemplateDirective);
173
+ this.addCustomTemplate = contentChild(ArdAddCustomTemplateDirective);
174
+ this.itemLimitReachedTemplate = contentChild(ArdItemLimitReachedTemplateDirective);
175
+ this.itemDisplayLimitTemplate = contentChild(ArdItemDisplayLimitTemplateDirective);
176
+ this.prefixTemplate = contentChild(ArdSelectPrefixTemplateDirective);
177
+ this.suffixTemplate = contentChild(ArdSelectSuffixTemplateDirective);
178
+ this.getStatsContext = computed(() => ({
179
+ totalItems: this.totalItems(),
180
+ foundItems: this.foundItems(),
181
+ }));
182
+ this.getSearchContext = computed(() => ({
183
+ $implicit: this.searchTerm(),
184
+ searchTerm: this.searchTerm(),
185
+ totalItems: this.totalItems(),
186
+ foundItems: this.foundItems(),
187
+ }));
188
+ this.getPlaceholderContext = computed(() => {
189
+ const placeholder = this.placeholderForCurrentContext();
190
+ return {
191
+ placeholder,
192
+ $implicit: placeholder,
193
+ };
194
+ });
195
+ this.getCustomOptionContext = computed(() => ({
196
+ $implicit: this.searchTerm(),
197
+ searchTerm: this.searchTerm(),
198
+ }));
199
+ this.getItemLimitContext = computed(() => ({
200
+ totalItems: this.totalItems(),
201
+ selectedItems: this.itemStorage.selectedItems().length,
202
+ itemLimit: this.maxSelectedItems(),
203
+ }));
204
+ this.getItemDisplayLimitContext = computed(() => {
205
+ const selectedItems = this.itemStorage.selectedItems().length;
206
+ return {
207
+ totalItems: this.totalItems(),
208
+ selectedItems,
209
+ itemLimit: this.maxSelectedItems(),
210
+ overflowCount: selectedItems - (this.itemDisplayLimit() ?? 0),
211
+ };
212
+ });
213
+ this.elementRef = inject((ElementRef));
214
+ this._cd = inject(ChangeDetectorRef);
215
+ this.overlay = inject(Overlay);
216
+ this.viewContainerRef = inject(ViewContainerRef);
217
+ this.scrollStrategyOpts = inject(ScrollStrategyOptions);
218
+ //! getters
219
+ this.firstHighlightedItem = computed(() => this.itemStorage.highlightedItems()?.first());
220
+ this.shouldDisplayPlaceholder = computed(() => !this.itemStorage.isAnyItemSelected() && !this.searchTerm());
221
+ this.shouldDisplayValue = computed(() => this.itemStorage.isAnyItemSelected() && (!this.searchTerm() || this.multiselectable()));
222
+ this.shouldShowClearButton = computed(() => this.clearable() && !this.disabled() && (this.itemStorage.isAnyItemSelected() || this.searchTerm() !== ''));
223
+ this.itemsToDisplay = computed(() => this.itemStorage.groups().values());
224
+ this.shouldShowNoItemsFound = computed(() => this.itemStorage.isNoItemsFound() && !this.isLoading() && !this.shouldShowAddCustom());
225
+ this.totalItems = computed(() => this.itemStorage.items().length);
226
+ this.foundItems = computed(() => this.searchable() ? this.itemStorage.filteredItems().length : undefined);
227
+ this.shouldShowItemDisplayLimit = computed(() => this.multiselectable() &&
228
+ this.itemDisplayLimit() !== Infinity &&
229
+ this.itemStorage.selectedItems().length > this.itemDisplayLimit());
230
+ this.isInputElementReadonly = computed(() => !this.addCustom() && (!this.searchable() || this.itemStorage.isItemLimitReached()));
231
+ this.placeholderForCurrentContext = computed(() => {
232
+ if (this.searchPlaceholder() && this.searchable() && (this._searchBarFocused() || this._isClickedWithin()))
233
+ return this.searchPlaceholder();
234
+ return this.placeholder();
235
+ });
236
+ //! click handlers
237
+ this._isClickedWithin = signal(false);
155
238
  }
156
- get dropdownVariant() {
157
- if (this._dropdownVariant)
158
- return this._dropdownVariant;
159
- if (this.variant == FormElementVariant.Pill)
160
- return DropdownPanelVariant.Rounded;
161
- return this.variant;
239
+ get _groupItemsHostAttribute() {
240
+ return this.groupLabelFrom();
162
241
  }
163
242
  //! items setter/getter
164
243
  get items() {
@@ -173,7 +252,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
173
252
  else if (isAnyString(value)) {
174
253
  value = coerceArrayProperty(value);
175
254
  }
176
- let printErrors = this.itemStorage.setItems(value);
255
+ const printErrors = this.itemStorage.setItems(value);
177
256
  if (printErrors) {
178
257
  this._printPrimitiveWarnings();
179
258
  }
@@ -187,19 +266,23 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
187
266
  setTimeout(() => {
188
267
  const item = this.itemStorage.findItemByValue(option.oldValue ?? option.value);
189
268
  if (item) {
190
- item.disabled = option.disabled;
191
- item.label = option.label || item.label;
192
- item.value = option.value;
193
- item.itemData.disabled = option.disabled;
194
- item.itemData.label = option.label || item.label;
195
- item.itemData.value = option.value;
269
+ item.disabled.set(option.disabled);
270
+ item.label.set(option.label || item.label());
271
+ item.value.set(option.value);
272
+ item.itemData.set({
273
+ label: option.label || item.label(),
274
+ value: option.value,
275
+ disabled: option.disabled,
276
+ });
196
277
  }
197
278
  this.detectChanges();
198
279
  }, 0);
199
280
  });
200
281
  };
201
- this.optionComponents.changes.pipe(startWith(this.optionComponents), takeUntil(this._destroy$)).subscribe((options) => {
202
- if (options.length == 0)
282
+ this.optionComponents.changes
283
+ .pipe(startWith(this.optionComponents), takeUntil(this._destroy$))
284
+ .subscribe((options) => {
285
+ if (options.length === 0)
203
286
  return;
204
287
  setTimeout(() => {
205
288
  this.items = options.map(option => ({
@@ -212,55 +295,11 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
212
295
  }, 0);
213
296
  });
214
297
  }
215
- get multiselectable() {
216
- return this._multiselectable;
217
- }
218
- set multiselectable(v) {
219
- this._multiselectable = coerceBooleanProperty(v);
220
- }
221
- get singleselectable() {
222
- return !this._multiselectable;
223
- }
224
- get clearable() {
225
- return this._clearable;
226
- }
227
- set clearable(v) {
228
- this._clearable = coerceBooleanProperty(v);
229
- }
230
- get searchable() {
231
- return this._searchable;
232
- }
233
- set searchable(v) {
234
- this._searchable = coerceBooleanProperty(v);
235
- }
236
- get filtered() {
237
- return this._searchable && this.searchTerm != '';
238
- }
239
- get touched() {
240
- return this._touched;
241
- }
242
- set touched(state) {
243
- this._touched = state;
244
- }
245
- get addCustom() {
246
- return this._addCustom;
247
- }
248
- set addCustom(v) {
249
- if (isFunction(v)) {
250
- this._addCustom = v;
251
- return;
252
- }
253
- //coerce the value into a boolean
254
- //if "true", use the default function. Otherwise, just set to "false".
255
- this._addCustom = coerceBooleanProperty(v) && this._defaultAddCustomFn;
256
- }
257
- get shouldShowAddCustom() {
258
- return this.addCustom != false && this.searchTerm.length > 0 && this.itemStorage.isNoItemsFound;
259
- }
260
298
  async addCustomOption(value) {
261
- if (!this.addCustom)
299
+ const ac = this.addCustom();
300
+ if (!ac)
262
301
  return;
263
- const newOptionObj = await this.itemStorage.addCustomOption(value, this.addCustom);
302
+ const newOptionObj = await this.itemStorage.addCustomOption(value, ac);
264
303
  this.selectItem(newOptionObj);
265
304
  }
266
305
  //! control value accessor
@@ -273,15 +312,15 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
273
312
  this.itemStorage.handleWriteValue(ngModel);
274
313
  this._cd.markForCheck();
275
314
  }
276
- //* change & touch event emitters
315
+ //! change & touch event emitters
277
316
  _emitChange() {
278
- let value = this.itemStorage.value;
317
+ const value = this.itemStorage.value();
279
318
  this._onChangeRegistered?.(value);
280
319
  this.changeEvent.emit(value);
281
320
  this.valueChange.emit(value);
282
321
  }
283
322
  _onTouched() {
284
- this.touched = true;
323
+ this.touched.set(true);
285
324
  this._onTouchedRegistered?.();
286
325
  }
287
326
  //! value input & output
@@ -299,165 +338,29 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
299
338
  }
300
339
  //! context providers
301
340
  getValueContext(item) {
302
- const $this = this;
303
341
  return {
304
342
  $implicit: item,
305
343
  item,
306
- itemData: item.itemData,
307
- unselect() {
308
- $this.unselectItem(item);
344
+ itemData: item.itemData(),
345
+ unselect: () => {
346
+ this.unselectItem(item);
309
347
  },
310
348
  };
311
349
  }
312
- getStatsContext() {
313
- return {
314
- totalItems: this.totalItems,
315
- foundItems: this.foundItems,
316
- };
317
- }
318
- getSearchContext() {
319
- return {
320
- $implicit: this.searchTerm,
321
- searchTerm: this.searchTerm,
322
- totalItems: this.totalItems,
323
- foundItems: this.foundItems,
324
- };
325
- }
326
- getPlaceholderContext() {
327
- const placeholder = this.placeholderForCurrentContext;
328
- return {
329
- placeholder,
330
- $implicit: placeholder,
331
- };
332
- }
333
- getCustomOptionContext() {
334
- return {
335
- $implicit: this.searchTerm,
336
- searchTerm: this.searchTerm,
337
- };
338
- }
339
350
  getGroupContext(group) {
340
351
  return {
341
352
  $implicit: group,
342
353
  group,
343
- selectedChildren: group.children.filter(v => v.selected).length,
344
- totalChildren: group.children.length,
354
+ selectedChildren: group.children().filter(v => v.selected()).length,
355
+ totalChildren: group.children().length,
345
356
  };
346
357
  }
347
358
  getOptionContext(item) {
348
359
  return {
349
360
  $implicit: item,
350
361
  item,
351
- itemData: item.itemData,
352
- };
353
- }
354
- getItemLimitContext() {
355
- return {
356
- totalItems: this.totalItems,
357
- selectedItems: this.itemStorage.selectedItems.length,
358
- itemLimit: this.maxSelectedItems,
359
- };
360
- }
361
- getItemDisplayLimitContext() {
362
- let selectedItems = this.itemStorage.selectedItems.length;
363
- return {
364
- totalItems: this.totalItems,
365
- selectedItems,
366
- itemLimit: this.maxSelectedItems,
367
- overflowCount: selectedItems - (this.itemDisplayLimit ?? 0),
368
- };
369
- }
370
- constructor(_elementRef, _cd, overlay, viewContainerRef, scrollStrategyOpts) {
371
- super();
372
- this._cd = _cd;
373
- this.overlay = overlay;
374
- this.viewContainerRef = viewContainerRef;
375
- this.scrollStrategyOpts = scrollStrategyOpts;
376
- //! public constants
377
- this.itemStorage = new ItemStorage(this);
378
- this.DEFAULTS = {
379
- valueFrom: 'value',
380
- labelFrom: 'label',
381
- disabledFrom: 'disabled',
382
- groupLabelFrom: 'group',
383
- groupDisabledFrom: 'disabled',
384
- childrenFrom: 'children',
385
- searchFn: searchFunctions.byLabel,
386
- clearButtonTitle: 'Clear',
387
- noItemsFoundText: 'No items found.',
388
- loadingPlaceholderText: 'Loading...',
362
+ itemData: item.itemData(),
389
363
  };
390
- //! privates
391
- this._items = [];
392
- this._isMouseBeingUsed = false;
393
- this._searchBarFocused = false;
394
- this._destroy$ = new Subject();
395
- //! publics
396
- this.searchTerm = '';
397
- this.isItemsInputUsed = false;
398
- //! settings
399
- this.placeholder = 'Select item';
400
- this.searchPlaceholder = 'Search...';
401
- this.dropdownPosition = ArdPanelPosition.Auto;
402
- this.clearButtonTitle = this.DEFAULTS.clearButtonTitle;
403
- //! template-related settings
404
- this.noItemsFoundText = this.DEFAULTS.noItemsFoundText;
405
- this.loadingPlaceholderText = this.DEFAULTS.loadingPlaceholderText;
406
- //! other inputs
407
- this.isLoading = false;
408
- this.inputAttrs = {};
409
- this.htmlId = crypto.randomUUID();
410
- //! boolean settings
411
- this._itemsAlreadyGrouped = false;
412
- //should the value that the "disabledFrom" path lead to be inverted?
413
- //useful when the property is e.g. "active", which is the oposite of "disabled"
414
- this._invertDisabled = false;
415
- this._noGroupActions = false;
416
- this._autoHighlightFirst = true;
417
- this._autoFocus = false;
418
- this._keepOpen = false;
419
- this._hideSelected = false;
420
- this._clearOnBackspace = false;
421
- this._sortMultipleValues = false;
422
- this._searchCaseSensitive = false;
423
- this._keepSearchAfterSelect = false;
424
- //! number inputs
425
- this._maxSelectedItems = undefined;
426
- this._itemDisplayLimit = Infinity;
427
- //! function inputs
428
- this._searchFn = this.DEFAULTS.searchFn;
429
- //! appearance
430
- this.appearance = FormElementAppearance.Outlined;
431
- this.variant = FormElementVariant.Rounded;
432
- this._compact = false;
433
- this._dropdownAppearance = undefined;
434
- this._dropdownVariant = undefined;
435
- //! class-based inputs
436
- this.groupItems = false; //default value may be changed to "true" in ngOnChanges if this.groupBy is defined or this.itemsAlreadyGrouped is set to "true"
437
- //! attribute and/or class setters/getters
438
- this._multiselectable = false;
439
- this._clearable = true;
440
- this._searchable = false;
441
- this._touched = false;
442
- //! custom options
443
- this._defaultAddCustomFn = (value) => value;
444
- this._addCustom = false;
445
- this.valueChange = new EventEmitter();
446
- //! output events
447
- this.changeEvent = new EventEmitter();
448
- this.addEvent = new EventEmitter();
449
- this.failedToAddEvent = new EventEmitter();
450
- this.removeEvent = new EventEmitter();
451
- this.clearEvent = new EventEmitter();
452
- this.openEvent = new EventEmitter();
453
- this.closeEvent = new EventEmitter();
454
- this.scrollEvent = new EventEmitter();
455
- this.scrollToEndEvent = new EventEmitter();
456
- this.searchEvent = new EventEmitter();
457
- this.isDropdownOpenChange = new EventEmitter();
458
- //! click handlers
459
- this._isClickedWithin = false;
460
- this.element = _elementRef.nativeElement;
461
364
  }
462
365
  _createOverlay() {
463
366
  const strategy = this.overlay
@@ -511,7 +414,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
511
414
  this._destroy$.complete();
512
415
  }
513
416
  ngAfterViewInit() {
514
- if (this.autoFocus) {
417
+ if (this.autoFocus()) {
515
418
  this.focus();
516
419
  }
517
420
  }
@@ -523,14 +426,10 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
523
426
  ngOnChanges(changes) {
524
427
  //fire items load handler when loading is set to false
525
428
  if (changes['loading']) {
526
- if (changes['loading'].currentValue == false) {
429
+ if (changes['loading'].currentValue === false) {
527
430
  this._onItemsLoad();
528
431
  }
529
432
  }
530
- //set groupItems to true by default if groupLabelFrom or itemsAlreadyGrouped is set to true as the first change
531
- if ((changes['groupLabelFrom']?.firstChange || changes['itemsAlreadyGrouped']?.firstChange) && !changes['groupItems']) {
532
- this.groupItems = true;
533
- }
534
433
  }
535
434
  _onItemsLoad() {
536
435
  if (!this._searchBarFocused)
@@ -538,145 +437,110 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
538
437
  this.open();
539
438
  }
540
439
  _printPrimitiveWarnings() {
541
- function makeWarning(str) {
542
- console.warn(`Skipped using [${str}] property bound to <ard-select>, as some provided items are of primitive type`);
440
+ function makeWarning(str, errorCode) {
441
+ console.warn(`ARD-WA000${errorCode}: Skipped using [${str}] property bound to <ard-select>, as some provided items are of primitive type`);
543
442
  }
544
- if (this.valueFrom) {
545
- makeWarning('valueFrom');
443
+ if (this.valueFrom()) {
444
+ makeWarning('valueFrom', '5a');
546
445
  }
547
- if (this.labelFrom) {
548
- makeWarning('labelFrom');
446
+ if (this.labelFrom()) {
447
+ makeWarning('labelFrom', '5b');
549
448
  }
550
- if (this.disabledFrom) {
551
- makeWarning('disabledFrom');
449
+ if (this.disabledFrom()) {
450
+ makeWarning('disabledFrom', '5c');
552
451
  }
553
- if (this.groupLabelFrom) {
554
- makeWarning('groupLabelFrom');
452
+ if (this.groupLabelFrom()) {
453
+ makeWarning('groupLabelFrom', '5d');
555
454
  }
556
- if (this.groupDisabledFrom) {
557
- makeWarning('groupDisabledFrom');
455
+ if (this.groupDisabledFrom()) {
456
+ makeWarning('groupDisabledFrom', '5e');
558
457
  }
559
- if (this.childrenFrom) {
560
- makeWarning('childrenFrom');
458
+ if (this.childrenFrom()) {
459
+ makeWarning('childrenFrom', '5f');
561
460
  }
562
- if (this.invertDisabled) {
563
- makeWarning('invertDisabled');
461
+ if (this.invertDisabled()) {
462
+ makeWarning('invertDisabled', '5g');
564
463
  }
565
464
  }
566
- //! getters
567
- get firstHighlightedItem() {
568
- return this.itemStorage.highlightedItems?.first();
569
- }
570
- get shouldDisplayPlaceholder() {
571
- return !this.itemStorage.isAnyItemSelected && !this.searchTerm;
572
- }
573
- get shouldDisplayValue() {
574
- return this.itemStorage.isAnyItemSelected && (!this.searchTerm || this.multiselectable);
575
- }
576
- get shouldShowClearButton() {
577
- return this._clearable && !this._disabled && (this.itemStorage.isAnyItemSelected || this.searchTerm != '');
578
- }
579
- get itemsToDisplay() {
580
- return this.itemStorage.groups.values();
581
- }
582
- get shouldShowNoItemsFound() {
583
- return this.itemStorage.isNoItemsFound && !this.isLoading && !this.shouldShowAddCustom;
584
- }
585
- get totalItems() {
586
- return this.itemStorage.items.length;
587
- }
588
- get foundItems() {
589
- if (!this.searchable)
590
- return undefined;
591
- return this.itemStorage.filteredItems.length;
592
- }
593
- get shouldShowItemDisplayLimit() {
594
- return this.multiselectable && this.itemDisplayLimit != Infinity && this.itemStorage.selectedItems.length > this.itemDisplayLimit;
595
- }
596
- get isInputElementReadonly() {
597
- return !this.addCustom && (!this.searchable || this.itemStorage.isItemLimitReached);
598
- }
599
465
  isValueWithinDisplayLimit(i) {
600
- return !this.multiselectable || this.itemDisplayLimit == Infinity || i < this.itemDisplayLimit;
601
- }
602
- get placeholderForCurrentContext() {
603
- if (this.searchPlaceholder && this.searchable && (this._searchBarFocused || this._isClickedWithin))
604
- return this.searchPlaceholder;
605
- return this.placeholder;
466
+ return !this.multiselectable() || this.itemDisplayLimit() === Infinity || i < this.itemDisplayLimit();
606
467
  }
607
468
  //! search input event handlers
608
469
  filter(filterTerm, suppressSearchEvent = false) {
609
- this.searchTerm = filterTerm;
610
- let matching = this.itemStorage.filter(filterTerm);
470
+ this.searchTerm.set(filterTerm);
471
+ const matching = this.itemStorage.filter(filterTerm);
611
472
  if (!suppressSearchEvent)
612
473
  this.searchEvent.emit({ search: filterTerm, matching });
613
474
  this.open();
614
475
  }
615
- onSearchInputFocus(event) {
616
- this._searchBarFocused = true;
476
+ onSearchInputFocus() {
477
+ this._searchBarFocused.set(true);
617
478
  }
618
- onSearchInputBlur(event) {
619
- if (!this._searchBarFocused)
479
+ onSearchInputBlur() {
480
+ if (!this._searchBarFocused())
620
481
  return;
621
482
  this._onTouched();
622
- this._searchBarFocused = false;
483
+ this._searchBarFocused.set(false);
623
484
  }
624
485
  //! item selection handlers
625
486
  toggleItem(item) {
626
- if (item.selected) {
487
+ if (item.selected()) {
627
488
  this.unselectItem(item);
628
489
  return;
629
490
  }
630
491
  this.selectItem(item);
631
492
  }
632
493
  selectItem(...items) {
633
- let [selected, unselected, failedToSelect] = this.itemStorage.selectItem(...items);
634
- if (unselected.length > 0)
494
+ const [selected, unselected, failedToSelect] = this.itemStorage.selectItem(...items);
495
+ if (unselected.length > 0) {
635
496
  this.removeEvent.emit(unselected);
497
+ }
636
498
  if (failedToSelect.length > 0) {
637
499
  this.failedToAddEvent.emit(failedToSelect);
638
500
  }
639
501
  if (selected.length > 0) {
640
502
  this.addEvent.emit(selected);
641
- this._emitChange();
642
503
  this.focus();
643
- if (!this.keepSearchAfterSelect)
504
+ if (!this.keepSearchAfterSelect())
644
505
  this._clearSearch(true);
645
- if (!this.keepOpen || this.itemStorage.isNoItemsToSelect) {
506
+ if (!this.keepOpen() || this.itemStorage.isNoItemsToSelect()) {
646
507
  this.close();
647
508
  }
648
509
  }
510
+ if (unselected.length > 0 || selected.length > 0) {
511
+ this._emitChange();
512
+ }
649
513
  }
650
514
  unselectItem(...items) {
651
- let unselected = this.itemStorage.unselectItem(...items);
515
+ const unselected = this.itemStorage.unselectItem(...items);
652
516
  this.removeEvent.emit(unselected);
653
517
  this._emitChange();
654
- if (!this.keepSearchAfterSelect)
518
+ if (!this.keepSearchAfterSelect())
655
519
  this._clearSearch();
656
520
  this.focus();
657
- if (!this.keepOpen || this.itemStorage.isNoItemsToSelect) {
521
+ if (!this.keepOpen() || this.itemStorage.isNoItemsToSelect()) {
658
522
  this.close();
659
523
  }
660
524
  }
661
525
  _clearAllItems() {
662
- let cleared = this.itemStorage.clearAllSelected(true);
526
+ const cleared = this.itemStorage.clearAllSelected(true);
663
527
  this.focus();
664
528
  this.clearEvent.emit();
665
529
  this.removeEvent.emit(cleared);
666
530
  this._emitChange();
667
531
  }
668
532
  _clearLastItem() {
669
- let clearedValue = this.itemStorage.clearLastSelected().value;
533
+ const clearedValue = this.itemStorage.clearLastSelected().value();
670
534
  this.focus();
671
535
  this.removeEvent.emit([clearedValue]);
672
536
  this._emitChange();
673
537
  }
674
538
  //! highligh-related
675
539
  onMouseMove() {
676
- this._isMouseBeingUsed = true;
540
+ this._isMouseBeingUsed.set(true);
677
541
  }
678
542
  onGroupMouseover(group) {
679
- if (!this.multiselectable || this.noGroupActions)
543
+ if (!this.multiselectable() || this.noGroupActions())
680
544
  return;
681
545
  this.itemStorage.highlightGroup(group);
682
546
  }
@@ -684,38 +548,38 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
684
548
  event.stopPropagation();
685
549
  }
686
550
  onItemMouseEnter(option, event) {
687
- if (!this._isMouseBeingUsed)
551
+ if (!this._isMouseBeingUsed())
688
552
  return;
689
553
  this.itemStorage.highlightSingleItem(option);
690
554
  event.stopPropagation();
691
555
  }
692
556
  onItemMouseLeave(option, event) {
693
- if (!this._isMouseBeingUsed)
557
+ if (!this._isMouseBeingUsed())
694
558
  return;
695
559
  this.itemStorage.unhighlightItem(option);
696
560
  event.stopPropagation();
697
561
  }
698
562
  onItemClick(option, event) {
699
563
  event.stopPropagation();
700
- if (this.clearable)
564
+ if (this.clearable())
701
565
  this.toggleItem(option);
702
566
  else
703
567
  this.selectItem(option);
704
- this._isClickedWithin = true;
568
+ this._isClickedWithin.set(true);
705
569
  }
706
570
  onGroupClick(group) {
707
- if (!this.multiselectable || this.noGroupActions)
571
+ if (!this.multiselectable() || this.noGroupActions())
708
572
  return;
709
- if (group.children.every(o => o.selected)) {
710
- this.unselectItem(...group.children);
573
+ if (group.children().every(o => o.selected)) {
574
+ this.unselectItem(...group.children());
711
575
  return;
712
576
  }
713
- this.selectItem(...group.children);
714
- this._isClickedWithin = true;
577
+ this.selectItem(...group.children());
578
+ this._isClickedWithin.set(true);
715
579
  }
716
580
  handleClearButtonClick(event) {
717
581
  event.stopPropagation();
718
- if (this.searchTerm) {
582
+ if (this.searchTerm()) {
719
583
  this._clearSearch();
720
584
  return;
721
585
  }
@@ -723,27 +587,27 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
723
587
  }
724
588
  handleDropdownArrowClick(event) {
725
589
  event.stopPropagation();
726
- this._isClickedWithin = true;
590
+ this._isClickedWithin.set(true);
727
591
  this.toggle();
728
592
  }
729
593
  handleOutsideClick(event) {
730
- if (!this.isDropdownOpen)
594
+ if (!this.isOpen())
731
595
  return;
732
596
  const target = event.target;
733
- if (this.element.contains(target))
597
+ if (this.elementRef.nativeElement.contains(target))
734
598
  return;
735
599
  this.close();
736
600
  }
737
601
  handleAnywhereClick(event) {
738
602
  const target = event.target;
739
- if (target.tagName != 'INPUT') {
603
+ if (target.tagName !== 'INPUT') {
740
604
  event.preventDefault();
741
605
  }
742
- this._isClickedWithin = true;
743
- if (!this._searchBarFocused) {
606
+ this._isClickedWithin.set(true);
607
+ if (!this._searchBarFocused()) {
744
608
  this.focus();
745
609
  }
746
- if (this._searchable) {
610
+ if (this.searchable()) {
747
611
  this.open();
748
612
  }
749
613
  else {
@@ -751,36 +615,34 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
751
615
  }
752
616
  }
753
617
  onMouseup() {
754
- this._isClickedWithin = false;
618
+ this._isClickedWithin.set(false);
755
619
  }
756
620
  //! dropdown state handlers
757
621
  toggle() {
758
- if (this.isDropdownOpen) {
622
+ if (this.isOpen()) {
759
623
  this.close();
760
624
  return;
761
625
  }
762
626
  this.open();
763
627
  }
764
628
  open() {
765
- if (this.disabled || this.isDropdownOpen)
629
+ if (this.disabled() || this.isOpen())
766
630
  return;
767
- this.isDropdownOpen = true;
768
- if (this.autoHighlightFirst)
631
+ this.isOpen.set(true);
632
+ if (this.autoHighlightFirst())
769
633
  this.itemStorage.highlightFirstItem();
770
634
  this._createOverlay();
771
635
  this.focus();
772
636
  this.openEvent.emit();
773
- this.isDropdownOpenChange.emit(this.isDropdownOpen);
774
637
  this.detectChanges();
775
638
  }
776
639
  close() {
777
- if (!this.isDropdownOpen)
640
+ if (!this.isOpen())
778
641
  return;
779
- this.isDropdownOpen = false;
642
+ this.isOpen.set(false);
780
643
  this._destroyOverlay();
781
644
  this._onTouched();
782
645
  this.closeEvent.emit();
783
- this.isDropdownOpenChange.emit(this.isDropdownOpen);
784
646
  this._cd.markForCheck();
785
647
  }
786
648
  //! ChangeDetectorRef
@@ -794,17 +656,17 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
794
656
  this._setSearch('', suppressSearchEvent);
795
657
  }
796
658
  _setSearch(searchTerm, suppressSearchEvent = false) {
797
- this.searchTerm = searchTerm;
659
+ this.searchTerm.set(searchTerm);
798
660
  this.filter(searchTerm, suppressSearchEvent);
799
661
  }
800
662
  _setSearchInputAttributes() {
801
- const input = this.searchInput.nativeElement;
663
+ const input = this.searchInput().nativeElement;
802
664
  const attributes = {
803
665
  type: 'text',
804
666
  autocorrect: 'off',
805
667
  autocapitalize: 'off',
806
668
  autocomplete: 'off',
807
- ...this.inputAttrs,
669
+ ...this.inputAttrs(),
808
670
  };
809
671
  for (const key of Object.keys(attributes)) {
810
672
  input.setAttribute(key, attributes[key]);
@@ -844,7 +706,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
844
706
  }
845
707
  case 'KeyA': {
846
708
  if (event.ctrlKey) {
847
- this._onCtrlAPress(event);
709
+ this._onCtrlAPress();
848
710
  return;
849
711
  }
850
712
  }
@@ -854,22 +716,22 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
854
716
  event.preventDefault();
855
717
  let shouldClose = true;
856
718
  //select the currently highlighted option
857
- if (this.isDropdownOpen && this.firstHighlightedItem) {
858
- if (this.clearable && this.itemStorage.highlightedItems.every(item => item.selected)) {
859
- this.unselectItem(...this.itemStorage.highlightedItems);
719
+ if (this.isOpen() && this.firstHighlightedItem()) {
720
+ if (this.clearable() && this.itemStorage.highlightedItems().every(item => item.selected)) {
721
+ this.unselectItem(...this.itemStorage.highlightedItems());
860
722
  }
861
723
  else {
862
- this.selectItem(...this.itemStorage.highlightedItems);
724
+ this.selectItem(...this.itemStorage.highlightedItems());
863
725
  }
864
726
  }
865
727
  //add a custom option
866
- else if (this.isDropdownOpen && this.shouldShowAddCustom) {
867
- await this.addCustomOption(this.searchTerm);
728
+ else if (this.isOpen() && this.shouldShowAddCustom()) {
729
+ await this.addCustomOption(this.searchTerm());
868
730
  }
869
731
  //in case of no action, open the dropdown (or keep it open)
870
732
  else
871
733
  shouldClose = false;
872
- if (!this.keepOpen && shouldClose) {
734
+ if (!this.keepOpen() && shouldClose) {
873
735
  this.itemStorage.clearAllHighlights();
874
736
  this.close();
875
737
  }
@@ -878,7 +740,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
878
740
  }
879
741
  }
880
742
  _onSpacePress(event) {
881
- if (this.isDropdownOpen)
743
+ if (this.isOpen())
882
744
  return;
883
745
  event.preventDefault();
884
746
  this.open();
@@ -886,70 +748,72 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
886
748
  _onArrowDownPress(event) {
887
749
  event.preventDefault();
888
750
  this.open();
889
- this._isMouseBeingUsed = false;
751
+ this._isMouseBeingUsed.set(false);
890
752
  const recentlyHighlighted = this.itemStorage.highlightNextItem(+1, event.shiftKey);
891
753
  if (recentlyHighlighted) {
892
754
  this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
893
755
  }
894
- this.dropdownPanel.scrollToRecentlyHighlighted('bottom');
756
+ this.dropdownPanel()?.scrollToRecentlyHighlighted('bottom');
895
757
  }
896
758
  _onArrowUpPress(event) {
897
- if (!this.isDropdownOpen)
759
+ if (!this.isOpen())
898
760
  return;
899
761
  event.preventDefault();
900
- this._isMouseBeingUsed = false;
762
+ this._isMouseBeingUsed.set(false);
901
763
  const recentlyHighlighted = this.itemStorage.highlightNextItem(-1, event.shiftKey);
902
764
  if (recentlyHighlighted) {
903
765
  this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
904
766
  }
905
- this.dropdownPanel.scrollToRecentlyHighlighted('top');
767
+ this.dropdownPanel()?.scrollToRecentlyHighlighted('top');
906
768
  }
907
769
  _onHomePress(event) {
908
- if (!this.isDropdownOpen || (this.searchInput.nativeElement.selectionEnd != 0 && this.searchInput.nativeElement.selectionStart != 0))
770
+ if (!this.isOpen() ||
771
+ (this.searchInput()?.nativeElement.selectionEnd !== 0 && this.searchInput()?.nativeElement.selectionStart !== 0))
909
772
  return;
910
773
  event.preventDefault();
911
- this._isMouseBeingUsed = false;
774
+ this._isMouseBeingUsed.set(false);
912
775
  const recentlyHighlighted = this.itemStorage.highlightFirstItem();
913
776
  if (!recentlyHighlighted)
914
777
  return;
915
778
  this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
916
- this.dropdownPanel.scrollToRecentlyHighlighted('top');
779
+ this.dropdownPanel()?.scrollToRecentlyHighlighted('top');
917
780
  }
918
781
  _onEndPress(event) {
919
- if (!this.isDropdownOpen ||
920
- (this.searchInput.nativeElement.selectionEnd != this.searchTerm.length && this.searchInput.nativeElement.selectionStart != this.searchTerm.length))
782
+ if (!this.isOpen() ||
783
+ (this.searchInput()?.nativeElement.selectionEnd !== this.searchTerm().length &&
784
+ this.searchInput()?.nativeElement.selectionStart !== this.searchTerm().length))
921
785
  return;
922
786
  event.preventDefault();
923
- this._isMouseBeingUsed = false;
787
+ this._isMouseBeingUsed.set(false);
924
788
  const recentlyHighlighted = this.itemStorage.highlightLastItem();
925
789
  if (!recentlyHighlighted)
926
790
  return;
927
791
  this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
928
- this.dropdownPanel.scrollToRecentlyHighlighted('bottom');
792
+ this.dropdownPanel()?.scrollToRecentlyHighlighted('bottom');
929
793
  }
930
794
  _onBackspaceOrDeletePress(event) {
931
- if (this.searchTerm || !this._clearable || this.noBackspaceClear || !this.itemStorage.isAnyItemSelected)
795
+ if (this.searchTerm() || !this.clearable() || this.noBackspaceClear() || !this.itemStorage.isAnyItemSelected())
932
796
  return;
933
797
  event.preventDefault();
934
- if (this.multiselectable && this.itemStorage.selectedItems.length > 1) {
798
+ if (this.multiselectable() && this.itemStorage.selectedItems().length > 1) {
935
799
  this._clearLastItem();
936
800
  return;
937
801
  }
938
802
  this._clearAllItems();
939
803
  }
940
- _onCtrlAPress(event) {
804
+ _onCtrlAPress() {
941
805
  this.itemStorage.highlightAllItems();
942
806
  }
943
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i1.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
944
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ArdiumSelectComponent, selector: "ard-select", inputs: { valueFrom: "valueFrom", labelFrom: "labelFrom", disabledFrom: "disabledFrom", groupLabelFrom: "groupLabelFrom", groupDisabledFrom: "groupDisabledFrom", childrenFrom: "childrenFrom", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", dropdownPosition: "dropdownPosition", clearButtonTitle: "clearButtonTitle", noItemsFoundText: "noItemsFoundText", loadingPlaceholderText: "loadingPlaceholderText", searchInputId: "searchInputId", isLoading: "isLoading", inputAttrs: "inputAttrs", htmlId: "htmlId", itemsAlreadyGrouped: "itemsAlreadyGrouped", invertDisabled: "invertDisabled", noGroupActions: "noGroupActions", autoHighlightFirst: "autoHighlightFirst", autoFocus: "autoFocus", keepOpen: "keepOpen", hideSelected: "hideSelected", noBackspaceClear: "noBackspaceClear", sortMultipleValues: "sortMultipleValues", searchCaseSensitive: "searchCaseSensitive", keepSearchAfterSelect: "keepSearchAfterSelect", maxSelectedItems: "maxSelectedItems", itemDisplayLimit: "itemDisplayLimit", searchFn: "searchFn", compareWith: "compareWith", appearance: "appearance", variant: "variant", compact: "compact", dropdowonAppearance: "dropdowonAppearance", dropdowonVariant: "dropdowonVariant", groupItems: "groupItems", items: "items", multiselectable: "multiselectable", clearable: "clearable", searchable: "searchable", addCustom: "addCustom", value: "value", isDropdownOpen: ["isOpen", "isDropdownOpen"] }, outputs: { valueChange: "valueChange", changeEvent: "change", addEvent: "add", failedToAddEvent: "failedToAdd", removeEvent: "remove", clearEvent: "clear", openEvent: "open", closeEvent: "close", scrollEvent: "scroll", scrollToEndEvent: "scrollToEnd", searchEvent: "search", isDropdownOpenChange: "isOpenChange" }, host: { listeners: { "window:resize": "onWindowResize()", "mouseup": "onMouseup()", "keydown": "onKeyPress($event)" }, properties: { "class.ard-group-items": "this.groupItems", "attr.multiple": "this.multiselectable" } }, providers: [
807
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ArdiumSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
808
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: ArdiumSelectComponent, selector: "ard-select", inputs: { valueFrom: { classPropertyName: "valueFrom", publicName: "valueFrom", isSignal: true, isRequired: false, transformFunction: null }, labelFrom: { classPropertyName: "labelFrom", publicName: "labelFrom", isSignal: true, isRequired: false, transformFunction: null }, disabledFrom: { classPropertyName: "disabledFrom", publicName: "disabledFrom", isSignal: true, isRequired: false, transformFunction: null }, groupLabelFrom: { classPropertyName: "groupLabelFrom", publicName: "groupLabelFrom", isSignal: true, isRequired: false, transformFunction: null }, groupDisabledFrom: { classPropertyName: "groupDisabledFrom", publicName: "groupDisabledFrom", isSignal: true, isRequired: false, transformFunction: null }, childrenFrom: { classPropertyName: "childrenFrom", publicName: "childrenFrom", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, clearButtonTitle: { classPropertyName: "clearButtonTitle", publicName: "clearButtonTitle", isSignal: true, isRequired: false, transformFunction: null }, dropdownPosition: { classPropertyName: "dropdownPosition", publicName: "dropdownPosition", isSignal: true, isRequired: false, transformFunction: null }, noItemsFoundText: { classPropertyName: "noItemsFoundText", publicName: "noItemsFoundText", isSignal: true, isRequired: false, transformFunction: null }, loadingPlaceholderText: { classPropertyName: "loadingPlaceholderText", publicName: "loadingPlaceholderText", isSignal: true, isRequired: false, transformFunction: null }, searchInputId: { classPropertyName: "searchInputId", publicName: "searchInputId", isSignal: true, isRequired: false, transformFunction: null }, inputAttrs: { classPropertyName: "inputAttrs", publicName: "inputAttrs", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, inputProps: { classPropertyName: "inputProps", publicName: "inputProps", isSignal: true, isRequired: false, transformFunction: null }, htmlId: { classPropertyName: "htmlId", publicName: "htmlId", isSignal: true, isRequired: false, transformFunction: null }, itemsAlreadyGrouped: { classPropertyName: "itemsAlreadyGrouped", publicName: "itemsAlreadyGrouped", isSignal: true, isRequired: false, transformFunction: null }, invertDisabled: { classPropertyName: "invertDisabled", publicName: "invertDisabled", isSignal: true, isRequired: false, transformFunction: null }, noGroupActions: { classPropertyName: "noGroupActions", publicName: "noGroupActions", isSignal: true, isRequired: false, transformFunction: null }, autoHighlightFirst: { classPropertyName: "autoHighlightFirst", publicName: "autoHighlightFirst", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null }, hideSelected: { classPropertyName: "hideSelected", publicName: "hideSelected", isSignal: true, isRequired: false, transformFunction: null }, noBackspaceClear: { classPropertyName: "noBackspaceClear", publicName: "noBackspaceClear", isSignal: true, isRequired: false, transformFunction: null }, sortMultipleValues: { classPropertyName: "sortMultipleValues", publicName: "sortMultipleValues", isSignal: true, isRequired: false, transformFunction: null }, searchCaseSensitive: { classPropertyName: "searchCaseSensitive", publicName: "searchCaseSensitive", isSignal: true, isRequired: false, transformFunction: null }, keepSearchAfterSelect: { classPropertyName: "keepSearchAfterSelect", publicName: "keepSearchAfterSelect", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedItems: { classPropertyName: "maxSelectedItems", publicName: "maxSelectedItems", isSignal: true, isRequired: false, transformFunction: null }, itemDisplayLimit: { classPropertyName: "itemDisplayLimit", publicName: "itemDisplayLimit", isSignal: true, isRequired: false, transformFunction: null }, searchFn: { classPropertyName: "searchFn", publicName: "searchFn", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, dropdownAppearance: { classPropertyName: "dropdownAppearance", publicName: "dropdownAppearance", isSignal: true, isRequired: false, transformFunction: null }, dropdownVariant: { classPropertyName: "dropdownVariant", publicName: "dropdownVariant", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: false, isRequired: false, transformFunction: null }, multiselectable: { classPropertyName: "multiselectable", publicName: "multiselectable", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, addCustom: { classPropertyName: "addCustom", publicName: "addCustom", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", changeEvent: "change", addEvent: "add", failedToAddEvent: "failedToAdd", removeEvent: "remove", clearEvent: "clear", openEvent: "open", closeEvent: "close", scrollEvent: "scroll", scrollToEndEvent: "scrollToEnd", searchEvent: "search", isOpen: "isOpenChange" }, host: { listeners: { "window:resize": "onWindowResize()", "mouseup": "onMouseup()", "keydown": "onKeyPress($event)" }, properties: { "class.ard-group-items": "this._groupItemsHostAttribute" } }, providers: [
945
809
  {
946
810
  provide: NG_VALUE_ACCESSOR,
947
811
  useExisting: forwardRef(() => ArdiumSelectComponent),
948
812
  multi: true,
949
813
  },
950
- ], queries: [{ propertyName: "optionTemplate", first: true, predicate: ArdOptionTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "optgroupTemplate", first: true, predicate: ArdOptgroupTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "valueTemplate", first: true, predicate: ArdValueTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "placeholderTemplate", first: true, predicate: ArdSelectPlaceholderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "loadingSpinnerTemplate", first: true, predicate: ArdLoadingSpinnerTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "loadingPlaceholderTemplate", first: true, predicate: ArdLoadingPlaceholderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "dropdownHeaderTemplate", first: true, predicate: ArdDropdownHeaderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "dropdownFooterTemplate", first: true, predicate: ArdDropdownFooterTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "noItemsFoundTemplate", first: true, predicate: ArdNoItemsFoundTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "addCustomTemplate", first: true, predicate: ArdAddCustomTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "itemLimitReachedTemplate", first: true, predicate: ArdItemLimitReachedTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "itemDisplayLimitTemplate", first: true, predicate: ArdItemDisplayLimitTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "prefixTemplate", first: true, predicate: ArdSelectPrefixTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "suffixTemplate", first: true, predicate: ArdSelectSuffixTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "optionComponents", predicate: ArdiumOptionComponent }], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, static: true }, { propertyName: "dropdownPanel", first: true, predicate: i0.forwardRef(() => ArdiumDropdownPanelComponent), descendants: true }, { propertyName: "dropdownHost", first: true, predicate: ["dropdownHost"], descendants: true, read: ElementRef }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ard-form-field-frame\r\n [appearance]=\"appearance\"\r\n [variant]=\"variant\"\r\n [compact]=\"compact\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate\"\r\n [suffixTemplate]=\"suffixTemplate\"\r\n>\r\n <div class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected\"\r\n [ngClass]=\"ngClasses\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n <ng-container *ngIf=\"shouldDisplayPlaceholder\">\r\n <ng-template #defaultPlaceholderTemplate let-plhldr>\r\n <div class=\"ard-placeholder\">{{ plhldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldDisplayValue\">\r\n <div class=\"ard-select-value\"\r\n *ngFor=\"let item of itemStorage.selectedItems; let i = index\"\r\n [class.ard-value-disabled]=\"item.disabled\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit(i) ? true : null\"\r\n >\r\n <ng-template *ngIf=\"isValueWithinDisplayLimit(i)\"\r\n [ngTemplateOutlet]=\"valueTemplate || (multiselectable ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n ></ng-template>\r\n </div>\r\n\r\n <ng-template #defaultValueTemplate let-item>\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ng-template>\r\n <ng-template #defaultMultiValueTemplate let-item let-unselect=\"unselect\">\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ard-deletable-chip>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemStorage.isAnyItemSelected && shouldShowItemDisplayLimit\">\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n ></ng-template>\r\n\r\n <ng-template #defaultItemDisplayLimitTemplate let-count=\"overflowCount\">\r\n <div>{{count}} more...</div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-owns]=\"isDropdownOpen ? htmlId : null\"\r\n >\r\n <input #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId\"\r\n [attr.tabindex]=\"tabIndex\"\r\n [readonly]=\"isInputElementReadonly\"\r\n [disabled]=\"disabled\"\r\n [value]=\"searchTerm\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isDropdownOpen ? htmlId : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur($event)\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ard-_clear-button *ngIf=\"shouldShowClearButton\"\r\n [title]=\"clearButtonTitle\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n ></ard-_clear-button>\r\n\r\n <div class=\"ard-dropdown-arrow-wrapper\"\r\n role=\"button\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate\"\r\n [footerTemplate]=\"dropdownFooterTemplate\"\r\n [appearance]=\"dropdownAppearance\"\r\n [variant]=\"dropdownVariant\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm\"\r\n [panelId]=\"htmlId\"\r\n [compact]=\"compact\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n <ng-container *ngIf=\"!shouldShowNoItemsFound\">\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n *ngFor=\"let group of itemStorage.groups\"\r\n [class.ard-group-disabled]=\"group.disabled\"\r\n [class.ard-group-selected]=\"group.selected\"\r\n [class.ard-group-highlighted]=\"group.highlighted\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n <ng-container *ngIf=\"group.label !== '' && group.label !== undefined\">\r\n <ng-template #defaultOptgroupTemplate>\r\n <span class=\"ard-optgroup-label\" [ardInnerHTML]=\"group.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <div class=\"ard-optgroup-children\">\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n *ngFor=\"let option of group.children\"\r\n [class.ard-option-disabled]=\"option.disabled\"\r\n [class.ard-option-selected]=\"option.selected\"\r\n [class.ard-option-highlighted]=\"option.highlighted\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently\"\r\n [attr.aria-selected]=\"option.selected\"\r\n [attr.id]=\"htmlId + '-' + option.index\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template #defaultOptionTemplate>\r\n <span [ardInnerHTML]=\"option.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowNoItemsFound\">\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{noItemsFoundText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"noItemsFoundTemplate || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowAddCustom\">\r\n <ng-template #defaultAddCustomTemplate let-searchTerm>\r\n <div class=\"ard-option ard-option-highlighted ard-add-custom\" (click)=\"addCustomOption(searchTerm)\">\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{searchTerm}}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"addCustomTemplate || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{loadingPlaceholderText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingPlaceholderTemplate || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n </ard-dropdown-panel>\r\n</ng-template>", styles: ["@import\"@angular/cdk/overlay-prebuilt.css\";.ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-value[hidden]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.ArdiumFormFieldFrameComponent, selector: "ard-form-field-frame", inputs: ["isFocused", "appearance", "variant", "compact", "prefixTemplate", "suffixTemplate"] }, { kind: "component", type: i4.ArdiumDropdownPanelComponent, selector: "ard-dropdown-panel", inputs: ["panelId", "headerTemplate", "footerTemplate", "filterValue", "appearance", "variant", "compact", "isOpen"], outputs: ["scroll", "scrollToEnd"] }, { kind: "component", type: i5.ArdiumDeletableChipComponent, selector: "ard-deletable-chip", inputs: ["deleteButtonTitle", "contentAlignment", "appearance", "variant", "color", "compact", "wrapperClasses"], outputs: ["delete"] }, { kind: "directive", type: i6.ClickOutsideDirective, selector: "[ardClickOutside]", outputs: ["ardClickOutside"] }, { kind: "component", type: i7._ClearButtonComponent, selector: "ard-_clear-button" }, { kind: "directive", type: i6.ArdiumInnerHTMLDirective, selector: "[ardInnerHTML]", inputs: ["ardInnerHTML", "ardEscapeInnerHTML"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
814
+ ], queries: [{ propertyName: "optionTemplate", first: true, predicate: ArdOptionTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optgroupTemplate", first: true, predicate: ArdOptgroupTemplateDirective, descendants: true, isSignal: true }, { propertyName: "valueTemplate", first: true, predicate: ArdValueTemplateDirective, descendants: true, isSignal: true }, { propertyName: "placeholderTemplate", first: true, predicate: ArdSelectPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingSpinnerTemplate", first: true, predicate: ArdLoadingSpinnerTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingPlaceholderTemplate", first: true, predicate: ArdLoadingPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownHeaderTemplate", first: true, predicate: ArdDropdownHeaderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownFooterTemplate", first: true, predicate: ArdDropdownFooterTemplateDirective, descendants: true, isSignal: true }, { propertyName: "noItemsFoundTemplate", first: true, predicate: ArdNoItemsFoundTemplateDirective, descendants: true, isSignal: true }, { propertyName: "addCustomTemplate", first: true, predicate: ArdAddCustomTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemLimitReachedTemplate", first: true, predicate: ArdItemLimitReachedTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemDisplayLimitTemplate", first: true, predicate: ArdItemDisplayLimitTemplateDirective, descendants: true, isSignal: true }, { propertyName: "prefixTemplate", first: true, predicate: ArdSelectPrefixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "suffixTemplate", first: true, predicate: ArdSelectSuffixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optionComponents", predicate: ArdiumOptionComponent }], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "dropdownPanel", first: true, predicate: ArdiumDropdownPanelComponent, descendants: true, isSignal: true }, { propertyName: "dropdownHost", first: true, predicate: ["dropdownHost"], descendants: true, read: ElementRef }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n let-plchldr\r\n >\r\n <div class=\"ard-placeholder\">{{ plchldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumFormFieldFrameComponent, selector: "ard-form-field-frame", inputs: ["isFocused", "appearance", "variant", "compact", "prefixTemplate", "suffixTemplate"] }, { kind: "component", type: i3.ArdiumDropdownPanelComponent, selector: "ard-dropdown-panel", inputs: ["panelId", "headerTemplate", "footerTemplate", "filterValue", "appearance", "variant", "compact", "isOpen"], outputs: ["scroll", "scrollToEnd"] }, { kind: "component", type: i4.ArdiumDeletableChipComponent, selector: "ard-deletable-chip", inputs: ["deleteButtonTitle", "contentAlignment", "appearance", "variant", "color", "compact", "wrapperClasses"], outputs: ["delete"] }, { kind: "directive", type: i5.ClickOutsideDirective, selector: "[ardClickOutside]", outputs: ["ardClickOutside"] }, { kind: "component", type: i6._ClearButtonComponent, selector: "ard-clear-button" }, { kind: "directive", type: i5.ArdiumInnerHTMLDirective, selector: "[ardInnerHTML]", inputs: ["ardInnerHTML", "ardEscapeInnerHTML"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
951
815
  }
952
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumSelectComponent, decorators: [{
816
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ArdiumSelectComponent, decorators: [{
953
817
  type: Component,
954
818
  args: [{ selector: 'ard-select', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
955
819
  {
@@ -957,82 +821,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImpor
957
821
  useExisting: forwardRef(() => ArdiumSelectComponent),
958
822
  multi: true,
959
823
  },
960
- ], template: "<ard-form-field-frame\r\n [appearance]=\"appearance\"\r\n [variant]=\"variant\"\r\n [compact]=\"compact\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate\"\r\n [suffixTemplate]=\"suffixTemplate\"\r\n>\r\n <div class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected\"\r\n [ngClass]=\"ngClasses\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n <ng-container *ngIf=\"shouldDisplayPlaceholder\">\r\n <ng-template #defaultPlaceholderTemplate let-plhldr>\r\n <div class=\"ard-placeholder\">{{ plhldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldDisplayValue\">\r\n <div class=\"ard-select-value\"\r\n *ngFor=\"let item of itemStorage.selectedItems; let i = index\"\r\n [class.ard-value-disabled]=\"item.disabled\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit(i) ? true : null\"\r\n >\r\n <ng-template *ngIf=\"isValueWithinDisplayLimit(i)\"\r\n [ngTemplateOutlet]=\"valueTemplate || (multiselectable ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n ></ng-template>\r\n </div>\r\n\r\n <ng-template #defaultValueTemplate let-item>\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ng-template>\r\n <ng-template #defaultMultiValueTemplate let-item let-unselect=\"unselect\">\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ard-deletable-chip>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemStorage.isAnyItemSelected && shouldShowItemDisplayLimit\">\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n ></ng-template>\r\n\r\n <ng-template #defaultItemDisplayLimitTemplate let-count=\"overflowCount\">\r\n <div>{{count}} more...</div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-owns]=\"isDropdownOpen ? htmlId : null\"\r\n >\r\n <input #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId\"\r\n [attr.tabindex]=\"tabIndex\"\r\n [readonly]=\"isInputElementReadonly\"\r\n [disabled]=\"disabled\"\r\n [value]=\"searchTerm\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isDropdownOpen ? htmlId : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur($event)\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ard-_clear-button *ngIf=\"shouldShowClearButton\"\r\n [title]=\"clearButtonTitle\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n ></ard-_clear-button>\r\n\r\n <div class=\"ard-dropdown-arrow-wrapper\"\r\n role=\"button\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate\"\r\n [footerTemplate]=\"dropdownFooterTemplate\"\r\n [appearance]=\"dropdownAppearance\"\r\n [variant]=\"dropdownVariant\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm\"\r\n [panelId]=\"htmlId\"\r\n [compact]=\"compact\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n <ng-container *ngIf=\"!shouldShowNoItemsFound\">\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n *ngFor=\"let group of itemStorage.groups\"\r\n [class.ard-group-disabled]=\"group.disabled\"\r\n [class.ard-group-selected]=\"group.selected\"\r\n [class.ard-group-highlighted]=\"group.highlighted\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n <ng-container *ngIf=\"group.label !== '' && group.label !== undefined\">\r\n <ng-template #defaultOptgroupTemplate>\r\n <span class=\"ard-optgroup-label\" [ardInnerHTML]=\"group.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <div class=\"ard-optgroup-children\">\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n *ngFor=\"let option of group.children\"\r\n [class.ard-option-disabled]=\"option.disabled\"\r\n [class.ard-option-selected]=\"option.selected\"\r\n [class.ard-option-highlighted]=\"option.highlighted\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently\"\r\n [attr.aria-selected]=\"option.selected\"\r\n [attr.id]=\"htmlId + '-' + option.index\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template #defaultOptionTemplate>\r\n <span [ardInnerHTML]=\"option.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowNoItemsFound\">\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{noItemsFoundText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"noItemsFoundTemplate || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowAddCustom\">\r\n <ng-template #defaultAddCustomTemplate let-searchTerm>\r\n <div class=\"ard-option ard-option-highlighted ard-add-custom\" (click)=\"addCustomOption(searchTerm)\">\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{searchTerm}}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"addCustomTemplate || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{loadingPlaceholderText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingPlaceholderTemplate || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n </ard-dropdown-panel>\r\n</ng-template>", styles: ["@import\"@angular/cdk/overlay-prebuilt.css\";.ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-value[hidden]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"] }]
961
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i1.ScrollStrategyOptions }], propDecorators: { valueFrom: [{
962
- type: Input
963
- }], labelFrom: [{
964
- type: Input
965
- }], disabledFrom: [{
966
- type: Input
967
- }], groupLabelFrom: [{
968
- type: Input
969
- }], groupDisabledFrom: [{
970
- type: Input
971
- }], childrenFrom: [{
972
- type: Input
973
- }], placeholder: [{
974
- type: Input
975
- }], searchPlaceholder: [{
976
- type: Input
977
- }], dropdownPosition: [{
978
- type: Input
979
- }], clearButtonTitle: [{
980
- type: Input
981
- }], noItemsFoundText: [{
982
- type: Input
983
- }], loadingPlaceholderText: [{
984
- type: Input
985
- }], searchInputId: [{
986
- type: Input
987
- }], isLoading: [{
988
- type: Input
989
- }], inputAttrs: [{
990
- type: Input
991
- }], htmlId: [{
992
- type: Input
993
- }], itemsAlreadyGrouped: [{
994
- type: Input
995
- }], invertDisabled: [{
996
- type: Input
997
- }], noGroupActions: [{
998
- type: Input
999
- }], autoHighlightFirst: [{
1000
- type: Input
1001
- }], autoFocus: [{
1002
- type: Input
1003
- }], keepOpen: [{
1004
- type: Input
1005
- }], hideSelected: [{
1006
- type: Input
1007
- }], noBackspaceClear: [{
1008
- type: Input
1009
- }], sortMultipleValues: [{
1010
- type: Input
1011
- }], searchCaseSensitive: [{
1012
- type: Input
1013
- }], keepSearchAfterSelect: [{
1014
- type: Input
1015
- }], maxSelectedItems: [{
1016
- type: Input
1017
- }], itemDisplayLimit: [{
1018
- type: Input
1019
- }], searchFn: [{
1020
- type: Input
1021
- }], compareWith: [{
1022
- type: Input
1023
- }], appearance: [{
1024
- type: Input
1025
- }], variant: [{
1026
- type: Input
1027
- }], compact: [{
1028
- type: Input
1029
- }], dropdowonAppearance: [{
1030
- type: Input
1031
- }], dropdowonVariant: [{
1032
- type: Input
1033
- }], groupItems: [{
1034
- type: Input
1035
- }, {
824
+ ], template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n let-plchldr\r\n >\r\n <div class=\"ard-placeholder\">{{ plchldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"] }]
825
+ }], propDecorators: { _groupItemsHostAttribute: [{
1036
826
  type: HostBinding,
1037
827
  args: ['class.ard-group-items']
1038
828
  }], items: [{
@@ -1040,105 +830,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImpor
1040
830
  }], optionComponents: [{
1041
831
  type: ContentChildren,
1042
832
  args: [ArdiumOptionComponent]
1043
- }], multiselectable: [{
1044
- type: Input
1045
- }, {
1046
- type: HostBinding,
1047
- args: ['attr.multiple']
1048
- }], clearable: [{
1049
- type: Input
1050
- }], searchable: [{
1051
- type: Input
1052
- }], addCustom: [{
1053
- type: Input
1054
833
  }], value: [{
1055
834
  type: Input
1056
- }], valueChange: [{
1057
- type: Output
1058
- }], changeEvent: [{
1059
- type: Output,
1060
- args: ['change']
1061
- }], addEvent: [{
1062
- type: Output,
1063
- args: ['add']
1064
- }], failedToAddEvent: [{
1065
- type: Output,
1066
- args: ['failedToAdd']
1067
- }], removeEvent: [{
1068
- type: Output,
1069
- args: ['remove']
1070
- }], clearEvent: [{
1071
- type: Output,
1072
- args: ['clear']
1073
- }], openEvent: [{
1074
- type: Output,
1075
- args: ['open']
1076
- }], closeEvent: [{
1077
- type: Output,
1078
- args: ['close']
1079
- }], scrollEvent: [{
1080
- type: Output,
1081
- args: ['scroll']
1082
- }], scrollToEndEvent: [{
1083
- type: Output,
1084
- args: ['scrollToEnd']
1085
- }], searchEvent: [{
1086
- type: Output,
1087
- args: ['search']
1088
- }], isDropdownOpen: [{
1089
- type: Input,
1090
- args: ['isOpen']
1091
- }], isDropdownOpenChange: [{
1092
- type: Output,
1093
- args: ['isOpenChange']
1094
- }], searchInput: [{
1095
- type: ViewChild,
1096
- args: ['searchInput', { static: true }]
1097
- }], dropdownPanel: [{
1098
- type: ViewChild,
1099
- args: [forwardRef(() => ArdiumDropdownPanelComponent)]
1100
- }], optionTemplate: [{
1101
- type: ContentChild,
1102
- args: [ArdOptionTemplateDirective, { read: TemplateRef }]
1103
- }], optgroupTemplate: [{
1104
- type: ContentChild,
1105
- args: [ArdOptgroupTemplateDirective, { read: TemplateRef }]
1106
- }], valueTemplate: [{
1107
- type: ContentChild,
1108
- args: [ArdValueTemplateDirective, { read: TemplateRef }]
1109
- }], placeholderTemplate: [{
1110
- type: ContentChild,
1111
- args: [ArdSelectPlaceholderTemplateDirective, { read: TemplateRef }]
1112
- }], loadingSpinnerTemplate: [{
1113
- type: ContentChild,
1114
- args: [ArdLoadingSpinnerTemplateDirective, { read: TemplateRef }]
1115
- }], loadingPlaceholderTemplate: [{
1116
- type: ContentChild,
1117
- args: [ArdLoadingPlaceholderTemplateDirective, { read: TemplateRef }]
1118
- }], dropdownHeaderTemplate: [{
1119
- type: ContentChild,
1120
- args: [ArdDropdownHeaderTemplateDirective, { read: TemplateRef }]
1121
- }], dropdownFooterTemplate: [{
1122
- type: ContentChild,
1123
- args: [ArdDropdownFooterTemplateDirective, { read: TemplateRef }]
1124
- }], noItemsFoundTemplate: [{
1125
- type: ContentChild,
1126
- args: [ArdNoItemsFoundTemplateDirective, { read: TemplateRef }]
1127
- }], addCustomTemplate: [{
1128
- type: ContentChild,
1129
- args: [ArdAddCustomTemplateDirective, { read: TemplateRef }]
1130
- }], itemLimitReachedTemplate: [{
1131
- type: ContentChild,
1132
- args: [ArdItemLimitReachedTemplateDirective, { read: TemplateRef }]
1133
- }], itemDisplayLimitTemplate: [{
1134
- type: ContentChild,
1135
- args: [ArdItemDisplayLimitTemplateDirective, { read: TemplateRef }]
1136
- }], prefixTemplate: [{
1137
- type: ContentChild,
1138
- args: [ArdSelectPrefixTemplateDirective, { read: TemplateRef }]
1139
- }], suffixTemplate: [{
1140
- type: ContentChild,
1141
- args: [ArdSelectSuffixTemplateDirective, { read: TemplateRef }]
1142
835
  }], dropdownHost: [{
1143
836
  type: ViewChild,
1144
837
  args: ['dropdownHost', { read: ElementRef }]
@@ -1155,4 +848,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImpor
1155
848
  type: HostListener,
1156
849
  args: ['keydown', ['$event']]
1157
850
  }] } });
1158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLGFBQWEsRUFBcUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUVULGlCQUFpQixFQUNqQixVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9C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YztzQkFEYixZQUFZO3VCQUFDLGVBQWU7Z0JBdVE3QixTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUztnQkFvRXZCLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmLCBTY3JvbGxTdHJhdGVneU9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29lcmNlQXJyYXlQcm9wZXJ0eSwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0BhcmRpdW0tdWkvZGV2a2l0JztcbmltcG9ydCB7IFN1YmplY3QsIG1lcmdlLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNBbnlTdHJpbmcsIGlzQXJyYXksIGlzRnVuY3Rpb24gfSBmcm9tICdzaW1wbGUtYm9vbCc7XG5pbXBvcnQgeyBJdGVtU3RvcmFnZSB9IGZyb20gJy4uL19pbnRlcm5hbC9pdGVtLXN0b3JhZ2VzL2Ryb3Bkb3duLWl0ZW0tc3RvcmFnZSc7XG5pbXBvcnQgeyBfTmdNb2RlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvbmdtb2RlbC1jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duLXBhbmVsL2Ryb3Bkb3duLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSwgRHJvcGRvd25QYW5lbFZhcmlhbnQgfSBmcm9tICcuLi9kcm9wZG93bi1wYW5lbC9kcm9wZG93bi1wYW5lbC50eXBlcyc7XG5pbXBvcnQgeyBBcmRpdW1PcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzZWFyY2hGdW5jdGlvbnMgfSBmcm9tICcuLi9zZWFyY2gtZnVuY3Rpb25zJztcbmltcG9ydCB7IEFyZE9wdGlvbiwgQXJkT3B0aW9uR3JvdXAsIEFyZFBhbmVsUG9zaXRpb24sIENvbXBhcmVXaXRoRm4sIEdyb3VwQnlGbiwgT3B0aW9uQ29udGV4dCwgU2VhcmNoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRBcHBlYXJhbmNlIH0gZnJvbSAnLi4vdHlwZXMvdGhlbWluZy50eXBlcyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudFZhcmlhbnQgfSBmcm9tICcuLy4uL3R5cGVzL3RoZW1pbmcudHlwZXMnO1xuaW1wb3J0IHtcbiAgQXJkQWRkQ3VzdG9tVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZERyb3Bkb3duRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZERyb3Bkb3duSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTG9hZGluZ1NwaW5uZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTm9JdGVtc0ZvdW5kVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE9wdGdyb3VwVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE9wdGlvblRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRTZWxlY3RQbGFjZWhvbGRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRTZWxlY3RQcmVmaXhUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0U3VmZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUsXG59IGZyb20gJy4vc2VsZWN0LmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBBZGRDdXN0b21GbixcbiAgQ3VzdG9tT3B0aW9uQ29udGV4dCxcbiAgR3JvdXBDb250ZXh0LFxuICBJdGVtRGlzcGxheUxpbWl0Q29udGV4dCxcbiAgSXRlbUxpbWl0Q29udGV4dCxcbiAgUGxhY2Vob2xkZXJDb250ZXh0LFxuICBTZWFyY2hDb250ZXh0LFxuICBTdGF0c0NvbnRleHQsXG4gIFZhbHVlQ29udGV4dCxcbn0gZnJvbSAnLi9zZWxlY3QudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcmQtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBcmRpdW1TZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQXJkaXVtU2VsZWN0Q29tcG9uZW50XG4gIGV4dGVuZHMgX05nTW9kZWxDb21wb25lbnRCYXNlXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3JcbntcbiAgLy8hIHB1YmxpYyBjb25zdGFudHNcbiAgcmVhZG9ubHkgaXRlbVN0b3JhZ2UgPSBuZXcgSXRlbVN0b3JhZ2UodGhpcyk7XG4gIHJlYWRvbmx5IGVsZW1lbnQhOiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgREVGQVVMVFMgPSB7XG4gICAgdmFsdWVGcm9tOiAndmFsdWUnLFxuICAgIGxhYmVsRnJvbTogJ2xhYmVsJyxcbiAgICBkaXNhYmxlZEZyb206ICdkaXNhYmxlZCcsXG4gICAgZ3JvdXBMYWJlbEZyb206ICdncm91cCcsXG4gICAgZ3JvdXBEaXNhYmxlZEZyb206ICdkaXNhYmxlZCcsXG4gICAgY2hpbGRyZW5Gcm9tOiAnY2hpbGRyZW4nLFxuICAgIHNlYXJjaEZuOiBzZWFyY2hGdW5jdGlvbnMuYnlMYWJlbCxcbiAgICBjbGVhckJ1dHRvblRpdGxlOiAnQ2xlYXInLFxuICAgIG5vSXRlbXNGb3VuZFRleHQ6ICdObyBpdGVtcyBmb3VuZC4nLFxuICAgIGxvYWRpbmdQbGFjZWhvbGRlclRleHQ6ICdMb2FkaW5nLi4uJyxcbiAgfTtcblxuICAvLyEgcHJpdmF0ZXNcbiAgcHJpdmF0ZSBfaXRlbXM6IGFueVtdIHwgbnVsbCA9IFtdO1xuICBwcml2YXRlIF9pc01vdXNlQmVpbmdVc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgX3NlYXJjaEJhckZvY3VzZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vISBwdWJsaWNzXG4gIHB1YmxpYyBzZWFyY2hUZXJtOiBzdHJpbmcgPSAnJztcbiAgaXNJdGVtc0lucHV0VXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vISBiaW5kaW5nLXJlbGF0ZWQgaW5wdXRzXG4gIC8vdmFsdWUvbGFiZWwvZGlzYWJsZWQvZ3JvdXAvcHJlLWdyb3VwZWQgY2hpbGRyZW4gcGF0aHNcbiAgQElucHV0KCkgdmFsdWVGcm9tPzogc3RyaW5nO1xuICBASW5wdXQoKSBsYWJlbEZyb20/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc2FibGVkRnJvbT86IHN0cmluZztcbiAgLy8hIGdyb3VwLXJlbGF0ZWQgaW5wdXRzXG4gIEBJbnB1dCgpIGdyb3VwTGFiZWxGcm9tPzogc3RyaW5nIHwgR3JvdXBCeUZuO1xuICBASW5wdXQoKSBncm91cERpc2FibGVkRnJvbT86IHN0cmluZztcbiAgQElucHV0KCkgY2hpbGRyZW5Gcm9tPzogc3RyaW5nO1xuICAvLyEgc2V0dGluZ3NcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWxlY3QgaXRlbSc7XG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoLi4uJztcbiAgQElucHV0KCkgZHJvcGRvd25Qb3NpdGlvbjogQXJkUGFuZWxQb3NpdGlvbiA9IEFyZFBhbmVsUG9zaXRpb24uQXV0bztcbiAgQElucHV0KCkgY2xlYXJCdXR0b25UaXRsZTogc3RyaW5nID0gdGhpcy5ERUZBVUxUUy5jbGVhckJ1dHRvblRpdGxlO1xuICAvLyEgdGVtcGxhdGUtcmVsYXRlZCBzZXR0aW5nc1xuICBASW5wdXQoKSBub0l0ZW1zRm91bmRUZXh0OiBzdHJpbmcgPSB0aGlzLkRFRkFVTFRTLm5vSXRlbXNGb3VuZFRleHQ7XG4gIEBJbnB1dCgpIGxvYWRpbmdQbGFjZWhvbGRlclRleHQ6IHN0cmluZyA9IHRoaXMuREVGQVVMVFMubG9hZGluZ1BsYWNlaG9sZGVyVGV4dDtcbiAgLy8hIHNlYXJjaC1yZWxhdGVkIG9wdGlvbnNcbiAgQElucHV0KCkgc2VhcmNoSW5wdXRJZD86IHN0cmluZztcbiAgLy8hIG90aGVyIGlucHV0c1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaW5wdXRBdHRyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKSBodG1sSWQ6IHN0cmluZyA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG5cbiAgLy8hIGJvb2xlYW4gc2V0dGluZ3NcbiAgcHJpdmF0ZSBfaXRlbXNBbHJlYWR5R3JvdXBlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgaXRlbXNBbHJlYWR5R3JvdXBlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNBbHJlYWR5R3JvdXBlZDtcbiAgfVxuICBzZXQgaXRlbXNBbHJlYWR5R3JvdXBlZCh2OiBhbnkpIHtcbiAgICB0aGlzLl9pdGVtc0FscmVhZHlHcm91cGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgLy9zaG91bGQgdGhlIHZhbHVlIHRoYXQgdGhlIFwiZGlzYWJsZWRGcm9tXCIgcGF0aCBsZWFkIHRvIGJlIGludmVydGVkP1xuICAvL3VzZWZ1bCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBlLmcuIFwiYWN0aXZlXCIsIHdoaWNoIGlzIHRoZSBvcG9zaXRlIG9mIFwiZGlzYWJsZWRcIlxuICBwcml2YXRlIF9pbnZlcnREaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgaW52ZXJ0RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludmVydERpc2FibGVkO1xuICB9XG4gIHNldCBpbnZlcnREaXNhYmxlZCh2OiBhbnkpIHtcbiAgICB0aGlzLl9pbnZlcnREaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX25vR3JvdXBBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBub0dyb3VwQWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbm9Hcm91cEFjdGlvbnM7XG4gIH1cbiAgc2V0IG5vR3JvdXBBY3Rpb25zKHY6IGFueSkge1xuICAgIHRoaXMuX25vR3JvdXBBY3Rpb25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0hpZ2hsaWdodEZpcnN0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZ2V0IGF1dG9IaWdobGlnaHRGaXJzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b0hpZ2hsaWdodEZpcnN0O1xuICB9XG4gIHNldCBhdXRvSGlnaGxpZ2h0Rmlyc3QodjogYW55KSB7XG4gICAgdGhpcy5fYXV0b0hpZ2hsaWdodEZpcnN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBhdXRvRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Gb2N1cztcbiAgfVxuICBzZXQgYXV0b0ZvY3VzKHY6IGFueSkge1xuICAgIHRoaXMuX2F1dG9Gb2N1cyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX2tlZXBPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBrZWVwT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa2VlcE9wZW47XG4gIH1cbiAgc2V0IGtlZXBPcGVuKHY6IGFueSkge1xuICAgIHRoaXMuX2tlZXBPcGVuID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGlkZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBoaWRlU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZGVTZWxlY3RlZDtcbiAgfVxuICBzZXQgaGlkZVNlbGVjdGVkKHY6IGFueSkge1xuICAgIHRoaXMuX2hpZGVTZWxlY3RlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyT25CYWNrc3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IG5vQmFja3NwYWNlQ2xlYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFyT25CYWNrc3BhY2U7XG4gIH1cbiAgc2V0IG5vQmFja3NwYWNlQ2xlYXIodjogYW55KSB7XG4gICAgdGhpcy5fY2xlYXJPbkJhY2tzcGFjZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NvcnRNdWx0aXBsZVZhbHVlczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgc29ydE11bHRpcGxlVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0TXVsdGlwbGVWYWx1ZXM7XG4gIH1cbiAgc2V0IHNvcnRNdWx0aXBsZVZhbHVlcyh2OiBhbnkpIHtcbiAgICB0aGlzLl9zb3J0TXVsdGlwbGVWYWx1ZXMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gIH1cblxuICBwcml2YXRlIF9zZWFyY2hDYXNlU2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBzZWFyY2hDYXNlU2Vuc2l0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hDYXNlU2Vuc2l0aXZlO1xuICB9XG4gIHNldCBzZWFyY2hDYXNlU2Vuc2l0aXZlKHY6IGFueSkge1xuICAgIHRoaXMuX3NlYXJjaENhc2VTZW5zaXRpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gIH1cblxuICBwcml2YXRlIF9rZWVwU2VhcmNoQWZ0ZXJTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IGtlZXBTZWFyY2hBZnRlclNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa2VlcFNlYXJjaEFmdGVyU2VsZWN0O1xuICB9XG4gIHNldCBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QodjogYW55KSB7XG4gICAgdGhpcy5fa2VlcFNlYXJjaEFmdGVyU2VsZWN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgLy8hIG51bWJlciBpbnB1dHNcbiAgcHJpdmF0ZSBfbWF4U2VsZWN0ZWRJdGVtczogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBnZXQgbWF4U2VsZWN0ZWRJdGVtcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYXhTZWxlY3RlZEl0ZW1zO1xuICB9XG4gIHNldCBtYXhTZWxlY3RlZEl0ZW1zKHY6IGFueSkge1xuICAgIHRoaXMuX21heFNlbGVjdGVkSXRlbXMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXRlbURpc3BsYXlMaW1pdDogbnVtYmVyID0gSW5maW5pdHk7XG4gIEBJbnB1dCgpXG4gIGdldCBpdGVtRGlzcGxheUxpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1EaXNwbGF5TGltaXQ7XG4gIH1cbiAgc2V0IGl0ZW1EaXNwbGF5TGltaXQodjogYW55KSB7XG4gICAgdGhpcy5faXRlbURpc3BsYXlMaW1pdCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIEluZmluaXR5KTtcbiAgfVxuXG4gIC8vISBmdW5jdGlvbiBpbnB1dHNcbiAgcHJpdmF0ZSBfc2VhcmNoRm46IFNlYXJjaEZuID0gdGhpcy5ERUZBVUxUUy5zZWFyY2hGbjtcbiAgQElucHV0KClcbiAgZ2V0IHNlYXJjaEZuKCk6IFNlYXJjaEZuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoRm47XG4gIH1cbiAgc2V0IHNlYXJjaEZuKGZuOiBTZWFyY2hGbikge1xuICAgIGlmIChmbiAhPT0gdW5kZWZpbmVkICYmIGZuICE9PSBudWxsICYmICFpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ2BzZWFyY2hGbmAgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cbiAgICB0aGlzLl9zZWFyY2hGbiA9IGZuO1xuICB9XG4gIHByaXZhdGUgX2NvbXBhcmVXaXRoPzogQ29tcGFyZVdpdGhGbjtcbiAgQElucHV0KClcbiAgZ2V0IGNvbXBhcmVXaXRoKCk6IENvbXBhcmVXaXRoRm4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb21wYXJlV2l0aDtcbiAgfVxuICBzZXQgY29tcGFyZVdpdGgoZm46IENvbXBhcmVXaXRoRm4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoZm4gIT09IHVuZGVmaW5lZCAmJiBmbiAhPT0gbnVsbCAmJiAhaXNGdW5jdGlvbihmbikpIHtcbiAgICAgIHRocm93IEVycm9yKCdgY29tcGFyZVdpdGhgIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG4gICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjtcbiAgfVxuXG4gIC8vISBhcHBlYXJhbmNlXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IEZvcm1FbGVtZW50QXBwZWFyYW5jZSA9IEZvcm1FbGVtZW50QXBwZWFyYW5jZS5PdXRsaW5lZDtcbiAgQElucHV0KCkgdmFyaWFudDogRm9ybUVsZW1lbnRWYXJpYW50ID0gRm9ybUVsZW1lbnRWYXJpYW50LlJvdW5kZWQ7XG5cbiAgcHJpdmF0ZSBfY29tcGFjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgY29tcGFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGFjdDtcbiAgfVxuICBzZXQgY29tcGFjdCh2OiBhbnkpIHtcbiAgICB0aGlzLl9jb21wYWN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgZ2V0IG5nQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAvL2FwcGVhcmFuY2UsIHZhcmlhbnQgaGFuZGxlZCBpbiBhcmQtZm9ybS1maWVsZC1mcmFtZSBjb21wb25lbnRcbiAgICAgIHRoaXMuY29tcGFjdCA/ICdhcmQtY29tcGFjdCcgOiAnJyxcbiAgICAgIHRoaXMubXVsdGlzZWxlY3RhYmxlID8gJ2FyZC1tdWx0aXNlbGVjdCcgOiAnYXJkLXNpbmdsZXNlbGVjdCcsXG4gICAgICB0aGlzLmNsZWFyYWJsZSA/ICdhcmQtY2xlYXJhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5zZWFyY2hhYmxlID8gJ2FyZC1zZWFyY2hhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5maWx0ZXJlZCA/ICdhcmQtZmlsdGVyZWQnIDogJycsXG4gICAgICB0aGlzLnRvdWNoZWQgPyAnYXJkLXRvdWNoZWQnIDogJycsXG4gICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID8gJ2FyZC1kcm9wZG93bi1vcGVuJyA6ICcnLFxuICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCA/ICdhcmQtc2VsZWN0LWZvY3VzZWQnIDogJycsXG4gICAgICB0aGlzLl9zZWFyY2hCYXJGb2N1c2VkID8gJ2FyZC1zZWxlY3QtZm9jdXNlZCcgOiAnJyxcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Ryb3Bkb3duQXBwZWFyYW5jZT86IERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBzZXQgZHJvcGRvd29uQXBwZWFyYW5jZSh2OiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSkge1xuICAgIHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZSA9IHY7XG4gIH1cbiAgZ2V0IGRyb3Bkb3duQXBwZWFyYW5jZSgpOiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSB7XG4gICAgaWYgKHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZSkgcmV0dXJuIHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZTtcbiAgICBpZiAodGhpcy5hcHBlYXJhbmNlID09IEZvcm1FbGVtZW50QXBwZWFyYW5jZS5PdXRsaW5lZCkgcmV0dXJuIERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlLk91dGxpbmVkO1xuICAgIHJldHVybiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZS5SYWlzZWQ7XG4gIH1cbiAgcHJpdmF0ZSBfZHJvcGRvd25WYXJpYW50PzogRHJvcGRvd25QYW5lbFZhcmlhbnQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHNldCBkcm9wZG93b25WYXJpYW50KHY6IERyb3Bkb3duUGFuZWxWYXJpYW50KSB7XG4gICAgdGhpcy5fZHJvcGRvd25WYXJpYW50ID0gdjtcbiAgfVxuICBnZXQgZHJvcGRvd25WYXJpYW50KCk6IERyb3Bkb3duUGFuZWxWYXJpYW50IHtcbiAgICBpZiAodGhpcy5fZHJvcGRvd25WYXJpYW50KSByZXR1cm4gdGhpcy5fZHJvcGRvd25WYXJpYW50O1xuICAgIGlmICh0aGlzLnZhcmlhbnQgPT0gRm9ybUVsZW1lbnRWYXJpYW50LlBpbGwpIHJldHVybiBEcm9wZG93blBhbmVsVmFyaWFudC5Sb3VuZGVkO1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQ7XG4gIH1cblxuICAvLyEgY2xhc3MtYmFzZWQgaW5wdXRzXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWdyb3VwLWl0ZW1zJykgZ3JvdXBJdGVtczogYm9vbGVhbiA9IGZhbHNlOyAvL2RlZmF1bHQgdmFsdWUgbWF5IGJlIGNoYW5nZWQgdG8gXCJ0cnVlXCIgaW4gbmdPbkNoYW5nZXMgaWYgdGhpcy5ncm91cEJ5IGlzIGRlZmluZWQgb3IgdGhpcy5pdGVtc0FscmVhZHlHcm91cGVkIGlzIHNldCB0byBcInRydWVcIlxuXG4gIC8vISBpdGVtcyBzZXR0ZXIvZ2V0dGVyXG4gIEBJbnB1dCgpXG4gIGdldCBpdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cbiAgc2V0IGl0ZW1zKHZhbHVlOiBzdHJpbmcgfCBhbnlbXSB8IG51bGwpIHtcbiAgICB0aGlzLmlzSXRlbXNJbnB1dFVzZWQgPSB0cnVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSBbXTtcbiAgICAgIHRoaXMuaXNJdGVtc0lucHV0VXNlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaXNBbnlTdHJpbmcodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IGNvZXJjZUFycmF5UHJvcGVydHkodmFsdWUpO1xuICAgIH1cbiAgICBsZXQgcHJpbnRFcnJvcnMgPSB0aGlzLml0ZW1TdG9yYWdlLnNldEl0ZW1zKHZhbHVlKTtcbiAgICBpZiAocHJpbnRFcnJvcnMpIHtcbiAgICAgIHRoaXMuX3ByaW50UHJpbWl0aXZlV2FybmluZ3MoKTtcbiAgICB9XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKEFyZGl1bU9wdGlvbkNvbXBvbmVudClcbiAgb3B0aW9uQ29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+O1xuXG4gIHByaXZhdGUgX3NldEl0ZW1zRnJvbUNvbXBvbmVudHMoKSB7XG4gICAgY29uc3QgaGFuZGxlT3B0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZE9yRGVzdHJveWVkID0gbWVyZ2UodGhpcy5vcHRpb25Db21wb25lbnRzLmNoYW5nZXMsIHRoaXMuX2Rlc3Ryb3kkKTtcbiAgICAgIG1lcmdlKC4uLnRoaXMub3B0aW9uQ29tcG9uZW50cy5tYXAob3B0aW9uID0+IG9wdGlvbi5zdGF0ZUNoYW5nZSQpKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwoY2hhbmdlZE9yRGVzdHJveWVkKSlcbiAgICAgICAgLnN1YnNjcmliZShvcHRpb24gPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbVN0b3JhZ2UuZmluZEl0ZW1CeVZhbHVlKG9wdGlvbi5vbGRWYWx1ZSA/PyBvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlZCA9IG9wdGlvbi5kaXNhYmxlZDtcbiAgICAgICAgICAgICAgaXRlbS5sYWJlbCA9IG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsO1xuICAgICAgICAgICAgICBpdGVtLnZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLmRpc2FibGVkID0gb3B0aW9uLmRpc2FibGVkO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLmxhYmVsID0gb3B0aW9uLmxhYmVsIHx8IGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICAgIGl0ZW0uaXRlbURhdGEudmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbkNvbXBvbmVudHMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLm9wdGlvbkNvbXBvbmVudHMpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKG9wdGlvbnM6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIGxhYmVsOiBvcHRpb24ubGFiZWwsXG4gICAgICAgICAgZGlzYWJsZWQ6IG9wdGlvbi5kaXNhYmxlZCxcbiAgICAgICAgfSkpO1xuICAgICAgICBoYW5kbGVPcHRpb25DaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vISBhdHRyaWJ1dGUgYW5kL29yIGNsYXNzIHNldHRlcnMvZ2V0dGVyc1xuICBwcml2YXRlIF9tdWx0aXNlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLm11bHRpcGxlJylcbiAgZ2V0IG11bHRpc2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlzZWxlY3RhYmxlO1xuICB9XG4gIHNldCBtdWx0aXNlbGVjdGFibGUodjogYW55KSB7XG4gICAgdGhpcy5fbXVsdGlzZWxlY3RhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG4gIGdldCBzaW5nbGVzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fbXVsdGlzZWxlY3RhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZ2V0IGNsZWFyYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2xlYXJhYmxlO1xuICB9XG4gIHNldCBjbGVhcmFibGUodjogYW55KSB7XG4gICAgdGhpcy5fY2xlYXJhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VhcmNoYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgc2VhcmNoYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoYWJsZTtcbiAgfVxuICBzZXQgc2VhcmNoYWJsZSh2OiBhbnkpIHtcbiAgICB0aGlzLl9zZWFyY2hhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgZ2V0IGZpbHRlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hhYmxlICYmIHRoaXMuc2VhcmNoVGVybSAhPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdWNoZWQ7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgdG91Y2hlZChzdGF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3RvdWNoZWQgPSBzdGF0ZTtcbiAgfVxuXG4gIC8vISBjdXN0b20gb3B0aW9uc1xuICBwcml2YXRlIF9kZWZhdWx0QWRkQ3VzdG9tRm46IEFkZEN1c3RvbUZuPGFueT4gPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWU7XG4gIHByaXZhdGUgX2FkZEN1c3RvbTogZmFsc2UgfCBBZGRDdXN0b21Gbjxhbnk+IHwgQWRkQ3VzdG9tRm48UHJvbWlzZTxhbnk+PiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgYWRkQ3VzdG9tKCk6IGZhbHNlIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4ge1xuICAgIHJldHVybiB0aGlzLl9hZGRDdXN0b207XG4gIH1cbiAgc2V0IGFkZEN1c3RvbSh2OiBzdHJpbmcgfCBib29sZWFuIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4pIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2KSkge1xuICAgICAgdGhpcy5fYWRkQ3VzdG9tID0gdjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9jb2VyY2UgdGhlIHZhbHVlIGludG8gYSBib29sZWFuXG4gICAgLy9pZiBcInRydWVcIiwgdXNlIHRoZSBkZWZhdWx0IGZ1bmN0aW9uLiBPdGhlcndpc2UsIGp1c3Qgc2V0IHRvIFwiZmFsc2VcIi5cbiAgICB0aGlzLl9hZGRDdXN0b20gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgJiYgdGhpcy5fZGVmYXVsdEFkZEN1c3RvbUZuO1xuICB9XG5cbiAgZ2V0IHNob3VsZFNob3dBZGRDdXN0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ3VzdG9tICE9IGZhbHNlICYmIHRoaXMuc2VhcmNoVGVybS5sZW5ndGggPiAwICYmIHRoaXMuaXRlbVN0b3JhZ2UuaXNOb0l0ZW1zRm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRDdXN0b21PcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5hZGRDdXN0b20pIHJldHVybjtcblxuICAgIGNvbnN0IG5ld09wdGlvbk9iaiA9IGF3YWl0IHRoaXMuaXRlbVN0b3JhZ2UuYWRkQ3VzdG9tT3B0aW9uKHZhbHVlLCB0aGlzLmFkZEN1c3RvbSk7XG5cbiAgICB0aGlzLnNlbGVjdEl0ZW0obmV3T3B0aW9uT2JqKTtcbiAgfVxuXG4gIC8vISBjb250cm9sIHZhbHVlIGFjY2Vzc29yXG4gIC8vb3ZlcnJpZGUgdGhlIHdyaXRlVmFsdWUgYW5kIHNldERpc2FibGVkU3RhdGUgZGVmaW5lZCBpbiBfTmdNb2RlbENvbXBvbmVudFxuICBvdmVycmlkZSBzZXREaXNhYmxlZFN0YXRlKHN0YXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBzdGF0ZTtcbiAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICB3cml0ZVZhbHVlKG5nTW9kZWw6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oYW5kbGVXcml0ZVZhbHVlKG5nTW9kZWwpO1xuICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIC8vKiBjaGFuZ2UgJiB0b3VjaCBldmVudCBlbWl0dGVyc1xuICBwcm90ZWN0ZWQgX2VtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5pdGVtU3RvcmFnZS52YWx1ZTtcbiAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX29uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuX29uVG91Y2hlZFJlZ2lzdGVyZWQ/LigpO1xuICB9XG5cbiAgLy8hIHZhbHVlIGlucHV0ICYgb3V0cHV0XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgLy9pZiBpcyBhIHN0cmluZywgY29lcmNlIGl0IGludG8gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIGlmIChpc0FueVN0cmluZyhuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eShuZXdWYWx1ZSk7XG4gICAgLy9pZiBpdCBpcyBub3QgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSwganVzdCBwdXQgaXQgaW4gYW4gYXJyYXlcbiAgICBlbHNlIGlmICghaXNBcnJheShuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gW25ld1ZhbHVlXTtcblxuICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtU3RvcmFnZS52YWx1ZTtcbiAgfVxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8vISBvdXRwdXQgZXZlbnRzXG4gIEBPdXRwdXQoJ2NoYW5nZScpIGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgQE91dHB1dCgnYWRkJykgYWRkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCdmYWlsZWRUb0FkZCcpIGZhaWxlZFRvQWRkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCdyZW1vdmUnKSByZW1vdmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoJ2NsZWFyJykgY2xlYXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgQE91dHB1dCgnb3BlbicpIG9wZW5FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgQE91dHB1dCgnY2xvc2UnKSBjbG9zZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBAT3V0cHV0KCdzY3JvbGwnKSBzY3JvbGxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG4gIH0+KCk7XG4gIEBPdXRwdXQoJ3Njcm9sbFRvRW5kJykgc2Nyb2xsVG9FbmRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgnc2VhcmNoJykgc2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBtYXRjaGluZzogYW55W107XG4gIH0+KCk7XG5cbiAgQElucHV0KCdpc09wZW4nKVxuICBpc0Ryb3Bkb3duT3BlbiE6IGJvb2xlYW47XG4gIEBPdXRwdXQoJ2lzT3BlbkNoYW5nZScpIGlzRHJvcGRvd25PcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8vISB2aWV3IGNoaWxkcmVuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKGZvcndhcmRSZWYoKCkgPT4gQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCkpXG4gIGRyb3Bkb3duUGFuZWwhOiBBcmRpdW1Ecm9wZG93blBhbmVsQ29tcG9uZW50O1xuXG4gIC8vISB0ZW1wbGF0ZXNcbiAgQENvbnRlbnRDaGlsZChBcmRPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBvcHRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkT3B0Z3JvdXBUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBvcHRncm91cFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmRWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHZhbHVlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcGxhY2Vob2xkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkTG9hZGluZ1NwaW5uZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBsb2FkaW5nU3Bpbm5lclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBsb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkRHJvcGRvd25IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBkcm9wZG93bkhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmREcm9wZG93bkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duRm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIG5vSXRlbXNGb3VuZFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChBcmRBZGRDdXN0b21UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBhZGRDdXN0b21UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkSXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZChBcmRTZWxlY3RQcmVmaXhUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwcmVmaXhUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQXJkU2VsZWN0U3VmZml4VGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgc3VmZml4VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vISBjb250ZXh0IHByb3ZpZGVyc1xuICBnZXRWYWx1ZUNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogVmFsdWVDb250ZXh0IHtcbiAgICBjb25zdCAkdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogaXRlbSxcbiAgICAgIGl0ZW0sXG4gICAgICBpdGVtRGF0YTogaXRlbS5pdGVtRGF0YSxcbiAgICAgIHVuc2VsZWN0KCkge1xuICAgICAgICAkdGhpcy51bnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0U3RhdHNDb250ZXh0KCk6IFN0YXRzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIGZvdW5kSXRlbXM6IHRoaXMuZm91bmRJdGVtcyxcbiAgICB9O1xuICB9XG4gIGdldFNlYXJjaENvbnRleHQoKTogU2VhcmNoQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbEl0ZW1zLFxuICAgICAgZm91bmRJdGVtczogdGhpcy5mb3VuZEl0ZW1zLFxuICAgIH07XG4gIH1cbiAgZ2V0UGxhY2Vob2xkZXJDb250ZXh0KCk6IFBsYWNlaG9sZGVyQ29udGV4dCB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgJGltcGxpY2l0OiBwbGFjZWhvbGRlcixcbiAgICB9O1xuICB9XG4gIGdldEN1c3RvbU9wdGlvbkNvbnRleHQoKTogQ3VzdG9tT3B0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtLFxuICAgIH07XG4gIH1cbiAgZ2V0R3JvdXBDb250ZXh0KGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEdyb3VwQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogZ3JvdXAsXG4gICAgICBncm91cCxcbiAgICAgIHNlbGVjdGVkQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuLmZpbHRlcih2ID0+IHYuc2VsZWN0ZWQpLmxlbmd0aCxcbiAgICAgIHRvdGFsQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuLmxlbmd0aCxcbiAgICB9O1xuICB9XG4gIGdldE9wdGlvbkNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogT3B0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogaXRlbSxcbiAgICAgIGl0ZW0sXG4gICAgICBpdGVtRGF0YTogaXRlbS5pdGVtRGF0YSxcbiAgICB9O1xuICB9XG4gIGdldEl0ZW1MaW1pdENvbnRleHQoKTogSXRlbUxpbWl0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIHNlbGVjdGVkSXRlbXM6IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGgsXG4gICAgICBpdGVtTGltaXQ6IHRoaXMubWF4U2VsZWN0ZWRJdGVtcyxcbiAgICB9O1xuICB9XG4gIGdldEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0KCk6IEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0IHtcbiAgICBsZXQgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGg7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIHNlbGVjdGVkSXRlbXMsXG4gICAgICBpdGVtTGltaXQ6IHRoaXMubWF4U2VsZWN0ZWRJdGVtcyxcbiAgICAgIG92ZXJmbG93Q291bnQ6IHNlbGVjdGVkSXRlbXMgLSAodGhpcy5pdGVtRGlzcGxheUxpbWl0ID8/IDApLFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBzY3JvbGxTdHJhdGVneU9wdHM6IFNjcm9sbFN0cmF0ZWd5T3B0aW9uc1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWxlbWVudCA9IF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvLyEgZHJvcGRvd24gb3ZlcmxheVxuICBAVmlld0NoaWxkKCdkcm9wZG93bkhvc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZHJvcGRvd25Ib3N0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgZHJvcGRvd25PdmVybGF5PzogT3ZlcmxheVJlZjtcblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5kcm9wZG93bkhvc3QpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5T3B0cy5ibG9jaygpLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kcm9wZG93blRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIHRoaXMuZHJvcGRvd25PdmVybGF5LmF0dGFjaChwb3J0YWwpO1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuICBwcml2YXRlIF9kZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25PdmVybGF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgZGVsZXRlIHRoaXMuZHJvcGRvd25PdmVybGF5O1xuICB9XG5cbiAgc2V0T3ZlcmxheVNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duT3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcGRvd25Ib3N0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkudXBkYXRlU2l6ZSh7IHdpZHRoOiByZWN0LndpZHRoIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuXG4gIC8vISBob29rc1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNJdGVtc0lucHV0VXNlZCkge1xuICAgICAgdGhpcy5fc2V0SXRlbXNGcm9tQ29tcG9uZW50cygpO1xuICAgIH1cbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy9maXJlIGl0ZW1zIGxvYWQgaGFuZGxlciB3aGVuIGxvYWRpbmcgaXMgc2V0IHRvIGZhbHNlXG4gICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmcnXSkge1xuICAgICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmcnXS5jdXJyZW50VmFsdWUgPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fb25JdGVtc0xvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9zZXQgZ3JvdXBJdGVtcyB0byB0cnVlIGJ5IGRlZmF1bHQgaWYgZ3JvdXBMYWJlbEZyb20gb3IgaXRlbXNBbHJlYWR5R3JvdXBlZCBpcyBzZXQgdG8gdHJ1ZSBhcyB0aGUgZmlyc3QgY2hhbmdlXG4gICAgaWYgKChjaGFuZ2VzWydncm91cExhYmVsRnJvbSddPy5maXJzdENoYW5nZSB8fCBjaGFuZ2VzWydpdGVtc0FscmVhZHlHcm91cGVkJ10/LmZpcnN0Q2hhbmdlKSAmJiAhY2hhbmdlc1snZ3JvdXBJdGVtcyddKSB7XG4gICAgICB0aGlzLmdyb3VwSXRlbXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9vbkl0ZW1zTG9hZCgpIHtcbiAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQpIHJldHVybjtcbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuICBwcml2YXRlIF9wcmludFByaW1pdGl2ZVdhcm5pbmdzKCkge1xuICAgIGZ1bmN0aW9uIG1ha2VXYXJuaW5nKHN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXNpbmcgWyR7c3RyfV0gcHJvcGVydHkgYm91bmQgdG8gPGFyZC1zZWxlY3Q+LCBhcyBzb21lIHByb3ZpZGVkIGl0ZW1zIGFyZSBvZiBwcmltaXRpdmUgdHlwZWApO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZUZyb20pIHtcbiAgICAgIG1ha2VXYXJuaW5nKCd2YWx1ZUZyb20nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFiZWxGcm9tKSB7XG4gICAgICBtYWtlV2FybmluZygnbGFiZWxGcm9tJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc2FibGVkRnJvbSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2Rpc2FibGVkRnJvbScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncm91cExhYmVsRnJvbSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2dyb3VwTGFiZWxGcm9tJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdyb3VwRGlzYWJsZWRGcm9tKSB7XG4gICAgICBtYWtlV2FybmluZygnZ3JvdXBEaXNhYmxlZEZyb20nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hpbGRyZW5Gcm9tKSB7XG4gICAgICBtYWtlV2FybmluZygnY2hpbGRyZW5Gcm9tJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmludmVydERpc2FibGVkKSB7XG4gICAgICBtYWtlV2FybmluZygnaW52ZXJ0RGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICAvLyEgZ2V0dGVyc1xuICBnZXQgZmlyc3RIaWdobGlnaHRlZEl0ZW0oKTogQXJkT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zPy5maXJzdCgpO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5UGxhY2Vob2xkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkICYmICF0aGlzLnNlYXJjaFRlcm07XG4gIH1cbiAgZ2V0IHNob3VsZERpc3BsYXlWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCAmJiAoIXRoaXMuc2VhcmNoVGVybSB8fCB0aGlzLm11bHRpc2VsZWN0YWJsZSk7XG4gIH1cbiAgZ2V0IHNob3VsZFNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2xlYXJhYmxlICYmICF0aGlzLl9kaXNhYmxlZCAmJiAodGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCB8fCB0aGlzLnNlYXJjaFRlcm0gIT0gJycpO1xuICB9XG4gIGdldCBpdGVtc1RvRGlzcGxheSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEFyZE9wdGlvbkdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuZ3JvdXBzLnZhbHVlcygpO1xuICB9XG4gIGdldCBzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc0ZvdW5kICYmICF0aGlzLmlzTG9hZGluZyAmJiAhdGhpcy5zaG91bGRTaG93QWRkQ3VzdG9tO1xuICB9XG4gIGdldCB0b3RhbEl0ZW1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuaXRlbXMubGVuZ3RoO1xuICB9XG4gIGdldCBmb3VuZEl0ZW1zKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaGFibGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuZmlsdGVyZWRJdGVtcy5sZW5ndGg7XG4gIH1cbiAgZ2V0IHNob3VsZFNob3dJdGVtRGlzcGxheUxpbWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm11bHRpc2VsZWN0YWJsZSAmJiB0aGlzLml0ZW1EaXNwbGF5TGltaXQgIT0gSW5maW5pdHkgJiYgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IHRoaXMuaXRlbURpc3BsYXlMaW1pdDtcbiAgfVxuICBnZXQgaXNJbnB1dEVsZW1lbnRSZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuYWRkQ3VzdG9tICYmICghdGhpcy5zZWFyY2hhYmxlIHx8IHRoaXMuaXRlbVN0b3JhZ2UuaXNJdGVtTGltaXRSZWFjaGVkKTtcbiAgfVxuICBpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tdWx0aXNlbGVjdGFibGUgfHwgdGhpcy5pdGVtRGlzcGxheUxpbWl0ID09IEluZmluaXR5IHx8IGkgPCB0aGlzLml0ZW1EaXNwbGF5TGltaXQ7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zZWFyY2hQbGFjZWhvbGRlciAmJiB0aGlzLnNlYXJjaGFibGUgJiYgKHRoaXMuX3NlYXJjaEJhckZvY3VzZWQgfHwgdGhpcy5faXNDbGlja2VkV2l0aGluKSkgcmV0dXJuIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXI7XG4gICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXI7XG4gIH1cblxuICAvLyEgc2VhcmNoIGlucHV0IGV2ZW50IGhhbmRsZXJzXG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcsIHN1cHByZXNzU2VhcmNoRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybSA9IGZpbHRlclRlcm07XG4gICAgbGV0IG1hdGNoaW5nID0gdGhpcy5pdGVtU3RvcmFnZS5maWx0ZXIoZmlsdGVyVGVybSk7XG4gICAgaWYgKCFzdXBwcmVzc1NlYXJjaEV2ZW50KSB0aGlzLnNlYXJjaEV2ZW50LmVtaXQoeyBzZWFyY2g6IGZpbHRlclRlcm0sIG1hdGNoaW5nIH0pO1xuICAgIHRoaXMub3BlbigpO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRGb2N1cyhldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQgPSB0cnVlO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRCbHVyKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKSByZXR1cm47XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcblxuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuICAvLyEgaXRlbSBzZWxlY3Rpb24gaGFuZGxlcnNcbiAgdG9nZ2xlSXRlbShpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5zZWxlY3RlZCkge1xuICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtKTtcbiAgfVxuICBzZWxlY3RJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IHZvaWQge1xuICAgIGxldCBbc2VsZWN0ZWQsIHVuc2VsZWN0ZWQsIGZhaWxlZFRvU2VsZWN0XSA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0SXRlbSguLi5pdGVtcyk7XG5cbiAgICBpZiAodW5zZWxlY3RlZC5sZW5ndGggPiAwKSB0aGlzLnJlbW92ZUV2ZW50LmVtaXQodW5zZWxlY3RlZCk7XG5cbiAgICBpZiAoZmFpbGVkVG9TZWxlY3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mYWlsZWRUb0FkZEV2ZW50LmVtaXQoZmFpbGVkVG9TZWxlY3QpO1xuICAgIH1cblxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50LmVtaXQoc2VsZWN0ZWQpO1xuICAgICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuXG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICBpZiAoIXRoaXMua2VlcFNlYXJjaEFmdGVyU2VsZWN0KSB0aGlzLl9jbGVhclNlYXJjaCh0cnVlKTtcblxuICAgICAgaWYgKCF0aGlzLmtlZXBPcGVuIHx8IHRoaXMuaXRlbVN0b3JhZ2UuaXNOb0l0ZW1zVG9TZWxlY3QpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1bnNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XG4gICAgbGV0IHVuc2VsZWN0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLnVuc2VsZWN0SXRlbSguLi5pdGVtcyk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQodW5zZWxlY3RlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICAgIGlmICghdGhpcy5rZWVwU2VhcmNoQWZ0ZXJTZWxlY3QpIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICBpZiAoIXRoaXMua2VlcE9wZW4gfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9jbGVhckFsbEl0ZW1zKCk6IHZvaWQge1xuICAgIGxldCBjbGVhcmVkID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbFNlbGVjdGVkKHRydWUpO1xuXG4gICAgdGhpcy5mb2N1cygpO1xuXG4gICAgdGhpcy5jbGVhckV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoY2xlYXJlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIHByaXZhdGUgX2NsZWFyTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgbGV0IGNsZWFyZWRWYWx1ZSA9IHRoaXMuaXRlbVN0b3JhZ2UuY2xlYXJMYXN0U2VsZWN0ZWQoKS52YWx1ZTtcblxuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMucmVtb3ZlRXZlbnQuZW1pdChbY2xlYXJlZFZhbHVlXSk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIC8vISBoaWdobGlnaC1yZWxhdGVkXG4gIG9uTW91c2VNb3ZlKCkge1xuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQgPSB0cnVlO1xuICB9XG4gIG9uR3JvdXBNb3VzZW92ZXIoZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKSByZXR1cm47XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRHcm91cChncm91cCk7XG4gIH1cbiAgb25JdGVtTW91c2VPdmVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgb25JdGVtTW91c2VFbnRlcihvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzTW91c2VCZWluZ1VzZWQpIHJldHVybjtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodFNpbmdsZUl0ZW0ob3B0aW9uKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZUxlYXZlKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UudW5oaWdobGlnaHRJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgLy8hIGNsaWNrIGhhbmRsZXJzXG4gIHByaXZhdGUgX2lzQ2xpY2tlZFdpdGhpbjogYm9vbGVhbiA9IGZhbHNlO1xuICBvbkl0ZW1DbGljayhvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jbGVhcmFibGUpIHRoaXMudG9nZ2xlSXRlbShvcHRpb24pO1xuICAgIGVsc2UgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbik7XG5cbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4gPSB0cnVlO1xuICB9XG4gIG9uR3JvdXBDbGljayhncm91cDogQXJkT3B0aW9uR3JvdXApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlzZWxlY3RhYmxlIHx8IHRoaXMubm9Hcm91cEFjdGlvbnMpIHJldHVybjtcbiAgICBpZiAoZ3JvdXAuY2hpbGRyZW4uZXZlcnkobyA9PiBvLnNlbGVjdGVkKSkge1xuICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4pO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluID0gdHJ1ZTtcbiAgfVxuICBoYW5kbGVDbGVhckJ1dHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGVybSkge1xuICAgICAgdGhpcy5fY2xlYXJTZWFyY2goKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJBbGxJdGVtcygpO1xuICB9XG4gIGhhbmRsZURyb3Bkb3duQXJyb3dDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluID0gdHJ1ZTtcblxuICAgIHRoaXMudG9nZ2xlKCk7XG4gIH1cbiAgaGFuZGxlT3V0c2lkZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0aGlzLmVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG4gIGhhbmRsZUFueXdoZXJlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC50YWdOYW1lICE9ICdJTlBVVCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zZWFyY2hhYmxlKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcpXG4gIG9uTW91c2V1cCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4gPSBmYWxzZTtcbiAgfVxuICAvLyEgZHJvcGRvd24gc3RhdGUgaGFuZGxlcnNcbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlbigpO1xuICB9XG4gIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0Ryb3Bkb3duT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IHRydWU7XG4gICAgaWYgKHRoaXMuYXV0b0hpZ2hsaWdodEZpcnN0KSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuXG4gICAgdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMub3BlbkV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuQ2hhbmdlLmVtaXQodGhpcy5pc0Ryb3Bkb3duT3Blbik7XG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG5cbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuQ2hhbmdlLmVtaXQodGhpcy5pc0Ryb3Bkb3duT3Blbik7XG4gICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgLy8hIENoYW5nZURldGVjdG9yUmVmXG4gIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKCEoPGFueT50aGlzLl9jZCkuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIC8vISBzZWFyY2hcbiAgcHJpdmF0ZSBfY2xlYXJTZWFyY2goc3VwcHJlc3NTZWFyY2hFdmVudDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0U2VhcmNoKCcnLCBzdXBwcmVzc1NlYXJjaEV2ZW50KTtcbiAgfVxuICBwcml2YXRlIF9zZXRTZWFyY2goc2VhcmNoVGVybTogc3RyaW5nLCBzdXBwcmVzc1NlYXJjaEV2ZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtO1xuICAgIHRoaXMuZmlsdGVyKHNlYXJjaFRlcm0sIHN1cHByZXNzU2VhcmNoRXZlbnQpO1xuICB9XG4gIHByaXZhdGUgX3NldFNlYXJjaElucHV0QXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBhdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgYXV0b2NvcnJlY3Q6ICdvZmYnLFxuICAgICAgYXV0b2NhcGl0YWxpemU6ICdvZmYnLFxuICAgICAgYXV0b2NvbXBsZXRlOiAnb2ZmJyxcbiAgICAgIC4uLnRoaXMuaW5wdXRBdHRycyxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8hIGtleSBwcmVzcyBoYW5kbGVyc1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1NwYWNlJzoge1xuICAgICAgICB0aGlzLl9vblNwYWNlUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICB0aGlzLl9vbkFycm93VXBQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHRoaXMuX29uSG9tZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6IHtcbiAgICAgICAgdGhpcy5fb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnS2V5QSc6IHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9vbkN0cmxBUHJlc3MoZXZlbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFzeW5jIF9vbkVudGVyUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCBzaG91bGRDbG9zZSA9IHRydWU7XG5cbiAgICAvL3NlbGVjdCB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG9wdGlvblxuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuICYmIHRoaXMuZmlyc3RIaWdobGlnaHRlZEl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLmNsZWFyYWJsZSAmJiB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodGVkSXRlbXMuZXZlcnkoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKSkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0SXRlbSguLi50aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodGVkSXRlbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vYWRkIGEgY3VzdG9tIG9wdGlvblxuICAgIGVsc2UgaWYgKHRoaXMuaXNEcm9wZG93bk9wZW4gJiYgdGhpcy5zaG91bGRTaG93QWRkQ3VzdG9tKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZEN1c3RvbU9wdGlvbih0aGlzLnNlYXJjaFRlcm0pO1xuICAgIH1cbiAgICAvL2luIGNhc2Ugb2Ygbm8gYWN0aW9uLCBvcGVuIHRoZSBkcm9wZG93biAob3Iga2VlcCBpdCBvcGVuKVxuICAgIGVsc2Ugc2hvdWxkQ2xvc2UgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5rZWVwT3BlbiAmJiBzaG91bGRDbG9zZSkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbEhpZ2hsaWdodHMoKTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX29uU3BhY2VQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3BlbigpO1xuICB9XG4gIHByaXZhdGUgX29uQXJyb3dEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3BlbigpO1xuXG4gICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgcmVjZW50bHlIaWdobGlnaHRlZCA9IHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0TmV4dEl0ZW0oKzEsIGV2ZW50LnNoaWZ0S2V5KTtcbiAgICBpZiAocmVjZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25QYW5lbC5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ2JvdHRvbScpO1xuICB9XG4gIHByaXZhdGUgX29uQXJyb3dVcFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodE5leHRJdGVtKC0xLCBldmVudC5zaGlmdEtleSk7XG4gICAgaWYgKHJlY2VudGx5SGlnaGxpZ2h0ZWQpIHtcbiAgICAgIHRoaXMuaXRlbVN0b3JhZ2Uuc2V0UmVjZW50bHlIaWdobGlnaHRlZChyZWNlbnRseUhpZ2hsaWdodGVkKTtcbiAgICB9XG5cbiAgICB0aGlzLmRyb3Bkb3duUGFuZWwuc2Nyb2xsVG9SZWNlbnRseUhpZ2hsaWdodGVkKCd0b3AnKTtcbiAgfVxuICBwcml2YXRlIF9vbkhvbWVQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0Ryb3Bkb3duT3BlbiB8fCAodGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCAhPSAwICYmIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPSAwKSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkID0gZmFsc2U7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcbiAgICBpZiAoIXJlY2VudGx5SGlnaGxpZ2h0ZWQpIHJldHVybjtcblxuICAgIHRoaXMuaXRlbVN0b3JhZ2Uuc2V0UmVjZW50bHlIaWdobGlnaHRlZChyZWNlbnRseUhpZ2hsaWdodGVkKTtcbiAgICB0aGlzLmRyb3Bkb3duUGFuZWwuc2Nyb2xsVG9SZWNlbnRseUhpZ2hsaWdodGVkKCd0b3AnKTtcbiAgfVxuICBwcml2YXRlIF9vbkVuZFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEcm9wZG93bk9wZW4gfHxcbiAgICAgICh0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kICE9IHRoaXMuc2VhcmNoVGVybS5sZW5ndGggJiYgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ICE9IHRoaXMuc2VhcmNoVGVybS5sZW5ndGgpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkID0gZmFsc2U7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRMYXN0SXRlbSgpO1xuICAgIGlmICghcmVjZW50bHlIaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIHRoaXMuZHJvcGRvd25QYW5lbC5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ2JvdHRvbScpO1xuICB9XG4gIHByaXZhdGUgX29uQmFja3NwYWNlT3JEZWxldGVQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXJjaFRlcm0gfHwgIXRoaXMuX2NsZWFyYWJsZSB8fCB0aGlzLm5vQmFja3NwYWNlQ2xlYXIgfHwgIXRoaXMuaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3RhYmxlICYmIHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9jbGVhckxhc3RJdGVtKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyQWxsSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIF9vbkN0cmxBUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEFsbEl0ZW1zKCk7XG4gIH1cbn1cbiIsIjxhcmQtZm9ybS1maWVsZC1mcmFtZVxyXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICBbdmFyaWFudF09XCJ2YXJpYW50XCJcclxuICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxyXG4gICAgW2lzRm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxyXG4gICAgW3ByZWZpeFRlbXBsYXRlXT1cInByZWZpeFRlbXBsYXRlXCJcclxuICAgIFtzdWZmaXhUZW1wbGF0ZV09XCJzdWZmaXhUZW1wbGF0ZVwiXHJcbj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VsZWN0XCJcclxuICAgICAgICAjZHJvcGRvd25Ib3N0XHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFueXdoZXJlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgW2NsYXNzLmFyZC1oYXMtdmFsdWVdPVwiaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIm5nQ2xhc3Nlc1wiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zZWxlY3QtdmFsdWUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGREaXNwbGF5UGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGUgbGV0LXBsaGxkcj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXBsYWNlaG9sZGVyXCI+e3sgcGxobGRyIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyVGVtcGxhdGUgfHwgZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRQbGFjZWhvbGRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkRGlzcGxheVZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXNlbGVjdC12YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC12YWx1ZS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5oaWRkZW5dPVwiIWlzVmFsdWVXaXRoaW5EaXNwbGF5TGltaXQoaSkgPyB0cnVlIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNWYWx1ZVdpdGhpbkRpc3BsYXlMaW1pdChpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInZhbHVlVGVtcGxhdGUgfHwgKG11bHRpc2VsZWN0YWJsZSA/IGRlZmF1bHRNdWx0aVZhbHVlVGVtcGxhdGUgOiAgZGVmYXVsdFZhbHVlVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFZhbHVlQ29udGV4dChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRWYWx1ZVRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2FyZElubmVySFRNTF09XCJpdGVtLmxhYmVsXCIgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlIGxldC1pdGVtIGxldC11bnNlbGVjdD1cInVuc2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1kZWxldGFibGUtY2hpcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlKT1cInVuc2VsZWN0KGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwidmFyaWFudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkLXN0cm9uZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFthcmRJbm5lckhUTUxdPVwiaXRlbS5sYWJlbFwiIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWRlbGV0YWJsZS1jaGlwPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQgJiYgc2hvdWxkU2hvd0l0ZW1EaXNwbGF5TGltaXRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3ZlcmZsb3ctaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZSB8fCBkZWZhdWx0SXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGUgbGV0LWNvdW50PVwib3ZlcmZsb3dDb3VudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Y291bnR9fSBtb3JlLi4uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtb3duc109XCJpc0Ryb3Bkb3duT3BlbiA/IGh0bWxJZCA6IG51bGxcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgI3NlYXJjaElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwic2VhcmNoSW5wdXRJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc0lucHV0RWxlbWVudFJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtXCJcclxuICAgICAgICAgICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaXNEcm9wZG93bk9wZW4gPyBodG1sSWQgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiZmlsdGVyKHNlYXJjaElucHV0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvblNlYXJjaElucHV0Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uU2VhcmNoSW5wdXRCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zZWxlY3QtY29udHJvbHNcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXNpbXBsZS1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsb2FkaW5nU3Bpbm5lclRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxhcmQtX2NsZWFyLWJ1dHRvbiAqbmdJZj1cInNob3VsZFNob3dDbGVhckJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY2xlYXJCdXR0b25UaXRsZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xlYXJCdXR0b25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwvYXJkLV9jbGVhci1idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93LXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRHJvcGRvd25BcnJvd0NsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtaGl0Ym94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvYXJkLWZvcm0tZmllbGQtZnJhbWU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93blRlbXBsYXRlPlxyXG4gICAgPGFyZC1kcm9wZG93bi1wYW5lbFxyXG4gICAgICAgIGNsYXNzPVwiYXJkLWRyb3Bkb3duLXBhbmVsIGFyZC1zZWxlY3QtZHJvcGRvd24tcGFuZWxcIlxyXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiT3B0aW9ucyBsaXN0XCJcclxuICAgICAgICBbaGVhZGVyVGVtcGxhdGVdPVwiZHJvcGRvd25IZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgW2Zvb3RlclRlbXBsYXRlXT1cImRyb3Bkb3duRm9vdGVyVGVtcGxhdGVcIlxyXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImRyb3Bkb3duQXBwZWFyYW5jZVwiXHJcbiAgICAgICAgW3ZhcmlhbnRdPVwiZHJvcGRvd25WYXJpYW50XCJcclxuICAgICAgICBbaXNPcGVuXT1cInRydWVcIlxyXG4gICAgICAgIFtmaWx0ZXJWYWx1ZV09XCJzZWFyY2hUZXJtXCJcclxuICAgICAgICBbcGFuZWxJZF09XCJodG1sSWRcIlxyXG4gICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxyXG4gICAgICAgIChhcmRDbGlja091dHNpZGUpPVwiaGFuZGxlT3V0c2lkZUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoKVwiXHJcbiAgICAgICAgKHNjcm9sbCk9XCJzY3JvbGxFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChzY3JvbGxUb0VuZCk9XCJzY3JvbGxUb0VuZEV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG91bGRTaG93Tm9JdGVtc0ZvdW5kXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGdyb3VwXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaXRlbVN0b3JhZ2UuZ3JvdXBzXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtZ3JvdXAtZGlzYWJsZWRdPVwiZ3JvdXAuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1ncm91cC1zZWxlY3RlZF09XCJncm91cC5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWdyb3VwLWhpZ2hsaWdodGVkXT1cImdyb3VwLmhpZ2hsaWdodGVkXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25Hcm91cE1vdXNlb3Zlcihncm91cClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBDbGljayhncm91cClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXAubGFiZWwgIT09ICcnICYmIGdyb3VwLmxhYmVsICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRncm91cFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1vcHRncm91cC1sYWJlbFwiIFthcmRJbm5lckhUTUxdPVwiZ3JvdXAubGFiZWxcIiBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGdyb3VwVGVtcGxhdGUgfHwgZGVmYXVsdE9wdGdyb3VwVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0R3JvdXBDb250ZXh0KGdyb3VwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGdyb3VwLWNoaWxkcmVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1vcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBncm91cC5jaGlsZHJlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWRpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkXT1cIm9wdGlvbi5oaWdobGlnaHRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkLXJlY2VudF09XCJvcHRpb24uaGlnaGxpZ2h0ZWRfcmVjZW50bHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImh0bWxJZCArICctJyArIG9wdGlvbi5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkl0ZW1DbGljayhvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm9uSXRlbU1vdXNlT3ZlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VFbnRlcihvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkl0ZW1Nb3VzZUxlYXZlKG9wdGlvbiwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0T3B0aW9uVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2FyZElubmVySFRNTF09XCJvcHRpb24ubGFiZWxcIiBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvblRlbXBsYXRlIHx8IGRlZmF1bHRPcHRpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE9wdGlvbkNvbnRleHQob3B0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93Tm9JdGVtc0ZvdW5kXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7bm9JdGVtc0ZvdW5kVGV4dH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9JdGVtc0ZvdW5kVGVtcGxhdGUgfHwgZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRTZWFyY2hDb250ZXh0KClcIj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZFNob3dBZGRDdXN0b21cIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QWRkQ3VzdG9tVGVtcGxhdGUgbGV0LXNlYXJjaFRlcm0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbiBhcmQtb3B0aW9uLWhpZ2hsaWdodGVkIGFyZC1hZGQtY3VzdG9tXCIgKGNsaWNrKT1cImFkZEN1c3RvbU9wdGlvbihzZWFyY2hUZXJtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tbGFiZWxcIj5BZGQgb3B0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tdmFsdWVcIj5cInt7c2VhcmNoVGVybX19XCI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZGRDdXN0b21UZW1wbGF0ZSB8fCBkZWZhdWx0QWRkQ3VzdG9tVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEN1c3RvbU9wdGlvbkNvbnRleHQoKVwiPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7bG9hZGluZ1BsYWNlaG9sZGVyVGV4dH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGUgfHwgZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRTZWFyY2hDb250ZXh0KClcIj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvYXJkLWRyb3Bkb3duLXBhbmVsPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
851
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWMscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBT0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFtQixNQUFNLGtEQUFrRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxxQkFBcUIsRUFB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNvZXJjZUFycmF5UHJvcGVydHksIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYXJkaXVtLXVpL2RldmtpdCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzQW55U3RyaW5nLCBpc0FycmF5LCBpc0Z1bmN0aW9uIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xuaW1wb3J0IHsgSXRlbVN0b3JhZ2UsIEl0ZW1TdG9yYWdlSG9zdCB9IGZyb20gJy4uL19pbnRlcm5hbC9pdGVtLXN0b3JhZ2VzL2Ryb3Bkb3duLWl0ZW0tc3RvcmFnZSc7XG5pbXBvcnQgeyBfTmdNb2RlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvbmdtb2RlbC1jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duLXBhbmVsL2Ryb3Bkb3duLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSwgRHJvcGRvd25QYW5lbFZhcmlhbnQgfSBmcm9tICcuLi9kcm9wZG93bi1wYW5lbC9kcm9wZG93bi1wYW5lbC50eXBlcyc7XG5pbXBvcnQgeyBBcmRpdW1PcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzZWFyY2hGdW5jdGlvbnMgfSBmcm9tICcuLi9zZWFyY2gtZnVuY3Rpb25zJztcbmltcG9ydCB7IEFyZE9wdGlvbiwgQXJkT3B0aW9uR3JvdXAsIEFyZFBhbmVsUG9zaXRpb24sIEdyb3VwQnlGbiwgT3B0aW9uQ29udGV4dCwgU2VhcmNoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRBcHBlYXJhbmNlIH0gZnJvbSAnLi4vdHlwZXMvdGhlbWluZy50eXBlcyc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRWYXJpYW50IH0gZnJvbSAnLi8uLi90eXBlcy90aGVtaW5nLnR5cGVzJztcbmltcG9ydCB7XG4gIEFyZEFkZEN1c3RvbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZEl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRncm91cFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFNlbGVjdFN1ZmZpeFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlLFxufSBmcm9tICcuL3NlbGVjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgQWRkQ3VzdG9tRm4sXG4gIEN1c3RvbU9wdGlvbkNvbnRleHQsXG4gIEdyb3VwQ29udGV4dCxcbiAgSXRlbURpc3BsYXlMaW1pdENvbnRleHQsXG4gIEl0ZW1MaW1pdENvbnRleHQsXG4gIFBsYWNlaG9sZGVyQ29udGV4dCxcbiAgU2VhcmNoQ29udGV4dCxcbiAgU3RhdHNDb250ZXh0LFxuICBWYWx1ZUNvbnRleHQsXG59IGZyb20gJy4vc2VsZWN0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXJkLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXJkaXVtU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bVNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIF9OZ01vZGVsQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJdGVtU3RvcmFnZUhvc3RcbntcbiAgcmVhZG9ubHkgX2NvbXBvbmVudElkOiBzdHJpbmcgPSAnMDAwJztcbiAgLy8hIHB1YmxpYyBjb25zdGFudHNcbiAgcmVhZG9ubHkgaXRlbVN0b3JhZ2UgPSBuZXcgSXRlbVN0b3JhZ2UodGhpcyk7XG4gIHJlYWRvbmx5IERFRkFVTFRTID0ge1xuICAgIHZhbHVlRnJvbTogJ3ZhbHVlJyxcbiAgICBsYWJlbEZyb206ICdsYWJlbCcsXG4gICAgZGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGdyb3VwTGFiZWxGcm9tOiAnZ3JvdXAnLFxuICAgIGdyb3VwRGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGNoaWxkcmVuRnJvbTogJ2NoaWxkcmVuJyxcbiAgICBzZWFyY2hGbjogc2VhcmNoRnVuY3Rpb25zLmJ5TGFiZWwsXG4gICAgY2xlYXJCdXR0b25UaXRsZTogJ0NsZWFyJyxcbiAgICBub0l0ZW1zRm91bmRUZXh0OiAnTm8gaXRlbXMgZm91bmQuJyxcbiAgICBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0OiAnTG9hZGluZy4uLicsXG4gIH07XG5cbiAgLy8hIHByaXZhdGVzXG4gIHByaXZhdGUgX2l0ZW1zOiBhbnlbXSB8IG51bGwgPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaXNNb3VzZUJlaW5nVXNlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaEJhckZvY3VzZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8hIHB1YmxpY3NcbiAgcmVhZG9ubHkgc2VhcmNoVGVybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgaXNJdGVtc0lucHV0VXNlZCA9IGZhbHNlO1xuXG4gIC8vISBiaW5kaW5nLXJlbGF0ZWQgaW5wdXRzXG4gIC8vdmFsdWUvbGFiZWwvZGlzYWJsZWQvZ3JvdXAvcHJlLWdyb3VwZWQgY2hpbGRyZW4gcGF0aHNcbiAgcmVhZG9ubHkgdmFsdWVGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgbGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGlzYWJsZWRGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgLy8hIGdyb3VwLXJlbGF0ZWQgaW5wdXRzXG4gIHJlYWRvbmx5IGdyb3VwTGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nIHwgR3JvdXBCeUZuPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZ3JvdXBEaXNhYmxlZEZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBjaGlsZHJlbkZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICAvLyEgc2V0dGluZ3NcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCdTZWxlY3QgaXRlbScpO1xuICByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJ1NlYXJjaC4uLicpO1xuICByZWFkb25seSBjbGVhckJ1dHRvblRpdGxlID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmNsZWFyQnV0dG9uVGl0bGUpO1xuXG4gIHJlYWRvbmx5IGRyb3Bkb3duUG9zaXRpb24gPSBpbnB1dDxBcmRQYW5lbFBvc2l0aW9uPihBcmRQYW5lbFBvc2l0aW9uLkF1dG8pO1xuICAvLyEgdGVtcGxhdGUtcmVsYXRlZCBzZXR0aW5nc1xuICByZWFkb25seSBub0l0ZW1zRm91bmRUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLm5vSXRlbXNGb3VuZFRleHQpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmxvYWRpbmdQbGFjZWhvbGRlclRleHQpO1xuICAvLyEgc2VhcmNoLXJlbGF0ZWQgb3B0aW9uc1xuICByZWFkb25seSBzZWFyY2hJbnB1dElkID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgaW5wdXRBdHRycyA9IGlucHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcbiAgLy8hIG90aGVyIGlucHV0c1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGlucHV0UHJvcHMgPSBpbnB1dDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IGh0bWxJZCA9IGlucHV0PHN0cmluZz4oY3J5cHRvLnJhbmRvbVVVSUQoKSk7XG5cbiAgLy8hIGJvb2xlYW4gc2V0dGluZ3NcbiAgcmVhZG9ubHkgaXRlbXNBbHJlYWR5R3JvdXBlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcblxuICAvL3Nob3VsZCB0aGUgdmFsdWUgdGhhdCB0aGUgXCJkaXNhYmxlZEZyb21cIiBwYXRoIGxlYWQgdG8gYmUgaW52ZXJ0ZWQ/XG4gIC8vdXNlZnVsIHdoZW4gdGhlIHByb3BlcnR5IGlzIGUuZy4gXCJhY3RpdmVcIiwgd2hpY2ggaXMgdGhlIG9wb3NpdGUgb2YgXCJkaXNhYmxlZFwiXG4gIHJlYWRvbmx5IGludmVydERpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IG5vR3JvdXBBY3Rpb25zID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBhdXRvSGlnaGxpZ2h0Rmlyc3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGF1dG9Gb2N1cyA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkga2VlcE9wZW4gPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGhpZGVTZWxlY3RlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgbm9CYWNrc3BhY2VDbGVhciA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgc29ydE11bHRpcGxlVmFsdWVzID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hDYXNlU2Vuc2l0aXZlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgLy8hIG51bWJlciBpbnB1dHNcbiAgcmVhZG9ubHkgbWF4U2VsZWN0ZWRJdGVtcyA9IGlucHV0PG51bWJlciwgYW55PihJbmZpbml0eSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgSW5maW5pdHkpIH0pO1xuICByZWFkb25seSBpdGVtRGlzcGxheUxpbWl0ID0gaW5wdXQ8bnVtYmVyLCBhbnk+KEluZmluaXR5LCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCBJbmZpbml0eSkgfSk7XG5cbiAgLy8hIGZ1bmN0aW9uIGlucHV0c1xuICByZWFkb25seSBzZWFyY2hGbiA9IGlucHV0PFNlYXJjaEZuPih0aGlzLkRFRkFVTFRTLnNlYXJjaEZuKTtcbiAgcmVhZG9ubHkgY29tcGFyZVdpdGggPSBpbnB1dDxOdWxsYWJsZTxTZWFyY2hGbj4+KHVuZGVmaW5lZCk7XG5cbiAgLy8hIGFwcGVhcmFuY2VcbiAgcmVhZG9ubHkgYXBwZWFyYW5jZSA9IGlucHV0PEZvcm1FbGVtZW50QXBwZWFyYW5jZT4oRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKTtcbiAgcmVhZG9ubHkgdmFyaWFudCA9IGlucHV0PEZvcm1FbGVtZW50VmFyaWFudD4oRm9ybUVsZW1lbnRWYXJpYW50LlJvdW5kZWQpO1xuXG4gIHJlYWRvbmx5IGNvbXBhY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgcmVhZG9ubHkgbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBbXG4gICAgICAvL2FwcGVhcmFuY2UsIHZhcmlhbnQgaGFuZGxlZCBpbiBhcmQtZm9ybS1maWVsZC1mcmFtZSBjb21wb25lbnRcbiAgICAgIHRoaXMuY29tcGFjdCgpID8gJ2FyZC1jb21wYWN0JyA6ICcnLFxuICAgICAgdGhpcy5tdWx0aXNlbGVjdGFibGUoKSA/ICdhcmQtbXVsdGlzZWxlY3QnIDogJ2FyZC1zaW5nbGVzZWxlY3QnLFxuICAgICAgdGhpcy5jbGVhcmFibGUoKSA/ICdhcmQtY2xlYXJhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5zZWFyY2hhYmxlKCkgPyAnYXJkLXNlYXJjaGFibGUnIDogJycsXG4gICAgICB0aGlzLmZpbHRlcmVkKCkgPyAnYXJkLWZpbHRlcmVkJyA6ICcnLFxuICAgICAgdGhpcy50b3VjaGVkKCkgPyAnYXJkLXRvdWNoZWQnIDogJycsXG4gICAgICB0aGlzLmlzT3BlbigpID8gJ2FyZC1kcm9wZG93bi1vcGVuJyA6ICcnLFxuICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpID8gJ2FyZC1zZWxlY3QtZm9jdXNlZCcgOiAnJyxcbiAgICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSA/ICdhcmQtc2VsZWN0LWZvY3VzZWQnIDogJycsXG4gICAgXS5qb2luKCcgJylcbiAgKTtcblxuICByZWFkb25seSBkcm9wZG93bkFwcGVhcmFuY2UgPSBpbnB1dDxOdWxsYWJsZTxEcm9wZG93blBhbmVsQXBwZWFyYW5jZT4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duQXBwZWFyYW5jZU9yRGVmYXVsdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAodGhpcy5kcm9wZG93bkFwcGVhcmFuY2UoKSkgcmV0dXJuIHRoaXMuZHJvcGRvd25BcHBlYXJhbmNlKCkhO1xuICAgIGlmICh0aGlzLmFwcGVhcmFuY2UoKSA9PT0gRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKSByZXR1cm4gRHJvcGRvd25QYW5lbEFwcGVhcmFuY2UuT3V0bGluZWQ7XG4gICAgcmV0dXJuIERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlLlJhaXNlZDtcbiAgfSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVmFyaWFudCA9IGlucHV0PE51bGxhYmxlPERyb3Bkb3duUGFuZWxWYXJpYW50Pj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZHJvcGRvd25WYXJpYW50T3JEZWZhdWx0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duVmFyaWFudCgpKSByZXR1cm4gdGhpcy5kcm9wZG93blZhcmlhbnQoKSE7XG4gICAgY29uc3QgdmFyaWFudCA9IHRoaXMudmFyaWFudCgpO1xuICAgIGlmICh2YXJpYW50ID09PSBGb3JtRWxlbWVudFZhcmlhbnQuUGlsbCkgcmV0dXJuIERyb3Bkb3duUGFuZWxWYXJpYW50LlJvdW5kZWQ7XG4gICAgcmV0dXJuIHZhcmlhbnQ7XG4gIH0pO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWdyb3VwLWl0ZW1zJylcbiAgZ2V0IF9ncm91cEl0ZW1zSG9zdEF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cExhYmVsRnJvbSgpO1xuICB9XG5cbiAgLy8hIGl0ZW1zIHNldHRlci9nZXR0ZXJcbiAgQElucHV0KClcbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuICBzZXQgaXRlbXModmFsdWU6IHN0cmluZyB8IGFueVtdIHwgbnVsbCkge1xuICAgIHRoaXMuaXNJdGVtc0lucHV0VXNlZCA9IHRydWU7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IFtdO1xuICAgICAgdGhpcy5pc0l0ZW1zSW5wdXRVc2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0FueVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHByaW50RXJyb3JzID0gdGhpcy5pdGVtU3RvcmFnZS5zZXRJdGVtcyh2YWx1ZSk7XG4gICAgaWYgKHByaW50RXJyb3JzKSB7XG4gICAgICB0aGlzLl9wcmludFByaW1pdGl2ZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihBcmRpdW1PcHRpb25Db21wb25lbnQpXG4gIG9wdGlvbkNvbXBvbmVudHMhOiBRdWVyeUxpc3Q8QXJkaXVtT3B0aW9uQ29tcG9uZW50PjtcblxuICBwcml2YXRlIF9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCkge1xuICAgIGNvbnN0IGhhbmRsZU9wdGlvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCA9IG1lcmdlKHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzLCB0aGlzLl9kZXN0cm95JCk7XG4gICAgICBtZXJnZSguLi50aGlzLm9wdGlvbkNvbXBvbmVudHMubWFwKG9wdGlvbiA9PiBvcHRpb24uc3RhdGVDaGFuZ2UkKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCkpXG4gICAgICAgIC5zdWJzY3JpYmUob3B0aW9uID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1TdG9yYWdlLmZpbmRJdGVtQnlWYWx1ZShvcHRpb24ub2xkVmFsdWUgPz8gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZWQuc2V0KG9wdGlvbi5kaXNhYmxlZCk7XG4gICAgICAgICAgICAgIGl0ZW0ubGFiZWwuc2V0KG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCkpO1xuICAgICAgICAgICAgICBpdGVtLnZhbHVlLnNldChvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLnNldCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3B0aW9uLmRpc2FibGVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy5vcHRpb25Db21wb25lbnRzKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKG9wdGlvbnM6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLml0ZW1zID0gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgIGRpc2FibGVkOiBvcHRpb24uZGlzYWJsZWQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGhhbmRsZU9wdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8hIGF0dHJpYnV0ZSBhbmQvb3IgY2xhc3Mgc2V0dGVycy9nZXR0ZXJzXG4gIHJlYWRvbmx5IG11bHRpc2VsZWN0YWJsZSA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgY2xlYXJhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IGZpbHRlcmVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5zZWFyY2hhYmxlKCkgJiYgdGhpcy5zZWFyY2hUZXJtKCkgIT09ICcnKTtcblxuICByZWFkb25seSB0b3VjaGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyEgY3VzdG9tIG9wdGlvbnNcbiAgcHJpdmF0ZSBfZGVmYXVsdEFkZEN1c3RvbUZuOiBBZGRDdXN0b21Gbjxhbnk+ID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlO1xuXG4gIHJlYWRvbmx5IGFkZEN1c3RvbSA9IGlucHV0PFxuICAgIGZhbHNlIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4sXG4gICAgc3RyaW5nIHwgYm9vbGVhbiB8IEFkZEN1c3RvbUZuPGFueT4gfCBBZGRDdXN0b21GbjxQcm9taXNlPGFueT4+XG4gID4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IHYgPT4ge1xuICAgICAgaWYgKGlzRnVuY3Rpb24odikpIHtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9XG4gICAgICAvL2NvZXJjZSB0aGUgdmFsdWUgaW50byBhIGJvb2xlYW5cbiAgICAgIC8vaWYgXCJ0cnVlXCIsIHVzZSB0aGUgZGVmYXVsdCBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBqdXN0IHNldCB0byBcImZhbHNlXCIuXG4gICAgICByZXR1cm4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpICYmIHRoaXMuX2RlZmF1bHRBZGRDdXN0b21GbjtcbiAgICB9LFxuICB9KTtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0FkZEN1c3RvbSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuYWRkQ3VzdG9tKCkgIT09IGZhbHNlICYmIHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNGb3VuZCgpXG4gICk7XG5cbiAgYXN5bmMgYWRkQ3VzdG9tT3B0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhYyA9IHRoaXMuYWRkQ3VzdG9tKCk7XG4gICAgaWYgKCFhYykgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3T3B0aW9uT2JqID0gYXdhaXQgdGhpcy5pdGVtU3RvcmFnZS5hZGRDdXN0b21PcHRpb24odmFsdWUsIGFjKTtcblxuICAgIHRoaXMuc2VsZWN0SXRlbShuZXdPcHRpb25PYmopO1xuICB9XG5cbiAgLy8hIGNvbnRyb2wgdmFsdWUgYWNjZXNzb3JcbiAgLy9vdmVycmlkZSB0aGUgd3JpdGVWYWx1ZSBhbmQgc2V0RGlzYWJsZWRTdGF0ZSBkZWZpbmVkIGluIF9OZ01vZGVsQ29tcG9uZW50XG4gIG92ZXJyaWRlIHNldERpc2FibGVkU3RhdGUoc3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHN0YXRlO1xuICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHdyaXRlVmFsdWUobmdNb2RlbDogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhhbmRsZVdyaXRlVmFsdWUobmdNb2RlbCk7XG4gICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgLy8hIGNoYW5nZSAmIHRvdWNoIGV2ZW50IGVtaXR0ZXJzXG4gIHByb3RlY3RlZCBfZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbVN0b3JhZ2UudmFsdWUoKTtcbiAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX29uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdWNoZWQuc2V0KHRydWUpO1xuICAgIHRoaXMuX29uVG91Y2hlZFJlZ2lzdGVyZWQ/LigpO1xuICB9XG5cbiAgLy8hIHZhbHVlIGlucHV0ICYgb3V0cHV0XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgLy9pZiBpcyBhIHN0cmluZywgY29lcmNlIGl0IGludG8gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIGlmIChpc0FueVN0cmluZyhuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eShuZXdWYWx1ZSk7XG4gICAgLy9pZiBpdCBpcyBub3QgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSwganVzdCBwdXQgaXQgaW4gYW4gYXJyYXlcbiAgICBlbHNlIGlmICghaXNBcnJheShuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gW25ld1ZhbHVlXTtcblxuICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IFNpZ25hbDxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gb3V0cHV0PGFueVtdPigpO1xuXG4gIC8vISBvdXRwdXQgZXZlbnRzXG4gIHJlYWRvbmx5IGNoYW5nZUV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnY2hhbmdlJyB9KTtcbiAgcmVhZG9ubHkgYWRkRXZlbnQgPSBvdXRwdXQ8YW55W10+KHsgYWxpYXM6ICdhZGQnIH0pO1xuICByZWFkb25seSBmYWlsZWRUb0FkZEV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnZmFpbGVkVG9BZGQnIH0pO1xuICByZWFkb25seSByZW1vdmVFdmVudCA9IG91dHB1dDxhbnlbXT4oeyBhbGlhczogJ3JlbW92ZScgfSk7XG4gIHJlYWRvbmx5IGNsZWFyRXZlbnQgPSBvdXRwdXQ8dm9pZD4oeyBhbGlhczogJ2NsZWFyJyB9KTtcbiAgcmVhZG9ubHkgb3BlbkV2ZW50ID0gb3V0cHV0PHZvaWQ+KHsgYWxpYXM6ICdvcGVuJyB9KTtcbiAgcmVhZG9ubHkgY2xvc2VFdmVudCA9IG91dHB1dDx2b2lkPih7IGFsaWFzOiAnY2xvc2UnIH0pO1xuICByZWFkb25seSBzY3JvbGxFdmVudCA9IG91dHB1dDx7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgfT4oeyBhbGlhczogJ3Njcm9sbCcgfSk7XG4gIHJlYWRvbmx5IHNjcm9sbFRvRW5kRXZlbnQgPSBvdXRwdXQoeyBhbGlhczogJ3Njcm9sbFRvRW5kJyB9KTtcbiAgcmVhZG9ubHkgc2VhcmNoRXZlbnQgPSBvdXRwdXQ8e1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIG1hdGNoaW5nOiBhbnlbXTtcbiAgfT4oeyBhbGlhczogJ3NlYXJjaCcgfSk7XG5cbiAgcmVhZG9ubHkgaXNPcGVuID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vISB2aWV3IGNoaWxkcmVuXG4gIHJlYWRvbmx5IHNlYXJjaElucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzZWFyY2hJbnB1dCcpO1xuICByZWFkb25seSBkcm9wZG93blBhbmVsID0gdmlld0NoaWxkPEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQ+KEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQpO1xuXG4gIC8vISB0ZW1wbGF0ZXNcbiAgcmVhZG9ubHkgb3B0aW9uVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkT3B0aW9uVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBvcHRncm91cFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE9wdGdyb3VwVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSB2YWx1ZVRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBwbGFjZWhvbGRlclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nU3Bpbm5lclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duSGVhZGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duRm9vdGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25Gb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IG5vSXRlbXNGb3VuZFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgYWRkQ3VzdG9tVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkQWRkQ3VzdG9tVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBpdGVtTGltaXRSZWFjaGVkVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgaXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgcmVhZG9ubHkgcHJlZml4VGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBzdWZmaXhUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRTZWxlY3RTdWZmaXhUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgLy8hIGNvbnRleHQgcHJvdmlkZXJzXG4gIGdldFZhbHVlQ29udGV4dChpdGVtOiBBcmRPcHRpb24pOiBWYWx1ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGl0ZW0sXG4gICAgICBpdGVtLFxuICAgICAgaXRlbURhdGE6IGl0ZW0uaXRlbURhdGEoKSxcbiAgICAgIHVuc2VsZWN0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudW5zZWxlY3RJdGVtKGl0ZW0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJlYWRvbmx5IGdldFN0YXRzQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTdGF0c0NvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgZm91bmRJdGVtczogdGhpcy5mb3VuZEl0ZW1zKCksXG4gICAgfSlcbiAgKTtcbiAgcmVhZG9ubHkgZ2V0U2VhcmNoQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTZWFyY2hDb250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgICB0b3RhbEl0ZW1zOiB0aGlzLnRvdGFsSXRlbXMoKSxcbiAgICAgIGZvdW5kSXRlbXM6IHRoaXMuZm91bmRJdGVtcygpLFxuICAgIH0pXG4gICk7XG4gIHJlYWRvbmx5IGdldFBsYWNlaG9sZGVyQ29udGV4dCA9IGNvbXB1dGVkKCgpOiBQbGFjZWhvbGRlckNvbnRleHQgPT4ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlckZvckN1cnJlbnRDb250ZXh0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgJGltcGxpY2l0OiBwbGFjZWhvbGRlcixcbiAgICB9O1xuICB9KTtcbiAgcmVhZG9ubHkgZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBDdXN0b21PcHRpb25Db250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgfSlcbiAgKTtcbiAgZ2V0R3JvdXBDb250ZXh0KGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEdyb3VwQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogZ3JvdXAsXG4gICAgICBncm91cCxcbiAgICAgIHNlbGVjdGVkQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuKCkuZmlsdGVyKHYgPT4gdi5zZWxlY3RlZCgpKS5sZW5ndGgsXG4gICAgICB0b3RhbENoaWxkcmVuOiBncm91cC5jaGlsZHJlbigpLmxlbmd0aCxcbiAgICB9O1xuICB9XG4gIGdldE9wdGlvbkNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogT3B0aW9uQ29udGV4dDxBcmRPcHRpb24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBpdGVtLFxuICAgICAgaXRlbSxcbiAgICAgIGl0ZW1EYXRhOiBpdGVtLml0ZW1EYXRhKCksXG4gICAgfTtcbiAgfVxuICByZWFkb25seSBnZXRJdGVtTGltaXRDb250ZXh0ID0gY29tcHV0ZWQoXG4gICAgKCk6IEl0ZW1MaW1pdENvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICB9KVxuICApO1xuICByZWFkb25seSBnZXRJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9IGNvbXB1dGVkKCgpOiBJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcygpLmxlbmd0aDtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbEl0ZW1zKCksXG4gICAgICBzZWxlY3RlZEl0ZW1zLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICAgIG92ZXJmbG93Q291bnQ6IHNlbGVjdGVkSXRlbXMgLSAodGhpcy5pdGVtRGlzcGxheUxpbWl0KCkgPz8gMCksXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxTdHJhdGVneU9wdHMgPSBpbmplY3QoU2Nyb2xsU3RyYXRlZ3lPcHRpb25zKTtcblxuICAvLyEgZHJvcGRvd24gb3ZlcmxheVxuICBAVmlld0NoaWxkKCdkcm9wZG93bkhvc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZHJvcGRvd25Ib3N0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgZHJvcGRvd25PdmVybGF5PzogT3ZlcmxheVJlZjtcblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5kcm9wZG93bkhvc3QpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5T3B0cy5ibG9jaygpLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kcm9wZG93blRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIHRoaXMuZHJvcGRvd25PdmVybGF5LmF0dGFjaChwb3J0YWwpO1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuICBwcml2YXRlIF9kZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25PdmVybGF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgZGVsZXRlIHRoaXMuZHJvcGRvd25PdmVybGF5O1xuICB9XG5cbiAgc2V0T3ZlcmxheVNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duT3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcGRvd25Ib3N0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkudXBkYXRlU2l6ZSh7IHdpZHRoOiByZWN0LndpZHRoIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuXG4gIC8vISBob29rc1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKCkpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0l0ZW1zSW5wdXRVc2VkKSB7XG4gICAgICB0aGlzLl9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCk7XG4gICAgfVxuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL2ZpcmUgaXRlbXMgbG9hZCBoYW5kbGVyIHdoZW4gbG9hZGluZyBpcyBzZXQgdG8gZmFsc2VcbiAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddKSB7XG4gICAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddLmN1cnJlbnRWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fb25JdGVtc0xvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25JdGVtc0xvYWQoKSB7XG4gICAgaWYgKCF0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKSByZXR1cm47XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfcHJpbnRQcmltaXRpdmVXYXJuaW5ncygpIHtcbiAgICBmdW5jdGlvbiBtYWtlV2FybmluZyhzdHI6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEFSRC1XQTAwMCR7ZXJyb3JDb2RlfTogU2tpcHBlZCB1c2luZyBbJHtzdHJ9XSBwcm9wZXJ0eSBib3VuZCB0byA8YXJkLXNlbGVjdD4sIGFzIHNvbWUgcHJvdmlkZWQgaXRlbXMgYXJlIG9mIHByaW1pdGl2ZSB0eXBlYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWVGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCd2YWx1ZUZyb20nLCAnNWEnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFiZWxGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdsYWJlbEZyb20nLCAnNWInKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdkaXNhYmxlZEZyb20nLCAnNWMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBMYWJlbEZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2dyb3VwTGFiZWxGcm9tJywgJzVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdyb3VwRGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdncm91cERpc2FibGVkRnJvbScsICc1ZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGlsZHJlbkZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2NoaWxkcmVuRnJvbScsICc1ZicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnZlcnREaXNhYmxlZCgpKSB7XG4gICAgICBtYWtlV2FybmluZygnaW52ZXJ0RGlzYWJsZWQnLCAnNWcnKTtcbiAgICB9XG4gIH1cblxuICAvLyEgZ2V0dGVyc1xuICByZWFkb25seSBmaXJzdEhpZ2hsaWdodGVkSXRlbSA9IGNvbXB1dGVkPEFyZE9wdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCk/LmZpcnN0KCkpO1xuICByZWFkb25seSBzaG91bGREaXNwbGF5UGxhY2Vob2xkZXIgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhdGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpICYmICF0aGlzLnNlYXJjaFRlcm0oKSk7XG4gIHJlYWRvbmx5IHNob3VsZERpc3BsYXlWYWx1ZSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQoKSAmJiAoIXRoaXMuc2VhcmNoVGVybSgpIHx8IHRoaXMubXVsdGlzZWxlY3RhYmxlKCkpXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbGVhckJ1dHRvbiA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuY2xlYXJhYmxlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSAmJiAodGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpIHx8IHRoaXMuc2VhcmNoVGVybSgpICE9PSAnJylcbiAgKTtcbiAgcmVhZG9ubHkgaXRlbXNUb0Rpc3BsYXkgPSBjb21wdXRlZDxJdGVyYWJsZUl0ZXJhdG9yPEFyZE9wdGlvbkdyb3VwPj4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5ncm91cHMoKS52YWx1ZXMoKSk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dOb0l0ZW1zRm91bmQgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAoKSA9PiB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc0ZvdW5kKCkgJiYgIXRoaXMuaXNMb2FkaW5nKCkgJiYgIXRoaXMuc2hvdWxkU2hvd0FkZEN1c3RvbSgpXG4gICk7XG4gIHJlYWRvbmx5IHRvdGFsSXRlbXMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXRlbXMoKS5sZW5ndGgpO1xuICByZWFkb25seSBmb3VuZEl0ZW1zID0gY29tcHV0ZWQ8bnVtYmVyIHwgdW5kZWZpbmVkPigoKSA9PlxuICAgIHRoaXMuc2VhcmNoYWJsZSgpID8gdGhpcy5pdGVtU3RvcmFnZS5maWx0ZXJlZEl0ZW1zKCkubGVuZ3RoIDogdW5kZWZpbmVkXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dJdGVtRGlzcGxheUxpbWl0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgKCkgPT5cbiAgICAgIHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiZcbiAgICAgIHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpICE9PSBJbmZpbml0eSAmJlxuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gdGhpcy5pdGVtRGlzcGxheUxpbWl0KClcbiAgKTtcbiAgcmVhZG9ubHkgaXNJbnB1dEVsZW1lbnRSZWFkb25seSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+ICF0aGlzLmFkZEN1c3RvbSgpICYmICghdGhpcy5zZWFyY2hhYmxlKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc0l0ZW1MaW1pdFJlYWNoZWQoKSlcbiAgKTtcblxuICBpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLml0ZW1EaXNwbGF5TGltaXQoKSA9PT0gSW5maW5pdHkgfHwgaSA8IHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpO1xuICB9XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAodGhpcy5zZWFyY2hQbGFjZWhvbGRlcigpICYmIHRoaXMuc2VhcmNoYWJsZSgpICYmICh0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKCkgfHwgdGhpcy5faXNDbGlja2VkV2l0aGluKCkpKVxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIoKTtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcigpO1xuICB9KTtcblxuICAvLyEgc2VhcmNoIGlucHV0IGV2ZW50IGhhbmRsZXJzXG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcsIHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoZmlsdGVyVGVybSk7XG4gICAgY29uc3QgbWF0Y2hpbmcgPSB0aGlzLml0ZW1TdG9yYWdlLmZpbHRlcihmaWx0ZXJUZXJtKTtcbiAgICBpZiAoIXN1cHByZXNzU2VhcmNoRXZlbnQpIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh7IHNlYXJjaDogZmlsdGVyVGVybSwgbWF0Y2hpbmcgfSk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgb25TZWFyY2hJbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KHRydWUpO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpKSByZXR1cm47XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcblxuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgfVxuICAvLyEgaXRlbSBzZWxlY3Rpb24gaGFuZGxlcnNcbiAgdG9nZ2xlSXRlbShpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5zZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO1xuICB9XG4gIHNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XG4gICAgY29uc3QgW3NlbGVjdGVkLCB1bnNlbGVjdGVkLCBmYWlsZWRUb1NlbGVjdF0gPSB0aGlzLml0ZW1TdG9yYWdlLnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIH1cbiAgICBpZiAoZmFpbGVkVG9TZWxlY3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mYWlsZWRUb0FkZEV2ZW50LmVtaXQoZmFpbGVkVG9TZWxlY3QpO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRFdmVudC5lbWl0KHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgaWYgKCF0aGlzLmtlZXBTZWFyY2hBZnRlclNlbGVjdCgpKSB0aGlzLl9jbGVhclNlYXJjaCh0cnVlKTtcblxuICAgICAgaWYgKCF0aGlzLmtlZXBPcGVuKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCgpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCB8fCBzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG4gIHVuc2VsZWN0SXRlbSguLi5pdGVtczogQXJkT3B0aW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCB1bnNlbGVjdGVkID0gdGhpcy5pdGVtU3RvcmFnZS51bnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICBpZiAoIXRoaXMua2VlcFNlYXJjaEFmdGVyU2VsZWN0KCkpIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICBpZiAoIXRoaXMua2VlcE9wZW4oKSB8fCB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc1RvU2VsZWN0KCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfY2xlYXJBbGxJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhcmVkID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbFNlbGVjdGVkKHRydWUpO1xuXG4gICAgdGhpcy5mb2N1cygpO1xuXG4gICAgdGhpcy5jbGVhckV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoY2xlYXJlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIHByaXZhdGUgX2NsZWFyTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJlZFZhbHVlID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckxhc3RTZWxlY3RlZCgpLnZhbHVlKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoW2NsZWFyZWRWYWx1ZV0pO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgfVxuICAvLyEgaGlnaGxpZ2gtcmVsYXRlZFxuICBvbk1vdXNlTW92ZSgpIHtcbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwTW91c2VvdmVyKGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKCkpIHJldHVybjtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEdyb3VwKGdyb3VwKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZUVudGVyKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCgpKSByZXR1cm47XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRTaW5nbGVJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgb25JdGVtTW91c2VMZWF2ZShvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzTW91c2VCZWluZ1VzZWQoKSkgcmV0dXJuO1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UudW5oaWdobGlnaHRJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgLy8hIGNsaWNrIGhhbmRsZXJzXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQ2xpY2tlZFdpdGhpbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIG9uSXRlbUNsaWNrKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpKSB0aGlzLnRvZ2dsZUl0ZW0ob3B0aW9uKTtcbiAgICBlbHNlIHRoaXMuc2VsZWN0SXRlbShvcHRpb24pO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwQ2xpY2soZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSgpIHx8IHRoaXMubm9Hcm91cEFjdGlvbnMoKSkgcmV0dXJuO1xuICAgIGlmIChncm91cC5jaGlsZHJlbigpLmV2ZXJ5KG8gPT4gby5zZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMudW5zZWxlY3RJdGVtKC4uLmdyb3VwLmNoaWxkcmVuKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4oKSk7XG5cbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4uc2V0KHRydWUpO1xuICB9XG4gIGhhbmRsZUNsZWFyQnV0dG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXJtKCkpIHtcbiAgICAgIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyQWxsSXRlbXMoKTtcbiAgfVxuICBoYW5kbGVEcm9wZG93bkFycm93Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLnRvZ2dsZSgpO1xuICB9XG4gIGhhbmRsZU91dHNpZGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG4gIGhhbmRsZUFueXdoZXJlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC50YWdOYW1lICE9PSAnSU5QVVQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlYXJjaGFibGUoKSkge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnKVxuICBvbk1vdXNldXAoKTogdm9pZCB7XG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldChmYWxzZSk7XG4gIH1cbiAgLy8hIGRyb3Bkb3duIHN0YXRlIGhhbmRsZXJzXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuICBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLmF1dG9IaWdobGlnaHRGaXJzdCgpKSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuXG4gICAgdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMub3BlbkV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG5cbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICAvLyEgQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoISh0aGlzLl9jZCBhcyBhbnkpLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuICAvLyEgc2VhcmNoXG4gIHByaXZhdGUgX2NsZWFyU2VhcmNoKHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX3NldFNlYXJjaCgnJywgc3VwcHJlc3NTZWFyY2hFdmVudCk7XG4gIH1cbiAgcHJpdmF0ZSBfc2V0U2VhcmNoKHNlYXJjaFRlcm06IHN0cmluZywgc3VwcHJlc3NTZWFyY2hFdmVudCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldChzZWFyY2hUZXJtKTtcbiAgICB0aGlzLmZpbHRlcihzZWFyY2hUZXJtLCBzdXBwcmVzc1NlYXJjaEV2ZW50KTtcbiAgfVxuICBwcml2YXRlIF9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNlYXJjaElucHV0KCkhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGF1dG9jb3JyZWN0OiAnb2ZmJyxcbiAgICAgIGF1dG9jYXBpdGFsaXplOiAnb2ZmJyxcbiAgICAgIGF1dG9jb21wbGV0ZTogJ29mZicsXG4gICAgICAuLi50aGlzLmlucHV0QXR0cnMoKSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8hIGtleSBwcmVzcyBoYW5kbGVyc1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1NwYWNlJzoge1xuICAgICAgICB0aGlzLl9vblNwYWNlUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICB0aGlzLl9vbkFycm93VXBQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHRoaXMuX29uSG9tZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6IHtcbiAgICAgICAgdGhpcy5fb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnS2V5QSc6IHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9vbkN0cmxBUHJlc3MoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBfb25FbnRlclByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgc2hvdWxkQ2xvc2UgPSB0cnVlO1xuXG4gICAgLy9zZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cbiAgICBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLmZpcnN0SGlnaGxpZ2h0ZWRJdGVtKCkpIHtcbiAgICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpICYmIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oLi4udGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9hZGQgYSBjdXN0b20gb3B0aW9uXG4gICAgZWxzZSBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLnNob3VsZFNob3dBZGRDdXN0b20oKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDdXN0b21PcHRpb24odGhpcy5zZWFyY2hUZXJtKCkpO1xuICAgIH1cbiAgICAvL2luIGNhc2Ugb2Ygbm8gYWN0aW9uLCBvcGVuIHRoZSBkcm9wZG93biAob3Iga2VlcCBpdCBvcGVuKVxuICAgIGVsc2Ugc2hvdWxkQ2xvc2UgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5rZWVwT3BlbigpICYmIHNob3VsZENsb3NlKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25TcGFjZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd0Rvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldChmYWxzZSk7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHROZXh0SXRlbSgrMSwgZXZlbnQuc2hpZnRLZXkpO1xuICAgIGlmIChyZWNlbnRseUhpZ2hsaWdodGVkKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd1VwUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZC5zZXQoZmFsc2UpO1xuXG4gICAgY29uc3QgcmVjZW50bHlIaWdobGlnaHRlZCA9IHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0TmV4dEl0ZW0oLTEsIGV2ZW50LnNoaWZ0S2V5KTtcbiAgICBpZiAocmVjZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uSG9tZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNPcGVuKCkgfHxcbiAgICAgICh0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kICE9PSAwICYmIHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPT0gMClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgIGlmICghcmVjZW50bHlIaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uRW5kUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc09wZW4oKSB8fFxuICAgICAgKHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCAmJlxuICAgICAgICB0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodExhc3RJdGVtKCk7XG4gICAgaWYgKCFyZWNlbnRseUhpZ2hsaWdodGVkKSByZXR1cm47XG5cbiAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGVybSgpIHx8ICF0aGlzLmNsZWFyYWJsZSgpIHx8IHRoaXMubm9CYWNrc3BhY2VDbGVhcigpIHx8ICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiYgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fY2xlYXJMYXN0SXRlbSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFsbEl0ZW1zKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25DdHJsQVByZXNzKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0QWxsSXRlbXMoKTtcbiAgfVxufVxuIiwiPGFyZC1mb3JtLWZpZWxkLWZyYW1lXHJcbiAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZSgpXCJcclxuICBbdmFyaWFudF09XCJ2YXJpYW50KClcIlxyXG4gIFtjb21wYWN0XT1cImNvbXBhY3QoKVwiXHJcbiAgW2lzRm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxyXG4gIFtwcmVmaXhUZW1wbGF0ZV09XCJwcmVmaXhUZW1wbGF0ZSgpPy50ZW1wbGF0ZVwiXHJcbiAgW3N1ZmZpeFRlbXBsYXRlXT1cInN1ZmZpeFRlbXBsYXRlKCk/LnRlbXBsYXRlXCJcclxuPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiYXJkLXNlbGVjdFwiXHJcbiAgICAjZHJvcGRvd25Ib3N0XHJcbiAgICAoY2xpY2spPVwiaGFuZGxlQW55d2hlcmVDbGljaygkZXZlbnQpXCJcclxuICAgIFtjbGFzcy5hcmQtaGFzLXZhbHVlXT1cIml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKClcIlxyXG4gICAgW25nQ2xhc3NdPVwibmdDbGFzc2VzKClcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VsZWN0LXZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgICBAaWYgKHNob3VsZERpc3BsYXlQbGFjZWhvbGRlcigpKSB7XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcclxuICAgICAgICAgIGxldC1wbGNobGRyXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1wbGFjZWhvbGRlclwiPnt7IHBsY2hsZHIgfX08L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFBsYWNlaG9sZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAoc2hvdWxkRGlzcGxheVZhbHVlKCkpIHtcclxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1TdG9yYWdlLnNlbGVjdGVkSXRlbXMoKTsgdHJhY2sgaXRlbS5pbmRleCgpKSB7XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLXNlbGVjdC12YWx1ZVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hcmQtdmFsdWUtZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgW2F0dHIuaGlkZGVuXT1cIiFpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KCRpbmRleClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmFsdWVXaXRoaW5EaXNwbGF5TGltaXQoJGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidmFsdWVUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCAobXVsdGlzZWxlY3RhYmxlKCkgPyBkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlIDogZGVmYXVsdFZhbHVlVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0VmFsdWVDb250ZXh0KGl0ZW0pXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdFZhbHVlVGVtcGxhdGVcclxuICAgICAgICAgIGxldC1pdGVtXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cIml0ZW0ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiXHJcbiAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICNkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlXHJcbiAgICAgICAgICBsZXQtaXRlbVxyXG4gICAgICAgICAgbGV0LXVuc2VsZWN0PVwidW5zZWxlY3RcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxhcmQtZGVsZXRhYmxlLWNoaXBcclxuICAgICAgICAgICAgKGRlbGV0ZSk9XCJ1bnNlbGVjdChpdGVtKVwiXHJcbiAgICAgICAgICAgIFt2YXJpYW50XT1cInZhcmlhbnQoKVwiXHJcbiAgICAgICAgICAgIGNvbXBhY3RcclxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkLXN0cm9uZ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cIml0ZW0ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgICAgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCJcclxuICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIFRPRE8gY2hlY2sgaWYgY2FuIHJlbW92ZSBkaXYgLS0+XHJcbiAgICAgICAgICA8L2FyZC1kZWxldGFibGUtY2hpcD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKGl0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKCkgJiYgc2hvdWxkU2hvd0l0ZW1EaXNwbGF5TGltaXQoKSkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3ZlcmZsb3ctaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SXRlbURpc3BsYXlMaW1pdENvbnRleHQoKVwiXHJcbiAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAjZGVmYXVsdEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZVxyXG4gICAgICAgICAgICBsZXQtY291bnQ9XCJvdmVyZmxvd0NvdW50XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdj57eyBjb3VudCB9fSBtb3JlLi4uPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJhcmQtc2VhcmNoLWlucHV0XCJcclxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxyXG4gICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcclxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcclxuICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwiaXNPcGVuKCkgPyBodG1sSWQoKSA6IG51bGxcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAjc2VhcmNoSW5wdXRcclxuICAgICAgICAgICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICBbYXR0ci5pZF09XCJzZWFyY2hJbnB1dElkKClcIlxyXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwidGFiSW5kZXgoKVwiXHJcbiAgICAgICAgICBbcmVhZG9ubHldPVwiaXNJbnB1dEVsZW1lbnRSZWFkb25seSgpXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtKClcIlxyXG4gICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaXNPcGVuKCkgPyBodG1sSWQoKSA6IG51bGxcIlxyXG4gICAgICAgICAgKGlucHV0KT1cImZpbHRlcihzZWFyY2hJbnB1dC52YWx1ZSlcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoZm9jdXMpPVwib25TZWFyY2hJbnB1dEZvY3VzKClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25TZWFyY2hJbnB1dEJsdXIoKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc2ltcGxlLXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1NwaW5uZXJUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZVwiIC8+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAoc2hvdWxkU2hvd0NsZWFyQnV0dG9uKCkpIHtcclxuICAgICAgICA8YXJkLWNsZWFyLWJ1dHRvblxyXG4gICAgICAgICAgW3RpdGxlXT1cImNsZWFyQnV0dG9uVGl0bGUoKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xlYXJCdXR0b25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3ctd3JhcHBlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZURyb3Bkb3duQXJyb3dDbGljaygkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtaGl0Ym94XCI+PC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvYXJkLWZvcm0tZmllbGQtZnJhbWU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duVGVtcGxhdGU+XHJcbiAgPGFyZC1kcm9wZG93bi1wYW5lbFxyXG4gICAgY2xhc3M9XCJhcmQtZHJvcGRvd24tcGFuZWwgYXJkLXNlbGVjdC1kcm9wZG93bi1wYW5lbFwiXHJcbiAgICByb2xlPVwibGlzdGJveFwiXHJcbiAgICBhcmlhLWxhYmVsPVwiT3B0aW9ucyBsaXN0XCJcclxuICAgIFtoZWFkZXJUZW1wbGF0ZV09XCJkcm9wZG93bkhlYWRlclRlbXBsYXRlKCk/LnRlbXBsYXRlID8/IG51bGxcIlxyXG4gICAgW2Zvb3RlclRlbXBsYXRlXT1cImRyb3Bkb3duRm9vdGVyVGVtcGxhdGUoKT8udGVtcGxhdGUgPz8gbnVsbFwiXHJcbiAgICBbYXBwZWFyYW5jZV09XCJkcm9wZG93bkFwcGVhcmFuY2VPckRlZmF1bHQoKVwiXHJcbiAgICBbdmFyaWFudF09XCJkcm9wZG93blZhcmlhbnRPckRlZmF1bHQoKVwiXHJcbiAgICBbaXNPcGVuXT1cInRydWVcIlxyXG4gICAgW2ZpbHRlclZhbHVlXT1cInNlYXJjaFRlcm0oKVwiXHJcbiAgICBbcGFuZWxJZF09XCJodG1sSWQoKVwiXHJcbiAgICBbY29tcGFjdF09XCJjb21wYWN0KClcIlxyXG4gICAgKGFyZENsaWNrT3V0c2lkZSk9XCJoYW5kbGVPdXRzaWRlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAobW91c2Vtb3ZlKT1cIm9uTW91c2VNb3ZlKClcIlxyXG4gICAgKHNjcm9sbCk9XCJzY3JvbGxFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgKHNjcm9sbFRvRW5kKT1cInNjcm9sbFRvRW5kRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICA+XHJcbiAgICBAaWYgKCFzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCkpIHtcclxuICAgICAgQGZvciAoZ3JvdXAgb2YgaXRlbVN0b3JhZ2UuZ3JvdXBzKCk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGdyb3VwXCJcclxuICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICBbY2xhc3MuYXJkLWdyb3VwLWRpc2FibGVkXT1cImdyb3VwLmRpc2FibGVkKClcIlxyXG4gICAgICAgICAgW2NsYXNzLmFyZC1ncm91cC1zZWxlY3RlZF09XCJncm91cC5zZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5hcmQtZ3JvdXAtaGlnaGxpZ2h0ZWRdPVwiZ3JvdXAuaGlnaGxpZ2h0ZWQoKVwiXHJcbiAgICAgICAgICAobW91c2VvdmVyKT1cIm9uR3JvdXBNb3VzZW92ZXIoZ3JvdXApXCJcclxuICAgICAgICAgIChjbGljayk9XCJvbkdyb3VwQ2xpY2soZ3JvdXApXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBAaWYgKGdyb3VwLmxhYmVsKCkgIT09ICcnICYmIGdyb3VwLmxhYmVsKCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAjZGVmYXVsdE9wdGdyb3VwVGVtcGxhdGVcclxuICAgICAgICAgICAgICBsZXQtZ3JvdXBcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1vcHRncm91cC1sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cImdyb3VwLmxhYmVsKClcIlxyXG4gICAgICAgICAgICAgICAgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCJcclxuICAgICAgICAgICAgICA+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0Z3JvdXBUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0T3B0Z3JvdXBUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEdyb3VwQ29udGV4dChncm91cClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0Z3JvdXAtY2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGdyb3VwLmNoaWxkcmVuKCk7IHRyYWNrIG9wdGlvbi5pbmRleCgpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24tZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24tc2VsZWN0ZWRdPVwib3B0aW9uLnNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24taGlnaGxpZ2h0ZWRdPVwib3B0aW9uLmhpZ2hsaWdodGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24taGlnaGxpZ2h0ZWQtcmVjZW50XT1cIm9wdGlvbi5oaWdobGlnaHRlZF9yZWNlbnRseSgpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwib3B0aW9uLnNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiaHRtbElkKCkgKyAnLScgKyBvcHRpb24uaW5kZXgoKVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2sob3B0aW9uLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25JdGVtTW91c2VPdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VFbnRlcihvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25JdGVtTW91c2VMZWF2ZShvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0aW9uLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICNkZWZhdWx0T3B0aW9uVGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBsZXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgW2FyZElubmVySFRNTF09XCJvcHRpb24ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25UZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0T3B0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRPcHRpb25Db250ZXh0KG9wdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCkpIHtcclxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Tm9JdGVtc0ZvdW5kVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7IG5vSXRlbXNGb3VuZFRleHQoKSB9fTwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9JdGVtc0ZvdW5kVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlXCJcclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0U2VhcmNoQ29udGV4dCgpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKHNob3VsZFNob3dBZGRDdXN0b20oKSkge1xyXG4gICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAjZGVmYXVsdEFkZEN1c3RvbVRlbXBsYXRlXHJcbiAgICAgICAgbGV0LXNlYXJjaFRlcm1cclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGlvbiBhcmQtb3B0aW9uLWhpZ2hsaWdodGVkIGFyZC1hZGQtY3VzdG9tXCJcclxuICAgICAgICAgIChjbGljayk9XCJhZGRDdXN0b21PcHRpb24oc2VhcmNoVGVybSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tbGFiZWxcIj5BZGQgb3B0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcmQtYWRkLWN1c3RvbS12YWx1ZVwiPlwie3sgc2VhcmNoVGVybSB9fVwiPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkQ3VzdG9tVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdEFkZEN1c3RvbVRlbXBsYXRlXCJcclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCgpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKGlzTG9hZGluZygpKSB7XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0aW9uIGFyZC1vcHRpb24tZGlzYWJsZWRcIj57eyBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0KCkgfX08L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFNlYXJjaENvbnRleHQoKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcbiAgPC9hcmQtZHJvcGRvd24tcGFuZWw+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==