@acorex/components 7.5.0 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/action-sheet/index.d.ts +1 -1
  2. package/action-sheet/lib/action-sheet.component.d.ts +3 -3
  3. package/avatar/index.d.ts +1 -1
  4. package/badge/lib/badge.component.d.ts +3 -3
  5. package/breadcrumbs/index.d.ts +2 -2
  6. package/breadcrumbs/lib/breadcrumbs-item.component.d.ts +1 -1
  7. package/button/lib/button-item.class.d.ts +1 -1
  8. package/button/lib/button-item.component.d.ts +3 -1
  9. package/button/lib/button.component.d.ts +1 -1
  10. package/calendar/lib/calendar.class.d.ts +1 -1
  11. package/calendar/lib/calendar.component.d.ts +6 -4
  12. package/chips/lib/chips.component.d.ts +1 -1
  13. package/collapse/lib/collapse-group.component.d.ts +9 -6
  14. package/collapse/lib/collapse.component.d.ts +21 -8
  15. package/collapse/lib/collapse.module.d.ts +2 -1
  16. package/color-box/lib/color-box.component.d.ts +2 -2
  17. package/color-palette/lib/color-palette-input.component.d.ts +3 -3
  18. package/color-palette/lib/color-palette-picker.component.d.ts +1 -1
  19. package/color-palette/lib/color-palette.class.d.ts +4 -4
  20. package/common/index.d.ts +1 -1
  21. package/common/lib/classes/datasource.class.d.ts +55 -0
  22. package/common/lib/classes/styles.class.d.ts +2 -3
  23. package/common/lib/components/colorlook-component.class.d.ts +2 -2
  24. package/common/lib/components/input-base-value-component.class.d.ts +12 -12
  25. package/common/lib/components/interactive-component.class.d.ts +1 -7
  26. package/common/lib/components/selection-base.component.class.d.ts +5 -6
  27. package/common/lib/directives/delayed-value-changed.directive.d.ts +5 -5
  28. package/common/lib/directives/hotkey.directive.d.ts +2 -2
  29. package/common/lib/directives/responsive.directive.d.ts +1 -1
  30. package/common/lib/directives/ripple.directive.d.ts +2 -1
  31. package/data-table/lib/data-table.component.d.ts +2 -2
  32. package/datetime-box/lib/datetime-box.component.d.ts +4 -3
  33. package/datetime-input/lib/datetime-input.component.d.ts +2 -1
  34. package/datetime-picker/index.d.ts +1 -1
  35. package/datetime-picker/lib/datetime-picker.component.d.ts +1 -2
  36. package/dropdown/lib/dropdown-box.component.d.ts +5 -3
  37. package/dropdown/lib/dropdown-panel.component.d.ts +1 -0
  38. package/esm2022/action-sheet/index.mjs +2 -2
  39. package/esm2022/action-sheet/lib/action-sheet.class.mjs +1 -1
  40. package/esm2022/action-sheet/lib/action-sheet.component.mjs +22 -14
  41. package/esm2022/action-sheet/lib/action-sheet.module.mjs +3 -3
  42. package/esm2022/action-sheet/lib/action-sheet.service.mjs +5 -5
  43. package/esm2022/alert/lib/alert.component.mjs +4 -5
  44. package/esm2022/avatar/index.mjs +2 -2
  45. package/esm2022/avatar/lib/avatar-group.component.mjs +1 -1
  46. package/esm2022/avatar/lib/avatar.component.mjs +4 -4
  47. package/esm2022/badge/lib/badge.component.mjs +6 -6
  48. package/esm2022/badge/lib/badge.module.mjs +2 -2
  49. package/esm2022/breadcrumbs/index.mjs +3 -3
  50. package/esm2022/breadcrumbs/lib/breadcrumbs-item.class.mjs +1 -1
  51. package/esm2022/breadcrumbs/lib/breadcrumbs-item.component.mjs +2 -2
  52. package/esm2022/breadcrumbs/lib/breadcrumbs.component.mjs +1 -1
  53. package/esm2022/breadcrumbs/lib/breadcrumbs.module.mjs +3 -3
  54. package/esm2022/button/lib/button-item.class.mjs +1 -1
  55. package/esm2022/button/lib/button-item.component.mjs +12 -3
  56. package/esm2022/button/lib/button.component.mjs +3 -3
  57. package/esm2022/button-group/lib/button-group.component.mjs +3 -3
  58. package/esm2022/button-group/lib/button-group.module.mjs +2 -2
  59. package/esm2022/calendar/lib/calendar-range.component.mjs +4 -7
  60. package/esm2022/calendar/lib/calendar.class.mjs +3 -68
  61. package/esm2022/calendar/lib/calendar.component.mjs +53 -43
  62. package/esm2022/calendar/lib/calendar.module.mjs +4 -4
  63. package/esm2022/check-box/lib/check-box.component.mjs +9 -9
  64. package/esm2022/check-box/lib/check-box.module.mjs +3 -3
  65. package/esm2022/chips/lib/chips.component.mjs +6 -6
  66. package/esm2022/chips/lib/chips.module.mjs +2 -2
  67. package/esm2022/collapse/lib/collapse-group.component.mjs +23 -14
  68. package/esm2022/collapse/lib/collapse.component.mjs +68 -20
  69. package/esm2022/collapse/lib/collapse.module.mjs +7 -6
  70. package/esm2022/color-box/lib/color-box.component.mjs +7 -7
  71. package/esm2022/color-box/lib/color-box.module.mjs +4 -4
  72. package/esm2022/color-palette/lib/color-palette-input.component.mjs +10 -14
  73. package/esm2022/color-palette/lib/color-palette-picker.component.mjs +29 -31
  74. package/esm2022/color-palette/lib/color-palette-preview.component.mjs +8 -16
  75. package/esm2022/color-palette/lib/color-palette-swatches.component.mjs +5 -5
  76. package/esm2022/color-palette/lib/color-palette.class.mjs +2 -2
  77. package/esm2022/color-palette/lib/color-palette.component.mjs +14 -6
  78. package/esm2022/color-palette/lib/color-palette.module.mjs +12 -12
  79. package/esm2022/common/index.mjs +2 -2
  80. package/esm2022/common/lib/classes/components.class.mjs +1 -1
  81. package/esm2022/common/lib/classes/datalist.class.mjs +1 -53
  82. package/esm2022/common/lib/classes/datasource.class.mjs +106 -0
  83. package/esm2022/common/lib/classes/styles.class.mjs +2 -10
  84. package/esm2022/common/lib/common.module.mjs +4 -2
  85. package/esm2022/common/lib/components/button-base-component.class.mjs +4 -4
  86. package/esm2022/common/lib/components/color-component.class.mjs +2 -2
  87. package/esm2022/common/lib/components/colorlook-component.class.mjs +4 -4
  88. package/esm2022/common/lib/components/input-base-value-component.class.mjs +15 -15
  89. package/esm2022/common/lib/components/interactive-component.class.mjs +13 -13
  90. package/esm2022/common/lib/components/look-component.class.mjs +2 -2
  91. package/esm2022/common/lib/components/selection-base.component.class.mjs +63 -29
  92. package/esm2022/common/lib/components/value-component.class.mjs +3 -3
  93. package/esm2022/common/lib/directives/auto-focus.directive.mjs +4 -12
  94. package/esm2022/common/lib/directives/delayed-value-changed.directive.mjs +16 -14
  95. package/esm2022/common/lib/directives/hotkey.directive.mjs +14 -15
  96. package/esm2022/common/lib/directives/infinite-scroll.directive.mjs +7 -9
  97. package/esm2022/common/lib/directives/responsive.directive.mjs +12 -10
  98. package/esm2022/common/lib/directives/ripple.directive.mjs +14 -8
  99. package/esm2022/common/lib/services/dom.service.mjs +2 -2
  100. package/esm2022/common/lib/services/hotkey.service.mjs +4 -5
  101. package/esm2022/common/lib/types/direction.mjs +1 -1
  102. package/esm2022/common/lib/types/orientation.mjs +1 -1
  103. package/esm2022/common/lib/types/placement.mjs +23 -23
  104. package/esm2022/common/lib/types/range.mjs +1 -1
  105. package/esm2022/data-pager/lib/data-pager-info.component.mjs +3 -3
  106. package/esm2022/data-pager/lib/data-pager-input-selector.component.mjs +1 -1
  107. package/esm2022/data-pager/lib/data-pager-next-buttons.components.mjs +21 -8
  108. package/esm2022/data-pager/lib/data-pager-numeric-selector.component.mjs +3 -3
  109. package/esm2022/data-pager/lib/data-pager-pagesize-dropdown.component.mjs +17 -5
  110. package/esm2022/data-pager/lib/data-pager-prev-buttons.component.mjs +19 -7
  111. package/esm2022/data-pager/lib/data-pager.component.mjs +2 -2
  112. package/esm2022/data-pager/lib/data-pager.module.mjs +30 -16
  113. package/esm2022/data-table/lib/data-column.directive.mjs +2 -2
  114. package/esm2022/data-table/lib/data-table.component.mjs +2 -2
  115. package/esm2022/data-table/lib/data-table.module.mjs +7 -7
  116. package/esm2022/datetime-box/lib/datetime-box.component.mjs +10 -7
  117. package/esm2022/datetime-box/lib/datetime-box.module.mjs +7 -7
  118. package/esm2022/datetime-input/lib/datetime-input.component.mjs +144 -137
  119. package/esm2022/datetime-input/lib/datetime-input.module.mjs +4 -4
  120. package/esm2022/datetime-picker/index.mjs +2 -2
  121. package/esm2022/datetime-picker/lib/datetime-picker.component.mjs +4 -4
  122. package/esm2022/datetime-picker/lib/datetime-picker.config.mjs +4 -4
  123. package/esm2022/decorators/lib/components/clear-button.component.mjs +2 -2
  124. package/esm2022/decorators/lib/components/close-button.component.mjs +8 -4
  125. package/esm2022/decorators/lib/components/generic-content.component.mjs +1 -1
  126. package/esm2022/decorators/lib/components/icon.component.mjs +2 -2
  127. package/esm2022/dialog/lib/dialog.component.mjs +3 -3
  128. package/esm2022/dialog/lib/dialog.module.mjs +26 -10
  129. package/esm2022/drawer/lib/drawer-container.component.mjs +2 -2
  130. package/esm2022/drawer/lib/drawer.component.mjs +2 -2
  131. package/esm2022/drawer/lib/drawer.module.mjs +3 -3
  132. package/esm2022/dropdown/lib/dropdown-box.class.mjs +1 -1
  133. package/esm2022/dropdown/lib/dropdown-box.component.mjs +14 -11
  134. package/esm2022/dropdown/lib/dropdown-panel.component.mjs +5 -4
  135. package/esm2022/dropdown/lib/dropdown.module.mjs +29 -9
  136. package/esm2022/form/index.mjs +2 -2
  137. package/esm2022/form/lib/form-field.component.mjs +4 -4
  138. package/esm2022/form/lib/form.component.mjs +3 -4
  139. package/esm2022/form/lib/form.config.mjs +6 -6
  140. package/esm2022/form/lib/form.module.mjs +3 -11
  141. package/esm2022/form/lib/validation-summary.component.mjs +40 -30
  142. package/esm2022/form/lib/validation.class.mjs +1 -1
  143. package/esm2022/image/lib/image.component.mjs +1 -1
  144. package/esm2022/image/lib/image.module.mjs +2 -2
  145. package/esm2022/label/lib/label.component.mjs +4 -8
  146. package/esm2022/label/lib/label.module.mjs +2 -2
  147. package/esm2022/list/lib/list.component.mjs +77 -80
  148. package/esm2022/list/lib/list.module.mjs +3 -3
  149. package/esm2022/loading/index.mjs +2 -2
  150. package/esm2022/loading/lib/loading-spinner.component.mjs +13 -7
  151. package/esm2022/loading/lib/loading.component.mjs +8 -16
  152. package/esm2022/loading/lib/loading.config.mjs +2 -2
  153. package/esm2022/loading/lib/loading.directive.mjs +2 -2
  154. package/esm2022/menu/index.mjs +1 -2
  155. package/esm2022/menu/lib/class/root-menu.class.mjs +1 -1
  156. package/esm2022/menu/lib/menu-item/menu-item.component.mjs +60 -19
  157. package/esm2022/menu/lib/menu.component.mjs +37 -342
  158. package/esm2022/menu/lib/menu.module.mjs +3 -4
  159. package/esm2022/mixin/lib/base-components.class.mjs +2 -3
  160. package/esm2022/mixin/lib/base-menu-mixin.class.mjs +1 -1
  161. package/esm2022/mixin/lib/button-mixin.class.mjs +1 -1
  162. package/esm2022/mixin/lib/clickable-mixin.class.mjs +8 -8
  163. package/esm2022/mixin/lib/color-look-mixing.class.mjs +3 -3
  164. package/esm2022/mixin/lib/constratctor.mjs +1 -1
  165. package/esm2022/mixin/lib/datalist-component.class.mjs +3 -5
  166. package/esm2022/mixin/lib/datalist.class.mjs +5 -6
  167. package/esm2022/mixin/lib/dropdown-mixin.class.mjs +2 -4
  168. package/esm2022/mixin/lib/interactive-mixin.class.mjs +29 -28
  169. package/esm2022/mixin/lib/mixin.class.mjs +13 -13
  170. package/esm2022/mixin/lib/page-component.class.mjs +3 -3
  171. package/esm2022/mixin/lib/selection-component.class.mjs +1 -1
  172. package/esm2022/mixin/lib/textbox-mixin.class.mjs +29 -20
  173. package/esm2022/mixin/lib/value-mixin.class.mjs +1 -1
  174. package/esm2022/notification/index.mjs +2 -2
  175. package/esm2022/notification/lib/notification.class.mjs +1 -1
  176. package/esm2022/notification/lib/notification.component.mjs +2 -2
  177. package/esm2022/notification/lib/notification.config.mjs +1 -1
  178. package/esm2022/notification/lib/notification.module.mjs +21 -9
  179. package/esm2022/notification/lib/notification.service.mjs +11 -11
  180. package/esm2022/number-box/lib/number-box.component.mjs +6 -6
  181. package/esm2022/number-box/lib/number-box.module.mjs +6 -16
  182. package/esm2022/otp/lib/otp.component.mjs +6 -5
  183. package/esm2022/otp/lib/otp.module.mjs +5 -4
  184. package/esm2022/page/lib/base-page.class.mjs +6 -4
  185. package/esm2022/page/lib/page.component.mjs +3 -3
  186. package/esm2022/page/lib/page.module.mjs +1 -1
  187. package/esm2022/password-box/lib/password-box.component.mjs +6 -6
  188. package/esm2022/password-box/lib/password-box.module.mjs +7 -15
  189. package/esm2022/picker/lib/picker-column.directive.mjs +9 -16
  190. package/esm2022/picker/lib/picker.component.mjs +2 -2
  191. package/esm2022/picker/lib/picker.module.mjs +3 -3
  192. package/esm2022/popover/lib/popover.component.mjs +1 -1
  193. package/esm2022/popover/lib/popover.module.mjs +2 -2
  194. package/esm2022/popup/index.mjs +2 -2
  195. package/esm2022/popup/lib/popup.interface.mjs +1 -1
  196. package/esm2022/popup/lib/popup.module.mjs +2 -2
  197. package/esm2022/progress-bar/lib/progress-bar.component.mjs +5 -5
  198. package/esm2022/progress-bar/lib/progress-bar.module.mjs +2 -2
  199. package/esm2022/radio/lib/radio.component.mjs +8 -8
  200. package/esm2022/radio/lib/radio.module.mjs +2 -2
  201. package/esm2022/range-slider/lib/range-slider.component.mjs +9 -9
  202. package/esm2022/range-slider/lib/range-slider.module.mjs +4 -4
  203. package/esm2022/result/lib/result.component.mjs +4 -4
  204. package/esm2022/result/lib/result.module.mjs +2 -2
  205. package/esm2022/routing-progress/acorex-components-routing-progress.mjs +5 -0
  206. package/esm2022/routing-progress/index.mjs +3 -0
  207. package/esm2022/routing-progress/lib/routing-progress.component.mjs +58 -0
  208. package/esm2022/routing-progress/lib/routing-progress.module.mjs +21 -0
  209. package/esm2022/scheduler/lib/scheduler-month-view.component.mjs +4 -2
  210. package/esm2022/scheduler/lib/scheduler.component.mjs +1 -1
  211. package/esm2022/search-box/lib/search-box.component.mjs +45 -20
  212. package/esm2022/search-box/lib/search-box.module.mjs +8 -8
  213. package/esm2022/select-box/index.mjs +2 -2
  214. package/esm2022/select-box/lib/select-box.component.mjs +168 -308
  215. package/esm2022/select-box/lib/select-box.module.mjs +12 -13
  216. package/esm2022/selection-list/lib/selection-list.component.mjs +20 -10
  217. package/esm2022/selection-list/lib/selection-list.module.mjs +6 -6
  218. package/esm2022/side-menu/acorex-components-side-menu.mjs +5 -0
  219. package/esm2022/side-menu/index.mjs +4 -0
  220. package/esm2022/side-menu/lib/side-menu-item/side-menu-item.compoent.mjs +116 -0
  221. package/esm2022/side-menu/lib/side-menu.component.mjs +15 -0
  222. package/esm2022/side-menu/lib/side-menu.module.mjs +23 -0
  223. package/esm2022/skeleton/acorex-components-skeleton.mjs +5 -0
  224. package/esm2022/skeleton/index.mjs +3 -0
  225. package/esm2022/skeleton/lib/skeleton.component.mjs +24 -0
  226. package/esm2022/skeleton/lib/skeleton.module.mjs +18 -0
  227. package/esm2022/switch/lib/switch-content.component.mjs +1 -1
  228. package/esm2022/switch/lib/switch.component.mjs +11 -18
  229. package/esm2022/switch/lib/switch.module.mjs +4 -4
  230. package/esm2022/tabs/lib/tab-content.directive.mjs +1 -1
  231. package/esm2022/tabs/lib/tab-item.component.mjs +9 -2
  232. package/esm2022/tabs/lib/tabs.component.mjs +2 -2
  233. package/esm2022/tabs/lib/tabs.module.mjs +5 -5
  234. package/esm2022/tag/lib/tag.component.mjs +7 -13
  235. package/esm2022/tag/lib/tag.module.mjs +2 -2
  236. package/esm2022/text-area/lib/text-area.component.mjs +14 -16
  237. package/esm2022/text-area/lib/text-area.module.mjs +2 -2
  238. package/esm2022/text-box/lib/text-box.component.mjs +6 -6
  239. package/esm2022/text-box/lib/text-box.module.mjs +4 -18
  240. package/esm2022/toast/index.mjs +2 -2
  241. package/esm2022/toast/lib/toast.class.mjs +1 -1
  242. package/esm2022/toast/lib/toast.component.mjs +4 -4
  243. package/esm2022/toast/lib/toast.config.mjs +3 -3
  244. package/esm2022/toast/lib/toast.module.mjs +6 -10
  245. package/esm2022/toast/lib/toast.service.mjs +16 -14
  246. package/esm2022/tooltip/lib/tooltip.component.mjs +2 -2
  247. package/esm2022/tooltip/lib/tooltip.directive.mjs +4 -4
  248. package/esm2022/tooltip/lib/tooltip.module.mjs +3 -3
  249. package/esm2022/uploader/index.mjs +3 -1
  250. package/esm2022/uploader/lib/uploader-drop-zone.component.mjs +3 -3
  251. package/esm2022/uploader/lib/uploader-list.component.mjs +41 -7
  252. package/esm2022/uploader/lib/uploader-overlay.component.mjs +2 -2
  253. package/esm2022/uploader/lib/uploader-zone.directive.mjs +53 -0
  254. package/esm2022/uploader/lib/uploader.module.mjs +26 -7
  255. package/esm2022/uploader/lib/uploader.service.mjs +30 -0
  256. package/fesm2022/acorex-components-action-sheet.mjs +23 -15
  257. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  258. package/fesm2022/acorex-components-alert.mjs +3 -4
  259. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  260. package/fesm2022/acorex-components-avatar.mjs +16 -16
  261. package/fesm2022/acorex-components-avatar.mjs.map +1 -1
  262. package/fesm2022/acorex-components-badge.mjs +5 -5
  263. package/fesm2022/acorex-components-badge.mjs.map +1 -1
  264. package/fesm2022/acorex-components-breadcrumbs.mjs.map +1 -1
  265. package/fesm2022/acorex-components-button-group.mjs +2 -2
  266. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  267. package/fesm2022/acorex-components-button.mjs +13 -4
  268. package/fesm2022/acorex-components-button.mjs.map +1 -1
  269. package/fesm2022/acorex-components-calendar.mjs +52 -110
  270. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  271. package/fesm2022/acorex-components-check-box.mjs +9 -9
  272. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  273. package/fesm2022/acorex-components-chips.mjs +5 -5
  274. package/fesm2022/acorex-components-chips.mjs.map +1 -1
  275. package/fesm2022/acorex-components-collapse.mjs +92 -34
  276. package/fesm2022/acorex-components-collapse.mjs.map +1 -1
  277. package/fesm2022/acorex-components-color-box.mjs +6 -6
  278. package/fesm2022/acorex-components-color-box.mjs.map +1 -1
  279. package/fesm2022/acorex-components-color-palette.mjs +53 -59
  280. package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
  281. package/fesm2022/acorex-components-common.mjs +277 -223
  282. package/fesm2022/acorex-components-common.mjs.map +1 -1
  283. package/fesm2022/acorex-components-data-pager.mjs +70 -19
  284. package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
  285. package/fesm2022/acorex-components-data-table.mjs +1 -1
  286. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  287. package/fesm2022/acorex-components-datetime-box.mjs +10 -7
  288. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  289. package/fesm2022/acorex-components-datetime-input.mjs +143 -136
  290. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  291. package/fesm2022/acorex-components-datetime-picker.mjs +9 -9
  292. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  293. package/fesm2022/acorex-components-decorators.mjs +8 -4
  294. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  295. package/fesm2022/acorex-components-dialog.mjs +20 -4
  296. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  297. package/fesm2022/acorex-components-drawer.mjs +1 -1
  298. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  299. package/fesm2022/acorex-components-dropdown.mjs +43 -19
  300. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  301. package/fesm2022/acorex-components-form.mjs +76 -75
  302. package/fesm2022/acorex-components-form.mjs.map +1 -1
  303. package/fesm2022/acorex-components-image.mjs.map +1 -1
  304. package/fesm2022/acorex-components-label.mjs +2 -6
  305. package/fesm2022/acorex-components-label.mjs.map +1 -1
  306. package/fesm2022/acorex-components-list.mjs +77 -80
  307. package/fesm2022/acorex-components-list.mjs.map +1 -1
  308. package/fesm2022/acorex-components-loading.mjs +19 -21
  309. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  310. package/fesm2022/acorex-components-menu.mjs +78 -382
  311. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  312. package/fesm2022/acorex-components-mixin.mjs +70 -66
  313. package/fesm2022/acorex-components-mixin.mjs.map +1 -1
  314. package/fesm2022/acorex-components-notification.mjs +45 -33
  315. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  316. package/fesm2022/acorex-components-number-box.mjs +7 -17
  317. package/fesm2022/acorex-components-number-box.mjs.map +1 -1
  318. package/fesm2022/acorex-components-otp.mjs +8 -6
  319. package/fesm2022/acorex-components-otp.mjs.map +1 -1
  320. package/fesm2022/acorex-components-page.mjs +6 -4
  321. package/fesm2022/acorex-components-page.mjs.map +1 -1
  322. package/fesm2022/acorex-components-password-box.mjs +7 -15
  323. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  324. package/fesm2022/acorex-components-picker.mjs +10 -17
  325. package/fesm2022/acorex-components-picker.mjs.map +1 -1
  326. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  327. package/fesm2022/acorex-components-popup.mjs +1 -1
  328. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  329. package/fesm2022/acorex-components-progress-bar.mjs +3 -3
  330. package/fesm2022/acorex-components-progress-bar.mjs.map +1 -1
  331. package/fesm2022/acorex-components-radio.mjs +6 -6
  332. package/fesm2022/acorex-components-radio.mjs.map +1 -1
  333. package/fesm2022/acorex-components-range-slider.mjs +7 -7
  334. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  335. package/fesm2022/acorex-components-result.mjs +2 -2
  336. package/fesm2022/acorex-components-result.mjs.map +1 -1
  337. package/fesm2022/acorex-components-routing-progress.mjs +83 -0
  338. package/fesm2022/acorex-components-routing-progress.mjs.map +1 -0
  339. package/fesm2022/acorex-components-scheduler.mjs +3 -1
  340. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  341. package/fesm2022/acorex-components-search-box.mjs +48 -25
  342. package/fesm2022/acorex-components-search-box.mjs.map +1 -1
  343. package/fesm2022/acorex-components-select-box.mjs +171 -401
  344. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  345. package/fesm2022/acorex-components-selection-list.mjs +22 -12
  346. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  347. package/fesm2022/acorex-components-side-menu.mjs +153 -0
  348. package/fesm2022/acorex-components-side-menu.mjs.map +1 -0
  349. package/fesm2022/acorex-components-skeleton.mjs +46 -0
  350. package/fesm2022/acorex-components-skeleton.mjs.map +1 -0
  351. package/fesm2022/acorex-components-switch.mjs +9 -16
  352. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  353. package/fesm2022/acorex-components-tabs.mjs +11 -4
  354. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  355. package/fesm2022/acorex-components-tag.mjs +5 -11
  356. package/fesm2022/acorex-components-tag.mjs.map +1 -1
  357. package/fesm2022/acorex-components-text-area.mjs +13 -15
  358. package/fesm2022/acorex-components-text-area.mjs.map +1 -1
  359. package/fesm2022/acorex-components-text-box.mjs +8 -22
  360. package/fesm2022/acorex-components-text-box.mjs.map +1 -1
  361. package/fesm2022/acorex-components-toast.mjs +43 -45
  362. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  363. package/fesm2022/acorex-components-tooltip.mjs +2 -2
  364. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  365. package/fesm2022/acorex-components-uploader.mjs +146 -18
  366. package/fesm2022/acorex-components-uploader.mjs.map +1 -1
  367. package/form/index.d.ts +1 -1
  368. package/form/lib/form.component.d.ts +2 -2
  369. package/form/lib/validation-summary.component.d.ts +3 -3
  370. package/list/lib/list.component.d.ts +26 -27
  371. package/loading/index.d.ts +1 -1
  372. package/loading/lib/loading.component.d.ts +1 -1
  373. package/menu/index.d.ts +0 -1
  374. package/menu/lib/class/root-menu.class.d.ts +2 -0
  375. package/menu/lib/menu-item/menu-item.component.d.ts +19 -6
  376. package/menu/lib/menu.component.d.ts +10 -40
  377. package/menu/lib/menu.module.d.ts +7 -8
  378. package/mixin/lib/base-components.class.d.ts +2 -2
  379. package/mixin/lib/base-menu-mixin.class.d.ts +5 -5
  380. package/mixin/lib/button-mixin.class.d.ts +2 -2
  381. package/mixin/lib/clickable-mixin.class.d.ts +9 -9
  382. package/mixin/lib/color-look-mixing.class.d.ts +2 -2
  383. package/mixin/lib/datalist-component.class.d.ts +10 -10
  384. package/mixin/lib/datalist.class.d.ts +1 -1
  385. package/mixin/lib/dropdown-mixin.class.d.ts +3 -3
  386. package/mixin/lib/interactive-mixin.class.d.ts +25 -22
  387. package/mixin/lib/mixin.class.d.ts +62 -62
  388. package/mixin/lib/page-component.class.d.ts +4 -4
  389. package/mixin/lib/selection-component.class.d.ts +3 -3
  390. package/mixin/lib/sizable-mixin.class.d.ts +2 -2
  391. package/mixin/lib/textbox-mixin.class.d.ts +20 -20
  392. package/mixin/lib/value-mixin.class.d.ts +9 -9
  393. package/notification/index.d.ts +1 -1
  394. package/notification/lib/notification.class.d.ts +3 -3
  395. package/notification/lib/notification.config.d.ts +1 -1
  396. package/number-box/lib/number-box.component.d.ts +3 -3
  397. package/otp/lib/otp.component.d.ts +3 -3
  398. package/otp/lib/otp.module.d.ts +2 -1
  399. package/package.json +19 -7
  400. package/page/lib/base-page.class.d.ts +1 -1
  401. package/page/lib/page.component.d.ts +1 -1
  402. package/password-box/lib/password-box.component.d.ts +4 -4
  403. package/popup/index.d.ts +1 -1
  404. package/popup/lib/popup.interface.d.ts +2 -2
  405. package/routing-progress/README.md +3 -0
  406. package/routing-progress/index.d.ts +2 -0
  407. package/routing-progress/lib/routing-progress.component.d.ts +14 -0
  408. package/routing-progress/lib/routing-progress.module.d.ts +8 -0
  409. package/search-box/lib/search-box.component.d.ts +11 -4
  410. package/select-box/index.d.ts +1 -1
  411. package/select-box/lib/select-box.component.d.ts +37 -59
  412. package/select-box/lib/select-box.module.d.ts +14 -15
  413. package/selection-list/lib/selection-list.component.d.ts +6 -3
  414. package/side-menu/README.md +3 -0
  415. package/side-menu/index.d.ts +3 -0
  416. package/side-menu/lib/side-menu-item/side-menu-item.compoent.d.ts +37 -0
  417. package/side-menu/lib/side-menu.component.d.ts +8 -0
  418. package/side-menu/lib/side-menu.module.d.ts +10 -0
  419. package/skeleton/README.md +3 -0
  420. package/skeleton/index.d.ts +2 -0
  421. package/skeleton/lib/skeleton.component.d.ts +8 -0
  422. package/skeleton/lib/skeleton.module.d.ts +8 -0
  423. package/tabs/lib/tab-item.component.d.ts +2 -1
  424. package/tag/lib/tag.component.d.ts +3 -4
  425. package/text-area/lib/text-area.component.d.ts +3 -3
  426. package/text-box/lib/text-box.component.d.ts +3 -3
  427. package/toast/index.d.ts +1 -1
  428. package/toast/lib/toast.class.d.ts +1 -1
  429. package/toast/lib/toast.component.d.ts +2 -1
  430. package/toast/lib/toast.config.d.ts +1 -1
  431. package/tooltip/lib/tooltip.directive.d.ts +1 -1
  432. package/uploader/index.d.ts +2 -0
  433. package/uploader/lib/uploader-list.component.d.ts +14 -1
  434. package/uploader/lib/uploader-zone.directive.d.ts +18 -0
  435. package/uploader/lib/uploader.module.d.ts +6 -4
  436. package/uploader/lib/uploader.service.d.ts +10 -0
  437. package/common/lib/components/appearance-component.class.d.ts +0 -12
  438. package/context-menu/README.md +0 -3
  439. package/context-menu/index.d.ts +0 -2
  440. package/context-menu/lib/context-menu.component.d.ts +0 -34
  441. package/context-menu/lib/context-menu.module.d.ts +0 -13
  442. package/esm2022/common/lib/components/appearance-component.class.mjs +0 -25
  443. package/esm2022/context-menu/acorex-components-context-menu.mjs +0 -5
  444. package/esm2022/context-menu/index.mjs +0 -3
  445. package/esm2022/context-menu/lib/context-menu.component.mjs +0 -262
  446. package/esm2022/context-menu/lib/context-menu.module.mjs +0 -36
  447. package/esm2022/menu/lib/menu2.component.mjs +0 -45
  448. package/esm2022/select-box/lib/select-box2.component.mjs +0 -97
  449. package/fesm2022/acorex-components-context-menu.mjs +0 -300
  450. package/fesm2022/acorex-components-context-menu.mjs.map +0 -1
  451. package/menu/lib/menu2.component.d.ts +0 -12
  452. package/select-box/lib/select-box2.component.d.ts +0 -25
