slick-components 4.4.13 → 4.4.16

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 (346) hide show
  1. package/css/slick-components.css +598 -365
  2. package/css/slick-components.min.css +1 -1
  3. package/esm2020/public-api.mjs +43 -0
  4. package/esm2020/slick-accordion/slick-accordion-item-header.component.mjs +14 -0
  5. package/esm2020/slick-accordion/slick-accordion-item.component.mjs +86 -0
  6. package/esm2020/slick-accordion/slick-accordion.component.mjs +75 -0
  7. package/esm2020/slick-accordion/slick-accordion.module.mjs +23 -0
  8. package/esm2020/slick-auto-complete/slick-auto-complete-list-item-template.directive.mjs +22 -0
  9. package/esm2020/slick-auto-complete/slick-auto-complete.component.mjs +375 -0
  10. package/esm2020/slick-auto-complete/slick-auto-complete.module.mjs +24 -0
  11. package/esm2020/slick-button-spinner/slick-button-spinner.component.mjs +175 -0
  12. package/esm2020/slick-button-spinner/slick-button-spinner.module.mjs +19 -0
  13. package/esm2020/slick-calendar/slick-calendar.component.mjs +246 -0
  14. package/esm2020/slick-calendar/slick-calendar.module.mjs +19 -0
  15. package/esm2020/slick-card/slick-card-header.component.mjs +14 -0
  16. package/esm2020/slick-card/slick-card.component.mjs +42 -0
  17. package/esm2020/slick-card/slick-card.module.mjs +20 -0
  18. package/esm2020/slick-components.mjs +5 -0
  19. package/esm2020/slick-confirm-dialog/slick-confirm-dialog.component.mjs +65 -0
  20. package/esm2020/slick-confirm-dialog/slick-confirm-dialog.module.mjs +20 -0
  21. package/esm2020/slick-container/slick-container-body.component.mjs +24 -0
  22. package/esm2020/slick-container/slick-container-footer.component.mjs +20 -0
  23. package/esm2020/slick-container/slick-container-header.component.mjs +20 -0
  24. package/esm2020/slick-container/slick-container.component.mjs +21 -0
  25. package/esm2020/slick-container/slick-container.module.mjs +25 -0
  26. package/esm2020/slick-context-menu/slick-context-menu-item.component.mjs +14 -0
  27. package/esm2020/slick-context-menu/slick-context-menu.component.mjs +48 -0
  28. package/esm2020/slick-context-menu/slick-context-menu.module.mjs +20 -0
  29. package/{esm2015/slick-currency-mask/slick-currency-mask-options.model.js → esm2020/slick-currency-mask/slick-currency-mask-options.model.mjs} +0 -0
  30. package/esm2020/slick-currency-mask/slick-currency-mask.directive.mjs +233 -0
  31. package/esm2020/slick-currency-mask/slick-currency-mask.module.mjs +19 -0
  32. package/esm2020/slick-date-picker/slick-date-picker.component.mjs +278 -0
  33. package/esm2020/slick-date-picker/slick-date-picker.module.mjs +21 -0
  34. package/esm2020/slick-dialog/slick-dialog-footer.component.mjs +24 -0
  35. package/esm2020/slick-dialog/slick-dialog.component.mjs +294 -0
  36. package/esm2020/slick-dialog/slick-dialog.module.mjs +23 -0
  37. package/esm2020/slick-dialog/slick-dialog.service.mjs +68 -0
  38. package/esm2020/slick-drag-drop/slick-drag-drop.directive.mjs +13 -0
  39. package/esm2020/slick-drag-drop/slick-drag-drop.module.mjs +21 -0
  40. package/esm2020/slick-drag-drop/slick-draggable.directive.mjs +13 -0
  41. package/{esm2015/slick-drop-down/slick-drop-down-button.model.js → esm2020/slick-drop-down/slick-drop-down-button.model.mjs} +0 -0
  42. package/esm2020/slick-drop-down/slick-drop-down.component.mjs +479 -0
  43. package/esm2020/slick-drop-down/slick-drop-down.module.mjs +24 -0
  44. package/esm2020/slick-drop-down/slick-drop-down.service.mjs +55 -0
  45. package/esm2020/slick-drop-list/slick-drop-list-grab.directive.mjs +18 -0
  46. package/esm2020/slick-drop-list/slick-drop-list-item.directive.mjs +18 -0
  47. package/esm2020/slick-drop-list/slick-drop-list.directive.mjs +215 -0
  48. package/esm2020/slick-drop-list/slick-drop-list.module.mjs +23 -0
  49. package/esm2020/slick-email-viewer/slick-email-viewer-dialog.component.mjs +81 -0
  50. package/esm2020/slick-email-viewer/slick-email-viewer.component.mjs +42 -0
  51. package/esm2020/slick-email-viewer/slick-email-viewer.module.mjs +26 -0
  52. package/{esm2015/slick-emailer/slick-emailer-address.model.js → esm2020/slick-emailer/slick-emailer-address.model.mjs} +0 -0
  53. package/esm2020/slick-emailer/slick-emailer-dialog.component.mjs +153 -0
  54. package/esm2020/slick-emailer/slick-emailer.component.mjs +235 -0
  55. package/{esm2015/slick-emailer/slick-emailer.model.js → esm2020/slick-emailer/slick-emailer.model.mjs} +0 -0
  56. package/esm2020/slick-emailer/slick-emailer.module.mjs +29 -0
  57. package/esm2020/slick-file-drop/slick-file-drop.component.mjs +156 -0
  58. package/esm2020/slick-file-drop/slick-file-drop.module.mjs +20 -0
  59. package/esm2020/slick-file-list/slick-file-list-item.component.mjs +173 -0
  60. package/esm2020/slick-file-list/slick-file-list.component.mjs +130 -0
  61. package/esm2020/slick-file-list/slick-file-list.module.mjs +23 -0
  62. package/{esm2015/slick-file-model/slick-file.model.js → esm2020/slick-file-model/slick-file.model.mjs} +0 -0
  63. package/esm2020/slick-google-address-search/slick-google-address-search.directive.mjs +75 -0
  64. package/esm2020/slick-google-address-search/slick-google-address-search.module.mjs +19 -0
  65. package/esm2020/slick-google-map/slick-google-map-dialog.component.mjs +50 -0
  66. package/esm2020/slick-google-map/slick-google-map.component.mjs +48 -0
  67. package/esm2020/slick-google-map/slick-google-map.module.mjs +22 -0
  68. package/esm2020/slick-grid/slick-grid-column-template.directive.mjs +19 -0
  69. package/{esm2015/slick-grid/slick-grid-column.model.js → esm2020/slick-grid/slick-grid-column.model.mjs} +0 -0
  70. package/{esm2015/slick-grid/slick-grid-favorite.model.js → esm2020/slick-grid/slick-grid-favorite.model.mjs} +0 -0
  71. package/{esm2015/slick-grid/slick-grid-request.model.js → esm2020/slick-grid/slick-grid-request.model.mjs} +0 -0
  72. package/{esm2015/slick-grid/slick-grid-response.model.js → esm2020/slick-grid/slick-grid-response.model.mjs} +0 -0
  73. package/esm2020/slick-grid/slick-grid-sanitize.pipe.mjs +20 -0
  74. package/esm2020/slick-grid/slick-grid.component.mjs +793 -0
  75. package/esm2020/slick-grid/slick-grid.module.mjs +43 -0
  76. package/{esm2015/slick-grid/slick-grid.options.js → esm2020/slick-grid/slick-grid.options.mjs} +0 -0
  77. package/esm2020/slick-grid/slick-grid.service.mjs +66 -0
  78. package/esm2020/slick-multi-select/slick-multi-select.component.mjs +362 -0
  79. package/esm2020/slick-multi-select/slick-multi-select.module.mjs +20 -0
  80. package/esm2020/slick-multi-select/slick-multi-select.service.mjs +77 -0
  81. package/esm2020/slick-ordered-list/slick-ordered-list.component.mjs +200 -0
  82. package/esm2020/slick-ordered-list/slick-ordered-list.module.mjs +20 -0
  83. package/esm2020/slick-paging/slick-paging.component.mjs +185 -0
  84. package/esm2020/slick-paging/slick-paging.module.mjs +19 -0
  85. package/esm2020/slick-photo-gallery/slick-photo-gallery.component.mjs +98 -0
  86. package/{esm2015/slick-photo-gallery/slick-photo-gallery.model.js → esm2020/slick-photo-gallery/slick-photo-gallery.model.mjs} +0 -0
  87. package/esm2020/slick-photo-gallery/slick-photo-gallery.module.mjs +21 -0
  88. package/esm2020/slick-pick-list/slick-pick-list.component.mjs +84 -0
  89. package/esm2020/slick-pick-list/slick-pick-list.module.mjs +20 -0
  90. package/esm2020/slick-popover/slick-popover.component.mjs +204 -0
  91. package/esm2020/slick-popover/slick-popover.module.mjs +19 -0
  92. package/esm2020/slick-profile-picture/slick-profile-picture.component.mjs +267 -0
  93. package/esm2020/slick-profile-picture/slick-profile-picture.module.mjs +20 -0
  94. package/esm2020/slick-progress-bar/slick-progress-bar.module.mjs +18 -0
  95. package/esm2020/slick-progress-bar/slick-progress-bar.service.mjs +53 -0
  96. package/esm2020/slick-screen-blocker/slick-screen-blocker.module.mjs +18 -0
  97. package/esm2020/slick-screen-blocker/slick-screen-blocker.service.mjs +83 -0
  98. package/{esm2015/slick-slider/slick-slider-tick.model.js → esm2020/slick-slider/slick-slider-tick.model.mjs} +0 -0
  99. package/esm2020/slick-slider/slick-slider.component.mjs +90 -0
  100. package/esm2020/slick-slider/slick-slider.module.mjs +20 -0
  101. package/esm2020/slick-split-screen/slick-screen-split-left-content.component.mjs +15 -0
  102. package/esm2020/slick-split-screen/slick-screen-split-right-content.component.mjs +15 -0
  103. package/esm2020/slick-split-screen/slick-split-screen.component.mjs +159 -0
  104. package/esm2020/slick-split-screen/slick-split-screen.module.mjs +21 -0
  105. package/esm2020/slick-tabs/slick-tab-header.component.mjs +28 -0
  106. package/esm2020/slick-tabs/slick-tab.component.mjs +63 -0
  107. package/{esm2015/slick-tabs/slick-tab.model.js → esm2020/slick-tabs/slick-tab.model.mjs} +0 -0
  108. package/esm2020/slick-tabs/slick-tabs.component.mjs +107 -0
  109. package/esm2020/slick-tabs/slick-tabs.module.mjs +23 -0
  110. package/esm2020/slick-toast/slick-toast.module.mjs +18 -0
  111. package/esm2020/slick-toast/slick-toast.service.mjs +88 -0
  112. package/{esm2015/slick-tree-view/slick-tree-node.model.js → esm2020/slick-tree-view/slick-tree-node.model.mjs} +0 -0
  113. package/esm2020/slick-tree-view/slick-tree-view.component.mjs +293 -0
  114. package/esm2020/slick-tree-view/slick-tree-view.module.mjs +22 -0
  115. package/esm2020/slick-type-ahead/slick-type-ahead.directive.mjs +164 -0
  116. package/esm2020/slick-type-ahead/slick-type-ahead.module.mjs +18 -0
  117. package/esm2020/slick-validation-indicator/slick-validation-indicator.directive.mjs +63 -0
  118. package/esm2020/slick-validation-indicator/slick-validation-indicator.module.mjs +19 -0
  119. package/esm2020/utils/slick-function-lock.service.mjs +55 -0
  120. package/esm2020/utils/slick-init.service.mjs +49 -0
  121. package/esm2020/utils/slick-log.service.mjs +23 -0
  122. package/esm2020/utils/slick-sleep.service.mjs +14 -0
  123. package/esm2020/utils/slick-utils.service.mjs +247 -0
  124. package/fesm2015/{slick-components.js → slick-components.mjs} +2779 -2070
  125. package/fesm2015/slick-components.mjs.map +1 -0
  126. package/fesm2020/slick-components.mjs +8467 -0
  127. package/fesm2020/slick-components.mjs.map +1 -0
  128. package/package.json +20 -8
  129. package/public-api.d.ts +8 -8
  130. package/slick-accordion/slick-accordion-item-header.component.d.ts +3 -0
  131. package/slick-accordion/slick-accordion-item.component.d.ts +3 -0
  132. package/slick-accordion/slick-accordion.component.d.ts +3 -0
  133. package/slick-accordion/slick-accordion.module.d.ts +8 -0
  134. package/slick-auto-complete/slick-auto-complete-list-item-template.directive.d.ts +3 -0
  135. package/slick-auto-complete/slick-auto-complete.component.d.ts +3 -0
  136. package/slick-auto-complete/slick-auto-complete.module.d.ts +8 -0
  137. package/slick-button-spinner/slick-button-spinner.component.d.ts +3 -0
  138. package/slick-button-spinner/slick-button-spinner.module.d.ts +6 -0
  139. package/slick-calendar/slick-calendar.component.d.ts +3 -0
  140. package/slick-calendar/slick-calendar.module.d.ts +6 -0
  141. package/slick-card/slick-card-header.component.d.ts +3 -0
  142. package/slick-card/slick-card.component.d.ts +3 -0
  143. package/slick-card/slick-card.module.d.ts +10 -0
  144. package/slick-components.d.ts +1 -22
  145. package/slick-confirm-dialog/slick-confirm-dialog.component.d.ts +3 -0
  146. package/slick-confirm-dialog/slick-confirm-dialog.module.d.ts +7 -0
  147. package/slick-container/slick-container-body.component.d.ts +3 -0
  148. package/slick-container/slick-container-footer.component.d.ts +3 -0
  149. package/slick-container/slick-container-header.component.d.ts +3 -0
  150. package/slick-container/slick-container.component.d.ts +3 -0
  151. package/slick-container/slick-container.module.d.ts +9 -0
  152. package/slick-context-menu/slick-context-menu-item.component.d.ts +3 -0
  153. package/slick-context-menu/slick-context-menu.component.d.ts +3 -0
  154. package/slick-context-menu/slick-context-menu.module.d.ts +7 -0
  155. package/slick-currency-mask/slick-currency-mask.directive.d.ts +3 -0
  156. package/slick-currency-mask/slick-currency-mask.module.d.ts +5 -0
  157. package/slick-date-picker/slick-date-picker.component.d.ts +3 -0
  158. package/slick-date-picker/slick-date-picker.module.d.ts +8 -0
  159. package/slick-dialog/slick-dialog-footer.component.d.ts +3 -0
  160. package/slick-dialog/slick-dialog.component.d.ts +3 -0
  161. package/slick-dialog/slick-dialog.module.d.ts +10 -1
  162. package/slick-dialog/slick-dialog.service.d.ts +3 -0
  163. package/slick-drag-drop/slick-drag-drop.directive.d.ts +3 -0
  164. package/slick-drag-drop/slick-drag-drop.module.d.ts +11 -0
  165. package/slick-drag-drop/slick-draggable.directive.d.ts +3 -0
  166. package/slick-drop-down/slick-drop-down.component.d.ts +3 -0
  167. package/slick-drop-down/slick-drop-down.module.d.ts +9 -0
  168. package/slick-drop-down/slick-drop-down.service.d.ts +3 -0
  169. package/slick-drop-list/slick-drop-list-grab.directive.d.ts +3 -0
  170. package/slick-drop-list/slick-drop-list-item.directive.d.ts +3 -0
  171. package/slick-drop-list/slick-drop-list.directive.d.ts +13 -7
  172. package/slick-drop-list/slick-drop-list.module.d.ts +14 -0
  173. package/slick-email-viewer/slick-email-viewer-dialog.component.d.ts +3 -0
  174. package/slick-email-viewer/slick-email-viewer.component.d.ts +3 -0
  175. package/slick-email-viewer/slick-email-viewer.module.d.ts +10 -0
  176. package/slick-emailer/slick-emailer-dialog.component.d.ts +3 -0
  177. package/slick-emailer/slick-emailer.component.d.ts +3 -0
  178. package/slick-emailer/slick-emailer.module.d.ts +13 -0
  179. package/slick-file-drop/slick-file-drop.component.d.ts +3 -0
  180. package/slick-file-drop/slick-file-drop.module.d.ts +7 -0
  181. package/slick-file-list/slick-file-list-item.component.d.ts +3 -0
  182. package/slick-file-list/slick-file-list.component.d.ts +3 -0
  183. package/slick-file-list/slick-file-list.module.d.ts +10 -0
  184. package/slick-google-address-search/slick-google-address-search.directive.d.ts +3 -0
  185. package/slick-google-address-search/slick-google-address-search.module.d.ts +6 -0
  186. package/slick-google-map/slick-google-map-dialog.component.d.ts +3 -0
  187. package/slick-google-map/slick-google-map.component.d.ts +3 -0
  188. package/slick-google-map/slick-google-map.module.d.ts +8 -0
  189. package/slick-grid/slick-grid-column-template.directive.d.ts +3 -0
  190. package/slick-grid/slick-grid-sanitize.pipe.d.ts +3 -0
  191. package/slick-grid/slick-grid.component.d.ts +3 -0
  192. package/slick-grid/slick-grid.module.d.ts +16 -0
  193. package/slick-grid/slick-grid.service.d.ts +3 -0
  194. package/slick-multi-select/slick-multi-select.component.d.ts +3 -0
  195. package/slick-multi-select/slick-multi-select.module.d.ts +7 -0
  196. package/slick-multi-select/slick-multi-select.service.d.ts +3 -0
  197. package/slick-ordered-list/slick-ordered-list.component.d.ts +3 -0
  198. package/slick-ordered-list/slick-ordered-list.module.d.ts +7 -0
  199. package/slick-paging/slick-paging.component.d.ts +3 -0
  200. package/slick-paging/slick-paging.module.d.ts +6 -0
  201. package/slick-photo-gallery/slick-photo-gallery.component.d.ts +3 -0
  202. package/slick-photo-gallery/slick-photo-gallery.module.d.ts +6 -0
  203. package/slick-pick-list/slick-pick-list.component.d.ts +3 -0
  204. package/slick-pick-list/slick-pick-list.module.d.ts +7 -0
  205. package/slick-popover/slick-popover.component.d.ts +3 -0
  206. package/slick-popover/slick-popover.module.d.ts +6 -0
  207. package/slick-profile-picture/slick-profile-picture.component.d.ts +3 -0
  208. package/slick-profile-picture/slick-profile-picture.module.d.ts +7 -0
  209. package/slick-progress-bar/slick-progress-bar.module.d.ts +5 -0
  210. package/slick-progress-bar/slick-progress-bar.service.d.ts +3 -0
  211. package/slick-screen-blocker/slick-screen-blocker.module.d.ts +5 -0
  212. package/slick-screen-blocker/slick-screen-blocker.service.d.ts +3 -0
  213. package/slick-slider/slick-slider.component.d.ts +3 -0
  214. package/slick-slider/slick-slider.module.d.ts +6 -0
  215. package/slick-split-screen/slick-screen-split-left-content.component.d.ts +3 -0
  216. package/slick-split-screen/slick-screen-split-right-content.component.d.ts +3 -0
  217. package/slick-split-screen/slick-split-screen.component.d.ts +3 -0
  218. package/slick-split-screen/slick-split-screen.module.d.ts +8 -0
  219. package/slick-tabs/slick-tab-header.component.d.ts +3 -0
  220. package/slick-tabs/slick-tab.component.d.ts +3 -0
  221. package/slick-tabs/slick-tabs.component.d.ts +3 -0
  222. package/slick-tabs/slick-tabs.module.d.ts +10 -0
  223. package/slick-toast/slick-toast.module.d.ts +5 -0
  224. package/slick-toast/slick-toast.service.d.ts +3 -0
  225. package/slick-tree-view/slick-tree-view.component.d.ts +3 -0
  226. package/slick-tree-view/slick-tree-view.module.d.ts +8 -0
  227. package/slick-type-ahead/slick-type-ahead.directive.d.ts +3 -0
  228. package/slick-type-ahead/slick-type-ahead.module.d.ts +5 -0
  229. package/slick-validation-indicator/slick-validation-indicator.directive.d.ts +3 -0
  230. package/slick-validation-indicator/slick-validation-indicator.module.d.ts +6 -0
  231. package/utils/slick-function-lock.service.d.ts +3 -0
  232. package/utils/slick-init.service.d.ts +3 -0
  233. package/utils/slick-log.service.d.ts +3 -0
  234. package/utils/slick-sleep.service.d.ts +3 -0
  235. package/utils/slick-utils.service.d.ts +5 -0
  236. package/bundles/slick-components.umd.js +0 -9777
  237. package/bundles/slick-components.umd.js.map +0 -1
  238. package/esm2015/public-api.js +0 -43
  239. package/esm2015/slick-accordion/slick-accordion-item-header.component.js +0 -10
  240. package/esm2015/slick-accordion/slick-accordion-item.component.js +0 -80
  241. package/esm2015/slick-accordion/slick-accordion.component.js +0 -77
  242. package/esm2015/slick-accordion/slick-accordion.module.js +0 -18
  243. package/esm2015/slick-auto-complete/slick-auto-complete-list-item-template.directive.js +0 -21
  244. package/esm2015/slick-auto-complete/slick-auto-complete.component.js +0 -352
  245. package/esm2015/slick-auto-complete/slick-auto-complete.module.js +0 -19
  246. package/esm2015/slick-button-spinner/slick-button-spinner.component.js +0 -186
  247. package/esm2015/slick-button-spinner/slick-button-spinner.module.js +0 -14
  248. package/esm2015/slick-calendar/slick-calendar.component.js +0 -233
  249. package/esm2015/slick-calendar/slick-calendar.module.js +0 -14
  250. package/esm2015/slick-card/slick-card-header.component.js +0 -10
  251. package/esm2015/slick-card/slick-card.component.js +0 -37
  252. package/esm2015/slick-card/slick-card.module.js +0 -14
  253. package/esm2015/slick-components.js +0 -27
  254. package/esm2015/slick-confirm-dialog/slick-confirm-dialog.component.js +0 -62
  255. package/esm2015/slick-confirm-dialog/slick-confirm-dialog.module.js +0 -15
  256. package/esm2015/slick-container/slick-container-body.component.js +0 -18
  257. package/esm2015/slick-container/slick-container-footer.component.js +0 -16
  258. package/esm2015/slick-container/slick-container-header.component.js +0 -16
  259. package/esm2015/slick-container/slick-container.component.js +0 -19
  260. package/esm2015/slick-container/slick-container.module.js +0 -20
  261. package/esm2015/slick-context-menu/slick-context-menu-item.component.js +0 -10
  262. package/esm2015/slick-context-menu/slick-context-menu.component.js +0 -43
  263. package/esm2015/slick-context-menu/slick-context-menu.module.js +0 -15
  264. package/esm2015/slick-currency-mask/slick-currency-mask.directive.js +0 -234
  265. package/esm2015/slick-currency-mask/slick-currency-mask.module.js +0 -14
  266. package/esm2015/slick-date-picker/slick-date-picker.component.js +0 -267
  267. package/esm2015/slick-date-picker/slick-date-picker.module.js +0 -16
  268. package/esm2015/slick-dialog/slick-dialog-footer.component.js +0 -18
  269. package/esm2015/slick-dialog/slick-dialog.component.js +0 -282
  270. package/esm2015/slick-dialog/slick-dialog.module.js +0 -18
  271. package/esm2015/slick-dialog/slick-dialog.service.js +0 -67
  272. package/esm2015/slick-drag-drop/slick-drag-drop.directive.js +0 -9
  273. package/esm2015/slick-drag-drop/slick-drag-drop.module.js +0 -14
  274. package/esm2015/slick-drag-drop/slick-draggable.directive.js +0 -9
  275. package/esm2015/slick-drop-down/slick-drop-down.component.js +0 -465
  276. package/esm2015/slick-drop-down/slick-drop-down.module.js +0 -19
  277. package/esm2015/slick-drop-down/slick-drop-down.service.js +0 -59
  278. package/esm2015/slick-drop-list/slick-drop-list-grab.directive.js +0 -18
  279. package/esm2015/slick-drop-list/slick-drop-list-item.directive.js +0 -18
  280. package/esm2015/slick-drop-list/slick-drop-list.directive.js +0 -162
  281. package/esm2015/slick-drop-list/slick-drop-list.module.js +0 -15
  282. package/esm2015/slick-email-viewer/slick-email-viewer-dialog.component.js +0 -61
  283. package/esm2015/slick-email-viewer/slick-email-viewer.component.js +0 -39
  284. package/esm2015/slick-email-viewer/slick-email-viewer.module.js +0 -21
  285. package/esm2015/slick-emailer/slick-emailer-dialog.component.js +0 -122
  286. package/esm2015/slick-emailer/slick-emailer.component.js +0 -226
  287. package/esm2015/slick-emailer/slick-emailer.module.js +0 -24
  288. package/esm2015/slick-file-drop/slick-file-drop.component.js +0 -144
  289. package/esm2015/slick-file-drop/slick-file-drop.module.js +0 -15
  290. package/esm2015/slick-file-list/slick-file-list-item.component.js +0 -156
  291. package/esm2015/slick-file-list/slick-file-list.component.js +0 -114
  292. package/esm2015/slick-file-list/slick-file-list.module.js +0 -18
  293. package/esm2015/slick-google-address-search/slick-google-address-search.directive.js +0 -75
  294. package/esm2015/slick-google-address-search/slick-google-address-search.module.js +0 -14
  295. package/esm2015/slick-google-map/slick-google-map-dialog.component.js +0 -45
  296. package/esm2015/slick-google-map/slick-google-map.component.js +0 -45
  297. package/esm2015/slick-google-map/slick-google-map.module.js +0 -17
  298. package/esm2015/slick-grid/slick-grid-column-template.directive.js +0 -19
  299. package/esm2015/slick-grid/slick-grid-sanitize.pipe.js +0 -20
  300. package/esm2015/slick-grid/slick-grid.component.js +0 -792
  301. package/esm2015/slick-grid/slick-grid.module.js +0 -38
  302. package/esm2015/slick-grid/slick-grid.service.js +0 -72
  303. package/esm2015/slick-multi-select/slick-multi-select.component.js +0 -356
  304. package/esm2015/slick-multi-select/slick-multi-select.module.js +0 -15
  305. package/esm2015/slick-multi-select/slick-multi-select.service.js +0 -74
  306. package/esm2015/slick-ordered-list/slick-ordered-list.component.js +0 -198
  307. package/esm2015/slick-ordered-list/slick-ordered-list.module.js +0 -15
  308. package/esm2015/slick-paging/slick-paging.component.js +0 -180
  309. package/esm2015/slick-paging/slick-paging.module.js +0 -14
  310. package/esm2015/slick-photo-gallery/slick-photo-gallery.component.js +0 -101
  311. package/esm2015/slick-photo-gallery/slick-photo-gallery.module.js +0 -16
  312. package/esm2015/slick-pick-list/slick-pick-list.component.js +0 -78
  313. package/esm2015/slick-pick-list/slick-pick-list.module.js +0 -15
  314. package/esm2015/slick-popover/slick-popover.component.js +0 -199
  315. package/esm2015/slick-popover/slick-popover.module.js +0 -14
  316. package/esm2015/slick-profile-picture/slick-profile-picture.component.js +0 -242
  317. package/esm2015/slick-profile-picture/slick-profile-picture.module.js +0 -15
  318. package/esm2015/slick-progress-bar/slick-progress-bar.module.js +0 -13
  319. package/esm2015/slick-progress-bar/slick-progress-bar.service.js +0 -50
  320. package/esm2015/slick-screen-blocker/slick-screen-blocker.module.js +0 -13
  321. package/esm2015/slick-screen-blocker/slick-screen-blocker.service.js +0 -80
  322. package/esm2015/slick-slider/slick-slider.component.js +0 -88
  323. package/esm2015/slick-slider/slick-slider.module.js +0 -15
  324. package/esm2015/slick-split-screen/slick-screen-split-left-content.component.js +0 -13
  325. package/esm2015/slick-split-screen/slick-screen-split-right-content.component.js +0 -13
  326. package/esm2015/slick-split-screen/slick-split-screen.component.js +0 -148
  327. package/esm2015/slick-split-screen/slick-split-screen.module.js +0 -16
  328. package/esm2015/slick-tabs/slick-tab-header.component.js +0 -25
  329. package/esm2015/slick-tabs/slick-tab.component.js +0 -67
  330. package/esm2015/slick-tabs/slick-tabs.component.js +0 -104
  331. package/esm2015/slick-tabs/slick-tabs.module.js +0 -17
  332. package/esm2015/slick-toast/slick-toast.module.js +0 -13
  333. package/esm2015/slick-toast/slick-toast.service.js +0 -91
  334. package/esm2015/slick-tree-view/slick-tree-view.component.js +0 -287
  335. package/esm2015/slick-tree-view/slick-tree-view.module.js +0 -17
  336. package/esm2015/slick-type-ahead/slick-type-ahead.directive.js +0 -155
  337. package/esm2015/slick-type-ahead/slick-type-ahead.module.js +0 -13
  338. package/esm2015/slick-validation-indicator/slick-validation-indicator.directive.js +0 -61
  339. package/esm2015/slick-validation-indicator/slick-validation-indicator.module.js +0 -14
  340. package/esm2015/utils/slick-function-lock.service.js +0 -54
  341. package/esm2015/utils/slick-init.service.js +0 -48
  342. package/esm2015/utils/slick-log.service.js +0 -27
  343. package/esm2015/utils/slick-sleep.service.js +0 -14
  344. package/esm2015/utils/slick-utils.service.js +0 -229
  345. package/fesm2015/slick-components.js.map +0 -1
  346. package/slick-components.metadata.json +0 -1
