cax-design-system 2.8.2 → 2.8.3

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 (1726) hide show
  1. package/accordion/accordion.d.ts +224 -0
  2. package/accordion/accordion.interface.d.ts +49 -0
  3. package/accordion/accordion.module.d.ts +13 -0
  4. package/accordion/index.d.ts +3 -286
  5. package/accordion/public_api.d.ts +3 -0
  6. package/animate/animate.d.ts +40 -0
  7. package/animate/index.d.ts +3 -41
  8. package/animate/public_api.d.ts +1 -0
  9. package/animateonscroll/animateonscroll.d.ts +75 -0
  10. package/animateonscroll/index.d.ts +3 -75
  11. package/animateonscroll/public_api.d.ts +1 -0
  12. package/api/blockableui.d.ts +10 -0
  13. package/api/caxconfig.d.ts +24 -0
  14. package/api/confirmaeventtype.d.ts +8 -0
  15. package/api/confirmation.d.ts +96 -0
  16. package/api/confirmationservice.d.ts +30 -0
  17. package/api/contextmenuservice.d.ts +11 -0
  18. package/api/filtermatchmode.d.ts +22 -0
  19. package/api/filtermetadata.d.ts +18 -0
  20. package/api/filteroperator.d.ts +4 -0
  21. package/api/filterservice.d.ts +10 -0
  22. package/api/index.d.ts +3 -1856
  23. package/api/lazyloadevent.d.ts +47 -0
  24. package/api/lazyloadmeta.d.ts +19 -0
  25. package/api/megamenuitem.d.ts +130 -0
  26. package/api/menuitem.d.ts +176 -0
  27. package/api/message.d.ts +30 -0
  28. package/api/messageservice.d.ts +32 -0
  29. package/api/overlayoptions.d.ts +188 -0
  30. package/api/overlayservice.d.ts +9 -0
  31. package/api/primeicons.d.ts +313 -0
  32. package/api/public_api.d.ts +34 -0
  33. package/api/scrolleroptions.d.ts +116 -0
  34. package/api/selectitem.d.ts +12 -0
  35. package/api/selectitemgroup.d.ts +10 -0
  36. package/api/shared.d.ts +24 -0
  37. package/api/sortevent.d.ts +12 -0
  38. package/api/sortmeta.d.ts +8 -0
  39. package/api/tablestate.d.ts +60 -0
  40. package/api/themegeneratorservice.d.ts +12 -0
  41. package/api/tooltipoptions.d.ts +69 -0
  42. package/api/translation.d.ts +135 -0
  43. package/api/translationkeys.d.ts +50 -0
  44. package/api/treedragdropservice.d.ts +12 -0
  45. package/api/treenode.d.ts +91 -0
  46. package/api/treenodedragevent.d.ts +27 -0
  47. package/api/treetablenode.d.ts +36 -0
  48. package/autocomplete/autocomplete.d.ts +616 -0
  49. package/autocomplete/autocomplete.interface.d.ts +164 -0
  50. package/autocomplete/autocomplete.module.d.ts +20 -0
  51. package/autocomplete/index.d.ts +3 -799
  52. package/autocomplete/public_api.d.ts +3 -0
  53. package/autofocus/autofocus.d.ts +28 -0
  54. package/autofocus/index.d.ts +3 -29
  55. package/autofocus/public_api.d.ts +1 -0
  56. package/avatar/avatar.d.ts +73 -0
  57. package/avatar/avatar.module.d.ts +7 -0
  58. package/avatar/index.d.ts +3 -80
  59. package/avatar/public_api.d.ts +2 -0
  60. package/avatargroup/avatargroup.d.ts +21 -0
  61. package/avatargroup/avatargroup.module.d.ts +9 -0
  62. package/avatargroup/index.d.ts +3 -30
  63. package/avatargroup/public_api.d.ts +2 -0
  64. package/badge/badge.d.ts +21 -0
  65. package/badge/badge.directive.d.ts +35 -0
  66. package/badge/badge.module.d.ts +10 -0
  67. package/badge/index.d.ts +5 -67
  68. package/badge/public_api.d.ts +3 -0
  69. package/baseicon/baseicon.d.ts +15 -0
  70. package/baseicon/index.d.ts +5 -18
  71. package/baseicon/public_api.d.ts +1 -0
  72. package/blockui/blockui.d.ts +64 -0
  73. package/blockui/blockui.interface.d.ts +11 -0
  74. package/blockui/index.d.ts +3 -77
  75. package/blockui/public_api.d.ts +2 -0
  76. package/breadcrumb/breadcrumb.d.ts +55 -0
  77. package/breadcrumb/breadcrumb.interface.d.ts +38 -0
  78. package/breadcrumb/breadcrumb.module.d.ts +13 -0
  79. package/breadcrumb/index.d.ts +3 -105
  80. package/breadcrumb/public_api.d.ts +3 -0
  81. package/button/button.d.ts +85 -0
  82. package/button/button.directive.d.ts +49 -0
  83. package/button/button.interface.d.ts +30 -0
  84. package/button/button.module.d.ts +9 -0
  85. package/button/index.d.ts +3 -170
  86. package/button/public_api.d.ts +4 -0
  87. package/buttongroup/buttongroup.d.ts +11 -0
  88. package/buttongroup/index.d.ts +5 -14
  89. package/buttongroup/public_api.d.ts +1 -0
  90. package/calendar/calendar.d.ts +722 -0
  91. package/calendar/calendar.interface.d.ts +204 -0
  92. package/calendar/calendar.module.d.ts +9 -0
  93. package/calendar/index.d.ts +3 -935
  94. package/calendar/public_api.d.ts +3 -0
  95. package/card/card.d.ts +53 -0
  96. package/card/card.interface.d.ts +27 -0
  97. package/card/card.module.d.ts +11 -0
  98. package/card/index.d.ts +3 -92
  99. package/card/public_api.d.ts +3 -0
  100. package/carousel/carousel.d.ts +227 -0
  101. package/carousel/carousel.interface.d.ts +63 -0
  102. package/carousel/index.d.ts +3 -290
  103. package/carousel/public_api.d.ts +2 -0
  104. package/cascadeselect/cascadeselect.d.ts +435 -0
  105. package/cascadeselect/cascadeselect.interface.d.ts +115 -0
  106. package/cascadeselect/cascadeselect.module.d.ts +15 -0
  107. package/cascadeselect/index.d.ts +3 -564
  108. package/cascadeselect/public_api.d.ts +3 -0
  109. package/chart/chart.d.ts +87 -0
  110. package/chart/index.d.ts +3 -88
  111. package/chart/public_api.d.ts +1 -0
  112. package/checkbox/checkbox.d.ts +168 -0
  113. package/checkbox/checkbox.interface.d.ts +26 -0
  114. package/checkbox/checkbox.module.d.ts +10 -0
  115. package/checkbox/index.d.ts +3 -204
  116. package/checkbox/public_api.d.ts +3 -0
  117. package/chip/chip.d.ts +38 -0
  118. package/chip/chip.interface.d.ts +15 -0
  119. package/chip/chip.module.d.ts +10 -0
  120. package/chip/index.d.ts +3 -63
  121. package/chip/public_api.d.ts +3 -0
  122. package/chips/chips.d.ts +233 -0
  123. package/chips/chips.interface.d.ts +58 -0
  124. package/chips/chips.module.d.ts +14 -0
  125. package/chips/index.d.ts +3 -305
  126. package/chips/public_api.d.ts +3 -0
  127. package/colorpicker/colorpicker.d.ts +240 -0
  128. package/colorpicker/colorpicker.interface.d.ts +15 -0
  129. package/colorpicker/colorpicker.module.d.ts +9 -0
  130. package/colorpicker/index.d.ts +3 -265
  131. package/colorpicker/public_api.d.ts +3 -0
  132. package/commentbox/commentbox.d.ts +120 -0
  133. package/commentbox/commentbox.module.d.ts +17 -0
  134. package/commentbox/index.d.ts +5 -138
  135. package/commentbox/public_api.d.ts +2 -0
  136. package/confirmdialog/confirmdialog.d.ts +281 -0
  137. package/confirmdialog/confirmdialog.interface.d.ts +39 -0
  138. package/confirmdialog/confirmdialog.module.d.ts +15 -0
  139. package/confirmdialog/index.d.ts +3 -336
  140. package/confirmdialog/public_api.d.ts +3 -0
  141. package/confirmpopup/confirmpopup.d.ts +119 -0
  142. package/confirmpopup/confirmpopup.interface.d.ts +27 -0
  143. package/confirmpopup/index.d.ts +3 -148
  144. package/confirmpopup/public_api.d.ts +2 -0
  145. package/contextmenu/contextmenu.d.ts +260 -0
  146. package/contextmenu/index.d.ts +3 -261
  147. package/contextmenu/public_api.d.ts +1 -0
  148. package/dataview/dataview.d.ts +274 -0
  149. package/dataview/dataview.interface.d.ts +183 -0
  150. package/dataview/index.d.ts +3 -457
  151. package/dataview/public_api.d.ts +2 -0
  152. package/defer/defer.d.ts +39 -0
  153. package/defer/index.d.ts +3 -40
  154. package/defer/public_api.d.ts +1 -0
  155. package/dialog/dialog.d.ts +364 -0
  156. package/dialog/dialog.interface.d.ts +31 -0
  157. package/dialog/dialog.module.d.ts +15 -0
  158. package/dialog/index.d.ts +3 -411
  159. package/dialog/public_api.d.ts +3 -0
  160. package/divider/divider.d.ts +49 -0
  161. package/divider/divider.module.d.ts +7 -0
  162. package/divider/index.d.ts +3 -56
  163. package/divider/public_api.d.ts +2 -0
  164. package/dock/dock.d.ts +115 -0
  165. package/dock/dock.interface.d.ts +19 -0
  166. package/dock/index.d.ts +3 -136
  167. package/dock/public_api.d.ts +2 -0
  168. package/dom/connectedoverlayscrollhandler.d.ts +9 -0
  169. package/dom/domhandler.d.ts +95 -0
  170. package/dom/index.d.ts +3 -105
  171. package/dom/public_api.d.ts +2 -0
  172. package/dragdrop/dragdrop.d.ts +112 -0
  173. package/dragdrop/dragdrop.module.d.ts +8 -0
  174. package/dragdrop/index.d.ts +3 -120
  175. package/dragdrop/public_api.d.ts +2 -0
  176. package/dropdown/dropdown-item.d.ts +30 -0
  177. package/dropdown/dropdown.d.ts +628 -0
  178. package/dropdown/dropdown.interface.d.ts +154 -0
  179. package/dropdown/dropdown.module.d.ts +11 -0
  180. package/dropdown/index.d.ts +3 -818
  181. package/dropdown/public_api.d.ts +4 -0
  182. package/dynamicdialog/dialogservice.d.ts +35 -0
  183. package/dynamicdialog/dynamicdialog-config.d.ts +221 -0
  184. package/dynamicdialog/dynamicdialog-injector.d.ts +7 -0
  185. package/dynamicdialog/dynamicdialog-ref.d.ts +101 -0
  186. package/dynamicdialog/dynamicdialog.d.ts +124 -0
  187. package/dynamicdialog/dynamicdialogcontent.d.ts +8 -0
  188. package/dynamicdialog/index.d.ts +3 -490
  189. package/dynamicdialog/public_api.d.ts +6 -0
  190. package/editor/editor.d.ts +104 -0
  191. package/editor/editor.interface.d.ts +64 -0
  192. package/editor/editor.module.d.ts +9 -0
  193. package/editor/index.d.ts +3 -177
  194. package/editor/public_api.d.ts +3 -0
  195. package/esm2022/accordion/accordion.interface.mjs +2 -0
  196. package/esm2022/accordion/accordion.mjs +598 -0
  197. package/esm2022/accordion/accordion.module.mjs +23 -0
  198. package/esm2022/accordion/cax-design-system-accordion.mjs +5 -0
  199. package/esm2022/accordion/public_api.mjs +4 -0
  200. package/esm2022/animate/animate.mjs +101 -0
  201. package/esm2022/animate/cax-design-system-animate.mjs +5 -0
  202. package/esm2022/animate/public_api.mjs +2 -0
  203. package/esm2022/animateonscroll/animateonscroll.mjs +185 -0
  204. package/esm2022/animateonscroll/cax-design-system-animateonscroll.mjs +5 -0
  205. package/esm2022/animateonscroll/public_api.mjs +2 -0
  206. package/esm2022/api/blockableui.mjs +2 -0
  207. package/esm2022/api/cax-design-system-api.mjs +5 -0
  208. package/esm2022/api/caxconfig.mjs +163 -0
  209. package/esm2022/api/confirmaeventtype.mjs +10 -0
  210. package/esm2022/api/confirmation.mjs +2 -0
  211. package/esm2022/api/confirmationservice.mjs +43 -0
  212. package/esm2022/api/contextmenuservice.mjs +22 -0
  213. package/esm2022/api/filtermatchmode.mjs +23 -0
  214. package/esm2022/api/filtermetadata.mjs +2 -0
  215. package/esm2022/api/filteroperator.mjs +5 -0
  216. package/esm2022/api/filterservice.mjs +225 -0
  217. package/esm2022/api/lazyloadevent.mjs +2 -0
  218. package/esm2022/api/lazyloadmeta.mjs +2 -0
  219. package/esm2022/api/megamenuitem.mjs +2 -0
  220. package/esm2022/api/menuitem.mjs +2 -0
  221. package/esm2022/api/message.mjs +2 -0
  222. package/esm2022/api/messageservice.mjs +47 -0
  223. package/esm2022/api/overlayoptions.mjs +2 -0
  224. package/esm2022/api/overlayservice.mjs +19 -0
  225. package/esm2022/api/primeicons.mjs +314 -0
  226. package/esm2022/api/public_api.mjs +35 -0
  227. package/esm2022/api/scrolleroptions.mjs +2 -0
  228. package/esm2022/api/selectitem.mjs +2 -0
  229. package/esm2022/api/selectitemgroup.mjs +2 -0
  230. package/esm2022/api/shared.mjs +65 -0
  231. package/esm2022/api/sortevent.mjs +2 -0
  232. package/esm2022/api/sortmeta.mjs +2 -0
  233. package/esm2022/api/tablestate.mjs +2 -0
  234. package/esm2022/api/themegeneratorservice.mjs +109 -0
  235. package/esm2022/api/tooltipoptions.mjs +2 -0
  236. package/esm2022/api/translation.mjs +2 -0
  237. package/esm2022/api/translationkeys.mjs +51 -0
  238. package/esm2022/api/treedragdropservice.mjs +21 -0
  239. package/esm2022/api/treenode.mjs +2 -0
  240. package/esm2022/api/treenodedragevent.mjs +2 -0
  241. package/esm2022/api/treetablenode.mjs +2 -0
  242. package/esm2022/autocomplete/autocomplete.interface.mjs +2 -0
  243. package/esm2022/autocomplete/autocomplete.mjs +1462 -0
  244. package/esm2022/autocomplete/autocomplete.module.mjs +30 -0
  245. package/esm2022/autocomplete/cax-design-system-autocomplete.mjs +5 -0
  246. package/esm2022/autocomplete/public_api.mjs +4 -0
  247. package/esm2022/autofocus/autofocus.mjs +78 -0
  248. package/esm2022/autofocus/cax-design-system-autofocus.mjs +5 -0
  249. package/esm2022/autofocus/public_api.mjs +2 -0
  250. package/esm2022/avatar/avatar.mjs +104 -0
  251. package/esm2022/avatar/avatar.module.mjs +16 -0
  252. package/esm2022/avatar/cax-design-system-avatar.mjs +5 -0
  253. package/esm2022/avatar/public_api.mjs +3 -0
  254. package/esm2022/avatargroup/avatargroup.mjs +32 -0
  255. package/esm2022/avatargroup/avatargroup.module.mjs +19 -0
  256. package/esm2022/avatargroup/cax-design-system-avatargroup.mjs +5 -0
  257. package/esm2022/avatargroup/public_api.mjs +3 -0
  258. package/esm2022/badge/badge.directive.mjs +193 -0
  259. package/esm2022/badge/badge.mjs +50 -0
  260. package/esm2022/badge/badge.module.mjs +20 -0
  261. package/esm2022/badge/cax-design-system-badge.mjs +5 -0
  262. package/esm2022/badge/public_api.mjs +4 -0
  263. package/esm2022/baseicon/baseicon.mjs +45 -0
  264. package/esm2022/baseicon/cax-design-system-baseicon.mjs +5 -0
  265. package/esm2022/baseicon/public_api.mjs +2 -0
  266. package/esm2022/blockui/blockui.interface.mjs +2 -0
  267. package/esm2022/blockui/blockui.mjs +206 -0
  268. package/esm2022/blockui/cax-design-system-blockui.mjs +5 -0
  269. package/esm2022/blockui/public_api.mjs +3 -0
  270. package/esm2022/breadcrumb/breadcrumb.interface.mjs +2 -0
  271. package/esm2022/breadcrumb/breadcrumb.mjs +120 -0
  272. package/esm2022/breadcrumb/breadcrumb.module.mjs +23 -0
  273. package/esm2022/breadcrumb/cax-design-system-breadcrumb.mjs +5 -0
  274. package/esm2022/breadcrumb/public_api.mjs +4 -0
  275. package/esm2022/button/button.directive.mjs +259 -0
  276. package/esm2022/button/button.interface.mjs +2 -0
  277. package/esm2022/button/button.mjs +190 -0
  278. package/esm2022/button/button.module.mjs +18 -0
  279. package/esm2022/button/cax-design-system-button.mjs +5 -0
  280. package/esm2022/button/public_api.mjs +5 -0
  281. package/esm2022/buttongroup/buttongroup.mjs +38 -0
  282. package/esm2022/buttongroup/cax-design-system-buttongroup.mjs +5 -0
  283. package/esm2022/buttongroup/public_api.mjs +2 -0
  284. package/esm2022/calendar/calendar.interface.mjs +2 -0
  285. package/esm2022/calendar/calendar.mjs +3242 -0
  286. package/esm2022/calendar/calendar.module.mjs +18 -0
  287. package/esm2022/calendar/cax-design-system-calendar.mjs +5 -0
  288. package/esm2022/calendar/public_api.mjs +4 -0
  289. package/esm2022/card/card.interface.mjs +2 -0
  290. package/esm2022/card/card.mjs +117 -0
  291. package/esm2022/card/card.module.mjs +21 -0
  292. package/esm2022/card/cax-design-system-card.mjs +5 -0
  293. package/esm2022/card/public_api.mjs +4 -0
  294. package/esm2022/carousel/carousel.interface.mjs +2 -0
  295. package/esm2022/carousel/carousel.mjs +968 -0
  296. package/esm2022/carousel/cax-design-system-carousel.mjs +5 -0
  297. package/esm2022/carousel/public_api.mjs +3 -0
  298. package/esm2022/cascadeselect/cascadeselect.interface.mjs +2 -0
  299. package/esm2022/cascadeselect/cascadeselect.mjs +1135 -0
  300. package/esm2022/cascadeselect/cascadeselect.module.mjs +25 -0
  301. package/esm2022/cascadeselect/cax-design-system-cascadeselect.mjs +5 -0
  302. package/esm2022/cascadeselect/public_api.mjs +4 -0
  303. package/esm2022/cax-design-system.mjs +5 -0
  304. package/esm2022/chart/cax-design-system-chart.mjs +5 -0
  305. package/esm2022/chart/chart.mjs +236 -0
  306. package/esm2022/chart/public_api.mjs +2 -0
  307. package/esm2022/checkbox/cax-design-system-checkbox.mjs +5 -0
  308. package/esm2022/checkbox/checkbox.interface.mjs +2 -0
  309. package/esm2022/checkbox/checkbox.mjs +318 -0
  310. package/esm2022/checkbox/checkbox.module.mjs +20 -0
  311. package/esm2022/checkbox/public_api.mjs +4 -0
  312. package/esm2022/chip/cax-design-system-chip.mjs +5 -0
  313. package/esm2022/chip/chip.interface.mjs +2 -0
  314. package/esm2022/chip/chip.mjs +90 -0
  315. package/esm2022/chip/chip.module.mjs +20 -0
  316. package/esm2022/chip/public_api.mjs +4 -0
  317. package/esm2022/chips/cax-design-system-chips.mjs +5 -0
  318. package/esm2022/chips/chips.interface.mjs +2 -0
  319. package/esm2022/chips/chips.mjs +610 -0
  320. package/esm2022/chips/chips.module.mjs +23 -0
  321. package/esm2022/chips/public_api.mjs +4 -0
  322. package/esm2022/colorpicker/cax-design-system-colorpicker.mjs +5 -0
  323. package/esm2022/colorpicker/colorpicker.interface.mjs +2 -0
  324. package/esm2022/colorpicker/colorpicker.mjs +715 -0
  325. package/esm2022/colorpicker/colorpicker.module.mjs +19 -0
  326. package/esm2022/colorpicker/public_api.mjs +4 -0
  327. package/esm2022/commentbox/cax-design-system-commentbox.mjs +5 -0
  328. package/esm2022/commentbox/commentbox.mjs +575 -0
  329. package/esm2022/commentbox/commentbox.module.mjs +27 -0
  330. package/esm2022/commentbox/public_api.mjs +3 -0
  331. package/esm2022/confirmdialog/cax-design-system-confirmdialog.mjs +5 -0
  332. package/esm2022/confirmdialog/confirmdialog.interface.mjs +2 -0
  333. package/esm2022/confirmdialog/confirmdialog.mjs +720 -0
  334. package/esm2022/confirmdialog/confirmdialog.module.mjs +25 -0
  335. package/esm2022/confirmdialog/public_api.mjs +4 -0
  336. package/esm2022/confirmpopup/cax-design-system-confirmpopup.mjs +5 -0
  337. package/esm2022/confirmpopup/confirmpopup.interface.mjs +2 -0
  338. package/esm2022/confirmpopup/confirmpopup.mjs +499 -0
  339. package/esm2022/confirmpopup/public_api.mjs +3 -0
  340. package/esm2022/contextmenu/cax-design-system-contextmenu.mjs +5 -0
  341. package/esm2022/contextmenu/contextmenu.mjs +1304 -0
  342. package/esm2022/contextmenu/public_api.mjs +2 -0
  343. package/esm2022/dataview/cax-design-system-dataview.mjs +5 -0
  344. package/esm2022/dataview/dataview.interface.mjs +2 -0
  345. package/esm2022/dataview/dataview.mjs +723 -0
  346. package/esm2022/dataview/public_api.mjs +3 -0
  347. package/esm2022/defer/cax-design-system-defer.mjs +5 -0
  348. package/esm2022/defer/defer.mjs +111 -0
  349. package/esm2022/defer/public_api.mjs +2 -0
  350. package/esm2022/dialog/cax-design-system-dialog.mjs +5 -0
  351. package/esm2022/dialog/dialog.interface.mjs +2 -0
  352. package/esm2022/dialog/dialog.mjs +959 -0
  353. package/esm2022/dialog/dialog.module.mjs +25 -0
  354. package/esm2022/dialog/public_api.mjs +4 -0
  355. package/esm2022/divider/cax-design-system-divider.mjs +5 -0
  356. package/esm2022/divider/divider.mjs +69 -0
  357. package/esm2022/divider/divider.module.mjs +16 -0
  358. package/esm2022/divider/public_api.mjs +3 -0
  359. package/esm2022/dock/cax-design-system-dock.mjs +5 -0
  360. package/esm2022/dock/dock.interface.mjs +2 -0
  361. package/esm2022/dock/dock.mjs +431 -0
  362. package/esm2022/dock/public_api.mjs +3 -0
  363. package/esm2022/dom/cax-design-system-dom.mjs +5 -0
  364. package/esm2022/dom/connectedoverlayscrollhandler.mjs +30 -0
  365. package/esm2022/dom/domhandler.mjs +722 -0
  366. package/esm2022/dom/public_api.mjs +3 -0
  367. package/esm2022/dragdrop/cax-design-system-dragdrop.mjs +5 -0
  368. package/esm2022/dragdrop/dragdrop.mjs +309 -0
  369. package/esm2022/dragdrop/dragdrop.module.mjs +18 -0
  370. package/esm2022/dragdrop/public_api.mjs +3 -0
  371. package/esm2022/dropdown/cax-design-system-dropdown.mjs +5 -0
  372. package/esm2022/dropdown/dropdown-item.mjs +72 -0
  373. package/esm2022/dropdown/dropdown.interface.mjs +2 -0
  374. package/esm2022/dropdown/dropdown.mjs +1599 -0
  375. package/esm2022/dropdown/dropdown.module.mjs +20 -0
  376. package/esm2022/dropdown/public_api.mjs +5 -0
  377. package/esm2022/dynamicdialog/cax-design-system-dynamicdialog.mjs +5 -0
  378. package/esm2022/dynamicdialog/dialogservice.mjs +102 -0
  379. package/esm2022/dynamicdialog/dynamicdialog-config.mjs +187 -0
  380. package/esm2022/dynamicdialog/dynamicdialog-injector.mjs +15 -0
  381. package/esm2022/dynamicdialog/dynamicdialog-ref.mjs +119 -0
  382. package/esm2022/dynamicdialog/dynamicdialog.mjs +696 -0
  383. package/esm2022/dynamicdialog/dynamicdialogcontent.mjs +20 -0
  384. package/esm2022/dynamicdialog/public_api.mjs +7 -0
  385. package/esm2022/editor/cax-design-system-editor.mjs +5 -0
  386. package/esm2022/editor/editor.interface.mjs +2 -0
  387. package/esm2022/editor/editor.mjs +281 -0
  388. package/esm2022/editor/editor.module.mjs +19 -0
  389. package/esm2022/editor/public_api.mjs +4 -0
  390. package/esm2022/fieldset/cax-design-system-fieldset.mjs +5 -0
  391. package/esm2022/fieldset/fieldset.interface.mjs +2 -0
  392. package/esm2022/fieldset/fieldset.mjs +297 -0
  393. package/esm2022/fieldset/public_api.mjs +3 -0
  394. package/esm2022/fileupload/cax-design-system-fileupload.mjs +5 -0
  395. package/esm2022/fileupload/fileupload.interface.mjs +2 -0
  396. package/esm2022/fileupload/fileupload.mjs +1188 -0
  397. package/esm2022/fileupload/public_api.mjs +3 -0
  398. package/esm2022/floatlabel/cax-design-system-floatlabel.mjs +5 -0
  399. package/esm2022/floatlabel/floatlabel.mjs +28 -0
  400. package/esm2022/floatlabel/floatlabel.module.mjs +20 -0
  401. package/esm2022/floatlabel/public_api.mjs +3 -0
  402. package/esm2022/focustrap/cax-design-system-focustrap.mjs +5 -0
  403. package/esm2022/focustrap/focustrap.mjs +103 -0
  404. package/esm2022/focustrap/public_api.mjs +2 -0
  405. package/esm2022/galleria/cax-design-system-galleria.mjs +5 -0
  406. package/esm2022/galleria/galleria.interface.mjs +2 -0
  407. package/esm2022/galleria/galleria.mjs +1668 -0
  408. package/esm2022/galleria/public_api.mjs +3 -0
  409. package/esm2022/iconfield/cax-design-system-iconfield.mjs +5 -0
  410. package/esm2022/iconfield/iconfield.mjs +44 -0
  411. package/esm2022/iconfield/public_api.mjs +2 -0
  412. package/esm2022/icons/angledoubledown/angledoubledown.mjs +35 -0
  413. package/esm2022/icons/angledoubledown/cax-design-system-icons-angledoubledown.mjs +5 -0
  414. package/esm2022/icons/angledoubledown/public_api.mjs +2 -0
  415. package/esm2022/icons/angledoubleleft/angledoubleleft.mjs +35 -0
  416. package/esm2022/icons/angledoubleleft/cax-design-system-icons-angledoubleleft.mjs +5 -0
  417. package/esm2022/icons/angledoubleleft/public_api.mjs +2 -0
  418. package/esm2022/icons/angledoubleright/angledoubleright.mjs +35 -0
  419. package/esm2022/icons/angledoubleright/cax-design-system-icons-angledoubleright.mjs +5 -0
  420. package/esm2022/icons/angledoubleright/public_api.mjs +2 -0
  421. package/esm2022/icons/angledoubleup/angledoubleup.mjs +35 -0
  422. package/esm2022/icons/angledoubleup/cax-design-system-icons-angledoubleup.mjs +5 -0
  423. package/esm2022/icons/angledoubleup/public_api.mjs +2 -0
  424. package/esm2022/icons/angledown/angledown.mjs +31 -0
  425. package/esm2022/icons/angledown/cax-design-system-icons-angledown.mjs +5 -0
  426. package/esm2022/icons/angledown/public_api.mjs +2 -0
  427. package/esm2022/icons/angleleft/angleleft.mjs +31 -0
  428. package/esm2022/icons/angleleft/cax-design-system-icons-angleleft.mjs +5 -0
  429. package/esm2022/icons/angleleft/public_api.mjs +2 -0
  430. package/esm2022/icons/angleright/angleright.mjs +31 -0
  431. package/esm2022/icons/angleright/cax-design-system-icons-angleright.mjs +5 -0
  432. package/esm2022/icons/angleright/public_api.mjs +2 -0
  433. package/esm2022/icons/angleup/angleup.mjs +31 -0
  434. package/esm2022/icons/angleup/cax-design-system-icons-angleup.mjs +5 -0
  435. package/esm2022/icons/angleup/public_api.mjs +2 -0
  436. package/esm2022/icons/arrowdown/arrowdown.mjs +54 -0
  437. package/esm2022/icons/arrowdown/cax-design-system-icons-arrowdown.mjs +5 -0
  438. package/esm2022/icons/arrowdown/public_api.mjs +2 -0
  439. package/esm2022/icons/arrowdownleft/arrowdownleft.mjs +31 -0
  440. package/esm2022/icons/arrowdownleft/cax-design-system-icons-arrowdownleft.mjs +5 -0
  441. package/esm2022/icons/arrowdownleft/public_api.mjs +2 -0
  442. package/esm2022/icons/arrowdownright/arrowdownright.mjs +31 -0
  443. package/esm2022/icons/arrowdownright/cax-design-system-icons-arrowdownright.mjs +5 -0
  444. package/esm2022/icons/arrowdownright/public_api.mjs +2 -0
  445. package/esm2022/icons/arrowleft/arrowleft.mjs +54 -0
  446. package/esm2022/icons/arrowleft/cax-design-system-icons-arrowleft.mjs +5 -0
  447. package/esm2022/icons/arrowleft/public_api.mjs +2 -0
  448. package/esm2022/icons/arrowright/arrowright.mjs +35 -0
  449. package/esm2022/icons/arrowright/cax-design-system-icons-arrowright.mjs +5 -0
  450. package/esm2022/icons/arrowright/public_api.mjs +2 -0
  451. package/esm2022/icons/arrowup/arrowup.mjs +54 -0
  452. package/esm2022/icons/arrowup/cax-design-system-icons-arrowup.mjs +5 -0
  453. package/esm2022/icons/arrowup/public_api.mjs +2 -0
  454. package/esm2022/icons/ban/ban.mjs +50 -0
  455. package/esm2022/icons/ban/cax-design-system-icons-ban.mjs +5 -0
  456. package/esm2022/icons/ban/public_api.mjs +2 -0
  457. package/esm2022/icons/bars/bars.mjs +35 -0
  458. package/esm2022/icons/bars/cax-design-system-icons-bars.mjs +5 -0
  459. package/esm2022/icons/bars/public_api.mjs +2 -0
  460. package/esm2022/icons/blank/blank.mjs +25 -0
  461. package/esm2022/icons/blank/cax-design-system-icons-blank.mjs +5 -0
  462. package/esm2022/icons/blank/public_api.mjs +2 -0
  463. package/esm2022/icons/calendar/calendar.mjs +31 -0
  464. package/esm2022/icons/calendar/cax-design-system-icons-calendar.mjs +5 -0
  465. package/esm2022/icons/calendar/public_api.mjs +2 -0
  466. package/esm2022/icons/caretleft/caretleft.mjs +31 -0
  467. package/esm2022/icons/caretleft/cax-design-system-icons-caretleft.mjs +5 -0
  468. package/esm2022/icons/caretleft/public_api.mjs +2 -0
  469. package/esm2022/icons/caretright/caretright.mjs +31 -0
  470. package/esm2022/icons/caretright/cax-design-system-icons-caretright.mjs +5 -0
  471. package/esm2022/icons/caretright/public_api.mjs +2 -0
  472. package/esm2022/icons/check/cax-design-system-icons-check.mjs +5 -0
  473. package/esm2022/icons/check/check.mjs +31 -0
  474. package/esm2022/icons/check/public_api.mjs +2 -0
  475. package/esm2022/icons/chevrondown/cax-design-system-icons-chevrondown.mjs +5 -0
  476. package/esm2022/icons/chevrondown/chevrondown.mjs +31 -0
  477. package/esm2022/icons/chevrondown/public_api.mjs +2 -0
  478. package/esm2022/icons/chevronleft/cax-design-system-icons-chevronleft.mjs +5 -0
  479. package/esm2022/icons/chevronleft/chevronleft.mjs +31 -0
  480. package/esm2022/icons/chevronleft/public_api.mjs +2 -0
  481. package/esm2022/icons/chevronright/cax-design-system-icons-chevronright.mjs +5 -0
  482. package/esm2022/icons/chevronright/chevronright.mjs +31 -0
  483. package/esm2022/icons/chevronright/public_api.mjs +2 -0
  484. package/esm2022/icons/chevronup/cax-design-system-icons-chevronup.mjs +5 -0
  485. package/esm2022/icons/chevronup/chevronup.mjs +31 -0
  486. package/esm2022/icons/chevronup/public_api.mjs +2 -0
  487. package/esm2022/icons/exclamationtriangle/cax-design-system-icons-exclamationtriangle.mjs +5 -0
  488. package/esm2022/icons/exclamationtriangle/exclamationtriangle.mjs +66 -0
  489. package/esm2022/icons/exclamationtriangle/public_api.mjs +2 -0
  490. package/esm2022/icons/eye/cax-design-system-icons-eye.mjs +5 -0
  491. package/esm2022/icons/eye/eye.mjs +35 -0
  492. package/esm2022/icons/eye/public_api.mjs +2 -0
  493. package/esm2022/icons/eyeslash/cax-design-system-icons-eyeslash.mjs +5 -0
  494. package/esm2022/icons/eyeslash/eyeslash.mjs +54 -0
  495. package/esm2022/icons/eyeslash/public_api.mjs +2 -0
  496. package/esm2022/icons/filter/cax-design-system-icons-filter.mjs +5 -0
  497. package/esm2022/icons/filter/filter.mjs +50 -0
  498. package/esm2022/icons/filter/public_api.mjs +2 -0
  499. package/esm2022/icons/filterslash/cax-design-system-icons-filterslash.mjs +5 -0
  500. package/esm2022/icons/filterslash/filterslash.mjs +54 -0
  501. package/esm2022/icons/filterslash/public_api.mjs +2 -0
  502. package/esm2022/icons/home/cax-design-system-icons-home.mjs +5 -0
  503. package/esm2022/icons/home/home.mjs +54 -0
  504. package/esm2022/icons/home/public_api.mjs +2 -0
  505. package/esm2022/icons/infocircle/cax-design-system-icons-infocircle.mjs +5 -0
  506. package/esm2022/icons/infocircle/infocircle.mjs +54 -0
  507. package/esm2022/icons/infocircle/public_api.mjs +2 -0
  508. package/esm2022/icons/minus/cax-design-system-icons-minus.mjs +5 -0
  509. package/esm2022/icons/minus/minus.mjs +32 -0
  510. package/esm2022/icons/minus/public_api.mjs +2 -0
  511. package/esm2022/icons/pencil/cax-design-system-icons-pencil.mjs +5 -0
  512. package/esm2022/icons/pencil/pencil.mjs +50 -0
  513. package/esm2022/icons/pencil/public_api.mjs +2 -0
  514. package/esm2022/icons/plus/cax-design-system-icons-plus.mjs +5 -0
  515. package/esm2022/icons/plus/plus.mjs +50 -0
  516. package/esm2022/icons/plus/public_api.mjs +2 -0
  517. package/esm2022/icons/refresh/cax-design-system-icons-refresh.mjs +5 -0
  518. package/esm2022/icons/refresh/public_api.mjs +2 -0
  519. package/esm2022/icons/refresh/refresh.mjs +54 -0
  520. package/esm2022/icons/search/cax-design-system-icons-search.mjs +5 -0
  521. package/esm2022/icons/search/public_api.mjs +2 -0
  522. package/esm2022/icons/search/search.mjs +54 -0
  523. package/esm2022/icons/searchminus/cax-design-system-icons-searchminus.mjs +5 -0
  524. package/esm2022/icons/searchminus/public_api.mjs +2 -0
  525. package/esm2022/icons/searchminus/searchminus.mjs +54 -0
  526. package/esm2022/icons/searchplus/cax-design-system-icons-searchplus.mjs +5 -0
  527. package/esm2022/icons/searchplus/public_api.mjs +2 -0
  528. package/esm2022/icons/searchplus/searchplus.mjs +54 -0
  529. package/esm2022/icons/sortalt/cax-design-system-icons-sortalt.mjs +5 -0
  530. package/esm2022/icons/sortalt/public_api.mjs +2 -0
  531. package/esm2022/icons/sortalt/sortalt.mjs +62 -0
  532. package/esm2022/icons/sortamountdown/cax-design-system-icons-sortamountdown.mjs +5 -0
  533. package/esm2022/icons/sortamountdown/public_api.mjs +2 -0
  534. package/esm2022/icons/sortamountdown/sortamountdown.mjs +50 -0
  535. package/esm2022/icons/sortamountupalt/cax-design-system-icons-sortamountupalt.mjs +5 -0
  536. package/esm2022/icons/sortamountupalt/public_api.mjs +2 -0
  537. package/esm2022/icons/sortamountupalt/sortamountupalt.mjs +50 -0
  538. package/esm2022/icons/spinner/cax-design-system-icons-spinner.mjs +5 -0
  539. package/esm2022/icons/spinner/public_api.mjs +2 -0
  540. package/esm2022/icons/spinner/spinner.mjs +50 -0
  541. package/esm2022/icons/star/cax-design-system-icons-star.mjs +5 -0
  542. package/esm2022/icons/star/public_api.mjs +2 -0
  543. package/esm2022/icons/star/star.mjs +50 -0
  544. package/esm2022/icons/starfill/cax-design-system-icons-starfill.mjs +5 -0
  545. package/esm2022/icons/starfill/public_api.mjs +2 -0
  546. package/esm2022/icons/starfill/starfill.mjs +50 -0
  547. package/esm2022/icons/thlarge/cax-design-system-icons-thlarge.mjs +5 -0
  548. package/esm2022/icons/thlarge/public_api.mjs +2 -0
  549. package/esm2022/icons/thlarge/thlarge.mjs +54 -0
  550. package/esm2022/icons/times/cax-design-system-icons-times.mjs +5 -0
  551. package/esm2022/icons/times/public_api.mjs +2 -0
  552. package/esm2022/icons/times/times.mjs +31 -0
  553. package/esm2022/icons/timescircle/cax-design-system-icons-timescircle.mjs +5 -0
  554. package/esm2022/icons/timescircle/public_api.mjs +2 -0
  555. package/esm2022/icons/timescircle/timescircle.mjs +54 -0
  556. package/esm2022/icons/trash/cax-design-system-icons-trash.mjs +5 -0
  557. package/esm2022/icons/trash/public_api.mjs +2 -0
  558. package/esm2022/icons/trash/trash.mjs +54 -0
  559. package/esm2022/icons/undo/cax-design-system-icons-undo.mjs +5 -0
  560. package/esm2022/icons/undo/public_api.mjs +2 -0
  561. package/esm2022/icons/undo/undo.mjs +54 -0
  562. package/esm2022/icons/upload/cax-design-system-icons-upload.mjs +5 -0
  563. package/esm2022/icons/upload/public_api.mjs +2 -0
  564. package/esm2022/icons/upload/upload.mjs +54 -0
  565. package/esm2022/icons/windowmaximize/cax-design-system-icons-windowmaximize.mjs +5 -0
  566. package/esm2022/icons/windowmaximize/public_api.mjs +2 -0
  567. package/esm2022/icons/windowmaximize/windowmaximize.mjs +54 -0
  568. package/esm2022/icons/windowminimize/cax-design-system-icons-windowminimize.mjs +5 -0
  569. package/esm2022/icons/windowminimize/public_api.mjs +2 -0
  570. package/esm2022/icons/windowminimize/windowminimize.mjs +54 -0
  571. package/esm2022/image/cax-design-system-image.mjs +5 -0
  572. package/esm2022/image/image.interface.mjs +2 -0
  573. package/esm2022/image/image.mjs +418 -0
  574. package/esm2022/image/image.module.mjs +17 -0
  575. package/esm2022/image/public_api.mjs +4 -0
  576. package/esm2022/inplace/cax-design-system-inplace.mjs +5 -0
  577. package/esm2022/inplace/inplace.interface.mjs +2 -0
  578. package/esm2022/inplace/inplace.mjs +243 -0
  579. package/esm2022/inplace/public_api.mjs +3 -0
  580. package/esm2022/inputgroup/cax-design-system-inputgroup.mjs +5 -0
  581. package/esm2022/inputgroup/inputgroup.mjs +55 -0
  582. package/esm2022/inputgroup/inputgroup.module.mjs +25 -0
  583. package/esm2022/inputgroup/public_api.mjs +3 -0
  584. package/esm2022/inputgroupaddon/cax-design-system-inputgroupaddon.mjs +5 -0
  585. package/esm2022/inputgroupaddon/inputgroupaddon.mjs +32 -0
  586. package/esm2022/inputgroupaddon/inputgroupaddon.module.mjs +24 -0
  587. package/esm2022/inputgroupaddon/public_api.mjs +3 -0
  588. package/esm2022/inputicon/cax-design-system-inputicon.mjs +5 -0
  589. package/esm2022/inputicon/inputicon.mjs +38 -0
  590. package/esm2022/inputicon/public_api.mjs +2 -0
  591. package/esm2022/inputmask/cax-design-system-inputmask.mjs +5 -0
  592. package/esm2022/inputmask/inputmask.interface.mjs +2 -0
  593. package/esm2022/inputmask/inputmask.mjs +848 -0
  594. package/esm2022/inputmask/inputmask.module.mjs +22 -0
  595. package/esm2022/inputmask/public_api.mjs +4 -0
  596. package/esm2022/inputnumber/cax-design-system-inputnumber.mjs +5 -0
  597. package/esm2022/inputnumber/inputnumber.interface.mjs +2 -0
  598. package/esm2022/inputnumber/inputnumber.mjs +1296 -0
  599. package/esm2022/inputnumber/inputnumber.module.mjs +17 -0
  600. package/esm2022/inputnumber/public_api.mjs +4 -0
  601. package/esm2022/inputotp/cax-design-system-inputotp.mjs +5 -0
  602. package/esm2022/inputotp/inputotp.interface.mjs +2 -0
  603. package/esm2022/inputotp/inputotp.mjs +381 -0
  604. package/esm2022/inputotp/public_api.mjs +3 -0
  605. package/esm2022/inputswitch/cax-design-system-inputswitch.mjs +5 -0
  606. package/esm2022/inputswitch/inputswitch.interface.mjs +2 -0
  607. package/esm2022/inputswitch/inputswitch.mjs +244 -0
  608. package/esm2022/inputswitch/public_api.mjs +3 -0
  609. package/esm2022/inputtext/cax-design-system-inputtext.mjs +5 -0
  610. package/esm2022/inputtext/inputtext.component.mjs +132 -0
  611. package/esm2022/inputtext/inputtext.directive.mjs +76 -0
  612. package/esm2022/inputtext/inputtext.module.mjs +20 -0
  613. package/esm2022/inputtext/public_api.mjs +4 -0
  614. package/esm2022/inputtextarea/cax-design-system-inputtextarea.mjs +5 -0
  615. package/esm2022/inputtextarea/inputtextarea.component.mjs +155 -0
  616. package/esm2022/inputtextarea/inputtextarea.directive.mjs +121 -0
  617. package/esm2022/inputtextarea/inputtextarea.module.mjs +20 -0
  618. package/esm2022/inputtextarea/public_api.mjs +4 -0
  619. package/esm2022/keyfilter/cax-design-system-keyfilter.mjs +5 -0
  620. package/esm2022/keyfilter/keyfilter.interface.mjs +2 -0
  621. package/esm2022/keyfilter/keyfilter.mjs +265 -0
  622. package/esm2022/keyfilter/public_api.mjs +3 -0
  623. package/esm2022/knob/cax-design-system-knob.mjs +5 -0
  624. package/esm2022/knob/knob.mjs +464 -0
  625. package/esm2022/knob/public_api.mjs +2 -0
  626. package/esm2022/listbox/cax-design-system-listbox.mjs +5 -0
  627. package/esm2022/listbox/listbox.interface.mjs +2 -0
  628. package/esm2022/listbox/listbox.mjs +1555 -0
  629. package/esm2022/listbox/public_api.mjs +3 -0
  630. package/esm2022/logo/cax-design-system-logo.mjs +5 -0
  631. package/esm2022/logo/logo.mjs +45 -0
  632. package/esm2022/logo/logo.module.mjs +16 -0
  633. package/esm2022/logo/public_api.mjs +3 -0
  634. package/esm2022/megamenu/cax-design-system-megamenu.mjs +5 -0
  635. package/esm2022/megamenu/megamenu.interface.mjs +2 -0
  636. package/esm2022/megamenu/megamenu.mjs +1190 -0
  637. package/esm2022/megamenu/public_api.mjs +3 -0
  638. package/esm2022/menu/cax-design-system-menu.mjs +5 -0
  639. package/esm2022/menu/menu.mjs +626 -0
  640. package/esm2022/menu/menu.module.mjs +22 -0
  641. package/esm2022/menu/public_api.mjs +3 -0
  642. package/esm2022/menubar/cax-design-system-menubar.mjs +5 -0
  643. package/esm2022/menubar/menubar.interface.mjs +2 -0
  644. package/esm2022/menubar/menubar.mjs +1249 -0
  645. package/esm2022/menubar/public_api.mjs +3 -0
  646. package/esm2022/message/cax-design-system-message.mjs +5 -0
  647. package/esm2022/message/message.mjs +112 -0
  648. package/esm2022/message/public_api.mjs +2 -0
  649. package/esm2022/messages/cax-design-system-messages.mjs +5 -0
  650. package/esm2022/messages/messages.interface.mjs +2 -0
  651. package/esm2022/messages/messages.mjs +283 -0
  652. package/esm2022/messages/messages.module.mjs +17 -0
  653. package/esm2022/messages/public_api.mjs +4 -0
  654. package/esm2022/metergroup/cax-design-system-metergroup.mjs +5 -0
  655. package/esm2022/metergroup/metergroup.interface.mjs +2 -0
  656. package/esm2022/metergroup/metergroup.mjs +280 -0
  657. package/esm2022/metergroup/public_api.mjs +3 -0
  658. package/esm2022/multiselect/cax-design-system-multiselect.mjs +5 -0
  659. package/esm2022/multiselect/multiselect.interface.mjs +2 -0
  660. package/esm2022/multiselect/multiselect.mjs +1875 -0
  661. package/esm2022/multiselect/multiselect.module.mjs +30 -0
  662. package/esm2022/multiselect/public_api.mjs +4 -0
  663. package/esm2022/navigation/cax-design-system-navigation.mjs +5 -0
  664. package/esm2022/navigation/navigation.interface.mjs +2 -0
  665. package/esm2022/navigation/navigation.mjs +399 -0
  666. package/esm2022/navigation/navigation.module.mjs +16 -0
  667. package/esm2022/navigation/public_api.mjs +3 -0
  668. package/esm2022/orderlist/cax-design-system-orderlist.mjs +5 -0
  669. package/esm2022/orderlist/orderlist.interface.mjs +2 -0
  670. package/esm2022/orderlist/orderlist.mjs +993 -0
  671. package/esm2022/orderlist/public_api.mjs +3 -0
  672. package/esm2022/organizationchart/cax-design-system-organizationchart.mjs +5 -0
  673. package/esm2022/organizationchart/organizationchart.interface.mjs +2 -0
  674. package/esm2022/organizationchart/organizationchart.mjs +416 -0
  675. package/esm2022/organizationchart/public_api.mjs +3 -0
  676. package/esm2022/overlay/cax-design-system-overlay.mjs +5 -0
  677. package/esm2022/overlay/overlay.mjs +579 -0
  678. package/esm2022/overlay/overlay.module.mjs +17 -0
  679. package/esm2022/overlay/public_api.mjs +3 -0
  680. package/esm2022/overlaypanel/cax-design-system-overlaypanel.mjs +5 -0
  681. package/esm2022/overlaypanel/overlaypanel.mjs +470 -0
  682. package/esm2022/overlaypanel/overlaypanel.module.mjs +17 -0
  683. package/esm2022/overlaypanel/public_api.mjs +3 -0
  684. package/esm2022/paginator/cax-design-system-paginator.mjs +5 -0
  685. package/esm2022/paginator/paginator.interface.mjs +2 -0
  686. package/esm2022/paginator/paginator.mjs +437 -0
  687. package/esm2022/paginator/paginator.module.mjs +27 -0
  688. package/esm2022/paginator/public_api.mjs +4 -0
  689. package/esm2022/panel/cax-design-system-panel.mjs +5 -0
  690. package/esm2022/panel/panel.interface.mjs +2 -0
  691. package/esm2022/panel/panel.mjs +393 -0
  692. package/esm2022/panel/public_api.mjs +3 -0
  693. package/esm2022/panelmenu/cax-design-system-panelmenu.mjs +5 -0
  694. package/esm2022/panelmenu/panelmenu.interface.mjs +2 -0
  695. package/esm2022/panelmenu/panelmenu.mjs +1276 -0
  696. package/esm2022/panelmenu/public_api.mjs +3 -0
  697. package/esm2022/password/cax-design-system-password.mjs +5 -0
  698. package/esm2022/password/password.mjs +1017 -0
  699. package/esm2022/password/public_api.mjs +2 -0
  700. package/esm2022/picklist/cax-design-system-picklist.mjs +5 -0
  701. package/esm2022/picklist/picklist.interface.mjs +2 -0
  702. package/esm2022/picklist/picklist.mjs +1909 -0
  703. package/esm2022/picklist/public_api.mjs +3 -0
  704. package/esm2022/progressbar/cax-design-system-progressbar.mjs +5 -0
  705. package/esm2022/progressbar/progressbar.mjs +86 -0
  706. package/esm2022/progressbar/progressbar.module.mjs +18 -0
  707. package/esm2022/progressbar/public_api.mjs +3 -0
  708. package/esm2022/progressspinner/cax-design-system-progressspinner.mjs +5 -0
  709. package/esm2022/progressspinner/progressspinner.mjs +112 -0
  710. package/esm2022/progressspinner/progressspinner.module.mjs +18 -0
  711. package/esm2022/progressspinner/public_api.mjs +3 -0
  712. package/esm2022/public_api.mjs +2 -0
  713. package/esm2022/radiobutton/cax-design-system-radiobutton.mjs +5 -0
  714. package/esm2022/radiobutton/public_api.mjs +4 -0
  715. package/esm2022/radiobutton/radiobutton.interface.mjs +2 -0
  716. package/esm2022/radiobutton/radiobutton.mjs +284 -0
  717. package/esm2022/radiobutton/radiobutton.module.mjs +16 -0
  718. package/esm2022/rating/cax-design-system-rating.mjs +5 -0
  719. package/esm2022/rating/public_api.mjs +3 -0
  720. package/esm2022/rating/rating.interface.mjs +2 -0
  721. package/esm2022/rating/rating.mjs +388 -0
  722. package/esm2022/ripple/cax-design-system-ripple.mjs +5 -0
  723. package/esm2022/ripple/public_api.mjs +3 -0
  724. package/esm2022/ripple/ripple.mjs +129 -0
  725. package/esm2022/ripple/ripple.module.mjs +16 -0
  726. package/esm2022/scroller/cax-design-system-scroller.mjs +5 -0
  727. package/esm2022/scroller/public_api.mjs +4 -0
  728. package/esm2022/scroller/scroller.interface.mjs +2 -0
  729. package/esm2022/scroller/scroller.mjs +981 -0
  730. package/esm2022/scroller/scroller.module.mjs +17 -0
  731. package/esm2022/scrollpanel/cax-design-system-scrollpanel.mjs +5 -0
  732. package/esm2022/scrollpanel/public_api.mjs +3 -0
  733. package/esm2022/scrollpanel/scrollpanel.interface.mjs +2 -0
  734. package/esm2022/scrollpanel/scrollpanel.mjs +501 -0
  735. package/esm2022/scrolltop/cax-design-system-scrolltop.mjs +5 -0
  736. package/esm2022/scrolltop/public_api.mjs +3 -0
  737. package/esm2022/scrolltop/scrolltop.interface.mjs +2 -0
  738. package/esm2022/scrolltop/scrolltop.mjs +282 -0
  739. package/esm2022/selectbutton/cax-design-system-selectbutton.mjs +5 -0
  740. package/esm2022/selectbutton/public_api.mjs +4 -0
  741. package/esm2022/selectbutton/selectbutton.interface.mjs +2 -0
  742. package/esm2022/selectbutton/selectbutton.mjs +303 -0
  743. package/esm2022/selectbutton/selectbutton.module.mjs +21 -0
  744. package/esm2022/sidebar/cax-design-system-sidebar.mjs +5 -0
  745. package/esm2022/sidebar/public_api.mjs +4 -0
  746. package/esm2022/sidebar/sidebar.interface.mjs +2 -0
  747. package/esm2022/sidebar/sidebar.mjs +488 -0
  748. package/esm2022/sidebar/sidebar.module.mjs +21 -0
  749. package/esm2022/skeleton/cax-design-system-skeleton.mjs +5 -0
  750. package/esm2022/skeleton/public_api.mjs +3 -0
  751. package/esm2022/skeleton/skeleton.mjs +87 -0
  752. package/esm2022/skeleton/skeleton.module.mjs +18 -0
  753. package/esm2022/slidemenu/cax-design-system-slidemenu.mjs +5 -0
  754. package/esm2022/slidemenu/public_api.mjs +3 -0
  755. package/esm2022/slidemenu/slidemenu.interface.mjs +2 -0
  756. package/esm2022/slidemenu/slidemenu.mjs +1501 -0
  757. package/esm2022/slider/cax-design-system-slider.mjs +5 -0
  758. package/esm2022/slider/public_api.mjs +3 -0
  759. package/esm2022/slider/slider.interface.mjs +2 -0
  760. package/esm2022/slider/slider.mjs +796 -0
  761. package/esm2022/speeddial/cax-design-system-speeddial.mjs +5 -0
  762. package/esm2022/speeddial/public_api.mjs +4 -0
  763. package/esm2022/speeddial/speeddial.interface.mjs +2 -0
  764. package/esm2022/speeddial/speeddial.mjs +611 -0
  765. package/esm2022/speeddial/speeddial.module.mjs +24 -0
  766. package/esm2022/spinner/cax-design-system-spinner.mjs +5 -0
  767. package/esm2022/spinner/public_api.mjs +2 -0
  768. package/esm2022/spinner/spinner.mjs +447 -0
  769. package/esm2022/splitbutton/cax-design-system-splitbutton.mjs +5 -0
  770. package/esm2022/splitbutton/public_api.mjs +4 -0
  771. package/esm2022/splitbutton/splitbutton.interface.mjs +2 -0
  772. package/esm2022/splitbutton/splitbutton.mjs +369 -0
  773. package/esm2022/splitbutton/splitbutton.module.mjs +23 -0
  774. package/esm2022/splitter/cax-design-system-splitter.mjs +5 -0
  775. package/esm2022/splitter/public_api.mjs +4 -0
  776. package/esm2022/splitter/splitter.interface.mjs +2 -0
  777. package/esm2022/splitter/splitter.mjs +490 -0
  778. package/esm2022/splitter/splitter.module.mjs +19 -0
  779. package/esm2022/stepper/cax-design-system-stepper.mjs +5 -0
  780. package/esm2022/stepper/public_api.mjs +3 -0
  781. package/esm2022/stepper/stepper.interface.mjs +2 -0
  782. package/esm2022/stepper/stepper.mjs +677 -0
  783. package/esm2022/steps/cax-design-system-steps.mjs +5 -0
  784. package/esm2022/steps/public_api.mjs +3 -0
  785. package/esm2022/steps/steps.mjs +207 -0
  786. package/esm2022/steps/steps.module.mjs +20 -0
  787. package/esm2022/styleclass/cax-design-system-styleclass.mjs +5 -0
  788. package/esm2022/styleclass/public_api.mjs +2 -0
  789. package/esm2022/styleclass/styleclass.mjs +316 -0
  790. package/esm2022/table/cax-design-system-table.mjs +5 -0
  791. package/esm2022/table/columnfilter.interface.mjs +2 -0
  792. package/esm2022/table/components/cell-editor/cell-editor.mjs +52 -0
  793. package/esm2022/table/components/column-filter/column-filter.mjs +865 -0
  794. package/esm2022/table/components/column-filter-form-element/column-filter-form-element.mjs +107 -0
  795. package/esm2022/table/components/sort-icon/sort-icon.mjs +78 -0
  796. package/esm2022/table/components/table-body/table-body.mjs +152 -0
  797. package/esm2022/table/components/table-checkbox/table-checkbox.mjs +83 -0
  798. package/esm2022/table/components/table-header-checkbox/table-header-checkbox.mjs +92 -0
  799. package/esm2022/table/components/table-radio-button/table-radio-button.mjs +79 -0
  800. package/esm2022/table/directives/cancel-editable-row.directive.mjs +32 -0
  801. package/esm2022/table/directives/cell-highlight.directive.mjs +42 -0
  802. package/esm2022/table/directives/content-menu-row.directive.mjs +70 -0
  803. package/esm2022/table/directives/dynamic-column-width.directive.mjs +34 -0
  804. package/esm2022/table/directives/editable-column.directive.mjs +344 -0
  805. package/esm2022/table/directives/editable-row.directive.mjs +32 -0
  806. package/esm2022/table/directives/frozen-column.directive.mjs +77 -0
  807. package/esm2022/table/directives/init-editable-row.directive.mjs +32 -0
  808. package/esm2022/table/directives/reorderable-column.directive.mjs +115 -0
  809. package/esm2022/table/directives/reorderable-row-handle.directive.mjs +25 -0
  810. package/esm2022/table/directives/reorderable-row.directive.mjs +122 -0
  811. package/esm2022/table/directives/resizable-column.directive.mjs +123 -0
  812. package/esm2022/table/directives/row-group-header.directive.mjs +26 -0
  813. package/esm2022/table/directives/row-toggler.directive.mjs +42 -0
  814. package/esm2022/table/directives/save-editable-row.directive.mjs +32 -0
  815. package/esm2022/table/directives/selectable-row-double-click.directive.mjs +71 -0
  816. package/esm2022/table/directives/selectable-row.directive.mjs +243 -0
  817. package/esm2022/table/directives/sortable-column.directive.mjs +90 -0
  818. package/esm2022/table/public_api.mjs +31 -0
  819. package/esm2022/table/table.interface.mjs +2 -0
  820. package/esm2022/table/table.mjs +2799 -0
  821. package/esm2022/table/table.module.mjs +157 -0
  822. package/esm2022/table/table.service.mjs +42 -0
  823. package/esm2022/tableconfiguration/cax-design-system-tableconfiguration.mjs +5 -0
  824. package/esm2022/tableconfiguration/public_api.mjs +3 -0
  825. package/esm2022/tableconfiguration/tableconfiguration.mjs +68 -0
  826. package/esm2022/tableconfiguration/tableconfiguration.module.mjs +16 -0
  827. package/esm2022/tabmenu/cax-design-system-tabmenu.mjs +5 -0
  828. package/esm2022/tabmenu/public_api.mjs +3 -0
  829. package/esm2022/tabmenu/tabmenu.interface.mjs +2 -0
  830. package/esm2022/tabmenu/tabmenu.mjs +576 -0
  831. package/esm2022/tabview/cax-design-system-tabview.mjs +5 -0
  832. package/esm2022/tabview/public_api.mjs +4 -0
  833. package/esm2022/tabview/tabview.interface.mjs +2 -0
  834. package/esm2022/tabview/tabview.mjs +913 -0
  835. package/esm2022/tabview/tabview.module.mjs +25 -0
  836. package/esm2022/tag/cax-design-system-tag.mjs +5 -0
  837. package/esm2022/tag/public_api.mjs +4 -0
  838. package/esm2022/tag/tag.interface.mjs +2 -0
  839. package/esm2022/tag/tag.mjs +95 -0
  840. package/esm2022/tag/tag.module.mjs +19 -0
  841. package/esm2022/terminal/cax-design-system-terminal.mjs +5 -0
  842. package/esm2022/terminal/public_api.mjs +3 -0
  843. package/esm2022/terminal/terminal.mjs +143 -0
  844. package/esm2022/terminal/terminalservice.mjs +25 -0
  845. package/esm2022/tieredmenu/cax-design-system-tieredmenu.mjs +5 -0
  846. package/esm2022/tieredmenu/public_api.mjs +4 -0
  847. package/esm2022/tieredmenu/tieredmenu.interface.mjs +2 -0
  848. package/esm2022/tieredmenu/tieredmenu.mjs +1289 -0
  849. package/esm2022/tieredmenu/tiredmenu.module.mjs +23 -0
  850. package/esm2022/timeline/cax-design-system-timeline.mjs +5 -0
  851. package/esm2022/timeline/public_api.mjs +4 -0
  852. package/esm2022/timeline/timeline.interface.mjs +2 -0
  853. package/esm2022/timeline/timeline.mjs +83 -0
  854. package/esm2022/timeline/timeline.module.mjs +19 -0
  855. package/esm2022/toast/cax-design-system-toast.mjs +5 -0
  856. package/esm2022/toast/public_api.mjs +4 -0
  857. package/esm2022/toast/toast.interface.mjs +2 -0
  858. package/esm2022/toast/toast.mjs +324 -0
  859. package/esm2022/toast/toast.module.mjs +18 -0
  860. package/esm2022/toast/toastitem.mjs +170 -0
  861. package/esm2022/togglebutton/cax-design-system-togglebutton.mjs +5 -0
  862. package/esm2022/togglebutton/public_api.mjs +3 -0
  863. package/esm2022/togglebutton/togglebutton.interface.mjs +2 -0
  864. package/esm2022/togglebutton/togglebutton.mjs +274 -0
  865. package/esm2022/toggleswitch/cax-design-system-toggleswitch.mjs +5 -0
  866. package/esm2022/toggleswitch/public_api.mjs +3 -0
  867. package/esm2022/toggleswitch/toggleswitch.mjs +37 -0
  868. package/esm2022/toggleswitch/toggleswitch.module.mjs +19 -0
  869. package/esm2022/toolbar/cax-design-system-toolbar.mjs +5 -0
  870. package/esm2022/toolbar/public_api.mjs +3 -0
  871. package/esm2022/toolbar/toolbar.interface.mjs +2 -0
  872. package/esm2022/toolbar/toolbar.mjs +111 -0
  873. package/esm2022/tooltip/cax-design-system-tooltip.mjs +5 -0
  874. package/esm2022/tooltip/public_api.mjs +3 -0
  875. package/esm2022/tooltip/tooltip.mjs +889 -0
  876. package/esm2022/tooltip/tooltip.module.mjs +20 -0
  877. package/esm2022/tree/cax-design-system-tree.mjs +5 -0
  878. package/esm2022/tree/public_api.mjs +4 -0
  879. package/esm2022/tree/tree.interface.mjs +2 -0
  880. package/esm2022/tree/tree.mjs +1544 -0
  881. package/esm2022/tree/tree.module.mjs +31 -0
  882. package/esm2022/treeselect/cax-design-system-treeselect.mjs +5 -0
  883. package/esm2022/treeselect/public_api.mjs +4 -0
  884. package/esm2022/treeselect/treeselect.interface.mjs +2 -0
  885. package/esm2022/treeselect/treeselect.mjs +865 -0
  886. package/esm2022/treeselect/treeselect.module.mjs +26 -0
  887. package/esm2022/treetable/cax-design-system-treetable.mjs +5 -0
  888. package/esm2022/treetable/public_api.mjs +3 -0
  889. package/esm2022/treetable/treetable.interface.mjs +2 -0
  890. package/esm2022/treetable/treetable.mjs +4111 -0
  891. package/esm2022/tristatecheckbox/cax-design-system-tristatecheckbox.mjs +5 -0
  892. package/esm2022/tristatecheckbox/public_api.mjs +4 -0
  893. package/esm2022/tristatecheckbox/tristatecheckbox.interface.mjs +2 -0
  894. package/esm2022/tristatecheckbox/tristatecheckbox.mjs +215 -0
  895. package/esm2022/tristatecheckbox/tristatecheckbox.module.mjs +17 -0
  896. package/esm2022/ts-helpers/cax-design-system-ts-helpers.mjs +5 -0
  897. package/esm2022/ts-helpers/public_api.mjs +2 -0
  898. package/esm2022/ts-helpers/ts-helpers.mjs +2 -0
  899. package/esm2022/upload/cax-design-system-upload.mjs +5 -0
  900. package/esm2022/upload/public_api.mjs +3 -0
  901. package/esm2022/upload/upload.component.mjs +372 -0
  902. package/esm2022/upload/upload.component.module.mjs +21 -0
  903. package/esm2022/utils/cax-design-system-utils.mjs +5 -0
  904. package/esm2022/utils/objectutils.mjs +258 -0
  905. package/esm2022/utils/public_api.mjs +5 -0
  906. package/esm2022/utils/uniquecomponentid.mjs +6 -0
  907. package/esm2022/utils/zindexutils.mjs +35 -0
  908. package/esm2022/virtualscroller/cax-design-system-virtualscroller.mjs +5 -0
  909. package/esm2022/virtualscroller/public_api.mjs +3 -0
  910. package/esm2022/virtualscroller/virtualscroller.interface.mjs +2 -0
  911. package/esm2022/virtualscroller/virtualscroller.mjs +215 -0
  912. package/fesm2022/cax-design-system-accordion.mjs +2 -2
  913. package/fesm2022/cax-design-system-accordion.mjs.map +1 -1
  914. package/fesm2022/cax-design-system-animate.mjs +1 -1
  915. package/fesm2022/cax-design-system-animate.mjs.map +1 -1
  916. package/fesm2022/cax-design-system-animateonscroll.mjs +1 -1
  917. package/fesm2022/cax-design-system-animateonscroll.mjs.map +1 -1
  918. package/fesm2022/cax-design-system-api.mjs +1 -1
  919. package/fesm2022/cax-design-system-api.mjs.map +1 -1
  920. package/fesm2022/cax-design-system-autocomplete.mjs +1 -1
  921. package/fesm2022/cax-design-system-autocomplete.mjs.map +1 -1
  922. package/fesm2022/cax-design-system-autofocus.mjs +1 -1
  923. package/fesm2022/cax-design-system-autofocus.mjs.map +1 -1
  924. package/fesm2022/cax-design-system-avatar.mjs +1 -1
  925. package/fesm2022/cax-design-system-avatar.mjs.map +1 -1
  926. package/fesm2022/cax-design-system-avatargroup.mjs +1 -1
  927. package/fesm2022/cax-design-system-avatargroup.mjs.map +1 -1
  928. package/fesm2022/cax-design-system-badge.mjs +1 -1
  929. package/fesm2022/cax-design-system-badge.mjs.map +1 -1
  930. package/fesm2022/cax-design-system-baseicon.mjs +1 -1
  931. package/fesm2022/cax-design-system-baseicon.mjs.map +1 -1
  932. package/fesm2022/cax-design-system-blockui.mjs +1 -1
  933. package/fesm2022/cax-design-system-blockui.mjs.map +1 -1
  934. package/fesm2022/cax-design-system-breadcrumb.mjs +1 -1
  935. package/fesm2022/cax-design-system-breadcrumb.mjs.map +1 -1
  936. package/fesm2022/cax-design-system-button.mjs +1 -1
  937. package/fesm2022/cax-design-system-button.mjs.map +1 -1
  938. package/fesm2022/cax-design-system-buttongroup.mjs +1 -1
  939. package/fesm2022/cax-design-system-buttongroup.mjs.map +1 -1
  940. package/fesm2022/cax-design-system-calendar.mjs +3 -3
  941. package/fesm2022/cax-design-system-calendar.mjs.map +1 -1
  942. package/fesm2022/cax-design-system-card.mjs +1 -1
  943. package/fesm2022/cax-design-system-card.mjs.map +1 -1
  944. package/fesm2022/cax-design-system-carousel.mjs +1 -1
  945. package/fesm2022/cax-design-system-carousel.mjs.map +1 -1
  946. package/fesm2022/cax-design-system-cascadeselect.mjs +1 -1
  947. package/fesm2022/cax-design-system-cascadeselect.mjs.map +1 -1
  948. package/fesm2022/cax-design-system-chart.mjs +1 -1
  949. package/fesm2022/cax-design-system-chart.mjs.map +1 -1
  950. package/fesm2022/cax-design-system-checkbox.mjs +1 -1
  951. package/fesm2022/cax-design-system-checkbox.mjs.map +1 -1
  952. package/fesm2022/cax-design-system-chip.mjs +1 -1
  953. package/fesm2022/cax-design-system-chip.mjs.map +1 -1
  954. package/fesm2022/cax-design-system-chips.mjs +2 -2
  955. package/fesm2022/cax-design-system-chips.mjs.map +1 -1
  956. package/fesm2022/cax-design-system-colorpicker.mjs +1 -1
  957. package/fesm2022/cax-design-system-colorpicker.mjs.map +1 -1
  958. package/fesm2022/cax-design-system-commentbox.mjs +3 -3
  959. package/fesm2022/cax-design-system-commentbox.mjs.map +1 -1
  960. package/fesm2022/cax-design-system-confirmdialog.mjs +1 -1
  961. package/fesm2022/cax-design-system-confirmdialog.mjs.map +1 -1
  962. package/fesm2022/cax-design-system-confirmpopup.mjs +2 -2
  963. package/fesm2022/cax-design-system-confirmpopup.mjs.map +1 -1
  964. package/fesm2022/cax-design-system-contextmenu.mjs +1 -1
  965. package/fesm2022/cax-design-system-contextmenu.mjs.map +1 -1
  966. package/fesm2022/cax-design-system-dataview.mjs +1 -1
  967. package/fesm2022/cax-design-system-dataview.mjs.map +1 -1
  968. package/fesm2022/cax-design-system-defer.mjs +1 -1
  969. package/fesm2022/cax-design-system-defer.mjs.map +1 -1
  970. package/fesm2022/cax-design-system-dialog.mjs +1 -1
  971. package/fesm2022/cax-design-system-dialog.mjs.map +1 -1
  972. package/fesm2022/cax-design-system-divider.mjs +1 -1
  973. package/fesm2022/cax-design-system-divider.mjs.map +1 -1
  974. package/fesm2022/cax-design-system-dock.mjs +1 -1
  975. package/fesm2022/cax-design-system-dock.mjs.map +1 -1
  976. package/fesm2022/cax-design-system-dom.mjs.map +1 -1
  977. package/fesm2022/cax-design-system-dragdrop.mjs +1 -1
  978. package/fesm2022/cax-design-system-dragdrop.mjs.map +1 -1
  979. package/fesm2022/cax-design-system-dropdown.mjs +2 -2
  980. package/fesm2022/cax-design-system-dropdown.mjs.map +1 -1
  981. package/fesm2022/cax-design-system-dynamicdialog.mjs +1 -1
  982. package/fesm2022/cax-design-system-dynamicdialog.mjs.map +1 -1
  983. package/fesm2022/cax-design-system-editor.mjs +1 -1
  984. package/fesm2022/cax-design-system-editor.mjs.map +1 -1
  985. package/fesm2022/cax-design-system-fieldset.mjs +2 -2
  986. package/fesm2022/cax-design-system-fieldset.mjs.map +1 -1
  987. package/fesm2022/cax-design-system-fileupload.mjs +1 -1
  988. package/fesm2022/cax-design-system-fileupload.mjs.map +1 -1
  989. package/fesm2022/cax-design-system-floatlabel.mjs +1 -1
  990. package/fesm2022/cax-design-system-floatlabel.mjs.map +1 -1
  991. package/fesm2022/cax-design-system-focustrap.mjs +1 -1
  992. package/fesm2022/cax-design-system-focustrap.mjs.map +1 -1
  993. package/fesm2022/cax-design-system-galleria.mjs +1 -1
  994. package/fesm2022/cax-design-system-galleria.mjs.map +1 -1
  995. package/fesm2022/cax-design-system-iconfield.mjs +1 -1
  996. package/fesm2022/cax-design-system-iconfield.mjs.map +1 -1
  997. package/fesm2022/cax-design-system-icons-angledoubledown.mjs.map +1 -1
  998. package/fesm2022/cax-design-system-icons-angledoubleleft.mjs.map +1 -1
  999. package/fesm2022/cax-design-system-icons-angledoubleright.mjs.map +1 -1
  1000. package/fesm2022/cax-design-system-icons-angledoubleup.mjs.map +1 -1
  1001. package/fesm2022/cax-design-system-icons-angledown.mjs.map +1 -1
  1002. package/fesm2022/cax-design-system-icons-angleleft.mjs.map +1 -1
  1003. package/fesm2022/cax-design-system-icons-angleright.mjs.map +1 -1
  1004. package/fesm2022/cax-design-system-icons-angleup.mjs.map +1 -1
  1005. package/fesm2022/cax-design-system-icons-arrowdown.mjs.map +1 -1
  1006. package/fesm2022/cax-design-system-icons-arrowdownleft.mjs.map +1 -1
  1007. package/fesm2022/cax-design-system-icons-arrowdownright.mjs.map +1 -1
  1008. package/fesm2022/cax-design-system-icons-arrowleft.mjs.map +1 -1
  1009. package/fesm2022/cax-design-system-icons-arrowright.mjs.map +1 -1
  1010. package/fesm2022/cax-design-system-icons-arrowup.mjs.map +1 -1
  1011. package/fesm2022/cax-design-system-icons-ban.mjs.map +1 -1
  1012. package/fesm2022/cax-design-system-icons-bars.mjs.map +1 -1
  1013. package/fesm2022/cax-design-system-icons-blank.mjs.map +1 -1
  1014. package/fesm2022/cax-design-system-icons-calendar.mjs.map +1 -1
  1015. package/fesm2022/cax-design-system-icons-caretleft.mjs.map +1 -1
  1016. package/fesm2022/cax-design-system-icons-caretright.mjs.map +1 -1
  1017. package/fesm2022/cax-design-system-icons-check.mjs.map +1 -1
  1018. package/fesm2022/cax-design-system-icons-chevrondown.mjs.map +1 -1
  1019. package/fesm2022/cax-design-system-icons-chevronleft.mjs.map +1 -1
  1020. package/fesm2022/cax-design-system-icons-chevronright.mjs.map +1 -1
  1021. package/fesm2022/cax-design-system-icons-chevronup.mjs.map +1 -1
  1022. package/fesm2022/cax-design-system-icons-exclamationtriangle.mjs.map +1 -1
  1023. package/fesm2022/cax-design-system-icons-eye.mjs.map +1 -1
  1024. package/fesm2022/cax-design-system-icons-eyeslash.mjs.map +1 -1
  1025. package/fesm2022/cax-design-system-icons-filter.mjs.map +1 -1
  1026. package/fesm2022/cax-design-system-icons-filterslash.mjs.map +1 -1
  1027. package/fesm2022/cax-design-system-icons-home.mjs.map +1 -1
  1028. package/fesm2022/cax-design-system-icons-infocircle.mjs.map +1 -1
  1029. package/fesm2022/cax-design-system-icons-minus.mjs.map +1 -1
  1030. package/fesm2022/cax-design-system-icons-pencil.mjs.map +1 -1
  1031. package/fesm2022/cax-design-system-icons-plus.mjs.map +1 -1
  1032. package/fesm2022/cax-design-system-icons-refresh.mjs.map +1 -1
  1033. package/fesm2022/cax-design-system-icons-search.mjs.map +1 -1
  1034. package/fesm2022/cax-design-system-icons-searchminus.mjs.map +1 -1
  1035. package/fesm2022/cax-design-system-icons-searchplus.mjs.map +1 -1
  1036. package/fesm2022/cax-design-system-icons-sortalt.mjs.map +1 -1
  1037. package/fesm2022/cax-design-system-icons-sortamountdown.mjs.map +1 -1
  1038. package/fesm2022/cax-design-system-icons-sortamountupalt.mjs.map +1 -1
  1039. package/fesm2022/cax-design-system-icons-spinner.mjs.map +1 -1
  1040. package/fesm2022/cax-design-system-icons-star.mjs.map +1 -1
  1041. package/fesm2022/cax-design-system-icons-starfill.mjs.map +1 -1
  1042. package/fesm2022/cax-design-system-icons-thlarge.mjs.map +1 -1
  1043. package/fesm2022/cax-design-system-icons-times.mjs.map +1 -1
  1044. package/fesm2022/cax-design-system-icons-timescircle.mjs.map +1 -1
  1045. package/fesm2022/cax-design-system-icons-trash.mjs.map +1 -1
  1046. package/fesm2022/cax-design-system-icons-undo.mjs.map +1 -1
  1047. package/fesm2022/cax-design-system-icons-upload.mjs.map +1 -1
  1048. package/fesm2022/cax-design-system-icons-windowmaximize.mjs.map +1 -1
  1049. package/fesm2022/cax-design-system-icons-windowminimize.mjs.map +1 -1
  1050. package/fesm2022/cax-design-system-image.mjs +2 -2
  1051. package/fesm2022/cax-design-system-image.mjs.map +1 -1
  1052. package/fesm2022/cax-design-system-inplace.mjs +1 -1
  1053. package/fesm2022/cax-design-system-inplace.mjs.map +1 -1
  1054. package/fesm2022/cax-design-system-inputgroup.mjs +1 -1
  1055. package/fesm2022/cax-design-system-inputgroup.mjs.map +1 -1
  1056. package/fesm2022/cax-design-system-inputgroupaddon.mjs +1 -1
  1057. package/fesm2022/cax-design-system-inputgroupaddon.mjs.map +1 -1
  1058. package/fesm2022/cax-design-system-inputicon.mjs +1 -1
  1059. package/fesm2022/cax-design-system-inputicon.mjs.map +1 -1
  1060. package/fesm2022/cax-design-system-inputmask.mjs +1 -1
  1061. package/fesm2022/cax-design-system-inputmask.mjs.map +1 -1
  1062. package/fesm2022/cax-design-system-inputnumber.mjs +1 -1
  1063. package/fesm2022/cax-design-system-inputnumber.mjs.map +1 -1
  1064. package/fesm2022/cax-design-system-inputotp.mjs +1 -1
  1065. package/fesm2022/cax-design-system-inputotp.mjs.map +1 -1
  1066. package/fesm2022/cax-design-system-inputswitch.mjs +1 -1
  1067. package/fesm2022/cax-design-system-inputswitch.mjs.map +1 -1
  1068. package/fesm2022/cax-design-system-inputtext.mjs +1 -1
  1069. package/fesm2022/cax-design-system-inputtext.mjs.map +1 -1
  1070. package/fesm2022/cax-design-system-inputtextarea.mjs +1 -1
  1071. package/fesm2022/cax-design-system-inputtextarea.mjs.map +1 -1
  1072. package/fesm2022/cax-design-system-keyfilter.mjs +1 -1
  1073. package/fesm2022/cax-design-system-keyfilter.mjs.map +1 -1
  1074. package/fesm2022/cax-design-system-knob.mjs +1 -1
  1075. package/fesm2022/cax-design-system-knob.mjs.map +1 -1
  1076. package/fesm2022/cax-design-system-listbox.mjs +1 -1
  1077. package/fesm2022/cax-design-system-listbox.mjs.map +1 -1
  1078. package/fesm2022/cax-design-system-logo.mjs +1 -1
  1079. package/fesm2022/cax-design-system-logo.mjs.map +1 -1
  1080. package/fesm2022/cax-design-system-megamenu.mjs +1 -1
  1081. package/fesm2022/cax-design-system-megamenu.mjs.map +1 -1
  1082. package/fesm2022/cax-design-system-menu.mjs +1 -1
  1083. package/fesm2022/cax-design-system-menu.mjs.map +1 -1
  1084. package/fesm2022/cax-design-system-menubar.mjs +1 -1
  1085. package/fesm2022/cax-design-system-menubar.mjs.map +1 -1
  1086. package/fesm2022/cax-design-system-message.mjs +1 -1
  1087. package/fesm2022/cax-design-system-message.mjs.map +1 -1
  1088. package/fesm2022/cax-design-system-messages.mjs +2 -2
  1089. package/fesm2022/cax-design-system-messages.mjs.map +1 -1
  1090. package/fesm2022/cax-design-system-metergroup.mjs +1 -1
  1091. package/fesm2022/cax-design-system-metergroup.mjs.map +1 -1
  1092. package/fesm2022/cax-design-system-multiselect.mjs +1 -1
  1093. package/fesm2022/cax-design-system-multiselect.mjs.map +1 -1
  1094. package/fesm2022/cax-design-system-navigation.mjs +1 -1
  1095. package/fesm2022/cax-design-system-navigation.mjs.map +1 -1
  1096. package/fesm2022/cax-design-system-orderlist.mjs +1 -1
  1097. package/fesm2022/cax-design-system-orderlist.mjs.map +1 -1
  1098. package/fesm2022/cax-design-system-organizationchart.mjs +2 -2
  1099. package/fesm2022/cax-design-system-organizationchart.mjs.map +1 -1
  1100. package/fesm2022/cax-design-system-overlay.mjs +2 -2
  1101. package/fesm2022/cax-design-system-overlay.mjs.map +1 -1
  1102. package/fesm2022/cax-design-system-overlaypanel.mjs +3 -3
  1103. package/fesm2022/cax-design-system-overlaypanel.mjs.map +1 -1
  1104. package/fesm2022/cax-design-system-paginator.mjs +1 -1
  1105. package/fesm2022/cax-design-system-paginator.mjs.map +1 -1
  1106. package/fesm2022/cax-design-system-panel.mjs +2 -2
  1107. package/fesm2022/cax-design-system-panel.mjs.map +1 -1
  1108. package/fesm2022/cax-design-system-panelmenu.mjs +2 -2
  1109. package/fesm2022/cax-design-system-panelmenu.mjs.map +1 -1
  1110. package/fesm2022/cax-design-system-password.mjs +1 -1
  1111. package/fesm2022/cax-design-system-password.mjs.map +1 -1
  1112. package/fesm2022/cax-design-system-picklist.mjs +1 -1
  1113. package/fesm2022/cax-design-system-picklist.mjs.map +1 -1
  1114. package/fesm2022/cax-design-system-progressbar.mjs +1 -1
  1115. package/fesm2022/cax-design-system-progressbar.mjs.map +1 -1
  1116. package/fesm2022/cax-design-system-progressspinner.mjs +1 -1
  1117. package/fesm2022/cax-design-system-progressspinner.mjs.map +1 -1
  1118. package/fesm2022/cax-design-system-radiobutton.mjs +1 -1
  1119. package/fesm2022/cax-design-system-radiobutton.mjs.map +1 -1
  1120. package/fesm2022/cax-design-system-rating.mjs +1 -1
  1121. package/fesm2022/cax-design-system-rating.mjs.map +1 -1
  1122. package/fesm2022/cax-design-system-ripple.mjs +1 -1
  1123. package/fesm2022/cax-design-system-ripple.mjs.map +1 -1
  1124. package/fesm2022/cax-design-system-scroller.mjs +2 -2
  1125. package/fesm2022/cax-design-system-scroller.mjs.map +1 -1
  1126. package/fesm2022/cax-design-system-scrollpanel.mjs +1 -1
  1127. package/fesm2022/cax-design-system-scrollpanel.mjs.map +1 -1
  1128. package/fesm2022/cax-design-system-scrolltop.mjs +2 -2
  1129. package/fesm2022/cax-design-system-scrolltop.mjs.map +1 -1
  1130. package/fesm2022/cax-design-system-selectbutton.mjs +1 -1
  1131. package/fesm2022/cax-design-system-selectbutton.mjs.map +1 -1
  1132. package/fesm2022/cax-design-system-sidebar.mjs +4 -4
  1133. package/fesm2022/cax-design-system-sidebar.mjs.map +1 -1
  1134. package/fesm2022/cax-design-system-skeleton.mjs +1 -1
  1135. package/fesm2022/cax-design-system-skeleton.mjs.map +1 -1
  1136. package/fesm2022/cax-design-system-slidemenu.mjs +1 -1
  1137. package/fesm2022/cax-design-system-slidemenu.mjs.map +1 -1
  1138. package/fesm2022/cax-design-system-slider.mjs +1 -1
  1139. package/fesm2022/cax-design-system-slider.mjs.map +1 -1
  1140. package/fesm2022/cax-design-system-speeddial.mjs +1 -1
  1141. package/fesm2022/cax-design-system-speeddial.mjs.map +1 -1
  1142. package/fesm2022/cax-design-system-spinner.mjs +1 -1
  1143. package/fesm2022/cax-design-system-spinner.mjs.map +1 -1
  1144. package/fesm2022/cax-design-system-splitbutton.mjs +1 -1
  1145. package/fesm2022/cax-design-system-splitbutton.mjs.map +1 -1
  1146. package/fesm2022/cax-design-system-splitter.mjs +1 -1
  1147. package/fesm2022/cax-design-system-splitter.mjs.map +1 -1
  1148. package/fesm2022/cax-design-system-stepper.mjs +2 -2
  1149. package/fesm2022/cax-design-system-stepper.mjs.map +1 -1
  1150. package/fesm2022/cax-design-system-steps.mjs +1 -1
  1151. package/fesm2022/cax-design-system-steps.mjs.map +1 -1
  1152. package/fesm2022/cax-design-system-styleclass.mjs +1 -1
  1153. package/fesm2022/cax-design-system-styleclass.mjs.map +1 -1
  1154. package/fesm2022/cax-design-system-table.mjs +1 -1
  1155. package/fesm2022/cax-design-system-table.mjs.map +1 -1
  1156. package/fesm2022/cax-design-system-tableconfiguration.mjs +1 -1
  1157. package/fesm2022/cax-design-system-tableconfiguration.mjs.map +1 -1
  1158. package/fesm2022/cax-design-system-tabmenu.mjs +1 -1
  1159. package/fesm2022/cax-design-system-tabmenu.mjs.map +1 -1
  1160. package/fesm2022/cax-design-system-tabview.mjs +1 -1
  1161. package/fesm2022/cax-design-system-tabview.mjs.map +1 -1
  1162. package/fesm2022/cax-design-system-tag.mjs +1 -1
  1163. package/fesm2022/cax-design-system-tag.mjs.map +1 -1
  1164. package/fesm2022/cax-design-system-terminal.mjs +1 -1
  1165. package/fesm2022/cax-design-system-terminal.mjs.map +1 -1
  1166. package/fesm2022/cax-design-system-tieredmenu.mjs +1 -1
  1167. package/fesm2022/cax-design-system-tieredmenu.mjs.map +1 -1
  1168. package/fesm2022/cax-design-system-timeline.mjs +1 -1
  1169. package/fesm2022/cax-design-system-timeline.mjs.map +1 -1
  1170. package/fesm2022/cax-design-system-toast.mjs +2 -2
  1171. package/fesm2022/cax-design-system-toast.mjs.map +1 -1
  1172. package/fesm2022/cax-design-system-togglebutton.mjs +1 -1
  1173. package/fesm2022/cax-design-system-togglebutton.mjs.map +1 -1
  1174. package/fesm2022/cax-design-system-toggleswitch.mjs +3 -3
  1175. package/fesm2022/cax-design-system-toggleswitch.mjs.map +1 -1
  1176. package/fesm2022/cax-design-system-toolbar.mjs +1 -1
  1177. package/fesm2022/cax-design-system-toolbar.mjs.map +1 -1
  1178. package/fesm2022/cax-design-system-tooltip.mjs +1 -1
  1179. package/fesm2022/cax-design-system-tooltip.mjs.map +1 -1
  1180. package/fesm2022/cax-design-system-tree.mjs +1 -1
  1181. package/fesm2022/cax-design-system-tree.mjs.map +1 -1
  1182. package/fesm2022/cax-design-system-treeselect.mjs +1 -1
  1183. package/fesm2022/cax-design-system-treeselect.mjs.map +1 -1
  1184. package/fesm2022/cax-design-system-treetable.mjs +1 -1
  1185. package/fesm2022/cax-design-system-treetable.mjs.map +1 -1
  1186. package/fesm2022/cax-design-system-tristatecheckbox.mjs +2 -2
  1187. package/fesm2022/cax-design-system-tristatecheckbox.mjs.map +1 -1
  1188. package/fesm2022/cax-design-system-upload.mjs +12 -7
  1189. package/fesm2022/cax-design-system-upload.mjs.map +1 -1
  1190. package/fesm2022/cax-design-system-utils.mjs.map +1 -1
  1191. package/fesm2022/cax-design-system-virtualscroller.mjs +1 -1
  1192. package/fesm2022/cax-design-system-virtualscroller.mjs.map +1 -1
  1193. package/fieldset/fieldset.d.ts +93 -0
  1194. package/fieldset/fieldset.interface.d.ts +46 -0
  1195. package/fieldset/index.d.ts +3 -140
  1196. package/fieldset/public_api.d.ts +2 -0
  1197. package/fileupload/fileupload.d.ts +380 -0
  1198. package/fileupload/fileupload.interface.d.ts +226 -0
  1199. package/fileupload/index.d.ts +3 -606
  1200. package/fileupload/public_api.d.ts +2 -0
  1201. package/floatlabel/floatlabel.d.ts +9 -0
  1202. package/floatlabel/floatlabel.module.d.ts +10 -0
  1203. package/floatlabel/index.d.ts +3 -19
  1204. package/floatlabel/public_api.d.ts +2 -0
  1205. package/focustrap/focustrap.d.ts +34 -0
  1206. package/focustrap/index.d.ts +3 -35
  1207. package/focustrap/public_api.d.ts +1 -0
  1208. package/galleria/galleria.d.ts +404 -0
  1209. package/galleria/galleria.interface.d.ts +97 -0
  1210. package/galleria/index.d.ts +3 -502
  1211. package/galleria/public_api.d.ts +2 -0
  1212. package/iconfield/iconfield.d.ts +25 -0
  1213. package/iconfield/index.d.ts +3 -26
  1214. package/iconfield/public_api.d.ts +1 -0
  1215. package/icons/angledoubledown/angledoubledown.d.ts +6 -0
  1216. package/icons/angledoubledown/index.d.ts +5 -9
  1217. package/icons/angledoubledown/public_api.d.ts +1 -0
  1218. package/icons/angledoubleleft/angledoubleleft.d.ts +6 -0
  1219. package/icons/angledoubleleft/index.d.ts +5 -9
  1220. package/icons/angledoubleleft/public_api.d.ts +1 -0
  1221. package/icons/angledoubleright/angledoubleright.d.ts +6 -0
  1222. package/icons/angledoubleright/index.d.ts +5 -9
  1223. package/icons/angledoubleright/public_api.d.ts +1 -0
  1224. package/icons/angledoubleup/angledoubleup.d.ts +6 -0
  1225. package/icons/angledoubleup/index.d.ts +5 -9
  1226. package/icons/angledoubleup/public_api.d.ts +1 -0
  1227. package/icons/angledown/angledown.d.ts +6 -0
  1228. package/icons/angledown/index.d.ts +5 -9
  1229. package/icons/angledown/public_api.d.ts +1 -0
  1230. package/icons/angleleft/angleleft.d.ts +6 -0
  1231. package/icons/angleleft/index.d.ts +5 -9
  1232. package/icons/angleleft/public_api.d.ts +1 -0
  1233. package/icons/angleright/angleright.d.ts +6 -0
  1234. package/icons/angleright/index.d.ts +5 -9
  1235. package/icons/angleright/public_api.d.ts +1 -0
  1236. package/icons/angleup/angleup.d.ts +6 -0
  1237. package/icons/angleup/index.d.ts +5 -9
  1238. package/icons/angleup/public_api.d.ts +1 -0
  1239. package/icons/arrowdown/arrowdown.d.ts +9 -0
  1240. package/icons/arrowdown/index.d.ts +5 -12
  1241. package/icons/arrowdown/public_api.d.ts +1 -0
  1242. package/icons/arrowdownleft/arrowdownleft.d.ts +6 -0
  1243. package/icons/arrowdownleft/index.d.ts +5 -9
  1244. package/icons/arrowdownleft/public_api.d.ts +1 -0
  1245. package/icons/arrowdownright/arrowdownright.d.ts +6 -0
  1246. package/icons/arrowdownright/index.d.ts +5 -9
  1247. package/icons/arrowdownright/public_api.d.ts +1 -0
  1248. package/icons/arrowleft/arrowleft.d.ts +8 -0
  1249. package/icons/arrowleft/index.d.ts +5 -11
  1250. package/icons/arrowleft/public_api.d.ts +1 -0
  1251. package/icons/arrowright/arrowright.d.ts +6 -0
  1252. package/icons/arrowright/index.d.ts +5 -9
  1253. package/icons/arrowright/public_api.d.ts +1 -0
  1254. package/icons/arrowup/arrowup.d.ts +8 -0
  1255. package/icons/arrowup/index.d.ts +5 -11
  1256. package/icons/arrowup/public_api.d.ts +1 -0
  1257. package/icons/ban/ban.d.ts +8 -0
  1258. package/icons/ban/index.d.ts +5 -11
  1259. package/icons/ban/public_api.d.ts +1 -0
  1260. package/icons/bars/bars.d.ts +6 -0
  1261. package/icons/bars/index.d.ts +5 -9
  1262. package/icons/bars/public_api.d.ts +1 -0
  1263. package/icons/blank/blank.d.ts +6 -0
  1264. package/icons/blank/index.d.ts +5 -9
  1265. package/icons/blank/public_api.d.ts +1 -0
  1266. package/icons/calendar/calendar.d.ts +6 -0
  1267. package/icons/calendar/index.d.ts +5 -9
  1268. package/icons/calendar/public_api.d.ts +1 -0
  1269. package/icons/caretleft/caretleft.d.ts +6 -0
  1270. package/icons/caretleft/index.d.ts +5 -9
  1271. package/icons/caretleft/public_api.d.ts +1 -0
  1272. package/icons/caretright/caretright.d.ts +6 -0
  1273. package/icons/caretright/index.d.ts +5 -9
  1274. package/icons/caretright/public_api.d.ts +1 -0
  1275. package/icons/check/check.d.ts +6 -0
  1276. package/icons/check/index.d.ts +5 -9
  1277. package/icons/check/public_api.d.ts +1 -0
  1278. package/icons/chevrondown/chevrondown.d.ts +6 -0
  1279. package/icons/chevrondown/index.d.ts +5 -9
  1280. package/icons/chevrondown/public_api.d.ts +1 -0
  1281. package/icons/chevronleft/chevronleft.d.ts +6 -0
  1282. package/icons/chevronleft/index.d.ts +5 -9
  1283. package/icons/chevronleft/public_api.d.ts +1 -0
  1284. package/icons/chevronright/chevronright.d.ts +6 -0
  1285. package/icons/chevronright/index.d.ts +5 -9
  1286. package/icons/chevronright/public_api.d.ts +1 -0
  1287. package/icons/chevronup/chevronup.d.ts +6 -0
  1288. package/icons/chevronup/index.d.ts +5 -9
  1289. package/icons/chevronup/public_api.d.ts +1 -0
  1290. package/icons/exclamationtriangle/exclamationtriangle.d.ts +9 -0
  1291. package/icons/exclamationtriangle/index.d.ts +5 -12
  1292. package/icons/exclamationtriangle/public_api.d.ts +1 -0
  1293. package/icons/eye/eye.d.ts +6 -0
  1294. package/icons/eye/index.d.ts +5 -9
  1295. package/icons/eye/public_api.d.ts +1 -0
  1296. package/icons/eyeslash/eyeslash.d.ts +8 -0
  1297. package/icons/eyeslash/index.d.ts +5 -11
  1298. package/icons/eyeslash/public_api.d.ts +1 -0
  1299. package/icons/filter/filter.d.ts +8 -0
  1300. package/icons/filter/index.d.ts +5 -11
  1301. package/icons/filter/public_api.d.ts +1 -0
  1302. package/icons/filterslash/filterslash.d.ts +8 -0
  1303. package/icons/filterslash/index.d.ts +5 -11
  1304. package/icons/filterslash/public_api.d.ts +1 -0
  1305. package/icons/home/home.d.ts +8 -0
  1306. package/icons/home/index.d.ts +5 -11
  1307. package/icons/home/public_api.d.ts +1 -0
  1308. package/icons/infocircle/index.d.ts +5 -11
  1309. package/icons/infocircle/infocircle.d.ts +8 -0
  1310. package/icons/infocircle/public_api.d.ts +1 -0
  1311. package/icons/minus/index.d.ts +5 -9
  1312. package/icons/minus/minus.d.ts +6 -0
  1313. package/icons/minus/public_api.d.ts +1 -0
  1314. package/icons/pencil/index.d.ts +5 -11
  1315. package/icons/pencil/pencil.d.ts +8 -0
  1316. package/icons/pencil/public_api.d.ts +1 -0
  1317. package/icons/plus/index.d.ts +5 -11
  1318. package/icons/plus/plus.d.ts +8 -0
  1319. package/icons/plus/public_api.d.ts +1 -0
  1320. package/icons/refresh/index.d.ts +5 -11
  1321. package/icons/refresh/public_api.d.ts +1 -0
  1322. package/icons/refresh/refresh.d.ts +8 -0
  1323. package/icons/search/index.d.ts +5 -11
  1324. package/icons/search/public_api.d.ts +1 -0
  1325. package/icons/search/search.d.ts +8 -0
  1326. package/icons/searchminus/index.d.ts +5 -11
  1327. package/icons/searchminus/public_api.d.ts +1 -0
  1328. package/icons/searchminus/searchminus.d.ts +8 -0
  1329. package/icons/searchplus/index.d.ts +5 -11
  1330. package/icons/searchplus/public_api.d.ts +1 -0
  1331. package/icons/searchplus/searchplus.d.ts +8 -0
  1332. package/icons/sortalt/index.d.ts +5 -11
  1333. package/icons/sortalt/public_api.d.ts +1 -0
  1334. package/icons/sortalt/sortalt.d.ts +8 -0
  1335. package/icons/sortamountdown/index.d.ts +5 -11
  1336. package/icons/sortamountdown/public_api.d.ts +1 -0
  1337. package/icons/sortamountdown/sortamountdown.d.ts +8 -0
  1338. package/icons/sortamountupalt/index.d.ts +5 -11
  1339. package/icons/sortamountupalt/public_api.d.ts +1 -0
  1340. package/icons/sortamountupalt/sortamountupalt.d.ts +8 -0
  1341. package/icons/spinner/index.d.ts +5 -11
  1342. package/icons/spinner/public_api.d.ts +1 -0
  1343. package/icons/spinner/spinner.d.ts +8 -0
  1344. package/icons/star/index.d.ts +5 -11
  1345. package/icons/star/public_api.d.ts +1 -0
  1346. package/icons/star/star.d.ts +8 -0
  1347. package/icons/starfill/index.d.ts +5 -11
  1348. package/icons/starfill/public_api.d.ts +1 -0
  1349. package/icons/starfill/starfill.d.ts +8 -0
  1350. package/icons/thlarge/index.d.ts +5 -11
  1351. package/icons/thlarge/public_api.d.ts +1 -0
  1352. package/icons/thlarge/thlarge.d.ts +8 -0
  1353. package/icons/times/index.d.ts +5 -9
  1354. package/icons/times/public_api.d.ts +1 -0
  1355. package/icons/times/times.d.ts +6 -0
  1356. package/icons/timescircle/index.d.ts +5 -11
  1357. package/icons/timescircle/public_api.d.ts +1 -0
  1358. package/icons/timescircle/timescircle.d.ts +8 -0
  1359. package/icons/trash/index.d.ts +5 -11
  1360. package/icons/trash/public_api.d.ts +1 -0
  1361. package/icons/trash/trash.d.ts +8 -0
  1362. package/icons/undo/index.d.ts +5 -11
  1363. package/icons/undo/public_api.d.ts +1 -0
  1364. package/icons/undo/undo.d.ts +8 -0
  1365. package/icons/upload/index.d.ts +5 -11
  1366. package/icons/upload/public_api.d.ts +1 -0
  1367. package/icons/upload/upload.d.ts +8 -0
  1368. package/icons/windowmaximize/index.d.ts +5 -11
  1369. package/icons/windowmaximize/public_api.d.ts +1 -0
  1370. package/icons/windowmaximize/windowmaximize.d.ts +8 -0
  1371. package/icons/windowminimize/index.d.ts +5 -11
  1372. package/icons/windowminimize/public_api.d.ts +1 -0
  1373. package/icons/windowminimize/windowminimize.d.ts +8 -0
  1374. package/image/image.d.ts +188 -0
  1375. package/image/image.interface.d.ts +31 -0
  1376. package/image/image.module.d.ts +8 -0
  1377. package/image/index.d.ts +3 -228
  1378. package/image/public_api.d.ts +3 -0
  1379. package/index.d.ts +5 -2
  1380. package/inplace/index.d.ts +3 -130
  1381. package/inplace/inplace.d.ts +109 -0
  1382. package/inplace/inplace.interface.d.ts +19 -0
  1383. package/inplace/public_api.d.ts +2 -0
  1384. package/inputgroup/index.d.ts +3 -48
  1385. package/inputgroup/inputgroup.d.ts +33 -0
  1386. package/inputgroup/inputgroup.module.d.ts +15 -0
  1387. package/inputgroup/public_api.d.ts +2 -0
  1388. package/inputgroupaddon/index.d.ts +3 -35
  1389. package/inputgroupaddon/inputgroupaddon.d.ts +21 -0
  1390. package/inputgroupaddon/inputgroupaddon.module.d.ts +14 -0
  1391. package/inputgroupaddon/public_api.d.ts +2 -0
  1392. package/inputicon/index.d.ts +3 -22
  1393. package/inputicon/inputicon.d.ts +21 -0
  1394. package/inputicon/public_api.d.ts +1 -0
  1395. package/inputmask/index.d.ts +3 -304
  1396. package/inputmask/inputmask.d.ts +273 -0
  1397. package/inputmask/inputmask.interface.d.ts +19 -0
  1398. package/inputmask/inputmask.module.d.ts +12 -0
  1399. package/inputmask/public_api.d.ts +3 -0
  1400. package/inputnumber/index.d.ts +3 -443
  1401. package/inputnumber/inputnumber.d.ts +397 -0
  1402. package/inputnumber/inputnumber.interface.d.ts +38 -0
  1403. package/inputnumber/inputnumber.module.d.ts +8 -0
  1404. package/inputnumber/public_api.d.ts +3 -0
  1405. package/inputotp/index.d.ts +3 -189
  1406. package/inputotp/inputotp.d.ts +123 -0
  1407. package/inputotp/inputotp.interface.d.ts +65 -0
  1408. package/inputotp/public_api.d.ts +2 -0
  1409. package/inputswitch/index.d.ts +3 -123
  1410. package/inputswitch/inputswitch.d.ts +106 -0
  1411. package/inputswitch/inputswitch.interface.d.ts +15 -0
  1412. package/inputswitch/public_api.d.ts +2 -0
  1413. package/inputtext/index.d.ts +5 -76
  1414. package/inputtext/inputtext.component.d.ts +43 -0
  1415. package/inputtext/inputtext.directive.d.ts +25 -0
  1416. package/inputtext/inputtext.module.d.ts +10 -0
  1417. package/inputtext/public_api.d.ts +3 -0
  1418. package/inputtextarea/index.d.ts +3 -112
  1419. package/inputtextarea/inputtextarea.component.d.ts +57 -0
  1420. package/inputtextarea/inputtextarea.directive.d.ts +47 -0
  1421. package/inputtextarea/inputtextarea.module.d.ts +10 -0
  1422. package/inputtextarea/public_api.d.ts +3 -0
  1423. package/keyfilter/index.d.ts +3 -65
  1424. package/keyfilter/keyfilter.d.ts +58 -0
  1425. package/keyfilter/keyfilter.interface.d.ts +5 -0
  1426. package/keyfilter/public_api.d.ts +2 -0
  1427. package/knob/index.d.ts +3 -179
  1428. package/knob/knob.d.ts +178 -0
  1429. package/knob/public_api.d.ts +1 -0
  1430. package/listbox/index.d.ts +3 -620
  1431. package/listbox/listbox.d.ts +463 -0
  1432. package/listbox/listbox.interface.d.ts +156 -0
  1433. package/listbox/public_api.d.ts +2 -0
  1434. package/logo/index.d.ts +5 -20
  1435. package/logo/logo.d.ts +11 -0
  1436. package/logo/logo.module.d.ts +7 -0
  1437. package/logo/public_api.d.ts +2 -0
  1438. package/megamenu/index.d.ts +3 -230
  1439. package/megamenu/megamenu.d.ts +198 -0
  1440. package/megamenu/megamenu.interface.d.ts +31 -0
  1441. package/megamenu/public_api.d.ts +2 -0
  1442. package/menu/index.d.ts +3 -222
  1443. package/menu/menu.d.ts +210 -0
  1444. package/menu/menu.module.d.ts +12 -0
  1445. package/menu/public_api.d.ts +2 -0
  1446. package/menubar/index.d.ts +3 -290
  1447. package/menubar/menubar.d.ts +248 -0
  1448. package/menubar/menubar.interface.d.ts +40 -0
  1449. package/menubar/public_api.d.ts +2 -0
  1450. package/message/index.d.ts +3 -53
  1451. package/message/message.d.ts +52 -0
  1452. package/message/public_api.d.ts +1 -0
  1453. package/messages/index.d.ts +3 -140
  1454. package/messages/messages.d.ts +115 -0
  1455. package/messages/messages.interface.d.ts +18 -0
  1456. package/messages/messages.module.d.ts +8 -0
  1457. package/messages/public_api.d.ts +3 -0
  1458. package/metergroup/index.d.ts +3 -224
  1459. package/metergroup/metergroup.d.ts +101 -0
  1460. package/metergroup/metergroup.interface.d.ts +122 -0
  1461. package/metergroup/public_api.d.ts +2 -0
  1462. package/multiselect/index.d.ts +3 -974
  1463. package/multiselect/multiselect.d.ts +710 -0
  1464. package/multiselect/multiselect.interface.d.ts +247 -0
  1465. package/multiselect/multiselect.module.d.ts +20 -0
  1466. package/multiselect/public_api.d.ts +3 -0
  1467. package/navigation/index.d.ts +5 -105
  1468. package/navigation/navigation.d.ts +70 -0
  1469. package/navigation/navigation.interface.d.ts +26 -0
  1470. package/navigation/navigation.module.d.ts +7 -0
  1471. package/navigation/public_api.d.ts +2 -0
  1472. package/orderlist/index.d.ts +3 -381
  1473. package/orderlist/orderlist.d.ts +270 -0
  1474. package/orderlist/orderlist.interface.d.ts +110 -0
  1475. package/orderlist/public_api.d.ts +2 -0
  1476. package/organizationchart/index.d.ts +3 -192
  1477. package/organizationchart/organizationchart.d.ts +132 -0
  1478. package/organizationchart/organizationchart.interface.d.ts +59 -0
  1479. package/organizationchart/public_api.d.ts +2 -0
  1480. package/overlay/index.d.ts +3 -246
  1481. package/overlay/overlay.d.ts +238 -0
  1482. package/overlay/overlay.module.d.ts +8 -0
  1483. package/overlay/public_api.d.ts +2 -0
  1484. package/overlaypanel/index.d.ts +3 -170
  1485. package/overlaypanel/overlaypanel.d.ts +162 -0
  1486. package/overlaypanel/overlaypanel.module.d.ts +8 -0
  1487. package/overlaypanel/public_api.d.ts +2 -0
  1488. package/package.json +699 -359
  1489. package/paginator/index.d.ts +3 -249
  1490. package/paginator/paginator.d.ts +195 -0
  1491. package/paginator/paginator.interface.d.ts +37 -0
  1492. package/paginator/paginator.module.d.ts +17 -0
  1493. package/paginator/public_api.d.ts +3 -0
  1494. package/panel/index.d.ts +3 -185
  1495. package/panel/panel.d.ts +126 -0
  1496. package/panel/panel.interface.d.ts +58 -0
  1497. package/panel/public_api.d.ts +2 -0
  1498. package/panelmenu/index.d.ts +3 -249
  1499. package/panelmenu/panelmenu.d.ts +225 -0
  1500. package/panelmenu/panelmenu.interface.d.ts +23 -0
  1501. package/panelmenu/public_api.d.ts +2 -0
  1502. package/password/index.d.ts +3 -342
  1503. package/password/password.d.ts +342 -0
  1504. package/password/public_api.d.ts +1 -0
  1505. package/picklist/index.d.ts +3 -696
  1506. package/picklist/picklist.d.ts +453 -0
  1507. package/picklist/picklist.interface.d.ts +242 -0
  1508. package/picklist/public_api.d.ts +2 -0
  1509. package/progressbar/index.d.ts +3 -61
  1510. package/progressbar/progressbar.d.ts +54 -0
  1511. package/progressbar/progressbar.module.d.ts +8 -0
  1512. package/progressbar/public_api.d.ts +2 -0
  1513. package/progressspinner/index.d.ts +3 -58
  1514. package/progressspinner/progressspinner.d.ts +50 -0
  1515. package/progressspinner/progressspinner.module.d.ts +8 -0
  1516. package/progressspinner/public_api.d.ts +2 -0
  1517. package/public_api.d.ts +2 -0
  1518. package/radiobutton/index.d.ts +3 -173
  1519. package/radiobutton/public_api.d.ts +3 -0
  1520. package/radiobutton/radiobutton.d.ts +150 -0
  1521. package/radiobutton/radiobutton.interface.d.ts +15 -0
  1522. package/radiobutton/radiobutton.module.d.ts +7 -0
  1523. package/rating/index.d.ts +3 -181
  1524. package/rating/public_api.d.ts +2 -0
  1525. package/rating/rating.d.ts +146 -0
  1526. package/rating/rating.interface.d.ts +34 -0
  1527. package/resources/components/colorpicker/images/color.png +0 -0
  1528. package/resources/components/colorpicker/images/hue.png +0 -0
  1529. package/resources/components/password/images/password-meter.png +0 -0
  1530. package/resources/components/toggleswitch/toggleswitch.scss +1 -1
  1531. package/resources/components/tree/images/line.gif +0 -0
  1532. package/resources/images/color.png +0 -0
  1533. package/resources/images/hue.png +0 -0
  1534. package/resources/images/line.gif +0 -0
  1535. package/resources/images/password-meter.png +0 -0
  1536. package/ripple/index.d.ts +3 -37
  1537. package/ripple/public_api.d.ts +2 -0
  1538. package/ripple/ripple.d.ts +30 -0
  1539. package/ripple/ripple.module.d.ts +7 -0
  1540. package/scroller/index.d.ts +3 -528
  1541. package/scroller/public_api.d.ts +3 -0
  1542. package/scroller/scroller.d.ts +343 -0
  1543. package/scroller/scroller.interface.d.ts +177 -0
  1544. package/scroller/scroller.module.d.ts +8 -0
  1545. package/scrollpanel/index.d.ts +3 -116
  1546. package/scrollpanel/public_api.d.ts +2 -0
  1547. package/scrollpanel/scrollpanel.d.ts +103 -0
  1548. package/scrollpanel/scrollpanel.interface.d.ts +11 -0
  1549. package/scrolltop/index.d.ts +3 -117
  1550. package/scrolltop/public_api.d.ts +2 -0
  1551. package/scrolltop/scrolltop.d.ts +97 -0
  1552. package/scrolltop/scrolltop.interface.d.ts +18 -0
  1553. package/selectbutton/index.d.ts +3 -184
  1554. package/selectbutton/public_api.d.ts +3 -0
  1555. package/selectbutton/selectbutton.d.ts +128 -0
  1556. package/selectbutton/selectbutton.interface.d.ts +45 -0
  1557. package/selectbutton/selectbutton.module.d.ts +11 -0
  1558. package/sidebar/index.d.ts +3 -213
  1559. package/sidebar/public_api.d.ts +3 -0
  1560. package/sidebar/sidebar.d.ts +173 -0
  1561. package/sidebar/sidebar.interface.d.ts +27 -0
  1562. package/sidebar/sidebar.module.d.ts +12 -0
  1563. package/skeleton/index.d.ts +3 -69
  1564. package/skeleton/public_api.d.ts +2 -0
  1565. package/skeleton/skeleton.d.ts +61 -0
  1566. package/skeleton/skeleton.module.d.ts +8 -0
  1567. package/slidemenu/index.d.ts +3 -339
  1568. package/slidemenu/public_api.d.ts +2 -0
  1569. package/slidemenu/slidemenu.d.ts +322 -0
  1570. package/slidemenu/slidemenu.interface.d.ts +15 -0
  1571. package/slider/index.d.ts +3 -214
  1572. package/slider/public_api.d.ts +2 -0
  1573. package/slider/slider.d.ts +174 -0
  1574. package/slider/slider.interface.d.ts +38 -0
  1575. package/speeddial/index.d.ts +3 -319
  1576. package/speeddial/public_api.d.ts +3 -0
  1577. package/speeddial/speeddial.d.ts +277 -0
  1578. package/speeddial/speeddial.interface.d.ts +28 -0
  1579. package/speeddial/speeddial.module.d.ts +14 -0
  1580. package/spinner/index.d.ts +5 -93
  1581. package/spinner/public_api.d.ts +1 -0
  1582. package/spinner/spinner.d.ts +90 -0
  1583. package/splitbutton/index.d.ts +3 -264
  1584. package/splitbutton/public_api.d.ts +3 -0
  1585. package/splitbutton/splitbutton.d.ts +222 -0
  1586. package/splitbutton/splitbutton.interface.d.ts +30 -0
  1587. package/splitbutton/splitbutton.module.d.ts +13 -0
  1588. package/splitter/index.d.ts +3 -201
  1589. package/splitter/public_api.d.ts +3 -0
  1590. package/splitter/splitter.d.ts +158 -0
  1591. package/splitter/splitter.interface.d.ts +34 -0
  1592. package/splitter/splitter.module.d.ts +9 -0
  1593. package/stepper/index.d.ts +3 -145
  1594. package/stepper/public_api.d.ts +2 -0
  1595. package/stepper/stepper.d.ts +117 -0
  1596. package/stepper/stepper.interface.d.ts +26 -0
  1597. package/steps/index.d.ts +3 -87
  1598. package/steps/public_api.d.ts +2 -0
  1599. package/steps/steps.d.ts +77 -0
  1600. package/steps/steps.module.d.ts +10 -0
  1601. package/styleclass/index.d.ts +3 -109
  1602. package/styleclass/public_api.d.ts +1 -0
  1603. package/styleclass/styleclass.d.ts +108 -0
  1604. package/table/columnfilter.interface.d.ts +247 -0
  1605. package/table/components/cell-editor/cell-editor.d.ts +20 -0
  1606. package/table/components/column-filter/column-filter.d.ts +291 -0
  1607. package/table/components/column-filter-form-element/column-filter-form-element.d.ts +37 -0
  1608. package/table/components/sort-icon/sort-icon.d.ts +22 -0
  1609. package/table/components/table-body/table-body.d.ts +36 -0
  1610. package/table/components/table-checkbox/table-checkbox.d.ts +32 -0
  1611. package/table/components/table-header-checkbox/table-header-checkbox.d.ts +29 -0
  1612. package/table/components/table-radio-button/table-radio-button.d.ts +29 -0
  1613. package/table/directives/cancel-editable-row.directive.d.ts +11 -0
  1614. package/table/directives/cell-highlight.directive.d.ts +14 -0
  1615. package/table/directives/content-menu-row.directive.d.ts +22 -0
  1616. package/table/directives/dynamic-column-width.directive.d.ts +12 -0
  1617. package/table/directives/editable-column.directive.d.ts +40 -0
  1618. package/table/directives/editable-row.directive.d.ts +12 -0
  1619. package/table/directives/frozen-column.directive.d.ts +16 -0
  1620. package/table/directives/init-editable-row.directive.d.ts +11 -0
  1621. package/table/directives/reorderable-column.directive.d.ts +32 -0
  1622. package/table/directives/reorderable-row-handle.directive.d.ts +9 -0
  1623. package/table/directives/reorderable-row.directive.d.ts +34 -0
  1624. package/table/directives/resizable-column.directive.d.ts +35 -0
  1625. package/table/directives/row-group-header.directive.d.ts +9 -0
  1626. package/table/directives/row-toggler.directive.d.ts +13 -0
  1627. package/table/directives/save-editable-row.directive.d.ts +11 -0
  1628. package/table/directives/selectable-row-double-click.directive.d.ts +22 -0
  1629. package/table/directives/selectable-row.directive.d.ts +37 -0
  1630. package/table/directives/sortable-column.directive.d.ts +24 -0
  1631. package/table/index.d.ts +3 -2556
  1632. package/table/public_api.d.ts +30 -0
  1633. package/table/table.d.ts +871 -0
  1634. package/table/table.interface.d.ts +623 -0
  1635. package/table/table.module.d.ts +34 -0
  1636. package/table/table.service.d.ts +24 -0
  1637. package/tableconfiguration/index.d.ts +5 -25
  1638. package/tableconfiguration/public_api.d.ts +2 -0
  1639. package/tableconfiguration/tableconfiguration.d.ts +16 -0
  1640. package/tableconfiguration/tableconfiguration.module.d.ts +7 -0
  1641. package/tabmenu/index.d.ts +3 -160
  1642. package/tabmenu/public_api.d.ts +2 -0
  1643. package/tabmenu/tabmenu.d.ts +126 -0
  1644. package/tabmenu/tabmenu.interface.d.ts +32 -0
  1645. package/tabview/index.d.ts +3 -357
  1646. package/tabview/public_api.d.ts +3 -0
  1647. package/tabview/tabview.d.ts +293 -0
  1648. package/tabview/tabview.interface.d.ts +49 -0
  1649. package/tabview/tabview.module.d.ts +15 -0
  1650. package/tag/index.d.ts +3 -82
  1651. package/tag/public_api.d.ts +3 -0
  1652. package/tag/tag.d.ts +61 -0
  1653. package/tag/tag.interface.d.ts +11 -0
  1654. package/tag/tag.module.d.ts +9 -0
  1655. package/terminal/index.d.ts +3 -68
  1656. package/terminal/public_api.d.ts +2 -0
  1657. package/terminal/terminal.d.ts +56 -0
  1658. package/terminal/terminalservice.d.ts +11 -0
  1659. package/tieredmenu/index.d.ts +3 -307
  1660. package/tieredmenu/public_api.d.ts +3 -0
  1661. package/tieredmenu/tieredmenu.d.ts +266 -0
  1662. package/tieredmenu/tieredmenu.interface.d.ts +27 -0
  1663. package/tieredmenu/tiredmenu.module.d.ts +13 -0
  1664. package/timeline/index.d.ts +3 -100
  1665. package/timeline/public_api.d.ts +3 -0
  1666. package/timeline/timeline.d.ts +47 -0
  1667. package/timeline/timeline.interface.d.ts +43 -0
  1668. package/timeline/timeline.module.d.ts +9 -0
  1669. package/toast/index.d.ts +3 -202
  1670. package/toast/public_api.d.ts +3 -0
  1671. package/toast/toast.d.ts +142 -0
  1672. package/toast/toast.interface.d.ts +52 -0
  1673. package/toast/toast.module.d.ts +9 -0
  1674. package/toast/toastitem.d.ts +37 -0
  1675. package/togglebutton/index.d.ts +3 -150
  1676. package/togglebutton/public_api.d.ts +2 -0
  1677. package/togglebutton/togglebutton.d.ts +115 -0
  1678. package/togglebutton/togglebutton.interface.d.ts +34 -0
  1679. package/toggleswitch/index.d.ts +5 -25
  1680. package/toggleswitch/public_api.d.ts +2 -0
  1681. package/toggleswitch/toggleswitch.d.ts +14 -0
  1682. package/toggleswitch/toggleswitch.module.d.ts +9 -0
  1683. package/toolbar/index.d.ts +3 -64
  1684. package/toolbar/public_api.d.ts +2 -0
  1685. package/toolbar/toolbar.d.ts +43 -0
  1686. package/toolbar/toolbar.interface.d.ts +19 -0
  1687. package/tooltip/index.d.ts +3 -218
  1688. package/tooltip/public_api.d.ts +2 -0
  1689. package/tooltip/tooltip.d.ts +208 -0
  1690. package/tooltip/tooltip.module.d.ts +10 -0
  1691. package/tree/index.d.ts +3 -673
  1692. package/tree/public_api.d.ts +3 -0
  1693. package/tree/tree.d.ts +461 -0
  1694. package/tree/tree.interface.d.ts +193 -0
  1695. package/tree/tree.module.d.ts +21 -0
  1696. package/treeselect/index.d.ts +3 -517
  1697. package/treeselect/public_api.d.ts +3 -0
  1698. package/treeselect/treeselect.d.ts +394 -0
  1699. package/treeselect/treeselect.interface.d.ts +108 -0
  1700. package/treeselect/treeselect.module.d.ts +16 -0
  1701. package/treetable/index.d.ts +3 -1461
  1702. package/treetable/public_api.d.ts +2 -0
  1703. package/treetable/treetable.d.ts +988 -0
  1704. package/treetable/treetable.interface.d.ts +472 -0
  1705. package/tristatecheckbox/index.d.ts +3 -155
  1706. package/tristatecheckbox/public_api.d.ts +3 -0
  1707. package/tristatecheckbox/tristatecheckbox.d.ts +117 -0
  1708. package/tristatecheckbox/tristatecheckbox.interface.d.ts +30 -0
  1709. package/tristatecheckbox/tristatecheckbox.module.d.ts +8 -0
  1710. package/ts-helpers/index.d.ts +5 -6
  1711. package/ts-helpers/public_api.d.ts +1 -0
  1712. package/ts-helpers/ts-helpers.d.ts +4 -0
  1713. package/upload/index.d.ts +5 -81
  1714. package/upload/public_api.d.ts +2 -0
  1715. package/upload/upload.component.d.ts +67 -0
  1716. package/upload/upload.component.module.d.ts +11 -0
  1717. package/utils/index.d.ts +5 -35
  1718. package/utils/objectutils.d.ts +24 -0
  1719. package/utils/public_api.d.ts +4 -0
  1720. package/utils/uniquecomponentid.d.ts +2 -0
  1721. package/utils/zindexutils.d.ts +7 -0
  1722. package/virtualscroller/index.d.ts +3 -161
  1723. package/virtualscroller/public_api.d.ts +2 -0
  1724. package/virtualscroller/virtualscroller.d.ts +89 -0
  1725. package/virtualscroller/virtualscroller.interface.d.ts +72 -0
  1726. package/cax-design-system-2.8.2.tgz +0 -0
@@ -0,0 +1,2799 @@
1
+ import { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common';
2
+ import { booleanAttribute, ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, Input, numberAttribute, Output, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core';
3
+ import { FilterMatchMode, FilterOperator, CaxTemplate } from 'cax-design-system/api';
4
+ import { DomHandler } from 'cax-design-system/dom';
5
+ import { ScrollerModule } from 'cax-design-system/scroller';
6
+ import { ObjectUtils, UniqueComponentId } from 'cax-design-system/utils';
7
+ import { ArrowDownIcon } from 'cax-design-system/icons/arrowdown';
8
+ import { ArrowUpIcon } from 'cax-design-system/icons/arrowup';
9
+ import { SpinnerIcon } from 'cax-design-system/icons/spinner';
10
+ import { PaginatorModule } from 'cax-design-system/paginator';
11
+ import { TableBody } from './components/table-body/table-body';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "./table.service";
14
+ import * as i2 from "cax-design-system/api";
15
+ import * as i3 from "@angular/platform-browser";
16
+ import * as i4 from "@angular/common";
17
+ import * as i5 from "cax-design-system/paginator";
18
+ import * as i6 from "cax-design-system/scroller";
19
+ /**
20
+ * Table displays data in tabular format.
21
+ * @group Components
22
+ */
23
+ export class Table {
24
+ document;
25
+ platformId;
26
+ renderer;
27
+ el;
28
+ zone;
29
+ tableService;
30
+ cd;
31
+ filterService;
32
+ overlayService;
33
+ config;
34
+ domSanitizer;
35
+ fontSize = 'md';
36
+ rowSize = 'md';
37
+ /**
38
+ * An array of objects to represent dynamic columns that are frozen.
39
+ * @group Props
40
+ */
41
+ frozenColumns;
42
+ /**
43
+ * An array of objects to display as frozen.
44
+ * @group Props
45
+ */
46
+ frozenValue;
47
+ /**
48
+ * Inline style of the component.
49
+ * @group Props
50
+ */
51
+ style;
52
+ /**
53
+ * Style class of the component.
54
+ * @group Props
55
+ */
56
+ styleClass;
57
+ /**
58
+ * Inline style of the table.
59
+ * @group Props
60
+ */
61
+ tableStyle;
62
+ /**
63
+ * Style class of the table.
64
+ * @group Props
65
+ */
66
+ tableStyleClass;
67
+ /**
68
+ * When specified as true, enables the pagination.
69
+ * @group Props
70
+ */
71
+ paginator;
72
+ /**
73
+ * Number of page links to display in paginator.
74
+ * @group Props
75
+ */
76
+ pageLinks = 5;
77
+ /**
78
+ * Array of integer/object values to display inside rows per page dropdown of paginator
79
+ * @group Props
80
+ */
81
+ rowsPerPageOptions;
82
+ /**
83
+ * Whether to show it even there is only one page.
84
+ * @group Props
85
+ */
86
+ alwaysShowPaginator = true;
87
+ /**
88
+ * Position of the paginator, options are "top", "bottom" or "both".
89
+ * @group Props
90
+ */
91
+ paginatorPosition = 'bottom';
92
+ /**
93
+ * Custom style class for paginator
94
+ * @group Props
95
+ */
96
+ paginatorStyleClass;
97
+ /**
98
+ * Target element to attach the paginator dropdown overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name).
99
+ * @group Props
100
+ */
101
+ paginatorDropdownAppendTo;
102
+ /**
103
+ * Paginator dropdown height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value.
104
+ * @group Props
105
+ */
106
+ paginatorDropdownScrollHeight = '200px';
107
+ /**
108
+ * Template of the current page report element. Available placeholders are {currentPage},{totalPages},{rows},{first},{last} and {totalRecords}
109
+ * @group Props
110
+ */
111
+ currentPageReportTemplate = '{currentPage} of {totalPages}';
112
+ /**
113
+ * Whether to display current page report.
114
+ * @group Props
115
+ */
116
+ showCurrentPageReport;
117
+ /**
118
+ * Whether to display a dropdown to navigate to any page.
119
+ * @group Props
120
+ */
121
+ showJumpToPageDropdown;
122
+ /**
123
+ * Whether to display a input to navigate to any page.
124
+ * @group Props
125
+ */
126
+ showJumpToPageInput;
127
+ /**
128
+ * When enabled, icons are displayed on paginator to go first and last page.
129
+ * @group Props
130
+ */
131
+ showFirstLastIcon = true;
132
+ /**
133
+ * Whether to show page links.
134
+ * @group Props
135
+ */
136
+ showPageLinks = true;
137
+ /**
138
+ * Sort order to use when an unsorted column gets sorted by user interaction.
139
+ * @group Props
140
+ */
141
+ defaultSortOrder = 1;
142
+ /**
143
+ * Defines whether sorting works on single column or on multiple columns.
144
+ * @group Props
145
+ */
146
+ filterType = 'default';
147
+ sortType = 'default';
148
+ sortMode = 'single';
149
+ /**
150
+ * When true, resets paginator to first page after sorting. Available only when sortMode is set to single.
151
+ * @group Props
152
+ */
153
+ resetPageOnSort = true;
154
+ /**
155
+ * Specifies the selection mode, valid values are "single" and "multiple".
156
+ * @group Props
157
+ */
158
+ selectionMode;
159
+ /**
160
+ * When enabled with paginator and checkbox selection mode, the select all checkbox in the header will select all rows on the current page.
161
+ * @group Props
162
+ */
163
+ selectionPageOnly;
164
+ /**
165
+ * Selected row with a context menu.
166
+ * @group Props
167
+ */
168
+ contextMenuSelection;
169
+ /**
170
+ * Callback to invoke on context menu selection change.
171
+ * @param {*} object - row data.
172
+ * @group Emits
173
+ */
174
+ contextMenuSelectionChange = new EventEmitter();
175
+ /**
176
+ * Defines the behavior of context menu selection, in "separate" mode context menu updates contextMenuSelection property whereas in joint mode selection property is used instead so that when row selection is enabled, both row selection and context menu selection use the same property.
177
+ * @group Props
178
+ */
179
+ contextMenuSelectionMode = 'separate';
180
+ /**
181
+ * A property to uniquely identify a record in data.
182
+ * @group Props
183
+ */
184
+ dataKey;
185
+ /**
186
+ * Defines whether metaKey should be considered for the selection. On touch enabled devices, metaKeySelection is turned off automatically.
187
+ * @group Props
188
+ */
189
+ metaKeySelection = false;
190
+ /**
191
+ * Defines if the row is selectable.
192
+ * @group Props
193
+ */
194
+ rowSelectable;
195
+ /**
196
+ * Function to optimize the dom operations by delegating to ngForTrackBy, default algorithm checks for object identity.
197
+ * @group Props
198
+ */
199
+ rowTrackBy = (index, item) => item;
200
+ /**
201
+ * Defines if data is loaded and interacted with in lazy manner.
202
+ * @group Props
203
+ */
204
+ lazy = false;
205
+ /**
206
+ * Whether to call lazy loading on initialization.
207
+ * @group Props
208
+ */
209
+ lazyLoadOnInit = true;
210
+ /**
211
+ * Algorithm to define if a row is selected, valid values are "equals" that compares by reference and "deepEquals" that compares all fields.
212
+ * @group Props
213
+ */
214
+ compareSelectionBy = 'deepEquals';
215
+ /**
216
+ * Character to use as the csv separator.
217
+ * @group Props
218
+ */
219
+ csvSeparator = ',';
220
+ /**
221
+ * Name of the exported file.
222
+ * @group Props
223
+ */
224
+ exportFilename = 'download';
225
+ /**
226
+ * An array of FilterMetadata objects to provide external filters.
227
+ * @group Props
228
+ */
229
+ filters = {};
230
+ /**
231
+ * An array of fields as string to use in global filtering.
232
+ * @group Props
233
+ */
234
+ globalFilterFields;
235
+ /**
236
+ * Delay in milliseconds before filtering the data.
237
+ * @group Props
238
+ */
239
+ filterDelay = 300;
240
+ /**
241
+ * Locale to use in filtering. The default locale is the host environment's current locale.
242
+ * @group Props
243
+ */
244
+ filterLocale;
245
+ /**
246
+ * Map instance to keep the expanded rows where key of the map is the data key of the row.
247
+ * @group Props
248
+ */
249
+ expandedRowKeys = {};
250
+ /**
251
+ * Map instance to keep the rows being edited where key of the map is the data key of the row.
252
+ * @group Props
253
+ */
254
+ editingRowKeys = {};
255
+ /**
256
+ * Whether multiple rows can be expanded at any time. Valid values are "multiple" and "single".
257
+ * @group Props
258
+ */
259
+ rowExpandMode = 'multiple';
260
+ /**
261
+ * Enables scrollable tables.
262
+ * @group Props
263
+ */
264
+ scrollable;
265
+ /**
266
+ * Orientation of the scrolling, options are "vertical", "horizontal" and "both".
267
+ * @group Props
268
+ * @deprecated Property is obselete since v14.2.0.
269
+ */
270
+ scrollDirection = 'vertical';
271
+ /**
272
+ * Type of the row grouping, valid values are "subheader" and "rowspan".
273
+ * @group Props
274
+ */
275
+ rowGroupMode;
276
+ /**
277
+ * Height of the scroll viewport in fixed pixels or the "flex" keyword for a dynamic size.
278
+ * @group Props
279
+ */
280
+ scrollHeight;
281
+ /**
282
+ * Whether the data should be loaded on demand during scroll.
283
+ * @group Props
284
+ */
285
+ virtualScroll;
286
+ /**
287
+ * Height of a row to use in calculations of virtual scrolling.
288
+ * @group Props
289
+ */
290
+ virtualScrollItemSize;
291
+ /**
292
+ * Whether to use the scroller feature. The properties of scroller component can be used like an object in it.
293
+ * @group Props
294
+ */
295
+ virtualScrollOptions;
296
+ /**
297
+ * Threshold in milliseconds to delay lazy loading during scrolling.
298
+ * @group Props
299
+ */
300
+ virtualScrollDelay = 250;
301
+ /**
302
+ * Width of the frozen columns container.
303
+ * @group Props
304
+ */
305
+ frozenWidth;
306
+ /**
307
+ * Defines if the table is responsive.
308
+ * @group Props
309
+ * @deprecated table is always responsive with scrollable behavior.
310
+ */
311
+ get responsive() {
312
+ return this._responsive;
313
+ }
314
+ set responsive(val) {
315
+ this._responsive = val;
316
+ console.warn('responsive property is deprecated as table is always responsive with scrollable behavior.');
317
+ }
318
+ _responsive;
319
+ /**
320
+ * Local ng-template varilable of a ContextMenu.
321
+ * @group Props
322
+ */
323
+ contextMenu;
324
+ /**
325
+ * When enabled, columns can be resized using drag and drop.
326
+ * @group Props
327
+ */
328
+ resizableColumns;
329
+ /**
330
+ * Defines whether the overall table width should change on column resize, valid values are "fit" and "expand".
331
+ * @group Props
332
+ */
333
+ columnResizeMode = 'fit';
334
+ /**
335
+ * When enabled, columns can be reordered using drag and drop.
336
+ * @group Props
337
+ */
338
+ reorderableColumns;
339
+ /**
340
+ * Displays a loader to indicate data load is in progress.
341
+ * @group Props
342
+ */
343
+ loading;
344
+ /**
345
+ * The icon to show while indicating data load is in progress.
346
+ * @group Props
347
+ */
348
+ loadingIcon;
349
+ /**
350
+ * Whether to show the loading mask when loading property is true.
351
+ * @group Props
352
+ */
353
+ showLoader = true;
354
+ /**
355
+ * Adds hover effect to rows without the need for selectionMode. Note that tr elements that can be hovered need to have "cax-selectable-row" class for rowHover to work.
356
+ * @group Props
357
+ */
358
+ rowHover;
359
+ /**
360
+ * Whether to use the default sorting or a custom one using sortFunction.
361
+ * @group Props
362
+ */
363
+ customSort;
364
+ /**
365
+ * Whether to use the initial sort badge or not.
366
+ * @group Props
367
+ */
368
+ showInitialSortBadge = true;
369
+ /**
370
+ * Whether the cell widths scale according to their content or not. Deprecated: Table layout is always "auto".
371
+ * @group Props
372
+ */
373
+ autoLayout;
374
+ /**
375
+ * Export function.
376
+ * @group Props
377
+ */
378
+ exportFunction;
379
+ /**
380
+ * Custom export header of the column to be exported as CSV.
381
+ * @group Props
382
+ */
383
+ exportHeader;
384
+ /**
385
+ * Unique identifier of a stateful table to use in state storage.
386
+ * @group Props
387
+ */
388
+ stateKey;
389
+ /**
390
+ * Defines where a stateful table keeps its state, valid values are "session" for sessionStorage and "local" for localStorage.
391
+ * @group Props
392
+ */
393
+ stateStorage = 'session';
394
+ /**
395
+ * Defines the editing mode, valid values are "cell" and "row".
396
+ * @group Props
397
+ */
398
+ editMode = 'cell';
399
+ /**
400
+ * Field name to use in row grouping.
401
+ * @group Props
402
+ */
403
+ groupRowsBy;
404
+ /**
405
+ * Order to sort when default row grouping is enabled.
406
+ * @group Props
407
+ */
408
+ groupRowsByOrder = 1;
409
+ /**
410
+ * Defines the responsive mode, valid options are "stack" and "scroll".
411
+ * @group Props
412
+ */
413
+ responsiveLayout = 'scroll';
414
+ /**
415
+ * The breakpoint to define the maximum width boundary when using stack responsive layout.
416
+ * @group Props
417
+ */
418
+ breakpoint = '960px';
419
+ /**
420
+ * Locale to be used in paginator formatting.
421
+ * @group Props
422
+ */
423
+ paginatorLocale;
424
+ /**
425
+ * An array of objects to display.
426
+ * @group Props
427
+ */
428
+ get value() {
429
+ return this._value;
430
+ }
431
+ set value(val) {
432
+ this._value = val;
433
+ }
434
+ /**
435
+ * An array of objects to represent dynamic columns.
436
+ * @group Props
437
+ */
438
+ get columns() {
439
+ return this._columns;
440
+ }
441
+ set columns(cols) {
442
+ this._columns = cols;
443
+ }
444
+ /**
445
+ * Index of the first row to be displayed.
446
+ * @group Props
447
+ */
448
+ get first() {
449
+ return this._first;
450
+ }
451
+ set first(val) {
452
+ this._first = val;
453
+ }
454
+ /**
455
+ * Number of rows to display per page.
456
+ * @group Props
457
+ */
458
+ get rows() {
459
+ return this._rows;
460
+ }
461
+ set rows(val) {
462
+ this._rows = val;
463
+ }
464
+ /**
465
+ * Number of total records, defaults to length of value when not defined.
466
+ * @group Props
467
+ */
468
+ get totalRecords() {
469
+ return this._totalRecords;
470
+ }
471
+ set totalRecords(val) {
472
+ this._totalRecords = val;
473
+ this.tableService.onTotalRecordsChange(this._totalRecords);
474
+ }
475
+ /**
476
+ * Name of the field to sort data by default.
477
+ * @group Props
478
+ */
479
+ get sortField() {
480
+ return this._sortField;
481
+ }
482
+ set sortField(val) {
483
+ this._sortField = val;
484
+ }
485
+ /**
486
+ * Order to sort when default sorting is enabled.
487
+ * @group Props
488
+ */
489
+ get sortOrder() {
490
+ return this._sortOrder;
491
+ }
492
+ set sortOrder(val) {
493
+ this._sortOrder = val;
494
+ }
495
+ /**
496
+ * An array of SortMeta objects to sort the data by default in multiple sort mode.
497
+ * @group Props
498
+ */
499
+ get multiSortMeta() {
500
+ return this._multiSortMeta;
501
+ }
502
+ set multiSortMeta(val) {
503
+ this._multiSortMeta = val;
504
+ }
505
+ /**
506
+ * Selected row in single mode or an array of values in multiple mode.
507
+ * @group Props
508
+ */
509
+ get selection() {
510
+ return this._selection;
511
+ }
512
+ set selection(val) {
513
+ this._selection = val;
514
+ }
515
+ /**
516
+ * Whether all data is selected.
517
+ * @group Props
518
+ */
519
+ get selectAll() {
520
+ return this._selection;
521
+ }
522
+ set selectAll(val) {
523
+ this._selection = val;
524
+ }
525
+ /**
526
+ * Emits when the all of the items selected or unselected.
527
+ * @param {TableSelectAllChangeEvent} event - custom all selection change event.
528
+ * @group Emits
529
+ */
530
+ selectAllChange = new EventEmitter();
531
+ /**
532
+ * Callback to invoke on selection changed.
533
+ * @param {any | null} value - selected data.
534
+ * @group Emits
535
+ */
536
+ selectionChange = new EventEmitter();
537
+ /**
538
+ * Callback to invoke when a row is selected.
539
+ * @param {TableRowSelectEvent} event - custom select event.
540
+ * @group Emits
541
+ */
542
+ onRowSelect = new EventEmitter();
543
+ /**
544
+ * Callback to invoke when a row is unselected.
545
+ * @param {TableRowUnSelectEvent} event - custom unselect event.
546
+ * @group Emits
547
+ */
548
+ onRowUnselect = new EventEmitter();
549
+ /**
550
+ * Callback to invoke when pagination occurs.
551
+ * @param {TablePageEvent} event - custom pagination event.
552
+ * @group Emits
553
+ */
554
+ onPage = new EventEmitter();
555
+ /**
556
+ * Callback to invoke when a column gets sorted.
557
+ * @param {Object} object - sort meta.
558
+ * @group Emits
559
+ */
560
+ onSort = new EventEmitter();
561
+ /**
562
+ * Callback to invoke when data is filtered.
563
+ * @param {TableFilterEvent} event - custom filtering event.
564
+ * @group Emits
565
+ */
566
+ onFilter = new EventEmitter();
567
+ /**
568
+ * Callback to invoke when paging, sorting or filtering happens in lazy mode.
569
+ * @param {TableLazyLoadEvent} event - custom lazy loading event.
570
+ * @group Emits
571
+ */
572
+ onLazyLoad = new EventEmitter();
573
+ /**
574
+ * Callback to invoke when a row is expanded.
575
+ * @param {TableRowExpandEvent} event - custom row expand event.
576
+ * @group Emits
577
+ */
578
+ onRowExpand = new EventEmitter();
579
+ /**
580
+ * Callback to invoke when a row is collapsed.
581
+ * @param {TableRowCollapseEvent} event - custom row collapse event.
582
+ * @group Emits
583
+ */
584
+ onRowCollapse = new EventEmitter();
585
+ /**
586
+ * Callback to invoke when a row is selected with right click.
587
+ * @param {TableContextMenuSelectEvent} event - custom context menu select event.
588
+ * @group Emits
589
+ */
590
+ onContextMenuSelect = new EventEmitter();
591
+ /**
592
+ * Callback to invoke when a column is resized.
593
+ * @param {TableColResizeEvent} event - custom column resize event.
594
+ * @group Emits
595
+ */
596
+ onColResize = new EventEmitter();
597
+ /**
598
+ * Callback to invoke when a column is reordered.
599
+ * @param {TableColumnReorderEvent} event - custom column reorder event.
600
+ * @group Emits
601
+ */
602
+ onColReorder = new EventEmitter();
603
+ /**
604
+ * Callback to invoke when a row is reordered.
605
+ * @param {TableRowReorderEvent} event - custom row reorder event.
606
+ * @group Emits
607
+ */
608
+ onRowReorder = new EventEmitter();
609
+ /**
610
+ * Callback to invoke when a cell switches to edit mode.
611
+ * @param {TableEditInitEvent} event - custom edit init event.
612
+ * @group Emits
613
+ */
614
+ onEditInit = new EventEmitter();
615
+ /**
616
+ * Callback to invoke when cell edit is completed.
617
+ * @param {TableEditCompleteEvent} event - custom edit complete event.
618
+ * @group Emits
619
+ */
620
+ onEditComplete = new EventEmitter();
621
+ /**
622
+ * Callback to invoke when cell edit is cancelled with escape key.
623
+ * @param {TableEditCancelEvent} event - custom edit cancel event.
624
+ * @group Emits
625
+ */
626
+ onEditCancel = new EventEmitter();
627
+ /**
628
+ * Callback to invoke when state of header checkbox changes.
629
+ * @param {TableHeaderCheckboxToggleEvent} event - custom header checkbox event.
630
+ * @group Emits
631
+ */
632
+ onHeaderCheckboxToggle = new EventEmitter();
633
+ /**
634
+ * A function to implement custom sorting, refer to sorting section for details.
635
+ * @param {any} any - sort meta.
636
+ * @group Emits
637
+ */
638
+ sortFunction = new EventEmitter();
639
+ /**
640
+ * Callback to invoke on pagination.
641
+ * @param {number} number - first element.
642
+ * @group Emits
643
+ */
644
+ firstChange = new EventEmitter();
645
+ /**
646
+ * Callback to invoke on rows change.
647
+ * @param {number} number - Row count.
648
+ * @group Emits
649
+ */
650
+ rowsChange = new EventEmitter();
651
+ /**
652
+ * Callback to invoke table state is saved.
653
+ * @param {TableState} object - table state.
654
+ * @group Emits
655
+ */
656
+ onStateSave = new EventEmitter();
657
+ /**
658
+ * Callback to invoke table state is restored.
659
+ * @param {TableState} object - table state.
660
+ * @group Emits
661
+ */
662
+ onStateRestore = new EventEmitter();
663
+ containerViewChild;
664
+ resizeHelperViewChild;
665
+ reorderIndicatorUpViewChild;
666
+ reorderIndicatorDownViewChild;
667
+ wrapperViewChild;
668
+ tableViewChild;
669
+ tableHeaderViewChild;
670
+ tableFooterViewChild;
671
+ scroller;
672
+ templates;
673
+ /**
674
+ * Indicates the height of rows to be scrolled.
675
+ * @group Props
676
+ * @deprecated use virtualScrollItemSize property instead.
677
+ */
678
+ get virtualRowHeight() {
679
+ return this._virtualRowHeight;
680
+ }
681
+ set virtualRowHeight(val) {
682
+ this._virtualRowHeight = val;
683
+ console.warn('The virtualRowHeight property is deprecated.');
684
+ }
685
+ _virtualRowHeight = 28;
686
+ _value = [];
687
+ _columns;
688
+ _totalRecords = 0;
689
+ _first = 0;
690
+ _rows;
691
+ filteredValue;
692
+ headerTemplate;
693
+ headerGroupedTemplate;
694
+ bodyTemplate;
695
+ loadingBodyTemplate;
696
+ captionTemplate;
697
+ footerTemplate;
698
+ footerGroupedTemplate;
699
+ summaryTemplate;
700
+ colGroupTemplate;
701
+ expandedRowTemplate;
702
+ groupHeaderTemplate;
703
+ groupFooterTemplate;
704
+ frozenExpandedRowTemplate;
705
+ frozenHeaderTemplate;
706
+ frozenBodyTemplate;
707
+ frozenFooterTemplate;
708
+ frozenColGroupTemplate;
709
+ emptyMessageTemplate;
710
+ paginatorLeftTemplate;
711
+ paginatorRightTemplate;
712
+ paginatorDropdownItemTemplate;
713
+ loadingIconTemplate;
714
+ reorderIndicatorUpIconTemplate;
715
+ reorderIndicatorDownIconTemplate;
716
+ sortIconTemplate;
717
+ checkboxIconTemplate;
718
+ headerCheckboxIconTemplate;
719
+ paginatorDropdownIconTemplate;
720
+ paginatorFirstPageLinkIconTemplate;
721
+ paginatorLastPageLinkIconTemplate;
722
+ paginatorPreviousPageLinkIconTemplate;
723
+ paginatorNextPageLinkIconTemplate;
724
+ selectionKeys = {};
725
+ lastResizerHelperX;
726
+ reorderIconWidth;
727
+ reorderIconHeight;
728
+ draggedColumn;
729
+ draggedRowIndex;
730
+ droppedRowIndex;
731
+ rowDragging;
732
+ dropPosition;
733
+ editingCell;
734
+ editingCellData;
735
+ editingCellField;
736
+ editingCellRowIndex;
737
+ selfClick;
738
+ documentEditListener;
739
+ _multiSortMeta;
740
+ _sortField;
741
+ _sortOrder = 1;
742
+ preventSelectionSetterPropagation;
743
+ _selection;
744
+ _selectAll = null;
745
+ anchorRowIndex;
746
+ rangeRowIndex;
747
+ filterTimeout;
748
+ initialized;
749
+ rowTouched;
750
+ restoringSort;
751
+ restoringFilter;
752
+ stateRestored;
753
+ columnOrderStateRestored;
754
+ columnWidthsState;
755
+ tableWidthState;
756
+ overlaySubscription;
757
+ resizeColumnElement;
758
+ columnResizing = false;
759
+ rowGroupHeaderStyleObject = {};
760
+ id = UniqueComponentId();
761
+ styleElement;
762
+ responsiveStyleElement;
763
+ window;
764
+ constructor(document, platformId, renderer, el, zone, tableService, cd, filterService, overlayService, config, domSanitizer) {
765
+ this.document = document;
766
+ this.platformId = platformId;
767
+ this.renderer = renderer;
768
+ this.el = el;
769
+ this.zone = zone;
770
+ this.tableService = tableService;
771
+ this.cd = cd;
772
+ this.filterService = filterService;
773
+ this.overlayService = overlayService;
774
+ this.config = config;
775
+ this.domSanitizer = domSanitizer;
776
+ this.window = this.document.defaultView;
777
+ }
778
+ ngOnInit() {
779
+ if (this.lazy && this.lazyLoadOnInit) {
780
+ if (!this.virtualScroll) {
781
+ this.onLazyLoad.emit(this.createLazyLoadMetadata());
782
+ }
783
+ if (this.restoringFilter) {
784
+ this.restoringFilter = false;
785
+ }
786
+ }
787
+ if (this.responsiveLayout === 'stack') {
788
+ this.createResponsiveStyle();
789
+ }
790
+ this.initialized = true;
791
+ }
792
+ ngAfterContentInit() {
793
+ this.templates.forEach((item) => {
794
+ switch (item.getType()) {
795
+ case 'caption':
796
+ this.captionTemplate = item.template;
797
+ break;
798
+ case 'header':
799
+ this.headerTemplate = item.template;
800
+ break;
801
+ case 'headergrouped':
802
+ this.headerGroupedTemplate = item.template;
803
+ break;
804
+ case 'body':
805
+ this.bodyTemplate = item.template;
806
+ break;
807
+ case 'loadingbody':
808
+ this.loadingBodyTemplate = item.template;
809
+ break;
810
+ case 'footer':
811
+ this.footerTemplate = item.template;
812
+ break;
813
+ case 'footergrouped':
814
+ this.footerGroupedTemplate = item.template;
815
+ break;
816
+ case 'summary':
817
+ this.summaryTemplate = item.template;
818
+ break;
819
+ case 'colgroup':
820
+ this.colGroupTemplate = item.template;
821
+ break;
822
+ case 'rowexpansion':
823
+ this.expandedRowTemplate = item.template;
824
+ break;
825
+ case 'groupheader':
826
+ this.groupHeaderTemplate = item.template;
827
+ break;
828
+ case 'groupfooter':
829
+ this.groupFooterTemplate = item.template;
830
+ break;
831
+ case 'frozenheader':
832
+ this.frozenHeaderTemplate = item.template;
833
+ break;
834
+ case 'frozenbody':
835
+ this.frozenBodyTemplate = item.template;
836
+ break;
837
+ case 'frozenfooter':
838
+ this.frozenFooterTemplate = item.template;
839
+ break;
840
+ case 'frozencolgroup':
841
+ this.frozenColGroupTemplate = item.template;
842
+ break;
843
+ case 'frozenrowexpansion':
844
+ this.frozenExpandedRowTemplate = item.template;
845
+ break;
846
+ case 'emptymessage':
847
+ this.emptyMessageTemplate = item.template;
848
+ break;
849
+ case 'paginatorleft':
850
+ this.paginatorLeftTemplate = item.template;
851
+ break;
852
+ case 'paginatorright':
853
+ this.paginatorRightTemplate = item.template;
854
+ break;
855
+ case 'paginatordropdownicon':
856
+ this.paginatorDropdownIconTemplate = item.template;
857
+ break;
858
+ case 'paginatordropdownitem':
859
+ this.paginatorDropdownItemTemplate = item.template;
860
+ break;
861
+ case 'paginatorfirstpagelinkicon':
862
+ this.paginatorFirstPageLinkIconTemplate = item.template;
863
+ break;
864
+ case 'paginatorlastpagelinkicon':
865
+ this.paginatorLastPageLinkIconTemplate = item.template;
866
+ break;
867
+ case 'paginatorpreviouspagelinkicon':
868
+ this.paginatorPreviousPageLinkIconTemplate = item.template;
869
+ break;
870
+ case 'paginatornextpagelinkicon':
871
+ this.paginatorNextPageLinkIconTemplate = item.template;
872
+ break;
873
+ case 'loadingicon':
874
+ this.loadingIconTemplate = item.template;
875
+ break;
876
+ case 'reorderindicatorupicon':
877
+ this.reorderIndicatorUpIconTemplate = item.template;
878
+ break;
879
+ case 'reorderindicatordownicon':
880
+ this.reorderIndicatorDownIconTemplate = item.template;
881
+ break;
882
+ case 'sorticon':
883
+ this.sortIconTemplate = item.template;
884
+ break;
885
+ case 'checkboxicon':
886
+ this.checkboxIconTemplate = item.template;
887
+ break;
888
+ case 'headercheckboxicon':
889
+ this.headerCheckboxIconTemplate = item.template;
890
+ break;
891
+ }
892
+ });
893
+ }
894
+ ngAfterViewInit() {
895
+ if (isPlatformBrowser(this.platformId)) {
896
+ if (this.isStateful() && this.resizableColumns) {
897
+ this.restoreColumnWidths();
898
+ }
899
+ }
900
+ }
901
+ ngOnChanges(simpleChange) {
902
+ if (simpleChange.value) {
903
+ if (this.isStateful() && !this.stateRestored && isPlatformBrowser(this.platformId)) {
904
+ this.restoreState();
905
+ }
906
+ this._value = simpleChange.value.currentValue;
907
+ if (!this.lazy) {
908
+ this.totalRecords = this._value ? this._value.length : 0;
909
+ if (this.sortMode == 'single' && (this.sortField || this.groupRowsBy))
910
+ this.sortSingle();
911
+ else if (this.sortMode == 'multiple' && (this.multiSortMeta || this.groupRowsBy))
912
+ this.sortMultiple();
913
+ else if (this.hasFilter())
914
+ //sort already filters
915
+ this._filter();
916
+ }
917
+ this.tableService.onValueChange(simpleChange.value.currentValue);
918
+ }
919
+ if (simpleChange.columns) {
920
+ if (!this.isStateful()) {
921
+ this._columns = simpleChange.columns.currentValue;
922
+ this.tableService.onColumnsChange(simpleChange.columns.currentValue);
923
+ }
924
+ if (this._columns && this.isStateful() && this.reorderableColumns && !this.columnOrderStateRestored) {
925
+ this.restoreColumnOrder();
926
+ this.tableService.onColumnsChange(this._columns);
927
+ }
928
+ }
929
+ if (simpleChange.sortField) {
930
+ this._sortField = simpleChange.sortField.currentValue;
931
+ //avoid triggering lazy load prior to lazy initialization at onInit
932
+ if (!this.lazy || this.initialized) {
933
+ if (this.sortMode === 'single') {
934
+ this.sortSingle();
935
+ }
936
+ }
937
+ }
938
+ if (simpleChange.groupRowsBy) {
939
+ //avoid triggering lazy load prior to lazy initialization at onInit
940
+ if (!this.lazy || this.initialized) {
941
+ if (this.sortMode === 'single') {
942
+ this.sortSingle();
943
+ }
944
+ }
945
+ }
946
+ if (simpleChange.sortOrder) {
947
+ this._sortOrder = simpleChange.sortOrder.currentValue;
948
+ //avoid triggering lazy load prior to lazy initialization at onInit
949
+ if (!this.lazy || this.initialized) {
950
+ if (this.sortMode === 'single') {
951
+ this.sortSingle();
952
+ }
953
+ }
954
+ }
955
+ if (simpleChange.groupRowsByOrder) {
956
+ //avoid triggering lazy load prior to lazy initialization at onInit
957
+ if (!this.lazy || this.initialized) {
958
+ if (this.sortMode === 'single') {
959
+ this.sortSingle();
960
+ }
961
+ }
962
+ }
963
+ if (simpleChange.multiSortMeta) {
964
+ this._multiSortMeta = simpleChange.multiSortMeta.currentValue;
965
+ if (this.sortMode === 'multiple' && (this.initialized || (!this.lazy && !this.virtualScroll))) {
966
+ this.sortMultiple();
967
+ }
968
+ }
969
+ if (simpleChange.selection) {
970
+ this._selection = simpleChange.selection.currentValue;
971
+ if (!this.preventSelectionSetterPropagation) {
972
+ this.updateSelectionKeys();
973
+ this.tableService.onSelectionChange();
974
+ }
975
+ this.preventSelectionSetterPropagation = false;
976
+ }
977
+ if (simpleChange.selectAll) {
978
+ this._selectAll = simpleChange.selectAll.currentValue;
979
+ if (!this.preventSelectionSetterPropagation) {
980
+ this.updateSelectionKeys();
981
+ this.tableService.onSelectionChange();
982
+ if (this.isStateful()) {
983
+ this.saveState();
984
+ }
985
+ }
986
+ this.preventSelectionSetterPropagation = false;
987
+ }
988
+ }
989
+ get processedData() {
990
+ return this.filteredValue || this.value || [];
991
+ }
992
+ _initialColWidths;
993
+ dataToRender(data) {
994
+ const _data = data || this.processedData;
995
+ if (_data && this.paginator) {
996
+ const first = this.lazy ? 0 : this.first;
997
+ return _data.slice(first, first + this.rows);
998
+ }
999
+ return _data;
1000
+ }
1001
+ updateSelectionKeys() {
1002
+ if (this.dataKey && this._selection) {
1003
+ this.selectionKeys = {};
1004
+ if (Array.isArray(this._selection)) {
1005
+ for (let data of this._selection) {
1006
+ this.selectionKeys[String(ObjectUtils.resolveFieldData(data, this.dataKey))] = 1;
1007
+ }
1008
+ }
1009
+ else {
1010
+ this.selectionKeys[String(ObjectUtils.resolveFieldData(this._selection, this.dataKey))] = 1;
1011
+ }
1012
+ }
1013
+ }
1014
+ onPageChange(event) {
1015
+ this.first = event.first;
1016
+ this.rows = event.rows;
1017
+ this.onPage.emit({
1018
+ first: this.first,
1019
+ rows: this.rows
1020
+ });
1021
+ if (this.lazy) {
1022
+ this.onLazyLoad.emit(this.createLazyLoadMetadata());
1023
+ }
1024
+ this.firstChange.emit(this.first);
1025
+ this.rowsChange.emit(this.rows);
1026
+ this.tableService.onValueChange(this.value);
1027
+ if (this.isStateful()) {
1028
+ this.saveState();
1029
+ }
1030
+ this.anchorRowIndex = null;
1031
+ if (this.scrollable) {
1032
+ this.resetScrollTop();
1033
+ }
1034
+ }
1035
+ nextSortOrder = (current) => {
1036
+ switch (current) {
1037
+ case 0:
1038
+ return 1;
1039
+ case 1:
1040
+ return -1;
1041
+ case -1:
1042
+ return 0;
1043
+ default:
1044
+ return 1; // fallback to default if somehow invalid
1045
+ }
1046
+ };
1047
+ sort(event) {
1048
+ let originalEvent = event.originalEvent;
1049
+ if (this.sortMode === 'single') {
1050
+ if (this.sortType === 'custom') {
1051
+ this._sortOrder = this.sortField === event.field ? this.nextSortOrder(this._sortOrder) : this.defaultSortOrder;
1052
+ }
1053
+ else {
1054
+ this._sortOrder = this.sortField === event.field ? this.sortOrder * -1 : this.defaultSortOrder;
1055
+ }
1056
+ this._sortField = event.field;
1057
+ if (this.resetPageOnSort) {
1058
+ this._first = 0;
1059
+ this.firstChange.emit(this._first);
1060
+ if (this.scrollable) {
1061
+ this.resetScrollTop();
1062
+ }
1063
+ }
1064
+ this.sortSingle();
1065
+ }
1066
+ if (this.sortMode === 'multiple') {
1067
+ let metaKey = originalEvent.metaKey || originalEvent.ctrlKey;
1068
+ let sortMeta = this.getSortMeta(event.field);
1069
+ if (sortMeta) {
1070
+ if (!metaKey) {
1071
+ if (this.sortType === 'custom') {
1072
+ this._multiSortMeta = [{ field: event.field, order: this.nextSortOrder(sortMeta.order) }];
1073
+ }
1074
+ else {
1075
+ this._multiSortMeta = [{ field: event.field, order: sortMeta.order * -1 }];
1076
+ }
1077
+ if (this.resetPageOnSort) {
1078
+ this._first = 0;
1079
+ this.firstChange.emit(this._first);
1080
+ if (this.scrollable) {
1081
+ this.resetScrollTop();
1082
+ }
1083
+ }
1084
+ }
1085
+ else {
1086
+ if (this.sortType === 'custom') {
1087
+ sortMeta.order = this.nextSortOrder(sortMeta.order);
1088
+ }
1089
+ else {
1090
+ sortMeta.order = sortMeta.order * -1;
1091
+ }
1092
+ }
1093
+ }
1094
+ else {
1095
+ if (!metaKey || !this.multiSortMeta) {
1096
+ this._multiSortMeta = [];
1097
+ if (this.resetPageOnSort) {
1098
+ this._first = 0;
1099
+ this.firstChange.emit(this._first);
1100
+ }
1101
+ }
1102
+ this._multiSortMeta.push({ field: event.field, order: this.defaultSortOrder });
1103
+ }
1104
+ this._multiSortMeta = this._multiSortMeta.filter((item) => item.order !== 0);
1105
+ this.sortMultiple();
1106
+ }
1107
+ if (this.isStateful()) {
1108
+ this.saveState();
1109
+ }
1110
+ this.anchorRowIndex = null;
1111
+ }
1112
+ sortSingle() {
1113
+ let field = this.sortField || this.groupRowsBy;
1114
+ let order = this.sortField ? this.sortOrder : this.groupRowsByOrder;
1115
+ if (this.groupRowsBy && this.sortField && this.groupRowsBy !== this.sortField) {
1116
+ this._multiSortMeta = [this.getGroupRowsMeta(), { field: this.sortField, order: this.sortOrder }];
1117
+ this.sortMultiple();
1118
+ return;
1119
+ }
1120
+ if (this.sortType === 'custom') {
1121
+ let sortMeta = {
1122
+ field: field,
1123
+ order: order
1124
+ };
1125
+ this.onSort.emit(sortMeta);
1126
+ this.tableService.onSort(sortMeta);
1127
+ }
1128
+ else {
1129
+ if (field && order) {
1130
+ if (this.restoringSort) {
1131
+ this.restoringSort = false;
1132
+ }
1133
+ if (this.lazy) {
1134
+ this.onLazyLoad.emit(this.createLazyLoadMetadata());
1135
+ }
1136
+ else if (this.value) {
1137
+ if (this.customSort) {
1138
+ this.sortFunction.emit({
1139
+ data: this.value,
1140
+ mode: this.sortMode,
1141
+ field: field,
1142
+ order: order
1143
+ });
1144
+ }
1145
+ else {
1146
+ this.value.sort((data1, data2) => {
1147
+ let value1 = ObjectUtils.resolveFieldData(data1, field);
1148
+ let value2 = ObjectUtils.resolveFieldData(data2, field);
1149
+ let result = null;
1150
+ if (value1 == null && value2 != null)
1151
+ result = -1;
1152
+ else if (value1 != null && value2 == null)
1153
+ result = 1;
1154
+ else if (value1 == null && value2 == null)
1155
+ result = 0;
1156
+ else if (typeof value1 === 'string' && typeof value2 === 'string')
1157
+ result = value1.localeCompare(value2);
1158
+ else
1159
+ result = value1 < value2 ? -1 : value1 > value2 ? 1 : 0;
1160
+ return order * result;
1161
+ });
1162
+ this._value = [...this.value];
1163
+ }
1164
+ if (this.hasFilter()) {
1165
+ this._filter();
1166
+ }
1167
+ }
1168
+ let sortMeta = {
1169
+ field: field,
1170
+ order: order
1171
+ };
1172
+ this.onSort.emit(sortMeta);
1173
+ this.tableService.onSort(sortMeta);
1174
+ }
1175
+ }
1176
+ }
1177
+ sortMultiple() {
1178
+ if (this.groupRowsBy) {
1179
+ if (!this._multiSortMeta)
1180
+ this._multiSortMeta = [this.getGroupRowsMeta()];
1181
+ else if (this.multiSortMeta[0].field !== this.groupRowsBy)
1182
+ this._multiSortMeta = [this.getGroupRowsMeta(), ...this._multiSortMeta];
1183
+ }
1184
+ if (this.sortType === 'custom') {
1185
+ this.onSort.emit({
1186
+ multisortmeta: this.multiSortMeta
1187
+ });
1188
+ this.tableService.onSort(this.multiSortMeta);
1189
+ }
1190
+ else {
1191
+ if (this.multiSortMeta) {
1192
+ if (this.lazy) {
1193
+ this.onLazyLoad.emit(this.createLazyLoadMetadata());
1194
+ }
1195
+ else if (this.value) {
1196
+ if (this.customSort) {
1197
+ this.sortFunction.emit({
1198
+ data: this.value,
1199
+ mode: this.sortMode,
1200
+ multiSortMeta: this.multiSortMeta
1201
+ });
1202
+ }
1203
+ else {
1204
+ this.value.sort((data1, data2) => {
1205
+ return this.multisortField(data1, data2, this.multiSortMeta, 0);
1206
+ });
1207
+ this._value = [...this.value];
1208
+ }
1209
+ if (this.hasFilter()) {
1210
+ this._filter();
1211
+ }
1212
+ }
1213
+ this.onSort.emit({
1214
+ multisortmeta: this.multiSortMeta
1215
+ });
1216
+ this.tableService.onSort(this.multiSortMeta);
1217
+ }
1218
+ }
1219
+ }
1220
+ multisortField(data1, data2, multiSortMeta, index) {
1221
+ const value1 = ObjectUtils.resolveFieldData(data1, multiSortMeta[index].field);
1222
+ const value2 = ObjectUtils.resolveFieldData(data2, multiSortMeta[index].field);
1223
+ if (ObjectUtils.compare(value1, value2, this.filterLocale) === 0) {
1224
+ return multiSortMeta.length - 1 > index ? this.multisortField(data1, data2, multiSortMeta, index + 1) : 0;
1225
+ }
1226
+ return this.compareValuesOnSort(value1, value2, multiSortMeta[index].order);
1227
+ }
1228
+ compareValuesOnSort(value1, value2, order) {
1229
+ return ObjectUtils.sort(value1, value2, order, this.filterLocale, this.sortOrder);
1230
+ }
1231
+ getSortMeta(field) {
1232
+ if (this.multiSortMeta && this.multiSortMeta.length) {
1233
+ for (let i = 0; i < this.multiSortMeta.length; i++) {
1234
+ if (this.multiSortMeta[i].field === field) {
1235
+ return this.multiSortMeta[i];
1236
+ }
1237
+ }
1238
+ }
1239
+ return null;
1240
+ }
1241
+ isSorted(field) {
1242
+ if (this.sortMode === 'single') {
1243
+ return this.sortField && this.sortField === field;
1244
+ }
1245
+ else if (this.sortMode === 'multiple') {
1246
+ let sorted = false;
1247
+ if (this.multiSortMeta) {
1248
+ for (let i = 0; i < this.multiSortMeta.length; i++) {
1249
+ if (this.multiSortMeta[i].field == field) {
1250
+ sorted = true;
1251
+ break;
1252
+ }
1253
+ }
1254
+ }
1255
+ return sorted;
1256
+ }
1257
+ else if (this.sortMode === 'custom') {
1258
+ return this.sortField && this.sortField === field;
1259
+ }
1260
+ }
1261
+ handleRowClick(event) {
1262
+ let target = event.originalEvent.target;
1263
+ let targetNode = target.nodeName;
1264
+ let parentNode = target.parentElement && target.parentElement.nodeName;
1265
+ if (targetNode == 'INPUT' || targetNode == 'BUTTON' || targetNode == 'A' || parentNode == 'INPUT' || parentNode == 'BUTTON' || parentNode == 'A' || DomHandler.hasClass(event.originalEvent.target, 'cax-clickable')) {
1266
+ return;
1267
+ }
1268
+ if (this.selectionMode) {
1269
+ let rowData = event.rowData;
1270
+ let rowIndex = event.rowIndex;
1271
+ this.preventSelectionSetterPropagation = true;
1272
+ if (this.isMultipleSelectionMode() && event.originalEvent.shiftKey && this.anchorRowIndex != null) {
1273
+ DomHandler.clearSelection();
1274
+ if (this.rangeRowIndex != null) {
1275
+ this.clearSelectionRange(event.originalEvent);
1276
+ }
1277
+ this.rangeRowIndex = rowIndex;
1278
+ this.selectRange(event.originalEvent, rowIndex);
1279
+ }
1280
+ else {
1281
+ let selected = this.isSelected(rowData);
1282
+ if (!selected && !this.isRowSelectable(rowData, rowIndex)) {
1283
+ return;
1284
+ }
1285
+ let metaSelection = this.rowTouched ? false : this.metaKeySelection;
1286
+ let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null;
1287
+ this.anchorRowIndex = rowIndex;
1288
+ this.rangeRowIndex = rowIndex;
1289
+ if (metaSelection) {
1290
+ let metaKey = event.originalEvent.metaKey || event.originalEvent.ctrlKey;
1291
+ if (selected && metaKey) {
1292
+ if (this.isSingleSelectionMode()) {
1293
+ this._selection = null;
1294
+ this.selectionKeys = {};
1295
+ this.selectionChange.emit(null);
1296
+ }
1297
+ else {
1298
+ let selectionIndex = this.findIndexInSelection(rowData);
1299
+ this._selection = this.selection.filter((val, i) => i != selectionIndex);
1300
+ this.selectionChange.emit(this.selection);
1301
+ if (dataKeyValue) {
1302
+ delete this.selectionKeys[dataKeyValue];
1303
+ }
1304
+ }
1305
+ this.onRowUnselect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row' });
1306
+ }
1307
+ else {
1308
+ if (this.isSingleSelectionMode()) {
1309
+ this._selection = rowData;
1310
+ this.selectionChange.emit(rowData);
1311
+ if (dataKeyValue) {
1312
+ this.selectionKeys = {};
1313
+ this.selectionKeys[dataKeyValue] = 1;
1314
+ }
1315
+ }
1316
+ else if (this.isMultipleSelectionMode()) {
1317
+ if (metaKey) {
1318
+ this._selection = this.selection || [];
1319
+ }
1320
+ else {
1321
+ this._selection = [];
1322
+ this.selectionKeys = {};
1323
+ }
1324
+ this._selection = [...this.selection, rowData];
1325
+ this.selectionChange.emit(this.selection);
1326
+ if (dataKeyValue) {
1327
+ this.selectionKeys[dataKeyValue] = 1;
1328
+ }
1329
+ }
1330
+ this.onRowSelect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: rowIndex });
1331
+ }
1332
+ }
1333
+ else {
1334
+ if (this.selectionMode === 'single') {
1335
+ if (selected) {
1336
+ this._selection = null;
1337
+ this.selectionKeys = {};
1338
+ this.selectionChange.emit(this.selection);
1339
+ this.onRowUnselect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: rowIndex });
1340
+ }
1341
+ else {
1342
+ this._selection = rowData;
1343
+ this.selectionChange.emit(this.selection);
1344
+ this.onRowSelect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: rowIndex });
1345
+ if (dataKeyValue) {
1346
+ this.selectionKeys = {};
1347
+ this.selectionKeys[dataKeyValue] = 1;
1348
+ }
1349
+ }
1350
+ }
1351
+ else if (this.selectionMode === 'multiple') {
1352
+ if (selected) {
1353
+ let selectionIndex = this.findIndexInSelection(rowData);
1354
+ this._selection = this.selection.filter((val, i) => i != selectionIndex);
1355
+ this.selectionChange.emit(this.selection);
1356
+ this.onRowUnselect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: rowIndex });
1357
+ if (dataKeyValue) {
1358
+ delete this.selectionKeys[dataKeyValue];
1359
+ }
1360
+ }
1361
+ else {
1362
+ this._selection = this.selection ? [...this.selection, rowData] : [rowData];
1363
+ this.selectionChange.emit(this.selection);
1364
+ this.onRowSelect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: rowIndex });
1365
+ if (dataKeyValue) {
1366
+ this.selectionKeys[dataKeyValue] = 1;
1367
+ }
1368
+ }
1369
+ }
1370
+ }
1371
+ }
1372
+ this.tableService.onSelectionChange();
1373
+ if (this.isStateful()) {
1374
+ this.saveState();
1375
+ }
1376
+ }
1377
+ this.rowTouched = false;
1378
+ }
1379
+ handleRowTouchEnd(event) {
1380
+ this.rowTouched = true;
1381
+ }
1382
+ handleRowRightClick(event) {
1383
+ if (this.contextMenu) {
1384
+ const rowData = event.rowData;
1385
+ const rowIndex = event.rowIndex;
1386
+ if (this.contextMenuSelectionMode === 'separate') {
1387
+ this.contextMenuSelection = rowData;
1388
+ this.contextMenuSelectionChange.emit(rowData);
1389
+ this.onContextMenuSelect.emit({ originalEvent: event.originalEvent, data: rowData, index: event.rowIndex });
1390
+ this.contextMenu.show(event.originalEvent);
1391
+ this.tableService.onContextMenu(rowData);
1392
+ }
1393
+ else if (this.contextMenuSelectionMode === 'joint') {
1394
+ this.preventSelectionSetterPropagation = true;
1395
+ let selected = this.isSelected(rowData);
1396
+ let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null;
1397
+ if (!selected) {
1398
+ if (!this.isRowSelectable(rowData, rowIndex)) {
1399
+ return;
1400
+ }
1401
+ if (this.isSingleSelectionMode()) {
1402
+ this.selection = rowData;
1403
+ this.selectionChange.emit(rowData);
1404
+ if (dataKeyValue) {
1405
+ this.selectionKeys = {};
1406
+ this.selectionKeys[dataKeyValue] = 1;
1407
+ }
1408
+ }
1409
+ else if (this.isMultipleSelectionMode()) {
1410
+ this._selection = this.selection ? [...this.selection, rowData] : [rowData];
1411
+ this.selectionChange.emit(this.selection);
1412
+ if (dataKeyValue) {
1413
+ this.selectionKeys[dataKeyValue] = 1;
1414
+ }
1415
+ }
1416
+ }
1417
+ this.tableService.onSelectionChange();
1418
+ this.contextMenu.show(event.originalEvent);
1419
+ this.onContextMenuSelect.emit({ originalEvent: event, data: rowData, index: event.rowIndex });
1420
+ }
1421
+ }
1422
+ }
1423
+ selectRange(event, rowIndex, isMetaKeySelection) {
1424
+ let rangeStart, rangeEnd;
1425
+ if (this.anchorRowIndex > rowIndex) {
1426
+ rangeStart = rowIndex;
1427
+ rangeEnd = this.anchorRowIndex;
1428
+ }
1429
+ else if (this.anchorRowIndex < rowIndex) {
1430
+ rangeStart = this.anchorRowIndex;
1431
+ rangeEnd = rowIndex;
1432
+ }
1433
+ else {
1434
+ rangeStart = rowIndex;
1435
+ rangeEnd = rowIndex;
1436
+ }
1437
+ if (this.lazy && this.paginator) {
1438
+ rangeStart -= this.first;
1439
+ rangeEnd -= this.first;
1440
+ }
1441
+ let rangeRowsData = [];
1442
+ for (let i = rangeStart; i <= rangeEnd; i++) {
1443
+ let rangeRowData = this.filteredValue ? this.filteredValue[i] : this.value[i];
1444
+ if (!this.isSelected(rangeRowData) && !isMetaKeySelection) {
1445
+ if (!this.isRowSelectable(rangeRowData, rowIndex)) {
1446
+ continue;
1447
+ }
1448
+ rangeRowsData.push(rangeRowData);
1449
+ this._selection = [...this.selection, rangeRowData];
1450
+ let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rangeRowData, this.dataKey)) : null;
1451
+ if (dataKeyValue) {
1452
+ this.selectionKeys[dataKeyValue] = 1;
1453
+ }
1454
+ }
1455
+ }
1456
+ this.selectionChange.emit(this.selection);
1457
+ this.onRowSelect.emit({ originalEvent: event, data: rangeRowsData, type: 'row' });
1458
+ }
1459
+ clearSelectionRange(event) {
1460
+ let rangeStart, rangeEnd;
1461
+ let rangeRowIndex = this.rangeRowIndex;
1462
+ let anchorRowIndex = this.anchorRowIndex;
1463
+ if (rangeRowIndex > anchorRowIndex) {
1464
+ rangeStart = this.anchorRowIndex;
1465
+ rangeEnd = this.rangeRowIndex;
1466
+ }
1467
+ else if (rangeRowIndex < anchorRowIndex) {
1468
+ rangeStart = this.rangeRowIndex;
1469
+ rangeEnd = this.anchorRowIndex;
1470
+ }
1471
+ else {
1472
+ rangeStart = this.rangeRowIndex;
1473
+ rangeEnd = this.rangeRowIndex;
1474
+ }
1475
+ for (let i = rangeStart; i <= rangeEnd; i++) {
1476
+ let rangeRowData = this.value[i];
1477
+ let selectionIndex = this.findIndexInSelection(rangeRowData);
1478
+ this._selection = this.selection.filter((val, i) => i != selectionIndex);
1479
+ let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rangeRowData, this.dataKey)) : null;
1480
+ if (dataKeyValue) {
1481
+ delete this.selectionKeys[dataKeyValue];
1482
+ }
1483
+ this.onRowUnselect.emit({ originalEvent: event, data: rangeRowData, type: 'row' });
1484
+ }
1485
+ }
1486
+ isSelected(rowData) {
1487
+ if (rowData && this.selection) {
1488
+ if (this.dataKey) {
1489
+ return this.selectionKeys[ObjectUtils.resolveFieldData(rowData, this.dataKey)] !== undefined;
1490
+ }
1491
+ else {
1492
+ if (Array.isArray(this.selection))
1493
+ return this.findIndexInSelection(rowData) > -1;
1494
+ else
1495
+ return this.equals(rowData, this.selection);
1496
+ }
1497
+ }
1498
+ return false;
1499
+ }
1500
+ findIndexInSelection(rowData) {
1501
+ let index = -1;
1502
+ if (this.selection && this.selection.length) {
1503
+ for (let i = 0; i < this.selection.length; i++) {
1504
+ if (this.equals(rowData, this.selection[i])) {
1505
+ index = i;
1506
+ break;
1507
+ }
1508
+ }
1509
+ }
1510
+ return index;
1511
+ }
1512
+ isRowSelectable(data, index) {
1513
+ if (this.rowSelectable && !this.rowSelectable({ data, index })) {
1514
+ return false;
1515
+ }
1516
+ return true;
1517
+ }
1518
+ toggleRowWithRadio(event, rowData) {
1519
+ this.preventSelectionSetterPropagation = true;
1520
+ if (this.selection != rowData) {
1521
+ if (!this.isRowSelectable(rowData, event.rowIndex)) {
1522
+ return;
1523
+ }
1524
+ this._selection = rowData;
1525
+ this.selectionChange.emit(this.selection);
1526
+ this.onRowSelect.emit({ originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'radiobutton' });
1527
+ if (this.dataKey) {
1528
+ this.selectionKeys = {};
1529
+ this.selectionKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] = 1;
1530
+ }
1531
+ }
1532
+ else {
1533
+ this._selection = null;
1534
+ this.selectionChange.emit(this.selection);
1535
+ this.onRowUnselect.emit({ originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'radiobutton' });
1536
+ }
1537
+ this.tableService.onSelectionChange();
1538
+ if (this.isStateful()) {
1539
+ this.saveState();
1540
+ }
1541
+ }
1542
+ toggleRowWithCheckbox(event, rowData) {
1543
+ this.selection = this.selection || [];
1544
+ let selected = this.isSelected(rowData);
1545
+ let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null;
1546
+ this.preventSelectionSetterPropagation = true;
1547
+ if (selected) {
1548
+ let selectionIndex = this.findIndexInSelection(rowData);
1549
+ this._selection = this.selection.filter((val, i) => i != selectionIndex);
1550
+ this.selectionChange.emit(this.selection);
1551
+ this.onRowUnselect.emit({ originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'checkbox' });
1552
+ if (dataKeyValue) {
1553
+ delete this.selectionKeys[dataKeyValue];
1554
+ }
1555
+ }
1556
+ else {
1557
+ if (!this.isRowSelectable(rowData, event.rowIndex)) {
1558
+ return;
1559
+ }
1560
+ this._selection = this.selection ? [...this.selection, rowData] : [rowData];
1561
+ this.selectionChange.emit(this.selection);
1562
+ this.onRowSelect.emit({ originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'checkbox' });
1563
+ if (dataKeyValue) {
1564
+ this.selectionKeys[dataKeyValue] = 1;
1565
+ }
1566
+ }
1567
+ this.tableService.onSelectionChange();
1568
+ if (this.isStateful()) {
1569
+ this.saveState();
1570
+ }
1571
+ }
1572
+ toggleRowsWithCheckbox(event, check) {
1573
+ if (this._selectAll !== null) {
1574
+ this.selectAllChange.emit({ originalEvent: event, checked: check });
1575
+ }
1576
+ else {
1577
+ const data = this.selectionPageOnly ? this.dataToRender(this.processedData) : this.processedData;
1578
+ let selection = this.selectionPageOnly && this._selection ? this._selection.filter((s) => !data.some((d) => this.equals(s, d))) : [];
1579
+ if (check) {
1580
+ selection = this.frozenValue ? [...selection, ...this.frozenValue, ...data] : [...selection, ...data];
1581
+ selection = this.rowSelectable ? selection.filter((data, index) => this.rowSelectable({ data, index })) : selection;
1582
+ }
1583
+ this._selection = selection;
1584
+ this.preventSelectionSetterPropagation = true;
1585
+ this.updateSelectionKeys();
1586
+ this.selectionChange.emit(this._selection);
1587
+ this.tableService.onSelectionChange();
1588
+ this.onHeaderCheckboxToggle.emit({ originalEvent: event, checked: check });
1589
+ if (this.isStateful()) {
1590
+ this.saveState();
1591
+ }
1592
+ }
1593
+ }
1594
+ equals(data1, data2) {
1595
+ return this.compareSelectionBy === 'equals' ? data1 === data2 : ObjectUtils.equals(data1, data2, this.dataKey);
1596
+ }
1597
+ /* Legacy Filtering for custom elements */
1598
+ filter(value, field, matchMode) {
1599
+ if (this.filterTimeout) {
1600
+ clearTimeout(this.filterTimeout);
1601
+ }
1602
+ if (!this.isFilterBlank(value)) {
1603
+ this.filters[field] = { value: value, matchMode: matchMode };
1604
+ }
1605
+ else if (this.filters[field]) {
1606
+ delete this.filters[field];
1607
+ }
1608
+ this.filterTimeout = setTimeout(() => {
1609
+ this._filter();
1610
+ this.filterTimeout = null;
1611
+ }, this.filterDelay);
1612
+ this.anchorRowIndex = null;
1613
+ }
1614
+ filterGlobal(value, matchMode) {
1615
+ this.filter(value, 'global', matchMode);
1616
+ }
1617
+ isFilterBlank(filter) {
1618
+ if (filter !== null && filter !== undefined) {
1619
+ if ((typeof filter === 'string' && filter.trim().length == 0) || (Array.isArray(filter) && filter.length == 0))
1620
+ return true;
1621
+ else
1622
+ return false;
1623
+ }
1624
+ return true;
1625
+ }
1626
+ _filter() {
1627
+ if (this.filterType === 'custom') {
1628
+ this.onFilter.emit({
1629
+ filters: Object.fromEntries(Object.entries(this.filters).filter(([_, value]) => value && value?.matchMode !== null))
1630
+ });
1631
+ }
1632
+ else {
1633
+ if (!this.restoringFilter) {
1634
+ this.first = 0;
1635
+ this.firstChange.emit(this.first);
1636
+ }
1637
+ if (this.lazy) {
1638
+ this.onLazyLoad.emit(this.createLazyLoadMetadata());
1639
+ }
1640
+ else {
1641
+ if (!this.value) {
1642
+ return;
1643
+ }
1644
+ if (!this.hasFilter()) {
1645
+ this.filteredValue = null;
1646
+ if (this.paginator) {
1647
+ this.totalRecords = this.value ? this.value.length : 0;
1648
+ }
1649
+ }
1650
+ else {
1651
+ let globalFilterFieldsArray;
1652
+ if (this.filters['global']) {
1653
+ if (!this.columns && !this.globalFilterFields)
1654
+ throw new Error('Global filtering requires dynamic columns or globalFilterFields to be defined.');
1655
+ else
1656
+ globalFilterFieldsArray = this.globalFilterFields || this.columns;
1657
+ }
1658
+ this.filteredValue = [];
1659
+ for (let i = 0; i < this.value.length; i++) {
1660
+ let localMatch = true;
1661
+ let globalMatch = false;
1662
+ let localFiltered = false;
1663
+ for (let prop in this.filters) {
1664
+ if (this.filters.hasOwnProperty(prop) && prop !== 'global') {
1665
+ localFiltered = true;
1666
+ let filterField = prop;
1667
+ let filterMeta = this.filters[filterField];
1668
+ if (Array.isArray(filterMeta)) {
1669
+ for (let meta of filterMeta) {
1670
+ localMatch = this.executeLocalFilter(filterField, this.value[i], meta);
1671
+ if ((meta.operator === FilterOperator.OR && localMatch) || (meta.operator === FilterOperator.AND && !localMatch)) {
1672
+ break;
1673
+ }
1674
+ }
1675
+ }
1676
+ else {
1677
+ localMatch = this.executeLocalFilter(filterField, this.value[i], filterMeta);
1678
+ }
1679
+ if (!localMatch) {
1680
+ break;
1681
+ }
1682
+ }
1683
+ }
1684
+ if (this.filters['global'] && !globalMatch && globalFilterFieldsArray) {
1685
+ for (let j = 0; j < globalFilterFieldsArray.length; j++) {
1686
+ let globalFilterField = globalFilterFieldsArray[j].field || globalFilterFieldsArray[j];
1687
+ globalMatch = this.filterService.filters[this.filters['global'].matchMode](ObjectUtils.resolveFieldData(this.value[i], globalFilterField), this.filters['global'].value, this.filterLocale);
1688
+ if (globalMatch) {
1689
+ break;
1690
+ }
1691
+ }
1692
+ }
1693
+ let matches;
1694
+ if (this.filters['global']) {
1695
+ matches = localFiltered ? localFiltered && localMatch && globalMatch : globalMatch;
1696
+ }
1697
+ else {
1698
+ matches = localFiltered && localMatch;
1699
+ }
1700
+ if (matches) {
1701
+ this.filteredValue.push(this.value[i]);
1702
+ }
1703
+ }
1704
+ if (this.filteredValue.length === this.value.length) {
1705
+ this.filteredValue = null;
1706
+ }
1707
+ if (this.paginator) {
1708
+ this.totalRecords = this.filteredValue ? this.filteredValue.length : this.value ? this.value.length : 0;
1709
+ }
1710
+ }
1711
+ }
1712
+ this.onFilter.emit({
1713
+ filters: this.filters,
1714
+ filteredValue: this.filteredValue || this.value
1715
+ });
1716
+ this.tableService.onValueChange(this.value);
1717
+ if (this.isStateful() && !this.restoringFilter) {
1718
+ this.saveState();
1719
+ }
1720
+ if (this.restoringFilter) {
1721
+ this.restoringFilter = false;
1722
+ }
1723
+ }
1724
+ this.cd.markForCheck();
1725
+ if (this.scrollable) {
1726
+ this.resetScrollTop();
1727
+ }
1728
+ }
1729
+ executeLocalFilter(field, rowData, filterMeta) {
1730
+ let filterValue = filterMeta.value;
1731
+ let filterMatchMode = filterMeta.matchMode || FilterMatchMode.STARTS_WITH;
1732
+ let dataFieldValue = ObjectUtils.resolveFieldData(rowData, field);
1733
+ let filterConstraint = this.filterService.filters[filterMatchMode];
1734
+ return filterConstraint(dataFieldValue, filterValue, this.filterLocale);
1735
+ }
1736
+ hasFilter() {
1737
+ let empty = true;
1738
+ for (let prop in this.filters) {
1739
+ if (this.filters.hasOwnProperty(prop)) {
1740
+ empty = false;
1741
+ break;
1742
+ }
1743
+ }
1744
+ return !empty;
1745
+ }
1746
+ createLazyLoadMetadata() {
1747
+ return {
1748
+ first: this.first,
1749
+ rows: this.rows,
1750
+ sortField: this.sortField,
1751
+ sortOrder: this.sortOrder,
1752
+ filters: this.filters,
1753
+ globalFilter: this.filters && this.filters['global'] ? this.filters['global'].value : null,
1754
+ multiSortMeta: this.multiSortMeta,
1755
+ forceUpdate: () => this.cd.detectChanges()
1756
+ };
1757
+ }
1758
+ clear() {
1759
+ this._sortField = null;
1760
+ this._sortOrder = this.defaultSortOrder;
1761
+ this._multiSortMeta = null;
1762
+ this.tableService.onSort(null);
1763
+ this.clearFilterValues();
1764
+ this.filteredValue = null;
1765
+ this.first = 0;
1766
+ this.firstChange.emit(this.first);
1767
+ if (this.lazy) {
1768
+ this.onLazyLoad.emit(this.createLazyLoadMetadata());
1769
+ }
1770
+ else {
1771
+ this.totalRecords = this._value ? this._value.length : 0;
1772
+ }
1773
+ }
1774
+ clearFilterValues() {
1775
+ for (const [, filterMetadata] of Object.entries(this.filters)) {
1776
+ if (Array.isArray(filterMetadata)) {
1777
+ for (let filter of filterMetadata) {
1778
+ filter.value = null;
1779
+ }
1780
+ }
1781
+ else if (filterMetadata) {
1782
+ filterMetadata.value = null;
1783
+ }
1784
+ }
1785
+ }
1786
+ reset() {
1787
+ this.clear();
1788
+ }
1789
+ getExportHeader(column) {
1790
+ return column[this.exportHeader] || column.header || column.field;
1791
+ }
1792
+ /**
1793
+ * Data export method.
1794
+ * @param {ExportCSVOptions} object - Export options.
1795
+ * @group Method
1796
+ */
1797
+ exportCSV(options) {
1798
+ let data;
1799
+ let csv = '';
1800
+ let columns = this.columns;
1801
+ if (options && options.selectionOnly) {
1802
+ data = this.selection || [];
1803
+ }
1804
+ else if (options && options.allValues) {
1805
+ data = this.value || [];
1806
+ }
1807
+ else {
1808
+ data = this.filteredValue || this.value;
1809
+ if (this.frozenValue) {
1810
+ data = data ? [...this.frozenValue, ...data] : this.frozenValue;
1811
+ }
1812
+ }
1813
+ const exportableColumns = columns.filter((column) => column.exportable !== false && column.field);
1814
+ //headers
1815
+ csv += exportableColumns.map((column) => '"' + this.getExportHeader(column) + '"').join(this.csvSeparator);
1816
+ //body
1817
+ const body = data
1818
+ .map((record) => exportableColumns
1819
+ .map((column) => {
1820
+ let cellData = ObjectUtils.resolveFieldData(record, column.field);
1821
+ if (cellData != null) {
1822
+ if (this.exportFunction) {
1823
+ cellData = this.exportFunction({
1824
+ data: cellData,
1825
+ field: column.field
1826
+ });
1827
+ }
1828
+ else
1829
+ cellData = String(cellData).replace(/"/g, '""');
1830
+ }
1831
+ else
1832
+ cellData = '';
1833
+ return '"' + cellData + '"';
1834
+ })
1835
+ .join(this.csvSeparator))
1836
+ .join('\n');
1837
+ if (body.length) {
1838
+ csv += '\n' + body;
1839
+ }
1840
+ let blob = new Blob([new Uint8Array([0xef, 0xbb, 0xbf]), csv], {
1841
+ type: 'text/csv;charset=utf-8;'
1842
+ });
1843
+ let link = this.renderer.createElement('a');
1844
+ link.style.display = 'none';
1845
+ this.renderer.appendChild(this.document.body, link);
1846
+ if (link.download !== undefined) {
1847
+ link.setAttribute('href', URL.createObjectURL(blob));
1848
+ link.setAttribute('download', this.exportFilename + '.csv');
1849
+ link.click();
1850
+ }
1851
+ else {
1852
+ csv = 'data:text/csv;charset=utf-8,' + csv;
1853
+ this.window.open(encodeURI(csv));
1854
+ }
1855
+ this.renderer.removeChild(this.document.body, link);
1856
+ }
1857
+ onLazyItemLoad(event) {
1858
+ this.onLazyLoad.emit({
1859
+ ...this.createLazyLoadMetadata(),
1860
+ ...event,
1861
+ rows: event.last - event.first
1862
+ });
1863
+ }
1864
+ /**
1865
+ * Resets scroll to top.
1866
+ * @group Method
1867
+ */
1868
+ resetScrollTop() {
1869
+ if (this.virtualScroll)
1870
+ this.scrollToVirtualIndex(0);
1871
+ else
1872
+ this.scrollTo({ top: 0 });
1873
+ }
1874
+ /**
1875
+ * Scrolls to given index when using virtual scroll.
1876
+ * @param {number} index - index of the element.
1877
+ * @group Method
1878
+ */
1879
+ scrollToVirtualIndex(index) {
1880
+ this.scroller && this.scroller.scrollToIndex(index);
1881
+ }
1882
+ /**
1883
+ * Scrolls to given index.
1884
+ * @param {ScrollToOptions} options - scroll options.
1885
+ * @group Method
1886
+ */
1887
+ scrollTo(options) {
1888
+ if (this.virtualScroll) {
1889
+ this.scroller?.scrollTo(options);
1890
+ }
1891
+ else if (this.wrapperViewChild && this.wrapperViewChild.nativeElement) {
1892
+ if (this.wrapperViewChild.nativeElement.scrollTo) {
1893
+ this.wrapperViewChild.nativeElement.scrollTo(options);
1894
+ }
1895
+ else {
1896
+ this.wrapperViewChild.nativeElement.scrollLeft = options.left;
1897
+ this.wrapperViewChild.nativeElement.scrollTop = options.top;
1898
+ }
1899
+ }
1900
+ }
1901
+ updateEditingCell(cell, data, field, index) {
1902
+ this.editingCell = cell;
1903
+ this.editingCellData = data;
1904
+ this.editingCellField = field;
1905
+ this.editingCellRowIndex = index;
1906
+ this.bindDocumentEditListener();
1907
+ }
1908
+ isEditingCellValid() {
1909
+ return this.editingCell && DomHandler.find(this.editingCell, '.ng-invalid.ng-dirty').length === 0;
1910
+ }
1911
+ bindDocumentEditListener() {
1912
+ if (!this.documentEditListener) {
1913
+ this.documentEditListener = this.renderer.listen(this.document, 'click', (event) => {
1914
+ if (this.editingCell && !this.selfClick && this.isEditingCellValid()) {
1915
+ DomHandler.removeClass(this.editingCell, 'cax-cell-editing');
1916
+ this.editingCell = null;
1917
+ this.onEditComplete.emit({ field: this.editingCellField, data: this.editingCellData, originalEvent: event, index: this.editingCellRowIndex });
1918
+ this.editingCellField = null;
1919
+ this.editingCellData = null;
1920
+ this.editingCellRowIndex = null;
1921
+ this.unbindDocumentEditListener();
1922
+ this.cd.markForCheck();
1923
+ if (this.overlaySubscription) {
1924
+ this.overlaySubscription.unsubscribe();
1925
+ }
1926
+ }
1927
+ this.selfClick = false;
1928
+ });
1929
+ }
1930
+ }
1931
+ unbindDocumentEditListener() {
1932
+ if (this.documentEditListener) {
1933
+ this.documentEditListener();
1934
+ this.documentEditListener = null;
1935
+ }
1936
+ }
1937
+ initRowEdit(rowData) {
1938
+ let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey));
1939
+ this.editingRowKeys[dataKeyValue] = true;
1940
+ }
1941
+ saveRowEdit(rowData, rowElement) {
1942
+ if (DomHandler.find(rowElement, '.ng-invalid.ng-dirty').length === 0) {
1943
+ let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey));
1944
+ delete this.editingRowKeys[dataKeyValue];
1945
+ }
1946
+ }
1947
+ cancelRowEdit(rowData) {
1948
+ let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey));
1949
+ delete this.editingRowKeys[dataKeyValue];
1950
+ }
1951
+ toggleRow(rowData, event) {
1952
+ if (!this.dataKey && !this.groupRowsBy) {
1953
+ throw new Error('dataKey or groupRowsBy must be defined to use row expansion');
1954
+ }
1955
+ let dataKeyValue = this.groupRowsBy ? String(ObjectUtils.resolveFieldData(rowData, this.groupRowsBy)) : String(ObjectUtils.resolveFieldData(rowData, this.dataKey));
1956
+ if (this.expandedRowKeys[dataKeyValue] != null) {
1957
+ delete this.expandedRowKeys[dataKeyValue];
1958
+ this.onRowCollapse.emit({
1959
+ originalEvent: event,
1960
+ data: rowData
1961
+ });
1962
+ }
1963
+ else {
1964
+ if (this.rowExpandMode === 'single') {
1965
+ this.expandedRowKeys = {};
1966
+ }
1967
+ this.expandedRowKeys[dataKeyValue] = true;
1968
+ this.onRowExpand.emit({
1969
+ originalEvent: event,
1970
+ data: rowData
1971
+ });
1972
+ }
1973
+ if (event) {
1974
+ event.preventDefault();
1975
+ }
1976
+ if (this.isStateful()) {
1977
+ this.saveState();
1978
+ }
1979
+ }
1980
+ isRowExpanded(rowData) {
1981
+ return this.groupRowsBy ? this.expandedRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.groupRowsBy))] === true : this.expandedRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] === true;
1982
+ }
1983
+ isRowEditing(rowData) {
1984
+ return this.editingRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] === true;
1985
+ }
1986
+ isSingleSelectionMode() {
1987
+ return this.selectionMode === 'single';
1988
+ }
1989
+ isMultipleSelectionMode() {
1990
+ return this.selectionMode === 'multiple';
1991
+ }
1992
+ onColumnResizeBegin(event) {
1993
+ let containerLeft = DomHandler.getOffset(this.containerViewChild?.nativeElement).left;
1994
+ this.resizeColumnElement = event.target.parentElement;
1995
+ this.columnResizing = true;
1996
+ if (event.type == 'touchstart') {
1997
+ this.lastResizerHelperX = event.changedTouches[0].clientX - containerLeft + this.containerViewChild?.nativeElement.scrollLeft;
1998
+ }
1999
+ else {
2000
+ this.lastResizerHelperX = event.pageX - containerLeft + this.containerViewChild?.nativeElement.scrollLeft;
2001
+ }
2002
+ this.onColumnResize(event);
2003
+ event.preventDefault();
2004
+ }
2005
+ onColumnResize(event) {
2006
+ let containerLeft = DomHandler.getOffset(this.containerViewChild?.nativeElement).left;
2007
+ DomHandler.addClass(this.containerViewChild?.nativeElement, 'cax-unselectable-text');
2008
+ this.resizeHelperViewChild.nativeElement.style.height = this.containerViewChild?.nativeElement.offsetHeight + 'px';
2009
+ this.resizeHelperViewChild.nativeElement.style.top = 0 + 'px';
2010
+ if (event.type == 'touchmove') {
2011
+ this.resizeHelperViewChild.nativeElement.style.left = event.changedTouches[0].clientX - containerLeft + this.containerViewChild?.nativeElement.scrollLeft + 'px';
2012
+ }
2013
+ else {
2014
+ this.resizeHelperViewChild.nativeElement.style.left = event.pageX - containerLeft + this.containerViewChild?.nativeElement.scrollLeft + 'px';
2015
+ }
2016
+ this.resizeHelperViewChild.nativeElement.style.display = 'block';
2017
+ }
2018
+ onColumnResizeEnd() {
2019
+ let delta = this.resizeHelperViewChild?.nativeElement.offsetLeft - this.lastResizerHelperX;
2020
+ let columnWidth = this.resizeColumnElement.offsetWidth;
2021
+ let newColumnWidth = columnWidth + delta;
2022
+ let minWidth = this.resizeColumnElement.style.minWidth.replace(/[^\d.]/g, '') || 15;
2023
+ if (newColumnWidth >= minWidth) {
2024
+ if (this.columnResizeMode === 'fit') {
2025
+ let nextColumn = this.resizeColumnElement.nextElementSibling;
2026
+ let nextColumnWidth = nextColumn.offsetWidth - delta;
2027
+ if (newColumnWidth > 15 && nextColumnWidth > 15) {
2028
+ this.resizeTableCells(newColumnWidth, nextColumnWidth);
2029
+ }
2030
+ }
2031
+ else if (this.columnResizeMode === 'expand') {
2032
+ this._initialColWidths = this._totalTableWidth();
2033
+ let tableWidth = this.tableViewChild?.nativeElement.offsetWidth + delta;
2034
+ this.setResizeTableWidth(tableWidth + 'px');
2035
+ this.resizeTableCells(newColumnWidth, null);
2036
+ }
2037
+ this.onColResize.emit({
2038
+ element: this.resizeColumnElement,
2039
+ delta: delta
2040
+ });
2041
+ if (this.isStateful()) {
2042
+ this.saveState();
2043
+ }
2044
+ }
2045
+ this.resizeHelperViewChild.nativeElement.style.display = 'none';
2046
+ DomHandler.removeClass(this.containerViewChild?.nativeElement, 'cax-unselectable-text');
2047
+ }
2048
+ _totalTableWidth() {
2049
+ let widths = [];
2050
+ const tableHead = DomHandler.findSingle(this.containerViewChild.nativeElement, '.cax-datatable-thead');
2051
+ let headers = DomHandler.find(tableHead, 'tr > th');
2052
+ headers.forEach((header) => widths.push(DomHandler.getOuterWidth(header)));
2053
+ return widths;
2054
+ }
2055
+ onColumnDragStart(event, columnElement) {
2056
+ this.reorderIconWidth = DomHandler.getHiddenElementOuterWidth(this.reorderIndicatorUpViewChild?.nativeElement);
2057
+ this.reorderIconHeight = DomHandler.getHiddenElementOuterHeight(this.reorderIndicatorDownViewChild?.nativeElement);
2058
+ this.draggedColumn = columnElement;
2059
+ event.dataTransfer.setData('text', 'b'); // For firefox
2060
+ }
2061
+ onColumnDragEnter(event, dropHeader) {
2062
+ if (this.reorderableColumns && this.draggedColumn && dropHeader) {
2063
+ event.preventDefault();
2064
+ let containerOffset = DomHandler.getOffset(this.containerViewChild?.nativeElement);
2065
+ let dropHeaderOffset = DomHandler.getOffset(dropHeader);
2066
+ if (this.draggedColumn != dropHeader) {
2067
+ let dragIndex = DomHandler.indexWithinGroup(this.draggedColumn, 'caxreorderablecolumn');
2068
+ let dropIndex = DomHandler.indexWithinGroup(dropHeader, 'caxreorderablecolumn');
2069
+ let targetLeft = dropHeaderOffset.left - containerOffset.left;
2070
+ let targetTop = containerOffset.top - dropHeaderOffset.top;
2071
+ let columnCenter = dropHeaderOffset.left + dropHeader.offsetWidth / 2;
2072
+ this.reorderIndicatorUpViewChild.nativeElement.style.top = dropHeaderOffset.top - containerOffset.top - (this.reorderIconHeight - 1) + 'px';
2073
+ this.reorderIndicatorDownViewChild.nativeElement.style.top = dropHeaderOffset.top - containerOffset.top + dropHeader.offsetHeight + 'px';
2074
+ if (event.pageX > columnCenter) {
2075
+ this.reorderIndicatorUpViewChild.nativeElement.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2) + 'px';
2076
+ this.reorderIndicatorDownViewChild.nativeElement.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2) + 'px';
2077
+ this.dropPosition = 1;
2078
+ }
2079
+ else {
2080
+ this.reorderIndicatorUpViewChild.nativeElement.style.left = targetLeft - Math.ceil(this.reorderIconWidth / 2) + 'px';
2081
+ this.reorderIndicatorDownViewChild.nativeElement.style.left = targetLeft - Math.ceil(this.reorderIconWidth / 2) + 'px';
2082
+ this.dropPosition = -1;
2083
+ }
2084
+ this.reorderIndicatorUpViewChild.nativeElement.style.display = 'block';
2085
+ this.reorderIndicatorDownViewChild.nativeElement.style.display = 'block';
2086
+ }
2087
+ else {
2088
+ event.dataTransfer.dropEffect = 'none';
2089
+ }
2090
+ }
2091
+ }
2092
+ onColumnDragLeave(event) {
2093
+ if (this.reorderableColumns && this.draggedColumn) {
2094
+ event.preventDefault();
2095
+ }
2096
+ }
2097
+ onColumnDrop(event, dropColumn) {
2098
+ event.preventDefault();
2099
+ if (this.draggedColumn) {
2100
+ let dragIndex = DomHandler.indexWithinGroup(this.draggedColumn, 'caxreorderablecolumn');
2101
+ let dropIndex = DomHandler.indexWithinGroup(dropColumn, 'caxreorderablecolumn');
2102
+ let allowDrop = dragIndex != dropIndex;
2103
+ if (allowDrop && ((dropIndex - dragIndex == 1 && this.dropPosition === -1) || (dragIndex - dropIndex == 1 && this.dropPosition === 1))) {
2104
+ allowDrop = false;
2105
+ }
2106
+ if (allowDrop && dropIndex < dragIndex && this.dropPosition === 1) {
2107
+ dropIndex = dropIndex + 1;
2108
+ }
2109
+ if (allowDrop && dropIndex > dragIndex && this.dropPosition === -1) {
2110
+ dropIndex = dropIndex - 1;
2111
+ }
2112
+ if (allowDrop) {
2113
+ ObjectUtils.reorderArray(this.columns, dragIndex, dropIndex);
2114
+ this.onColReorder.emit({
2115
+ dragIndex: dragIndex,
2116
+ dropIndex: dropIndex,
2117
+ columns: this.columns
2118
+ });
2119
+ if (this.isStateful()) {
2120
+ this.zone.runOutsideAngular(() => {
2121
+ setTimeout(() => {
2122
+ this.saveState();
2123
+ });
2124
+ });
2125
+ }
2126
+ }
2127
+ if (this.resizableColumns && this.resizeColumnElement) {
2128
+ let width = this.columnResizeMode === 'expand' ? this._initialColWidths : this._totalTableWidth();
2129
+ ObjectUtils.reorderArray(width, dragIndex + 1, dropIndex + 1);
2130
+ this.updateStyleElement(width, dragIndex, null, null);
2131
+ }
2132
+ this.reorderIndicatorUpViewChild.nativeElement.style.display = 'none';
2133
+ this.reorderIndicatorDownViewChild.nativeElement.style.display = 'none';
2134
+ this.draggedColumn.draggable = false;
2135
+ this.draggedColumn = null;
2136
+ this.dropPosition = null;
2137
+ }
2138
+ }
2139
+ resizeTableCells(newColumnWidth, nextColumnWidth) {
2140
+ let colIndex = DomHandler.index(this.resizeColumnElement);
2141
+ let width = this.columnResizeMode === 'expand' ? this._initialColWidths : this._totalTableWidth();
2142
+ this.updateStyleElement(width, colIndex, newColumnWidth, nextColumnWidth);
2143
+ }
2144
+ updateStyleElement(width, colIndex, newColumnWidth, nextColumnWidth) {
2145
+ this.destroyStyleElement();
2146
+ this.createStyleElement();
2147
+ let innerHTML = '';
2148
+ width.forEach((width, index) => {
2149
+ let colWidth = index === colIndex ? newColumnWidth : nextColumnWidth && index === colIndex + 1 ? nextColumnWidth : width;
2150
+ let style = `width: ${colWidth}px !important; max-width: ${colWidth}px !important;`;
2151
+ innerHTML += `
2152
+ #${this.id}-table > .cax-datatable-thead > tr > th:nth-child(${index + 1}),
2153
+ #${this.id}-table > .cax-datatable-tbody > tr > td:nth-child(${index + 1}),
2154
+ #${this.id}-table > .cax-datatable-tfoot > tr > td:nth-child(${index + 1}) {
2155
+ ${style}
2156
+ }
2157
+ `;
2158
+ });
2159
+ this.renderer.setProperty(this.styleElement, 'innerHTML', this.domSanitizer.bypassSecurityTrustStyle(innerHTML));
2160
+ }
2161
+ onRowDragStart(event, index) {
2162
+ this.rowDragging = true;
2163
+ this.draggedRowIndex = index;
2164
+ event.dataTransfer.setData('text', 'b'); // For firefox
2165
+ }
2166
+ onRowDragOver(event, index, rowElement) {
2167
+ if (this.rowDragging && this.draggedRowIndex !== index) {
2168
+ let rowY = DomHandler.getOffset(rowElement).top;
2169
+ let pageY = event.pageY;
2170
+ let rowMidY = rowY + DomHandler.getOuterHeight(rowElement) / 2;
2171
+ let prevRowElement = rowElement.previousElementSibling;
2172
+ if (pageY < rowMidY) {
2173
+ DomHandler.removeClass(rowElement, 'cax-datatable-dragpoint-bottom');
2174
+ this.droppedRowIndex = index;
2175
+ if (prevRowElement)
2176
+ DomHandler.addClass(prevRowElement, 'cax-datatable-dragpoint-bottom');
2177
+ else
2178
+ DomHandler.addClass(rowElement, 'cax-datatable-dragpoint-top');
2179
+ }
2180
+ else {
2181
+ if (prevRowElement)
2182
+ DomHandler.removeClass(prevRowElement, 'cax-datatable-dragpoint-bottom');
2183
+ else
2184
+ DomHandler.addClass(rowElement, 'cax-datatable-dragpoint-top');
2185
+ this.droppedRowIndex = index + 1;
2186
+ DomHandler.addClass(rowElement, 'cax-datatable-dragpoint-bottom');
2187
+ }
2188
+ }
2189
+ }
2190
+ onRowDragLeave(event, rowElement) {
2191
+ let prevRowElement = rowElement.previousElementSibling;
2192
+ if (prevRowElement) {
2193
+ DomHandler.removeClass(prevRowElement, 'cax-datatable-dragpoint-bottom');
2194
+ }
2195
+ DomHandler.removeClass(rowElement, 'cax-datatable-dragpoint-bottom');
2196
+ DomHandler.removeClass(rowElement, 'cax-datatable-dragpoint-top');
2197
+ }
2198
+ onRowDragEnd(event) {
2199
+ this.rowDragging = false;
2200
+ this.draggedRowIndex = null;
2201
+ this.droppedRowIndex = null;
2202
+ }
2203
+ onRowDrop(event, rowElement) {
2204
+ if (this.droppedRowIndex != null) {
2205
+ let dropIndex = this.draggedRowIndex > this.droppedRowIndex ? this.droppedRowIndex : this.droppedRowIndex === 0 ? 0 : this.droppedRowIndex - 1;
2206
+ ObjectUtils.reorderArray(this.value, this.draggedRowIndex, dropIndex);
2207
+ if (this.virtualScroll) {
2208
+ // TODO: Check
2209
+ this._value = [...this._value];
2210
+ }
2211
+ this.onRowReorder.emit({
2212
+ dragIndex: this.draggedRowIndex,
2213
+ dropIndex: dropIndex
2214
+ });
2215
+ }
2216
+ //cleanup
2217
+ this.onRowDragLeave(event, rowElement);
2218
+ this.onRowDragEnd(event);
2219
+ }
2220
+ isEmpty() {
2221
+ let data = this.filteredValue || this.value;
2222
+ return data == null || data.length == 0;
2223
+ }
2224
+ getBlockableElement() {
2225
+ return this.el.nativeElement.children[0];
2226
+ }
2227
+ getStorage() {
2228
+ if (isPlatformBrowser(this.platformId)) {
2229
+ switch (this.stateStorage) {
2230
+ case 'local':
2231
+ return window.localStorage;
2232
+ case 'session':
2233
+ return window.sessionStorage;
2234
+ default:
2235
+ throw new Error(this.stateStorage + ' is not a valid value for the state storage, supported values are "local" and "session".');
2236
+ }
2237
+ }
2238
+ else {
2239
+ throw new Error('Browser storage is not available in the server side.');
2240
+ }
2241
+ }
2242
+ isStateful() {
2243
+ return this.stateKey != null;
2244
+ }
2245
+ saveState() {
2246
+ const storage = this.getStorage();
2247
+ let state = {};
2248
+ if (this.paginator) {
2249
+ state.first = this.first;
2250
+ state.rows = this.rows;
2251
+ }
2252
+ if (this.sortField) {
2253
+ state.sortField = this.sortField;
2254
+ state.sortOrder = this.sortOrder;
2255
+ }
2256
+ if (this.multiSortMeta) {
2257
+ state.multiSortMeta = this.multiSortMeta;
2258
+ }
2259
+ if (this.hasFilter()) {
2260
+ state.filters = this.filters;
2261
+ }
2262
+ if (this.resizableColumns) {
2263
+ this.saveColumnWidths(state);
2264
+ }
2265
+ if (this.reorderableColumns) {
2266
+ this.saveColumnOrder(state);
2267
+ }
2268
+ if (this.selection) {
2269
+ state.selection = this.selection;
2270
+ }
2271
+ if (Object.keys(this.expandedRowKeys).length) {
2272
+ state.expandedRowKeys = this.expandedRowKeys;
2273
+ }
2274
+ storage.setItem(this.stateKey, JSON.stringify(state));
2275
+ this.onStateSave.emit(state);
2276
+ }
2277
+ clearState() {
2278
+ const storage = this.getStorage();
2279
+ if (this.stateKey) {
2280
+ storage.removeItem(this.stateKey);
2281
+ }
2282
+ }
2283
+ restoreState() {
2284
+ const storage = this.getStorage();
2285
+ const stateString = storage.getItem(this.stateKey);
2286
+ const dateFormat = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/;
2287
+ const reviver = function (key, value) {
2288
+ if (typeof value === 'string' && dateFormat.test(value)) {
2289
+ return new Date(value);
2290
+ }
2291
+ return value;
2292
+ };
2293
+ if (stateString) {
2294
+ let state = JSON.parse(stateString, reviver);
2295
+ if (this.paginator) {
2296
+ if (this.first !== undefined) {
2297
+ this.first = state.first;
2298
+ this.firstChange.emit(this.first);
2299
+ }
2300
+ if (this.rows !== undefined) {
2301
+ this.rows = state.rows;
2302
+ this.rowsChange.emit(this.rows);
2303
+ }
2304
+ }
2305
+ if (state.sortField) {
2306
+ this.restoringSort = true;
2307
+ this._sortField = state.sortField;
2308
+ this._sortOrder = state.sortOrder;
2309
+ }
2310
+ if (state.multiSortMeta) {
2311
+ this.restoringSort = true;
2312
+ this._multiSortMeta = state.multiSortMeta;
2313
+ }
2314
+ if (state.filters) {
2315
+ this.restoringFilter = true;
2316
+ this.filters = state.filters;
2317
+ }
2318
+ if (this.resizableColumns) {
2319
+ this.columnWidthsState = state.columnWidths;
2320
+ this.tableWidthState = state.tableWidth;
2321
+ }
2322
+ // if (this.reorderableColumns) {
2323
+ // this.restoreColumnOrder();
2324
+ // }
2325
+ if (state.expandedRowKeys) {
2326
+ this.expandedRowKeys = state.expandedRowKeys;
2327
+ }
2328
+ if (state.selection) {
2329
+ Promise.resolve(null).then(() => this.selectionChange.emit(state.selection));
2330
+ }
2331
+ this.stateRestored = true;
2332
+ this.onStateRestore.emit(state);
2333
+ }
2334
+ }
2335
+ saveColumnWidths(state) {
2336
+ let widths = [];
2337
+ let headers = [];
2338
+ const container = this.containerViewChild?.nativeElement;
2339
+ if (container) {
2340
+ headers = DomHandler.find(container, '.cax-datatable-thead > tr > th');
2341
+ }
2342
+ headers.forEach((header) => widths.push(DomHandler.getOuterWidth(header)));
2343
+ state.columnWidths = widths.join(',');
2344
+ if (this.columnResizeMode === 'expand') {
2345
+ state.tableWidth = DomHandler.getOuterWidth(this.tableViewChild?.nativeElement);
2346
+ }
2347
+ }
2348
+ setResizeTableWidth(width) {
2349
+ this.tableViewChild.nativeElement.style.width = width;
2350
+ this.tableViewChild.nativeElement.style.minWidth = width;
2351
+ }
2352
+ restoreColumnWidths() {
2353
+ if (this.columnWidthsState) {
2354
+ let widths = this.columnWidthsState.split(',');
2355
+ if (this.columnResizeMode === 'expand' && this.tableWidthState) {
2356
+ this.setResizeTableWidth(this.tableWidthState + 'px');
2357
+ }
2358
+ if (ObjectUtils.isNotEmpty(widths)) {
2359
+ this.createStyleElement();
2360
+ let innerHTML = '';
2361
+ widths.forEach((width, index) => {
2362
+ let style = `width: ${width}px !important; max-width: ${width}px !important`;
2363
+ innerHTML += `
2364
+ #${this.id}-table > .cax-datatable-thead > tr > th:nth-child(${index + 1}),
2365
+ #${this.id}-table > .cax-datatable-tbody > tr > td:nth-child(${index + 1}),
2366
+ #${this.id}-table > .cax-datatable-tfoot > tr > td:nth-child(${index + 1}) {
2367
+ ${style}
2368
+ }
2369
+ `;
2370
+ });
2371
+ this.styleElement.textContent = innerHTML;
2372
+ }
2373
+ }
2374
+ }
2375
+ saveColumnOrder(state) {
2376
+ if (this.columns) {
2377
+ let columnOrder = [];
2378
+ this.columns.map((column) => {
2379
+ columnOrder.push(column.field || column.key);
2380
+ });
2381
+ state.columnOrder = columnOrder;
2382
+ }
2383
+ }
2384
+ restoreColumnOrder() {
2385
+ const storage = this.getStorage();
2386
+ const stateString = storage.getItem(this.stateKey);
2387
+ if (stateString) {
2388
+ let state = JSON.parse(stateString);
2389
+ let columnOrder = state.columnOrder;
2390
+ if (columnOrder) {
2391
+ let reorderedColumns = [];
2392
+ columnOrder.map((key) => {
2393
+ let col = this.findColumnByKey(key);
2394
+ if (col) {
2395
+ reorderedColumns.push(col);
2396
+ }
2397
+ });
2398
+ this.columnOrderStateRestored = true;
2399
+ this.columns = reorderedColumns;
2400
+ }
2401
+ }
2402
+ }
2403
+ findColumnByKey(key) {
2404
+ if (this.columns) {
2405
+ for (let col of this.columns) {
2406
+ if (col.key === key || col.field === key)
2407
+ return col;
2408
+ else
2409
+ continue;
2410
+ }
2411
+ }
2412
+ else {
2413
+ return null;
2414
+ }
2415
+ }
2416
+ createStyleElement() {
2417
+ this.styleElement = this.renderer.createElement('style');
2418
+ this.styleElement.type = 'text/css';
2419
+ DomHandler.setAttribute(this.styleElement, 'nonce', this.config?.csp()?.nonce);
2420
+ this.renderer.appendChild(this.document.head, this.styleElement);
2421
+ }
2422
+ getGroupRowsMeta() {
2423
+ return { field: this.groupRowsBy, order: this.groupRowsByOrder };
2424
+ }
2425
+ getTableClasses() {
2426
+ return {
2427
+ 'cax-datatable cax-component': true,
2428
+ 'cax-datatable-hoverable-rows': this.rowHover || this.selectionMode,
2429
+ 'cax-datatable-scrollable': this.scrollable,
2430
+ 'cax-datatable-flex-scrollable': this.scrollable && this.scrollHeight === 'flex',
2431
+ ['cax-datatable-font-' + this.fontSize]: true,
2432
+ ['cax-datatable-row-' + this.rowSize]: true
2433
+ };
2434
+ }
2435
+ createResponsiveStyle() {
2436
+ if (isPlatformBrowser(this.platformId)) {
2437
+ if (!this.responsiveStyleElement) {
2438
+ this.responsiveStyleElement = this.renderer.createElement('style');
2439
+ this.responsiveStyleElement.type = 'text/css';
2440
+ DomHandler.setAttribute(this.responsiveStyleElement, 'nonce', this.config?.csp()?.nonce);
2441
+ this.renderer.appendChild(this.document.head, this.responsiveStyleElement);
2442
+ let innerHTML = `
2443
+ @media screen and (max-width: ${this.breakpoint}) {
2444
+ #${this.id}-table > .cax-datatable-thead > tr > th,
2445
+ #${this.id}-table > .cax-datatable-tfoot > tr > td {
2446
+ display: none !important;
2447
+ }
2448
+
2449
+ #${this.id}-table > .cax-datatable-tbody > tr > td {
2450
+ display: flex;
2451
+ width: 100% !important;
2452
+ align-items: center;
2453
+ justify-content: space-between;
2454
+ }
2455
+
2456
+ #${this.id}-table > .cax-datatable-tbody > tr > td:not(:last-child) {
2457
+ border: 0 none;
2458
+ }
2459
+
2460
+ #${this.id}.cax-datatable-gridlines > .cax-datatable-wrapper > .cax-datatable-table > .cax-datatable-tbody > tr > td:last-child {
2461
+ border-top: 0;
2462
+ border-right: 0;
2463
+ border-left: 0;
2464
+ }
2465
+
2466
+ #${this.id}-table > .cax-datatable-tbody > tr > td > .cax-column-title {
2467
+ display: block;
2468
+ }
2469
+ }
2470
+ `;
2471
+ this.renderer.setProperty(this.responsiveStyleElement, 'innerHTML', this.domSanitizer.bypassSecurityTrustStyle(innerHTML));
2472
+ }
2473
+ }
2474
+ }
2475
+ destroyResponsiveStyle() {
2476
+ if (this.responsiveStyleElement) {
2477
+ this.renderer.removeChild(this.document.head, this.responsiveStyleElement);
2478
+ this.responsiveStyleElement = null;
2479
+ }
2480
+ }
2481
+ destroyStyleElement() {
2482
+ if (this.styleElement) {
2483
+ this.renderer.removeChild(this.document.head, this.styleElement);
2484
+ this.styleElement = null;
2485
+ }
2486
+ }
2487
+ ngOnDestroy() {
2488
+ this.unbindDocumentEditListener();
2489
+ this.editingCell = null;
2490
+ this.initialized = null;
2491
+ this.destroyStyleElement();
2492
+ this.destroyResponsiveStyle();
2493
+ }
2494
+ getPaginatorStyleClasses(className) {
2495
+ return [this.paginatorStyleClass, className]
2496
+ .filter((c) => !!c)
2497
+ .join(' ')
2498
+ .trim();
2499
+ }
2500
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: Table, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i1.TableService }, { token: i0.ChangeDetectorRef }, { token: i2.FilterService }, { token: i2.OverlayService }, { token: i2.caxConfig }, { token: i3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
2501
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.9", type: Table, isStandalone: true, selector: "cax-table", inputs: { fontSize: "fontSize", rowSize: "rowSize", frozenColumns: "frozenColumns", frozenValue: "frozenValue", style: "style", styleClass: "styleClass", tableStyle: "tableStyle", tableStyleClass: "tableStyleClass", paginator: ["paginator", "paginator", booleanAttribute], pageLinks: ["pageLinks", "pageLinks", numberAttribute], rowsPerPageOptions: "rowsPerPageOptions", alwaysShowPaginator: ["alwaysShowPaginator", "alwaysShowPaginator", booleanAttribute], paginatorPosition: "paginatorPosition", paginatorStyleClass: "paginatorStyleClass", paginatorDropdownAppendTo: "paginatorDropdownAppendTo", paginatorDropdownScrollHeight: "paginatorDropdownScrollHeight", currentPageReportTemplate: "currentPageReportTemplate", showCurrentPageReport: ["showCurrentPageReport", "showCurrentPageReport", booleanAttribute], showJumpToPageDropdown: ["showJumpToPageDropdown", "showJumpToPageDropdown", booleanAttribute], showJumpToPageInput: ["showJumpToPageInput", "showJumpToPageInput", booleanAttribute], showFirstLastIcon: ["showFirstLastIcon", "showFirstLastIcon", booleanAttribute], showPageLinks: ["showPageLinks", "showPageLinks", booleanAttribute], defaultSortOrder: ["defaultSortOrder", "defaultSortOrder", numberAttribute], filterType: "filterType", sortType: "sortType", sortMode: "sortMode", resetPageOnSort: ["resetPageOnSort", "resetPageOnSort", booleanAttribute], selectionMode: "selectionMode", selectionPageOnly: ["selectionPageOnly", "selectionPageOnly", booleanAttribute], contextMenuSelection: "contextMenuSelection", contextMenuSelectionMode: "contextMenuSelectionMode", dataKey: "dataKey", metaKeySelection: ["metaKeySelection", "metaKeySelection", booleanAttribute], rowSelectable: "rowSelectable", rowTrackBy: "rowTrackBy", lazy: ["lazy", "lazy", booleanAttribute], lazyLoadOnInit: ["lazyLoadOnInit", "lazyLoadOnInit", booleanAttribute], compareSelectionBy: "compareSelectionBy", csvSeparator: "csvSeparator", exportFilename: "exportFilename", filters: "filters", globalFilterFields: "globalFilterFields", filterDelay: ["filterDelay", "filterDelay", numberAttribute], filterLocale: "filterLocale", expandedRowKeys: "expandedRowKeys", editingRowKeys: "editingRowKeys", rowExpandMode: "rowExpandMode", scrollable: ["scrollable", "scrollable", booleanAttribute], scrollDirection: "scrollDirection", rowGroupMode: "rowGroupMode", scrollHeight: "scrollHeight", virtualScroll: ["virtualScroll", "virtualScroll", booleanAttribute], virtualScrollItemSize: ["virtualScrollItemSize", "virtualScrollItemSize", numberAttribute], virtualScrollOptions: "virtualScrollOptions", virtualScrollDelay: ["virtualScrollDelay", "virtualScrollDelay", numberAttribute], frozenWidth: "frozenWidth", responsive: "responsive", contextMenu: "contextMenu", resizableColumns: ["resizableColumns", "resizableColumns", booleanAttribute], columnResizeMode: "columnResizeMode", reorderableColumns: ["reorderableColumns", "reorderableColumns", booleanAttribute], loading: ["loading", "loading", booleanAttribute], loadingIcon: "loadingIcon", showLoader: ["showLoader", "showLoader", booleanAttribute], rowHover: ["rowHover", "rowHover", booleanAttribute], customSort: ["customSort", "customSort", booleanAttribute], showInitialSortBadge: ["showInitialSortBadge", "showInitialSortBadge", booleanAttribute], autoLayout: ["autoLayout", "autoLayout", booleanAttribute], exportFunction: "exportFunction", exportHeader: "exportHeader", stateKey: "stateKey", stateStorage: "stateStorage", editMode: "editMode", groupRowsBy: "groupRowsBy", groupRowsByOrder: ["groupRowsByOrder", "groupRowsByOrder", numberAttribute], responsiveLayout: "responsiveLayout", breakpoint: "breakpoint", paginatorLocale: "paginatorLocale", value: "value", columns: "columns", first: "first", rows: "rows", totalRecords: "totalRecords", sortField: "sortField", sortOrder: "sortOrder", multiSortMeta: "multiSortMeta", selection: "selection", selectAll: "selectAll", virtualRowHeight: "virtualRowHeight" }, outputs: { contextMenuSelectionChange: "contextMenuSelectionChange", selectAllChange: "selectAllChange", selectionChange: "selectionChange", onRowSelect: "onRowSelect", onRowUnselect: "onRowUnselect", onPage: "onPage", onSort: "onSort", onFilter: "onFilter", onLazyLoad: "onLazyLoad", onRowExpand: "onRowExpand", onRowCollapse: "onRowCollapse", onContextMenuSelect: "onContextMenuSelect", onColResize: "onColResize", onColReorder: "onColReorder", onRowReorder: "onRowReorder", onEditInit: "onEditInit", onEditComplete: "onEditComplete", onEditCancel: "onEditCancel", onHeaderCheckboxToggle: "onHeaderCheckboxToggle", sortFunction: "sortFunction", firstChange: "firstChange", rowsChange: "rowsChange", onStateSave: "onStateSave", onStateRestore: "onStateRestore" }, host: { classAttribute: "cax-element" }, queries: [{ propertyName: "templates", predicate: CaxTemplate }], viewQueries: [{ propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }, { propertyName: "resizeHelperViewChild", first: true, predicate: ["resizeHelper"], descendants: true }, { propertyName: "reorderIndicatorUpViewChild", first: true, predicate: ["reorderIndicatorUp"], descendants: true }, { propertyName: "reorderIndicatorDownViewChild", first: true, predicate: ["reorderIndicatorDown"], descendants: true }, { propertyName: "wrapperViewChild", first: true, predicate: ["wrapper"], descendants: true }, { propertyName: "tableViewChild", first: true, predicate: ["table"], descendants: true }, { propertyName: "tableHeaderViewChild", first: true, predicate: ["thead"], descendants: true }, { propertyName: "tableFooterViewChild", first: true, predicate: ["tfoot"], descendants: true }, { propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container [ngStyle]=\"style\" [class]=\"styleClass\" [ngClass]=\"getTableClasses()\" [attr.id]=\"id\">\r\n <div class=\"cax-datatable-loading-overlay cax-component-overlay\" *ngIf=\"loading && showLoader\">\r\n <i *ngIf=\"loadingIcon\" [class]=\"'cax-datatable-loading-icon ' + loadingIcon\"></i>\r\n <ng-container *ngIf=\"!loadingIcon\">\r\n <SpinnerIcon *ngIf=\"!loadingIconTemplate\" [spin]=\"true\" [styleClass]=\"'cax-datatable-loading-icon'\" />\r\n <span *ngIf=\"loadingIconTemplate\" class=\"cax-datatable-loading-icon\">\r\n <ng-template *ngTemplateOutlet=\"loadingIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"captionTemplate\" class=\"cax-datatable-header\">\r\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\r\n </div>\r\n <cax-paginator\r\n [rows]=\"rows\"\r\n [first]=\"first\"\r\n [totalRecords]=\"totalRecords\"\r\n [pageLinkSize]=\"pageLinks\"\r\n [alwaysShow]=\"alwaysShowPaginator\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n *ngIf=\"paginator && (paginatorPosition === 'top' || paginatorPosition == 'both')\"\r\n [templateLeft]=\"paginatorLeftTemplate\"\r\n [templateRight]=\"paginatorRightTemplate\"\r\n [dropdownAppendTo]=\"paginatorDropdownAppendTo\"\r\n [dropdownScrollHeight]=\"paginatorDropdownScrollHeight\"\r\n [currentPageReportTemplate]=\"currentPageReportTemplate\"\r\n [showFirstLastIcon]=\"showFirstLastIcon\"\r\n [dropdownItemTemplate]=\"paginatorDropdownItemTemplate\"\r\n [showCurrentPageReport]=\"showCurrentPageReport\"\r\n [showJumpToPageDropdown]=\"showJumpToPageDropdown\"\r\n [showJumpToPageInput]=\"showJumpToPageInput\"\r\n [showPageLinks]=\"showPageLinks\"\r\n [styleClass]=\"getPaginatorStyleClasses('cax-paginator-top')\"\r\n [locale]=\"paginatorLocale\"\r\n >\r\n <ng-template caxTemplate=\"dropdownicon\" *ngIf=\"paginatorDropdownIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorDropdownIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"firstpagelinkicon\" *ngIf=\"paginatorFirstPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorFirstPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"previouspagelinkicon\" *ngIf=\"paginatorPreviousPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorPreviousPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"lastpagelinkicon\" *ngIf=\"paginatorLastPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorLastPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"nextpagelinkicon\" *ngIf=\"paginatorNextPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorNextPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n </cax-paginator>\r\n\r\n <div #wrapper class=\"cax-datatable-wrapper\" [ngStyle]=\"{ maxHeight: virtualScroll ? '' : scrollHeight }\">\r\n <cax-scroller\r\n #scroller\r\n *ngIf=\"virtualScroll\"\r\n [items]=\"processedData\"\r\n [columns]=\"columns\"\r\n [style]=\"{ height: scrollHeight !== 'flex' ? scrollHeight : undefined }\"\r\n [scrollHeight]=\"scrollHeight !== 'flex' ? undefined : '100%'\"\r\n [itemSize]=\"virtualScrollItemSize || _virtualRowHeight\"\r\n [step]=\"rows\"\r\n [delay]=\"lazy ? virtualScrollDelay : 0\"\r\n [inline]=\"true\"\r\n [autoSize]=\"true\"\r\n [lazy]=\"lazy\"\r\n (onLazyLoad)=\"onLazyItemLoad($event)\"\r\n [loaderDisabled]=\"true\"\r\n [showSpacer]=\"false\"\r\n [showLoader]=\"loadingBodyTemplate\"\r\n [options]=\"virtualScrollOptions\"\r\n >\r\n <ng-template caxTemplate=\"content\" let-items let-scrollerOptions=\"options\">\r\n <ng-container *ngTemplateOutlet=\"buildInTable; context: { $implicit: items, options: scrollerOptions }\"></ng-container>\r\n </ng-template>\r\n </cax-scroller>\r\n <ng-container *ngIf=\"!virtualScroll\">\r\n <ng-container *ngTemplateOutlet=\"buildInTable; context: { $implicit: processedData, options: { columns } }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #buildInTable let-items let-scrollerOptions=\"options\">\r\n <table\r\n #table\r\n role=\"table\"\r\n [ngClass]=\"{ 'cax-datatable-table': true, 'cax-datatable-scrollable-table': scrollable, 'cax-datatable-resizable-table': resizableColumns, 'cax-datatable-resizable-table-fit': resizableColumns && columnResizeMode === 'fit' }\"\r\n [class]=\"tableStyleClass\"\r\n [ngStyle]=\"tableStyle\"\r\n [attr.id]=\"id + '-table'\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"colGroupTemplate; context: { $implicit: scrollerOptions.columns }\"></ng-container>\r\n <thead role=\"rowgroup\" #thead class=\"cax-datatable-thead\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupedTemplate || headerTemplate; context: { $implicit: scrollerOptions.columns }\"></ng-container>\r\n </thead>\r\n <tbody\r\n role=\"rowgroup\"\r\n class=\"cax-datatable-tbody cax-datatable-frozen-tbody\"\r\n *ngIf=\"frozenValue || frozenBodyTemplate\"\r\n [value]=\"frozenValue\"\r\n [frozenRows]=\"true\"\r\n [caxTableBody]=\"scrollerOptions.columns\"\r\n [caxTableBodyTemplate]=\"frozenBodyTemplate\"\r\n [frozen]=\"true\"\r\n ></tbody>\r\n <tbody\r\n role=\"rowgroup\"\r\n class=\"cax-datatable-tbody\"\r\n [ngClass]=\"scrollerOptions.contentStyleClass\"\r\n [ngStyle]=\"scrollerOptions.contentStyle\"\r\n [value]=\"dataToRender(scrollerOptions.rows)\"\r\n [caxTableBody]=\"scrollerOptions.columns\"\r\n [caxTableBodyTemplate]=\"bodyTemplate\"\r\n [scrollerOptions]=\"scrollerOptions\"\r\n ></tbody>\r\n <tbody\r\n role=\"rowgroup\"\r\n *ngIf=\"scrollerOptions.spacerStyle\"\r\n [ngStyle]=\"{ height: 'calc(' + scrollerOptions.spacerStyle.height + ' - ' + scrollerOptions.rows.length * scrollerOptions.itemSize + 'px)' }\"\r\n class=\"cax-datatable-scroller-spacer\"\r\n ></tbody>\r\n <tfoot role=\"rowgroup\" *ngIf=\"footerGroupedTemplate || footerTemplate\" #tfoot class=\"cax-datatable-tfoot\">\r\n <ng-container *ngTemplateOutlet=\"footerGroupedTemplate || footerTemplate; context: { $implicit: scrollerOptions.columns }\"></ng-container>\r\n </tfoot>\r\n </table>\r\n </ng-template>\r\n </div>\r\n\r\n <cax-paginator\r\n [rows]=\"rows\"\r\n [first]=\"first\"\r\n [totalRecords]=\"totalRecords\"\r\n [pageLinkSize]=\"pageLinks\"\r\n [alwaysShow]=\"alwaysShowPaginator\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n *ngIf=\"paginator && (paginatorPosition === 'bottom' || paginatorPosition == 'both')\"\r\n [templateLeft]=\"paginatorLeftTemplate\"\r\n [templateRight]=\"paginatorRightTemplate\"\r\n [dropdownAppendTo]=\"paginatorDropdownAppendTo\"\r\n [dropdownScrollHeight]=\"paginatorDropdownScrollHeight\"\r\n [currentPageReportTemplate]=\"currentPageReportTemplate\"\r\n [showFirstLastIcon]=\"showFirstLastIcon\"\r\n [dropdownItemTemplate]=\"paginatorDropdownItemTemplate\"\r\n [showCurrentPageReport]=\"showCurrentPageReport\"\r\n [showJumpToPageDropdown]=\"showJumpToPageDropdown\"\r\n [showJumpToPageInput]=\"showJumpToPageInput\"\r\n [showPageLinks]=\"showPageLinks\"\r\n [styleClass]=\"getPaginatorStyleClasses('cax-paginator-bottom')\"\r\n [locale]=\"paginatorLocale\"\r\n >\r\n <ng-template caxTemplate=\"dropdownicon\" *ngIf=\"paginatorDropdownIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorDropdownIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"firstpagelinkicon\" *ngIf=\"paginatorFirstPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorFirstPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"previouspagelinkicon\" *ngIf=\"paginatorPreviousPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorPreviousPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"lastpagelinkicon\" *ngIf=\"paginatorLastPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorLastPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"nextpagelinkicon\" *ngIf=\"paginatorNextPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorNextPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n </cax-paginator>\r\n\r\n <div *ngIf=\"summaryTemplate\" class=\"cax-datatable-footer\">\r\n <ng-container *ngTemplateOutlet=\"summaryTemplate\"></ng-container>\r\n </div>\r\n\r\n <div\r\n #resizeHelper\r\n class=\"cax-column-resizer-helper\"\r\n [ngStyle]=\"{\r\n display: 'none'\r\n }\"\r\n *ngIf=\"resizableColumns\"\r\n ></div>\r\n <span\r\n #reorderIndicatorUp\r\n class=\"cax-datatable-reorder-indicator-up\"\r\n [ngStyle]=\"{\r\n display: 'none'\r\n }\"\r\n *ngIf=\"reorderableColumns\"\r\n >\r\n <ArrowDownIcon *ngIf=\"!reorderIndicatorUpIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"reorderIndicatorUpIconTemplate\"></ng-template>\r\n </span>\r\n <span\r\n #reorderIndicatorDown\r\n class=\"cax-datatable-reorder-indicator-down\"\r\n [ngStyle]=\"{\r\n display: 'none'\r\n }\"\r\n *ngIf=\"reorderableColumns\"\r\n >\r\n <ArrowUpIcon *ngIf=\"!reorderIndicatorDownIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"reorderIndicatorDownIconTemplate\"></ng-template>\r\n </span>\r\n</div>\r\n", styles: ["@layer cax{.cax-datatable{position:relative}.cax-datatable>.cax-datatable-wrapper{overflow:auto;border-radius:12px}.cax-datatable-wrapper::-webkit-scrollbar{width:8px;height:8px}.cax-datatable-wrapper::-webkit-scrollbar-track{background:#f0f0f0;border-radius:10px}.cax-datatable-wrapper::-webkit-scrollbar-thumb{background:#888;border-radius:10px}.cax-datatable-table{border-spacing:0px;width:100%}.cax-datatable .cax-sortable-column{-webkit-user-select:none;user-select:none}.cax-datatable .cax-sortable-column .cax-column-title,.cax-datatable .cax-sortable-column .cax-sortable-column-icon,.cax-datatable .cax-sortable-column .cax-sortable-column-badge{vertical-align:middle}.cax-datatable .cax-sortable-column .cax-icon-wrapper{display:inline}.cax-datatable .cax-sortable-column .cax-sortable-column-badge{display:inline-flex;align-items:center;justify-content:center}.cax-datatable-hoverable-rows .cax-selectable-row{cursor:pointer}.cax-datatable-scrollable>.cax-datatable-wrapper{position:relative}.cax-datatable-scrollable-table>.cax-datatable-thead{position:sticky;top:0;z-index:2}.cax-datatable-scrollable-table>.cax-datatable-frozen-tbody{position:sticky;z-index:1}.cax-datatable-scrollable-table>.cax-datatable-tfoot{position:sticky;bottom:0;z-index:1}.cax-datatable-scrollable .cax-frozen-column{position:sticky;z-index:1}.cax-datatable-scrollable th.cax-frozen-column{z-index:2;background:var(--neutral-75)}.cax-datatable-scrollable td.cax-frozen-column{z-index:1;background:transparent;-webkit-backdrop-filter:blur(80px);backdrop-filter:blur(80px)}.cax-datatable-flex-scrollable{display:flex;flex-direction:column;height:100%}.cax-datatable-flex-scrollable>.cax-datatable-wrapper{display:flex;flex-direction:column;flex:1;height:100%}.cax-datatable-scrollable-table>.cax-datatable-tbody>.cax-rowgroucax-header{position:sticky;z-index:2}.cax-datatable-resizable-table>.cax-datatable-thead>tr>th,.cax-datatable-resizable-table>.cax-datatable-tfoot>tr>td,.cax-datatable-resizable-table>.cax-datatable-tbody>tr>td{overflow:hidden;white-space:nowrap}.cax-datatable-resizable-table>.cax-datatable-thead>tr>th.cax-resizable-column:not(.cax-frozen-column){background-clip:padding-box;position:relative}.cax-datatable-resizable-table-fit>.cax-datatable-thead>tr>th.cax-resizable-column:last-child .cax-column-resizer{display:none}.cax-datatable .cax-column-resizer{display:block;position:absolute!important;top:0;right:0;margin:0;width:.5rem;height:100%;padding:0;cursor:col-resize;border:1px solid transparent}.cax-datatable .cax-column-resizer-helper{width:1px;position:absolute;z-index:10;display:none}.cax-datatable .cax-row-editor-init,.cax-datatable .cax-row-editor-save,.cax-datatable .cax-row-editor-cancel,.cax-datatable .cax-row-toggler{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;position:relative}.cax-datatable-reorder-indicator-up,.cax-datatable-reorder-indicator-down{position:absolute}.cax-datatable-reorderablerow-handle,[caxReorderableColumn]{cursor:move}.cax-datatable .cax-datatable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:3}.cax-column-filter-row{display:flex;align-items:center;width:100%}.cax-column-filter-row i{font-size:20px}.cax-column-filter-menu,.cax-column-filter-custom{display:inline-flex;position:relative;float:right;margin-left:4px}.cax-column-filter-menu i,.cax-column-filter-custom i{font-size:20px}.cax-column-filter-custom-container{padding:16px;display:flex;gap:16px;flex-direction:column}.cax-column-filter-custom-container .cax-column-filter-custom-buttons{display:flex;gap:12px}.cax-column-filter-custom-container .cax-column-filter-custom-buttons cax-button{flex:1}.cax-column-filter-overlay-custom{width:248px}.cax-column-filter-row cax-columnfilterformelement{flex:1 1 auto;width:1%}.cax-column-filter-menu-button,.cax-column-filter-clear-button{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;text-decoration:none;overflow:hidden;position:relative}.cax-column-filter-menu-button:disabled{opacity:.5}.cax-column-filter-overlay{position:absolute;top:0;left:0}.cax-column-filter-row-items{margin:0;padding:0;list-style:none}.cax-column-filter-row-item{cursor:pointer}.cax-column-filter-add-button,.cax-column-filter-remove-button{justify-content:center}.cax-column-filter-add-button .cax-button-label,.cax-column-filter-remove-button .cax-button-label{flex-grow:0}.cax-column-filter-buttonbar{display:flex;align-items:center;justify-content:space-between;gap:12px}.cax-column-filter-buttonbar .cax-button{width:auto}.cax-datatable-tbody>tr>td>.cax-column-title{display:none}.cax-datatable-scroller-spacer{display:flex}.cax-datatable .cax-scroller .cax-scroller-loading{transform:none!important;min-height:0;position:sticky;top:0;left:0}}.cax-datatable .cax-editable-column .cax-inputtext{width:100%;box-shadow:none;border:0;padding:0;line-height:normal}.cax-datatable.cax-datatable-font-sm .cax-datatable-tbody>tr>td{font-size:12px}.cax-datatable.cax-datatable-font-sm .cax-datatable-tbody>tr>td .cax-inputtext{font-size:12px}.cax-datatable.cax-datatable-font-sm .cax-datatable-tbody>tr>td cax-tablecheckbox .cax-checkbox .cax-checkbox-box{width:16px;height:16px}.cax-datatable.cax-datatable-font-md .cax-datatable-tbody>tr>td{font-size:14px}.cax-datatable.cax-datatable-font-md .cax-datatable-tbody>tr>td .cax-inputtext{font-size:14px}.cax-datatable.cax-datatable-font-md .cax-datatable-tbody>tr>td cax-tablecheckbox .cax-checkbox .cax-checkbox-box{width:18px;height:18px}.cax-datatable.cax-datatable-font-lg .cax-datatable-tbody>tr>td{font-size:16px}.cax-datatable.cax-datatable-font-lg .cax-datatable-tbody>tr>td .cax-inputtext{font-size:16px}.cax-datatable.cax-datatable-font-lg .cax-datatable-tbody>tr>td cax-tablecheckbox.cax-checkbox .cax-checkbox-box{width:20px;height:20px}.cax-datatable.cax-datatable-font-xl .cax-datatable-tbody>tr>td{font-size:18px}.cax-datatable.cax-datatable-font-xl .cax-datatable-tbody>tr>td .cax-inputtext{font-size:18px}.cax-datatable.cax-datatable-font-xl .cax-datatable-tbody>tr>td cax-tablecheckbox.cax-checkbox .cax-checkbox-box{width:22px;height:22px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:42px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:56px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:72px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:88px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:44px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:60px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:78px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:96px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:54px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:66px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:86px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:108px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:56px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:70px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:94px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:116px}.cax-cell-highlight-default{border:1px solid var(--primary-500)!important}.cax-cell-highlight-error{border:1px solid var(--error-600)!important}.cax-cell-background-error{background:var(--error-50)}.cax-sort-icon-button{border:0;width:28px;height:28px!important;display:flex;background:transparent;cursor:pointer;padding:0!important;align-items:center;justify-content:center}.cax-sort-icon-button i{font-size:20px}.cax-sort-icon-button:disabled{opacity:.5;cursor:context-menu}cax-sorticon{position:absolute;margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: i5.Paginator, selector: "cax-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first", "rightAligned"], outputs: ["onPageChange"] }, { kind: "directive", type: i2.CaxTemplate, selector: "[caxTemplate]", inputs: ["type", "caxTemplate"] }, { kind: "component", type: i6.Scroller, selector: "cax-scroller", inputs: ["id", "style", "styleClass", "tabindex", "items", "itemSize", "scrollHeight", "scrollWidth", "orientation", "step", "delay", "resizeDelay", "appendOnly", "inline", "lazy", "disabled", "loaderDisabled", "columns", "showSpacer", "showLoader", "numToleratedItems", "loading", "autoSize", "trackBy", "options"], outputs: ["onLazyLoad", "onScroll", "onScrollIndexChange"] }, { kind: "ngmodule", type: ScrollerModule }, { kind: "component", type: ArrowDownIcon, selector: "ArrowDownIcon" }, { kind: "component", type: ArrowUpIcon, selector: "ArrowUpIcon" }, { kind: "component", type: SpinnerIcon, selector: "SpinnerIcon" }, { kind: "component", type: TableBody, selector: "[caxTableBody]", inputs: ["caxTableBody", "caxTableBodyTemplate", "value", "frozen", "frozenRows", "scrollerOptions"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
2502
+ }
2503
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: Table, decorators: [{
2504
+ type: Component,
2505
+ args: [{ selector: 'cax-table', changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, PaginatorModule, ScrollerModule, ArrowDownIcon, ArrowUpIcon, SpinnerIcon, TableBody], host: {
2506
+ class: 'cax-element'
2507
+ }, template: "<div #container [ngStyle]=\"style\" [class]=\"styleClass\" [ngClass]=\"getTableClasses()\" [attr.id]=\"id\">\r\n <div class=\"cax-datatable-loading-overlay cax-component-overlay\" *ngIf=\"loading && showLoader\">\r\n <i *ngIf=\"loadingIcon\" [class]=\"'cax-datatable-loading-icon ' + loadingIcon\"></i>\r\n <ng-container *ngIf=\"!loadingIcon\">\r\n <SpinnerIcon *ngIf=\"!loadingIconTemplate\" [spin]=\"true\" [styleClass]=\"'cax-datatable-loading-icon'\" />\r\n <span *ngIf=\"loadingIconTemplate\" class=\"cax-datatable-loading-icon\">\r\n <ng-template *ngTemplateOutlet=\"loadingIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"captionTemplate\" class=\"cax-datatable-header\">\r\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\r\n </div>\r\n <cax-paginator\r\n [rows]=\"rows\"\r\n [first]=\"first\"\r\n [totalRecords]=\"totalRecords\"\r\n [pageLinkSize]=\"pageLinks\"\r\n [alwaysShow]=\"alwaysShowPaginator\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n *ngIf=\"paginator && (paginatorPosition === 'top' || paginatorPosition == 'both')\"\r\n [templateLeft]=\"paginatorLeftTemplate\"\r\n [templateRight]=\"paginatorRightTemplate\"\r\n [dropdownAppendTo]=\"paginatorDropdownAppendTo\"\r\n [dropdownScrollHeight]=\"paginatorDropdownScrollHeight\"\r\n [currentPageReportTemplate]=\"currentPageReportTemplate\"\r\n [showFirstLastIcon]=\"showFirstLastIcon\"\r\n [dropdownItemTemplate]=\"paginatorDropdownItemTemplate\"\r\n [showCurrentPageReport]=\"showCurrentPageReport\"\r\n [showJumpToPageDropdown]=\"showJumpToPageDropdown\"\r\n [showJumpToPageInput]=\"showJumpToPageInput\"\r\n [showPageLinks]=\"showPageLinks\"\r\n [styleClass]=\"getPaginatorStyleClasses('cax-paginator-top')\"\r\n [locale]=\"paginatorLocale\"\r\n >\r\n <ng-template caxTemplate=\"dropdownicon\" *ngIf=\"paginatorDropdownIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorDropdownIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"firstpagelinkicon\" *ngIf=\"paginatorFirstPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorFirstPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"previouspagelinkicon\" *ngIf=\"paginatorPreviousPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorPreviousPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"lastpagelinkicon\" *ngIf=\"paginatorLastPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorLastPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"nextpagelinkicon\" *ngIf=\"paginatorNextPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorNextPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n </cax-paginator>\r\n\r\n <div #wrapper class=\"cax-datatable-wrapper\" [ngStyle]=\"{ maxHeight: virtualScroll ? '' : scrollHeight }\">\r\n <cax-scroller\r\n #scroller\r\n *ngIf=\"virtualScroll\"\r\n [items]=\"processedData\"\r\n [columns]=\"columns\"\r\n [style]=\"{ height: scrollHeight !== 'flex' ? scrollHeight : undefined }\"\r\n [scrollHeight]=\"scrollHeight !== 'flex' ? undefined : '100%'\"\r\n [itemSize]=\"virtualScrollItemSize || _virtualRowHeight\"\r\n [step]=\"rows\"\r\n [delay]=\"lazy ? virtualScrollDelay : 0\"\r\n [inline]=\"true\"\r\n [autoSize]=\"true\"\r\n [lazy]=\"lazy\"\r\n (onLazyLoad)=\"onLazyItemLoad($event)\"\r\n [loaderDisabled]=\"true\"\r\n [showSpacer]=\"false\"\r\n [showLoader]=\"loadingBodyTemplate\"\r\n [options]=\"virtualScrollOptions\"\r\n >\r\n <ng-template caxTemplate=\"content\" let-items let-scrollerOptions=\"options\">\r\n <ng-container *ngTemplateOutlet=\"buildInTable; context: { $implicit: items, options: scrollerOptions }\"></ng-container>\r\n </ng-template>\r\n </cax-scroller>\r\n <ng-container *ngIf=\"!virtualScroll\">\r\n <ng-container *ngTemplateOutlet=\"buildInTable; context: { $implicit: processedData, options: { columns } }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #buildInTable let-items let-scrollerOptions=\"options\">\r\n <table\r\n #table\r\n role=\"table\"\r\n [ngClass]=\"{ 'cax-datatable-table': true, 'cax-datatable-scrollable-table': scrollable, 'cax-datatable-resizable-table': resizableColumns, 'cax-datatable-resizable-table-fit': resizableColumns && columnResizeMode === 'fit' }\"\r\n [class]=\"tableStyleClass\"\r\n [ngStyle]=\"tableStyle\"\r\n [attr.id]=\"id + '-table'\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"colGroupTemplate; context: { $implicit: scrollerOptions.columns }\"></ng-container>\r\n <thead role=\"rowgroup\" #thead class=\"cax-datatable-thead\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupedTemplate || headerTemplate; context: { $implicit: scrollerOptions.columns }\"></ng-container>\r\n </thead>\r\n <tbody\r\n role=\"rowgroup\"\r\n class=\"cax-datatable-tbody cax-datatable-frozen-tbody\"\r\n *ngIf=\"frozenValue || frozenBodyTemplate\"\r\n [value]=\"frozenValue\"\r\n [frozenRows]=\"true\"\r\n [caxTableBody]=\"scrollerOptions.columns\"\r\n [caxTableBodyTemplate]=\"frozenBodyTemplate\"\r\n [frozen]=\"true\"\r\n ></tbody>\r\n <tbody\r\n role=\"rowgroup\"\r\n class=\"cax-datatable-tbody\"\r\n [ngClass]=\"scrollerOptions.contentStyleClass\"\r\n [ngStyle]=\"scrollerOptions.contentStyle\"\r\n [value]=\"dataToRender(scrollerOptions.rows)\"\r\n [caxTableBody]=\"scrollerOptions.columns\"\r\n [caxTableBodyTemplate]=\"bodyTemplate\"\r\n [scrollerOptions]=\"scrollerOptions\"\r\n ></tbody>\r\n <tbody\r\n role=\"rowgroup\"\r\n *ngIf=\"scrollerOptions.spacerStyle\"\r\n [ngStyle]=\"{ height: 'calc(' + scrollerOptions.spacerStyle.height + ' - ' + scrollerOptions.rows.length * scrollerOptions.itemSize + 'px)' }\"\r\n class=\"cax-datatable-scroller-spacer\"\r\n ></tbody>\r\n <tfoot role=\"rowgroup\" *ngIf=\"footerGroupedTemplate || footerTemplate\" #tfoot class=\"cax-datatable-tfoot\">\r\n <ng-container *ngTemplateOutlet=\"footerGroupedTemplate || footerTemplate; context: { $implicit: scrollerOptions.columns }\"></ng-container>\r\n </tfoot>\r\n </table>\r\n </ng-template>\r\n </div>\r\n\r\n <cax-paginator\r\n [rows]=\"rows\"\r\n [first]=\"first\"\r\n [totalRecords]=\"totalRecords\"\r\n [pageLinkSize]=\"pageLinks\"\r\n [alwaysShow]=\"alwaysShowPaginator\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n *ngIf=\"paginator && (paginatorPosition === 'bottom' || paginatorPosition == 'both')\"\r\n [templateLeft]=\"paginatorLeftTemplate\"\r\n [templateRight]=\"paginatorRightTemplate\"\r\n [dropdownAppendTo]=\"paginatorDropdownAppendTo\"\r\n [dropdownScrollHeight]=\"paginatorDropdownScrollHeight\"\r\n [currentPageReportTemplate]=\"currentPageReportTemplate\"\r\n [showFirstLastIcon]=\"showFirstLastIcon\"\r\n [dropdownItemTemplate]=\"paginatorDropdownItemTemplate\"\r\n [showCurrentPageReport]=\"showCurrentPageReport\"\r\n [showJumpToPageDropdown]=\"showJumpToPageDropdown\"\r\n [showJumpToPageInput]=\"showJumpToPageInput\"\r\n [showPageLinks]=\"showPageLinks\"\r\n [styleClass]=\"getPaginatorStyleClasses('cax-paginator-bottom')\"\r\n [locale]=\"paginatorLocale\"\r\n >\r\n <ng-template caxTemplate=\"dropdownicon\" *ngIf=\"paginatorDropdownIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorDropdownIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"firstpagelinkicon\" *ngIf=\"paginatorFirstPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorFirstPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"previouspagelinkicon\" *ngIf=\"paginatorPreviousPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorPreviousPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"lastpagelinkicon\" *ngIf=\"paginatorLastPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorLastPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template caxTemplate=\"nextpagelinkicon\" *ngIf=\"paginatorNextPageLinkIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"paginatorNextPageLinkIconTemplate\"></ng-container>\r\n </ng-template>\r\n </cax-paginator>\r\n\r\n <div *ngIf=\"summaryTemplate\" class=\"cax-datatable-footer\">\r\n <ng-container *ngTemplateOutlet=\"summaryTemplate\"></ng-container>\r\n </div>\r\n\r\n <div\r\n #resizeHelper\r\n class=\"cax-column-resizer-helper\"\r\n [ngStyle]=\"{\r\n display: 'none'\r\n }\"\r\n *ngIf=\"resizableColumns\"\r\n ></div>\r\n <span\r\n #reorderIndicatorUp\r\n class=\"cax-datatable-reorder-indicator-up\"\r\n [ngStyle]=\"{\r\n display: 'none'\r\n }\"\r\n *ngIf=\"reorderableColumns\"\r\n >\r\n <ArrowDownIcon *ngIf=\"!reorderIndicatorUpIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"reorderIndicatorUpIconTemplate\"></ng-template>\r\n </span>\r\n <span\r\n #reorderIndicatorDown\r\n class=\"cax-datatable-reorder-indicator-down\"\r\n [ngStyle]=\"{\r\n display: 'none'\r\n }\"\r\n *ngIf=\"reorderableColumns\"\r\n >\r\n <ArrowUpIcon *ngIf=\"!reorderIndicatorDownIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"reorderIndicatorDownIconTemplate\"></ng-template>\r\n </span>\r\n</div>\r\n", styles: ["@layer cax{.cax-datatable{position:relative}.cax-datatable>.cax-datatable-wrapper{overflow:auto;border-radius:12px}.cax-datatable-wrapper::-webkit-scrollbar{width:8px;height:8px}.cax-datatable-wrapper::-webkit-scrollbar-track{background:#f0f0f0;border-radius:10px}.cax-datatable-wrapper::-webkit-scrollbar-thumb{background:#888;border-radius:10px}.cax-datatable-table{border-spacing:0px;width:100%}.cax-datatable .cax-sortable-column{-webkit-user-select:none;user-select:none}.cax-datatable .cax-sortable-column .cax-column-title,.cax-datatable .cax-sortable-column .cax-sortable-column-icon,.cax-datatable .cax-sortable-column .cax-sortable-column-badge{vertical-align:middle}.cax-datatable .cax-sortable-column .cax-icon-wrapper{display:inline}.cax-datatable .cax-sortable-column .cax-sortable-column-badge{display:inline-flex;align-items:center;justify-content:center}.cax-datatable-hoverable-rows .cax-selectable-row{cursor:pointer}.cax-datatable-scrollable>.cax-datatable-wrapper{position:relative}.cax-datatable-scrollable-table>.cax-datatable-thead{position:sticky;top:0;z-index:2}.cax-datatable-scrollable-table>.cax-datatable-frozen-tbody{position:sticky;z-index:1}.cax-datatable-scrollable-table>.cax-datatable-tfoot{position:sticky;bottom:0;z-index:1}.cax-datatable-scrollable .cax-frozen-column{position:sticky;z-index:1}.cax-datatable-scrollable th.cax-frozen-column{z-index:2;background:var(--neutral-75)}.cax-datatable-scrollable td.cax-frozen-column{z-index:1;background:transparent;-webkit-backdrop-filter:blur(80px);backdrop-filter:blur(80px)}.cax-datatable-flex-scrollable{display:flex;flex-direction:column;height:100%}.cax-datatable-flex-scrollable>.cax-datatable-wrapper{display:flex;flex-direction:column;flex:1;height:100%}.cax-datatable-scrollable-table>.cax-datatable-tbody>.cax-rowgroucax-header{position:sticky;z-index:2}.cax-datatable-resizable-table>.cax-datatable-thead>tr>th,.cax-datatable-resizable-table>.cax-datatable-tfoot>tr>td,.cax-datatable-resizable-table>.cax-datatable-tbody>tr>td{overflow:hidden;white-space:nowrap}.cax-datatable-resizable-table>.cax-datatable-thead>tr>th.cax-resizable-column:not(.cax-frozen-column){background-clip:padding-box;position:relative}.cax-datatable-resizable-table-fit>.cax-datatable-thead>tr>th.cax-resizable-column:last-child .cax-column-resizer{display:none}.cax-datatable .cax-column-resizer{display:block;position:absolute!important;top:0;right:0;margin:0;width:.5rem;height:100%;padding:0;cursor:col-resize;border:1px solid transparent}.cax-datatable .cax-column-resizer-helper{width:1px;position:absolute;z-index:10;display:none}.cax-datatable .cax-row-editor-init,.cax-datatable .cax-row-editor-save,.cax-datatable .cax-row-editor-cancel,.cax-datatable .cax-row-toggler{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;position:relative}.cax-datatable-reorder-indicator-up,.cax-datatable-reorder-indicator-down{position:absolute}.cax-datatable-reorderablerow-handle,[caxReorderableColumn]{cursor:move}.cax-datatable .cax-datatable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:3}.cax-column-filter-row{display:flex;align-items:center;width:100%}.cax-column-filter-row i{font-size:20px}.cax-column-filter-menu,.cax-column-filter-custom{display:inline-flex;position:relative;float:right;margin-left:4px}.cax-column-filter-menu i,.cax-column-filter-custom i{font-size:20px}.cax-column-filter-custom-container{padding:16px;display:flex;gap:16px;flex-direction:column}.cax-column-filter-custom-container .cax-column-filter-custom-buttons{display:flex;gap:12px}.cax-column-filter-custom-container .cax-column-filter-custom-buttons cax-button{flex:1}.cax-column-filter-overlay-custom{width:248px}.cax-column-filter-row cax-columnfilterformelement{flex:1 1 auto;width:1%}.cax-column-filter-menu-button,.cax-column-filter-clear-button{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;text-decoration:none;overflow:hidden;position:relative}.cax-column-filter-menu-button:disabled{opacity:.5}.cax-column-filter-overlay{position:absolute;top:0;left:0}.cax-column-filter-row-items{margin:0;padding:0;list-style:none}.cax-column-filter-row-item{cursor:pointer}.cax-column-filter-add-button,.cax-column-filter-remove-button{justify-content:center}.cax-column-filter-add-button .cax-button-label,.cax-column-filter-remove-button .cax-button-label{flex-grow:0}.cax-column-filter-buttonbar{display:flex;align-items:center;justify-content:space-between;gap:12px}.cax-column-filter-buttonbar .cax-button{width:auto}.cax-datatable-tbody>tr>td>.cax-column-title{display:none}.cax-datatable-scroller-spacer{display:flex}.cax-datatable .cax-scroller .cax-scroller-loading{transform:none!important;min-height:0;position:sticky;top:0;left:0}}.cax-datatable .cax-editable-column .cax-inputtext{width:100%;box-shadow:none;border:0;padding:0;line-height:normal}.cax-datatable.cax-datatable-font-sm .cax-datatable-tbody>tr>td{font-size:12px}.cax-datatable.cax-datatable-font-sm .cax-datatable-tbody>tr>td .cax-inputtext{font-size:12px}.cax-datatable.cax-datatable-font-sm .cax-datatable-tbody>tr>td cax-tablecheckbox .cax-checkbox .cax-checkbox-box{width:16px;height:16px}.cax-datatable.cax-datatable-font-md .cax-datatable-tbody>tr>td{font-size:14px}.cax-datatable.cax-datatable-font-md .cax-datatable-tbody>tr>td .cax-inputtext{font-size:14px}.cax-datatable.cax-datatable-font-md .cax-datatable-tbody>tr>td cax-tablecheckbox .cax-checkbox .cax-checkbox-box{width:18px;height:18px}.cax-datatable.cax-datatable-font-lg .cax-datatable-tbody>tr>td{font-size:16px}.cax-datatable.cax-datatable-font-lg .cax-datatable-tbody>tr>td .cax-inputtext{font-size:16px}.cax-datatable.cax-datatable-font-lg .cax-datatable-tbody>tr>td cax-tablecheckbox.cax-checkbox .cax-checkbox-box{width:20px;height:20px}.cax-datatable.cax-datatable-font-xl .cax-datatable-tbody>tr>td{font-size:18px}.cax-datatable.cax-datatable-font-xl .cax-datatable-tbody>tr>td .cax-inputtext{font-size:18px}.cax-datatable.cax-datatable-font-xl .cax-datatable-tbody>tr>td cax-tablecheckbox.cax-checkbox .cax-checkbox-box{width:22px;height:22px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:42px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:56px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:72px}.cax-datatable.cax-datatable-font-sm.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:88px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:44px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:60px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:78px}.cax-datatable.cax-datatable-font-md.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:96px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:54px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:66px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:86px}.cax-datatable.cax-datatable-font-lg.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:108px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-sm .cax-datatable-tbody>tr>td{height:56px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-md .cax-datatable-tbody>tr>td{height:70px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-lg .cax-datatable-tbody>tr>td{height:94px}.cax-datatable.cax-datatable-font-xl.cax-datatable-row-xl .cax-datatable-tbody>tr>td{height:116px}.cax-cell-highlight-default{border:1px solid var(--primary-500)!important}.cax-cell-highlight-error{border:1px solid var(--error-600)!important}.cax-cell-background-error{background:var(--error-50)}.cax-sort-icon-button{border:0;width:28px;height:28px!important;display:flex;background:transparent;cursor:pointer;padding:0!important;align-items:center;justify-content:center}.cax-sort-icon-button i{font-size:20px}.cax-sort-icon-button:disabled{opacity:.5;cursor:context-menu}cax-sorticon{position:absolute;margin-left:4px}\n"] }]
2508
+ }], ctorParameters: () => [{ type: Document, decorators: [{
2509
+ type: Inject,
2510
+ args: [DOCUMENT]
2511
+ }] }, { type: undefined, decorators: [{
2512
+ type: Inject,
2513
+ args: [PLATFORM_ID]
2514
+ }] }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i1.TableService }, { type: i0.ChangeDetectorRef }, { type: i2.FilterService }, { type: i2.OverlayService }, { type: i2.caxConfig }, { type: i3.DomSanitizer }], propDecorators: { fontSize: [{
2515
+ type: Input
2516
+ }], rowSize: [{
2517
+ type: Input
2518
+ }], frozenColumns: [{
2519
+ type: Input
2520
+ }], frozenValue: [{
2521
+ type: Input
2522
+ }], style: [{
2523
+ type: Input
2524
+ }], styleClass: [{
2525
+ type: Input
2526
+ }], tableStyle: [{
2527
+ type: Input
2528
+ }], tableStyleClass: [{
2529
+ type: Input
2530
+ }], paginator: [{
2531
+ type: Input,
2532
+ args: [{ transform: booleanAttribute }]
2533
+ }], pageLinks: [{
2534
+ type: Input,
2535
+ args: [{ transform: numberAttribute }]
2536
+ }], rowsPerPageOptions: [{
2537
+ type: Input
2538
+ }], alwaysShowPaginator: [{
2539
+ type: Input,
2540
+ args: [{ transform: booleanAttribute }]
2541
+ }], paginatorPosition: [{
2542
+ type: Input
2543
+ }], paginatorStyleClass: [{
2544
+ type: Input
2545
+ }], paginatorDropdownAppendTo: [{
2546
+ type: Input
2547
+ }], paginatorDropdownScrollHeight: [{
2548
+ type: Input
2549
+ }], currentPageReportTemplate: [{
2550
+ type: Input
2551
+ }], showCurrentPageReport: [{
2552
+ type: Input,
2553
+ args: [{ transform: booleanAttribute }]
2554
+ }], showJumpToPageDropdown: [{
2555
+ type: Input,
2556
+ args: [{ transform: booleanAttribute }]
2557
+ }], showJumpToPageInput: [{
2558
+ type: Input,
2559
+ args: [{ transform: booleanAttribute }]
2560
+ }], showFirstLastIcon: [{
2561
+ type: Input,
2562
+ args: [{ transform: booleanAttribute }]
2563
+ }], showPageLinks: [{
2564
+ type: Input,
2565
+ args: [{ transform: booleanAttribute }]
2566
+ }], defaultSortOrder: [{
2567
+ type: Input,
2568
+ args: [{ transform: numberAttribute }]
2569
+ }], filterType: [{
2570
+ type: Input
2571
+ }], sortType: [{
2572
+ type: Input
2573
+ }], sortMode: [{
2574
+ type: Input
2575
+ }], resetPageOnSort: [{
2576
+ type: Input,
2577
+ args: [{ transform: booleanAttribute }]
2578
+ }], selectionMode: [{
2579
+ type: Input
2580
+ }], selectionPageOnly: [{
2581
+ type: Input,
2582
+ args: [{ transform: booleanAttribute }]
2583
+ }], contextMenuSelection: [{
2584
+ type: Input
2585
+ }], contextMenuSelectionChange: [{
2586
+ type: Output
2587
+ }], contextMenuSelectionMode: [{
2588
+ type: Input
2589
+ }], dataKey: [{
2590
+ type: Input
2591
+ }], metaKeySelection: [{
2592
+ type: Input,
2593
+ args: [{ transform: booleanAttribute }]
2594
+ }], rowSelectable: [{
2595
+ type: Input
2596
+ }], rowTrackBy: [{
2597
+ type: Input
2598
+ }], lazy: [{
2599
+ type: Input,
2600
+ args: [{ transform: booleanAttribute }]
2601
+ }], lazyLoadOnInit: [{
2602
+ type: Input,
2603
+ args: [{ transform: booleanAttribute }]
2604
+ }], compareSelectionBy: [{
2605
+ type: Input
2606
+ }], csvSeparator: [{
2607
+ type: Input
2608
+ }], exportFilename: [{
2609
+ type: Input
2610
+ }], filters: [{
2611
+ type: Input
2612
+ }], globalFilterFields: [{
2613
+ type: Input
2614
+ }], filterDelay: [{
2615
+ type: Input,
2616
+ args: [{ transform: numberAttribute }]
2617
+ }], filterLocale: [{
2618
+ type: Input
2619
+ }], expandedRowKeys: [{
2620
+ type: Input
2621
+ }], editingRowKeys: [{
2622
+ type: Input
2623
+ }], rowExpandMode: [{
2624
+ type: Input
2625
+ }], scrollable: [{
2626
+ type: Input,
2627
+ args: [{ transform: booleanAttribute }]
2628
+ }], scrollDirection: [{
2629
+ type: Input
2630
+ }], rowGroupMode: [{
2631
+ type: Input
2632
+ }], scrollHeight: [{
2633
+ type: Input
2634
+ }], virtualScroll: [{
2635
+ type: Input,
2636
+ args: [{ transform: booleanAttribute }]
2637
+ }], virtualScrollItemSize: [{
2638
+ type: Input,
2639
+ args: [{ transform: numberAttribute }]
2640
+ }], virtualScrollOptions: [{
2641
+ type: Input
2642
+ }], virtualScrollDelay: [{
2643
+ type: Input,
2644
+ args: [{ transform: numberAttribute }]
2645
+ }], frozenWidth: [{
2646
+ type: Input
2647
+ }], responsive: [{
2648
+ type: Input
2649
+ }], contextMenu: [{
2650
+ type: Input
2651
+ }], resizableColumns: [{
2652
+ type: Input,
2653
+ args: [{ transform: booleanAttribute }]
2654
+ }], columnResizeMode: [{
2655
+ type: Input
2656
+ }], reorderableColumns: [{
2657
+ type: Input,
2658
+ args: [{ transform: booleanAttribute }]
2659
+ }], loading: [{
2660
+ type: Input,
2661
+ args: [{ transform: booleanAttribute }]
2662
+ }], loadingIcon: [{
2663
+ type: Input
2664
+ }], showLoader: [{
2665
+ type: Input,
2666
+ args: [{ transform: booleanAttribute }]
2667
+ }], rowHover: [{
2668
+ type: Input,
2669
+ args: [{ transform: booleanAttribute }]
2670
+ }], customSort: [{
2671
+ type: Input,
2672
+ args: [{ transform: booleanAttribute }]
2673
+ }], showInitialSortBadge: [{
2674
+ type: Input,
2675
+ args: [{ transform: booleanAttribute }]
2676
+ }], autoLayout: [{
2677
+ type: Input,
2678
+ args: [{ transform: booleanAttribute }]
2679
+ }], exportFunction: [{
2680
+ type: Input
2681
+ }], exportHeader: [{
2682
+ type: Input
2683
+ }], stateKey: [{
2684
+ type: Input
2685
+ }], stateStorage: [{
2686
+ type: Input
2687
+ }], editMode: [{
2688
+ type: Input
2689
+ }], groupRowsBy: [{
2690
+ type: Input
2691
+ }], groupRowsByOrder: [{
2692
+ type: Input,
2693
+ args: [{ transform: numberAttribute }]
2694
+ }], responsiveLayout: [{
2695
+ type: Input
2696
+ }], breakpoint: [{
2697
+ type: Input
2698
+ }], paginatorLocale: [{
2699
+ type: Input
2700
+ }], value: [{
2701
+ type: Input
2702
+ }], columns: [{
2703
+ type: Input
2704
+ }], first: [{
2705
+ type: Input
2706
+ }], rows: [{
2707
+ type: Input
2708
+ }], totalRecords: [{
2709
+ type: Input
2710
+ }], sortField: [{
2711
+ type: Input
2712
+ }], sortOrder: [{
2713
+ type: Input
2714
+ }], multiSortMeta: [{
2715
+ type: Input
2716
+ }], selection: [{
2717
+ type: Input
2718
+ }], selectAll: [{
2719
+ type: Input
2720
+ }], selectAllChange: [{
2721
+ type: Output
2722
+ }], selectionChange: [{
2723
+ type: Output
2724
+ }], onRowSelect: [{
2725
+ type: Output
2726
+ }], onRowUnselect: [{
2727
+ type: Output
2728
+ }], onPage: [{
2729
+ type: Output
2730
+ }], onSort: [{
2731
+ type: Output
2732
+ }], onFilter: [{
2733
+ type: Output
2734
+ }], onLazyLoad: [{
2735
+ type: Output
2736
+ }], onRowExpand: [{
2737
+ type: Output
2738
+ }], onRowCollapse: [{
2739
+ type: Output
2740
+ }], onContextMenuSelect: [{
2741
+ type: Output
2742
+ }], onColResize: [{
2743
+ type: Output
2744
+ }], onColReorder: [{
2745
+ type: Output
2746
+ }], onRowReorder: [{
2747
+ type: Output
2748
+ }], onEditInit: [{
2749
+ type: Output
2750
+ }], onEditComplete: [{
2751
+ type: Output
2752
+ }], onEditCancel: [{
2753
+ type: Output
2754
+ }], onHeaderCheckboxToggle: [{
2755
+ type: Output
2756
+ }], sortFunction: [{
2757
+ type: Output
2758
+ }], firstChange: [{
2759
+ type: Output
2760
+ }], rowsChange: [{
2761
+ type: Output
2762
+ }], onStateSave: [{
2763
+ type: Output
2764
+ }], onStateRestore: [{
2765
+ type: Output
2766
+ }], containerViewChild: [{
2767
+ type: ViewChild,
2768
+ args: ['container']
2769
+ }], resizeHelperViewChild: [{
2770
+ type: ViewChild,
2771
+ args: ['resizeHelper']
2772
+ }], reorderIndicatorUpViewChild: [{
2773
+ type: ViewChild,
2774
+ args: ['reorderIndicatorUp']
2775
+ }], reorderIndicatorDownViewChild: [{
2776
+ type: ViewChild,
2777
+ args: ['reorderIndicatorDown']
2778
+ }], wrapperViewChild: [{
2779
+ type: ViewChild,
2780
+ args: ['wrapper']
2781
+ }], tableViewChild: [{
2782
+ type: ViewChild,
2783
+ args: ['table']
2784
+ }], tableHeaderViewChild: [{
2785
+ type: ViewChild,
2786
+ args: ['thead']
2787
+ }], tableFooterViewChild: [{
2788
+ type: ViewChild,
2789
+ args: ['tfoot']
2790
+ }], scroller: [{
2791
+ type: ViewChild,
2792
+ args: ['scroller']
2793
+ }], templates: [{
2794
+ type: ContentChildren,
2795
+ args: [CaxTemplate]
2796
+ }], virtualRowHeight: [{
2797
+ type: Input
2798
+ }] } });
2799
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvdGFibGUvdGFibGUudHMiLCIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvdGFibGUvdGFibGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVFLE9BQU8sRUFHSCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsZUFBZSxFQUdmLE1BQU0sRUFDTixXQUFXLEVBS1gsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWUsZUFBZSxFQUFrQixjQUFjLEVBQTBELFdBQVcsRUFBeUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqTixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFZLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQXVCekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7QUFFL0Q7OztHQUdHO0FBYUgsTUFBTSxPQUFPLEtBQUs7SUFvekJnQjtJQUNHO0lBQ3JCO0lBQ0Q7SUFDQTtJQUNBO0lBQ0E7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QU1HLFlBQVk7c0JBQXJCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFNRyxVQUFVO3NCQUFuQixNQUFNO2dCQU1HLGNBQWM7c0JBQXZCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFNRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQU1HLFVBQVU7c0JBQW5CLE1BQU07Z0JBTUcsV0FBVztzQkFBcEIsTUFBTTtnQkFNRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVpQixrQkFBa0I7c0JBQXpDLFNBQVM7dUJBQUMsV0FBVztnQkFFSyxxQkFBcUI7c0JBQS9DLFNBQVM7dUJBQUMsY0FBYztnQkFFUSwyQkFBMkI7c0JBQTNELFNBQVM7dUJBQUMsb0JBQW9CO2dCQUVJLDZCQUE2QjtzQkFBL0QsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBRVgsZ0JBQWdCO3NCQUFyQyxTQUFTO3VCQUFDLFNBQVM7Z0JBRUEsY0FBYztzQkFBakMsU0FBUzt1QkFBQyxPQUFPO2dCQUVFLG9CQUFvQjtzQkFBdkMsU0FBUzt1QkFBQyxPQUFPO2dCQUVFLG9CQUFvQjtzQkFBdkMsU0FBUzt1QkFBQyxPQUFPO2dCQUVLLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFFUyxTQUFTO3NCQUF0QyxlQUFlO3VCQUFDLFdBQVc7Z0JBTWYsZ0JBQWdCO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgbnVtYmVyQXR0cmlidXRlLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCbG9ja2FibGVVSSwgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNZXRhZGF0YSwgRmlsdGVyT3BlcmF0b3IsIEZpbHRlclNlcnZpY2UsIExhenlMb2FkTWV0YSwgT3ZlcmxheVNlcnZpY2UsIGNheENvbmZpZywgQ2F4VGVtcGxhdGUsIFNjcm9sbGVyT3B0aW9ucywgU29ydE1ldGEsIFRhYmxlU3RhdGUgfSBmcm9tICdjYXgtZGVzaWduLXN5c3RlbS9hcGknO1xuaW1wb3J0IHsgRG9tSGFuZGxlciB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL2RvbSc7XG5pbXBvcnQgeyBTY3JvbGxlciwgU2Nyb2xsZXJNb2R1bGUgfSBmcm9tICdjYXgtZGVzaWduLXN5c3RlbS9zY3JvbGxlcic7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL3RzLWhlbHBlcnMnO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMsIFVuaXF1ZUNvbXBvbmVudElkIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vdXRpbHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIEV4cG9ydENTVk9wdGlvbnMsXG4gICAgVGFibGVDb2xSZXNpemVFdmVudCxcbiAgICBUYWJsZUNvbHVtblJlb3JkZXJFdmVudCxcbiAgICBUYWJsZUNvbnRleHRNZW51U2VsZWN0RXZlbnQsXG4gICAgVGFibGVFZGl0Q2FuY2VsRXZlbnQsXG4gICAgVGFibGVFZGl0Q29tcGxldGVFdmVudCxcbiAgICBUYWJsZUVkaXRJbml0RXZlbnQsXG4gICAgVGFibGVGaWx0ZXJFdmVudCxcbiAgICBUYWJsZUhlYWRlckNoZWNrYm94VG9nZ2xlRXZlbnQsXG4gICAgVGFibGVMYXp5TG9hZEV2ZW50LFxuICAgIFRhYmxlUGFnZUV2ZW50LFxuICAgIFRhYmxlUm93Q29sbGFwc2VFdmVudCxcbiAgICBUYWJsZVJvd0V4cGFuZEV2ZW50LFxuICAgIFRhYmxlUm93UmVvcmRlckV2ZW50LFxuICAgIFRhYmxlUm93U2VsZWN0RXZlbnQsXG4gICAgVGFibGVSb3dVblNlbGVjdEV2ZW50LFxuICAgIFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnRcbn0gZnJvbSAnLi90YWJsZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXJyb3dEb3duSWNvbiB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL2ljb25zL2Fycm93ZG93bic7XG5pbXBvcnQgeyBBcnJvd1VwSWNvbiB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL2ljb25zL2Fycm93dXAnO1xuaW1wb3J0IHsgU3Bpbm5lckljb24gfSBmcm9tICdjYXgtZGVzaWduLXN5c3RlbS9pY29ucy9zcGlubmVyJztcbmltcG9ydCB7IFBhZ2luYXRvck1vZHVsZSB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBUYWJsZUJvZHkgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYm9keS90YWJsZS1ib2R5JztcblxuLyoqXG4gKiBUYWJsZSBkaXNwbGF5cyBkYXRhIGluIHRhYnVsYXIgZm9ybWF0LlxuICogQGdyb3VwIENvbXBvbmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjYXgtdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBzdHlsZVVybHM6IFsnLi90YWJsZS5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBQYWdpbmF0b3JNb2R1bGUsIFNjcm9sbGVyTW9kdWxlLCBBcnJvd0Rvd25JY29uLCBBcnJvd1VwSWNvbiwgU3Bpbm5lckljb24sIFRhYmxlQm9keV0sXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ2NheC1lbGVtZW50J1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGFibGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIEJsb2NrYWJsZVVJLCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIGZvbnRTaXplOiAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnID0gJ21kJztcbiAgICBASW5wdXQoKSByb3dTaXplOiAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnID0gJ21kJztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHJlcHJlc2VudCBkeW5hbWljIGNvbHVtbnMgdGhhdCBhcmUgZnJvemVuLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGZyb3plbkNvbHVtbnM6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gZGlzcGxheSBhcyBmcm96ZW4uXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZnJvemVuVmFsdWU6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIElubGluZSBzdHlsZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHN0eWxlOiB7IFtrbGFzczogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFN0eWxlIGNsYXNzIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc3R5bGVDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIElubGluZSBzdHlsZSBvZiB0aGUgdGFibGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgdGFibGVTdHlsZTogeyBba2xhc3M6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBTdHlsZSBjbGFzcyBvZiB0aGUgdGFibGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgdGFibGVTdHlsZUNsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hlbiBzcGVjaWZpZWQgYXMgdHJ1ZSwgZW5hYmxlcyB0aGUgcGFnaW5hdGlvbi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcGFnaW5hdG9yOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwYWdlIGxpbmtzIHRvIGRpc3BsYXkgaW4gcGFnaW5hdG9yLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHBhZ2VMaW5rczogbnVtYmVyID0gNTtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBpbnRlZ2VyL29iamVjdCB2YWx1ZXMgdG8gZGlzcGxheSBpbnNpZGUgcm93cyBwZXIgcGFnZSBkcm9wZG93biBvZiBwYWdpbmF0b3JcbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSByb3dzUGVyUGFnZU9wdGlvbnM6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gc2hvdyBpdCBldmVuIHRoZXJlIGlzIG9ubHkgb25lIHBhZ2UuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGFsd2F5c1Nob3dQYWdpbmF0b3I6IGJvb2xlYW4gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFBvc2l0aW9uIG9mIHRoZSBwYWdpbmF0b3IsIG9wdGlvbnMgYXJlIFwidG9wXCIsIFwiYm90dG9tXCIgb3IgXCJib3RoXCIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgcGFnaW5hdG9yUG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnYm90aCcgPSAnYm90dG9tJztcbiAgICAvKipcbiAgICAgKiBDdXN0b20gc3R5bGUgY2xhc3MgZm9yIHBhZ2luYXRvclxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhZ2luYXRvclN0eWxlQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBUYXJnZXQgZWxlbWVudCB0byBhdHRhY2ggdGhlIHBhZ2luYXRvciBkcm9wZG93biBvdmVybGF5LCB2YWxpZCB2YWx1ZXMgYXJlIFwiYm9keVwiIG9yIGEgbG9jYWwgbmctdGVtcGxhdGUgdmFyaWFibGUgb2YgYW5vdGhlciBlbGVtZW50IChub3RlOiB1c2UgYmluZGluZyB3aXRoIGJyYWNrZXRzIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXMsIGUuZy4gW2FwcGVuZFRvXT1cIm15ZGl2XCIgZm9yIGEgZGl2IGVsZW1lbnQgaGF2aW5nICNteWRpdiBhcyB2YXJpYWJsZSBuYW1lKS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWYgfCBUZW1wbGF0ZVJlZjxhbnk+IHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB8IGFueTtcbiAgICAvKipcbiAgICAgKiBQYWdpbmF0b3IgZHJvcGRvd24gaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCBpbiBwaXhlbHMsIGEgc2Nyb2xsYmFyIGlzIGRlZmluZWQgaWYgaGVpZ2h0IG9mIGxpc3QgZXhjZWVkcyB0aGlzIHZhbHVlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhZ2luYXRvckRyb3Bkb3duU2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSAnMjAwcHgnO1xuICAgIC8qKlxuICAgICAqIFRlbXBsYXRlIG9mIHRoZSBjdXJyZW50IHBhZ2UgcmVwb3J0IGVsZW1lbnQuIEF2YWlsYWJsZSBwbGFjZWhvbGRlcnMgYXJlIHtjdXJyZW50UGFnZX0se3RvdGFsUGFnZXN9LHtyb3dzfSx7Zmlyc3R9LHtsYXN0fSBhbmQge3RvdGFsUmVjb3Jkc31cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlOiBzdHJpbmcgPSAne2N1cnJlbnRQYWdlfSBvZiB7dG90YWxQYWdlc30nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZGlzcGxheSBjdXJyZW50IHBhZ2UgcmVwb3J0LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93Q3VycmVudFBhZ2VSZXBvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBkaXNwbGF5IGEgZHJvcGRvd24gdG8gbmF2aWdhdGUgdG8gYW55IHBhZ2UuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dKdW1wVG9QYWdlRHJvcGRvd246IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBkaXNwbGF5IGEgaW5wdXQgdG8gbmF2aWdhdGUgdG8gYW55IHBhZ2UuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dKdW1wVG9QYWdlSW5wdXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hlbiBlbmFibGVkLCBpY29ucyBhcmUgZGlzcGxheWVkIG9uIHBhZ2luYXRvciB0byBnbyBmaXJzdCBhbmQgbGFzdCBwYWdlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93Rmlyc3RMYXN0SWNvbjogYm9vbGVhbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBzaG93IHBhZ2UgbGlua3MuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dQYWdlTGlua3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFNvcnQgb3JkZXIgdG8gdXNlIHdoZW4gYW4gdW5zb3J0ZWQgY29sdW1uIGdldHMgc29ydGVkIGJ5IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgZGVmYXVsdFNvcnRPcmRlcjogbnVtYmVyID0gMTtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgc29ydGluZyB3b3JrcyBvbiBzaW5nbGUgY29sdW1uIG9yIG9uIG11bHRpcGxlIGNvbHVtbnMuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZmlsdGVyVHlwZTogJ2RlZmF1bHQnIHwgJ2N1c3RvbScgPSAnZGVmYXVsdCc7XG4gICAgQElucHV0KCkgc29ydFR5cGU6ICdkZWZhdWx0JyB8ICdjdXN0b20nID0gJ2RlZmF1bHQnO1xuICAgIEBJbnB1dCgpIHNvcnRNb2RlOiAnc2luZ2xlJyB8ICdtdWx0aXBsZScgPSAnc2luZ2xlJztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHJlc2V0cyBwYWdpbmF0b3IgdG8gZmlyc3QgcGFnZSBhZnRlciBzb3J0aW5nLiBBdmFpbGFibGUgb25seSB3aGVuIHNvcnRNb2RlIGlzIHNldCB0byBzaW5nbGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlc2V0UGFnZU9uU29ydDogYm9vbGVhbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBzZWxlY3Rpb24gbW9kZSwgdmFsaWQgdmFsdWVzIGFyZSBcInNpbmdsZVwiIGFuZCBcIm11bHRpcGxlXCIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScgfCAnbXVsdGlwbGUnIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGVuYWJsZWQgd2l0aCBwYWdpbmF0b3IgYW5kIGNoZWNrYm94IHNlbGVjdGlvbiBtb2RlLCB0aGUgc2VsZWN0IGFsbCBjaGVja2JveCBpbiB0aGUgaGVhZGVyIHdpbGwgc2VsZWN0IGFsbCByb3dzIG9uIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNlbGVjdGlvblBhZ2VPbmx5OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFNlbGVjdGVkIHJvdyB3aXRoIGEgY29udGV4dCBtZW51LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbnRleHRNZW51U2VsZWN0aW9uOiBhbnk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIGNvbnRleHQgbWVudSBzZWxlY3Rpb24gY2hhbmdlLlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IC0gcm93IGRhdGEuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIGNvbnRleHRNZW51U2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAvKipcbiAgICAgKiAgRGVmaW5lcyB0aGUgYmVoYXZpb3Igb2YgY29udGV4dCBtZW51IHNlbGVjdGlvbiwgaW4gXCJzZXBhcmF0ZVwiIG1vZGUgY29udGV4dCBtZW51IHVwZGF0ZXMgY29udGV4dE1lbnVTZWxlY3Rpb24gcHJvcGVydHkgd2hlcmVhcyBpbiBqb2ludCBtb2RlIHNlbGVjdGlvbiBwcm9wZXJ0eSBpcyB1c2VkIGluc3RlYWQgc28gdGhhdCB3aGVuIHJvdyBzZWxlY3Rpb24gaXMgZW5hYmxlZCwgYm90aCByb3cgc2VsZWN0aW9uIGFuZCBjb250ZXh0IG1lbnUgc2VsZWN0aW9uIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBjb250ZXh0TWVudVNlbGVjdGlvbk1vZGU6IHN0cmluZyA9ICdzZXBhcmF0ZSc7XG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSB0byB1bmlxdWVseSBpZGVudGlmeSBhIHJlY29yZCBpbiBkYXRhLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGRhdGFLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgbWV0YUtleSBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3IgdGhlIHNlbGVjdGlvbi4gT24gdG91Y2ggZW5hYmxlZCBkZXZpY2VzLCBtZXRhS2V5U2VsZWN0aW9uIGlzIHR1cm5lZCBvZmYgYXV0b21hdGljYWxseS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbWV0YUtleVNlbGVjdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgaWYgdGhlIHJvdyBpcyBzZWxlY3RhYmxlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHJvd1NlbGVjdGFibGU6IChyb3c6IHsgZGF0YTogYW55OyBpbmRleDogbnVtYmVyIH0pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gb3B0aW1pemUgdGhlIGRvbSBvcGVyYXRpb25zIGJ5IGRlbGVnYXRpbmcgdG8gbmdGb3JUcmFja0J5LCBkZWZhdWx0IGFsZ29yaXRobSBjaGVja3MgZm9yIG9iamVjdCBpZGVudGl0eS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSByb3dUcmFja0J5OiBGdW5jdGlvbiA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW07XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBpZiBkYXRhIGlzIGxvYWRlZCBhbmQgaW50ZXJhY3RlZCB3aXRoIGluIGxhenkgbWFubmVyLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBsYXp5OiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBjYWxsIGxhenkgbG9hZGluZyBvbiBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbGF6eUxvYWRPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIEFsZ29yaXRobSB0byBkZWZpbmUgaWYgYSByb3cgaXMgc2VsZWN0ZWQsIHZhbGlkIHZhbHVlcyBhcmUgXCJlcXVhbHNcIiB0aGF0IGNvbXBhcmVzIGJ5IHJlZmVyZW5jZSBhbmQgXCJkZWVwRXF1YWxzXCIgdGhhdCBjb21wYXJlcyBhbGwgZmllbGRzLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbXBhcmVTZWxlY3Rpb25CeTogJ2VxdWFscycgfCAnZGVlcEVxdWFscycgPSAnZGVlcEVxdWFscyc7XG4gICAgLyoqXG4gICAgICogQ2hhcmFjdGVyIHRvIHVzZSBhcyB0aGUgY3N2IHNlcGFyYXRvci5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBjc3ZTZXBhcmF0b3I6IHN0cmluZyA9ICcsJztcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBleHBvcnRlZCBmaWxlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGV4cG9ydEZpbGVuYW1lOiBzdHJpbmcgPSAnZG93bmxvYWQnO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEZpbHRlck1ldGFkYXRhIG9iamVjdHMgdG8gcHJvdmlkZSBleHRlcm5hbCBmaWx0ZXJzLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpbHRlcnM6IHsgW3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhIHwgRmlsdGVyTWV0YWRhdGFbXSB9ID0ge307XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZmllbGRzIGFzIHN0cmluZyB0byB1c2UgaW4gZ2xvYmFsIGZpbHRlcmluZy5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBnbG9iYWxGaWx0ZXJGaWVsZHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIERlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgZmlsdGVyaW5nIHRoZSBkYXRhLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIGZpbHRlckRlbGF5OiBudW1iZXIgPSAzMDA7XG4gICAgLyoqXG4gICAgICogTG9jYWxlIHRvIHVzZSBpbiBmaWx0ZXJpbmcuIFRoZSBkZWZhdWx0IGxvY2FsZSBpcyB0aGUgaG9zdCBlbnZpcm9ubWVudCdzIGN1cnJlbnQgbG9jYWxlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpbHRlckxvY2FsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIE1hcCBpbnN0YW5jZSB0byBrZWVwIHRoZSBleHBhbmRlZCByb3dzIHdoZXJlIGtleSBvZiB0aGUgbWFwIGlzIHRoZSBkYXRhIGtleSBvZiB0aGUgcm93LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGV4cGFuZGVkUm93S2V5czogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgLyoqXG4gICAgICogTWFwIGluc3RhbmNlIHRvIGtlZXAgdGhlIHJvd3MgYmVpbmcgZWRpdGVkIHdoZXJlIGtleSBvZiB0aGUgbWFwIGlzIHRoZSBkYXRhIGtleSBvZiB0aGUgcm93LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGVkaXRpbmdSb3dLZXlzOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG11bHRpcGxlIHJvd3MgY2FuIGJlIGV4cGFuZGVkIGF0IGFueSB0aW1lLiBWYWxpZCB2YWx1ZXMgYXJlIFwibXVsdGlwbGVcIiBhbmQgXCJzaW5nbGVcIi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSByb3dFeHBhbmRNb2RlOiAnbXVsdGlwbGUnIHwgJ3NpbmdsZScgPSAnbXVsdGlwbGUnO1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc2Nyb2xsYWJsZSB0YWJsZXMuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNjcm9sbGFibGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogT3JpZW50YXRpb24gb2YgdGhlIHNjcm9sbGluZywgb3B0aW9ucyBhcmUgXCJ2ZXJ0aWNhbFwiLCBcImhvcml6b250YWxcIiBhbmQgXCJib3RoXCIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICogQGRlcHJlY2F0ZWQgUHJvcGVydHkgaXMgb2JzZWxldGUgc2luY2UgdjE0LjIuMC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzY3JvbGxEaXJlY3Rpb246ICd2ZXJ0aWNhbCcgfCAnaG9yaXpvbnRhbCcgfCAnYm90aCcgPSAndmVydGljYWwnO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgdGhlIHJvdyBncm91cGluZywgdmFsaWQgdmFsdWVzIGFyZSBcInN1YmhlYWRlclwiIGFuZCBcInJvd3NwYW5cIi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSByb3dHcm91cE1vZGU6ICdzdWJoZWFkZXInIHwgJ3Jvd3NwYW4nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIEhlaWdodCBvZiB0aGUgc2Nyb2xsIHZpZXdwb3J0IGluIGZpeGVkIHBpeGVscyBvciB0aGUgXCJmbGV4XCIga2V5d29yZCBmb3IgYSBkeW5hbWljIHNpemUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgZGF0YSBzaG91bGQgYmUgbG9hZGVkIG9uIGRlbWFuZCBkdXJpbmcgc2Nyb2xsLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIEhlaWdodCBvZiBhIHJvdyB0byB1c2UgaW4gY2FsY3VsYXRpb25zIG9mIHZpcnR1YWwgc2Nyb2xsaW5nLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHZpcnR1YWxTY3JvbGxJdGVtU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gdXNlIHRoZSBzY3JvbGxlciBmZWF0dXJlLiBUaGUgcHJvcGVydGllcyBvZiBzY3JvbGxlciBjb21wb25lbnQgY2FuIGJlIHVzZWQgbGlrZSBhbiBvYmplY3QgaW4gaXQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgdmlydHVhbFNjcm9sbE9wdGlvbnM6IFNjcm9sbGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBUaHJlc2hvbGQgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGxhenkgbG9hZGluZyBkdXJpbmcgc2Nyb2xsaW5nLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHZpcnR1YWxTY3JvbGxEZWxheTogbnVtYmVyID0gMjUwO1xuICAgIC8qKlxuICAgICAqIFdpZHRoIG9mIHRoZSBmcm96ZW4gY29sdW1ucyBjb250YWluZXIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZnJvemVuV2lkdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGlmIHRoZSB0YWJsZSBpcyByZXNwb25zaXZlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqIEBkZXByZWNhdGVkIHRhYmxlIGlzIGFsd2F5cyByZXNwb25zaXZlIHdpdGggc2Nyb2xsYWJsZSBiZWhhdmlvci5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgcmVzcG9uc2l2ZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNwb25zaXZlO1xuICAgIH1cbiAgICBzZXQgcmVzcG9uc2l2ZSh2YWw6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNpdmUgPSB2YWw7XG4gICAgICAgIGNvbnNvbGUud2FybigncmVzcG9uc2l2ZSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFzIHRhYmxlIGlzIGFsd2F5cyByZXNwb25zaXZlIHdpdGggc2Nyb2xsYWJsZSBiZWhhdmlvci4nKTtcbiAgICB9XG4gICAgX3Jlc3BvbnNpdmU6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExvY2FsIG5nLXRlbXBsYXRlIHZhcmlsYWJsZSBvZiBhIENvbnRleHRNZW51LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbnRleHRNZW51OiBhbnk7XG4gICAgLyoqXG4gICAgICogV2hlbiBlbmFibGVkLCBjb2x1bW5zIGNhbiBiZSByZXNpemVkIHVzaW5nIGRyYWcgYW5kIGRyb3AuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlc2l6YWJsZUNvbHVtbnM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBvdmVyYWxsIHRhYmxlIHdpZHRoIHNob3VsZCBjaGFuZ2Ugb24gY29sdW1uIHJlc2l6ZSwgdmFsaWQgdmFsdWVzIGFyZSBcImZpdFwiIGFuZCBcImV4cGFuZFwiLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbHVtblJlc2l6ZU1vZGU6IHN0cmluZyA9ICdmaXQnO1xuICAgIC8qKlxuICAgICAqIFdoZW4gZW5hYmxlZCwgY29sdW1ucyBjYW4gYmUgcmVvcmRlcmVkIHVzaW5nIGRyYWcgYW5kIGRyb3AuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlb3JkZXJhYmxlQ29sdW1uczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGxvYWRlciB0byBpbmRpY2F0ZSBkYXRhIGxvYWQgaXMgaW4gcHJvZ3Jlc3MuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGxvYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIGljb24gdG8gc2hvdyB3aGlsZSBpbmRpY2F0aW5nIGRhdGEgbG9hZCBpcyBpbiBwcm9ncmVzcy5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBsb2FkaW5nSWNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgbG9hZGluZyBtYXNrIHdoZW4gbG9hZGluZyBwcm9wZXJ0eSBpcyB0cnVlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGhvdmVyIGVmZmVjdCB0byByb3dzIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHNlbGVjdGlvbk1vZGUuIE5vdGUgdGhhdCB0ciBlbGVtZW50cyB0aGF0IGNhbiBiZSBob3ZlcmVkIG5lZWQgdG8gaGF2ZSBcImNheC1zZWxlY3RhYmxlLXJvd1wiIGNsYXNzIGZvciByb3dIb3ZlciB0byB3b3JrLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByb3dIb3ZlcjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHVzZSB0aGUgZGVmYXVsdCBzb3J0aW5nIG9yIGEgY3VzdG9tIG9uZSB1c2luZyBzb3J0RnVuY3Rpb24uXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGN1c3RvbVNvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byB1c2UgdGhlIGluaXRpYWwgc29ydCBiYWRnZSBvciBub3QuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dJbml0aWFsU29ydEJhZGdlOiBib29sZWFuID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjZWxsIHdpZHRocyBzY2FsZSBhY2NvcmRpbmcgdG8gdGhlaXIgY29udGVudCBvciBub3QuICBEZXByZWNhdGVkOiAgVGFibGUgbGF5b3V0IGlzIGFsd2F5cyBcImF1dG9cIi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b0xheW91dDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBFeHBvcnQgZnVuY3Rpb24uXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZXhwb3J0RnVuY3Rpb246IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIEN1c3RvbSBleHBvcnQgaGVhZGVyIG9mIHRoZSBjb2x1bW4gdG8gYmUgZXhwb3J0ZWQgYXMgQ1NWLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGV4cG9ydEhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgc3RhdGVmdWwgdGFibGUgdG8gdXNlIGluIHN0YXRlIHN0b3JhZ2UuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc3RhdGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoZXJlIGEgc3RhdGVmdWwgdGFibGUga2VlcHMgaXRzIHN0YXRlLCB2YWxpZCB2YWx1ZXMgYXJlIFwic2Vzc2lvblwiIGZvciBzZXNzaW9uU3RvcmFnZSBhbmQgXCJsb2NhbFwiIGZvciBsb2NhbFN0b3JhZ2UuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc3RhdGVTdG9yYWdlOiAnc2Vzc2lvbicgfCAnbG9jYWwnID0gJ3Nlc3Npb24nO1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGVkaXRpbmcgbW9kZSwgdmFsaWQgdmFsdWVzIGFyZSBcImNlbGxcIiBhbmQgXCJyb3dcIi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0TW9kZTogJ2NlbGwnIHwgJ3JvdycgPSAnY2VsbCc7XG4gICAgLyoqXG4gICAgICogRmllbGQgbmFtZSB0byB1c2UgaW4gcm93IGdyb3VwaW5nLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGdyb3VwUm93c0J5OiBhbnk7XG4gICAgLyoqXG4gICAgICogT3JkZXIgdG8gc29ydCB3aGVuIGRlZmF1bHQgcm93IGdyb3VwaW5nIGlzIGVuYWJsZWQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgZ3JvdXBSb3dzQnlPcmRlcjogbnVtYmVyID0gMTtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSByZXNwb25zaXZlIG1vZGUsIHZhbGlkIG9wdGlvbnMgYXJlIFwic3RhY2tcIiBhbmQgXCJzY3JvbGxcIi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSByZXNwb25zaXZlTGF5b3V0OiBzdHJpbmcgPSAnc2Nyb2xsJztcbiAgICAvKipcbiAgICAgKiBUaGUgYnJlYWtwb2ludCB0byBkZWZpbmUgdGhlIG1heGltdW0gd2lkdGggYm91bmRhcnkgd2hlbiB1c2luZyBzdGFjayByZXNwb25zaXZlIGxheW91dC5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBicmVha3BvaW50OiBzdHJpbmcgPSAnOTYwcHgnO1xuICAgIC8qKlxuICAgICAqIExvY2FsZSB0byBiZSB1c2VkIGluIHBhZ2luYXRvciBmb3JtYXR0aW5nLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhZ2luYXRvckxvY2FsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gZGlzcGxheS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgdmFsdWUoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWw6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHJlcHJlc2VudCBkeW5hbWljIGNvbHVtbnMuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IGNvbHVtbnMoKTogYW55W10gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG4gICAgc2V0IGNvbHVtbnMoY29sczogYW55W10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IGNvbHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGV4IG9mIHRoZSBmaXJzdCByb3cgdG8gYmUgZGlzcGxheWVkLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBmaXJzdCgpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcnN0O1xuICAgIH1cbiAgICBzZXQgZmlyc3QodmFsOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2ZpcnN0ID0gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2Ygcm93cyB0byBkaXNwbGF5IHBlciBwYWdlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCByb3dzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dzO1xuICAgIH1cbiAgICBzZXQgcm93cyh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9yb3dzID0gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdG90YWwgcmVjb3JkcywgZGVmYXVsdHMgdG8gbGVuZ3RoIG9mIHZhbHVlIHdoZW4gbm90IGRlZmluZWQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxSZWNvcmRzO1xuICAgIH1cbiAgICBzZXQgdG90YWxSZWNvcmRzKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHZhbDtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25Ub3RhbFJlY29yZHNDaGFuZ2UodGhpcy5fdG90YWxSZWNvcmRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgZmllbGQgdG8gc29ydCBkYXRhIGJ5IGRlZmF1bHQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IHNvcnRGaWVsZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRGaWVsZDtcbiAgICB9XG4gICAgc2V0IHNvcnRGaWVsZCh2YWw6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPcmRlciB0byBzb3J0IHdoZW4gZGVmYXVsdCBzb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IHNvcnRPcmRlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydE9yZGVyO1xuICAgIH1cbiAgICBzZXQgc29ydE9yZGVyKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3NvcnRPcmRlciA9IHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgU29ydE1ldGEgb2JqZWN0cyB0byBzb3J0IHRoZSBkYXRhIGJ5IGRlZmF1bHQgaW4gbXVsdGlwbGUgc29ydCBtb2RlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBtdWx0aVNvcnRNZXRhKCk6IFNvcnRNZXRhW10gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211bHRpU29ydE1ldGE7XG4gICAgfVxuICAgIHNldCBtdWx0aVNvcnRNZXRhKHZhbDogU29ydE1ldGFbXSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbXVsdGlTb3J0TWV0YSA9IHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VsZWN0ZWQgcm93IGluIHNpbmdsZSBtb2RlIG9yIGFuIGFycmF5IG9mIHZhbHVlcyBpbiBtdWx0aXBsZSBtb2RlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBzZWxlY3Rpb24oKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcbiAgICB9XG4gICAgc2V0IHNlbGVjdGlvbih2YWw6IGFueSkge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSB2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYWxsIGRhdGEgaXMgc2VsZWN0ZWQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IHNlbGVjdEFsbCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XG4gICAgfVxuICAgIHNldCBzZWxlY3RBbGwodmFsOiBib29sZWFuIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSB2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW4gdGhlIGFsbCBvZiB0aGUgaXRlbXMgc2VsZWN0ZWQgb3IgdW5zZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0ge1RhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnR9IGV2ZW50IC0gY3VzdG9tICBhbGwgc2VsZWN0aW9uIGNoYW5nZSBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgc2VsZWN0QWxsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGFibGVTZWxlY3RBbGxDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQ+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIHNlbGVjdGlvbiBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSB7YW55IHwgbnVsbH0gdmFsdWUgLSBzZWxlY3RlZCBkYXRhLlxuICAgICAqIEBncm91cCBFbWl0c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnkgfCBudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55IHwgbnVsbD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIHJvdyBpcyBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0ge1RhYmxlUm93U2VsZWN0RXZlbnR9IGV2ZW50IC0gY3VzdG9tIHNlbGVjdCBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjxUYWJsZVJvd1NlbGVjdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVSb3dTZWxlY3RFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIHJvdyBpcyB1bnNlbGVjdGVkLlxuICAgICAqIEBwYXJhbSB7VGFibGVSb3dVblNlbGVjdEV2ZW50fSBldmVudCAtIGN1c3RvbSB1bnNlbGVjdCBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dVbnNlbGVjdDogRXZlbnRFbWl0dGVyPFRhYmxlUm93VW5TZWxlY3RFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUm93VW5TZWxlY3RFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBwYWdpbmF0aW9uIG9jY3Vycy5cbiAgICAgKiBAcGFyYW0ge1RhYmxlUGFnZUV2ZW50fSBldmVudCAtIGN1c3RvbSBwYWdpbmF0aW9uIGV2ZW50LlxuICAgICAqIEBncm91cCBFbWl0c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblBhZ2U6IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZUV2ZW50PigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgY29sdW1uIGdldHMgc29ydGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBzb3J0IG1ldGEuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU29ydDogRXZlbnRFbWl0dGVyPHsgbXVsdGlzb3J0bWV0YTogU29ydE1ldGFbXSB9IHwgYW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtdWx0aXNvcnRtZXRhOiBTb3J0TWV0YVtdIH0gfCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gZGF0YSBpcyBmaWx0ZXJlZC5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRmlsdGVyRXZlbnR9IGV2ZW50IC0gY3VzdG9tIGZpbHRlcmluZyBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25GaWx0ZXI6IEV2ZW50RW1pdHRlcjxUYWJsZUZpbHRlckV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVGaWx0ZXJFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBwYWdpbmcsIHNvcnRpbmcgb3IgZmlsdGVyaW5nIGhhcHBlbnMgaW4gbGF6eSBtb2RlLlxuICAgICAqIEBwYXJhbSB7VGFibGVMYXp5TG9hZEV2ZW50fSBldmVudCAtIGN1c3RvbSBsYXp5IGxvYWRpbmcgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTGF6eUxvYWQ6IEV2ZW50RW1pdHRlcjxUYWJsZUxhenlMb2FkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUxhenlMb2FkRXZlbnQ+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSByb3cgaXMgZXhwYW5kZWQuXG4gICAgICogQHBhcmFtIHtUYWJsZVJvd0V4cGFuZEV2ZW50fSBldmVudCAtIGN1c3RvbSByb3cgZXhwYW5kIGV2ZW50LlxuICAgICAqIEBncm91cCBFbWl0c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd0V4cGFuZDogRXZlbnRFbWl0dGVyPFRhYmxlUm93RXhwYW5kRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZVJvd0V4cGFuZEV2ZW50PigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgcm93IGlzIGNvbGxhcHNlZC5cbiAgICAgKiBAcGFyYW0ge1RhYmxlUm93Q29sbGFwc2VFdmVudH0gZXZlbnQgLSBjdXN0b20gcm93IGNvbGxhcHNlIGV2ZW50LlxuICAgICAqIEBncm91cCBFbWl0c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd0NvbGxhcHNlOiBFdmVudEVtaXR0ZXI8VGFibGVSb3dDb2xsYXBzZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVSb3dDb2xsYXBzZUV2ZW50PigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgcm93IGlzIHNlbGVjdGVkIHdpdGggcmlnaHQgY2xpY2suXG4gICAgICogQHBhcmFtIHtUYWJsZUNvbnRleHRNZW51U2VsZWN0RXZlbnR9IGV2ZW50IC0gY3VzdG9tIGNvbnRleHQgbWVudSBzZWxlY3QgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29udGV4dE1lbnVTZWxlY3Q6IEV2ZW50RW1pdHRlcjxUYWJsZUNvbnRleHRNZW51U2VsZWN0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUNvbnRleHRNZW51U2VsZWN0RXZlbnQ+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBjb2x1bW4gaXMgcmVzaXplZC5cbiAgICAgKiBAcGFyYW0ge1RhYmxlQ29sUmVzaXplRXZlbnR9IGV2ZW50IC0gY3VzdG9tIGNvbHVtbiByZXNpemUgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sUmVzaXplOiBFdmVudEVtaXR0ZXI8VGFibGVDb2xSZXNpemVFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlQ29sUmVzaXplRXZlbnQ+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBjb2x1bW4gaXMgcmVvcmRlcmVkLlxuICAgICAqIEBwYXJhbSB7VGFibGVDb2x1bW5SZW9yZGVyRXZlbnR9IGV2ZW50IC0gY3VzdG9tIGNvbHVtbiByZW9yZGVyIGV2ZW50LlxuICAgICAqIEBncm91cCBFbWl0c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbFJlb3JkZXI6IEV2ZW50RW1pdHRlcjxUYWJsZUNvbHVtblJlb3JkZXJFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50PigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgcm93IGlzIHJlb3JkZXJlZC5cbiAgICAgKiBAcGFyYW0ge1RhYmxlUm93UmVvcmRlckV2ZW50fSBldmVudCAtIGN1c3RvbSByb3cgcmVvcmRlciBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dSZW9yZGVyOiBFdmVudEVtaXR0ZXI8VGFibGVSb3dSZW9yZGVyRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZVJvd1Jlb3JkZXJFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIGNlbGwgc3dpdGNoZXMgdG8gZWRpdCBtb2RlLlxuICAgICAqIEBwYXJhbSB7VGFibGVFZGl0SW5pdEV2ZW50fSBldmVudCAtIGN1c3RvbSBlZGl0IGluaXQgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRWRpdEluaXQ6IEV2ZW50RW1pdHRlcjxUYWJsZUVkaXRJbml0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUVkaXRJbml0RXZlbnQ+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gY2VsbCBlZGl0IGlzIGNvbXBsZXRlZC5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRWRpdENvbXBsZXRlRXZlbnR9IGV2ZW50IC0gY3VzdG9tIGVkaXQgY29tcGxldGUgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRWRpdENvbXBsZXRlOiBFdmVudEVtaXR0ZXI8VGFibGVFZGl0Q29tcGxldGVFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWRpdENvbXBsZXRlRXZlbnQ+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gY2VsbCBlZGl0IGlzIGNhbmNlbGxlZCB3aXRoIGVzY2FwZSBrZXkuXG4gICAgICogQHBhcmFtIHtUYWJsZUVkaXRDYW5jZWxFdmVudH0gZXZlbnQgLSBjdXN0b20gZWRpdCBjYW5jZWwgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRWRpdENhbmNlbDogRXZlbnRFbWl0dGVyPFRhYmxlRWRpdENhbmNlbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFZGl0Q2FuY2VsRXZlbnQ+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gc3RhdGUgb2YgaGVhZGVyIGNoZWNrYm94IGNoYW5nZXMuXG4gICAgICogQHBhcmFtIHtUYWJsZUhlYWRlckNoZWNrYm94VG9nZ2xlRXZlbnR9IGV2ZW50IC0gY3VzdG9tIGhlYWRlciBjaGVja2JveCBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJDaGVja2JveFRvZ2dsZTogRXZlbnRFbWl0dGVyPFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBjdXN0b20gc29ydGluZywgcmVmZXIgdG8gc29ydGluZyBzZWN0aW9uIGZvciBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7YW55fSBhbnkgLSBzb3J0IG1ldGEuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNvcnRGdW5jdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugb24gcGFnaW5hdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gZmlyc3QgZWxlbWVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlyc3RDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIHJvd3MgY2hhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgLSBSb3cgY291bnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJvd3NDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHRhYmxlIHN0YXRlIGlzIHNhdmVkLlxuICAgICAqIEBwYXJhbSB7VGFibGVTdGF0ZX0gb2JqZWN0IC0gdGFibGUgc3RhdGUuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3RhdGVTYXZlOiBFdmVudEVtaXR0ZXI8VGFibGVTdGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlU3RhdGU+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHRhYmxlIHN0YXRlIGlzIHJlc3RvcmVkLlxuICAgICAqIEBwYXJhbSB7VGFibGVTdGF0ZX0gb2JqZWN0IC0gdGFibGUgc3RhdGUuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3RhdGVSZXN0b3JlOiBFdmVudEVtaXR0ZXI8VGFibGVTdGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlU3RhdGU+KCk7XG5cbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXJWaWV3Q2hpbGQ6IE51bGxhYmxlPEVsZW1lbnRSZWY+O1xuXG4gICAgQFZpZXdDaGlsZCgncmVzaXplSGVscGVyJykgcmVzaXplSGVscGVyVmlld0NoaWxkOiBOdWxsYWJsZTxFbGVtZW50UmVmPjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Jlb3JkZXJJbmRpY2F0b3JVcCcpIHJlb3JkZXJJbmRpY2F0b3JVcFZpZXdDaGlsZDogTnVsbGFibGU8RWxlbWVudFJlZj47XG5cbiAgICBAVmlld0NoaWxkKCdyZW9yZGVySW5kaWNhdG9yRG93bicpIHJlb3JkZXJJbmRpY2F0b3JEb3duVmlld0NoaWxkOiBOdWxsYWJsZTxFbGVtZW50UmVmPjtcblxuICAgIEBWaWV3Q2hpbGQoJ3dyYXBwZXInKSB3cmFwcGVyVmlld0NoaWxkOiBOdWxsYWJsZTxFbGVtZW50UmVmPjtcblxuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlJykgdGFibGVWaWV3Q2hpbGQ6IE51bGxhYmxlPEVsZW1lbnRSZWY+O1xuXG4gICAgQFZpZXdDaGlsZCgndGhlYWQnKSB0YWJsZUhlYWRlclZpZXdDaGlsZDogTnVsbGFibGU8RWxlbWVudFJlZj47XG5cbiAgICBAVmlld0NoaWxkKCd0Zm9vdCcpIHRhYmxlRm9vdGVyVmlld0NoaWxkOiBOdWxsYWJsZTxFbGVtZW50UmVmPjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbGVyJykgc2Nyb2xsZXI6IE51bGxhYmxlPFNjcm9sbGVyPjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oQ2F4VGVtcGxhdGUpIHRlbXBsYXRlczogTnVsbGFibGU8UXVlcnlMaXN0PENheFRlbXBsYXRlPj47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoZSBoZWlnaHQgb2Ygcm93cyB0byBiZSBzY3JvbGxlZC5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdmlydHVhbFNjcm9sbEl0ZW1TaXplIHByb3BlcnR5IGluc3RlYWQuXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IHZpcnR1YWxSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpcnR1YWxSb3dIZWlnaHQ7XG4gICAgfVxuICAgIHNldCB2aXJ0dWFsUm93SGVpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3ZpcnR1YWxSb3dIZWlnaHQgPSB2YWw7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhlIHZpcnR1YWxSb3dIZWlnaHQgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4nKTtcbiAgICB9XG4gICAgX3ZpcnR1YWxSb3dIZWlnaHQ6IG51bWJlciA9IDI4O1xuXG4gICAgX3ZhbHVlOiBhbnlbXSA9IFtdO1xuXG4gICAgX2NvbHVtbnM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gICAgX3RvdGFsUmVjb3JkczogbnVtYmVyID0gMDtcblxuICAgIF9maXJzdDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgICBfcm93czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgZmlsdGVyZWRWYWx1ZTogYW55W10gfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgaGVhZGVyVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgaGVhZGVyR3JvdXBlZFRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIGJvZHlUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBsb2FkaW5nQm9keVRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIGNhcHRpb25UZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBmb290ZXJUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBmb290ZXJHcm91cGVkVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgc3VtbWFyeVRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIGNvbEdyb3VwVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgZXhwYW5kZWRSb3dUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBncm91cEhlYWRlclRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIGdyb3VwRm9vdGVyVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgZnJvemVuRXhwYW5kZWRSb3dUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBmcm96ZW5IZWFkZXJUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBmcm96ZW5Cb2R5VGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgZnJvemVuRm9vdGVyVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgZnJvemVuQ29sR3JvdXBUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBlbXB0eU1lc3NhZ2VUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBwYWdpbmF0b3JMZWZ0VGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgcGFnaW5hdG9yUmlnaHRUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBwYWdpbmF0b3JEcm9wZG93bkl0ZW1UZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBsb2FkaW5nSWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIHJlb3JkZXJJbmRpY2F0b3JVcEljb25UZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICByZW9yZGVySW5kaWNhdG9yRG93bkljb25UZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBzb3J0SWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIGNoZWNrYm94SWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIGhlYWRlckNoZWNrYm94SWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIHBhZ2luYXRvckRyb3Bkb3duSWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIHBhZ2luYXRvckZpcnN0UGFnZUxpbmtJY29uVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgcGFnaW5hdG9yTGFzdFBhZ2VMaW5rSWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIHBhZ2luYXRvclByZXZpb3VzUGFnZUxpbmtJY29uVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgcGFnaW5hdG9yTmV4dFBhZ2VMaW5rSWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIHNlbGVjdGlvbktleXM6IGFueSA9IHt9O1xuXG4gICAgbGFzdFJlc2l6ZXJIZWxwZXJYOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICByZW9yZGVySWNvbldpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICByZW9yZGVySWNvbkhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgZHJhZ2dlZENvbHVtbjogYW55O1xuXG4gICAgZHJhZ2dlZFJvd0luZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgZHJvcHBlZFJvd0luZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgcm93RHJhZ2dpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgZHJvcFBvc2l0aW9uOiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgZWRpdGluZ0NlbGw6IEVsZW1lbnQgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgZWRpdGluZ0NlbGxEYXRhOiBhbnk7XG5cbiAgICBlZGl0aW5nQ2VsbEZpZWxkOiBhbnk7XG5cbiAgICBlZGl0aW5nQ2VsbFJvd0luZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgc2VsZkNsaWNrOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuICAgIGRvY3VtZW50RWRpdExpc3RlbmVyOiBhbnk7XG5cbiAgICBfbXVsdGlTb3J0TWV0YTogU29ydE1ldGFbXSB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgICBfc29ydEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgX3NvcnRPcmRlcjogbnVtYmVyID0gMTtcblxuICAgIHByZXZlbnRTZWxlY3Rpb25TZXR0ZXJQcm9wYWdhdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIF9zZWxlY3Rpb246IGFueTtcblxuICAgIF9zZWxlY3RBbGw6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICAgIGFuY2hvclJvd0luZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgcmFuZ2VSb3dJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgZmlsdGVyVGltZW91dDogYW55O1xuXG4gICAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgcm93VG91Y2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIHJlc3RvcmluZ1NvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgICByZXN0b3JpbmdGaWx0ZXI6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgICBzdGF0ZVJlc3RvcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgY29sdW1uT3JkZXJTdGF0ZVJlc3RvcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgY29sdW1uV2lkdGhzU3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRhYmxlV2lkdGhTdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgb3ZlcmxheVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgcmVzaXplQ29sdW1uRWxlbWVudDogYW55O1xuXG4gICAgY29sdW1uUmVzaXppbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHJvd0dyb3VwSGVhZGVyU3R5bGVPYmplY3Q6IGFueSA9IHt9O1xuXG4gICAgaWQ6IHN0cmluZyA9IFVuaXF1ZUNvbXBvbmVudElkKCk7XG5cbiAgICBzdHlsZUVsZW1lbnQ6IGFueTtcblxuICAgIHJlc3BvbnNpdmVTdHlsZUVsZW1lbnQ6IGFueTtcblxuICAgIHByaXZhdGUgd2luZG93OiBXaW5kb3c7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55LFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHVibGljIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgcHVibGljIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcbiAgICAgICAgcHVibGljIG92ZXJsYXlTZXJ2aWNlOiBPdmVybGF5U2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbmZpZzogY2F4Q29uZmlnLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMud2luZG93ID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldyBhcyBXaW5kb3c7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxhenkgJiYgdGhpcy5sYXp5TG9hZE9uSW5pdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uTGF6eUxvYWQuZW1pdCh0aGlzLmNyZWF0ZUxhenlMb2FkTWV0YWRhdGEoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlc3RvcmluZ0ZpbHRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yaW5nRmlsdGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZXNwb25zaXZlTGF5b3V0ID09PSAnc3RhY2snKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVJlc3BvbnNpdmVTdHlsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICAodGhpcy50ZW1wbGF0ZXMgYXMgUXVlcnlMaXN0PENheFRlbXBsYXRlPikuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb25UZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnaGVhZGVyZ3JvdXBlZCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyR3JvdXBlZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdib2R5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ib2R5VGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2xvYWRpbmdib2R5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQm9keVRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdmb290ZXInOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvb3RlclRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdmb290ZXJncm91cGVkJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb290ZXJHcm91cGVkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbEdyb3VwVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3Jvd2V4cGFuc2lvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWRSb3dUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBoZWFkZXInOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2dyb3VwZm9vdGVyJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cEZvb3RlclRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdmcm96ZW5oZWFkZXInOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyb3plbkhlYWRlclRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdmcm96ZW5ib2R5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcm96ZW5Cb2R5VGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zyb3plbmZvb3Rlcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJvemVuRm9vdGVyVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zyb3plbmNvbGdyb3VwJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcm96ZW5Db2xHcm91cFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdmcm96ZW5yb3dleHBhbnNpb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyb3plbkV4cGFuZGVkUm93VGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2VtcHR5bWVzc2FnZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1wdHlNZXNzYWdlVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3BhZ2luYXRvcmxlZnQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvckxlZnRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAncGFnaW5hdG9ycmlnaHQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvclJpZ2h0VGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3BhZ2luYXRvcmRyb3Bkb3duaWNvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yRHJvcGRvd25JY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3BhZ2luYXRvcmRyb3Bkb3duaXRlbSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yRHJvcGRvd25JdGVtVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3BhZ2luYXRvcmZpcnN0cGFnZWxpbmtpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3JGaXJzdFBhZ2VMaW5rSWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdwYWdpbmF0b3JsYXN0cGFnZWxpbmtpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3JMYXN0UGFnZUxpbmtJY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3BhZ2luYXRvcnByZXZpb3VzcGFnZWxpbmtpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3JQcmV2aW91c1BhZ2VMaW5rSWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdwYWdpbmF0b3JuZXh0cGFnZWxpbmtpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3JOZXh0UGFnZUxpbmtJY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2xvYWRpbmdpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nSWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdyZW9yZGVyaW5kaWNhdG9ydXBpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW9yZGVySW5kaWNhdG9yVXBJY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3Jlb3JkZXJpbmRpY2F0b3Jkb3duaWNvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVvcmRlckluZGljYXRvckRvd25JY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3NvcnRpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0SWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdjaGVja2JveGljb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrYm94SWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdoZWFkZXJjaGVja2JveGljb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckNoZWNrYm94SWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhdGVmdWwoKSAmJiB0aGlzLnJlc2l6YWJsZUNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVDb2x1bW5XaWR0aHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKHNpbXBsZUNoYW5nZTogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoc2ltcGxlQ2hhbmdlLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0YXRlZnVsKCkgJiYgIXRoaXMuc3RhdGVSZXN0b3JlZCAmJiBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU3RhdGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBzaW1wbGVDaGFuZ2UudmFsdWUuY3VycmVudFZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubGF6eSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gdGhpcy5fdmFsdWUgPyB0aGlzLl92YWx1ZS5sZW5ndGggOiAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT0gJ3NpbmdsZScgJiYgKHRoaXMuc29ydEZpZWxkIHx8IHRoaXMuZ3JvdXBSb3dzQnkpKSB0aGlzLnNvcnRTaW5nbGUoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNvcnRNb2RlID09ICdtdWx0aXBsZScgJiYgKHRoaXMubXVsdGlTb3J0TWV0YSB8fCB0aGlzLmdyb3VwUm93c0J5KSkgdGhpcy5zb3J0TXVsdGlwbGUoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmhhc0ZpbHRlcigpKVxuICAgICAgICAgICAgICAgICAgICAvL3NvcnQgYWxyZWFkeSBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5vblZhbHVlQ2hhbmdlKHNpbXBsZUNoYW5nZS52YWx1ZS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpbXBsZUNoYW5nZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTdGF0ZWZ1bCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucyA9IHNpbXBsZUNoYW5nZS5jb2x1bW5zLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5vbkNvbHVtbnNDaGFuZ2Uoc2ltcGxlQ2hhbmdlLmNvbHVtbnMuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbHVtbnMgJiYgdGhpcy5pc1N0YXRlZnVsKCkgJiYgdGhpcy5yZW9yZGVyYWJsZUNvbHVtbnMgJiYgIXRoaXMuY29sdW1uT3JkZXJTdGF0ZVJlc3RvcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlQ29sdW1uT3JkZXIoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLm9uQ29sdW1uc0NoYW5nZSh0aGlzLl9jb2x1bW5zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVDaGFuZ2Uuc29ydEZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0RmllbGQgPSBzaW1wbGVDaGFuZ2Uuc29ydEZpZWxkLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgLy9hdm9pZCB0cmlnZ2VyaW5nIGxhenkgbG9hZCBwcmlvciB0byBsYXp5IGluaXRpYWxpemF0aW9uIGF0IG9uSW5pdFxuICAgICAgICAgICAgaWYgKCF0aGlzLmxhenkgfHwgdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRTaW5nbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2ltcGxlQ2hhbmdlLmdyb3VwUm93c0J5KSB7XG4gICAgICAgICAgICAvL2F2b2lkIHRyaWdnZXJpbmcgbGF6eSBsb2FkIHByaW9yIHRvIGxhenkgaW5pdGlhbGl6YXRpb24gYXQgb25Jbml0XG4gICAgICAgICAgICBpZiAoIXRoaXMubGF6eSB8fCB0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydFNpbmdsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVDaGFuZ2Uuc29ydE9yZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSBzaW1wbGVDaGFuZ2Uuc29ydE9yZGVyLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgLy9hdm9pZCB0cmlnZ2VyaW5nIGxhenkgbG9hZCBwcmlvciB0byBsYXp5IGluaXRpYWxpemF0aW9uIGF0IG9uSW5pdFxuICAgICAgICAgICAgaWYgKCF0aGlzLmxhenkgfHwgdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRTaW5nbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2ltcGxlQ2hhbmdlLmdyb3VwUm93c0J5T3JkZXIpIHtcbiAgICAgICAgICAgIC8vYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGxvYWQgcHJpb3IgdG8gbGF6eSBpbml0aWFsaXphdGlvbiBhdCBvbkluaXRcbiAgICAgICAgICAgIGlmICghdGhpcy5sYXp5IHx8IHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2luZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpbXBsZUNoYW5nZS5tdWx0aVNvcnRNZXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9tdWx0aVNvcnRNZXRhID0gc2ltcGxlQ2hhbmdlLm11bHRpU29ydE1ldGEuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09ICdtdWx0aXBsZScgJiYgKHRoaXMuaW5pdGlhbGl6ZWQgfHwgKCF0aGlzLmxhenkgJiYgIXRoaXMudmlydHVhbFNjcm9sbCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0TXVsdGlwbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVDaGFuZ2Uuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSBzaW1wbGVDaGFuZ2Uuc2VsZWN0aW9uLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRTZWxlY3Rpb25TZXR0ZXJQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uS2V5cygpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXZlbnRTZWxlY3Rpb25TZXR0ZXJQcm9wYWdhdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpbXBsZUNoYW5nZS5zZWxlY3RBbGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdEFsbCA9IHNpbXBsZUNoYW5nZS5zZWxlY3RBbGwuY3VycmVudFZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJldmVudFNlbGVjdGlvblNldHRlclByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25LZXlzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25TZWxlY3Rpb25DaGFuZ2UoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhdGVmdWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJldmVudFNlbGVjdGlvblNldHRlclByb3BhZ2F0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgcHJvY2Vzc2VkRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRWYWx1ZSB8fCB0aGlzLnZhbHVlIHx8IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRpYWxDb2xXaWR0aHM6IG51bWJlcltdO1xuXG4gICAgZGF0YVRvUmVuZGVyKGRhdGE6IGFueSkge1xuICAgICAgICBjb25zdCBfZGF0YSA9IGRhdGEgfHwgdGhpcy5wcm9jZXNzZWREYXRhO1xuXG4gICAgICAgIGlmIChfZGF0YSAmJiB0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLmxhenkgPyAwIDogdGhpcy5maXJzdDtcbiAgICAgICAgICAgIHJldHVybiBfZGF0YS5zbGljZShmaXJzdCwgPG51bWJlcj5maXJzdCArIDxudW1iZXI+dGhpcy5yb3dzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfZGF0YTtcbiAgICB9XG5cbiAgICB1cGRhdGVTZWxlY3Rpb25LZXlzKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhS2V5ICYmIHRoaXMuX3NlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzID0ge307XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9zZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGF0YSBvZiB0aGlzLl9zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzW1N0cmluZyhPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKGRhdGEsIHRoaXMuZGF0YUtleSkpXSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbktleXNbU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEodGhpcy5fc2VsZWN0aW9uLCB0aGlzLmRhdGFLZXkpKV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25QYWdlQ2hhbmdlKGV2ZW50OiBUYWJsZVBhZ2VFdmVudCkge1xuICAgICAgICB0aGlzLmZpcnN0ID0gZXZlbnQuZmlyc3Q7XG4gICAgICAgIHRoaXMucm93cyA9IGV2ZW50LnJvd3M7XG5cbiAgICAgICAgdGhpcy5vblBhZ2UuZW1pdCh7XG4gICAgICAgICAgICBmaXJzdDogdGhpcy5maXJzdCxcbiAgICAgICAgICAgIHJvd3M6IDxudW1iZXI+dGhpcy5yb3dzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmxhenkpIHtcbiAgICAgICAgICAgIHRoaXMub25MYXp5TG9hZC5lbWl0KHRoaXMuY3JlYXRlTGF6eUxvYWRNZXRhZGF0YSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyc3RDaGFuZ2UuZW1pdCh0aGlzLmZpcnN0KTtcbiAgICAgICAgdGhpcy5yb3dzQ2hhbmdlLmVtaXQodGhpcy5yb3dzKTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25WYWx1ZUNoYW5nZSh0aGlzLnZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5pc1N0YXRlZnVsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFuY2hvclJvd0luZGV4ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsVG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0U29ydE9yZGVyID0gKGN1cnJlbnQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyBmYWxsYmFjayB0byBkZWZhdWx0IGlmIHNvbWVob3cgaW52YWxpZFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHNvcnQoZXZlbnQ6IGFueSkge1xuICAgICAgICBsZXQgb3JpZ2luYWxFdmVudCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0VHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSB0aGlzLnNvcnRGaWVsZCA9PT0gZXZlbnQuZmllbGQgPyB0aGlzLm5leHRTb3J0T3JkZXIodGhpcy5fc29ydE9yZGVyKSA6IHRoaXMuZGVmYXVsdFNvcnRPcmRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydE9yZGVyID0gdGhpcy5zb3J0RmllbGQgPT09IGV2ZW50LmZpZWxkID8gdGhpcy5zb3J0T3JkZXIgKiAtMSA6IHRoaXMuZGVmYXVsdFNvcnRPcmRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IGV2ZW50LmZpZWxkO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXNldFBhZ2VPblNvcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJzdCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdENoYW5nZS5lbWl0KHRoaXMuX2ZpcnN0KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFRvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zb3J0U2luZ2xlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgICAgICAgIGxldCBtZXRhS2V5ID0gKDxLZXlib2FyZEV2ZW50Pm9yaWdpbmFsRXZlbnQpLm1ldGFLZXkgfHwgKDxLZXlib2FyZEV2ZW50Pm9yaWdpbmFsRXZlbnQpLmN0cmxLZXk7XG4gICAgICAgICAgICBsZXQgc29ydE1ldGEgPSB0aGlzLmdldFNvcnRNZXRhKDxzdHJpbmc+ZXZlbnQuZmllbGQpO1xuXG4gICAgICAgICAgICBpZiAoc29ydE1ldGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydFR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aVNvcnRNZXRhID0gW3sgZmllbGQ6IDxzdHJpbmc+ZXZlbnQuZmllbGQsIG9yZGVyOiB0aGlzLm5leHRTb3J0T3JkZXIoc29ydE1ldGEub3JkZXIpIH1dO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlTb3J0TWV0YSA9IFt7IGZpZWxkOiA8c3RyaW5nPmV2ZW50LmZpZWxkLCBvcmRlcjogc29ydE1ldGEub3JkZXIgKiAtMSB9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2V0UGFnZU9uU29ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlyc3QgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdENoYW5nZS5lbWl0KHRoaXMuX2ZpcnN0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGxUb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRUeXBlID09PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydE1ldGEub3JkZXIgPSB0aGlzLm5leHRTb3J0T3JkZXIoc29ydE1ldGEub3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydE1ldGEub3JkZXIgPSBzb3J0TWV0YS5vcmRlciAqIC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFLZXkgfHwgIXRoaXMubXVsdGlTb3J0TWV0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aVNvcnRNZXRhID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzZXRQYWdlT25Tb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maXJzdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0Q2hhbmdlLmVtaXQodGhpcy5fZmlyc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICg8U29ydE1ldGFbXT50aGlzLl9tdWx0aVNvcnRNZXRhKS5wdXNoKHsgZmllbGQ6IDxzdHJpbmc+ZXZlbnQuZmllbGQsIG9yZGVyOiB0aGlzLmRlZmF1bHRTb3J0T3JkZXIgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX211bHRpU29ydE1ldGEgPSB0aGlzLl9tdWx0aVNvcnRNZXRhLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5vcmRlciAhPT0gMCk7XG5cbiAgICAgICAgICAgIHRoaXMuc29ydE11bHRpcGxlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1N0YXRlZnVsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFuY2hvclJvd0luZGV4ID0gbnVsbDtcbiAgICB9XG5cbiAgICBzb3J0U2luZ2xlKCkge1xuICAgICAgICBsZXQgZmllbGQgPSB0aGlzLnNvcnRGaWVsZCB8fCB0aGlzLmdyb3VwUm93c0J5O1xuICAgICAgICBsZXQgb3JkZXIgPSB0aGlzLnNvcnRGaWVsZCA/IHRoaXMuc29ydE9yZGVyIDogdGhpcy5ncm91cFJvd3NCeU9yZGVyO1xuICAgICAgICBpZiAodGhpcy5ncm91cFJvd3NCeSAmJiB0aGlzLnNvcnRGaWVsZCAmJiB0aGlzLmdyb3VwUm93c0J5ICE9PSB0aGlzLnNvcnRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5fbXVsdGlTb3J0TWV0YSA9IFt0aGlzLmdldEdyb3VwUm93c01ldGEoKSwgeyBmaWVsZDogdGhpcy5zb3J0RmllbGQsIG9yZGVyOiB0aGlzLnNvcnRPcmRlciB9XTtcbiAgICAgICAgICAgIHRoaXMuc29ydE11bHRpcGxlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb3J0VHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgIGxldCBzb3J0TWV0YTogU29ydE1ldGEgPSB7XG4gICAgICAgICAgICAgICAgZmllbGQ6IGZpZWxkLFxuICAgICAgICAgICAgICAgIG9yZGVyOiBvcmRlclxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5vblNvcnQuZW1pdChzb3J0TWV0YSk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5vblNvcnQoc29ydE1ldGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZpZWxkICYmIG9yZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzdG9yaW5nU29ydCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmluZ1NvcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXp5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25MYXp5TG9hZC5lbWl0KHRoaXMuY3JlYXRlTGF6eUxvYWRNZXRhZGF0YSgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tU29ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0RnVuY3Rpb24uZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiB0aGlzLnNvcnRNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zb3J0KChkYXRhMSwgZGF0YTIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUxID0gT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShkYXRhMSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZTIgPSBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKGRhdGEyLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpIHJlc3VsdCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdzdHJpbmcnKSByZXN1bHQgPSB2YWx1ZTEubG9jYWxlQ29tcGFyZSh2YWx1ZTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmVzdWx0ID0gdmFsdWUxIDwgdmFsdWUyID8gLTEgOiB2YWx1ZTEgPiB2YWx1ZTIgPyAxIDogMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmRlciAqIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IFsuLi50aGlzLnZhbHVlXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0ZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzb3J0TWV0YTogU29ydE1ldGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IG9yZGVyXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRoaXMub25Tb3J0LmVtaXQoc29ydE1ldGEpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLm9uU29ydChzb3J0TWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzb3J0TXVsdGlwbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyb3VwUm93c0J5KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX211bHRpU29ydE1ldGEpIHRoaXMuX211bHRpU29ydE1ldGEgPSBbdGhpcy5nZXRHcm91cFJvd3NNZXRhKCldO1xuICAgICAgICAgICAgZWxzZSBpZiAoKDxTb3J0TWV0YVtdPnRoaXMubXVsdGlTb3J0TWV0YSlbMF0uZmllbGQgIT09IHRoaXMuZ3JvdXBSb3dzQnkpIHRoaXMuX211bHRpU29ydE1ldGEgPSBbdGhpcy5nZXRHcm91cFJvd3NNZXRhKCksIC4uLnRoaXMuX211bHRpU29ydE1ldGFdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydFR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgICB0aGlzLm9uU29ydC5lbWl0KHtcbiAgICAgICAgICAgICAgICBtdWx0aXNvcnRtZXRhOiA8U29ydE1ldGFbXT50aGlzLm11bHRpU29ydE1ldGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25Tb3J0KHRoaXMubXVsdGlTb3J0TWV0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aVNvcnRNZXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTGF6eUxvYWQuZW1pdCh0aGlzLmNyZWF0ZUxhenlMb2FkTWV0YWRhdGEoKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbVNvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydEZ1bmN0aW9uLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogdGhpcy5zb3J0TW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aVNvcnRNZXRhOiB0aGlzLm11bHRpU29ydE1ldGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zb3J0KChkYXRhMSwgZGF0YTIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXNvcnRGaWVsZChkYXRhMSwgZGF0YTIsIDxTb3J0TWV0YVtdPnRoaXMubXVsdGlTb3J0TWV0YSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBbLi4udGhpcy52YWx1ZV07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uU29ydC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlzb3J0bWV0YTogPFNvcnRNZXRhW10+dGhpcy5tdWx0aVNvcnRNZXRhXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25Tb3J0KHRoaXMubXVsdGlTb3J0TWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtdWx0aXNvcnRGaWVsZChkYXRhMTogYW55LCBkYXRhMjogYW55LCBtdWx0aVNvcnRNZXRhOiBTb3J0TWV0YVtdLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICAgICAgY29uc3QgdmFsdWUxID0gT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShkYXRhMSwgbXVsdGlTb3J0TWV0YVtpbmRleF0uZmllbGQpO1xuICAgICAgICBjb25zdCB2YWx1ZTIgPSBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKGRhdGEyLCBtdWx0aVNvcnRNZXRhW2luZGV4XS5maWVsZCk7XG4gICAgICAgIGlmIChPYmplY3RVdGlscy5jb21wYXJlKHZhbHVlMSwgdmFsdWUyLCB0aGlzLmZpbHRlckxvY2FsZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtdWx0aVNvcnRNZXRhLmxlbmd0aCAtIDEgPiBpbmRleCA/IHRoaXMubXVsdGlzb3J0RmllbGQoZGF0YTEsIGRhdGEyLCBtdWx0aVNvcnRNZXRhLCBpbmRleCArIDEpIDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlVmFsdWVzT25Tb3J0KHZhbHVlMSwgdmFsdWUyLCBtdWx0aVNvcnRNZXRhW2luZGV4XS5vcmRlcik7XG4gICAgfVxuXG4gICAgY29tcGFyZVZhbHVlc09uU29ydCh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnksIG9yZGVyOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLnNvcnQodmFsdWUxLCB2YWx1ZTIsIG9yZGVyLCB0aGlzLmZpbHRlckxvY2FsZSwgdGhpcy5zb3J0T3JkZXIpO1xuICAgIH1cblxuICAgIGdldFNvcnRNZXRhKGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlTb3J0TWV0YSAmJiB0aGlzLm11bHRpU29ydE1ldGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubXVsdGlTb3J0TWV0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpU29ydE1ldGFbaV0uZmllbGQgPT09IGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm11bHRpU29ydE1ldGFbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaXNTb3J0ZWQoZmllbGQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvcnRGaWVsZCAmJiB0aGlzLnNvcnRGaWVsZCA9PT0gZmllbGQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb3J0TW9kZSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgICAgbGV0IHNvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlTb3J0TWV0YSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tdWx0aVNvcnRNZXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpU29ydE1ldGFbaV0uZmllbGQgPT0gZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb3J0TW9kZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvcnRGaWVsZCAmJiB0aGlzLnNvcnRGaWVsZCA9PT0gZmllbGQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVSb3dDbGljayhldmVudDogYW55KSB7XG4gICAgICAgIGxldCB0YXJnZXQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQub3JpZ2luYWxFdmVudC50YXJnZXQ7XG4gICAgICAgIGxldCB0YXJnZXROb2RlID0gdGFyZ2V0Lm5vZGVOYW1lO1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRhcmdldC5wYXJlbnRFbGVtZW50ICYmIHRhcmdldC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lO1xuICAgICAgICBpZiAodGFyZ2V0Tm9kZSA9PSAnSU5QVVQnIHx8IHRhcmdldE5vZGUgPT0gJ0JVVFRPTicgfHwgdGFyZ2V0Tm9kZSA9PSAnQScgfHwgcGFyZW50Tm9kZSA9PSAnSU5QVVQnIHx8IHBhcmVudE5vZGUgPT0gJ0JVVFRPTicgfHwgcGFyZW50Tm9kZSA9PSAnQScgfHwgRG9tSGFuZGxlci5oYXNDbGFzcyhldmVudC5vcmlnaW5hbEV2ZW50LnRhcmdldCwgJ2NheC1jbGlja2FibGUnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSkge1xuICAgICAgICAgICAgbGV0IHJvd0RhdGEgPSBldmVudC5yb3dEYXRhO1xuICAgICAgICAgICAgbGV0IHJvd0luZGV4ID0gZXZlbnQucm93SW5kZXg7XG5cbiAgICAgICAgICAgIHRoaXMucHJldmVudFNlbGVjdGlvblNldHRlclByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb25Nb2RlKCkgJiYgZXZlbnQub3JpZ2luYWxFdmVudC5zaGlmdEtleSAmJiB0aGlzLmFuY2hvclJvd0luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBEb21IYW5kbGVyLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VSb3dJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25SYW5nZShldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlUm93SW5kZXggPSByb3dJbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJhbmdlKGV2ZW50Lm9yaWdpbmFsRXZlbnQsIHJvd0luZGV4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkKHJvd0RhdGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZCAmJiAhdGhpcy5pc1Jvd1NlbGVjdGFibGUocm93RGF0YSwgcm93SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbWV0YVNlbGVjdGlvbiA9IHRoaXMucm93VG91Y2hlZCA/IGZhbHNlIDogdGhpcy5tZXRhS2V5U2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhS2V5VmFsdWUgPSB0aGlzLmRhdGFLZXkgPyBTdHJpbmcoT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShyb3dEYXRhLCB0aGlzLmRhdGFLZXkpKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JSb3dJbmRleCA9IHJvd0luZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VSb3dJbmRleCA9IHJvd0luZGV4O1xuXG4gICAgICAgICAgICAgICAgaWYgKG1ldGFTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFLZXkgPSBldmVudC5vcmlnaW5hbEV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQub3JpZ2luYWxFdmVudC5jdHJsS2V5O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCAmJiBtZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbk1vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5maW5kSW5kZXhJblNlbGVjdGlvbihyb3dEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKHZhbDogYW55LCBpOiBudW1iZXIpID0+IGkgIT0gc2VsZWN0aW9uSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0aW9uS2V5c1tkYXRhS2V5VmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJvd1Vuc2VsZWN0LmVtaXQoeyBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50LCBkYXRhOiByb3dEYXRhLCB0eXBlOiAncm93JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2luZ2xlU2VsZWN0aW9uTW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gcm93RGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHJvd0RhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uS2V5c1tkYXRhS2V5VmFsdWVdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbk1vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbktleXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSBbLi4udGhpcy5zZWxlY3Rpb24sIHJvd0RhdGFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzW2RhdGFLZXlWYWx1ZV0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCwgZGF0YTogcm93RGF0YSwgdHlwZTogJ3JvdycsIGluZGV4OiByb3dJbmRleCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uS2V5cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Sb3dVbnNlbGVjdC5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCwgZGF0YTogcm93RGF0YSwgdHlwZTogJ3JvdycsIGluZGV4OiByb3dJbmRleCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gcm93RGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQoeyBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50LCBkYXRhOiByb3dEYXRhLCB0eXBlOiAncm93JywgaW5kZXg6IHJvd0luZGV4IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uS2V5c1tkYXRhS2V5VmFsdWVdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uSW5kZXggPSB0aGlzLmZpbmRJbmRleEluU2VsZWN0aW9uKHJvd0RhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigodmFsOiBhbnksIGk6IG51bWJlcikgPT4gaSAhPSBzZWxlY3Rpb25JbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJvd1Vuc2VsZWN0LmVtaXQoeyBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50LCBkYXRhOiByb3dEYXRhLCB0eXBlOiAncm93JywgaW5kZXg6IHJvd0luZGV4IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0aW9uS2V5c1tkYXRhS2V5VmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gPyBbLi4udGhpcy5zZWxlY3Rpb24sIHJvd0RhdGFdIDogW3Jvd0RhdGFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Sb3dTZWxlY3QuZW1pdCh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQsIGRhdGE6IHJvd0RhdGEsIHR5cGU6ICdyb3cnLCBpbmRleDogcm93SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFLZXlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbktleXNbZGF0YUtleVZhbHVlXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5vblNlbGVjdGlvbkNoYW5nZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0YXRlZnVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb3dUb3VjaGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFuZGxlUm93VG91Y2hFbmQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMucm93VG91Y2hlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaGFuZGxlUm93UmlnaHRDbGljayhldmVudDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51KSB7XG4gICAgICAgICAgICBjb25zdCByb3dEYXRhID0gZXZlbnQucm93RGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gZXZlbnQucm93SW5kZXg7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51U2VsZWN0aW9uTW9kZSA9PT0gJ3NlcGFyYXRlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVTZWxlY3Rpb24gPSByb3dEYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVTZWxlY3Rpb25DaGFuZ2UuZW1pdChyb3dEYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29udGV4dE1lbnVTZWxlY3QuZW1pdCh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQsIGRhdGE6IHJvd0RhdGEsIGluZGV4OiBldmVudC5yb3dJbmRleCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25Db250ZXh0TWVudShyb3dEYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZXh0TWVudVNlbGVjdGlvbk1vZGUgPT09ICdqb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZlbnRTZWxlY3Rpb25TZXR0ZXJQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkKHJvd0RhdGEpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhS2V5VmFsdWUgPSB0aGlzLmRhdGFLZXkgPyBTdHJpbmcoT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShyb3dEYXRhLCB0aGlzLmRhdGFLZXkpKSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Jvd1NlbGVjdGFibGUocm93RGF0YSwgcm93SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbk1vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSByb3dEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChyb3dEYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFLZXlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uS2V5cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uS2V5c1tkYXRhS2V5VmFsdWVdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb25Nb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uID8gWy4uLnRoaXMuc2VsZWN0aW9uLCByb3dEYXRhXSA6IFtyb3dEYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YUtleVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzW2RhdGFLZXlWYWx1ZV0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbnRleHRNZW51U2VsZWN0LmVtaXQoeyBvcmlnaW5hbEV2ZW50OiBldmVudCwgZGF0YTogcm93RGF0YSwgaW5kZXg6IGV2ZW50LnJvd0luZGV4IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0UmFuZ2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LCByb3dJbmRleDogbnVtYmVyLCBpc01ldGFLZXlTZWxlY3Rpb24/OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCByYW5nZVN0YXJ0LCByYW5nZUVuZDtcblxuICAgICAgICBpZiAoPG51bWJlcj50aGlzLmFuY2hvclJvd0luZGV4ID4gcm93SW5kZXgpIHtcbiAgICAgICAgICAgIHJhbmdlU3RhcnQgPSByb3dJbmRleDtcbiAgICAgICAgICAgIHJhbmdlRW5kID0gdGhpcy5hbmNob3JSb3dJbmRleDtcbiAgICAgICAgfSBlbHNlIGlmICg8bnVtYmVyPnRoaXMuYW5jaG9yUm93SW5kZXggPCByb3dJbmRleCkge1xuICAgICAgICAgICAgcmFuZ2VTdGFydCA9IHRoaXMuYW5jaG9yUm93SW5kZXg7XG4gICAgICAgICAgICByYW5nZUVuZCA9IHJvd0luZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmFuZ2VTdGFydCA9IHJvd0luZGV4O1xuICAgICAgICAgICAgcmFuZ2VFbmQgPSByb3dJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhenkgJiYgdGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIChyYW5nZVN0YXJ0IGFzIG51bWJlcikgLT0gPG51bWJlcj50aGlzLmZpcnN0O1xuICAgICAgICAgICAgKHJhbmdlRW5kIGFzIG51bWJlcikgLT0gPG51bWJlcj50aGlzLmZpcnN0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJhbmdlUm93c0RhdGEgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDxudW1iZXI+cmFuZ2VTdGFydDsgaSA8PSA8bnVtYmVyPnJhbmdlRW5kOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZVJvd0RhdGEgPSB0aGlzLmZpbHRlcmVkVmFsdWUgPyB0aGlzLmZpbHRlcmVkVmFsdWVbaV0gOiB0aGlzLnZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQocmFuZ2VSb3dEYXRhKSAmJiAhaXNNZXRhS2V5U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUm93U2VsZWN0YWJsZShyYW5nZVJvd0RhdGEsIHJvd0luZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByYW5nZVJvd3NEYXRhLnB1c2gocmFuZ2VSb3dEYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSBbLi4udGhpcy5zZWxlY3Rpb24sIHJhbmdlUm93RGF0YV07XG4gICAgICAgICAgICAgICAgbGV0IGRhdGFLZXlWYWx1ZSA9IHRoaXMuZGF0YUtleSA/IFN0cmluZyhPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKHJhbmdlUm93RGF0YSwgdGhpcy5kYXRhS2V5KSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXlzW2RhdGFLZXlWYWx1ZV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQsIGRhdGE6IHJhbmdlUm93c0RhdGEsIHR5cGU6ICdyb3cnIH0pO1xuICAgIH1cblxuICAgIGNsZWFyU2VsZWN0aW9uUmFuZ2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGxldCByYW5nZVN0YXJ0LCByYW5nZUVuZDtcbiAgICAgICAgbGV0IHJhbmdlUm93SW5kZXggPSA8bnVtYmVyPnRoaXMucmFuZ2VSb3dJbmRleDtcbiAgICAgICAgbGV0IGFuY2hvclJvd0luZGV4ID0gPG51bWJlcj50aGlzLmFuY2hvclJvd0luZGV4O1xuXG4gICAgICAgIGlmIChyYW5nZVJvd0luZGV4ID4gYW5jaG9yUm93SW5kZXgpIHtcbiAgICAgICAgICAgIHJhbmdlU3RhcnQgPSB0aGlzLmFuY2hvclJvd0luZGV4O1xuICAgICAgICAgICAgcmFuZ2VFbmQgPSB0aGlzLnJhbmdlUm93SW5kZXg7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2VSb3dJbmRleCA8IGFuY2hvclJvd0luZGV4KSB7XG4gICAgICAgICAgICByYW5nZVN0YXJ0ID0gdGhpcy5yYW5nZVJvd0luZGV4O1xuICAgICAgICAgICAgcmFuZ2VFbmQgPSB0aGlzLmFuY2hvclJvd0luZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmFuZ2VTdGFydCA9IHRoaXMucmFuZ2VSb3dJbmRleDtcbiAgICAgICAgICAgIHJhbmdlRW5kID0gdGhpcy5yYW5nZVJvd0luZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDxudW1iZXI+cmFuZ2VTdGFydDsgaSA8PSA8bnVtYmVyPnJhbmdlRW5kOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZVJvd0RhdGEgPSB0aGlzLnZhbHVlW2ldO1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5maW5kSW5kZXhJblNlbGVjdGlvbihyYW5nZVJvd0RhdGEpO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uZmlsdGVyKCh2YWw6IGFueSwgaTogbnVtYmVyKSA9PiBpICE9IHNlbGVjdGlvbkluZGV4KTtcbiAgICAgICAgICAgIGxldCBkYXRhS2V5VmFsdWUgPSB0aGlzLmRhdGFLZXkgPyBTdHJpbmcoT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShyYW5nZVJvd0RhdGEsIHRoaXMuZGF0YUtleSkpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zZWxlY3Rpb25LZXlzW2RhdGFLZXlWYWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uUm93VW5zZWxlY3QuZW1pdCh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50LCBkYXRhOiByYW5nZVJvd0RhdGEsIHR5cGU6ICdyb3cnIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNTZWxlY3RlZChyb3dEYXRhOiBhbnkpIHtcbiAgICAgICAgaWYgKHJvd0RhdGEgJiYgdGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFLZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25LZXlzW09iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5kYXRhS2V5KV0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3Rpb24pKSByZXR1cm4gdGhpcy5maW5kSW5kZXhJblNlbGVjdGlvbihyb3dEYXRhKSA+IC0xO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZXF1YWxzKHJvd0RhdGEsIHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmaW5kSW5kZXhJblNlbGVjdGlvbihyb3dEYXRhOiBhbnkpIHtcbiAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGlvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVxdWFscyhyb3dEYXRhLCB0aGlzLnNlbGVjdGlvbltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgaXNSb3dTZWxlY3RhYmxlKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5yb3dTZWxlY3RhYmxlICYmICF0aGlzLnJvd1NlbGVjdGFibGUoeyBkYXRhLCBpbmRleCB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdG9nZ2xlUm93V2l0aFJhZGlvKGV2ZW50OiBhbnksIHJvd0RhdGE6IGFueSkge1xuICAgICAgICB0aGlzLnByZXZlbnRTZWxlY3Rpb25TZXR0ZXJQcm9wYWdhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uICE9IHJvd0RhdGEpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Jvd1NlbGVjdGFibGUocm93RGF0YSwgZXZlbnQucm93SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSByb3dEYXRhO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgICAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQoeyBvcmlnaW5hbEV2ZW50OiBldmVudC5vcmlnaW5hbEV2ZW50LCBpbmRleDogZXZlbnQucm93SW5kZXgsIGRhdGE6IHJvd0RhdGEsIHR5cGU6ICdyYWRpb2J1dHRvbicgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbktleXMgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbktleXNbU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5kYXRhS2V5KSldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMub25Sb3dVbnNlbGVjdC5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCwgaW5kZXg6IGV2ZW50LnJvd0luZGV4LCBkYXRhOiByb3dEYXRhLCB0eXBlOiAncmFkaW9idXR0b24nIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25TZWxlY3Rpb25DaGFuZ2UoKTtcblxuICAgICAgICBpZiAodGhpcy5pc1N0YXRlZnVsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVSb3dXaXRoQ2hlY2tib3goZXZlbnQ6IGFueSwgcm93RGF0YTogYW55KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gfHwgW107XG4gICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuaXNTZWxlY3RlZChyb3dEYXRhKTtcbiAgICAgICAgbGV0IGRhdGFLZXlWYWx1ZSA9IHRoaXMuZGF0YUtleSA/IFN0cmluZyhPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKHJvd0RhdGEsIHRoaXMuZGF0YUtleSkpIDogbnVsbDtcbiAgICAgICAgdGhpcy5wcmV2ZW50U2VsZWN0aW9uU2V0dGVyUHJvcGFnYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5maW5kSW5kZXhJblNlbGVjdGlvbihyb3dEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigodmFsOiBhbnksIGk6IG51bWJlcikgPT4gaSAhPSBzZWxlY3Rpb25JbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMub25Sb3dVbnNlbGVjdC5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQub3JpZ2luYWxFdmVudCwgaW5kZXg6IGV2ZW50LnJvd0luZGV4LCBkYXRhOiByb3dEYXRhLCB0eXBlOiAnY2hlY2tib3gnIH0pO1xuICAgICAgICAgICAgaWYgKGRhdGFLZXlWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNlbGVjdGlvbktleXNbZGF0YUtleVZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Jvd1NlbGVjdGFibGUocm93RGF0YSwgZXZlbnQucm93SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbiA/IFsuLi50aGlzLnNlbGVjdGlvbiwgcm93RGF0YV0gOiBbcm93RGF0YV07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMub25Sb3dTZWxlY3QuZW1pdCh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50Lm9yaWdpbmFsRXZlbnQsIGluZGV4OiBldmVudC5yb3dJbmRleCwgZGF0YTogcm93RGF0YSwgdHlwZTogJ2NoZWNrYm94JyB9KTtcbiAgICAgICAgICAgIGlmIChkYXRhS2V5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbktleXNbZGF0YUtleVZhbHVlXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5vblNlbGVjdGlvbkNoYW5nZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzU3RhdGVmdWwoKSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZVJvd3NXaXRoQ2hlY2tib3goZXZlbnQ6IEV2ZW50LCBjaGVjazogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0QWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENoYW5nZS5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQsIGNoZWNrZWQ6IGNoZWNrIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VsZWN0aW9uUGFnZU9ubHkgPyB0aGlzLmRhdGFUb1JlbmRlcih0aGlzLnByb2Nlc3NlZERhdGEpIDogdGhpcy5wcm9jZXNzZWREYXRhO1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uUGFnZU9ubHkgJiYgdGhpcy5fc2VsZWN0aW9uID8gdGhpcy5fc2VsZWN0aW9uLmZpbHRlcigoczogYW55KSA9PiAhZGF0YS5zb21lKChkOiBhbnkpID0+IHRoaXMuZXF1YWxzKHMsIGQpKSkgOiBbXTtcblxuICAgICAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5mcm96ZW5WYWx1ZSA/IFsuLi5zZWxlY3Rpb24sIC4uLnRoaXMuZnJvemVuVmFsdWUsIC4uLmRhdGFdIDogWy4uLnNlbGVjdGlvbiwgLi4uZGF0YV07XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5yb3dTZWxlY3RhYmxlID8gc2VsZWN0aW9uLmZpbHRlcigoZGF0YTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB0aGlzLnJvd1NlbGVjdGFibGUoeyBkYXRhLCBpbmRleCB9KSkgOiBzZWxlY3Rpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgICAgIHRoaXMucHJldmVudFNlbGVjdGlvblNldHRlclByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uS2V5cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMub25IZWFkZXJDaGVja2JveFRvZ2dsZS5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQsIGNoZWNrZWQ6IGNoZWNrIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0YXRlZnVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXF1YWxzKGRhdGExOiBhbnksIGRhdGEyOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVNlbGVjdGlvbkJ5ID09PSAnZXF1YWxzJyA/IGRhdGExID09PSBkYXRhMiA6IE9iamVjdFV0aWxzLmVxdWFscyhkYXRhMSwgZGF0YTIsIHRoaXMuZGF0YUtleSk7XG4gICAgfVxuXG4gICAgLyogTGVnYWN5IEZpbHRlcmluZyBmb3IgY3VzdG9tIGVsZW1lbnRzICovXG4gICAgZmlsdGVyKHZhbHVlOiBhbnksIGZpZWxkOiBzdHJpbmcsIG1hdGNoTW9kZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlclRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbHRlclRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc0ZpbHRlckJsYW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzW2ZpZWxkXSA9IHsgdmFsdWU6IHZhbHVlLCBtYXRjaE1vZGU6IG1hdGNoTW9kZSB9O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsdGVyc1tmaWVsZF0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcnNbZmllbGRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyVGltZW91dCA9IG51bGw7XG4gICAgICAgIH0sIHRoaXMuZmlsdGVyRGVsYXkpO1xuXG4gICAgICAgIHRoaXMuYW5jaG9yUm93SW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIGZpbHRlckdsb2JhbCh2YWx1ZTogYW55LCBtYXRjaE1vZGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlcih2YWx1ZSwgJ2dsb2JhbCcsIG1hdGNoTW9kZSk7XG4gICAgfVxuXG4gICAgaXNGaWx0ZXJCbGFuayhmaWx0ZXI6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZmlsdGVyICE9PSBudWxsICYmIGZpbHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoKHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnICYmIGZpbHRlci50cmltKCkubGVuZ3RoID09IDApIHx8IChBcnJheS5pc0FycmF5KGZpbHRlcikgJiYgZmlsdGVyLmxlbmd0aCA9PSAwKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfZmlsdGVyKCkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJUeXBlID09PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgdGhpcy5vbkZpbHRlci5lbWl0KHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoPHsgW3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhIHwgdW5kZWZpbmVkIH0+dGhpcy5maWx0ZXJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICYmIHZhbHVlPy5tYXRjaE1vZGUgIT09IG51bGwpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzdG9yaW5nRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdENoYW5nZS5lbWl0KHRoaXMuZmlyc3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkxhenlMb2FkLmVtaXQodGhpcy5jcmVhdGVMYXp5TG9hZE1ldGFkYXRhKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnbG9iYWxGaWx0ZXJGaWVsZHNBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyc1snZ2xvYmFsJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb2x1bW5zICYmICF0aGlzLmdsb2JhbEZpbHRlckZpZWxkcykgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWwgZmlsdGVyaW5nIHJlcXVpcmVzIGR5bmFtaWMgY29sdW1ucyBvciBnbG9iYWxGaWx0ZXJGaWVsZHMgdG8gYmUgZGVmaW5lZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZ2xvYmFsRmlsdGVyRmllbGRzQXJyYXkgPSB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcyB8fCB0aGlzLmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkVmFsdWUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbE1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnbG9iYWxNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxvY2FsRmlsdGVyZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLmZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3AgIT09ICdnbG9iYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRmlsdGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsdGVyRmllbGQgPSBwcm9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsdGVyTWV0YSA9IHRoaXMuZmlsdGVyc1tmaWx0ZXJGaWVsZF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyTWV0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1ldGEgb2YgZmlsdGVyTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTWF0Y2ggPSB0aGlzLmV4ZWN1dGVMb2NhbEZpbHRlcihmaWx0ZXJGaWVsZCwgdGhpcy52YWx1ZVtpXSwgbWV0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1ldGEub3BlcmF0b3IgPT09IEZpbHRlck9wZXJhdG9yLk9SICYmIGxvY2FsTWF0Y2gpIHx8IChtZXRhLm9wZXJhdG9yID09PSBGaWx0ZXJPcGVyYXRvci5BTkQgJiYgIWxvY2FsTWF0Y2gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTWF0Y2ggPSB0aGlzLmV4ZWN1dGVMb2NhbEZpbHRlcihmaWx0ZXJGaWVsZCwgdGhpcy52YWx1ZVtpXSwgPGFueT5maWx0ZXJNZXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnNbJ2dsb2JhbCddICYmICFnbG9iYWxNYXRjaCAmJiBnbG9iYWxGaWx0ZXJGaWVsZHNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ2xvYmFsRmlsdGVyRmllbGRzQXJyYXkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdsb2JhbEZpbHRlckZpZWxkID0gZ2xvYmFsRmlsdGVyRmllbGRzQXJyYXlbal0uZmllbGQgfHwgZ2xvYmFsRmlsdGVyRmllbGRzQXJyYXlbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE1hdGNoID0gKDxhbnk+dGhpcy5maWx0ZXJTZXJ2aWNlKS5maWx0ZXJzWyg8YW55PnRoaXMuZmlsdGVyc1snZ2xvYmFsJ10pLm1hdGNoTW9kZV0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKHRoaXMudmFsdWVbaV0sIGdsb2JhbEZpbHRlckZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8RmlsdGVyTWV0YWRhdGE+dGhpcy5maWx0ZXJzWydnbG9iYWwnXSkudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzOiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyc1snZ2xvYmFsJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gbG9jYWxGaWx0ZXJlZCA/IGxvY2FsRmlsdGVyZWQgJiYgbG9jYWxNYXRjaCAmJiBnbG9iYWxNYXRjaCA6IGdsb2JhbE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gbG9jYWxGaWx0ZXJlZCAmJiBsb2NhbE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRWYWx1ZS5wdXNoKHRoaXMudmFsdWVbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRWYWx1ZS5sZW5ndGggPT09IHRoaXMudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IHRoaXMuZmlsdGVyZWRWYWx1ZSA/IHRoaXMuZmlsdGVyZWRWYWx1ZS5sZW5ndGggOiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe1xuICAgICAgICAgICAgICAgIGZpbHRlcnM6IDx7IFtzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YSB8IHVuZGVmaW5lZCB9PnRoaXMuZmlsdGVycyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFZhbHVlOiB0aGlzLmZpbHRlcmVkVmFsdWUgfHwgdGhpcy52YWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLm9uVmFsdWVDaGFuZ2UodGhpcy52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhdGVmdWwoKSAmJiAhdGhpcy5yZXN0b3JpbmdGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXN0b3JpbmdGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmluZ0ZpbHRlciA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICBpZiAodGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsVG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjdXRlTG9jYWxGaWx0ZXIoZmllbGQ6IHN0cmluZywgcm93RGF0YTogYW55LCBmaWx0ZXJNZXRhOiBGaWx0ZXJNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgZmlsdGVyVmFsdWUgPSBmaWx0ZXJNZXRhLnZhbHVlO1xuICAgICAgICBsZXQgZmlsdGVyTWF0Y2hNb2RlID0gZmlsdGVyTWV0YS5tYXRjaE1vZGUgfHwgRmlsdGVyTWF0Y2hNb2RlLlNUQVJUU19XSVRIO1xuICAgICAgICBsZXQgZGF0YUZpZWxkVmFsdWUgPSBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKHJvd0RhdGEsIGZpZWxkKTtcbiAgICAgICAgbGV0IGZpbHRlckNvbnN0cmFpbnQgPSAoPGFueT50aGlzLmZpbHRlclNlcnZpY2UpLmZpbHRlcnNbZmlsdGVyTWF0Y2hNb2RlXTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyQ29uc3RyYWludChkYXRhRmllbGRWYWx1ZSwgZmlsdGVyVmFsdWUsIHRoaXMuZmlsdGVyTG9jYWxlKTtcbiAgICB9XG5cbiAgICBoYXNGaWx0ZXIoKSB7XG4gICAgICAgIGxldCBlbXB0eSA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gdGhpcy5maWx0ZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhZW1wdHk7XG4gICAgfVxuXG4gICAgY3JlYXRlTGF6eUxvYWRNZXRhZGF0YSgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlyc3Q6IHRoaXMuZmlyc3QsXG4gICAgICAgICAgICByb3dzOiB0aGlzLnJvd3MsXG4gICAgICAgICAgICBzb3J0RmllbGQ6IHRoaXMuc29ydEZpZWxkLFxuICAgICAgICAgICAgc29ydE9yZGVyOiB0aGlzLnNvcnRPcmRlcixcbiAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlcjogdGhpcy5maWx0ZXJzICYmIHRoaXMuZmlsdGVyc1snZ2xvYmFsJ10gPyAoPEZpbHRlck1ldGFkYXRhPnRoaXMuZmlsdGVyc1snZ2xvYmFsJ10pLnZhbHVlIDogbnVsbCxcbiAgICAgICAgICAgIG11bHRpU29ydE1ldGE6IHRoaXMubXVsdGlTb3J0TWV0YSxcbiAgICAgICAgICAgIGZvcmNlVXBkYXRlOiAoKSA9PiB0aGlzLmNkLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc29ydE9yZGVyID0gdGhpcy5kZWZhdWx0U29ydE9yZGVyO1xuICAgICAgICB0aGlzLl9tdWx0aVNvcnRNZXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub25Tb3J0KG51bGwpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJGaWx0ZXJWYWx1ZXMoKTtcblxuICAgICAgICB0aGlzLmZpbHRlcmVkVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuZmlyc3QgPSAwO1xuICAgICAgICB0aGlzLmZpcnN0Q2hhbmdlLmVtaXQodGhpcy5maXJzdCk7XG5cbiAgICAgICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgICAgICAgdGhpcy5vbkxhenlMb2FkLmVtaXQodGhpcy5jcmVhdGVMYXp5TG9hZE1ldGFkYXRhKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b3RhbFJlY29yZHMgPSB0aGlzLl92YWx1ZSA/IHRoaXMuX3ZhbHVlLmxlbmd0aCA6IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckZpbHRlclZhbHVlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBbLCBmaWx0ZXJNZXRhZGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5maWx0ZXJzKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmlsdGVyIG9mIGZpbHRlck1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIGZpbHRlck1ldGFkYXRhLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgZ2V0RXhwb3J0SGVhZGVyKGNvbHVtbjogYW55KSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5bPHN0cmluZz50aGlzLmV4cG9ydEhlYWRlcl0gfHwgY29sdW1uLmhlYWRlciB8fCBjb2x1bW4uZmllbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERhdGEgZXhwb3J0IG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge0V4cG9ydENTVk9wdGlvbnN9IG9iamVjdCAtIEV4cG9ydCBvcHRpb25zLlxuICAgICAqIEBncm91cCBNZXRob2RcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwb3J0Q1NWKG9wdGlvbnM/OiBFeHBvcnRDU1ZPcHRpb25zKSB7XG4gICAgICAgIGxldCBkYXRhO1xuICAgICAgICBsZXQgY3N2ID0gJyc7XG4gICAgICAgIGxldCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2VsZWN0aW9uT25seSkge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuc2VsZWN0aW9uIHx8IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxWYWx1ZXMpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLnZhbHVlIHx8IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuZmlsdGVyZWRWYWx1ZSB8fCB0aGlzLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5mcm96ZW5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhID8gWy4uLnRoaXMuZnJvemVuVmFsdWUsIC4uLmRhdGFdIDogdGhpcy5mcm96ZW5WYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4cG9ydGFibGVDb2x1bW5zOiBhbnlbXSA9ICg8YW55W10+Y29sdW1ucykuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5leHBvcnRhYmxlICE9PSBmYWxzZSAmJiBjb2x1bW4uZmllbGQpO1xuXG4gICAgICAgIC8vaGVhZGVyc1xuICAgICAgICBjc3YgKz0gZXhwb3J0YWJsZUNvbHVtbnMubWFwKChjb2x1bW4pID0+ICdcIicgKyB0aGlzLmdldEV4cG9ydEhlYWRlcihjb2x1bW4pICsgJ1wiJykuam9pbih0aGlzLmNzdlNlcGFyYXRvcik7XG5cbiAgICAgICAgLy9ib2R5XG4gICAgICAgIGNvbnN0IGJvZHkgPSBkYXRhXG4gICAgICAgICAgICAubWFwKChyZWNvcmQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgICBleHBvcnRhYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsRGF0YSA9IE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocmVjb3JkLCBjb2x1bW4uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbERhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cG9ydEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxEYXRhID0gdGhpcy5leHBvcnRGdW5jdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjZWxsRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNlbGxEYXRhID0gU3RyaW5nKGNlbGxEYXRhKS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNlbGxEYXRhID0gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXCInICsgY2VsbERhdGEgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbih0aGlzLmNzdlNlcGFyYXRvcilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgICBpZiAoYm9keS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNzdiArPSAnXFxuJyArIGJvZHk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFtuZXcgVWludDhBcnJheShbMHhlZiwgMHhiYiwgMHhiZl0pLCBjc3ZdLCB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBsaW5rID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIGxpbmspO1xuICAgICAgICBpZiAobGluay5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYikpO1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgdGhpcy5leHBvcnRGaWxlbmFtZSArICcuY3N2Jyk7XG4gICAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjc3YgPSAnZGF0YTp0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04LCcgKyBjc3Y7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5vcGVuKGVuY29kZVVSSShjc3YpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9jdW1lbnQuYm9keSwgbGluayk7XG4gICAgfVxuXG4gICAgb25MYXp5SXRlbUxvYWQoZXZlbnQ6IExhenlMb2FkTWV0YSkge1xuICAgICAgICB0aGlzLm9uTGF6eUxvYWQuZW1pdCh7XG4gICAgICAgICAgICAuLi50aGlzLmNyZWF0ZUxhenlMb2FkTWV0YWRhdGEoKSxcbiAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgcm93czogPG51bWJlcj5ldmVudC5sYXN0IC0gPG51bWJlcj5ldmVudC5maXJzdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHNjcm9sbCB0byB0b3AuXG4gICAgICogQGdyb3VwIE1ldGhvZFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldFNjcm9sbFRvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkgdGhpcy5zY3JvbGxUb1ZpcnR1YWxJbmRleCgwKTtcbiAgICAgICAgZWxzZSB0aGlzLnNjcm9sbFRvKHsgdG9wOiAwIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTY3JvbGxzIHRvIGdpdmVuIGluZGV4IHdoZW4gdXNpbmcgdmlydHVhbCBzY3JvbGwuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQGdyb3VwIE1ldGhvZFxuICAgICAqL1xuICAgIHB1YmxpYyBzY3JvbGxUb1ZpcnR1YWxJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXIgJiYgdGhpcy5zY3JvbGxlci5zY3JvbGxUb0luZGV4KGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0byBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge1Njcm9sbFRvT3B0aW9uc30gb3B0aW9ucyAtIHNjcm9sbCBvcHRpb25zLlxuICAgICAqIEBncm91cCBNZXRob2RcbiAgICAgKi9cbiAgICBwdWJsaWMgc2Nyb2xsVG8ob3B0aW9uczogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXI/LnNjcm9sbFRvKG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMud3JhcHBlclZpZXdDaGlsZCAmJiB0aGlzLndyYXBwZXJWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMud3JhcHBlclZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8ob3B0aW9ucyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlclZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBvcHRpb25zLmxlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gb3B0aW9ucy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVFZGl0aW5nQ2VsbChjZWxsOiBhbnksIGRhdGE6IGFueSwgZmllbGQ6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmVkaXRpbmdDZWxsID0gY2VsbDtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ2VsbERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmVkaXRpbmdDZWxsRmllbGQgPSBmaWVsZDtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ2VsbFJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuYmluZERvY3VtZW50RWRpdExpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgaXNFZGl0aW5nQ2VsbFZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0aW5nQ2VsbCAmJiBEb21IYW5kbGVyLmZpbmQodGhpcy5lZGl0aW5nQ2VsbCwgJy5uZy1pbnZhbGlkLm5nLWRpcnR5JykubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIGJpbmREb2N1bWVudEVkaXRMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvY3VtZW50RWRpdExpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50RWRpdExpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5kb2N1bWVudCwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGluZ0NlbGwgJiYgIXRoaXMuc2VsZkNsaWNrICYmIHRoaXMuaXNFZGl0aW5nQ2VsbFZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgRG9tSGFuZGxlci5yZW1vdmVDbGFzcyh0aGlzLmVkaXRpbmdDZWxsLCAnY2F4LWNlbGwtZWRpdGluZycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmdDZWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVkaXRDb21wbGV0ZS5lbWl0KHsgZmllbGQ6IHRoaXMuZWRpdGluZ0NlbGxGaWVsZCwgZGF0YTogdGhpcy5lZGl0aW5nQ2VsbERhdGEsIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LCBpbmRleDogPG51bWJlcj50aGlzLmVkaXRpbmdDZWxsUm93SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGluZ0NlbGxGaWVsZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGluZ0NlbGxEYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0aW5nQ2VsbFJvd0luZGV4ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmJpbmREb2N1bWVudEVkaXRMaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxmQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5iaW5kRG9jdW1lbnRFZGl0TGlzdGVuZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50RWRpdExpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50RWRpdExpc3RlbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50RWRpdExpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRSb3dFZGl0KHJvd0RhdGE6IGFueSkge1xuICAgICAgICBsZXQgZGF0YUtleVZhbHVlID0gU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5kYXRhS2V5KSk7XG4gICAgICAgIHRoaXMuZWRpdGluZ1Jvd0tleXNbZGF0YUtleVZhbHVlXSA9IHRydWU7XG4gICAgfVxuXG4gICAgc2F2ZVJvd0VkaXQocm93RGF0YTogYW55LCByb3dFbGVtZW50OiBIVE1MVGFibGVSb3dFbGVtZW50KSB7XG4gICAgICAgIGlmIChEb21IYW5kbGVyLmZpbmQocm93RWxlbWVudCwgJy5uZy1pbnZhbGlkLm5nLWRpcnR5JykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBsZXQgZGF0YUtleVZhbHVlID0gU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5kYXRhS2V5KSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5lZGl0aW5nUm93S2V5c1tkYXRhS2V5VmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FuY2VsUm93RWRpdChyb3dEYXRhOiBhbnkpIHtcbiAgICAgICAgbGV0IGRhdGFLZXlWYWx1ZSA9IFN0cmluZyhPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKHJvd0RhdGEsIHRoaXMuZGF0YUtleSkpO1xuICAgICAgICBkZWxldGUgdGhpcy5lZGl0aW5nUm93S2V5c1tkYXRhS2V5VmFsdWVdO1xuICAgIH1cblxuICAgIHRvZ2dsZVJvdyhyb3dEYXRhOiBhbnksIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFLZXkgJiYgIXRoaXMuZ3JvdXBSb3dzQnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YUtleSBvciBncm91cFJvd3NCeSBtdXN0IGJlIGRlZmluZWQgdG8gdXNlIHJvdyBleHBhbnNpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhS2V5VmFsdWUgPSB0aGlzLmdyb3VwUm93c0J5ID8gU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5ncm91cFJvd3NCeSkpIDogU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5kYXRhS2V5KSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWRSb3dLZXlzW2RhdGFLZXlWYWx1ZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZXhwYW5kZWRSb3dLZXlzW2RhdGFLZXlWYWx1ZV07XG4gICAgICAgICAgICB0aGlzLm9uUm93Q29sbGFwc2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogPEV2ZW50PmV2ZW50LFxuICAgICAgICAgICAgICAgIGRhdGE6IHJvd0RhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucm93RXhwYW5kTW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZGVkUm93S2V5cyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkUm93S2V5c1tkYXRhS2V5VmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMub25Sb3dFeHBhbmQuZW1pdCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogPEV2ZW50PmV2ZW50LFxuICAgICAgICAgICAgICAgIGRhdGE6IHJvd0RhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0ZWZ1bCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNSb3dFeHBhbmRlZChyb3dEYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBSb3dzQnkgPyB0aGlzLmV4cGFuZGVkUm93S2V5c1tTdHJpbmcoT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShyb3dEYXRhLCB0aGlzLmdyb3VwUm93c0J5KSldID09PSB0cnVlIDogdGhpcy5leHBhbmRlZFJvd0tleXNbU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5kYXRhS2V5KSldID09PSB0cnVlO1xuICAgIH1cblxuICAgIGlzUm93RWRpdGluZyhyb3dEYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGluZ1Jvd0tleXNbU3RyaW5nKE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEocm93RGF0YSwgdGhpcy5kYXRhS2V5KSldID09PSB0cnVlO1xuICAgIH1cblxuICAgIGlzU2luZ2xlU2VsZWN0aW9uTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZSc7XG4gICAgfVxuXG4gICAgaXNNdWx0aXBsZVNlbGVjdGlvbk1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZSc7XG4gICAgfVxuXG4gICAgb25Db2x1bW5SZXNpemVCZWdpbihldmVudDogYW55KSB7XG4gICAgICAgIGxldCBjb250YWluZXJMZWZ0ID0gRG9tSGFuZGxlci5nZXRPZmZzZXQodGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpLmxlZnQ7XG4gICAgICAgIHRoaXMucmVzaXplQ29sdW1uRWxlbWVudCA9IGV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB0aGlzLmNvbHVtblJlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gJ3RvdWNoc3RhcnQnKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZXNpemVySGVscGVyWCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSBjb250YWluZXJMZWZ0ICsgdGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFJlc2l6ZXJIZWxwZXJYID0gZXZlbnQucGFnZVggLSBjb250YWluZXJMZWZ0ICsgdGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ29sdW1uUmVzaXplKGV2ZW50KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBvbkNvbHVtblJlc2l6ZShldmVudDogYW55KSB7XG4gICAgICAgIGxldCBjb250YWluZXJMZWZ0ID0gRG9tSGFuZGxlci5nZXRPZmZzZXQodGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpLmxlZnQ7XG4gICAgICAgIERvbUhhbmRsZXIuYWRkQ2xhc3ModGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQsICdjYXgtdW5zZWxlY3RhYmxlLXRleHQnKTtcbiAgICAgICAgKDxFbGVtZW50UmVmPnRoaXMucmVzaXplSGVscGVyVmlld0NoaWxkKS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuY29udGFpbmVyVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCc7XG4gICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlc2l6ZUhlbHBlclZpZXdDaGlsZCkubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSAwICsgJ3B4JztcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gJ3RvdWNobW92ZScpIHtcbiAgICAgICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlc2l6ZUhlbHBlclZpZXdDaGlsZCkubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIGNvbnRhaW5lckxlZnQgKyB0aGlzLmNvbnRhaW5lclZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlc2l6ZUhlbHBlclZpZXdDaGlsZCkubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gZXZlbnQucGFnZVggLSBjb250YWluZXJMZWZ0ICsgdGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgKDxFbGVtZW50UmVmPnRoaXMucmVzaXplSGVscGVyVmlld0NoaWxkKS5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cblxuICAgIG9uQ29sdW1uUmVzaXplRW5kKCkge1xuICAgICAgICBsZXQgZGVsdGEgPSB0aGlzLnJlc2l6ZUhlbHBlclZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0IC0gPG51bWJlcj50aGlzLmxhc3RSZXNpemVySGVscGVyWDtcbiAgICAgICAgbGV0IGNvbHVtbldpZHRoID0gdGhpcy5yZXNpemVDb2x1bW5FbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICBsZXQgbmV3Q29sdW1uV2lkdGggPSBjb2x1bW5XaWR0aCArIGRlbHRhO1xuICAgICAgICBsZXQgbWluV2lkdGggPSB0aGlzLnJlc2l6ZUNvbHVtbkVsZW1lbnQuc3R5bGUubWluV2lkdGgucmVwbGFjZSgvW15cXGQuXS9nLCAnJykgfHwgMTU7XG5cbiAgICAgICAgaWYgKG5ld0NvbHVtbldpZHRoID49IG1pbldpZHRoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5SZXNpemVNb2RlID09PSAnZml0Jykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0Q29sdW1uID0gdGhpcy5yZXNpemVDb2x1bW5FbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICBsZXQgbmV4dENvbHVtbldpZHRoID0gbmV4dENvbHVtbi5vZmZzZXRXaWR0aCAtIGRlbHRhO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbldpZHRoID4gMTUgJiYgbmV4dENvbHVtbldpZHRoID4gMTUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVUYWJsZUNlbGxzKG5ld0NvbHVtbldpZHRoLCBuZXh0Q29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW5SZXNpemVNb2RlID09PSAnZXhwYW5kJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxDb2xXaWR0aHMgPSB0aGlzLl90b3RhbFRhYmxlV2lkdGgoKTtcbiAgICAgICAgICAgICAgICBsZXQgdGFibGVXaWR0aCA9IHRoaXMudGFibGVWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyBkZWx0YTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVzaXplVGFibGVXaWR0aCh0YWJsZVdpZHRoICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVUYWJsZUNlbGxzKG5ld0NvbHVtbldpZHRoLCBudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vbkNvbFJlc2l6ZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLnJlc2l6ZUNvbHVtbkVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZGVsdGE6IGRlbHRhXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGF0ZWZ1bCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlc2l6ZUhlbHBlclZpZXdDaGlsZCkubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBEb21IYW5kbGVyLnJlbW92ZUNsYXNzKHRoaXMuY29udGFpbmVyVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50LCAnY2F4LXVuc2VsZWN0YWJsZS10ZXh0Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG90YWxUYWJsZVdpZHRoKCk6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHdpZHRocyA9IFtdO1xuICAgICAgICBjb25zdCB0YWJsZUhlYWQgPSBEb21IYW5kbGVyLmZpbmRTaW5nbGUodGhpcy5jb250YWluZXJWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCwgJy5jYXgtZGF0YXRhYmxlLXRoZWFkJyk7XG4gICAgICAgIGxldCBoZWFkZXJzID0gRG9tSGFuZGxlci5maW5kKHRhYmxlSGVhZCwgJ3RyID4gdGgnKTtcbiAgICAgICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIpID0+IHdpZHRocy5wdXNoKERvbUhhbmRsZXIuZ2V0T3V0ZXJXaWR0aChoZWFkZXIpKSk7XG5cbiAgICAgICAgcmV0dXJuIHdpZHRocztcbiAgICB9XG5cbiAgICBvbkNvbHVtbkRyYWdTdGFydChldmVudDogYW55LCBjb2x1bW5FbGVtZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5yZW9yZGVySWNvbldpZHRoID0gRG9tSGFuZGxlci5nZXRIaWRkZW5FbGVtZW50T3V0ZXJXaWR0aCh0aGlzLnJlb3JkZXJJbmRpY2F0b3JVcFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMucmVvcmRlckljb25IZWlnaHQgPSBEb21IYW5kbGVyLmdldEhpZGRlbkVsZW1lbnRPdXRlckhlaWdodCh0aGlzLnJlb3JkZXJJbmRpY2F0b3JEb3duVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uID0gY29sdW1uRWxlbWVudDtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCAnYicpOyAvLyBGb3IgZmlyZWZveFxuICAgIH1cblxuICAgIG9uQ29sdW1uRHJhZ0VudGVyKGV2ZW50OiBhbnksIGRyb3BIZWFkZXI6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5yZW9yZGVyYWJsZUNvbHVtbnMgJiYgdGhpcy5kcmFnZ2VkQ29sdW1uICYmIGRyb3BIZWFkZXIpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBsZXQgY29udGFpbmVyT2Zmc2V0ID0gRG9tSGFuZGxlci5nZXRPZmZzZXQodGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgbGV0IGRyb3BIZWFkZXJPZmZzZXQgPSBEb21IYW5kbGVyLmdldE9mZnNldChkcm9wSGVhZGVyKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZENvbHVtbiAhPSBkcm9wSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRyYWdJbmRleCA9IERvbUhhbmRsZXIuaW5kZXhXaXRoaW5Hcm91cCh0aGlzLmRyYWdnZWRDb2x1bW4sICdjYXhyZW9yZGVyYWJsZWNvbHVtbicpO1xuICAgICAgICAgICAgICAgIGxldCBkcm9wSW5kZXggPSBEb21IYW5kbGVyLmluZGV4V2l0aGluR3JvdXAoZHJvcEhlYWRlciwgJ2NheHJlb3JkZXJhYmxlY29sdW1uJyk7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldExlZnQgPSBkcm9wSGVhZGVyT2Zmc2V0LmxlZnQgLSBjb250YWluZXJPZmZzZXQubGVmdDtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0VG9wID0gY29udGFpbmVyT2Zmc2V0LnRvcCAtIGRyb3BIZWFkZXJPZmZzZXQudG9wO1xuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5DZW50ZXIgPSBkcm9wSGVhZGVyT2Zmc2V0LmxlZnQgKyBkcm9wSGVhZGVyLm9mZnNldFdpZHRoIC8gMjtcblxuICAgICAgICAgICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlb3JkZXJJbmRpY2F0b3JVcFZpZXdDaGlsZCkubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSBkcm9wSGVhZGVyT2Zmc2V0LnRvcCAtIGNvbnRhaW5lck9mZnNldC50b3AgLSAoPG51bWJlcj50aGlzLnJlb3JkZXJJY29uSGVpZ2h0IC0gMSkgKyAncHgnO1xuICAgICAgICAgICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlb3JkZXJJbmRpY2F0b3JEb3duVmlld0NoaWxkKS5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IGRyb3BIZWFkZXJPZmZzZXQudG9wIC0gY29udGFpbmVyT2Zmc2V0LnRvcCArIGRyb3BIZWFkZXIub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcblxuICAgICAgICAgICAgICAgIGlmIChldmVudC5wYWdlWCA+IGNvbHVtbkNlbnRlcikge1xuICAgICAgICAgICAgICAgICAgICAoPEVsZW1lbnRSZWY+dGhpcy5yZW9yZGVySW5kaWNhdG9yVXBWaWV3Q2hpbGQpLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IHRhcmdldExlZnQgKyBkcm9wSGVhZGVyLm9mZnNldFdpZHRoIC0gTWF0aC5jZWlsKDxudW1iZXI+dGhpcy5yZW9yZGVySWNvbldpZHRoIC8gMikgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAoPEVsZW1lbnRSZWY+dGhpcy5yZW9yZGVySW5kaWNhdG9yRG93blZpZXdDaGlsZCkubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGFyZ2V0TGVmdCArIGRyb3BIZWFkZXIub2Zmc2V0V2lkdGggLSBNYXRoLmNlaWwoPG51bWJlcj50aGlzLnJlb3JkZXJJY29uV2lkdGggLyAyKSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcFBvc2l0aW9uID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAoPEVsZW1lbnRSZWY+dGhpcy5yZW9yZGVySW5kaWNhdG9yVXBWaWV3Q2hpbGQpLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IHRhcmdldExlZnQgLSBNYXRoLmNlaWwoPG51bWJlcj50aGlzLnJlb3JkZXJJY29uV2lkdGggLyAyKSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlb3JkZXJJbmRpY2F0b3JEb3duVmlld0NoaWxkKS5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSB0YXJnZXRMZWZ0IC0gTWF0aC5jZWlsKDxudW1iZXI+dGhpcy5yZW9yZGVySWNvbldpZHRoIC8gMikgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BQb3NpdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAoPEVsZW1lbnRSZWY+dGhpcy5yZW9yZGVySW5kaWNhdG9yVXBWaWV3Q2hpbGQpLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgKDxFbGVtZW50UmVmPnRoaXMucmVvcmRlckluZGljYXRvckRvd25WaWV3Q2hpbGQpLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Db2x1bW5EcmFnTGVhdmUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnJlb3JkZXJhYmxlQ29sdW1ucyAmJiB0aGlzLmRyYWdnZWRDb2x1bW4pIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNvbHVtbkRyb3AoZXZlbnQ6IEV2ZW50LCBkcm9wQ29sdW1uOiBhbnkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZENvbHVtbikge1xuICAgICAgICAgICAgbGV0IGRyYWdJbmRleCA9IERvbUhhbmRsZXIuaW5kZXhXaXRoaW5Hcm91cCh0aGlzLmRyYWdnZWRDb2x1bW4sICdjYXhyZW9yZGVyYWJsZWNvbHVtbicpO1xuICAgICAgICAgICAgbGV0IGRyb3BJbmRleCA9IERvbUhhbmRsZXIuaW5kZXhXaXRoaW5Hcm91cChkcm9wQ29sdW1uLCAnY2F4cmVvcmRlcmFibGVjb2x1bW4nKTtcbiAgICAgICAgICAgIGxldCBhbGxvd0Ryb3AgPSBkcmFnSW5kZXggIT0gZHJvcEluZGV4O1xuICAgICAgICAgICAgaWYgKGFsbG93RHJvcCAmJiAoKGRyb3BJbmRleCAtIGRyYWdJbmRleCA9PSAxICYmIHRoaXMuZHJvcFBvc2l0aW9uID09PSAtMSkgfHwgKGRyYWdJbmRleCAtIGRyb3BJbmRleCA9PSAxICYmIHRoaXMuZHJvcFBvc2l0aW9uID09PSAxKSkpIHtcbiAgICAgICAgICAgICAgICBhbGxvd0Ryb3AgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFsbG93RHJvcCAmJiBkcm9wSW5kZXggPCBkcmFnSW5kZXggJiYgdGhpcy5kcm9wUG9zaXRpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXggPSBkcm9wSW5kZXggKyAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWxsb3dEcm9wICYmIGRyb3BJbmRleCA+IGRyYWdJbmRleCAmJiB0aGlzLmRyb3BQb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXggPSBkcm9wSW5kZXggLSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWxsb3dEcm9wKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0VXRpbHMucmVvcmRlckFycmF5KDxhbnlbXT50aGlzLmNvbHVtbnMsIGRyYWdJbmRleCwgZHJvcEluZGV4KTtcblxuICAgICAgICAgICAgICAgIHRoaXMub25Db2xSZW9yZGVyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBkcmFnSW5kZXg6IGRyYWdJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZHJvcEluZGV4OiBkcm9wSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1uc1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGF0ZWZ1bCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXphYmxlQ29sdW1ucyAmJiB0aGlzLnJlc2l6ZUNvbHVtbkVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmNvbHVtblJlc2l6ZU1vZGUgPT09ICdleHBhbmQnID8gdGhpcy5faW5pdGlhbENvbFdpZHRocyA6IHRoaXMuX3RvdGFsVGFibGVXaWR0aCgpO1xuICAgICAgICAgICAgICAgIE9iamVjdFV0aWxzLnJlb3JkZXJBcnJheSh3aWR0aCwgZHJhZ0luZGV4ICsgMSwgZHJvcEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZUVsZW1lbnQod2lkdGgsIGRyYWdJbmRleCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICg8RWxlbWVudFJlZj50aGlzLnJlb3JkZXJJbmRpY2F0b3JVcFZpZXdDaGlsZCkubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgKDxFbGVtZW50UmVmPnRoaXMucmVvcmRlckluZGljYXRvckRvd25WaWV3Q2hpbGQpLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZENvbHVtbi5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZENvbHVtbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmRyb3BQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNlbGxzKG5ld0NvbHVtbldpZHRoOiBudW1iZXIsIG5leHRDb2x1bW5XaWR0aDogbnVtYmVyIHwgbnVsbCkge1xuICAgICAgICBsZXQgY29sSW5kZXggPSBEb21IYW5kbGVyLmluZGV4KHRoaXMucmVzaXplQ29sdW1uRWxlbWVudCk7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuY29sdW1uUmVzaXplTW9kZSA9PT0gJ2V4cGFuZCcgPyB0aGlzLl9pbml0aWFsQ29sV2lkdGhzIDogdGhpcy5fdG90YWxUYWJsZVdpZHRoKCk7XG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVFbGVtZW50KHdpZHRoLCBjb2xJbmRleCwgbmV3Q29sdW1uV2lkdGgsIG5leHRDb2x1bW5XaWR0aCk7XG4gICAgfVxuXG4gICAgdXBkYXRlU3R5bGVFbGVtZW50KHdpZHRoOiBudW1iZXJbXSwgY29sSW5kZXg6IG51bWJlciwgbmV3Q29sdW1uV2lkdGg6IG51bWJlciwgbmV4dENvbHVtbldpZHRoOiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVN0eWxlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZVN0eWxlRWxlbWVudCgpO1xuXG4gICAgICAgIGxldCBpbm5lckhUTUwgPSAnJztcbiAgICAgICAgd2lkdGguZm9yRWFjaCgod2lkdGgsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgY29sV2lkdGggPSBpbmRleCA9PT0gY29sSW5kZXggPyBuZXdDb2x1bW5XaWR0aCA6IG5leHRDb2x1bW5XaWR0aCAmJiBpbmRleCA9PT0gY29sSW5kZXggKyAxID8gbmV4dENvbHVtbldpZHRoIDogd2lkdGg7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSBgd2lkdGg6ICR7Y29sV2lkdGh9cHggIWltcG9ydGFudDsgbWF4LXdpZHRoOiAke2NvbFdpZHRofXB4ICFpbXBvcnRhbnQ7YDtcbiAgICAgICAgICAgIGlubmVySFRNTCArPSBgXG4gICAgICAgICAgICAgICAgIyR7dGhpcy5pZH0tdGFibGUgPiAuY2F4LWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGg6bnRoLWNoaWxkKCR7aW5kZXggKyAxfSksXG4gICAgICAgICAgICAgICAgIyR7dGhpcy5pZH0tdGFibGUgPiAuY2F4LWRhdGF0YWJsZS10Ym9keSA+IHRyID4gdGQ6bnRoLWNoaWxkKCR7aW5kZXggKyAxfSksXG4gICAgICAgICAgICAgICAgIyR7dGhpcy5pZH0tdGFibGUgPiAuY2F4LWRhdGF0YWJsZS10Zm9vdCA+IHRyID4gdGQ6bnRoLWNoaWxkKCR7aW5kZXggKyAxfSkge1xuICAgICAgICAgICAgICAgICAgICAke3N0eWxlfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGA7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuc3R5bGVFbGVtZW50LCAnaW5uZXJIVE1MJywgdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKGlubmVySFRNTCkpO1xuICAgIH1cblxuICAgIG9uUm93RHJhZ1N0YXJ0KGV2ZW50OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5yb3dEcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZHJhZ2dlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgJ2InKTsgLy8gRm9yIGZpcmVmb3hcbiAgICB9XG5cbiAgICBvblJvd0RyYWdPdmVyKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyLCByb3dFbGVtZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMucm93RHJhZ2dpbmcgJiYgdGhpcy5kcmFnZ2VkUm93SW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgICAgICBsZXQgcm93WSA9IERvbUhhbmRsZXIuZ2V0T2Zmc2V0KHJvd0VsZW1lbnQpLnRvcDtcbiAgICAgICAgICAgIGxldCBwYWdlWSA9IGV2ZW50LnBhZ2VZO1xuICAgICAgICAgICAgbGV0IHJvd01pZFkgPSByb3dZICsgRG9tSGFuZGxlci5nZXRPdXRlckhlaWdodChyb3dFbGVtZW50KSAvIDI7XG4gICAgICAgICAgICBsZXQgcHJldlJvd0VsZW1lbnQgPSByb3dFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGlmIChwYWdlWSA8IHJvd01pZFkpIHtcbiAgICAgICAgICAgICAgICBEb21IYW5kbGVyLnJlbW92ZUNsYXNzKHJvd0VsZW1lbnQsICdjYXgtZGF0YXRhYmxlLWRyYWdwb2ludC1ib3R0b20nKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcHBlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZSb3dFbGVtZW50KSBEb21IYW5kbGVyLmFkZENsYXNzKHByZXZSb3dFbGVtZW50LCAnY2F4LWRhdGF0YWJsZS1kcmFncG9pbnQtYm90dG9tJyk7XG4gICAgICAgICAgICAgICAgZWxzZSBEb21IYW5kbGVyLmFkZENsYXNzKHJvd0VsZW1lbnQsICdjYXgtZGF0YXRhYmxlLWRyYWdwb2ludC10b3AnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZSb3dFbGVtZW50KSBEb21IYW5kbGVyLnJlbW92ZUNsYXNzKHByZXZSb3dFbGVtZW50LCAnY2F4LWRhdGF0YWJsZS1kcmFncG9pbnQtYm90dG9tJyk7XG4gICAgICAgICAgICAgICAgZWxzZSBEb21IYW5kbGVyLmFkZENsYXNzKHJvd0VsZW1lbnQsICdjYXgtZGF0YXRhYmxlLWRyYWdwb2ludC10b3AnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcHBlZFJvd0luZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIERvbUhhbmRsZXIuYWRkQ2xhc3Mocm93RWxlbWVudCwgJ2NheC1kYXRhdGFibGUtZHJhZ3BvaW50LWJvdHRvbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Sb3dEcmFnTGVhdmUoZXZlbnQ6IEV2ZW50LCByb3dFbGVtZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IHByZXZSb3dFbGVtZW50ID0gcm93RWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAocHJldlJvd0VsZW1lbnQpIHtcbiAgICAgICAgICAgIERvbUhhbmRsZXIucmVtb3ZlQ2xhc3MocHJldlJvd0VsZW1lbnQsICdjYXgtZGF0YXRhYmxlLWRyYWdwb2ludC1ib3R0b20nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERvbUhhbmRsZXIucmVtb3ZlQ2xhc3Mocm93RWxlbWVudCwgJ2NheC1kYXRhdGFibGUtZHJhZ3BvaW50LWJvdHRvbScpO1xuICAgICAgICBEb21IYW5kbGVyLnJlbW92ZUNsYXNzKHJvd0VsZW1lbnQsICdjYXgtZGF0YXRhYmxlLWRyYWdwb2ludC10b3AnKTtcbiAgICB9XG5cbiAgICBvblJvd0RyYWdFbmQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMucm93RHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnZ2VkUm93SW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLmRyb3BwZWRSb3dJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgb25Sb3dEcm9wKGV2ZW50OiBFdmVudCwgcm93RWxlbWVudDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmRyb3BwZWRSb3dJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgZHJvcEluZGV4ID0gPG51bWJlcj50aGlzLmRyYWdnZWRSb3dJbmRleCA+IHRoaXMuZHJvcHBlZFJvd0luZGV4ID8gdGhpcy5kcm9wcGVkUm93SW5kZXggOiB0aGlzLmRyb3BwZWRSb3dJbmRleCA9PT0gMCA/IDAgOiB0aGlzLmRyb3BwZWRSb3dJbmRleCAtIDE7XG4gICAgICAgICAgICBPYmplY3RVdGlscy5yZW9yZGVyQXJyYXkodGhpcy52YWx1ZSwgPG51bWJlcj50aGlzLmRyYWdnZWRSb3dJbmRleCwgZHJvcEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IENoZWNrXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBbLi4udGhpcy5fdmFsdWVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm9uUm93UmVvcmRlci5lbWl0KHtcbiAgICAgICAgICAgICAgICBkcmFnSW5kZXg6IDxudW1iZXI+dGhpcy5kcmFnZ2VkUm93SW5kZXgsXG4gICAgICAgICAgICAgICAgZHJvcEluZGV4OiBkcm9wSW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vY2xlYW51cFxuICAgICAgICB0aGlzLm9uUm93RHJhZ0xlYXZlKGV2ZW50LCByb3dFbGVtZW50KTtcbiAgICAgICAgdGhpcy5vblJvd0RyYWdFbmQoZXZlbnQpO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5maWx0ZXJlZFZhbHVlIHx8IHRoaXMudmFsdWU7XG4gICAgICAgIHJldHVybiBkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGggPT0gMDtcbiAgICB9XG5cbiAgICBnZXRCbG9ja2FibGVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXTtcbiAgICB9XG5cbiAgICBnZXRTdG9yYWdlKCkge1xuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xvY2FsJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdzZXNzaW9uJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXNzaW9uU3RvcmFnZTtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLnN0YXRlU3RvcmFnZSArICcgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBzdGF0ZSBzdG9yYWdlLCBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBcImxvY2FsXCIgYW5kIFwic2Vzc2lvblwiLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIHN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgc2VydmVyIHNpZGUuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1N0YXRlZnVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZUtleSAhPSBudWxsO1xuICAgIH1cblxuICAgIHNhdmVTdGF0ZSgpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZSgpO1xuICAgICAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSB7fTtcblxuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHN0YXRlLmZpcnN0ID0gPG51bWJlcj50aGlzLmZpcnN0O1xuICAgICAgICAgICAgc3RhdGUucm93cyA9IHRoaXMucm93cztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNvcnRGaWVsZCkge1xuICAgICAgICAgICAgc3RhdGUuc29ydEZpZWxkID0gdGhpcy5zb3J0RmllbGQ7XG4gICAgICAgICAgICBzdGF0ZS5zb3J0T3JkZXIgPSB0aGlzLnNvcnRPcmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpU29ydE1ldGEpIHtcbiAgICAgICAgICAgIHN0YXRlLm11bHRpU29ydE1ldGEgPSB0aGlzLm11bHRpU29ydE1ldGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgc3RhdGUuZmlsdGVycyA9IHRoaXMuZmlsdGVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc2l6YWJsZUNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZW9yZGVyYWJsZUNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvbHVtbk9yZGVyKHN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5leHBhbmRlZFJvd0tleXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RhdGUuZXhwYW5kZWRSb3dLZXlzID0gdGhpcy5leHBhbmRlZFJvd0tleXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oPHN0cmluZz50aGlzLnN0YXRlS2V5LCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICAgICAgICB0aGlzLm9uU3RhdGVTYXZlLmVtaXQoc3RhdGUpO1xuICAgIH1cblxuICAgIGNsZWFyU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmdldFN0b3JhZ2UoKTtcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZUtleSkge1xuICAgICAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RhdGVLZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdG9yZVN0YXRlKCkge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5nZXRTdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHN0YXRlU3RyaW5nID0gc3RvcmFnZS5nZXRJdGVtKDxzdHJpbmc+dGhpcy5zdGF0ZUtleSk7XG4gICAgICAgIGNvbnN0IGRhdGVGb3JtYXQgPSAvXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0uXFxkezN9Wi87XG4gICAgICAgIGNvbnN0IHJldml2ZXIgPSBmdW5jdGlvbiAoa2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIGRhdGVGb3JtYXQudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHN0YXRlU3RyaW5nKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKHN0YXRlU3RyaW5nLCByZXZpdmVyKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RDaGFuZ2UuZW1pdCh0aGlzLmZpcnN0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3dzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dzID0gc3RhdGUucm93cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dzQ2hhbmdlLmVtaXQodGhpcy5yb3dzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZS5zb3J0RmllbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmluZ1NvcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IHN0YXRlLnNvcnRGaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSA8bnVtYmVyPnN0YXRlLnNvcnRPcmRlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0YXRlLm11bHRpU29ydE1ldGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmluZ1NvcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpU29ydE1ldGEgPSBzdGF0ZS5tdWx0aVNvcnRNZXRhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RhdGUuZmlsdGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yaW5nRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBzdGF0ZS5maWx0ZXJzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemFibGVDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5XaWR0aHNTdGF0ZSA9IHN0YXRlLmNvbHVtbldpZHRocztcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnJlb3JkZXJhYmxlQ29sdW1ucykge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMucmVzdG9yZUNvbHVtbk9yZGVyKCk7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZS5leHBhbmRlZFJvd0tleXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZGVkUm93S2V5cyA9IHN0YXRlLmV4cGFuZGVkUm93S2V5cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgpID0+IHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc3RhdGUuc2VsZWN0aW9uKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3RhdGVSZXN0b3JlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMub25TdGF0ZVJlc3RvcmUuZW1pdChzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzYXZlQ29sdW1uV2lkdGhzKHN0YXRlOiBhbnkpIHtcbiAgICAgICAgbGV0IHdpZHRoczogYW55W10gPSBbXTtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBbXTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgICAgaGVhZGVycyA9IERvbUhhbmRsZXIuZmluZChjb250YWluZXIsICcuY2F4LWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyKSA9PiB3aWR0aHMucHVzaChEb21IYW5kbGVyLmdldE91dGVyV2lkdGgoaGVhZGVyKSkpO1xuICAgICAgICBzdGF0ZS5jb2x1bW5XaWR0aHMgPSB3aWR0aHMuam9pbignLCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbHVtblJlc2l6ZU1vZGUgPT09ICdleHBhbmQnKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWJsZVdpZHRoID0gRG9tSGFuZGxlci5nZXRPdXRlcldpZHRoKHRoaXMudGFibGVWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UmVzaXplVGFibGVXaWR0aCh3aWR0aDogc3RyaW5nKSB7XG4gICAgICAgICg8RWxlbWVudFJlZj50aGlzLnRhYmxlVmlld0NoaWxkKS5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgICg8RWxlbWVudFJlZj50aGlzLnRhYmxlVmlld0NoaWxkKS5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbldpZHRoID0gd2lkdGg7XG4gICAgfVxuXG4gICAgcmVzdG9yZUNvbHVtbldpZHRocygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uV2lkdGhzU3RhdGUpIHtcbiAgICAgICAgICAgIGxldCB3aWR0aHMgPSB0aGlzLmNvbHVtbldpZHRoc1N0YXRlLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbHVtblJlc2l6ZU1vZGUgPT09ICdleHBhbmQnICYmIHRoaXMudGFibGVXaWR0aFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZXNpemVUYWJsZVdpZHRoKHRoaXMudGFibGVXaWR0aFN0YXRlICsgJ3B4Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc05vdEVtcHR5KHdpZHRocykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN0eWxlRWxlbWVudCgpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIHdpZHRocy5mb3JFYWNoKCh3aWR0aCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gYHdpZHRoOiAke3dpZHRofXB4ICFpbXBvcnRhbnQ7IG1heC13aWR0aDogJHt3aWR0aH1weCAhaW1wb3J0YW50YDtcblxuICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUwgKz0gYFxuICAgICAgICAgICAgICAgICAgICAgICAgIyR7dGhpcy5pZH0tdGFibGUgPiAuY2F4LWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGg6bnRoLWNoaWxkKCR7aW5kZXggKyAxfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAjJHt0aGlzLmlkfS10YWJsZSA+IC5jYXgtZGF0YXRhYmxlLXRib2R5ID4gdHIgPiB0ZDpudGgtY2hpbGQoJHtpbmRleCArIDF9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICMke3RoaXMuaWR9LXRhYmxlID4gLmNheC1kYXRhdGFibGUtdGZvb3QgPiB0ciA+IHRkOm50aC1jaGlsZCgke2luZGV4ICsgMX0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3N0eWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBpbm5lckhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzYXZlQ29sdW1uT3JkZXIoc3RhdGU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBsZXQgY29sdW1uT3JkZXI6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW5PcmRlci5wdXNoKGNvbHVtbi5maWVsZCB8fCBjb2x1bW4ua2V5KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzdGF0ZS5jb2x1bW5PcmRlciA9IGNvbHVtbk9yZGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdG9yZUNvbHVtbk9yZGVyKCkge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5nZXRTdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IHN0YXRlU3RyaW5nID0gc3RvcmFnZS5nZXRJdGVtKDxzdHJpbmc+dGhpcy5zdGF0ZUtleSk7XG4gICAgICAgIGlmIChzdGF0ZVN0cmluZykge1xuICAgICAgICAgICAgbGV0IHN0YXRlOiBUYWJsZVN0YXRlID0gSlNPTi5wYXJzZShzdGF0ZVN0cmluZyk7XG4gICAgICAgICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcblxuICAgICAgICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnM6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBjb2x1bW5PcmRlci5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29sID0gdGhpcy5maW5kQ29sdW1uQnlLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVvcmRlcmVkQ29sdW1ucy5wdXNoKGNvbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbk9yZGVyU3RhdGVSZXN0b3JlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZpbmRDb2x1bW5CeUtleShrZXk6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5rZXkgPT09IGtleSB8fCBjb2wuZmllbGQgPT09IGtleSkgcmV0dXJuIGNvbDtcbiAgICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVTdHlsZUVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgRG9tSGFuZGxlci5zZXRBdHRyaWJ1dGUodGhpcy5zdHlsZUVsZW1lbnQsICdub25jZScsIHRoaXMuY29uZmlnPy5jc3AoKT8ubm9uY2UpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgdGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIGdldEdyb3VwUm93c01ldGEoKSB7XG4gICAgICAgIHJldHVybiB7IGZpZWxkOiB0aGlzLmdyb3VwUm93c0J5LCBvcmRlcjogdGhpcy5ncm91cFJvd3NCeU9yZGVyIH07XG4gICAgfVxuXG4gICAgZ2V0VGFibGVDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2NheC1kYXRhdGFibGUgY2F4LWNvbXBvbmVudCc6IHRydWUsXG4gICAgICAgICAgICAnY2F4LWRhdGF0YWJsZS1ob3ZlcmFibGUtcm93cyc6IHRoaXMucm93SG92ZXIgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlLFxuICAgICAgICAgICAgJ2NheC1kYXRhdGFibGUtc2Nyb2xsYWJsZSc6IHRoaXMuc2Nyb2xsYWJsZSxcbiAgICAgICAgICAgICdjYXgtZGF0YXRhYmxlLWZsZXgtc2Nyb2xsYWJsZSc6IHRoaXMuc2Nyb2xsYWJsZSAmJiB0aGlzLnNjcm9sbEhlaWdodCA9PT0gJ2ZsZXgnLFxuICAgICAgICAgICAgWydjYXgtZGF0YXRhYmxlLWZvbnQtJyArIHRoaXMuZm9udFNpemVdOiB0cnVlLFxuICAgICAgICAgICAgWydjYXgtZGF0YXRhYmxlLXJvdy0nICsgdGhpcy5yb3dTaXplXTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNyZWF0ZVJlc3BvbnNpdmVTdHlsZSgpIHtcbiAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNwb25zaXZlU3R5bGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZlU3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZVN0eWxlRWxlbWVudC50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgICAgICAgICBEb21IYW5kbGVyLnNldEF0dHJpYnV0ZSh0aGlzLnJlc3BvbnNpdmVTdHlsZUVsZW1lbnQsICdub25jZScsIHRoaXMuY29uZmlnPy5jc3AoKT8ubm9uY2UpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5oZWFkLCB0aGlzLnJlc3BvbnNpdmVTdHlsZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlubmVySFRNTCA9IGBcbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAke3RoaXMuYnJlYWtwb2ludH0pIHtcbiAgICAgICAgIyR7dGhpcy5pZH0tdGFibGUgPiAuY2F4LWRhdGF0YWJsZS10aGVhZCA+IHRyID4gdGgsXG4gICAgICAgICMke3RoaXMuaWR9LXRhYmxlID4gLmNheC1kYXRhdGFibGUtdGZvb3QgPiB0ciA+IHRkIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgfVxuXG4gICAgICAgICMke3RoaXMuaWR9LXRhYmxlID4gLmNheC1kYXRhdGFibGUtdGJvZHkgPiB0ciA+IHRkIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgfVxuXG4gICAgICAgICMke3RoaXMuaWR9LXRhYmxlID4gLmNheC1kYXRhdGFibGUtdGJvZHkgPiB0ciA+IHRkOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgICAgICAgICAgYm9yZGVyOiAwIG5vbmU7XG4gICAgICAgIH1cblxuICAgICAgICAjJHt0aGlzLmlkfS5jYXgtZGF0YXRhYmxlLWdyaWRsaW5lcyA+IC5jYXgtZGF0YXRhYmxlLXdyYXBwZXIgPiAuY2F4LWRhdGF0YWJsZS10YWJsZSA+IC5jYXgtZGF0YXRhYmxlLXRib2R5ID4gdHIgPiB0ZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIGJvcmRlci10b3A6IDA7XG4gICAgICAgICAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgICAgICAgICBib3JkZXItbGVmdDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgICMke3RoaXMuaWR9LXRhYmxlID4gLmNheC1kYXRhdGFibGUtdGJvZHkgPiB0ciA+IHRkID4gLmNheC1jb2x1bW4tdGl0bGUge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMucmVzcG9uc2l2ZVN0eWxlRWxlbWVudCwgJ2lubmVySFRNTCcsIHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShpbm5lckhUTUwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3lSZXNwb25zaXZlU3R5bGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNpdmVTdHlsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5kb2N1bWVudC5oZWFkLCB0aGlzLnJlc3BvbnNpdmVTdHlsZUVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZlU3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3lTdHlsZUVsZW1lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnVuYmluZERvY3VtZW50RWRpdExpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMuZWRpdGluZ0NlbGwgPSBudWxsO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gbnVsbDtcblxuICAgICAgICB0aGlzLmRlc3Ryb3lTdHlsZUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95UmVzcG9uc2l2ZVN0eWxlKCk7XG4gICAgfVxuXG4gICAgZ2V0UGFnaW5hdG9yU3R5bGVDbGFzc2VzKGNsYXNzTmFtZT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gW3RoaXMucGFnaW5hdG9yU3R5bGVDbGFzcywgY2xhc3NOYW1lXVxuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gISFjKVxuICAgICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICB9XG59XG4iLCI8ZGl2ICNjb250YWluZXIgW25nU3R5bGVdPVwic3R5bGVcIiBbY2xhc3NdPVwic3R5bGVDbGFzc1wiIFtuZ0NsYXNzXT1cImdldFRhYmxlQ2xhc3NlcygpXCIgW2F0dHIuaWRdPVwiaWRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXgtZGF0YXRhYmxlLWxvYWRpbmctb3ZlcmxheSBjYXgtY29tcG9uZW50LW92ZXJsYXlcIiAqbmdJZj1cImxvYWRpbmcgJiYgc2hvd0xvYWRlclwiPlxyXG4gICAgICAgIDxpICpuZ0lmPVwibG9hZGluZ0ljb25cIiBbY2xhc3NdPVwiJ2NheC1kYXRhdGFibGUtbG9hZGluZy1pY29uICcgKyBsb2FkaW5nSWNvblwiPjwvaT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdJY29uXCI+XHJcbiAgICAgICAgICAgIDxTcGlubmVySWNvbiAqbmdJZj1cIiFsb2FkaW5nSWNvblRlbXBsYXRlXCIgW3NwaW5dPVwidHJ1ZVwiIFtzdHlsZUNsYXNzXT1cIidjYXgtZGF0YXRhYmxlLWxvYWRpbmctaWNvbidcIiAvPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdJY29uVGVtcGxhdGVcIiBjbGFzcz1cImNheC1kYXRhdGFibGUtbG9hZGluZy1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nSWNvblRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiY2FwdGlvblRlbXBsYXRlXCIgY2xhc3M9XCJjYXgtZGF0YXRhYmxlLWhlYWRlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGNheC1wYWdpbmF0b3JcclxuICAgICAgICBbcm93c109XCJyb3dzXCJcclxuICAgICAgICBbZmlyc3RdPVwiZmlyc3RcIlxyXG4gICAgICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcclxuICAgICAgICBbcGFnZUxpbmtTaXplXT1cInBhZ2VMaW5rc1wiXHJcbiAgICAgICAgW2Fsd2F5c1Nob3ddPVwiYWx3YXlzU2hvd1BhZ2luYXRvclwiXHJcbiAgICAgICAgKG9uUGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZU9wdGlvbnNcIlxyXG4gICAgICAgICpuZ0lmPVwicGFnaW5hdG9yICYmIChwYWdpbmF0b3JQb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcGFnaW5hdG9yUG9zaXRpb24gPT0gJ2JvdGgnKVwiXHJcbiAgICAgICAgW3RlbXBsYXRlTGVmdF09XCJwYWdpbmF0b3JMZWZ0VGVtcGxhdGVcIlxyXG4gICAgICAgIFt0ZW1wbGF0ZVJpZ2h0XT1cInBhZ2luYXRvclJpZ2h0VGVtcGxhdGVcIlxyXG4gICAgICAgIFtkcm9wZG93bkFwcGVuZFRvXT1cInBhZ2luYXRvckRyb3Bkb3duQXBwZW5kVG9cIlxyXG4gICAgICAgIFtkcm9wZG93blNjcm9sbEhlaWdodF09XCJwYWdpbmF0b3JEcm9wZG93blNjcm9sbEhlaWdodFwiXHJcbiAgICAgICAgW2N1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGVdPVwiY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZVwiXHJcbiAgICAgICAgW3Nob3dGaXJzdExhc3RJY29uXT1cInNob3dGaXJzdExhc3RJY29uXCJcclxuICAgICAgICBbZHJvcGRvd25JdGVtVGVtcGxhdGVdPVwicGFnaW5hdG9yRHJvcGRvd25JdGVtVGVtcGxhdGVcIlxyXG4gICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwic2hvd0N1cnJlbnRQYWdlUmVwb3J0XCJcclxuICAgICAgICBbc2hvd0p1bXBUb1BhZ2VEcm9wZG93bl09XCJzaG93SnVtcFRvUGFnZURyb3Bkb3duXCJcclxuICAgICAgICBbc2hvd0p1bXBUb1BhZ2VJbnB1dF09XCJzaG93SnVtcFRvUGFnZUlucHV0XCJcclxuICAgICAgICBbc2hvd1BhZ2VMaW5rc109XCJzaG93UGFnZUxpbmtzXCJcclxuICAgICAgICBbc3R5bGVDbGFzc109XCJnZXRQYWdpbmF0b3JTdHlsZUNsYXNzZXMoJ2NheC1wYWdpbmF0b3ItdG9wJylcIlxyXG4gICAgICAgIFtsb2NhbGVdPVwicGFnaW5hdG9yTG9jYWxlXCJcclxuICAgID5cclxuICAgICAgICA8bmctdGVtcGxhdGUgY2F4VGVtcGxhdGU9XCJkcm9wZG93bmljb25cIiAqbmdJZj1cInBhZ2luYXRvckRyb3Bkb3duSWNvblRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmF0b3JEcm9wZG93bkljb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBjYXhUZW1wbGF0ZT1cImZpcnN0cGFnZWxpbmtpY29uXCIgKm5nSWY9XCJwYWdpbmF0b3JGaXJzdFBhZ2VMaW5rSWNvblRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmF0b3JGaXJzdFBhZ2VMaW5rSWNvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGNheFRlbXBsYXRlPVwicHJldmlvdXNwYWdlbGlua2ljb25cIiAqbmdJZj1cInBhZ2luYXRvclByZXZpb3VzUGFnZUxpbmtJY29uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luYXRvclByZXZpb3VzUGFnZUxpbmtJY29uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgY2F4VGVtcGxhdGU9XCJsYXN0cGFnZWxpbmtpY29uXCIgKm5nSWY9XCJwYWdpbmF0b3JMYXN0UGFnZUxpbmtJY29uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luYXRvckxhc3RQYWdlTGlua0ljb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBjYXhUZW1wbGF0ZT1cIm5leHRwYWdlbGlua2ljb25cIiAqbmdJZj1cInBhZ2luYXRvck5leHRQYWdlTGlua0ljb25UZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnaW5hdG9yTmV4dFBhZ2VMaW5rSWNvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvY2F4LXBhZ2luYXRvcj5cclxuXHJcbiAgICA8ZGl2ICN3cmFwcGVyIGNsYXNzPVwiY2F4LWRhdGF0YWJsZS13cmFwcGVyXCIgW25nU3R5bGVdPVwieyBtYXhIZWlnaHQ6IHZpcnR1YWxTY3JvbGwgPyAnJyA6IHNjcm9sbEhlaWdodCB9XCI+XHJcbiAgICAgICAgPGNheC1zY3JvbGxlclxyXG4gICAgICAgICAgICAjc2Nyb2xsZXJcclxuICAgICAgICAgICAgKm5nSWY9XCJ2aXJ0dWFsU2Nyb2xsXCJcclxuICAgICAgICAgICAgW2l0ZW1zXT1cInByb2Nlc3NlZERhdGFcIlxyXG4gICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgW3N0eWxlXT1cInsgaGVpZ2h0OiBzY3JvbGxIZWlnaHQgIT09ICdmbGV4JyA/IHNjcm9sbEhlaWdodCA6IHVuZGVmaW5lZCB9XCJcclxuICAgICAgICAgICAgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHQgIT09ICdmbGV4JyA/IHVuZGVmaW5lZCA6ICcxMDAlJ1wiXHJcbiAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgfHwgX3ZpcnR1YWxSb3dIZWlnaHRcIlxyXG4gICAgICAgICAgICBbc3RlcF09XCJyb3dzXCJcclxuICAgICAgICAgICAgW2RlbGF5XT1cImxhenkgPyB2aXJ0dWFsU2Nyb2xsRGVsYXkgOiAwXCJcclxuICAgICAgICAgICAgW2lubGluZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW2F1dG9TaXplXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbbGF6eV09XCJsYXp5XCJcclxuICAgICAgICAgICAgKG9uTGF6eUxvYWQpPVwib25MYXp5SXRlbUxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtsb2FkZXJEaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW3Nob3dTcGFjZXJdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJsb2FkaW5nQm9keVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW29wdGlvbnNdPVwidmlydHVhbFNjcm9sbE9wdGlvbnNcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGNheFRlbXBsYXRlPVwiY29udGVudFwiIGxldC1pdGVtcyBsZXQtc2Nyb2xsZXJPcHRpb25zPVwib3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1aWxkSW5UYWJsZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW1zLCBvcHRpb25zOiBzY3JvbGxlck9wdGlvbnMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvY2F4LXNjcm9sbGVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmlydHVhbFNjcm9sbFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnVpbGRJblRhYmxlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcHJvY2Vzc2VkRGF0YSwgb3B0aW9uczogeyBjb2x1bW5zIH0gfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2J1aWxkSW5UYWJsZSBsZXQtaXRlbXMgbGV0LXNjcm9sbGVyT3B0aW9ucz1cIm9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPHRhYmxlXHJcbiAgICAgICAgICAgICAgICAjdGFibGVcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJ0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjYXgtZGF0YXRhYmxlLXRhYmxlJzogdHJ1ZSwgJ2NheC1kYXRhdGFibGUtc2Nyb2xsYWJsZS10YWJsZSc6IHNjcm9sbGFibGUsICdjYXgtZGF0YXRhYmxlLXJlc2l6YWJsZS10YWJsZSc6IHJlc2l6YWJsZUNvbHVtbnMsICdjYXgtZGF0YXRhYmxlLXJlc2l6YWJsZS10YWJsZS1maXQnOiByZXNpemFibGVDb2x1bW5zICYmIGNvbHVtblJlc2l6ZU1vZGUgPT09ICdmaXQnIH1cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cInRhYmxlU3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ0YWJsZVN0eWxlXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImlkICsgJy10YWJsZSdcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sR3JvdXBUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHNjcm9sbGVyT3B0aW9ucy5jb2x1bW5zIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZCByb2xlPVwicm93Z3JvdXBcIiAjdGhlYWQgY2xhc3M9XCJjYXgtZGF0YXRhYmxlLXRoZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlckdyb3VwZWRUZW1wbGF0ZSB8fCBoZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHNjcm9sbGVyT3B0aW9ucy5jb2x1bW5zIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHlcclxuICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93Z3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F4LWRhdGF0YWJsZS10Ym9keSBjYXgtZGF0YXRhYmxlLWZyb3plbi10Ym9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmcm96ZW5WYWx1ZSB8fCBmcm96ZW5Cb2R5VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmcm96ZW5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zyb3plblJvd3NdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NheFRhYmxlQm9keV09XCJzY3JvbGxlck9wdGlvbnMuY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NheFRhYmxlQm9keVRlbXBsYXRlXT1cImZyb3plbkJvZHlUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgID48L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgPHRib2R5XHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd2dyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNheC1kYXRhdGFibGUtdGJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNjcm9sbGVyT3B0aW9ucy5jb250ZW50U3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwic2Nyb2xsZXJPcHRpb25zLmNvbnRlbnRTdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGFUb1JlbmRlcihzY3JvbGxlck9wdGlvbnMucm93cylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjYXhUYWJsZUJvZHldPVwic2Nyb2xsZXJPcHRpb25zLmNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjYXhUYWJsZUJvZHlUZW1wbGF0ZV09XCJib2R5VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY3JvbGxlck9wdGlvbnNdPVwic2Nyb2xsZXJPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgID48L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgPHRib2R5XHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd2dyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNjcm9sbGVyT3B0aW9ucy5zcGFjZXJTdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6ICdjYWxjKCcgKyBzY3JvbGxlck9wdGlvbnMuc3BhY2VyU3R5bGUuaGVpZ2h0ICsgJyAtICcgKyBzY3JvbGxlck9wdGlvbnMucm93cy5sZW5ndGggKiBzY3JvbGxlck9wdGlvbnMuaXRlbVNpemUgKyAncHgpJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNheC1kYXRhdGFibGUtc2Nyb2xsZXItc3BhY2VyXCJcclxuICAgICAgICAgICAgICAgID48L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgPHRmb290IHJvbGU9XCJyb3dncm91cFwiICpuZ0lmPVwiZm9vdGVyR3JvdXBlZFRlbXBsYXRlIHx8IGZvb3RlclRlbXBsYXRlXCIgI3Rmb290IGNsYXNzPVwiY2F4LWRhdGF0YWJsZS10Zm9vdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb290ZXJHcm91cGVkVGVtcGxhdGUgfHwgZm9vdGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBzY3JvbGxlck9wdGlvbnMuY29sdW1ucyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L3Rmb290PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8Y2F4LXBhZ2luYXRvclxyXG4gICAgICAgIFtyb3dzXT1cInJvd3NcIlxyXG4gICAgICAgIFtmaXJzdF09XCJmaXJzdFwiXHJcbiAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIlxyXG4gICAgICAgIFtwYWdlTGlua1NpemVdPVwicGFnZUxpbmtzXCJcclxuICAgICAgICBbYWx3YXlzU2hvd109XCJhbHdheXNTaG93UGFnaW5hdG9yXCJcclxuICAgICAgICAob25QYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cInJvd3NQZXJQYWdlT3B0aW9uc1wiXHJcbiAgICAgICAgKm5nSWY9XCJwYWdpbmF0b3IgJiYgKHBhZ2luYXRvclBvc2l0aW9uID09PSAnYm90dG9tJyB8fCBwYWdpbmF0b3JQb3NpdGlvbiA9PSAnYm90aCcpXCJcclxuICAgICAgICBbdGVtcGxhdGVMZWZ0XT1cInBhZ2luYXRvckxlZnRUZW1wbGF0ZVwiXHJcbiAgICAgICAgW3RlbXBsYXRlUmlnaHRdPVwicGFnaW5hdG9yUmlnaHRUZW1wbGF0ZVwiXHJcbiAgICAgICAgW2Ryb3Bkb3duQXBwZW5kVG9dPVwicGFnaW5hdG9yRHJvcGRvd25BcHBlbmRUb1wiXHJcbiAgICAgICAgW2Ryb3Bkb3duU2Nyb2xsSGVpZ2h0XT1cInBhZ2luYXRvckRyb3Bkb3duU2Nyb2xsSGVpZ2h0XCJcclxuICAgICAgICBbY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZV09XCJjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXCJcclxuICAgICAgICBbc2hvd0ZpcnN0TGFzdEljb25dPVwic2hvd0ZpcnN0TGFzdEljb25cIlxyXG4gICAgICAgIFtkcm9wZG93bkl0ZW1UZW1wbGF0ZV09XCJwYWdpbmF0b3JEcm9wZG93bkl0ZW1UZW1wbGF0ZVwiXHJcbiAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJzaG93Q3VycmVudFBhZ2VSZXBvcnRcIlxyXG4gICAgICAgIFtzaG93SnVtcFRvUGFnZURyb3Bkb3duXT1cInNob3dKdW1wVG9QYWdlRHJvcGRvd25cIlxyXG4gICAgICAgIFtzaG93SnVtcFRvUGFnZUlucHV0XT1cInNob3dKdW1wVG9QYWdlSW5wdXRcIlxyXG4gICAgICAgIFtzaG93UGFnZUxpbmtzXT1cInNob3dQYWdlTGlua3NcIlxyXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cImdldFBhZ2luYXRvclN0eWxlQ2xhc3NlcygnY2F4LXBhZ2luYXRvci1ib3R0b20nKVwiXHJcbiAgICAgICAgW2xvY2FsZV09XCJwYWdpbmF0b3JMb2NhbGVcIlxyXG4gICAgPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBjYXhUZW1wbGF0ZT1cImRyb3Bkb3duaWNvblwiICpuZ0lmPVwicGFnaW5hdG9yRHJvcGRvd25JY29uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luYXRvckRyb3Bkb3duSWNvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGNheFRlbXBsYXRlPVwiZmlyc3RwYWdlbGlua2ljb25cIiAqbmdJZj1cInBhZ2luYXRvckZpcnN0UGFnZUxpbmtJY29uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luYXRvckZpcnN0UGFnZUxpbmtJY29uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgY2F4VGVtcGxhdGU9XCJwcmV2aW91c3BhZ2VsaW5raWNvblwiICpuZ0lmPVwicGFnaW5hdG9yUHJldmlvdXNQYWdlTGlua0ljb25UZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnaW5hdG9yUHJldmlvdXNQYWdlTGlua0ljb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBjYXhUZW1wbGF0ZT1cImxhc3RwYWdlbGlua2ljb25cIiAqbmdJZj1cInBhZ2luYXRvckxhc3RQYWdlTGlua0ljb25UZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnaW5hdG9yTGFzdFBhZ2VMaW5rSWNvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGNheFRlbXBsYXRlPVwibmV4dHBhZ2VsaW5raWNvblwiICpuZ0lmPVwicGFnaW5hdG9yTmV4dFBhZ2VMaW5rSWNvblRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmF0b3JOZXh0UGFnZUxpbmtJY29uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9jYXgtcGFnaW5hdG9yPlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJzdW1tYXJ5VGVtcGxhdGVcIiBjbGFzcz1cImNheC1kYXRhdGFibGUtZm9vdGVyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1bW1hcnlUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdlxyXG4gICAgICAgICNyZXNpemVIZWxwZXJcclxuICAgICAgICBjbGFzcz1cImNheC1jb2x1bW4tcmVzaXplci1oZWxwZXJcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICpuZ0lmPVwicmVzaXphYmxlQ29sdW1uc1wiXHJcbiAgICA+PC9kaXY+XHJcbiAgICA8c3BhblxyXG4gICAgICAgICNyZW9yZGVySW5kaWNhdG9yVXBcclxuICAgICAgICBjbGFzcz1cImNheC1kYXRhdGFibGUtcmVvcmRlci1pbmRpY2F0b3ItdXBcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICpuZ0lmPVwicmVvcmRlcmFibGVDb2x1bW5zXCJcclxuICAgID5cclxuICAgICAgICA8QXJyb3dEb3duSWNvbiAqbmdJZj1cIiFyZW9yZGVySW5kaWNhdG9yVXBJY29uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cInJlb3JkZXJJbmRpY2F0b3JVcEljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8c3BhblxyXG4gICAgICAgICNyZW9yZGVySW5kaWNhdG9yRG93blxyXG4gICAgICAgIGNsYXNzPVwiY2F4LWRhdGF0YWJsZS1yZW9yZGVyLWluZGljYXRvci1kb3duXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAqbmdJZj1cInJlb3JkZXJhYmxlQ29sdW1uc1wiXHJcbiAgICA+XHJcbiAgICAgICAgPEFycm93VXBJY29uICpuZ0lmPVwiIXJlb3JkZXJJbmRpY2F0b3JEb3duSWNvblRlbXBsYXRlXCIgLz5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW9yZGVySW5kaWNhdG9yRG93bkljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3NwYW4+XHJcbjwvZGl2PlxyXG4iXX0=