@@ -1,371 +1,231 @@
1
- import { AXClosbaleComponent, AXSearchableComponent, AXValuableComponent } from '@acorex/components/common';
2
- import { AXPlatform } from '@acorex/core/platform';
3
- import { AXTranslator } from '@acorex/core/translation';
4
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, HostBinding, HostListener, Input, NgZone, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
5
- import { findLast, findLastIndex, first, last, nth } from 'lodash-es';
6
- import { AXBaseSelectionDropdownMixin } from '@acorex/components/mixin';
7
- import { AXPopoverComponent } from '@acorex/components/popover';
1
+ import { AXClearableComponent, AXClosbaleComponent, AXComponent, AXFocusableComponent, AXSearchableComponent, AXValuableComponent, MXLookComponent, MXSelectionValueComponent, convertArrayToDataSource, } from '@acorex/components/common';
2
+ import { AXDropdownBoxComponent, MXDropdownBoxBaseComponent } from '@acorex/components/dropdown';
3
+ import { AXListComponent } from '@acorex/components/list';
8
4
  import { AXSearchBoxComponent } from '@acorex/components/search-box';
5
+ import { ChangeDetectionStrategy, Component, ContentChild, HostListener, Input, TemplateRef, ViewChild, ViewEncapsulation, forwardRef, } from '@angular/core';
6
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
+ import { findLastIndex, last, nth } from 'lodash-es';
8
+ import { classes } from 'polytype';
9
9
  import * as i0 from "@angular/core";
10
- import * as i1 from "@acorex/core/platform";
11
- import * as i2 from "@angular/common";
10
+ import * as i1 from "@angular/common";
11
+ import * as i2 from "@angular/forms";
12
12
  import * as i3 from "@acorex/components/decorators";