@@ -0,0 +1,479 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, forwardRef } from "@angular/core";
2
+ import { SlickDropDownService } from "./slick-drop-down.service";
3
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
4
+ import { SlickSleepService } from "../utils/slick-sleep.service";
5
+ import { SlickUtilsService } from "../utils/slick-utils.service";
6
+ import { SlickInitService } from "../utils/slick-init.service";
7
+ import { SlickLogService } from "../utils/slick-log.service";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./slick-drop-down.service";
10
+ import * as i2 from "@angular/common";
11
+ import * as i3 from "@angular/forms";
12
+ import * as i4 from "../slick-validation-indicator/slick-validation-indicator.directive";
13
+ export var SlickDropDownSearchTypes;
14
+ (function (SlickDropDownSearchTypes) {
15
+ SlickDropDownSearchTypes[SlickDropDownSearchTypes["startsWith"] = 0] = "startsWith";
16
+ SlickDropDownSearchTypes[SlickDropDownSearchTypes["eachWord"] = 1] = "eachWord";
17
+ SlickDropDownSearchTypes[SlickDropDownSearchTypes["any"] = 2] = "any";
18
+ })(SlickDropDownSearchTypes || (SlickDropDownSearchTypes = {}));
19
+ export class SlickDropDownComponent {
20
+ constructor(slickDropDownService, changeDetector) {
21
+ this.slickDropDownService = slickDropDownService;
22
+ this.changeDetector = changeDetector;
23
+ this.placeholder = '';
24
+ this.idFieldName = "id";
25
+ this.textFieldName = "text";
26
+ this.compact = false;
27
+ this.disabled = false;
28
+ this.allowEmpty = true;
29
+ this.width = '100%';
30
+ this.listWidth = '100%';
31
+ this.height = '300px';
32
+ this.showLoadingMessage = false;
33
+ this.searchType = SlickDropDownSearchTypes.startsWith;
34
+ this.isMobile = false;
35
+ this.onExpand = new EventEmitter();
36
+ this.onSelect = new EventEmitter();
37
+ this.onChange = new EventEmitter();
38
+ // This is necessary so that the scroll and resize events can add and remove the event properly,
39
+ // as well as getting the correct ES6 function
40
+ this.fnReposition = () => this.reposition();
41
+ this.fnDocumentClick = (e) => this.documentClick(e);
42
+ this.expanded = false;
43
+ this.filterText = '';
44
+ this.isVisible = false;
45
+ this.isAndroid = ((SlickInitService.getPlatform() || '').toLowerCase() === 'android');
46
+ this.skipOnFocusEvent = false;
47
+ this.skipClickExpand = false;
48
+ this.propagateChange = (_) => { };
49
+ this.uuid = SlickUtilsService.newGuid();
50
+ }
51
+ async ngOnInit() {
52
+ this.attachTo = this.attachTo || SlickInitService.getParams().attachTo || 'body';
53
+ }
54
+ ngAfterViewInit() {
55
+ }
56
+ // this is the initial value set to the component
57
+ writeValue(obj) {
58
+ if (obj !== null && obj !== undefined)
59
+ this.selectedId = obj;
60
+ else
61
+ this.selectedId = null;
62
+ this.selectItem(this.selectedId, false);
63
+ this.collapse();
64
+ }
65
+ // registers 'fn' that will be fired when changes are made
66
+ // this is how we emit the changes back to the form
67
+ registerOnChange(fn) {
68
+ this.propagateChange = fn;
69
+ }
70
+ // not used, used for touch input
71
+ registerOnTouched() { }
72
+ async ngOnChanges(changes) {
73
+ await SlickSleepService.sleep();
74
+ if (changes.items) {
75
+ this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
76
+ this.selectItem(this.selectedId, false);
77
+ if (this.selectedTextInputRef && document.activeElement === this.selectedTextInputRef.nativeElement)
78
+ this.expand();
79
+ }
80
+ if (changes.showLoadingMessage) {
81
+ await SlickSleepService.sleep();
82
+ if (this.showLoadingMessage === true)
83
+ this.selectedText = "Loading...";
84
+ }
85
+ if (changes.getUrl) {
86
+ if (this.showLoadingMessage === true) {
87
+ this.selectedText = "Loading...";
88
+ }
89
+ let items = await this.slickDropDownService.getItemsFromServer(this.getUrl);
90
+ this.selectedText = null;
91
+ this.items = items;
92
+ this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
93
+ this.selectItem(this.selectedId, false);
94
+ if (document.activeElement === this.selectedTextInputRef.nativeElement)
95
+ this.expand();
96
+ }
97
+ if (changes.validationIndicator && changes.validationIndicator.firstChange) {
98
+ if (!this.validationIndicatorType)
99
+ this.validationIndicatorType = "error";
100
+ }
101
+ if (changes.allowEmpty)
102
+ this.allowEmpty = (this.allowEmpty.toString().toLowerCase() === 'false') ? false : true;
103
+ if (changes.isMobile)
104
+ this.isMobile = (this.isMobile.toString().toLowerCase() === 'true') ? true : false;
105
+ if (changes.disabled && changes.disabled.currentValue)
106
+ this.disabled = (changes.disabled.currentValue.toString().toLowerCase() !== 'false');
107
+ if (changes.compact && changes.compact.currentValue)
108
+ this.compact = (changes.compact.currentValue.toString().toLowerCase() !== 'false');
109
+ if (changes.searchType) {
110
+ if (changes.searchType.currentValue.toString().toLowerCase() === 'eachword')
111
+ this.searchType = SlickDropDownSearchTypes.eachWord;
112
+ else if (changes.searchType.currentValue.toString().toLowerCase() === 'any')
113
+ this.searchType = SlickDropDownSearchTypes.any;
114
+ else
115
+ this.searchType = SlickDropDownSearchTypes.startsWith;
116
+ }
117
+ }
118
+ ngOnDestroy() {
119
+ this.collapse();
120
+ document.removeEventListener("click", this.fnDocumentClick, true);
121
+ // it's okay if this fails. It was already removed
122
+ try {
123
+ document.body.removeChild(this.dropdownList.nativeElement);
124
+ }
125
+ catch { }
126
+ }
127
+ async setFocus(showDropdownList = false) {
128
+ this.filterText = '';
129
+ this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
130
+ this.skipOnFocusEvent = (showDropdownList === false);
131
+ await SlickUtilsService.waitForElement("#slick-drop-down_" + this.uuid);
132
+ this.selectedTextInputRef.nativeElement.focus();
133
+ }
134
+ async expand() {
135
+ if (this.disabled)
136
+ return;
137
+ this.isVisible = true;
138
+ this.changeDetector.detectChanges();
139
+ SlickUtilsService.attachElement(this.dropdownList.nativeElement, this.attachTo);
140
+ this.reposition();
141
+ await SlickSleepService.sleep();
142
+ this.dropdownList.nativeElement.style.display = "inline-block";
143
+ const selectedItems = this.dropdownList.nativeElement.getElementsByClassName("active");
144
+ if (selectedItems && selectedItems.length > 0)
145
+ selectedItems[0].scrollIntoView({ block: 'nearest' });
146
+ this.expanded = true;
147
+ // This is necessary, otherwise `this` in the reposition function will be window
148
+ // and not the component.
149
+ // Since angular has no way to use the third parameter, I'm doing this in raw js
150
+ document.addEventListener("click", this.fnDocumentClick, true);
151
+ if (this.onExpand)
152
+ this.onExpand.emit();
153
+ }
154
+ collapse() {
155
+ if (this.expanded === false)
156
+ return;
157
+ this.expanded = false;
158
+ this.dropdownList.nativeElement.style.display = "none";
159
+ // Since angular has no way to use the third parameter, I'm doing this in raw js
160
+ document.removeEventListener("click", this.fnDocumentClick, true);
161
+ SlickUtilsService.removeElement(this.dropdownList.nativeElement);
162
+ this.isVisible = false;
163
+ this.skipOnFocusEvent = false;
164
+ }
165
+ reposition() {
166
+ const dropDownRect = this.containerDiv.nativeElement.getBoundingClientRect();
167
+ const parentRect = (this.attachTo === 'body') ? null : document.body.querySelector(this.attachTo).getBoundingClientRect();
168
+ const containerLeft = (this.attachTo === 'body') ? dropDownRect.left : (dropDownRect.left - parentRect.left);
169
+ const containerTop = (this.attachTo === 'body') ? dropDownRect.top : (dropDownRect.top - parentRect.top);
170
+ const containerHeight = this.containerDiv.nativeElement.offsetHeight;
171
+ const containerWidth = dropDownRect.width;
172
+ this.width = containerWidth;
173
+ if (this.listWidth === '100%')
174
+ this.listGroupWidth = this.width;
175
+ else if (this.listWidth === 'auto')
176
+ this.listGroupWidth = "auto";
177
+ else
178
+ this.listGroupWidth = this.listWidth;
179
+ this.top = (containerTop + containerHeight);
180
+ this.left = containerLeft;
181
+ }
182
+ async documentClick(e) {
183
+ // Not entirely sure why, but iPhones call onFocus when clicking out of the dropdown
184
+ if (this.isMobile)
185
+ this.skipOnFocusEvent = true;
186
+ if (!this.expanded || !e.target)
187
+ return;
188
+ if (SlickUtilsService.checkParentIdExists(e.target, "slick-drop-down_" + this.uuid) === true)
189
+ return;
190
+ this.selectedTextInputRef.nativeElement.setSelectionRange(0, 0);
191
+ if (this.selectedIndex !== null && this.visibleItems.length > 0) {
192
+ let itemId = this.visibleItems[this.selectedIndex].id;
193
+ this.selectItem(itemId, true);
194
+ }
195
+ this.collapse();
196
+ }
197
+ selectItem(id, emitOnSelect) {
198
+ let item = this.slickDropDownService.getSelectedItem(this.visibleItems, id);
199
+ if (item) {
200
+ this.selectedItem = item;
201
+ this.selectedId = item.id;
202
+ this.selectedText = item.text;
203
+ this.selectedIndex = this.slickDropDownService.getItemIndex(this.visibleItems, this.selectedId);
204
+ if (this.onChange)
205
+ this.onChange.emit(this.selectedItem.item);
206
+ if (emitOnSelect === true && this.onSelect)
207
+ this.onSelect.emit(this.selectedItem.item);
208
+ this.propagateChange(this.selectedId);
209
+ }
210
+ else {
211
+ this.selectedItem = null;
212
+ this.selectedText = null;
213
+ this.selectedIndex = null;
214
+ }
215
+ }
216
+ async onFocus() {
217
+ if (this.skipOnFocusEvent === true) {
218
+ this.skipOnFocusEvent = false;
219
+ return;
220
+ }
221
+ this.filterText = '';
222
+ this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
223
+ this.selectItem(this.selectedId, false);
224
+ if (this.selectedIndex && this.selectedIndex >= 0) {
225
+ this.selectedItem = this.visibleItems[this.selectedIndex];
226
+ this.selectedTextInputRef.nativeElement.setSelectionRange(0, this.selectedItem.text.length);
227
+ }
228
+ // This is kind of hacky, but if onFocus is called by clicking the dropdown, the onDropdownClick event is called as well
229
+ // That function will expand or collapse, depending on the state. Since this expands, it thinks it needs to collapse.
230
+ // So fake it out and tell it NOT to collapse. BUT, if we came in from tabbing into the field, then it would mess up
231
+ // the click event. So only wait for 1/2 second.
232
+ this.skipClickExpand = true;
233
+ this.expand();
234
+ await SlickSleepService.sleep(500);
235
+ this.skipClickExpand = false;
236
+ }
237
+ async onKeyDown(e) {
238
+ if (this.isAndroid)
239
+ return;
240
+ // Tab/enter
241
+ if (e.which === 9 || e.which === 13) {
242
+ this.collapse();
243
+ if (this.selectedIndex === null || this.selectedIndex === undefined)
244
+ return;
245
+ this.selectedTextInputRef.nativeElement.setSelectionRange(0, 0);
246
+ let itemId = this.visibleItems[this.selectedIndex].id;
247
+ this.selectItem(itemId, true);
248
+ return true;
249
+ }
250
+ if (e.key && e.key.length > 1)
251
+ return true;
252
+ if (e.which === 46 || e.which === 8) {
253
+ e.preventDefault();
254
+ e.stopPropagation();
255
+ }
256
+ if (e.which >= 32 && e.which <= 126) {
257
+ e.preventDefault();
258
+ e.stopPropagation();
259
+ }
260
+ }
261
+ async onKeyUp(e) {
262
+ e.preventDefault();
263
+ e.stopPropagation();
264
+ // If this is android, it won't pass us any key data so just read the entire input element
265
+ if (this.isAndroid === true) {
266
+ await SlickSleepService.sleep();
267
+ this.filterText = this.selectedTextInputRef.nativeElement.value;
268
+ this.filterSearch();
269
+ return;
270
+ }
271
+ // Esc
272
+ if (e.which === 27) {
273
+ this.collapse();
274
+ return false;
275
+ }
276
+ // del or backspace
277
+ if (e.which === 46 || e.which === 8 && !this.filterText) {
278
+ e.preventDefault();
279
+ e.stopPropagation();
280
+ if (this.allowEmpty === true) {
281
+ this.selectItem(null, true);
282
+ this.selectedId = null;
283
+ this.propagateChange(null);
284
+ if (this.onChange)
285
+ this.onChange.emit(null);
286
+ if (this.onSelect)
287
+ this.onSelect.emit(null);
288
+ }
289
+ return false;
290
+ }
291
+ if (e.which === 8 && this.filterText) {
292
+ this.filterText = this.filterText.substring(0, this.filterText.length - 1);
293
+ if (this.filterText.length === 0) {
294
+ this.selectedText = '';
295
+ this.selectedIndex = null;
296
+ this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
297
+ }
298
+ else
299
+ this.filterSearch();
300
+ return false;
301
+ }
302
+ // Arrowup
303
+ if (e.which === 38) {
304
+ if (this.selectedIndex === null || this.selectedIndex === undefined)
305
+ this.selectedIndex = 0;
306
+ if (this.selectedIndex > 0)
307
+ this.selectedIndex--;
308
+ return false;
309
+ }
310
+ // Arrowdown
311
+ if (e.which === 40) {
312
+ if (this.selectedIndex === null || this.selectedIndex === undefined)
313
+ this.selectedIndex = -1;
314
+ if (!this.expanded || !this.visibleItems) {
315
+ this.expand();
316
+ return false;
317
+ }
318
+ if (this.selectedIndex < this.visibleItems.length - 1)
319
+ this.selectedIndex++;
320
+ return false;
321
+ }
322
+ // If F1 is pressed, key length will be 2
323
+ if (e.key.length > 1 || e.ctrlKey || e.altKey)
324
+ return false;
325
+ if (e.which >= 32 && e.which <= 126) {
326
+ this.filterText += e.key;
327
+ this.filterSearch();
328
+ }
329
+ return true;
330
+ }
331
+ //async onKeyPress(e: KeyboardEvent) {
332
+ // await SlickSleepService.sleep();
333
+ // if (((e.which >= 32 && e.which <= 126) || e.which === 8) && !e.ctrlKey && !e.altKey) {
334
+ // if (e.which === 8)
335
+ // this.filterText = this.filterText.substring(0, this.filterText.length - 1);
336
+ // else
337
+ // this.filterText += e.key;
338
+ // this.filterSearch();
339
+ // }
340
+ // return true;
341
+ //}
342
+ async filterSearch() {
343
+ if (!this.expanded)
344
+ this.expand();
345
+ this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
346
+ if (this.searchType === SlickDropDownSearchTypes.startsWith) {
347
+ this.visibleItems = this.visibleItems.filter(x => x.text.toLowerCase().indexOf(this.filterText.toLowerCase()) === 0);
348
+ if (this.visibleItems.length > 0) {
349
+ this.selectedIndex = 0;
350
+ if (this.isAndroid === false) {
351
+ this.selectedText = this.visibleItems[0].text;
352
+ await SlickSleepService.sleep();
353
+ this.selectedTextInputRef.nativeElement.setSelectionRange(this.filterText.length, this.selectedText.length);
354
+ }
355
+ }
356
+ else {
357
+ this.selectedText = this.filterText;
358
+ this.selectedIndex = null;
359
+ }
360
+ }
361
+ else if (this.searchType === SlickDropDownSearchTypes.eachWord) {
362
+ this.visibleItems = this.visibleItems.filter(x => (" " + x.text.toLowerCase()).indexOf(" " + this.filterText.toLowerCase()) >= 0);
363
+ if (this.visibleItems.length > 0) {
364
+ this.selectedIndex = 0;
365
+ if (this.isAndroid === false) {
366
+ this.selectedText = this.visibleItems[0].text;
367
+ const selectedTextStart = (" " + this.visibleItems[0].text).toLowerCase().indexOf(" " + this.filterText.toLowerCase());
368
+ await SlickSleepService.sleep();
369
+ this.selectedTextInputRef.nativeElement.setSelectionRange(selectedTextStart, selectedTextStart + this.filterText.length);
370
+ }
371
+ }
372
+ else {
373
+ this.selectedText = this.filterText;
374
+ this.selectedIndex = null;
375
+ }
376
+ }
377
+ }
378
+ onDropdownClicked() {
379
+ this.filterText = '';
380
+ this.visibleItems = this.slickDropDownService.getVisibleItems(this.items, this.idFieldName, this.textFieldName);
381
+ this.selectItem(this.selectedId, false);
382
+ this.selectedTextInputRef.nativeElement.focus();
383
+ if (this.skipClickExpand === true) {
384
+ this.skipClickExpand = false;
385
+ return;
386
+ }
387
+ if (this.expanded === false)
388
+ this.expand();
389
+ else
390
+ this.collapse();
391
+ }
392
+ onItemClick(item) {
393
+ this.selectItem(item.id, true);
394
+ this.collapse();
395
+ }
396
+ handleCustomButtonClick(callback, event) {
397
+ event.stopPropagation();
398
+ event.preventDefault();
399
+ if (callback) {
400
+ callback(event);
401
+ }
402
+ }
403
+ }
404
+ /** @nocollapse */ SlickDropDownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickDropDownComponent, deps: [{ token: i1.SlickDropDownService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
405
+ /** @nocollapse */ SlickDropDownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: SlickDropDownComponent, selector: "slick-drop-down", inputs: { placeholder: "placeholder", items: "items", idFieldName: "idFieldName", textFieldName: "textFieldName", compact: "compact", disabled: "disabled", allowEmpty: "allowEmpty", getUrl: "getUrl", width: "width", listWidth: "listWidth", height: "height", showLoadingMessage: "showLoadingMessage", showDebug: "showDebug", tabindex: "tabindex", validationIndicator: "validationIndicator", validationIndicatorType: "validationIndicatorType", attachTo: "attachTo", searchType: "searchType", appendButtons: "appendButtons", prependButtons: "prependButtons", isMobile: "isMobile", cssClass: "cssClass" }, outputs: { onExpand: "onExpand", onSelect: "onSelect", onChange: "onChange" }, providers: [SlickDropDownService, SlickLogService,
406
+ {
407
+ provide: NG_VALUE_ACCESSOR,
408
+ useExisting: forwardRef((() => SlickDropDownComponent)),
409
+ multi: true,
410
+ }], viewQueries: [{ propertyName: "containerDiv", first: true, predicate: ["containerDiv"], descendants: true }, { propertyName: "dropdownList", first: true, predicate: ["dropdownList"], descendants: true }, { propertyName: "selectedTextInputRef", first: true, predicate: ["selectedTextInputRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #containerDiv id=\"slick-drop-down_{{uuid}}\" attr.data-uuid=\"{{uuid}}\" [className]=\"'slick-drop-down ' + (cssClass || '')\" [class.open]=\"expanded\">\r\n\t<div *ngIf=\"compact === false\">\r\n <div *ngIf=\"!disabled\" class='input-group' style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n <ng-container *ngIf=\"prependButtons && prependButtons.length > 0\">\r\n <div class=\"input-group-prepend\">\r\n <ng-container *ngFor=\"let btn of prependButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-right: 2px; border-right: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <input *ngIf=\"validationIndicatorType\" [slick-validation-indicator]=\"validationIndicator\" [slickValidationType]=\"validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <input *ngIf=\"!validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <div tabindex=\"-1\" class=\"input-group-append\">\r\n <span class=\"input-group-text btn-primary badge-primary\"><i class='fas fa-chevron-down'></i></span>\r\n </div>\r\n <ng-container *ngIf=\"appendButtons && appendButtons.length > 0\">\r\n <div class=\"input-group-append\" style=\"margin-left: 0px;\">\r\n <ng-container *ngFor=\"let btn of appendButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-left: 1px; border-left: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" class='input-group'>\r\n\t\t\t<input #selectedTextInputRef style='cursor: default' [(ngModel)]=\"selectedText\" disabled=\"disabled\" readonly class='form-control' [placeholder]='placeholder' />\r\n\t\t\t<div tabindex=\"-1\" class=\"input-group-append disabled\">\r\n\t\t\t\t<span class=\"input-group-text text-muted\"><i class='fas fa-chevron-down'></i></span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div [className]=\"'slick-drop-down-compact ' + (cssClass || '')\" *ngIf=\"compact === true\">\r\n\t\t<div *ngIf=\"disabled === false\" style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n\t\t\t<input #selectedTextInputRef class=\"text-body\" [attr.tabindex]=\"tabindex\" [(ngModel)]=\"selectedText\" (keyup)=\"onKeyUp($event)\" (focus)=\"onFocus()\" ng-disabled='disabled' readonly [placeholder]='placeholder' />\r\n\t\t\t<div class=\"slick-drop-down-compact-arrow\" tabindex=\"-1\" style=\"position: relative; top: -1px;\"><i class='fas fa-chevron-down'></i></div>\r\n\t\t</div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" style=\"text-align: right;\">\r\n\t\t\t<div *ngIf='selectedText' style=\"text-align: right;\">{{selectedText}}</div>\r\n\t\t\t<div *ngIf=\"!selectedText\" style=\"text-align: right;\">{{placeholder}}</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<ul *ngIf=\"isVisible\" #dropdownList id=\"slick-drop-down_{{uuid}}\" class='slick-drop-down-list-group dropdown-menu' [style.width]=\"listGroupWidth\" [style.visibility]=\"(expanded === true) ? 'visible' : 'hidden'\" [style.opacity]=\"(expanded === true) ? '1' : '0'\" [style.max-height]=\"height\" [style.width.px]=\"listGroupWidth\" [style.left.px]=\"left\" [style.top.px]=\"top\">\r\n\t\t<li *ngFor=\"let item of visibleItems; let index = index;\" (click)=\"onItemClick(item)\" [class.active]=\"item.id === selectedItem?.id\" [class.card-header]=\"selectedIndex === index\" class=\"dropdown-item\">{{item.text}}</li>\r\n\t</ul>\r\n\r\n</div>", directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.SlickValidationIndicatorDirective, selector: "[slick-validation-indicator]", inputs: ["slick-validation-indicator", "slickValidationType"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
411
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickDropDownComponent, decorators: [{
412
+ type: Component,
413
+ args: [{ selector: 'slick-drop-down', providers: [SlickDropDownService, SlickLogService,
414
+ {
415
+ provide: NG_VALUE_ACCESSOR,
416
+ useExisting: forwardRef((() => SlickDropDownComponent)),
417
+ multi: true,
418
+ }], template: "<div #containerDiv id=\"slick-drop-down_{{uuid}}\" attr.data-uuid=\"{{uuid}}\" [className]=\"'slick-drop-down ' + (cssClass || '')\" [class.open]=\"expanded\">\r\n\t<div *ngIf=\"compact === false\">\r\n <div *ngIf=\"!disabled\" class='input-group' style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n <ng-container *ngIf=\"prependButtons && prependButtons.length > 0\">\r\n <div class=\"input-group-prepend\">\r\n <ng-container *ngFor=\"let btn of prependButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-right: 2px; border-right: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <input *ngIf=\"validationIndicatorType\" [slick-validation-indicator]=\"validationIndicator\" [slickValidationType]=\"validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <input *ngIf=\"!validationIndicatorType\" #selectedTextInputRef class='form-control' style='background: white; cursor: pointer' [(ngModel)]=\"selectedText\" [attr.tabindex]=\"tabindex\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" (focus)=\"onFocus()\" [readonly]=\"!isMobile\" [placeholder]='placeholder' />\r\n <div tabindex=\"-1\" class=\"input-group-append\">\r\n <span class=\"input-group-text btn-primary badge-primary\"><i class='fas fa-chevron-down'></i></span>\r\n </div>\r\n <ng-container *ngIf=\"appendButtons && appendButtons.length > 0\">\r\n <div class=\"input-group-append\" style=\"margin-left: 0px;\">\r\n <ng-container *ngFor=\"let btn of appendButtons\">\r\n <button type=\"button\" class=\"input-group-text btn btn-primary badge-primary\" [disabled]=\"btn.disabled\" (click)=\"handleCustomButtonClick(btn.onClick, $event)\" style=\"margin-left: 1px; border-left: none;\">\r\n <i class=\"fas {{ btn.faClass }}\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" class='input-group'>\r\n\t\t\t<input #selectedTextInputRef style='cursor: default' [(ngModel)]=\"selectedText\" disabled=\"disabled\" readonly class='form-control' [placeholder]='placeholder' />\r\n\t\t\t<div tabindex=\"-1\" class=\"input-group-append disabled\">\r\n\t\t\t\t<span class=\"input-group-text text-muted\"><i class='fas fa-chevron-down'></i></span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div [className]=\"'slick-drop-down-compact ' + (cssClass || '')\" *ngIf=\"compact === true\">\r\n\t\t<div *ngIf=\"disabled === false\" style=\"cursor: pointer !important\" (click)=\"onDropdownClicked()\">\r\n\t\t\t<input #selectedTextInputRef class=\"text-body\" [attr.tabindex]=\"tabindex\" [(ngModel)]=\"selectedText\" (keyup)=\"onKeyUp($event)\" (focus)=\"onFocus()\" ng-disabled='disabled' readonly [placeholder]='placeholder' />\r\n\t\t\t<div class=\"slick-drop-down-compact-arrow\" tabindex=\"-1\" style=\"position: relative; top: -1px;\"><i class='fas fa-chevron-down'></i></div>\r\n\t\t</div>\r\n\r\n\t\t<div *ngIf=\"disabled === true\" style=\"text-align: right;\">\r\n\t\t\t<div *ngIf='selectedText' style=\"text-align: right;\">{{selectedText}}</div>\r\n\t\t\t<div *ngIf=\"!selectedText\" style=\"text-align: right;\">{{placeholder}}</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<ul *ngIf=\"isVisible\" #dropdownList id=\"slick-drop-down_{{uuid}}\" class='slick-drop-down-list-group dropdown-menu' [style.width]=\"listGroupWidth\" [style.visibility]=\"(expanded === true) ? 'visible' : 'hidden'\" [style.opacity]=\"(expanded === true) ? '1' : '0'\" [style.max-height]=\"height\" [style.width.px]=\"listGroupWidth\" [style.left.px]=\"left\" [style.top.px]=\"top\">\r\n\t\t<li *ngFor=\"let item of visibleItems; let index = index;\" (click)=\"onItemClick(item)\" [class.active]=\"item.id === selectedItem?.id\" [class.card-header]=\"selectedIndex === index\" class=\"dropdown-item\">{{item.text}}</li>\r\n\t</ul>\r\n\r\n</div>" }]
419
+ }], ctorParameters: function () { return [{ type: i1.SlickDropDownService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
420
+ type: Input
421
+ }], items: [{
422
+ type: Input
423
+ }], idFieldName: [{
424
+ type: Input
425
+ }], textFieldName: [{
426
+ type: Input
427
+ }], compact: [{
428
+ type: Input
429
+ }], disabled: [{
430
+ type: Input
431
+ }], allowEmpty: [{
432
+ type: Input
433
+ }], getUrl: [{
434
+ type: Input
435
+ }], width: [{
436
+ type: Input
437
+ }], listWidth: [{
438
+ type: Input
439
+ }], height: [{
440
+ type: Input
441
+ }], showLoadingMessage: [{
442
+ type: Input
443
+ }], showDebug: [{
444
+ type: Input
445
+ }], tabindex: [{
446
+ type: Input
447
+ }], validationIndicator: [{
448
+ type: Input
449
+ }], validationIndicatorType: [{
450
+ type: Input
451
+ }], attachTo: [{
452
+ type: Input
453
+ }], searchType: [{
454
+ type: Input
455
+ }], appendButtons: [{
456
+ type: Input
457
+ }], prependButtons: [{
458
+ type: Input
459
+ }], isMobile: [{
460
+ type: Input
461
+ }], cssClass: [{
462
+ type: Input
463
+ }], onExpand: [{
464
+ type: Output
465
+ }], onSelect: [{
466
+ type: Output
467
+ }], onChange: [{
468
+ type: Output
469
+ }], containerDiv: [{
470
+ type: ViewChild,
471
+ args: ["containerDiv"]
472
+ }], dropdownList: [{
473
+ type: ViewChild,
474
+ args: ["dropdownList"]
475
+ }], selectedTextInputRef: [{
476
+ type: ViewChild,
477
+ args: ["selectedTextInputRef"]
478
+ }] } });
479
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZHJvcC1kb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL3NsaWNrLWRyb3AtZG93bi9zbGljay1kcm9wLWRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvc2xpY2stZHJvcC1kb3duL3NsaWNrLWRyb3AtZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUEyRCxTQUFTLEVBQUUsVUFBVSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUN6TCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7QUFHN0QsTUFBTSxDQUFOLElBQVksd0JBQXNEO0FBQWxFLFdBQVksd0JBQXdCO0lBQUcsbUZBQVUsQ0FBQTtJQUFFLCtFQUFRLENBQUE7SUFBRSxxRUFBRyxDQUFBO0FBQUMsQ0FBQyxFQUF0RCx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBQThCO0FBWWxFLE1BQU0sT0FBTyxzQkFBc0I7SUFxRGxDLFlBQW9CLG9CQUEwQyxFQUNyRCxjQUFpQztRQUR0Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQ3JELG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQXJEakMsZ0JBQVcs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QXVCO3NCQUEvQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0UsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNVLG9CQUFvQjtzQkFBdEQsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWNrRHJvcERvd25TZXJ2aWNlIH0gZnJvbSBcIi4vc2xpY2stZHJvcC1kb3duLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFNsaWNrU2xlZXBTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLXNsZWVwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tVdGlsc1NlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvc2xpY2stdXRpbHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja0luaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLWluaXQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja0xvZ1NlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvc2xpY2stbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVNsaWNrRHJvcERvd25CdXR0b25Nb2RlbCB9IGZyb20gXCIuL3NsaWNrLWRyb3AtZG93bi1idXR0b24ubW9kZWxcIjtcclxuXHJcbmV4cG9ydCBlbnVtIFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcyB7IHN0YXJ0c1dpdGgsIGVhY2hXb3JkLCBhbnkgfVxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdzbGljay1kcm9wLWRvd24nLFxyXG5cdHRlbXBsYXRlVXJsOiAnc2xpY2stZHJvcC1kb3duLmNvbXBvbmVudC5odG1sJyxcclxuXHRwcm92aWRlcnM6IFtTbGlja0Ryb3BEb3duU2VydmljZSwgU2xpY2tMb2dTZXJ2aWNlLFxyXG5cdFx0e1xyXG5cdFx0XHRwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuXHRcdFx0dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpY2tEcm9wRG93bkNvbXBvbmVudCksXHJcblx0XHRcdG11bHRpOiB0cnVlLFxyXG5cdFx0fV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNsaWNrRHJvcERvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblx0QElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cdEBJbnB1dCgpIGl0ZW1zOiBhbnlbXTtcclxuXHRASW5wdXQoKSBpZEZpZWxkTmFtZTogc3RyaW5nID0gXCJpZFwiO1xyXG5cdEBJbnB1dCgpIHRleHRGaWVsZE5hbWU6IHN0cmluZyA9IFwidGV4dFwiO1xyXG5cdEBJbnB1dCgpIGNvbXBhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdEBJbnB1dCgpIGdldFVybDogc3RyaW5nO1xyXG5cdEBJbnB1dCgpIHdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XHJcblx0QElucHV0KCkgbGlzdFdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XHJcblx0QElucHV0KCkgaGVpZ2h0OiBzdHJpbmcgPSAnMzAwcHgnO1xyXG5cdEBJbnB1dCgpIHNob3dMb2FkaW5nTWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpIHNob3dEZWJ1ZzogYm9vbGVhbjtcclxuXHRASW5wdXQoKSB0YWJpbmRleDogbnVtYmVyO1xyXG5cdEBJbnB1dCgpIHZhbGlkYXRpb25JbmRpY2F0b3I6IGJvb2xlYW47XHJcblx0QElucHV0KCkgdmFsaWRhdGlvbkluZGljYXRvclR5cGU6IHN0cmluZztcclxuXHRASW5wdXQoKSBhdHRhY2hUbzogc3RyaW5nO1xyXG5cdEBJbnB1dCgpIHNlYXJjaFR5cGU6IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcyA9IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcy5zdGFydHNXaXRoO1xyXG5cdEBJbnB1dCgpIGFwcGVuZEJ1dHRvbnM6IElTbGlja0Ryb3BEb3duQnV0dG9uTW9kZWxbXTtcclxuXHRASW5wdXQoKSBwcmVwZW5kQnV0dG9uczogSVNsaWNrRHJvcERvd25CdXR0b25Nb2RlbFtdO1xyXG5cdEBJbnB1dCgpIGlzTW9iaWxlOiBib29sZWFuID0gZmFsc2U7XHJcblx0QElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuXHJcblx0QE91dHB1dCgpIG9uRXhwYW5kOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cdEBPdXRwdXQoKSBvblNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdEBWaWV3Q2hpbGQoXCJjb250YWluZXJEaXZcIikgY29udGFpbmVyRGl2OiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJkcm9wZG93bkxpc3RcIikgZHJvcGRvd25MaXN0OiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJzZWxlY3RlZFRleHRJbnB1dFJlZlwiKSBzZWxlY3RlZFRleHRJbnB1dFJlZjogRWxlbWVudFJlZjtcclxuXHJcblx0Ly8gVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGUgc2Nyb2xsIGFuZCByZXNpemUgZXZlbnRzIGNhbiBhZGQgYW5kIHJlbW92ZSB0aGUgZXZlbnQgcHJvcGVybHksXHJcblx0Ly8gYXMgd2VsbCBhcyBnZXR0aW5nIHRoZSBjb3JyZWN0IEVTNiBmdW5jdGlvblxyXG5cdGZuUmVwb3NpdGlvbiA9ICgpID0+IHRoaXMucmVwb3NpdGlvbigpO1xyXG5cdGZuRG9jdW1lbnRDbGljayA9IChlKSA9PiB0aGlzLmRvY3VtZW50Q2xpY2soZSk7XHJcblx0dXVpZDogc3RyaW5nO1xyXG5cdHNlbGVjdGVkSWQ6IHN0cmluZztcclxuXHRzZWxlY3RlZFRleHQ6IHN0cmluZztcclxuXHRleHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHNlbGVjdGVkSXRlbTogYW55O1xyXG5cdHNlbGVjdGVkSW5kZXg6IG51bWJlcjtcclxuXHRmaWx0ZXJUZXh0OiBzdHJpbmcgPSAnJztcclxuXHR2aXNpYmxlSXRlbXM6IGFueVtdO1xyXG5cdGxlZnQ6IG51bWJlcjtcclxuXHR0b3A6IG51bWJlcjtcclxuXHRsaXN0R3JvdXBXaWR0aDogc3RyaW5nO1xyXG5cdGlzVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGlzQW5kcm9pZDogYm9vbGVhbiA9ICgoU2xpY2tJbml0U2VydmljZS5nZXRQbGF0Zm9ybSgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpO1xyXG5cclxuXHRwcml2YXRlIHNraXBPbkZvY3VzRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIHNraXBDbGlja0V4cGFuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHNsaWNrRHJvcERvd25TZXJ2aWNlOiBTbGlja0Ryb3BEb3duU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHR0aGlzLnV1aWQgPSBTbGlja1V0aWxzU2VydmljZS5uZXdHdWlkKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMuYXR0YWNoVG8gPSB0aGlzLmF0dGFjaFRvIHx8IFNsaWNrSW5pdFNlcnZpY2UuZ2V0UGFyYW1zKCkuYXR0YWNoVG8gfHwgJ2JvZHknO1xyXG5cdH1cclxuXHJcblx0bmdBZnRlclZpZXdJbml0KCkge1xyXG5cdH1cclxuXHJcblx0cHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuXHQvLyB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XHJcblx0cHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnkpIHtcclxuXHRcdGlmIChvYmogIT09IG51bGwgJiYgb2JqICE9PSB1bmRlZmluZWQpXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJZCA9IG9iajtcclxuXHRcdGVsc2VcclxuXHRcdFx0dGhpcy5zZWxlY3RlZElkID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZElkLCBmYWxzZSk7XHJcblx0XHR0aGlzLmNvbGxhcHNlKCk7XHJcblx0fVxyXG5cclxuXHQvLyByZWdpc3RlcnMgJ2ZuJyB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBjaGFuZ2VzIGFyZSBtYWRlXHJcblx0Ly8gdGhpcyBpcyBob3cgd2UgZW1pdCB0aGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtXHJcblx0cHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xyXG5cdFx0dGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuXHR9XHJcblxyXG5cdC8vIG5vdCB1c2VkLCB1c2VkIGZvciB0b3VjaCBpbnB1dFxyXG5cdHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZCgpIHsgfVxyXG5cclxuXHRhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHRcdGlmIChjaGFuZ2VzLml0ZW1zKSB7XHJcblx0XHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRJZCwgZmFsc2UpO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZiAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpXHJcblx0XHRcdFx0dGhpcy5leHBhbmQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5zaG93TG9hZGluZ01lc3NhZ2UpIHtcclxuXHRcdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHRcdFx0aWYgKHRoaXMuc2hvd0xvYWRpbmdNZXNzYWdlID09PSB0cnVlKVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJMb2FkaW5nLi4uXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuZ2V0VXJsKSB7XHJcblx0XHRcdGlmICh0aGlzLnNob3dMb2FkaW5nTWVzc2FnZSA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJMb2FkaW5nLi4uXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBpdGVtczogYW55W10gPSBhd2FpdCB0aGlzLnNsaWNrRHJvcERvd25TZXJ2aWNlLmdldEl0ZW1zRnJvbVNlcnZlcih0aGlzLmdldFVybClcclxuXHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSBudWxsO1xyXG5cdFx0XHR0aGlzLml0ZW1zID0gaXRlbXNcclxuXHRcdFx0dGhpcy52aXNpYmxlSXRlbXMgPSB0aGlzLnNsaWNrRHJvcERvd25TZXJ2aWNlLmdldFZpc2libGVJdGVtcyh0aGlzLml0ZW1zLCB0aGlzLmlkRmllbGROYW1lLCB0aGlzLnRleHRGaWVsZE5hbWUpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZElkLCBmYWxzZSk7XHJcblx0XHRcdGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpXHJcblx0XHRcdFx0dGhpcy5leHBhbmQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy52YWxpZGF0aW9uSW5kaWNhdG9yICYmIGNoYW5nZXMudmFsaWRhdGlvbkluZGljYXRvci5maXJzdENoYW5nZSkge1xyXG5cdFx0XHRpZiAoIXRoaXMudmFsaWRhdGlvbkluZGljYXRvclR5cGUpXHJcblx0XHRcdFx0dGhpcy52YWxpZGF0aW9uSW5kaWNhdG9yVHlwZSA9IFwiZXJyb3JcIjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5hbGxvd0VtcHR5KVxyXG5cdFx0XHR0aGlzLmFsbG93RW1wdHkgPSAodGhpcy5hbGxvd0VtcHR5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJykgPyBmYWxzZSA6IHRydWU7XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuaXNNb2JpbGUpXHJcblx0XHRcdHRoaXMuaXNNb2JpbGUgPSAodGhpcy5pc01vYmlsZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJykgPyB0cnVlIDogZmFsc2U7XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuZGlzYWJsZWQgJiYgY2hhbmdlcy5kaXNhYmxlZC5jdXJyZW50VmFsdWUpXHJcblx0XHRcdHRoaXMuZGlzYWJsZWQgPSAoY2hhbmdlcy5kaXNhYmxlZC5jdXJyZW50VmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKTtcclxuXHJcblx0XHRpZiAoY2hhbmdlcy5jb21wYWN0ICYmIGNoYW5nZXMuY29tcGFjdC5jdXJyZW50VmFsdWUpXHJcblx0XHRcdHRoaXMuY29tcGFjdCA9IChjaGFuZ2VzLmNvbXBhY3QuY3VycmVudFZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAhPT0gJ2ZhbHNlJyk7XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuc2VhcmNoVHlwZSkge1xyXG5cdFx0XHRpZiAoY2hhbmdlcy5zZWFyY2hUeXBlLmN1cnJlbnRWYWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdlYWNod29yZCcpXHJcblx0XHRcdFx0dGhpcy5zZWFyY2hUeXBlID0gU2xpY2tEcm9wRG93blNlYXJjaFR5cGVzLmVhY2hXb3JkO1xyXG5cdFx0XHRlbHNlIGlmIChjaGFuZ2VzLnNlYXJjaFR5cGUuY3VycmVudFZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2FueScpXHJcblx0XHRcdFx0dGhpcy5zZWFyY2hUeXBlID0gU2xpY2tEcm9wRG93blNlYXJjaFR5cGVzLmFueTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHRoaXMuc2VhcmNoVHlwZSA9IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcy5zdGFydHNXaXRoO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHR0aGlzLmNvbGxhcHNlKCk7XHJcblx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5mbkRvY3VtZW50Q2xpY2ssIHRydWUpO1xyXG5cclxuXHRcdC8vIGl0J3Mgb2theSBpZiB0aGlzIGZhaWxzLiAgSXQgd2FzIGFscmVhZHkgcmVtb3ZlZFxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50KTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIHsgfVxyXG5cdH1cclxuXHJcblx0YXN5bmMgc2V0Rm9jdXMoc2hvd0Ryb3Bkb3duTGlzdDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLmZpbHRlclRleHQgPSAnJztcclxuXHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdHRoaXMuc2tpcE9uRm9jdXNFdmVudCA9IChzaG93RHJvcGRvd25MaXN0ID09PSBmYWxzZSk7XHJcblxyXG5cdFx0YXdhaXQgU2xpY2tVdGlsc1NlcnZpY2Uud2FpdEZvckVsZW1lbnQoXCIjc2xpY2stZHJvcC1kb3duX1wiICsgdGhpcy51dWlkKTtcclxuXHRcdCg8SFRNTElucHV0RWxlbWVudD50aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGV4cGFuZCgpIHtcclxuXHRcdGlmICh0aGlzLmRpc2FibGVkKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0dGhpcy5pc1Zpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdFNsaWNrVXRpbHNTZXJ2aWNlLmF0dGFjaEVsZW1lbnQodGhpcy5kcm9wZG93bkxpc3QubmF0aXZlRWxlbWVudCwgdGhpcy5hdHRhY2hUbylcclxuXHJcblx0XHR0aGlzLnJlcG9zaXRpb24oKTtcclxuXHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cdFx0dGhpcy5kcm9wZG93bkxpc3QubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcclxuXHJcblx0XHRjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5kcm9wZG93bkxpc3QubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYWN0aXZlXCIpO1xyXG5cdFx0aWYgKHNlbGVjdGVkSXRlbXMgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKVxyXG5cdFx0XHQoPEhUTUxFbGVtZW50PnNlbGVjdGVkSXRlbXNbMF0pLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcclxuXHJcblx0XHR0aGlzLmV4cGFuZGVkID0gdHJ1ZTtcclxuXHJcblxyXG5cdFx0Ly8gVGhpcyBpcyBuZWNlc3NhcnksIG90aGVyd2lzZSBgdGhpc2AgaW4gdGhlIHJlcG9zaXRpb24gZnVuY3Rpb24gd2lsbCBiZSB3aW5kb3dcclxuXHRcdC8vIGFuZCBub3QgdGhlIGNvbXBvbmVudC5cclxuXHRcdC8vIFNpbmNlIGFuZ3VsYXIgaGFzIG5vIHdheSB0byB1c2UgdGhlIHRoaXJkIHBhcmFtZXRlciwgSSdtIGRvaW5nIHRoaXMgaW4gcmF3IGpzXHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5mbkRvY3VtZW50Q2xpY2ssIHRydWUpO1xyXG5cclxuXHRcdGlmICh0aGlzLm9uRXhwYW5kKVxyXG5cdFx0XHR0aGlzLm9uRXhwYW5kLmVtaXQoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY29sbGFwc2UoKSB7XHJcblx0XHRpZiAodGhpcy5leHBhbmRlZCA9PT0gZmFsc2UpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR0aGlzLmV4cGFuZGVkID0gZmFsc2U7XHJcblx0XHR0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuXHRcdC8vIFNpbmNlIGFuZ3VsYXIgaGFzIG5vIHdheSB0byB1c2UgdGhlIHRoaXJkIHBhcmFtZXRlciwgSSdtIGRvaW5nIHRoaXMgaW4gcmF3IGpzXHJcblx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5mbkRvY3VtZW50Q2xpY2ssIHRydWUpO1xyXG5cdFx0U2xpY2tVdGlsc1NlcnZpY2UucmVtb3ZlRWxlbWVudCh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50KTtcclxuXHJcblx0XHR0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0dGhpcy5za2lwT25Gb2N1c0V2ZW50ID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlcG9zaXRpb24oKSB7XHJcblx0XHRjb25zdCBkcm9wRG93blJlY3QgPSB0aGlzLmNvbnRhaW5lckRpdi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0Y29uc3QgcGFyZW50UmVjdCA9ICh0aGlzLmF0dGFjaFRvID09PSAnYm9keScpID8gbnVsbCA6IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3Rvcih0aGlzLmF0dGFjaFRvKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXJMZWZ0ID0gKHRoaXMuYXR0YWNoVG8gPT09ICdib2R5JykgPyBkcm9wRG93blJlY3QubGVmdCA6IChkcm9wRG93blJlY3QubGVmdCAtIHBhcmVudFJlY3QubGVmdCk7XHJcblx0XHRjb25zdCBjb250YWluZXJUb3AgPSAodGhpcy5hdHRhY2hUbyA9PT0gJ2JvZHknKSA/IGRyb3BEb3duUmVjdC50b3AgOiAoZHJvcERvd25SZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLmNvbnRhaW5lckRpdi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHRcdGNvbnN0IGNvbnRhaW5lcldpZHRoID0gZHJvcERvd25SZWN0LndpZHRoO1xyXG5cclxuXHRcdHRoaXMud2lkdGggPSBjb250YWluZXJXaWR0aDtcclxuXHRcdGlmICh0aGlzLmxpc3RXaWR0aCA9PT0gJzEwMCUnKVxyXG5cdFx0XHR0aGlzLmxpc3RHcm91cFdpZHRoID0gdGhpcy53aWR0aDtcclxuXHRcdGVsc2UgaWYgKHRoaXMubGlzdFdpZHRoID09PSAnYXV0bycpXHJcblx0XHRcdHRoaXMubGlzdEdyb3VwV2lkdGggPSBcImF1dG9cIjtcclxuXHRcdGVsc2VcclxuXHRcdFx0dGhpcy5saXN0R3JvdXBXaWR0aCA9IHRoaXMubGlzdFdpZHRoO1xyXG5cdFx0dGhpcy50b3AgPSAoY29udGFpbmVyVG9wICsgY29udGFpbmVySGVpZ2h0KTtcclxuXHRcdHRoaXMubGVmdCA9IGNvbnRhaW5lckxlZnQ7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGRvY3VtZW50Q2xpY2soZTogTW91c2VFdmVudCkge1xyXG5cdFx0Ly8gTm90IGVudGlyZWx5IHN1cmUgd2h5LCBidXQgaVBob25lcyBjYWxsIG9uRm9jdXMgd2hlbiBjbGlja2luZyBvdXQgb2YgdGhlIGRyb3Bkb3duXHJcblx0XHRpZiAodGhpcy5pc01vYmlsZSlcclxuXHRcdFx0dGhpcy5za2lwT25Gb2N1c0V2ZW50ID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIXRoaXMuZXhwYW5kZWQgfHwgIWUudGFyZ2V0KVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0aWYgKFNsaWNrVXRpbHNTZXJ2aWNlLmNoZWNrUGFyZW50SWRFeGlzdHMoPEhUTUxFbGVtZW50PmUudGFyZ2V0LCBcInNsaWNrLWRyb3AtZG93bl9cIiArIHRoaXMudXVpZCkgPT09IHRydWUpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggIT09IG51bGwgJiYgdGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRsZXQgaXRlbUlkID0gdGhpcy52aXNpYmxlSXRlbXNbdGhpcy5zZWxlY3RlZEluZGV4XS5pZDtcclxuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKGl0ZW1JZCwgdHJ1ZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jb2xsYXBzZSgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZWxlY3RJdGVtKGlkOiBzdHJpbmcsIGVtaXRPblNlbGVjdDogYm9vbGVhbikge1xyXG5cdFx0bGV0IGl0ZW0gPSB0aGlzLnNsaWNrRHJvcERvd25TZXJ2aWNlLmdldFNlbGVjdGVkSXRlbSh0aGlzLnZpc2libGVJdGVtcywgaWQpO1xyXG5cclxuXHRcdGlmIChpdGVtKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZElkID0gaXRlbS5pZDtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSBpdGVtLnRleHQ7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuc2xpY2tEcm9wRG93blNlcnZpY2UuZ2V0SXRlbUluZGV4KHRoaXMudmlzaWJsZUl0ZW1zLCB0aGlzLnNlbGVjdGVkSWQpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMub25DaGFuZ2UpXHJcblx0XHRcdFx0dGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtLml0ZW0pO1xyXG5cdFx0XHRpZiAoZW1pdE9uU2VsZWN0ID09PSB0cnVlICYmIHRoaXMub25TZWxlY3QpXHJcblx0XHRcdFx0dGhpcy5vblNlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtLml0ZW0pO1xyXG5cdFx0XHR0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnNlbGVjdGVkSWQpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSBudWxsO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgb25Gb2N1cygpIHtcclxuXHRcdGlmICh0aGlzLnNraXBPbkZvY3VzRXZlbnQgPT09IHRydWUpIHtcclxuXHRcdFx0dGhpcy5za2lwT25Gb2N1c0V2ZW50ID0gZmFsc2U7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmZpbHRlclRleHQgPSAnJztcclxuXHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdHRoaXMuc2VsZWN0SXRlbSh0aGlzLnNlbGVjdGVkSWQsIGZhbHNlKTtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggJiYgdGhpcy5zZWxlY3RlZEluZGV4ID49IDApIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnZpc2libGVJdGVtc1t0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0aGlzLnNlbGVjdGVkSXRlbS50ZXh0Lmxlbmd0aCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVGhpcyBpcyBraW5kIG9mIGhhY2t5LCBidXQgaWYgb25Gb2N1cyBpcyBjYWxsZWQgYnkgY2xpY2tpbmcgdGhlIGRyb3Bkb3duLCB0aGUgb25Ecm9wZG93bkNsaWNrIGV2ZW50IGlzIGNhbGxlZCBhcyB3ZWxsXHJcblx0XHQvLyBUaGF0IGZ1bmN0aW9uIHdpbGwgZXhwYW5kIG9yIGNvbGxhcHNlLCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlLiAgU2luY2UgdGhpcyBleHBhbmRzLCBpdCB0aGlua3MgaXQgbmVlZHMgdG8gY29sbGFwc2UuXHJcblx0XHQvLyBTbyBmYWtlIGl0IG91dCBhbmQgdGVsbCBpdCBOT1QgdG8gY29sbGFwc2UuICBCVVQsIGlmIHdlIGNhbWUgaW4gZnJvbSB0YWJiaW5nIGludG8gdGhlIGZpZWxkLCB0aGVuIGl0IHdvdWxkIG1lc3MgdXBcclxuXHRcdC8vIHRoZSBjbGljayBldmVudC4gIFNvIG9ubHkgd2FpdCBmb3IgMS8yIHNlY29uZC5cclxuXHRcdHRoaXMuc2tpcENsaWNrRXhwYW5kID0gdHJ1ZTtcclxuXHRcdHRoaXMuZXhwYW5kKCk7XHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCg1MDApO1xyXG5cdFx0dGhpcy5za2lwQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XHJcblx0XHRpZiAodGhpcy5pc0FuZHJvaWQpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHQvLyBUYWIvZW50ZXJcclxuXHRcdGlmIChlLndoaWNoID09PSA5IHx8IGUud2hpY2ggPT09IDEzKSB7XHJcblx0XHRcdHRoaXMuY29sbGFwc2UoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPT09IG51bGwgfHwgdGhpcy5zZWxlY3RlZEluZGV4ID09PSB1bmRlZmluZWQpXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0KDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuc2VsZWN0ZWRUZXh0SW5wdXRSZWYubmF0aXZlRWxlbWVudCkuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7XHJcblx0XHRcdGxldCBpdGVtSWQgPSB0aGlzLnZpc2libGVJdGVtc1t0aGlzLnNlbGVjdGVkSW5kZXhdLmlkO1xyXG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0oaXRlbUlkLCB0cnVlKTtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChlLmtleSAmJiBlLmtleS5sZW5ndGggPiAxKVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRpZiAoZS53aGljaCA9PT0gNDYgfHwgZS53aGljaCA9PT0gOCkge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGUud2hpY2ggPj0gMzIgJiYgZS53aGljaCA8PSAxMjYpIHtcclxuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgb25LZXlVcChlOiBLZXlib2FyZEV2ZW50KSB7XHJcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuXHRcdC8vIElmIHRoaXMgaXMgYW5kcm9pZCwgaXQgd29uJ3QgcGFzcyB1cyBhbnkga2V5IGRhdGEgc28ganVzdCByZWFkIHRoZSBlbnRpcmUgaW5wdXQgZWxlbWVudFxyXG5cdFx0aWYgKHRoaXMuaXNBbmRyb2lkID09PSB0cnVlKSB7XHJcblx0XHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblxyXG5cdFx0XHR0aGlzLmZpbHRlclRleHQgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS52YWx1ZTtcclxuXHRcdFx0dGhpcy5maWx0ZXJTZWFyY2goKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEVzY1xyXG5cdFx0aWYgKGUud2hpY2ggPT09IDI3KSB7XHJcblx0XHRcdHRoaXMuY29sbGFwc2UoKTtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBkZWwgb3IgYmFja3NwYWNlXHJcblx0XHRpZiAoZS53aGljaCA9PT0gNDYgfHwgZS53aGljaCA9PT0gOCAmJiAhdGhpcy5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLmFsbG93RW1wdHkgPT09IHRydWUpIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdEl0ZW0obnVsbCwgdHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZElkID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnByb3BhZ2F0ZUNoYW5nZShudWxsKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMub25DaGFuZ2UpXHJcblx0XHRcdFx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLm9uU2VsZWN0KVxyXG5cdFx0XHRcdFx0dGhpcy5vblNlbGVjdC5lbWl0KG51bGwpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDggJiYgdGhpcy5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuZmlsdGVyVGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5maWx0ZXJUZXh0Lmxlbmd0aCAtIDEpO1xyXG5cdFx0XHRpZiAodGhpcy5maWx0ZXJUZXh0Lmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMuc2xpY2tEcm9wRG93blNlcnZpY2UuZ2V0VmlzaWJsZUl0ZW1zKHRoaXMuaXRlbXMsIHRoaXMuaWRGaWVsZE5hbWUsIHRoaXMudGV4dEZpZWxkTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHRoaXMuZmlsdGVyU2VhcmNoKCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBcnJvd3VwXHJcblx0XHRpZiAoZS53aGljaCA9PT0gMzgpIHtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLnNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZClcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+IDApXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4LS07XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQXJyb3dkb3duXHJcblx0XHRpZiAoZS53aGljaCA9PT0gNDApIHtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLnNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZClcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTtcclxuXHJcblx0XHRcdGlmICghdGhpcy5leHBhbmRlZCB8fCAhdGhpcy52aXNpYmxlSXRlbXMpIHtcclxuXHRcdFx0XHR0aGlzLmV4cGFuZCgpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IHRoaXMudmlzaWJsZUl0ZW1zLmxlbmd0aCAtIDEpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4Kys7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSWYgRjEgaXMgcHJlc3NlZCwga2V5IGxlbmd0aCB3aWxsIGJlIDJcclxuXHRcdGlmIChlLmtleS5sZW5ndGggPiAxIHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSlcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGlmIChlLndoaWNoID49IDMyICYmIGUud2hpY2ggPD0gMTI2KSB7XHJcblx0XHRcdHRoaXMuZmlsdGVyVGV4dCArPSBlLmtleTtcclxuXHJcblx0XHRcdHRoaXMuZmlsdGVyU2VhcmNoKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvL2FzeW5jIG9uS2V5UHJlc3MoZTogS2V5Ym9hcmRFdmVudCkge1xyXG5cdC8vXHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHQvL1x0aWYgKCgoZS53aGljaCA+PSAzMiAmJiBlLndoaWNoIDw9IDEyNikgfHwgZS53aGljaCA9PT0gOCkgJiYgIWUuY3RybEtleSAmJiAhZS5hbHRLZXkpIHtcclxuXHQvL1x0XHRpZiAoZS53aGljaCA9PT0gOClcclxuXHQvL1x0XHRcdHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuZmlsdGVyVGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5maWx0ZXJUZXh0Lmxlbmd0aCAtIDEpO1xyXG5cdC8vXHRcdGVsc2VcclxuXHQvL1x0XHRcdHRoaXMuZmlsdGVyVGV4dCArPSBlLmtleTtcclxuXHQvL1x0XHR0aGlzLmZpbHRlclNlYXJjaCgpO1xyXG5cdC8vXHR9XHJcblxyXG5cdC8vXHRyZXR1cm4gdHJ1ZTtcclxuXHQvL31cclxuXHJcblxyXG5cdHByaXZhdGUgYXN5bmMgZmlsdGVyU2VhcmNoKCkge1xyXG5cdFx0aWYgKCF0aGlzLmV4cGFuZGVkKVxyXG5cdFx0XHR0aGlzLmV4cGFuZCgpO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5zbGlja0Ryb3BEb3duU2VydmljZS5nZXRWaXNpYmxlSXRlbXModGhpcy5pdGVtcywgdGhpcy5pZEZpZWxkTmFtZSwgdGhpcy50ZXh0RmllbGROYW1lKTtcclxuXHRcdGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IFNsaWNrRHJvcERvd25TZWFyY2hUeXBlcy5zdGFydHNXaXRoKSB7XHJcblx0XHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXMuZmlsdGVyKHggPT4geC50ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSkgPT09IDApO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0aWYgKHRoaXMuaXNBbmRyb2lkID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSB0aGlzLnZpc2libGVJdGVtc1swXS50ZXh0O1xyXG5cdFx0XHRcdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHRcdFx0XHRcdCg8SFRNTElucHV0RWxlbWVudD50aGlzLnNlbGVjdGVkVGV4dElucHV0UmVmLm5hdGl2ZUVsZW1lbnQpLnNldFNlbGVjdGlvblJhbmdlKHRoaXMuZmlsdGVyVGV4dC5sZW5ndGgsIHRoaXMuc2VsZWN0ZWRUZXh0Lmxlbmd0aCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRUZXh0ID0gdGhpcy5maWx0ZXJUZXh0O1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gU2xpY2tEcm9wRG93blNlYXJjaFR5cGVzLmVhY2hXb3JkKSB7XHJcblx0XHRcdHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXMuZmlsdGVyKHggPT4gKFwiIFwiICsgeC50ZXh0LnRvTG93ZXJDYXNlKCkpLmluZGV4T2YoXCIgXCIgKyB0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSkgPj0gMCk7XHJcblx0XHRcdGlmICh0aGlzLnZpc2libGVJdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRpZiAodGhpcy5pc0FuZHJvaWQgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkVGV4dCA9IHRoaXMudmlzaWJsZUl0ZW1zWzBdLnRleHQ7XHJcblx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZFRleHRTdGFydCA9IChcIiBcIiArIHRoaXMudmlzaWJsZUl0ZW1zWzBdLnRleHQpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcIiBcIiArIHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKTtcclxuXHRcdFx0XHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblx0XHRcdFx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3RlZFRleHRTdGFydCwgc2VsZWN0ZWRUZXh0U3RhcnQgKyB0aGlzLmZpbHRlclRleHQubGVuZ3RoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZFRleHQgPSB0aGlzLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uRHJvcGRvd25DbGlja2VkKCkge1xyXG5cdFx0dGhpcy5maWx0ZXJUZXh0ID0gJyc7XHJcblx0XHR0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMuc2xpY2tEcm9wRG93blNlcnZpY2UuZ2V0VmlzaWJsZUl0ZW1zKHRoaXMuaXRlbXMsIHRoaXMuaWRGaWVsZE5hbWUsIHRoaXMudGV4dEZpZWxkTmFtZSk7XHJcblx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZElkLCBmYWxzZSk7XHJcblx0XHQoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5zZWxlY3RlZFRleHRJbnB1dFJlZi5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xyXG5cclxuXHRcdGlmICh0aGlzLnNraXBDbGlja0V4cGFuZCA9PT0gdHJ1ZSkge1xyXG5cdFx0XHR0aGlzLnNraXBDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuZXhwYW5kZWQgPT09IGZhbHNlKVxyXG5cdFx0XHR0aGlzLmV4cGFuZCgpO1xyXG5cdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLmNvbGxhcHNlKCk7XHJcblx0fVxyXG5cclxuXHRvbkl0ZW1DbGljayhpdGVtOiBhbnkpIHtcclxuXHRcdHRoaXMuc2VsZWN0SXRlbShpdGVtLmlkLCB0cnVlKTtcclxuXHRcdHRoaXMuY29sbGFwc2UoKTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZUN1c3RvbUJ1dHRvbkNsaWNrKGNhbGxiYWNrOiBGdW5jdGlvbiwgZXZlbnQ6IEV2ZW50KSB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdGNhbGxiYWNrKGV2ZW50KTtcclxuXHRcdH1cclxuXHR9XHJcbn0iLCI8ZGl2ICNjb250YWluZXJEaXYgaWQ9XCJzbGljay1kcm9wLWRvd25fe3t1dWlkfX1cIiBhdHRyLmRhdGEtdXVpZD1cInt7dXVpZH19XCIgW2NsYXNzTmFtZV09XCInc2xpY2stZHJvcC1kb3duICcgKyAoY3NzQ2xhc3MgfHwgJycpXCIgW2NsYXNzLm9wZW5dPVwiZXhwYW5kZWRcIj5cclxuXHQ8ZGl2ICpuZ0lmPVwiY29tcGFjdCA9PT0gZmFsc2VcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWRpc2FibGVkXCIgY2xhc3M9J2lucHV0LWdyb3VwJyBzdHlsZT1cImN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50XCIgKGNsaWNrKT1cIm9uRHJvcGRvd25DbGlja2VkKClcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZXBlbmRCdXR0b25zICYmIHByZXBlbmRCdXR0b25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnRuIG9mIHByZXBlbmRCdXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dCBidG4gYnRuLXByaW1hcnkgYmFkZ2UtcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIiAoY2xpY2spPVwiaGFuZGxlQ3VzdG9tQnV0dG9uQ2xpY2soYnRuLm9uQ2xpY2ssICRldmVudClcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMnB4OyBib3JkZXItcmlnaHQ6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyB7eyBidG4uZmFDbGFzcyB9fVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInZhbGlkYXRpb25JbmRpY2F0b3JUeXBlXCIgW3NsaWNrLXZhbGlkYXRpb24taW5kaWNhdG9yXT1cInZhbGlkYXRpb25JbmRpY2F0b3JcIiBbc2xpY2tWYWxpZGF0aW9uVHlwZV09XCJ2YWxpZGF0aW9uSW5kaWNhdG9yVHlwZVwiICNzZWxlY3RlZFRleHRJbnB1dFJlZiBjbGFzcz0nZm9ybS1jb250cm9sJyBzdHlsZT0nYmFja2dyb3VuZDogd2hpdGU7IGN1cnNvcjogcG9pbnRlcicgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiBbcmVhZG9ubHldPVwiIWlzTW9iaWxlXCIgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiF2YWxpZGF0aW9uSW5kaWNhdG9yVHlwZVwiICNzZWxlY3RlZFRleHRJbnB1dFJlZiBjbGFzcz0nZm9ybS1jb250cm9sJyBzdHlsZT0nYmFja2dyb3VuZDogd2hpdGU7IGN1cnNvcjogcG9pbnRlcicgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiBbcmVhZG9ubHldPVwiIWlzTW9iaWxlXCIgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcbiAgICAgICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHQgYnRuLXByaW1hcnkgYmFkZ2UtcHJpbWFyeVwiPjxpIGNsYXNzPSdmYXMgZmEtY2hldnJvbi1kb3duJz48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFwcGVuZEJ1dHRvbnMgJiYgYXBwZW5kQnV0dG9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBhcHBlbmRCdXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dCBidG4gYnRuLXByaW1hcnkgYmFkZ2UtcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIiAoY2xpY2spPVwiaGFuZGxlQ3VzdG9tQnV0dG9uQ2xpY2soYnRuLm9uQ2xpY2ssICRldmVudClcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxcHg7IGJvcmRlci1sZWZ0OiBub25lO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMge3sgYnRuLmZhQ2xhc3MgfX1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHRcdDxkaXYgKm5nSWY9XCJkaXNhYmxlZCA9PT0gdHJ1ZVwiIGNsYXNzPSdpbnB1dC1ncm91cCc+XHJcblx0XHRcdDxpbnB1dCAjc2VsZWN0ZWRUZXh0SW5wdXRSZWYgc3R5bGU9J2N1cnNvcjogZGVmYXVsdCcgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiBkaXNhYmxlZD1cImRpc2FibGVkXCIgcmVhZG9ubHkgY2xhc3M9J2Zvcm0tY29udHJvbCcgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcblx0XHRcdDxkaXYgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kIGRpc2FibGVkXCI+XHJcblx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0IHRleHQtbXV0ZWRcIj48aSBjbGFzcz0nZmFzIGZhLWNoZXZyb24tZG93bic+PC9pPjwvc3Bhbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGRpdiAgW2NsYXNzTmFtZV09XCInc2xpY2stZHJvcC1kb3duLWNvbXBhY3QgJyArIChjc3NDbGFzcyB8fCAnJylcIiAqbmdJZj1cImNvbXBhY3QgPT09IHRydWVcIj5cclxuXHRcdDxkaXYgKm5nSWY9XCJkaXNhYmxlZCA9PT0gZmFsc2VcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50XCIgKGNsaWNrKT1cIm9uRHJvcGRvd25DbGlja2VkKClcIj5cclxuXHRcdFx0PGlucHV0ICNzZWxlY3RlZFRleHRJbnB1dFJlZiBjbGFzcz1cInRleHQtYm9keVwiIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRleHRcIiAoa2V5dXApPVwib25LZXlVcCgkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIG5nLWRpc2FibGVkPSdkaXNhYmxlZCcgcmVhZG9ubHkgW3BsYWNlaG9sZGVyXT0ncGxhY2Vob2xkZXInIC8+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJzbGljay1kcm9wLWRvd24tY29tcGFjdC1hcnJvd1wiIHRhYmluZGV4PVwiLTFcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAtMXB4O1wiPjxpIGNsYXNzPSdmYXMgZmEtY2hldnJvbi1kb3duJz48L2k+PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHJcblx0XHQ8ZGl2ICpuZ0lmPVwiZGlzYWJsZWQgPT09IHRydWVcIiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O1wiPlxyXG5cdFx0XHQ8ZGl2ICpuZ0lmPSdzZWxlY3RlZFRleHQnIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+e3tzZWxlY3RlZFRleHR9fTwvZGl2PlxyXG5cdFx0XHQ8ZGl2ICpuZ0lmPVwiIXNlbGVjdGVkVGV4dFwiIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+e3twbGFjZWhvbGRlcn19PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PHVsICpuZ0lmPVwiaXNWaXNpYmxlXCIgI2Ryb3Bkb3duTGlzdCBpZD1cInNsaWNrLWRyb3AtZG93bl97e3V1aWR9fVwiIGNsYXNzPSdzbGljay1kcm9wLWRvd24tbGlzdC1ncm91cCBkcm9wZG93bi1tZW51JyBbc3R5bGUud2lkdGhdPVwibGlzdEdyb3VwV2lkdGhcIiBbc3R5bGUudmlzaWJpbGl0eV09XCIoZXhwYW5kZWQgPT09IHRydWUpID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIiBbc3R5bGUub3BhY2l0eV09XCIoZXhwYW5kZWQgPT09IHRydWUpID8gJzEnIDogJzAnXCIgW3N0eWxlLm1heC1oZWlnaHRdPVwiaGVpZ2h0XCIgW3N0eWxlLndpZHRoLnB4XT1cImxpc3RHcm91cFdpZHRoXCIgW3N0eWxlLmxlZnQucHhdPVwibGVmdFwiIFtzdHlsZS50b3AucHhdPVwidG9wXCI+XHJcblx0XHQ8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmlzaWJsZUl0ZW1zOyBsZXQgaW5kZXggPSBpbmRleDtcIiAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIiBbY2xhc3MuYWN0aXZlXT1cIml0ZW0uaWQgPT09IHNlbGVjdGVkSXRlbT8uaWRcIiBbY2xhc3MuY2FyZC1oZWFkZXJdPVwic2VsZWN0ZWRJbmRleCA9PT0gaW5kZXhcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj57e2l0ZW0udGV4dH19PC9saT5cclxuXHQ8L3VsPlxyXG5cclxuPC9kaXY+Il19