13
- import * as i4 from "@acorex/components/popover";
14
- import * as i5 from "@acorex/components/loading";
15
- import * as i6 from "@angular/cdk/a11y";
16
- import * as i7 from "@acorex/core/translation";
13
+ import * as i4 from "@acorex/components/loading";
14
+ import * as i5 from "@acorex/components/dropdown";
15
+ import * as i6 from "@acorex/components/list";
17
16
  /**
18
17
  * The Button is a component which detects user interaction and triggers a corresponding event
19
18
  *
20
19
  * @category Components
21
20
  */
22
- export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
23
- get emptyTemplate() {
24
- return this._contentEmptyTemplate;
25
- }
26
- /**
27
- * @ignore
28
- */
29
- constructor(_elementRef, _cdr, _zone, _platform) {
30
- super(_elementRef, _cdr);
31
- this._elementRef = _elementRef;
32
- this._cdr = _cdr;
33
- this._zone = _zone;
34
- this._platform = _platform;
35
- /**
36
- * Defines the clearButton.
37
- */
38
- this.clearButton = false;
39
- /**
40
- * Defines the checkbox.
41
- */
42
- this.checkbox = false;
43
- this._isActionSheet = false;
44
- this._forceFocus = false;
45
- this._loadingOptions = {
46
- text: AXTranslator.get('layout.loading.text'),
47
- };
48
- this._isActionSheet = this._platform.is('SM');
49
- this._platform.resize.subscribe(() => {
50
- this._isActionSheet = this._platform.is('SM');
51
- this.popover.close();
52
- this._detectPopupSize();
21
+ export class AXSelectBoxComponent extends classes(MXDropdownBoxBaseComponent, MXSelectionValueComponent, MXLookComponent) {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.isLoading = false;
25
+ this.renderList = false;
26
+ this.dropdownSizes = { width: 'auto', height: 'auto' };
27
+ this._listDataSource = convertArrayToDataSource([], {
28
+ key: this.valueField,
29
+ pageSize: 10,
53
30
  });
31
+ this.autoHeight = false;
54
32
  }
55
- _handleArrowClickEvent(e) {
56
- e.stopPropagation();
57
- // e.nativeEvent.stopPropagation();
58
- this.toggle();
59
- }
60
- _handleInputClickEvent(e) {
61
- e.stopPropagation();
62
- this.toggle();
63
- }
64
- onInit() {
65
- super.onInit();
66
- this._target = this._elementRef.nativeElement;
67
- this._updatePopupTitle();
33
+ get dataSource() {
34
+ return this._dataSource;
68
35
  }
69
- onViewInit() {
70
- super.onViewInit();
71
- this._detectPopupSize();
72
- }
73
- refresh() {
74
- this.value = null;
75
- super.refresh();
76
- }
77
- _updatePopupTitle() {
78
- const count = this.selectedItems?.length || 0;
79
- //this._popoverTitle = count > 1 ? `(${count}) items selected` : (this.placeholder || AXTranslator.get('selectbox.popover.title'));
80
- this._popoverTitle = this.placeholder || AXTranslator.get('selectbox.popover.title');
81
- }
82
- _detectPopupSize() {
83
- this._popoverWidth = this._isActionSheet ? 0 : this._target.offsetWidth;
84
- }
85
- _handleOnItemClick(e, item) {
86
- if (this.isItemDisabled(item)) {
87
- return;
36
+ set dataSource(v) {
37
+ this._dataSource = v;
38
+ if (Array.isArray(v)) {
39
+ this._listDataSource = convertArrayToDataSource(v, { key: this.valueField, pageSize: 10 });
88
40
  }
89
- if (!this.multiple)
90
- this.close();
91
- this.toggleSelect(item);
92
- this._cdr.detectChanges();
93
- }
94
- _handleListScroll(e) {
95
- const list = e.target;
96
- if (list.scrollTop < list.scrollHeight - list.clientHeight) {
97
- return;
41
+ else {
42
+ this._listDataSource = this.dataSource;
98
43
  }
99
- this._fetchData();
100
44
  }
101
- _checkForLoadData() {
102
- const list = this.listContainer.nativeElement;
103
- if (this.loadedCount < this.totalCount && list.scrollHeight < list.parentElement.clientHeight * 1.5) {
104
- this._fetchData();
105
- }
45
+ ngAfterViewInit() {
46
+ super.ngAfterViewInit();
47
+ this.setDropdownSize();
106
48
  }
107
- _onDataLoaded() {
108
- if (this.popover.isOpen) {
109
- setTimeout(() => {
110
- this._checkForLoadData();
111
- this.popover.updatePosition();
112
- if (this._forceFocus) {
113
- this._focusSelectedItem();
114
- this._forceFocus = false;
115
- }
116
- this._focusSearchBox();
117
- }, 100);
118
- }
49
+ getItemByKey(key) {
50
+ return this._listDataSource.find(key);
119
51
  }
120
- _onValueChanged(oldValue, newValue) {
121
- super._onValueChanged(oldValue, newValue);
52
+ _handleOnOpenedEvent() {
53
+ this.renderList = true;
54
+ this.list?.render();
55
+ setTimeout(() => {
56
+ this.list?.focus();
57
+ });
122
58
  }
123
- _handleOnRemoveItemClick(e, item) {
124
- this.unselectItems(item);
125
- e.stopPropagation();
59
+ _handleOnClosedEvent() {
60
+ //this.input.focus();
126
61
  }
127
62
  _handleBadgeRemove(e, item) {
128
63
  this.unselectItems(item);
129
64
  e.stopPropagation();
130
- this.close();
131
65
  }
132
- _handleKeydown(e) {
133
- const isLetter = new RegExp(/[a-zA-Z0-9\-]/).test(String.fromCharCode(e.keyCode));
134
- if (e.code === 'Backspace' &&
135
- e.type === 'keydown' &&
136
- ((this.allowNull === true && this.selectedItems.length > 0) ||
137
- (this.allowNull !== true && this.selectedItems.length > 1))) {
138
- this.isUserInput = true;
139
- this.unselectItems(this.selectedItems.pop());
140
- e.preventDefault();
141
- return;
66
+ _handleOnDataLoad(items) {
67
+ this.setDropdownSize(items.length);
68
+ }
69
+ _handleValueChanged(e) {
70
+ if (e.isUserInteraction) {
71
+ this.commitValue(e.component.selectedItems, true);
142
72
  }
143
- else if ((e.code === 'ArrowDown' || e.code === 'ArrowUp' || e.code === 'Space') &&
144
- !this.popover.isOpen &&
145
- e.type === 'keydown') {
146
- if (this.multiple) {
147
- this.open();
148
- }
149
- else {
150
- this.isUserInput = true;
151
- if (e.ctrlKey || e.code === 'Space') {
152
- this.open();
153
- }
154
- else {
155
- this._selectedItemByNav(e.key === 'ArrowDown' ? 1 : -1);
156
- }
157
- }
158
- e.preventDefault();
159
- return;
73
+ ;
74
+ }
75
+ internalValueChanged() {
76
+ if (!this.multiple)
77
+ this.close();
78
+ setTimeout(() => {
79
+ this.detectAutoHeight();
80
+ }, 100);
81
+ }
82
+ detectAutoHeight() {
83
+ const containerWidth = this.getHostElement().querySelector('.ax-select-box-selection').clientWidth;
84
+ const itemsWidth = Array.from(this.getHostElement().querySelectorAll('.ax-selected-token')).reduce((a, i) => a + i.clientWidth, 0);
85
+ this.autoHeight = containerWidth - itemsWidth <= 8;
86
+ this.dropdown.updatePosition();
87
+ this.cdr.markForCheck();
88
+ }
89
+ setDropdownSize(count = 0) {
90
+ if (this.dropdown.isActionsheetStyle) {
91
+ this.dropdownSizes = {
92
+ width: '100%',
93
+ height: ['auto', '0px'].includes(this.dropdownSizes.height) ? `${Math.min(15, count) * 40}px` : this.dropdownSizes.height,
94
+ };
160
95
  }
161
- else if (isLetter) {
162
- this.text = e.key;
163
- this.open();
164
- e.preventDefault();
165
- return;
96
+ else {
97
+ this.dropdownSizes = {
98
+ width: `${this.getHostElement().offsetWidth}px`,
99
+ height: count == 0 ? 'auto' : `${Math.min(5, count) * 40}px`,
100
+ };
166
101
  }
167
102
  }
168
- _handlePopoverKeydown(e) {
169
- if (e.target.tagName == 'INPUT' && ['Space', 'Backspace'].includes(e.code))
170
- return;
171
- if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && this.displayItems.length > 0) {
172
- this.isUserInput = true;
173
- this._focusItemByNav(e.key === 'ArrowDown' ? 1 : -1);
103
+ _handleKeydown(e) {
104
+ if (e.code === 'ArrowDown' || e.code === 'ArrowUp') {
105
+ this.selectItemByNav(e.code === 'ArrowDown' ? 1 : -1);
174
106
  e.preventDefault();
175
107
  }
176
- else if (e.code === 'Backspace' &&
177
- ((this.allowNull === true && this.selectedItems.length > 0) ||
178
- (this.allowNull !== true && this.selectedItems.length > 1))) {
179
- this.isUserInput = true;
108
+ else if (e.code === 'Backspace') {
180
109
  this.unselectItems(this.selectedItems.pop());
181
110
  e.preventDefault();
182
111
  }
183
- else if (e.code === 'Space' || e.code === 'Enter') {
184
- e.preventDefault();
185
- const focusedItemId = this.listContainer.nativeElement.querySelector('.ax-state-focus')?.dataset?.id;
186
- const focusedItem = findLast(this.flatItems, [this.valueField, focusedItemId]);
187
- if (focusedItem) {
188
- if (this.isItemDisabled(focusedItem)) {
189
- return;
190
- }
191
- if (this.multiple) {
192
- this.isUserInput = true;
193
- this.toggleSelect(focusedItem);
194
- }
195
- else {
196
- this.isUserInput = true;
197
- this.selectItems(focusedItem);
198
- this.close();
199
- }
112
+ // if ((e.code === 'Space' || e.code === 'Enter') && this.hasItems) {
113
+ // if (this.readonly || this.disabled) {
114
+ // e.preventDefault();
115
+ // e.stopPropagation();
116
+ // return;
117
+ // }
118
+ // const id = document.activeElement?.closest('li')?.dataset?.id;
119
+ // this.toggleSelect(id);
120
+ // e.preventDefault();
121
+ // e.stopPropagation()
122
+ // }
123
+ }
124
+ selectItemByNav(sign) {
125
+ if (Array.isArray(this.dataSource) && !this.multiple) {
126
+ const items = this.normalizeItemsList(this.dataSource);
127
+ const _last = last(this.selectedItems);
128
+ let i = -1;
129
+ if (_last) {
130
+ i = findLastIndex(items, [this.valueField, _last[this.valueField]]);
131
+ }
132
+ i += sign;
133
+ if (i < 0 || i >= items.length)
134
+ return;
135
+ const next = nth(items, i);
136
+ if (next) {
137
+ this.selectItems(next);
200
138
  }
201
- }
202
- else if (e.code === 'Tab') {
203
- this.close();
204
- e.preventDefault();
205
- e.stopPropagation();
206
- }
207
- else if (e.key === 'Escape') {
208
- this.close();
209
- e.preventDefault();
210
- e.stopPropagation();
211
- }
212
- }
213
- async _handlePopupOnOpened(e) {
214
- this._detectPopupSize();
215
- this.popover.focus();
216
- if (this.displayItems.length == 0) {
217
- this._forceFocus = true;
218
- this._fetchData();
219
139
  }
220
140
  else {
221
- this._focusSelectedItem();
222
- }
223
- this._focusSearchBox();
224
- }
225
- _handlePopupOnClosed(e) {
226
- this.focus();
227
- }
228
- _focusSearchBox() {
229
- if (this._searchBox && (!this._isActionSheet || this._searchBox.value)) {
230
- this._searchBox.focus();
141
+ this.open();
231
142
  }
232
143
  }
233
- _focusItemByNav(sign) {
234
- const list = this.listContainer.nativeElement;
235
- const fn = (s) => list.querySelector(s);
236
- const itemDiv = fn(`.ax-list-item.ax-state-focus`) || fn(`.ax-list-item.ax-state-selected`) || fn(`.ax-list-item`);
237
- let next = (sign == 1 ? itemDiv.nextElementSibling : itemDiv.previousElementSibling);
238
- if (next) {
239
- this._focusItemElement(next);
144
+ search(term) {
145
+ if (term) {
146
+ const q = {};
147
+ q[this.textField] = term;
148
+ this._listDataSource.filter(q);
240
149
  }
241
150
  else {
242
- const parent = itemDiv.closest('.ax-list-item-group');
243
- if (parent) {
244
- const lis = (sign == 1 ? parent.nextElementSibling : parent.previousElementSibling)?.querySelectorAll('li');
245
- const a = sign == 1 ? first(lis) : last(lis);
246
- if (a) {
247
- this._focusItemElement(a);
248
- }
249
- }
250
- }
251
- }
252
- _focusSelectedItem() {
253
- this._zone.runOutsideAngular(() => {
254
- const list = this.listContainer.nativeElement;
255
- const fn = (s) => list.querySelector(s);
256
- const itemDiv = fn(`.ax-list-item.ax-state-selected`) || fn(`.ax-list-item`);
257
- if (itemDiv) {
258
- this._focusItemElement(itemDiv);
259
- }
260
- });
261
- }
262
- _focusItemElement(el) {
263
- this._zone.runOutsideAngular(() => {
264
- const list = this.listContainer.nativeElement;
265
- list.querySelectorAll('.ax-list-item').forEach((c) => {
266
- if (c == el) {
267
- c.classList.add('ax-state-focus');
268
- el.scrollIntoView({ behavior: 'auto' });
269
- }
270
- else {
271
- c.classList.remove('ax-state-focus');
272
- }
273
- });
274
- if (!this._isActionSheet && this._searchBox)
275
- this._searchBox.focus();
276
- else
277
- el.focus();
278
- });
279
- }
280
- _selectedItemByNav(sign) {
281
- const _last = last(this.selectedItems);
282
- let i = 0;
283
- if (_last) {
284
- i = findLastIndex(this.flatItems, [this.valueField, _last[this.valueField]]);
151
+ this._listDataSource.filter();
285
152
  }
286
- i += sign;
287
- let next = nth(this.flatItems, i);
288
- while (next?.children && next?.children.length) {
289
- i += sign;
290
- next = nth(this.flatItems, i);
291
- }
292
- if (next) {
293
- this.selectItems(next);
294
- }
295
- else if (next == null && sign == 1) {
296
- this._fetchData();
297
- }
298
- }
299
- search(exp) {
300
- this.empty();
301
- this._forceFocus = true;
302
- this._fetchData();
303
153
  }
304
- _fetchData() {
305
- super._fetchData({ searchQuery: this._searchBox?.value });
306
- }
307
- get __hostClass() {
308
- return `ax-editor-container ax-drop-down ax-appearance-solid`;
309
- }
310
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.9", ngImport: i0, type: AXSelectBoxComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1.AXPlatform }], target: i0.ɵɵFactoryTarget.Component }); }
311
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.9", type: AXSelectBoxComponent, selector: "ax-select-box", inputs: { isOpen: "isOpen", fitParent: "fitParent", dropdownWidth: "dropdownWidth", position: "position", disabled: "disabled", tabIndex: "tabIndex", allowNull: "allowNull", value: "value", name: "name", checked: "checked", placeholder: "placeholder", maxLength: "maxLength", type: "type", autoComplete: "autoComplete", readonly: "readonly", pageSize: "pageSize", items: "items", valueField: "valueField", textField: "textField", disabledField: "disabledField", disabledCallback: "disabledCallback", multiple: "multiple", selectionMode: "selectionMode", clearButton: "clearButton", checkbox: "checkbox" }, outputs: { onOpened: "onOpened", onClosed: "onClosed", onBlur: "onBlur", onFocus: "onFocus", valueChange: "valueChange", onValueChanged: "onValueChanged" }, host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class": "this.__hostClass" } }, providers: [
154
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.9", ngImport: i0, type: AXSelectBoxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
155
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.9", type: AXSelectBoxComponent, selector: "ax-select-box", inputs: { disabled: "disabled", readonly: "readonly", tabIndex: "tabIndex", placeholder: "placeholder", minValue: "minValue", maxValue: "maxValue", value: "value", state: "state", name: "name", id: "id", type: "type", look: "look", multiple: "multiple", valueField: "valueField", textField: "textField", dataSource: "dataSource", itemTemplate: "itemTemplate", emptyTemplate: "emptyTemplate", loadingTemplate: "loadingTemplate" }, outputs: { valueChange: "valueChange", stateChange: "stateChange", onValueChanged: "onValueChanged", onBlur: "onBlur", onFocus: "onFocus", readonlyChange: "readonlyChange", disabledChange: "disabledChange" }, host: { listeners: { "keydown": "_handleKeydown($event)" } }, providers: [
156
+ { provide: AXComponent, useExisting: AXSelectBoxComponent },
157
+ { provide: AXFocusableComponent, useExisting: AXSelectBoxComponent },
158
+ { provide: AXValuableComponent, useExisting: AXSelectBoxComponent },
159
+ { provide: AXClearableComponent, useExisting: AXSelectBoxComponent },
312
160
  { provide: AXClosbaleComponent, useExisting: AXSelectBoxComponent },
313
161
  { provide: AXSearchableComponent, useExisting: AXSelectBoxComponent },
314
- { provide: AXValuableComponent, useExisting: AXSelectBoxComponent },
315
- ], queries: [{ propertyName: "_searchBox", first: true, predicate: AXSearchBoxComponent, descendants: true, static: true }, { propertyName: "_contentEmptyTemplate", first: true, predicate: ["emptyTemplate"], descendants: true }], viewQueries: [{ propertyName: "popover", first: true, predicate: AXPopoverComponent, descendants: true, static: true }, { propertyName: "listContainer", first: true, predicate: ["listContainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"ax-prefix\"> </ng-content>\n<div class=\"ax-dropdown-content\" [class.ax-state-disabled]=\"disabled\" (click)=\"_handleInputClickEvent($event)\">\n <div class=\"ax-select-box-selection\" [tabindex]=\"tabIndex\" (focus)=\"_emitOnFocusEvent($event)\"\n (blur)=\"_emitOnBlurEvent($event)\">\n <ng-container *ngIf=\"selectedItems && selectedItems.length; else showPlaceholder\">\n <ng-container *ngIf=\"!multiple; then singleSelectedTemplate; else multipleSelectedTemplate\"></ng-container>\n <ng-template #singleSelectedTemplate>\n <ng-container *ngFor=\"let item of selectedItems\">\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\n </ng-container>\n </ng-template>\n <ng-template #multipleSelectedTemplate>\n <div class=\"ax-select-box-multi-selection\">\n <ng-container *ngFor=\"let item of selectedItems\">\n <div class=\"ax-select-multi-item\">\n {{ _getItemDisplayTextTemplte(item) }}\n <span class=\"ax-icon ax-icon-close\" (click)=\"_handleBadgeRemove($event, item)\"> </span>\n </div>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #showPlaceholder>\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\">\n {{ placeholder }}\n </div>\n </ng-template>\n </div>\n</div>\n<button type=\"button\" class=\"ax-general-button ax-button-icon\" (click)=\"clear()\" [tabIndex]=\"-1\"\n *ngIf=\"value && clearButton && !(disabled || readonly)\">\n <span class=\"ax-icon ax-icon-close\"></span>\n</button>\n<button type=\"button\" [disabled]=\"disabled\" [tabIndex]=\"-1\" class=\"ax-general-button ax-button-icon\"\n (click)=\"_handleArrowClickEvent($event)\">\n <ng-container *ngIf=\"isLoading && !this.popover.isOpen; else iconTemplate\">\n <ax-loading type=\"spinner\"></ax-loading>\n </ng-container>\n <ng-template #iconTemplate>\n <span class=\"ax-icon ax-icon-chevron-left ax-transition-all\" [ngClass]=\"{\n '-ax-rotation-90': !isOpen,\n 'ax-rotation-90': isOpen\n }\"></span>\n </ng-template>\n</button>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n<ng-content select=\"ax-suffix\"> </ng-content>\n<ax-popover [target]=\"_target\" [placement]=\"position\" [openOn]=\"'manual'\" [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\" (onOpened)=\"_handlePopupOnOpened($event)\" (onClosed)=\"_handlePopupOnClosed($event)\">\n <div class=\"ax-overlay-pane\" (keydown)=\"_handlePopoverKeydown($event)\" tabindex=\"0\" aria-modal=\"true\" cdkTrapFocus\n [class.ax-overlay-actionsheet]=\"_isActionSheet\" [class.ax-full]=\"_searchBox || isLazy\"\n [style.min-width.px]=\"_popoverWidth\">\n <div class=\"ax-list\">\n <ax-header *ngIf=\"_isActionSheet\">\n <ax-title>{{ _popoverTitle }}</ax-title>\n <ax-close-button class=\"ax-icon\"\n [icon]=\"multiple ? 'ax-icon-done !ax-text-primary-500' : 'ax-icon-close'\"></ax-close-button>\n </ax-header>\n <div class=\"ax-search-box-container\" [class.ax-state-hidden]=\"!_searchBox\" [cdkTrapFocus]=\"_searchBox != null\">\n <ng-content select=\"ax-search-box\"></ng-content>\n </div>\n <div class=\"ax-content ax-list-items-container ax-default\" (scroll)=\"_handleListScroll($event)\" #listContainer>\n <ng-container *ngIf=\"displayItems.length; else tmpEmpty\">\n <ul>\n <ng-container *ngTemplateOutlet=\"tmpTree; context: { list: displayItems }\"> </ng-container>\n <ng-template #tmpTree let-list=\"list\">\n <ng-container *ngFor=\"let item of list; let i = index; trackBy: _trackByFunction\">\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\n <li class=\"ax-list-item\" (click)=\"_handleOnItemClick($event, item)\"\n [attr.data-id]=\"item[this.valueField]\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, direction: direction }\">\n </ng-container>\n </li>\n </ng-container>\n <ng-template #defualtTemplate>\n <ng-container *ngIf=\"item.children?.length > 0; else tmpItem\">\n <li class=\"ax-list-item-group\" [attr.data-id]=\"item[this.valueField]\">\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\n <ul *ngIf=\"item.children?.length > 0\">\n <ng-container *ngTemplateOutlet=\"tmpTree; context: { list: item.children }\">\n </ng-container>\n </ul>\n </li>\n </ng-container>\n <ng-template #tmpItem>\n <ng-container *ngIf=\"!multiple; else multipleTemplate\">\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\n [class.ax-state-disabled]=\"isItemDisabled(item)\" [attr.tabindex]=\"i\"\n (click)=\"_handleOnItemClick($event, item)\" [attr.data-id]=\"item[this.valueField]\">\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\n <span class=\"ax-icon ax-icon-done ax-selected-icon\" *ngIf=\"isItemSelected(item)\"></span>\n </li>\n </ng-container>\n <ng-template #multipleTemplate>\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\n [class.ax-state-disabled]=\"isItemDisabled(item)\" [class.ax-state-checkbox]=\"checkbox\"\n [attr.tabindex]=\"i\" (click)=\"_handleOnItemClick($event, item)\"\n [attr.data-id]=\"item[this.valueField]\">\n <span>\n <input class=\"ax-checkbox\" type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\n *ngIf=\"checkbox\" [checked]=\"isItemSelected(item)\" [disabled]=\"isItemDisabled(item)\" />\n <span class=\"ax-checkbox-label\">{{ _getItemDisplayTextTemplte(item) }}</span>\n </span>\n <span class=\"ax-icon ax-icon-done ax-selected-icon\"\n *ngIf=\"isItemSelected(item) && !checkbox\"></span>\n </li>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ul>\n </ng-container>\n <ng-container *ngIf=\"isLoading\">\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"> </ng-container>\n </ng-container>\n <ng-template #elseLoadingTemplate>\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\n <ax-loading [context]=\"_loadingOptions\"></ax-loading>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #tmpEmpty>\n <ng-container *ngIf=\"!isLoading\">\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"> </ng-container>\n </ng-container>\n <ng-template #elseEmptyTemplate>\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\" [innerHTML]=\"\n 'common.no-result-for'\n | trans\n : {\n exp: this._searchBox ? this._searchBox.value : ''\n }\n \"></div>\n </ng-template>\n </ng-container>\n </ng-template>\n </div>\n <!-- <div class=\"ax-list-items-container ax-vertical ax-default\" [class.ax-full]=\"_isMobile\"\n >\n \n </div> -->\n <!-- <div class=\"ax-footer\">footer</div> -->\n </div>\n </div>\n</ax-popover>", styles: ["ax-select-box .ax-select-multi-item{display:flex;align-items:center;padding:.25rem .5rem;background-color:rgba(var(--ax-color-gray-200));color:rgba(var(--ax-color-text-default));border-radius:var(--ax-rounded-border-default);margin-inline-end:.5rem}ax-select-box .ax-select-multi-item .ax-icon-close{cursor:pointer;margin-inline-start:.5rem}ax-select-box .ax-select-box-selection{display:flex;justify-content:center;align-items:center;outline-color:transparent;outline:transparent;-webkit-user-select:none;user-select:none}ax-select-box .ax-select-box-selection>span{padding-inline-start:1rem;padding-inline-end:.75rem;white-space:nowrap}ax-select-box .ax-select-box-selection .ax-selectbox-input{opacity:0;width:0}ax-select-box .ax-select-box-multi-selection{padding:0 .5rem;display:flex;justify-content:center;align-items:center}ax-select-box .ax-placeholder{padding-inline-start:1rem;padding-inline-end:.75rem}\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.AXDecoratorCloseButtonComponent, selector: "ax-close-button", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title , ax-sub-title" }, { kind: "component", type: i4.AXPopoverComponent, selector: "ax-popover", inputs: ["offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "backdropClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: i5.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "directive", type: i6.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "pipe", type: i7.AXTranslatorPipe, name: "trans" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
162
+ {
163
+ provide: NG_VALUE_ACCESSOR,
164
+ useExisting: forwardRef(() => AXSelectBoxComponent),
165
+ multi: true,
166
+ },
167
+ ], queries: [{ propertyName: "searchBox", first: true, predicate: AXSearchBoxComponent, descendants: true, static: true }], viewQueries: [{ propertyName: "list", first: true, predicate: AXListComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: AXDropdownBoxComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ax-dropdown-box\n [disabled]=\"disabled\"\n (onOpened)=\"_handleOnOpenedEvent()\"\n (onClosed)=\"_handleOnClosedEvent()\"\n [look]=\"look\"\n [class.ax-auto-height]=\"autoHeight\"\n>\n <ng-container input>\n <ng-content select=\"ax-prefix\"> </ng-content>\n <div\n class=\"ax-select-box-selection\"\n [class.ax-multiple]=\"multiple\"\n [tabindex]=\"tabIndex\"\n (focus)=\"emitOnFocusEvent($event)\"\n (blur)=\"emitOnBlurEvent($event)\"\n (click)=\"toggle()\"\n >\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\" *ngIf=\"selectedItems.length === 0\">\n {{ placeholder }}\n </div>\n <ng-container *ngFor=\"let item of selectedItems\">\n <div class=\"ax-selected-token\">\n {{ getDisplayText(item) }}\n <span class=\"ax-icon ax-icon-close\" (click)=\"_handleBadgeRemove($event, item)\" *ngIf=\"multiple\">\n </span>\n </div>\n </ng-container>\n </div>\n <ng-content select=\" ax-clear-button\"></ng-content>\n <button\n type=\"button\"\n [disabled]=\"disabled\"\n [tabIndex]=\"-1\"\n class=\"ax-general-button ax-button-icon\"\n (click)=\"toggle()\"\n >\n <ng-container *ngIf=\"isLoading && !isOpen; else iconTemplate\">\n <ax-loading type=\"spinner\"></ax-loading>\n </ng-container>\n <ng-template #iconTemplate>\n <span\n class=\"ax-icon ax-icon-chevron-left ax-arrow-button\"\n [ngClass]=\"{\n '-rotation-90': !isOpen,\n 'rotation-90': isOpen\n }\"\n ></span>\n </ng-template>\n </button>\n <ng-content select=\"ax-suffix\"> </ng-content>\n <ng-template #search>\n <ng-content select=\"ax-search-box\"> </ng-content>\n </ng-template>\n </ng-container>\n <ng-container panel>\n <div class=\"ax-select-box-panel\">\n <ax-header class=\"ax-solid\" *ngIf=\"dropdown.isActionsheetStyle\">\n <ax-title>{{ placeholder }}</ax-title>\n <ax-close-button\n [icon]=\"multiple ? 'ax-icon ax-icon-done !ax-text-primary-500' : 'ax-icon ax-icon-close'\"\n ></ax-close-button>\n </ax-header>\n <div class=\"ax-search-container\" *ngIf=\"searchBox\">\n <ng-template [ngTemplateOutlet]=\"search\"></ng-template>\n </div>\n <ax-list\n *ngIf=\"renderList\"\n [dataSource]=\"_listDataSource\"\n [multiple]=\"multiple\"\n [style.width]=\"dropdownSizes.width\"\n [style.height]=\"dropdownSizes.height\"\n [valueField]=\"valueField\"\n [textField]=\"textField\"\n [emptyTemplate]=\"emptyTemplate ?? empty\"\n [itemTemplate]=\"itemTemplate\"\n [loadingTemplate]=\"loadingTemplate\"\n [ngModel]=\"value\"\n (onValueChanged)=\"_handleValueChanged($event)\"\n (onDataLoad)=\"_handleOnDataLoad($event)\"\n [selectionMode]=\"'item'\"\n >\n <ng-template #empty> No Items! </ng-template>\n </ax-list>\n <ng-content select=\"ax-footer\"> </ng-content>\n </div>\n </ng-container>\n</ax-dropdown-box>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n", styles: ["ax-select-box ax-dropdown-box.ax-auto-height{height:auto!important}ax-select-box .ax-editor-container.ax-look-fill .ax-selected-token{background-color:rgba(var(--ax-color-surface))!important}ax-select-box .ax-selected-token{display:flex;align-items:center;padding:.25rem .5rem;color:rgba(var(--ax-color-text-default));border-radius:var(--ax-rounded-border-default)}ax-select-box .ax-selected-token .ax-icon-close{cursor:pointer;margin-inline-start:.5rem}ax-select-box .ax-select-box-selection{display:flex;justify-content:center;align-items:center;outline-color:transparent;outline:transparent;-webkit-user-select:none;user-select:none;cursor:pointer;justify-content:flex-start;flex:1;flex-wrap:wrap;gap:.25rem;padding:.25rem}ax-select-box .ax-select-box-selection>span{padding-inline-start:1rem;padding-inline-end:.75rem;white-space:nowrap}ax-select-box .ax-select-box-selection .ax-selectbox-input{opacity:0;width:0}ax-select-box .ax-select-box-selection.ax-multiple .ax-selected-token{background-color:rgba(var(--ax-color-on-surface))}ax-select-box .ax-placeholder{padding-inline-start:1rem;padding-inline-end:.75rem}ax-select-box .ax-general-button .ax-arrow-button{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}ax-select-box .ax-general-button .ax-arrow-button.-rotation-90{transform:rotate(-90deg)}ax-select-box .ax-general-button .ax-arrow-button.rotation-90{transform:rotate(90deg)}.ax-select-box-panel>ax-header.ax-solid{border-bottom:1px solid;border-color:rgba(var(--ax-color-border-default))}.ax-select-box-panel .ax-search-container{padding:.5rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.AXDecoratorCloseButtonComponent, selector: "ax-close-button", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title , ax-sub-title" }, { kind: "component", type: i4.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "component", type: i5.AXDropdownBoxComponent, selector: "ax-dropdown-box", inputs: ["disabled", "look"], outputs: ["disabledChange", "onBlur", "onFocus", "onClick", "onOpened", "onClosed"] }, { kind: "component", type: i6.AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "disabledField", "multiple", "selectionMode", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readOnlyChange", "onBlur", "onFocus", "onDataLoad", "onScrolledIndexChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
316
168
  }
317
169
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.9", ngImport: i0, type: AXSelectBoxComponent, decorators: [{
318
170
  type: Component,
319
171
  args: [{ selector: 'ax-select-box', inputs: [
320
- 'isOpen',
321
- 'fitParent',
322
- 'dropdownWidth',
323
- 'position',
324
172
  'disabled',
173
+ 'readonly',
325
174
  'tabIndex',
326
- 'allowNull',
175
+ 'placeholder',
176
+ 'minValue',
177
+ 'maxValue',
327
178
  'value',
179
+ 'state',
328
180
  'name',
329
- 'checked',
330
- 'placeholder',
331
- 'maxLength',
181
+ 'id',
332
182
  'type',
333
- 'autoComplete',
334
- 'readonly',
335
- 'pageSize',
336
- 'items',
183
+ 'look',
184
+ 'multiple',
337
185
  'valueField',
338
186
  'textField',
339
- 'disabledField',
340
- 'disabledCallback',
341
- 'multiple',
342
- 'selectionMode',
343
- ], outputs: ['onOpened', 'onClosed', 'onBlur', 'onFocus', 'valueChange', 'onValueChanged'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
187
+ ], outputs: [
188
+ 'valueChange',
189
+ 'stateChange',
190
+ 'onValueChanged',
191
+ 'onBlur',
192
+ 'onFocus',
193
+ 'readonlyChange',
194
+ 'disabledChange',
195
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
196
+ { provide: AXComponent, useExisting: AXSelectBoxComponent },
197
+ { provide: AXFocusableComponent, useExisting: AXSelectBoxComponent },
198
+ { provide: AXValuableComponent, useExisting: AXSelectBoxComponent },
199
+ { provide: AXClearableComponent, useExisting: AXSelectBoxComponent },
344
200
  { provide: AXClosbaleComponent, useExisting: AXSelectBoxComponent },
345
201
  { provide: AXSearchableComponent, useExisting: AXSelectBoxComponent },
346
- { provide: AXValuableComponent, useExisting: AXSelectBoxComponent },
347
- ], template: "<ng-content select=\"ax-prefix\"> </ng-content>\n<div class=\"ax-dropdown-content\" [class.ax-state-disabled]=\"disabled\" (click)=\"_handleInputClickEvent($event)\">\n <div class=\"ax-select-box-selection\" [tabindex]=\"tabIndex\" (focus)=\"_emitOnFocusEvent($event)\"\n (blur)=\"_emitOnBlurEvent($event)\">\n <ng-container *ngIf=\"selectedItems && selectedItems.length; else showPlaceholder\">\n <ng-container *ngIf=\"!multiple; then singleSelectedTemplate; else multipleSelectedTemplate\"></ng-container>\n <ng-template #singleSelectedTemplate>\n <ng-container *ngFor=\"let item of selectedItems\">\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\n </ng-container>\n </ng-template>\n <ng-template #multipleSelectedTemplate>\n <div class=\"ax-select-box-multi-selection\">\n <ng-container *ngFor=\"let item of selectedItems\">\n <div class=\"ax-select-multi-item\">\n {{ _getItemDisplayTextTemplte(item) }}\n <span class=\"ax-icon ax-icon-close\" (click)=\"_handleBadgeRemove($event, item)\"> </span>\n </div>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #showPlaceholder>\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\">\n {{ placeholder }}\n </div>\n </ng-template>\n </div>\n</div>\n<button type=\"button\" class=\"ax-general-button ax-button-icon\" (click)=\"clear()\" [tabIndex]=\"-1\"\n *ngIf=\"value && clearButton && !(disabled || readonly)\">\n <span class=\"ax-icon ax-icon-close\"></span>\n</button>\n<button type=\"button\" [disabled]=\"disabled\" [tabIndex]=\"-1\" class=\"ax-general-button ax-button-icon\"\n (click)=\"_handleArrowClickEvent($event)\">\n <ng-container *ngIf=\"isLoading && !this.popover.isOpen; else iconTemplate\">\n <ax-loading type=\"spinner\"></ax-loading>\n </ng-container>\n <ng-template #iconTemplate>\n <span class=\"ax-icon ax-icon-chevron-left ax-transition-all\" [ngClass]=\"{\n '-ax-rotation-90': !isOpen,\n 'ax-rotation-90': isOpen\n }\"></span>\n </ng-template>\n</button>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n<ng-content select=\"ax-suffix\"> </ng-content>\n<ax-popover [target]=\"_target\" [placement]=\"position\" [openOn]=\"'manual'\" [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\" (onOpened)=\"_handlePopupOnOpened($event)\" (onClosed)=\"_handlePopupOnClosed($event)\">\n <div class=\"ax-overlay-pane\" (keydown)=\"_handlePopoverKeydown($event)\" tabindex=\"0\" aria-modal=\"true\" cdkTrapFocus\n [class.ax-overlay-actionsheet]=\"_isActionSheet\" [class.ax-full]=\"_searchBox || isLazy\"\n [style.min-width.px]=\"_popoverWidth\">\n <div class=\"ax-list\">\n <ax-header *ngIf=\"_isActionSheet\">\n <ax-title>{{ _popoverTitle }}</ax-title>\n <ax-close-button class=\"ax-icon\"\n [icon]=\"multiple ? 'ax-icon-done !ax-text-primary-500' : 'ax-icon-close'\"></ax-close-button>\n </ax-header>\n <div class=\"ax-search-box-container\" [class.ax-state-hidden]=\"!_searchBox\" [cdkTrapFocus]=\"_searchBox != null\">\n <ng-content select=\"ax-search-box\"></ng-content>\n </div>\n <div class=\"ax-content ax-list-items-container ax-default\" (scroll)=\"_handleListScroll($event)\" #listContainer>\n <ng-container *ngIf=\"displayItems.length; else tmpEmpty\">\n <ul>\n <ng-container *ngTemplateOutlet=\"tmpTree; context: { list: displayItems }\"> </ng-container>\n <ng-template #tmpTree let-list=\"list\">\n <ng-container *ngFor=\"let item of list; let i = index; trackBy: _trackByFunction\">\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\n <li class=\"ax-list-item\" (click)=\"_handleOnItemClick($event, item)\"\n [attr.data-id]=\"item[this.valueField]\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, direction: direction }\">\n </ng-container>\n </li>\n </ng-container>\n <ng-template #defualtTemplate>\n <ng-container *ngIf=\"item.children?.length > 0; else tmpItem\">\n <li class=\"ax-list-item-group\" [attr.data-id]=\"item[this.valueField]\">\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\n <ul *ngIf=\"item.children?.length > 0\">\n <ng-container *ngTemplateOutlet=\"tmpTree; context: { list: item.children }\">\n </ng-container>\n </ul>\n </li>\n </ng-container>\n <ng-template #tmpItem>\n <ng-container *ngIf=\"!multiple; else multipleTemplate\">\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\n [class.ax-state-disabled]=\"isItemDisabled(item)\" [attr.tabindex]=\"i\"\n (click)=\"_handleOnItemClick($event, item)\" [attr.data-id]=\"item[this.valueField]\">\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\n <span class=\"ax-icon ax-icon-done ax-selected-icon\" *ngIf=\"isItemSelected(item)\"></span>\n </li>\n </ng-container>\n <ng-template #multipleTemplate>\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\n [class.ax-state-disabled]=\"isItemDisabled(item)\" [class.ax-state-checkbox]=\"checkbox\"\n [attr.tabindex]=\"i\" (click)=\"_handleOnItemClick($event, item)\"\n [attr.data-id]=\"item[this.valueField]\">\n <span>\n <input class=\"ax-checkbox\" type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\n *ngIf=\"checkbox\" [checked]=\"isItemSelected(item)\" [disabled]=\"isItemDisabled(item)\" />\n <span class=\"ax-checkbox-label\">{{ _getItemDisplayTextTemplte(item) }}</span>\n </span>\n <span class=\"ax-icon ax-icon-done ax-selected-icon\"\n *ngIf=\"isItemSelected(item) && !checkbox\"></span>\n </li>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ul>\n </ng-container>\n <ng-container *ngIf=\"isLoading\">\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"> </ng-container>\n </ng-container>\n <ng-template #elseLoadingTemplate>\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\n <ax-loading [context]=\"_loadingOptions\"></ax-loading>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #tmpEmpty>\n <ng-container *ngIf=\"!isLoading\">\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"> </ng-container>\n </ng-container>\n <ng-template #elseEmptyTemplate>\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\" [innerHTML]=\"\n 'common.no-result-for'\n | trans\n : {\n exp: this._searchBox ? this._searchBox.value : ''\n }\n \"></div>\n </ng-template>\n </ng-container>\n </ng-template>\n </div>\n <!-- <div class=\"ax-list-items-container ax-vertical ax-default\" [class.ax-full]=\"_isMobile\"\n >\n \n </div> -->\n <!-- <div class=\"ax-footer\">footer</div> -->\n </div>\n </div>\n</ax-popover>", styles: ["ax-select-box .ax-select-multi-item{display:flex;align-items:center;padding:.25rem .5rem;background-color:rgba(var(--ax-color-gray-200));color:rgba(var(--ax-color-text-default));border-radius:var(--ax-rounded-border-default);margin-inline-end:.5rem}ax-select-box .ax-select-multi-item .ax-icon-close{cursor:pointer;margin-inline-start:.5rem}ax-select-box .ax-select-box-selection{display:flex;justify-content:center;align-items:center;outline-color:transparent;outline:transparent;-webkit-user-select:none;user-select:none}ax-select-box .ax-select-box-selection>span{padding-inline-start:1rem;padding-inline-end:.75rem;white-space:nowrap}ax-select-box .ax-select-box-selection .ax-selectbox-input{opacity:0;width:0}ax-select-box .ax-select-box-multi-selection{padding:0 .5rem;display:flex;justify-content:center;align-items:center}ax-select-box .ax-placeholder{padding-inline-start:1rem;padding-inline-end:.75rem}\n"] }]
348
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1.AXPlatform }]; }, propDecorators: { popover: [{
349
- type: ViewChild,
350
- args: [AXPopoverComponent, { static: true }]
351
- }], _searchBox: [{
352
- type: ContentChild,
353
- args: [AXSearchBoxComponent, { static: true }]
354
- }], clearButton: [{
202
+ {
203
+ provide: NG_VALUE_ACCESSOR,
204
+ useExisting: forwardRef(() => AXSelectBoxComponent),
205
+ multi: true,
206
+ },
207
+ ], template: "<ax-dropdown-box\n [disabled]=\"disabled\"\n (onOpened)=\"_handleOnOpenedEvent()\"\n (onClosed)=\"_handleOnClosedEvent()\"\n [look]=\"look\"\n [class.ax-auto-height]=\"autoHeight\"\n>\n <ng-container input>\n <ng-content select=\"ax-prefix\"> </ng-content>\n <div\n class=\"ax-select-box-selection\"\n [class.ax-multiple]=\"multiple\"\n [tabindex]=\"tabIndex\"\n (focus)=\"emitOnFocusEvent($event)\"\n (blur)=\"emitOnBlurEvent($event)\"\n (click)=\"toggle()\"\n >\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\" *ngIf=\"selectedItems.length === 0\">\n {{ placeholder }}\n </div>\n <ng-container *ngFor=\"let item of selectedItems\">\n <div class=\"ax-selected-token\">\n {{ getDisplayText(item) }}\n <span class=\"ax-icon ax-icon-close\" (click)=\"_handleBadgeRemove($event, item)\" *ngIf=\"multiple\">\n </span>\n </div>\n </ng-container>\n </div>\n <ng-content select=\" ax-clear-button\"></ng-content>\n <button\n type=\"button\"\n [disabled]=\"disabled\"\n [tabIndex]=\"-1\"\n class=\"ax-general-button ax-button-icon\"\n (click)=\"toggle()\"\n >\n <ng-container *ngIf=\"isLoading && !isOpen; else iconTemplate\">\n <ax-loading type=\"spinner\"></ax-loading>\n </ng-container>\n <ng-template #iconTemplate>\n <span\n class=\"ax-icon ax-icon-chevron-left ax-arrow-button\"\n [ngClass]=\"{\n '-rotation-90': !isOpen,\n 'rotation-90': isOpen\n }\"\n ></span>\n </ng-template>\n </button>\n <ng-content select=\"ax-suffix\"> </ng-content>\n <ng-template #search>\n <ng-content select=\"ax-search-box\"> </ng-content>\n </ng-template>\n </ng-container>\n <ng-container panel>\n <div class=\"ax-select-box-panel\">\n <ax-header class=\"ax-solid\" *ngIf=\"dropdown.isActionsheetStyle\">\n <ax-title>{{ placeholder }}</ax-title>\n <ax-close-button\n [icon]=\"multiple ? 'ax-icon ax-icon-done !ax-text-primary-500' : 'ax-icon ax-icon-close'\"\n ></ax-close-button>\n </ax-header>\n <div class=\"ax-search-container\" *ngIf=\"searchBox\">\n <ng-template [ngTemplateOutlet]=\"search\"></ng-template>\n </div>\n <ax-list\n *ngIf=\"renderList\"\n [dataSource]=\"_listDataSource\"\n [multiple]=\"multiple\"\n [style.width]=\"dropdownSizes.width\"\n [style.height]=\"dropdownSizes.height\"\n [valueField]=\"valueField\"\n [textField]=\"textField\"\n [emptyTemplate]=\"emptyTemplate ?? empty\"\n [itemTemplate]=\"itemTemplate\"\n [loadingTemplate]=\"loadingTemplate\"\n [ngModel]=\"value\"\n (onValueChanged)=\"_handleValueChanged($event)\"\n (onDataLoad)=\"_handleOnDataLoad($event)\"\n [selectionMode]=\"'item'\"\n >\n <ng-template #empty> No Items! </ng-template>\n </ax-list>\n <ng-content select=\"ax-footer\"> </ng-content>\n </div>\n </ng-container>\n</ax-dropdown-box>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n", styles: ["ax-select-box ax-dropdown-box.ax-auto-height{height:auto!important}ax-select-box .ax-editor-container.ax-look-fill .ax-selected-token{background-color:rgba(var(--ax-color-surface))!important}ax-select-box .ax-selected-token{display:flex;align-items:center;padding:.25rem .5rem;color:rgba(var(--ax-color-text-default));border-radius:var(--ax-rounded-border-default)}ax-select-box .ax-selected-token .ax-icon-close{cursor:pointer;margin-inline-start:.5rem}ax-select-box .ax-select-box-selection{display:flex;justify-content:center;align-items:center;outline-color:transparent;outline:transparent;-webkit-user-select:none;user-select:none;cursor:pointer;justify-content:flex-start;flex:1;flex-wrap:wrap;gap:.25rem;padding:.25rem}ax-select-box .ax-select-box-selection>span{padding-inline-start:1rem;padding-inline-end:.75rem;white-space:nowrap}ax-select-box .ax-select-box-selection .ax-selectbox-input{opacity:0;width:0}ax-select-box .ax-select-box-selection.ax-multiple .ax-selected-token{background-color:rgba(var(--ax-color-on-surface))}ax-select-box .ax-placeholder{padding-inline-start:1rem;padding-inline-end:.75rem}ax-select-box .ax-general-button .ax-arrow-button{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}ax-select-box .ax-general-button .ax-arrow-button.-rotation-90{transform:rotate(-90deg)}ax-select-box .ax-general-button .ax-arrow-button.rotation-90{transform:rotate(90deg)}.ax-select-box-panel>ax-header.ax-solid{border-bottom:1px solid;border-color:rgba(var(--ax-color-border-default))}.ax-select-box-panel .ax-search-container{padding:.5rem}\n"] }]
208
+ }], propDecorators: { dataSource: [{
355
209
  type: Input
356
- }], checkbox: [{
210
+ }], placeholder: [{
357
211
  type: Input
358
- }], listContainer: [{
212
+ }], itemTemplate: [{
213
+ type: Input
214
+ }], emptyTemplate: [{
215
+ type: Input
216
+ }], loadingTemplate: [{
217
+ type: Input
218
+ }], list: [{
359
219
  type: ViewChild,
360
- args: ['listContainer', { static: true }]
361
- }], _contentEmptyTemplate: [{
220
+ args: [AXListComponent]
221
+ }], searchBox: [{
362
222
  type: ContentChild,
363
- args: ['emptyTemplate']
223
+ args: [AXSearchBoxComponent, { static: true }]
224
+ }], dropdown: [{
225
+ type: ViewChild,
226
+ args: [AXDropdownBoxComponent, { static: true }]
364
227
  }], _handleKeydown: [{
365
228
  type: HostListener,
366
229
  args: ['keydown', ['$event']]
367
- }], __hostClass: [{
368
- type: HostBinding,
369
- args: ['class']
370
230
  }] } });
371
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc2VsZWN0LWJveC9zcmMvbGliL3NlbGVjdC1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NlbGVjdC1ib3gvc3JjL2xpYi9zZWxlY3QtYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7QUFFckU7Ozs7R0FJRztBQXVDSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsNEJBQTRCO0lBNkJwRSxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxD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RSxXQUFXLHNCQUFzQixFQUFFO3dCQUNyRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLHNCQUFzQixFQUFFO3FCQUNwRTsrS0FJRCxPQUFPO3NCQUROLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkvQyxVQUFVO3NCQURULFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVdwRCxXQUFXO3NCQURWLEtBQUs7Z0JBT04sUUFBUTtzQkFEUCxLQUFLO2dCQUlFLGFBQWE7c0JBRHBCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJcEMscUJBQXFCO3NCQUQ1QixZQUFZO3VCQUFDLGVBQWU7Z0JBMkg3QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXNML0IsV0FBVztzQkFEZCxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWENsb3NiYWxlQ29tcG9uZW50LCBBWFNlYXJjaGFibGVDb21wb25lbnQsIEFYVmFsdWFibGVDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvY29tbW9uJztcbmltcG9ydCB7IEFYUGxhdGZvcm0gfSBmcm9tICdAYWNvcmV4L2NvcmUvcGxhdGZvcm0nO1xuaW1wb3J0IHsgQVhUcmFuc2xhdG9yIH0gZnJvbSAnQGFjb3JleC9jb3JlL3RyYW5zbGF0aW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbmRMYXN0LCBmaW5kTGFzdEluZGV4LCBmaXJzdCwgbGFzdCwgbnRoIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgQVhCYXNlU2VsZWN0aW9uRHJvcGRvd25NaXhpbiB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9taXhpbic7XG5pbXBvcnQgeyBBWFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvcG9wb3Zlcic7XG5pbXBvcnQgeyBBWFNlYXJjaEJveENvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9zZWFyY2gtYm94JztcblxuLyoqXG4gKiBUaGUgQnV0dG9uIGlzIGEgY29tcG9uZW50IHdoaWNoIGRldGVjdHMgdXNlciBpbnRlcmFjdGlvbiBhbmQgdHJpZ2dlcnMgYSBjb3JyZXNwb25kaW5nIGV2ZW50XG4gKlxuICogQGNhdGVnb3J5IENvbXBvbmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtc2VsZWN0LWJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QtYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LWJveC5jb21wb25lbnQuc2NzcyddLFxuICBpbnB1dHM6IFtcbiAgICAnaXNPcGVuJyxcbiAgICAnZml0UGFyZW50JyxcbiAgICAnZHJvcGRvd25XaWR0aCcsXG4gICAgJ3Bvc2l0aW9uJyxcbiAgICAnZGlzYWJsZWQnLFxuICAgICd0YWJJbmRleCcsXG4gICAgJ2FsbG93TnVsbCcsXG4gICAgJ3ZhbHVlJyxcbiAgICAnbmFtZScsXG4gICAgJ2NoZWNrZWQnLFxuICAgICdwbGFjZWhvbGRlcicsXG4gICAgJ21heExlbmd0aCcsXG4gICAgJ3R5cGUnLFxuICAgICdhdXRvQ29tcGxldGUnLFxuICAgICdyZWFkb25seScsXG4gICAgJ3BhZ2VTaXplJyxcbiAgICAnaXRlbXMnLFxuICAgICd2YWx1ZUZpZWxkJyxcbiAgICAndGV4dEZpZWxkJyxcbiAgICAnZGlzYWJsZWRGaWVsZCcsXG4gICAgJ2Rpc2FibGVkQ2FsbGJhY2snLFxuICAgICdtdWx0aXBsZScsXG4gICAgJ3NlbGVjdGlvbk1vZGUnLFxuICBdLFxuICBvdXRwdXRzOiBbJ29uT3BlbmVkJywgJ29uQ2xvc2VkJywgJ29uQmx1cicsICdvbkZvY3VzJywgJ3ZhbHVlQ2hhbmdlJywgJ29uVmFsdWVDaGFuZ2VkJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IEFYQ2xvc2JhbGVDb21wb25lbnQsIHVzZUV4aXN0aW5nOiBBWFNlbGVjdEJveENvbXBvbmVudCB9LFxuICAgIHsgcHJvdmlkZTogQVhTZWFyY2hhYmxlQ29tcG9uZW50LCB1c2VFeGlzdGluZzogQVhTZWxlY3RCb3hDb21wb25lbnQgfSxcbiAgICB7IHByb3ZpZGU6IEFYVmFsdWFibGVDb21wb25lbnQsIHVzZUV4aXN0aW5nOiBBWFNlbGVjdEJveENvbXBvbmVudCB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBWFNlbGVjdEJveENvbXBvbmVudCBleHRlbmRzIEFYQmFzZVNlbGVjdGlvbkRyb3Bkb3duTWl4aW4ge1xuICBAVmlld0NoaWxkKEFYUG9wb3ZlckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgcG9wb3ZlcjogQVhQb3BvdmVyQ29tcG9uZW50O1xuXG4gIEBDb250ZW50Q2hpbGQoQVhTZWFyY2hCb3hDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIF9zZWFyY2hCb3g6IEFYU2VhcmNoQm94Q29tcG9uZW50O1xuXG4gIF90YXJnZXQ6IEhUTUxEaXZFbGVtZW50O1xuICBfcG9wb3ZlclRpdGxlOiBzdHJpbmc7XG4gIF9wb3BvdmVyV2lkdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogIERlZmluZXMgdGhlIGNsZWFyQnV0dG9uLlxuICAgKi9cbiAgQElucHV0KClcbiAgY2xlYXJCdXR0b24gPSBmYWxzZTtcblxuICAvKipcbiAgICogIERlZmluZXMgdGhlIGNoZWNrYm94LlxuICAgKi9cbiAgQElucHV0KClcbiAgY2hlY2tib3ggPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdsaXN0Q29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBsaXN0Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKCdlbXB0eVRlbXBsYXRlJylcbiAgcHJpdmF0ZSBfY29udGVudEVtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgZ2V0IGVtcHR5VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRFbXB0eVRlbXBsYXRlO1xuICB9XG5cbiAgX2lzQWN0aW9uU2hlZXQgPSBmYWxzZTtcbiAgX2ZvcmNlRm9jdXMgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgX2xvYWRpbmdPcHRpb25zID0ge1xuICAgIHRleHQ6IEFYVHJhbnNsYXRvci5nZXQoJ2xheW91dC5sb2FkaW5nLnRleHQnKSxcbiAgfTtcbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PixcbiAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9wbGF0Zm9ybTogQVhQbGF0Zm9ybSxcbiAgKSB7XG4gICAgc3VwZXIoX2VsZW1lbnRSZWYsIF9jZHIpO1xuICAgIHRoaXMuX2lzQWN0aW9uU2hlZXQgPSB0aGlzLl9wbGF0Zm9ybS5pcygnU00nKTtcbiAgICB0aGlzLl9wbGF0Zm9ybS5yZXNpemUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX2lzQWN0aW9uU2hlZXQgPSB0aGlzLl9wbGF0Zm9ybS5pcygnU00nKTtcbiAgICAgIHRoaXMucG9wb3Zlci5jbG9zZSgpO1xuICAgICAgdGhpcy5fZGV0ZWN0UG9wdXBTaXplKCk7XG4gICAgfSk7XG4gIH1cblxuICBfaGFuZGxlQXJyb3dDbGlja0V2ZW50KGU6IE1vdXNlRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGUubmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy50b2dnbGUoKTtcbiAgfVxuXG4gIF9oYW5kbGVJbnB1dENsaWNrRXZlbnQoZTogTW91c2VFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy50b2dnbGUoKTtcbiAgfVxuXG4gIG9uSW5pdCgpIHtcbiAgICBzdXBlci5vbkluaXQoKTtcbiAgICB0aGlzLl90YXJnZXQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLl91cGRhdGVQb3B1cFRpdGxlKCk7XG4gIH1cblxuICBvblZpZXdJbml0KCkge1xuICAgIHN1cGVyLm9uVmlld0luaXQoKTtcbiAgICB0aGlzLl9kZXRlY3RQb3B1cFNpemUoKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgc3VwZXIucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUG9wdXBUaXRsZSgpIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VsZWN0ZWRJdGVtcz8ubGVuZ3RoIHx8IDA7XG4gICAgLy90aGlzLl9wb3BvdmVyVGl0bGUgPSBjb3VudCA+IDEgPyBgKCR7Y291bnR9KSBpdGVtcyBzZWxlY3RlZGAgOiAodGhpcy5wbGFjZWhvbGRlciB8fCBBWFRyYW5zbGF0b3IuZ2V0KCdzZWxlY3Rib3gucG9wb3Zlci50aXRsZScpKTtcbiAgICB0aGlzLl9wb3BvdmVyVGl0bGUgPSB0aGlzLnBsYWNlaG9sZGVyIHx8IEFYVHJhbnNsYXRvci5nZXQoJ3NlbGVjdGJveC5wb3BvdmVyLnRpdGxlJyk7XG4gIH1cblxuICBwcml2YXRlIF9kZXRlY3RQb3B1cFNpemUoKSB7XG4gICAgdGhpcy5fcG9wb3ZlcldpZHRoID0gdGhpcy5faXNBY3Rpb25TaGVldCA/IDAgOiB0aGlzLl90YXJnZXQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBfaGFuZGxlT25JdGVtQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNJdGVtRGlzYWJsZWQoaXRlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy50b2dnbGVTZWxlY3QoaXRlbSk7XG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIF9oYW5kbGVMaXN0U2Nyb2xsKGU6IEV2ZW50KSB7XG4gICAgY29uc3QgbGlzdCA9IGUudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50O1xuICAgIGlmIChsaXN0LnNjcm9sbFRvcCA8IGxpc3Quc2Nyb2xsSGVpZ2h0IC0gbGlzdC5jbGllbnRIZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZmV0Y2hEYXRhKCk7XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0ZvckxvYWREYXRhKCkge1xuICAgIGNvbnN0IGxpc3Q6IGFueSA9IHRoaXMubGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmxvYWRlZENvdW50IDwgdGhpcy50b3RhbENvdW50ICYmIGxpc3Quc2Nyb2xsSGVpZ2h0IDwgbGlzdC5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCAqIDEuNSkge1xuICAgICAgdGhpcy5fZmV0Y2hEYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgX29uRGF0YUxvYWRlZCgpIHtcbiAgICBpZiAodGhpcy5wb3BvdmVyLmlzT3Blbikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NoZWNrRm9yTG9hZERhdGEoKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLl9mb3JjZUZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5fZm9jdXNTZWxlY3RlZEl0ZW0oKTtcbiAgICAgICAgICB0aGlzLl9mb3JjZUZvY3VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9jdXNTZWFyY2hCb3goKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfVxuICB9XG5cbiAgX29uVmFsdWVDaGFuZ2VkKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5fb25WYWx1ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIF9oYW5kbGVPblJlbW92ZUl0ZW1DbGljayhlOiBNb3VzZUV2ZW50LCBpdGVtOiBhbnkpIHtcbiAgICB0aGlzLnVuc2VsZWN0SXRlbXMoaXRlbSk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIF9oYW5kbGVCYWRnZVJlbW92ZShlOiBNb3VzZUV2ZW50LCBpdGVtKSB7XG4gICAgdGhpcy51bnNlbGVjdEl0ZW1zKGl0ZW0pO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIF9oYW5kbGVLZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBpc0xldHRlciA9IG5ldyBSZWdFeHAoL1thLXpBLVowLTlcXC1dLykudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGUua2V5Q29kZSkpO1xuICAgIGlmIChcbiAgICAgIGUuY29kZSA9PT0gJ0JhY2tzcGFjZScgJiZcbiAgICAgIGUudHlwZSA9PT0gJ2tleWRvd24nICYmXG4gICAgICAoKHRoaXMuYWxsb3dOdWxsID09PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAodGhpcy5hbGxvd051bGwgIT09IHRydWUgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDEpKVxuICAgICkge1xuICAgICAgdGhpcy5pc1VzZXJJbnB1dCA9IHRydWU7XG4gICAgICB0aGlzLnVuc2VsZWN0SXRlbXModGhpcy5zZWxlY3RlZEl0ZW1zLnBvcCgpKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKGUuY29kZSA9PT0gJ0Fycm93RG93bicgfHwgZS5jb2RlID09PSAnQXJyb3dVcCcgfHwgZS5jb2RlID09PSAnU3BhY2UnKSAmJlxuICAgICAgIXRoaXMucG9wb3Zlci5pc09wZW4gJiZcbiAgICAgIGUudHlwZSA9PT0gJ2tleWRvd24nXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNVc2VySW5wdXQgPSB0cnVlO1xuICAgICAgICBpZiAoZS5jdHJsS2V5IHx8IGUuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbUJ5TmF2KGUua2V5ID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGlzTGV0dGVyKSB7XG4gICAgICB0aGlzLnRleHQgPSBlLmtleTtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVQb3BvdmVyS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkudGFnTmFtZSA9PSAnSU5QVVQnICYmIFsnU3BhY2UnLCAnQmFja3NwYWNlJ10uaW5jbHVkZXMoZS5jb2RlKSkgcmV0dXJuO1xuICAgIGlmICgoZS5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGUua2V5ID09PSAnQXJyb3dVcCcpICYmIHRoaXMuZGlzcGxheUl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaXNVc2VySW5wdXQgPSB0cnVlO1xuICAgICAgdGhpcy5fZm9jdXNJdGVtQnlOYXYoZS5rZXkgPT09ICdBcnJvd0Rvd24nID8gMSA6IC0xKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS5jb2RlID09PSAnQmFja3NwYWNlJyAmJlxuICAgICAgKCh0aGlzLmFsbG93TnVsbCA9PT0gdHJ1ZSAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgKHRoaXMuYWxsb3dOdWxsICE9PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSlcbiAgICApIHtcbiAgICAgIHRoaXMuaXNVc2VySW5wdXQgPSB0cnVlO1xuICAgICAgdGhpcy51bnNlbGVjdEl0ZW1zKHRoaXMuc2VsZWN0ZWRJdGVtcy5wb3AoKSk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChlLmNvZGUgPT09ICdTcGFjZScgfHwgZS5jb2RlID09PSAnRW50ZXInKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBmb2N1c2VkSXRlbUlkID1cbiAgICAgICAgdGhpcy5saXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5heC1zdGF0ZS1mb2N1cycpPy5kYXRhc2V0Py5pZDtcbiAgICAgIGNvbnN0IGZvY3VzZWRJdGVtID0gZmluZExhc3QodGhpcy5mbGF0SXRlbXMsIFt0aGlzLnZhbHVlRmllbGQsIGZvY3VzZWRJdGVtSWRdKTtcbiAgICAgIGlmIChmb2N1c2VkSXRlbSkge1xuICAgICAgICBpZiAodGhpcy5pc0l0ZW1EaXNhYmxlZChmb2N1c2VkSXRlbSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdChmb2N1c2VkSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc1VzZXJJbnB1dCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhmb2N1c2VkSXRlbSk7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLmNvZGUgPT09ICdUYWInKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9oYW5kbGVQb3B1cE9uT3BlbmVkKGUpIHtcbiAgICB0aGlzLl9kZXRlY3RQb3B1cFNpemUoKTtcbiAgICB0aGlzLnBvcG92ZXIuZm9jdXMoKTtcbiAgICBpZiAodGhpcy5kaXNwbGF5SXRlbXMubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuX2ZvcmNlRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5fZmV0Y2hEYXRhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ZvY3VzU2VsZWN0ZWRJdGVtKCk7XG4gICAgfVxuICAgIHRoaXMuX2ZvY3VzU2VhcmNoQm94KCk7XG4gIH1cblxuICBfaGFuZGxlUG9wdXBPbkNsb3NlZChlKSB7XG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZm9jdXNTZWFyY2hCb3goKSB7XG4gICAgaWYgKHRoaXMuX3NlYXJjaEJveCAmJiAoIXRoaXMuX2lzQWN0aW9uU2hlZXQgfHwgdGhpcy5fc2VhcmNoQm94LnZhbHVlKSkge1xuICAgICAgdGhpcy5fc2VhcmNoQm94LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZm9jdXNJdGVtQnlOYXYoc2lnbjogLTEgfCAxKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGZuID0gKHMpID0+IGxpc3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4ocyk7XG4gICAgY29uc3QgaXRlbURpdjogYW55ID1cbiAgICAgIGZuKGAuYXgtbGlzdC1pdGVtLmF4LXN0YXRlLWZvY3VzYCkgfHwgZm4oYC5heC1saXN0LWl0ZW0uYXgtc3RhdGUtc2VsZWN0ZWRgKSB8fCBmbihgLmF4LWxpc3QtaXRlbWApO1xuICAgIGxldCBuZXh0ID0gKHNpZ24gPT0gMSA/IGl0ZW1EaXYubmV4dEVsZW1lbnRTaWJsaW5nIDogaXRlbURpdi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAobmV4dCkge1xuICAgICAgdGhpcy5fZm9jdXNJdGVtRWxlbWVudChuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGFyZW50ID0gaXRlbURpdi5jbG9zZXN0KCcuYXgtbGlzdC1pdGVtLWdyb3VwJyk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGxpcyA9IChzaWduID09IDEgPyBwYXJlbnQubmV4dEVsZW1lbnRTaWJsaW5nIDogcGFyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpPy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICdsaScsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGEgPSBzaWduID09IDEgPyBmaXJzdChsaXMpIDogbGFzdChsaXMpO1xuICAgICAgICBpZiAoYSkge1xuICAgICAgICAgIHRoaXMuX2ZvY3VzSXRlbUVsZW1lbnQoYSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZm9jdXNTZWxlY3RlZEl0ZW0oKSB7XG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gdGhpcy5saXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBmbiA9IChzKSA9PiBsaXN0LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHMpO1xuICAgICAgY29uc3QgaXRlbURpdiA9IGZuKGAuYXgtbGlzdC1pdGVtLmF4LXN0YXRlLXNlbGVjdGVkYCkgfHwgZm4oYC5heC1saXN0LWl0ZW1gKTtcbiAgICAgIGlmIChpdGVtRGl2KSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzSXRlbUVsZW1lbnQoaXRlbURpdik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9mb2N1c0l0ZW1FbGVtZW50KGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdCA9IHRoaXMubGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcuYXgtbGlzdC1pdGVtJykuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICBpZiAoYyA9PSBlbCkge1xuICAgICAgICAgIGMuY2xhc3NMaXN0LmFkZCgnYXgtc3RhdGUtZm9jdXMnKTtcbiAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnYXV0bycgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYy5jbGFzc0xpc3QucmVtb3ZlKCdheC1zdGF0ZS1mb2N1cycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghdGhpcy5faXNBY3Rpb25TaGVldCAmJiB0aGlzLl9zZWFyY2hCb3gpIHRoaXMuX3NlYXJjaEJveC5mb2N1cygpO1xuICAgICAgZWxzZSBlbC5mb2N1cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRJdGVtQnlOYXYoc2lnbjogLTEgfCAxKTogdm9pZCB7XG4gICAgY29uc3QgX2xhc3Q6IGFueSA9IGxhc3QodGhpcy5zZWxlY3RlZEl0ZW1zKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgaWYgKF9sYXN0KSB7XG4gICAgICBpID0gZmluZExhc3RJbmRleCh0aGlzLmZsYXRJdGVtcywgW3RoaXMudmFsdWVGaWVsZCwgX2xhc3RbdGhpcy52YWx1ZUZpZWxkXV0pO1xuICAgIH1cbiAgICBpICs9IHNpZ247XG4gICAgbGV0IG5leHQgPSBudGg8YW55Pih0aGlzLmZsYXRJdGVtcywgaSk7XG4gICAgd2hpbGUgKG5leHQ/LmNoaWxkcmVuICYmIG5leHQ/LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgaSArPSBzaWduO1xuICAgICAgbmV4dCA9IG50aDxhbnk+KHRoaXMuZmxhdEl0ZW1zLCBpKTtcbiAgICB9XG4gICAgaWYgKG5leHQpIHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbXMobmV4dCk7XG4gICAgfSBlbHNlIGlmIChuZXh0ID09IG51bGwgJiYgc2lnbiA9PSAxKSB7XG4gICAgICB0aGlzLl9mZXRjaERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBzZWFyY2goZXhwOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtcHR5KCk7XG4gICAgdGhpcy5fZm9yY2VGb2N1cyA9IHRydWU7XG4gICAgdGhpcy5fZmV0Y2hEYXRhKCk7XG4gIH1cblxuICBfZmV0Y2hEYXRhKCkge1xuICAgIHN1cGVyLl9mZXRjaERhdGEoeyBzZWFyY2hRdWVyeTogdGhpcy5fc2VhcmNoQm94Py52YWx1ZSB9KTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgX19ob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGF4LWVkaXRvci1jb250YWluZXIgYXgtZHJvcC1kb3duIGF4LWFwcGVhcmFuY2Utc29saWRgO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJheC1wcmVmaXhcIj4gPC9uZy1jb250ZW50PlxuPGRpdiBjbGFzcz1cImF4LWRyb3Bkb3duLWNvbnRlbnRcIiBbY2xhc3MuYXgtc3RhdGUtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2xpY2spPVwiX2hhbmRsZUlucHV0Q2xpY2tFdmVudCgkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJheC1zZWxlY3QtYm94LXNlbGVjdGlvblwiIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiIChmb2N1cyk9XCJfZW1pdE9uRm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAoYmx1cik9XCJfZW1pdE9uQmx1ckV2ZW50KCRldmVudClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aDsgZWxzZSBzaG93UGxhY2Vob2xkZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbXVsdGlwbGU7IHRoZW4gc2luZ2xlU2VsZWN0ZWRUZW1wbGF0ZTsgZWxzZSBtdWx0aXBsZVNlbGVjdGVkVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlU2VsZWN0ZWRUZW1wbGF0ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zXCI+XG4gICAgICAgICAgPHNwYW4+IHt7IF9nZXRJdGVtRGlzcGxheVRleHRUZW1wbHRlKGl0ZW0pIH19PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgI211bHRpcGxlU2VsZWN0ZWRUZW1wbGF0ZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF4LXNlbGVjdC1ib3gtbXVsdGktc2VsZWN0aW9uXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtc2VsZWN0LW11bHRpLWl0ZW1cIj5cbiAgICAgICAgICAgICAge3sgX2dldEl0ZW1EaXNwbGF5VGV4dFRlbXBsdGUoaXRlbSkgfX1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC1pY29uIGF4LWljb24tY2xvc2VcIiAoY2xpY2spPVwiX2hhbmRsZUJhZGdlUmVtb3ZlKCRldmVudCwgaXRlbSlcIj4gPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3Nob3dQbGFjZWhvbGRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJheC1wbGFjZWhvbGRlclwiIHJvbGU9XCJ0ZXh0Ym94XCIgYXJlYS1yZWFkb25seT1cInRydWVcIj5cbiAgICAgICAge3sgcGxhY2Vob2xkZXIgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF4LWdlbmVyYWwtYnV0dG9uIGF4LWJ1dHRvbi1pY29uXCIgKGNsaWNrKT1cImNsZWFyKClcIiBbdGFiSW5kZXhdPVwiLTFcIlxuICAqbmdJZj1cInZhbHVlICYmIGNsZWFyQnV0dG9uICYmICEoZGlzYWJsZWQgfHwgcmVhZG9ubHkpXCI+XG4gIDxzcGFuIGNsYXNzPVwiYXgtaWNvbiBheC1pY29uLWNsb3NlXCI+PC9zcGFuPlxuPC9idXR0b24+XG48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbdGFiSW5kZXhdPVwiLTFcIiBjbGFzcz1cImF4LWdlbmVyYWwtYnV0dG9uIGF4LWJ1dHRvbi1pY29uXCJcbiAgKGNsaWNrKT1cIl9oYW5kbGVBcnJvd0NsaWNrRXZlbnQoJGV2ZW50KVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nICYmICF0aGlzLnBvcG92ZXIuaXNPcGVuOyBlbHNlIGljb25UZW1wbGF0ZVwiPlxuICAgIDxheC1sb2FkaW5nIHR5cGU9XCJzcGlubmVyXCI+PC9heC1sb2FkaW5nPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNpY29uVGVtcGxhdGU+XG4gICAgPHNwYW4gY2xhc3M9XCJheC1pY29uIGF4LWljb24tY2hldnJvbi1sZWZ0IGF4LXRyYW5zaXRpb24tYWxsXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAnLWF4LXJvdGF0aW9uLTkwJzogIWlzT3BlbixcbiAgICAgICAgJ2F4LXJvdGF0aW9uLTkwJzogaXNPcGVuXG4gICAgICB9XCI+PC9zcGFuPlxuICA8L25nLXRlbXBsYXRlPlxuPC9idXR0b24+XG48bmctY29udGVudCBzZWxlY3Q9XCJheC12YWxpZGF0aW9uLXJ1bGVcIj4gPC9uZy1jb250ZW50PlxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtc3VmZml4XCI+IDwvbmctY29udGVudD5cbjxheC1wb3BvdmVyIFt0YXJnZXRdPVwiX3RhcmdldFwiIFtwbGFjZW1lbnRdPVwicG9zaXRpb25cIiBbb3Blbk9uXT1cIidtYW51YWwnXCIgW2Nsb3NlT25dPVwiJ2NsaWNrT3V0J1wiXG4gIFthZGFwdGl2aXR5RW5hYmxlZF09XCJ0cnVlXCIgKG9uT3BlbmVkKT1cIl9oYW5kbGVQb3B1cE9uT3BlbmVkKCRldmVudClcIiAob25DbG9zZWQpPVwiX2hhbmRsZVBvcHVwT25DbG9zZWQoJGV2ZW50KVwiPlxuICA8ZGl2IGNsYXNzPVwiYXgtb3ZlcmxheS1wYW5lXCIgKGtleWRvd24pPVwiX2hhbmRsZVBvcG92ZXJLZXlkb3duKCRldmVudClcIiB0YWJpbmRleD1cIjBcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGNka1RyYXBGb2N1c1xuICAgIFtjbGFzcy5heC1vdmVybGF5LWFjdGlvbnNoZWV0XT1cIl9pc0FjdGlvblNoZWV0XCIgW2NsYXNzLmF4LWZ1bGxdPVwiX3NlYXJjaEJveCB8fCBpc0xhenlcIlxuICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiX3BvcG92ZXJXaWR0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJheC1saXN0XCI+XG4gICAgICA8YXgtaGVhZGVyICpuZ0lmPVwiX2lzQWN0aW9uU2hlZXRcIj5cbiAgICAgICAgPGF4LXRpdGxlPnt7IF9wb3BvdmVyVGl0bGUgfX08L2F4LXRpdGxlPlxuICAgICAgICA8YXgtY2xvc2UtYnV0dG9uIGNsYXNzPVwiYXgtaWNvblwiXG4gICAgICAgICAgW2ljb25dPVwibXVsdGlwbGUgPyAnYXgtaWNvbi1kb25lICFheC10ZXh0LXByaW1hcnktNTAwJyA6ICdheC1pY29uLWNsb3NlJ1wiPjwvYXgtY2xvc2UtYnV0dG9uPlxuICAgICAgPC9heC1oZWFkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXgtc2VhcmNoLWJveC1jb250YWluZXJcIiBbY2xhc3MuYXgtc3RhdGUtaGlkZGVuXT1cIiFfc2VhcmNoQm94XCIgW2Nka1RyYXBGb2N1c109XCJfc2VhcmNoQm94ICE9IG51bGxcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtc2VhcmNoLWJveFwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImF4LWNvbnRlbnQgYXgtbGlzdC1pdGVtcy1jb250YWluZXIgYXgtZGVmYXVsdFwiIChzY3JvbGwpPVwiX2hhbmRsZUxpc3RTY3JvbGwoJGV2ZW50KVwiICNsaXN0Q29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheUl0ZW1zLmxlbmd0aDsgZWxzZSB0bXBFbXB0eVwiPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0bXBUcmVlOyBjb250ZXh0OiB7IGxpc3Q6IGRpc3BsYXlJdGVtcyB9XCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0bXBUcmVlIGxldC1saXN0PVwibGlzdFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3Q7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IF90cmFja0J5RnVuY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlOyBlbHNlIGRlZnVhbHRUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYXgtbGlzdC1pdGVtXCIgKGNsaWNrKT1cIl9oYW5kbGVPbkl0ZW1DbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pZF09XCJpdGVtW3RoaXMudmFsdWVGaWVsZF1cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGRpcmVjdGlvbjogZGlyZWN0aW9uIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmdWFsdFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uY2hpbGRyZW4/Lmxlbmd0aCA+IDA7IGVsc2UgdG1wSXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJheC1saXN0LWl0ZW0tZ3JvdXBcIiBbYXR0ci5kYXRhLWlkXT1cIml0ZW1bdGhpcy52YWx1ZUZpZWxkXVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBfZ2V0SXRlbURpc3BsYXlUZXh0VGVtcGx0ZShpdGVtKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8dWwgKm5nSWY9XCJpdGVtLmNoaWxkcmVuPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG1wVHJlZTsgY29udGV4dDogeyBsaXN0OiBpdGVtLmNoaWxkcmVuIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdG1wSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtdWx0aXBsZTsgZWxzZSBtdWx0aXBsZVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYXgtbGlzdC1pdGVtXCIgW2NsYXNzLmF4LXN0YXRlLXNlbGVjdGVkXT1cImlzSXRlbVNlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiIFthdHRyLnRhYmluZGV4XT1cImlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9oYW5kbGVPbkl0ZW1DbGljaygkZXZlbnQsIGl0ZW0pXCIgW2F0dHIuZGF0YS1pZF09XCJpdGVtW3RoaXMudmFsdWVGaWVsZF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBfZ2V0SXRlbURpc3BsYXlUZXh0VGVtcGx0ZShpdGVtKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtaWNvbiBheC1pY29uLWRvbmUgYXgtc2VsZWN0ZWQtaWNvblwiICpuZ0lmPVwiaXNJdGVtU2VsZWN0ZWQoaXRlbSlcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbXVsdGlwbGVUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJheC1saXN0LWl0ZW1cIiBbY2xhc3MuYXgtc3RhdGUtc2VsZWN0ZWRdPVwiaXNJdGVtU2VsZWN0ZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmF4LXN0YXRlLWRpc2FibGVkXT1cImlzSXRlbURpc2FibGVkKGl0ZW0pXCIgW2NsYXNzLmF4LXN0YXRlLWNoZWNrYm94XT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlcIiAoY2xpY2spPVwiX2hhbmRsZU9uSXRlbUNsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pZF09XCJpdGVtW3RoaXMudmFsdWVGaWVsZF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJheC1jaGVja2JveFwiIHR5cGU9XCJjaGVja2JveFwiIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKGl0ZW0pXCIgW2Rpc2FibGVkXT1cImlzSXRlbURpc2FibGVkKGl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC1jaGVja2JveC1sYWJlbFwiPnt7IF9nZXRJdGVtRGlzcGxheVRleHRUZW1wbHRlKGl0ZW0pIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJheC1pY29uIGF4LWljb24tZG9uZSBheC1zZWxlY3RlZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0l0ZW1TZWxlY3RlZChpdGVtKSAmJiAhY2hlY2tib3hcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdUZW1wbGF0ZTsgZWxzZSBlbHNlTG9hZGluZ1RlbXBsYXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1RlbXBsYXRlXCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUxvYWRpbmdUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1mbGV4IGF4LWl0ZW1zLWNlbnRlciBheC1qdXN0aWZ5LWNlbnRlciBheC1wLTRcIj5cbiAgICAgICAgICAgICAgPGF4LWxvYWRpbmcgW2NvbnRleHRdPVwiX2xvYWRpbmdPcHRpb25zXCI+PC9heC1sb2FkaW5nPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdG1wRW1wdHk+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbXB0eVRlbXBsYXRlOyBlbHNlIGVsc2VFbXB0eVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVRlbXBsYXRlXCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Vsc2VFbXB0eVRlbXBsYXRlPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1pdGVtcy1jZW50ZXIgYXgtanVzdGlmeS1jZW50ZXIgYXgtcC00XCIgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAgICdjb21tb24ubm8tcmVzdWx0LWZvcidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc1xuICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleHA6IHRoaXMuX3NlYXJjaEJveCA/IHRoaXMuX3NlYXJjaEJveC52YWx1ZSA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXCI+PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJheC1saXN0LWl0ZW1zLWNvbnRhaW5lciBheC12ZXJ0aWNhbCBheC1kZWZhdWx0XCIgW2NsYXNzLmF4LWZ1bGxdPVwiX2lzTW9iaWxlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImF4LWZvb3RlclwiPmZvb3RlcjwvZGl2PiAtLT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2F4LXBvcG92ZXI+Il19
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc2VsZWN0LWJveC9zcmMvbGliL3NlbGVjdC1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NlbGVjdC1ib3gvc3JjL2xpYi9zZWxlY3QtYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLFdBQVcsRUFFWCxvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUVuQixlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLHdCQUF3QixHQUN6QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNyRSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7O0FBRW5DOzs7O0dBSUc7QUErQ0gsTUFBTSxPQUFPLG9CQUNYLFNBQVEsT0FBTyxDQUFDLDBCQUEwQixFQUFFLHlCQUF5QixFQUFF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TixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxTQUFTO3VCQUFDLGVBQWU7Z0JBSTFCLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTFDLFFBQVE7c0JBRGpCLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQTJFbkQsY0FBYztzQkFEYixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYQ2xlYXJhYmxlQ29tcG9uZW50LFxuICBBWENsb3NiYWxlQ29tcG9uZW50LFxuICBBWENvbXBvbmVudCxcbiAgQVhEYXRlU291cmNlLFxuICBBWEZvY3VzYWJsZUNvbXBvbmVudCxcbiAgQVhTZWFyY2hhYmxlQ29tcG9uZW50LFxuICBBWFZhbHVhYmxlQ29tcG9uZW50LFxuICBBWFZhbHVlQ2hhbmdlZEV2ZW50LFxuICBNWExvb2tDb21wb25lbnQsXG4gIE1YU2VsZWN0aW9uVmFsdWVDb21wb25lbnQsXG4gIGNvbnZlcnRBcnJheVRvRGF0YVNvdXJjZSxcbn0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2NvbW1vbic7XG5pbXBvcnQgeyBBWERyb3Bkb3duQm94Q29tcG9uZW50LCBNWERyb3Bkb3duQm94QmFzZUNvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kcm9wZG93bic7XG5pbXBvcnQgeyBBWExpc3RDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvbGlzdCc7XG5pbXBvcnQgeyBBWFNlYXJjaEJveENvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9zZWFyY2gtYm94JztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZpbmRMYXN0SW5kZXgsIGxhc3QsIG50aCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBjbGFzc2VzIH0gZnJvbSAncG9seXR5cGUnO1xuXG4vKipcbiAqIFRoZSBCdXR0b24gaXMgYSBjb21wb25lbnQgd2hpY2ggZGV0ZWN0cyB1c2VyIGludGVyYWN0aW9uIGFuZCB0cmlnZ2VycyBhIGNvcnJlc3BvbmRpbmcgZXZlbnRcbiAqXG4gKiBAY2F0ZWdvcnkgQ29tcG9uZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1zZWxlY3QtYm94JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC1ib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QtYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gIGlucHV0czogW1xuICAgICdkaXNhYmxlZCcsXG4gICAgJ3JlYWRvbmx5JyxcbiAgICAndGFiSW5kZXgnLFxuICAgICdwbGFjZWhvbGRlcicsXG4gICAgJ21pblZhbHVlJyxcbiAgICAnbWF4VmFsdWUnLFxuICAgICd2YWx1ZScsXG4gICAgJ3N0YXRlJyxcbiAgICAnbmFtZScsXG4gICAgJ2lkJyxcbiAgICAndHlwZScsXG4gICAgJ2xvb2snLFxuICAgICdtdWx0aXBsZScsXG4gICAgJ3ZhbHVlRmllbGQnLFxuICAgICd0ZXh0RmllbGQnLFxuICBdLFxuICBvdXRwdXRzOiBbXG4gICAgJ3ZhbHVlQ2hhbmdlJyxcbiAgICAnc3RhdGVDaGFuZ2UnLFxuICAgICdvblZhbHVlQ2hhbmdlZCcsXG4gICAgJ29uQmx1cicsXG4gICAgJ29uRm9jdXMnLFxuICAgICdyZWFkb25seUNoYW5nZScsXG4gICAgJ2Rpc2FibGVkQ2hhbmdlJyxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHsgcHJvdmlkZTogQVhDb21wb25lbnQsIHVzZUV4aXN0aW5nOiBBWFNlbGVjdEJveENvbXBvbmVudCB9LFxuICAgIHsgcHJvdmlkZTogQVhGb2N1c2FibGVDb21wb25lbnQsIHVzZUV4aXN0aW5nOiBBWFNlbGVjdEJveENvbXBvbmVudCB9LFxuICAgIHsgcHJvdmlkZTogQVhWYWx1YWJsZUNvbXBvbmVudCwgdXNlRXhpc3Rpbmc6IEFYU2VsZWN0Qm94Q29tcG9uZW50IH0sXG4gICAgeyBwcm92aWRlOiBBWENsZWFyYWJsZUNvbXBvbmVudCwgdXNlRXhpc3Rpbmc6IEFYU2VsZWN0Qm94Q29tcG9uZW50IH0sXG4gICAgeyBwcm92aWRlOiBBWENsb3NiYWxlQ29tcG9uZW50LCB1c2VFeGlzdGluZzogQVhTZWxlY3RCb3hDb21wb25lbnQgfSxcbiAgICB7IHByb3ZpZGU6IEFYU2VhcmNoYWJsZUNvbXBvbmVudCwgdXNlRXhpc3Rpbmc6IEFYU2VsZWN0Qm94Q29tcG9uZW50IH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBWFNlbGVjdEJveENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBWFNlbGVjdEJveENvbXBvbmVudFxuICBleHRlbmRzIGNsYXNzZXMoTVhEcm9wZG93bkJveEJhc2VDb21wb25lbnQsIE1YU2VsZWN0aW9uVmFsdWVDb21wb25lbnQsIE1YTG9va0NvbXBvbmVudClcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCByZW5kZXJMaXN0ID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGRyb3Bkb3duU2l6ZXM6IHsgd2lkdGg6IHN0cmluZzsgaGVpZ2h0OiBzdHJpbmcgfSA9IHsgd2lkdGg6ICdhdXRvJywgaGVpZ2h0OiAnYXV0bycgfTtcblxuICBwcm90ZWN0ZWQgX2xpc3REYXRhU291cmNlOiBBWERhdGVTb3VyY2U8dW5rbm93bj4gPSBjb252ZXJ0QXJyYXlUb0RhdGFTb3VyY2UoW10sIHtcbiAgICBrZXk6IHRoaXMudmFsdWVGaWVsZCxcbiAgICBwYWdlU2l6ZTogMTAsXG4gIH0pO1xuXG4gIHByaXZhdGUgX2RhdGFTb3VyY2U6IEFYRGF0ZVNvdXJjZTx1bmtub3duPiB8IHVua25vd25bXTtcbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IEFYRGF0ZVNvdXJjZTx1bmtub3duPiB8IHVua25vd25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRhU291cmNlKHY6IEFYRGF0ZVNvdXJjZTx1bmtub3duPiB8IHVua25vd25bXSkge1xuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSB2O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICB0aGlzLl9saXN0RGF0YVNvdXJjZSA9IGNvbnZlcnRBcnJheVRvRGF0YVNvdXJjZSh2LCB7IGtleTogdGhpcy52YWx1ZUZpZWxkLCBwYWdlU2l6ZTogMTAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3REYXRhU291cmNlID0gdGhpcy5kYXRhU291cmNlIGFzIEFYRGF0ZVNvdXJjZTx1bmtub3duPjtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQElucHV0KClcbiAgZW1wdHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQElucHV0KClcbiAgbG9hZGluZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAVmlld0NoaWxkKEFYTGlzdENvbXBvbmVudClcbiAgbGlzdDogQVhMaXN0Q29tcG9uZW50O1xuXG4gIEBDb250ZW50Q2hpbGQoQVhTZWFyY2hCb3hDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHNlYXJjaEJveDogQVhTZWFyY2hCb3hDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZChBWERyb3Bkb3duQm94Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgZHJvcGRvd246IEFYRHJvcGRvd25Cb3hDb21wb25lbnQ7XG5cbiAgcHJvdGVjdGVkIGF1dG9IZWlnaHQgPSBmYWxzZTtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgdGhpcy5zZXREcm9wZG93blNpemUoKTtcbiAgfVxuXG4gIGdldEl0ZW1CeUtleShrZXk6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3REYXRhU291cmNlLmZpbmQoa2V5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfaGFuZGxlT25PcGVuZWRFdmVudCgpIHtcbiAgICB0aGlzLnJlbmRlckxpc3QgPSB0cnVlO1xuICAgIHRoaXMubGlzdD8ucmVuZGVyKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxpc3Q/LmZvY3VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2hhbmRsZU9uQ2xvc2VkRXZlbnQoKSB7XG4gICAgLy90aGlzLmlucHV0LmZvY3VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2hhbmRsZUJhZGdlUmVtb3ZlKGU6IE1vdXNlRXZlbnQsIGl0ZW0pIHtcbiAgICB0aGlzLnVuc2VsZWN0SXRlbXMoaXRlbSk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfaGFuZGxlT25EYXRhTG9hZChpdGVtczogdW5rbm93bltdKSB7XG4gICAgdGhpcy5zZXREcm9wZG93blNpemUoaXRlbXMubGVuZ3RoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfaGFuZGxlVmFsdWVDaGFuZ2VkKGU6IEFYVmFsdWVDaGFuZ2VkRXZlbnQpIHtcbiAgICBpZiAoZS5pc1VzZXJJbnRlcmFjdGlvbikge1xuICAgICAgdGhpcy5jb21taXRWYWx1ZShlLmNvbXBvbmVudC5zZWxlY3RlZEl0ZW1zLCB0cnVlKVxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBpbnRlcm5hbFZhbHVlQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHRoaXMuY2xvc2UoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGV0ZWN0QXV0b0hlaWdodCgpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdEF1dG9IZWlnaHQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGg6IG51bWJlciA9XG4gICAgICB0aGlzLmdldEhvc3RFbGVtZW50KCkucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oJy5heC1zZWxlY3QtYm94LXNlbGVjdGlvbicpLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGl0ZW1zV2lkdGg6IG51bWJlciA9IEFycmF5LmZyb20oXG4gICAgICB0aGlzLmdldEhvc3RFbGVtZW50KCkucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oJy5heC1zZWxlY3RlZC10b2tlbicpLFxuICAgICkucmVkdWNlKChhLCBpKSA9PiBhICsgaS5jbGllbnRXaWR0aCwgMCk7XG4gICAgdGhpcy5hdXRvSGVpZ2h0ID0gY29udGFpbmVyV2lkdGggLSBpdGVtc1dpZHRoIDw9IDg7XG4gICAgdGhpcy5kcm9wZG93bi51cGRhdGVQb3NpdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREcm9wZG93blNpemUoY291bnQgPSAwKSB7XG4gICAgaWYgKHRoaXMuZHJvcGRvd24uaXNBY3Rpb25zaGVldFN0eWxlKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duU2l6ZXMgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDpcbiAgICAgICAgICBbJ2F1dG8nLCAnMHB4J10uaW5jbHVkZXModGhpcy5kcm9wZG93blNpemVzLmhlaWdodCkgPyBgJHtNYXRoLm1pbigxNSwgY291bnQpICogNDB9cHhgIDogdGhpcy5kcm9wZG93blNpemVzLmhlaWdodCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJvcGRvd25TaXplcyA9IHtcbiAgICAgICAgd2lkdGg6IGAke3RoaXMuZ2V0SG9zdEVsZW1lbnQoKS5vZmZzZXRXaWR0aH1weGAsXG4gICAgICAgIGhlaWdodDogY291bnQgPT0gMCA/ICdhdXRvJyA6IGAke01hdGgubWluKDUsIGNvdW50KSAqIDQwfXB4YCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIF9oYW5kbGVLZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZS5jb2RlID09PSAnQXJyb3dEb3duJyB8fCBlLmNvZGUgPT09ICdBcnJvd1VwJykge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtQnlOYXYoZS5jb2RlID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChlLmNvZGUgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICB0aGlzLnVuc2VsZWN0SXRlbXModGhpcy5zZWxlY3RlZEl0ZW1zLnBvcCgpKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgLy8gaWYgKChlLmNvZGUgPT09ICdTcGFjZScgfHwgZS5jb2RlID09PSAnRW50ZXInKSAmJiB0aGlzLmhhc0l0ZW1zKSB7XG4gICAgLy8gICAgIGlmICh0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAvLyAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgaWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KCdsaScpPy5kYXRhc2V0Py5pZDtcbiAgICAvLyAgICAgdGhpcy50b2dnbGVTZWxlY3QoaWQpO1xuICAgIC8vICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAvLyB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEl0ZW1CeU5hdihzaWduOiAxIHwgLTEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpICYmICF0aGlzLm11bHRpcGxlKSB7XG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMubm9ybWFsaXplSXRlbXNMaXN0KHRoaXMuZGF0YVNvdXJjZSk7XG4gICAgICBjb25zdCBfbGFzdDogYW55ID0gbGFzdCh0aGlzLnNlbGVjdGVkSXRlbXMpO1xuICAgICAgbGV0IGkgPSAtMTtcbiAgICAgIGlmIChfbGFzdCkge1xuICAgICAgICBpID0gZmluZExhc3RJbmRleChpdGVtcywgW3RoaXMudmFsdWVGaWVsZCwgX2xhc3RbdGhpcy52YWx1ZUZpZWxkXV0pO1xuICAgICAgfVxuICAgICAgaSArPSBzaWduO1xuICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgICBjb25zdCBuZXh0ID0gbnRoPHVua25vd24+KGl0ZW1zLCBpKTtcbiAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbXMobmV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIHNlYXJjaCh0ZXJtOiBzdHJpbmcpIHtcbiAgICBpZiAodGVybSkge1xuICAgICAgY29uc3QgcSA9IHt9O1xuICAgICAgcVt0aGlzLnRleHRGaWVsZF0gPSB0ZXJtO1xuICAgICAgdGhpcy5fbGlzdERhdGFTb3VyY2UuZmlsdGVyKHEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0RGF0YVNvdXJjZS5maWx0ZXIoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxheC1kcm9wZG93bi1ib3hcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgKG9uT3BlbmVkKT1cIl9oYW5kbGVPbk9wZW5lZEV2ZW50KClcIlxuICAob25DbG9zZWQpPVwiX2hhbmRsZU9uQ2xvc2VkRXZlbnQoKVwiXG4gIFtsb29rXT1cImxvb2tcIlxuICBbY2xhc3MuYXgtYXV0by1oZWlnaHRdPVwiYXV0b0hlaWdodFwiXG4+XG4gIDxuZy1jb250YWluZXIgaW5wdXQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtcHJlZml4XCI+IDwvbmctY29udGVudD5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImF4LXNlbGVjdC1ib3gtc2VsZWN0aW9uXCJcbiAgICAgIFtjbGFzcy5heC1tdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICBbdGFiaW5kZXhdPVwidGFiSW5kZXhcIlxuICAgICAgKGZvY3VzKT1cImVtaXRPbkZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAoYmx1cik9XCJlbWl0T25CbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJheC1wbGFjZWhvbGRlclwiIHJvbGU9XCJ0ZXh0Ym94XCIgYXJlYS1yZWFkb25seT1cInRydWVcIiAqbmdJZj1cInNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtc2VsZWN0ZWQtdG9rZW5cIj5cbiAgICAgICAgICB7eyBnZXREaXNwbGF5VGV4dChpdGVtKSB9fVxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtaWNvbiBheC1pY29uLWNsb3NlXCIgKGNsaWNrKT1cIl9oYW5kbGVCYWRnZVJlbW92ZSgkZXZlbnQsIGl0ZW0pXCIgKm5nSWY9XCJtdWx0aXBsZVwiPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCIgYXgtY2xlYXItYnV0dG9uXCI+PC9uZy1jb250ZW50PlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFt0YWJJbmRleF09XCItMVwiXG4gICAgICBjbGFzcz1cImF4LWdlbmVyYWwtYnV0dG9uIGF4LWJ1dHRvbi1pY29uXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZyAmJiAhaXNPcGVuOyBlbHNlIGljb25UZW1wbGF0ZVwiPlxuICAgICAgICA8YXgtbG9hZGluZyB0eXBlPVwic3Bpbm5lclwiPjwvYXgtbG9hZGluZz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNpY29uVGVtcGxhdGU+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJheC1pY29uIGF4LWljb24tY2hldnJvbi1sZWZ0IGF4LWFycm93LWJ1dHRvblwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJy1yb3RhdGlvbi05MCc6ICFpc09wZW4sXG4gICAgICAgICAgICAncm90YXRpb24tOTAnOiBpc09wZW5cbiAgICAgICAgICB9XCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9idXR0b24+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtc3VmZml4XCI+IDwvbmctY29udGVudD5cbiAgICA8bmctdGVtcGxhdGUgI3NlYXJjaD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImF4LXNlYXJjaC1ib3hcIj4gPC9uZy1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyIHBhbmVsPlxuICAgIDxkaXYgY2xhc3M9XCJheC1zZWxlY3QtYm94LXBhbmVsXCI+XG4gICAgICA8YXgtaGVhZGVyIGNsYXNzPVwiYXgtc29saWRcIiAqbmdJZj1cImRyb3Bkb3duLmlzQWN0aW9uc2hlZXRTdHlsZVwiPlxuICAgICAgICA8YXgtdGl0bGU+e3sgcGxhY2Vob2xkZXIgfX08L2F4LXRpdGxlPlxuICAgICAgICA8YXgtY2xvc2UtYnV0dG9uXG4gICAgICAgICAgW2ljb25dPVwibXVsdGlwbGUgPyAnYXgtaWNvbiBheC1pY29uLWRvbmUgIWF4LXRleHQtcHJpbWFyeS01MDAnIDogJ2F4LWljb24gYXgtaWNvbi1jbG9zZSdcIlxuICAgICAgICA+PC9heC1jbG9zZS1idXR0b24+XG4gICAgICA8L2F4LWhlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJheC1zZWFyY2gtY29udGFpbmVyXCIgKm5nSWY9XCJzZWFyY2hCb3hcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlYXJjaFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxheC1saXN0XG4gICAgICAgICpuZ0lmPVwicmVuZGVyTGlzdFwiXG4gICAgICAgIFtkYXRhU291cmNlXT1cIl9saXN0RGF0YVNvdXJjZVwiXG4gICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJkcm9wZG93blNpemVzLndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJkcm9wZG93blNpemVzLmhlaWdodFwiXG4gICAgICAgIFt2YWx1ZUZpZWxkXT1cInZhbHVlRmllbGRcIlxuICAgICAgICBbdGV4dEZpZWxkXT1cInRleHRGaWVsZFwiXG4gICAgICAgIFtlbXB0eVRlbXBsYXRlXT1cImVtcHR5VGVtcGxhdGUgPz8gZW1wdHlcIlxuICAgICAgICBbaXRlbVRlbXBsYXRlXT1cIml0ZW1UZW1wbGF0ZVwiXG4gICAgICAgIFtsb2FkaW5nVGVtcGxhdGVdPVwibG9hZGluZ1RlbXBsYXRlXCJcbiAgICAgICAgW25nTW9kZWxdPVwidmFsdWVcIlxuICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiX2hhbmRsZVZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgKG9uRGF0YUxvYWQpPVwiX2hhbmRsZU9uRGF0YUxvYWQoJGV2ZW50KVwiXG4gICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cIidpdGVtJ1wiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHk+IE5vIEl0ZW1zISA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9heC1saXN0PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtZm9vdGVyXCI+IDwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2F4LWRyb3Bkb3duLWJveD5cbjxuZy1jb250ZW50IHNlbGVjdD1cImF4LXZhbGlkYXRpb24tcnVsZVwiPiA8L25nLWNvbnRlbnQ+XG4iXX0=