@ng-matero/extensions 15.5.1 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/alert/alert.d.ts +1 -1
  2. package/button/button-loading.d.ts +1 -1
  3. package/checkbox-group/checkbox-group.d.ts +1 -1
  4. package/colorpicker/colorpicker-input.d.ts +1 -1
  5. package/colorpicker/colorpicker-toggle.d.ts +1 -1
  6. package/colorpicker/colorpicker.d.ts +2 -2
  7. package/datetimepicker/calendar-body.d.ts +1 -1
  8. package/datetimepicker/calendar.d.ts +1 -1
  9. package/datetimepicker/clock.d.ts +1 -1
  10. package/datetimepicker/clock.scss +1 -4
  11. package/datetimepicker/datetimepicker-input.d.ts +1 -1
  12. package/datetimepicker/datetimepicker-toggle.d.ts +1 -1
  13. package/datetimepicker/datetimepicker.d.ts +2 -2
  14. package/datetimepicker/month-view.d.ts +1 -1
  15. package/datetimepicker/multi-year-view.d.ts +1 -1
  16. package/datetimepicker/time.d.ts +2 -2
  17. package/datetimepicker/year-view.d.ts +1 -1
  18. package/esm2022/alert/alert-module.mjs +19 -0
  19. package/esm2022/alert/alert.mjs +53 -0
  20. package/esm2022/button/button-loading.mjs +77 -0
  21. package/esm2022/button/button-module.mjs +21 -0
  22. package/esm2022/checkbox-group/checkbox-group-module.mjs +22 -0
  23. package/esm2022/checkbox-group/checkbox-group.mjs +234 -0
  24. package/esm2022/colorpicker/colorpicker-input.mjs +229 -0
  25. package/esm2022/colorpicker/colorpicker-module.mjs +64 -0
  26. package/esm2022/colorpicker/colorpicker-toggle.mjs +103 -0
  27. package/esm2022/colorpicker/colorpicker.mjs +367 -0
  28. package/esm2022/column-resize/column-resize-directives/column-resize-flex.mjs +46 -0
  29. package/esm2022/column-resize/column-resize-directives/column-resize.mjs +46 -0
  30. package/esm2022/column-resize/column-resize-module.mjs +29 -0
  31. package/esm2022/column-resize/column-resize-notifier.mjs +49 -0
  32. package/esm2022/column-resize/column-resize.mjs +83 -0
  33. package/esm2022/column-resize/column-size-store.mjs +21 -0
  34. package/esm2022/column-resize/event-dispatcher.mjs +68 -0
  35. package/esm2022/column-resize/overlay-handle.mjs +147 -0
  36. package/esm2022/column-resize/resizable.mjs +200 -0
  37. package/esm2022/column-resize/resize-strategy.mjs +235 -0
  38. package/{esm2020 → esm2022}/core/datetime/datetime-adapter.mjs +1 -1
  39. package/esm2022/core/datetime/datetime.module.mjs +44 -0
  40. package/esm2022/core/datetime/native-datetime-adapter.mjs +139 -0
  41. package/esm2022/core/pipes/is-template-ref.pipe.mjs +15 -0
  42. package/esm2022/core/pipes/pipes.module.mjs +20 -0
  43. package/esm2022/core/pipes/to-observable.pipe.mjs +16 -0
  44. package/esm2022/datetimepicker/calendar-body.mjs +79 -0
  45. package/esm2022/datetimepicker/calendar.mjs +672 -0
  46. package/esm2022/datetimepicker/clock.mjs +354 -0
  47. package/esm2022/datetimepicker/datetimepicker-input.mjs +350 -0
  48. package/esm2022/datetimepicker/datetimepicker-intl.mjs +64 -0
  49. package/esm2022/datetimepicker/datetimepicker-module.mjs +83 -0
  50. package/esm2022/datetimepicker/datetimepicker-toggle.mjs +106 -0
  51. package/esm2022/datetimepicker/datetimepicker.mjs +529 -0
  52. package/esm2022/datetimepicker/month-view.mjs +149 -0
  53. package/esm2022/datetimepicker/multi-year-view.mjs +215 -0
  54. package/esm2022/datetimepicker/time.mjs +458 -0
  55. package/esm2022/datetimepicker/year-view.mjs +139 -0
  56. package/esm2022/dialog/dialog-container.mjs +36 -0
  57. package/esm2022/dialog/dialog-module.mjs +25 -0
  58. package/esm2022/dialog/dialog.mjs +75 -0
  59. package/esm2022/drawer/drawer-container.mjs +253 -0
  60. package/esm2022/drawer/drawer-module.mjs +23 -0
  61. package/esm2022/drawer/drawer.mjs +167 -0
  62. package/esm2022/grid/cell.mjs +117 -0
  63. package/{esm2020 → esm2022}/grid/column-menu.mjs +6 -5
  64. package/esm2022/grid/column-resize/column-resize-directives/column-resize-flex.mjs +38 -0
  65. package/esm2022/grid/column-resize/column-resize-directives/column-resize.mjs +38 -0
  66. package/esm2022/grid/column-resize/column-resize-module.mjs +44 -0
  67. package/esm2022/grid/column-resize/overlay-handle.mjs +61 -0
  68. package/esm2022/grid/column-resize/resizable-directives/resizable.mjs +63 -0
  69. package/esm2022/grid/column-resize/resize-strategy.mjs +43 -0
  70. package/esm2022/grid/expansion-toggle.mjs +65 -0
  71. package/esm2022/grid/grid-module.mjs +137 -0
  72. package/esm2022/grid/grid-pipes.mjs +113 -0
  73. package/esm2022/grid/grid-utils.mjs +64 -0
  74. package/esm2022/grid/grid.mjs +630 -0
  75. package/esm2022/loader/loader-module.mjs +21 -0
  76. package/esm2022/loader/loader.mjs +70 -0
  77. package/esm2022/popover/popover-content.mjs +92 -0
  78. package/esm2022/popover/popover-module.mjs +25 -0
  79. package/esm2022/popover/popover-target.mjs +18 -0
  80. package/esm2022/popover/popover-trigger.mjs +472 -0
  81. package/esm2022/popover/popover.mjs +384 -0
  82. package/esm2022/progress/progress-module.mjs +19 -0
  83. package/esm2022/progress/progress.mjs +56 -0
  84. package/esm2022/select/option.mjs +58 -0
  85. package/esm2022/select/select-module.mjs +75 -0
  86. package/esm2022/select/select.mjs +561 -0
  87. package/esm2022/select/templates.mjs +135 -0
  88. package/esm2022/slider/slider-module.mjs +20 -0
  89. package/esm2022/slider/slider.mjs +1116 -0
  90. package/esm2022/split/split-module.mjs +20 -0
  91. package/esm2022/split/split-pane.mjs +150 -0
  92. package/esm2022/split/split.mjs +635 -0
  93. package/esm2022/tooltip/tooltip-module.mjs +25 -0
  94. package/esm2022/tooltip/tooltip.mjs +930 -0
  95. package/{fesm2020 → fesm2022}/mtxAlert.mjs +7 -7
  96. package/{fesm2020 → fesm2022}/mtxAlert.mjs.map +1 -1
  97. package/{fesm2020 → fesm2022}/mtxButton.mjs +7 -7
  98. package/{fesm2015 → fesm2022}/mtxButton.mjs.map +1 -1
  99. package/{fesm2020 → fesm2022}/mtxCheckboxGroup.mjs +13 -13
  100. package/{fesm2020 → fesm2022}/mtxCheckboxGroup.mjs.map +1 -1
  101. package/{fesm2020 → fesm2022}/mtxColorpicker.mjs +41 -41
  102. package/{fesm2020 → fesm2022}/mtxColorpicker.mjs.map +1 -1
  103. package/{fesm2020 → fesm2022}/mtxColumnResize.mjs +46 -46
  104. package/{fesm2015 → fesm2022}/mtxColumnResize.mjs.map +1 -1
  105. package/{fesm2020 → fesm2022}/mtxCore.mjs +26 -26
  106. package/fesm2022/mtxCore.mjs.map +1 -0
  107. package/{fesm2020 → fesm2022}/mtxDatetimepicker.mjs +84 -80
  108. package/fesm2022/mtxDatetimepicker.mjs.map +1 -0
  109. package/{fesm2020 → fesm2022}/mtxDialog.mjs +10 -10
  110. package/{fesm2015 → fesm2022}/mtxDialog.mjs.map +1 -1
  111. package/{fesm2020 → fesm2022}/mtxDrawer.mjs +10 -10
  112. package/{fesm2020 → fesm2022}/mtxDrawer.mjs.map +1 -1
  113. package/{fesm2020 → fesm2022}/mtxGrid.mjs +120 -120
  114. package/{fesm2020 → fesm2022}/mtxGrid.mjs.map +1 -1
  115. package/{fesm2020 → fesm2022}/mtxLoader.mjs +7 -7
  116. package/{fesm2020 → fesm2022}/mtxLoader.mjs.map +1 -1
  117. package/{fesm2020 → fesm2022}/mtxPopover.mjs +19 -19
  118. package/{fesm2020 → fesm2022}/mtxPopover.mjs.map +1 -1
  119. package/{fesm2020 → fesm2022}/mtxProgress.mjs +7 -7
  120. package/{fesm2015 → fesm2022}/mtxProgress.mjs.map +1 -1
  121. package/{fesm2020 → fesm2022}/mtxSelect.mjs +67 -67
  122. package/{fesm2015 → fesm2022}/mtxSelect.mjs.map +1 -1
  123. package/{fesm2020 → fesm2022}/mtxSlider.mjs +7 -7
  124. package/{fesm2020 → fesm2022}/mtxSlider.mjs.map +1 -1
  125. package/{fesm2020 → fesm2022}/mtxSplit.mjs +10 -10
  126. package/{fesm2020 → fesm2022}/mtxSplit.mjs.map +1 -1
  127. package/{fesm2020 → fesm2022}/mtxTooltip.mjs +16 -16
  128. package/{fesm2015 → fesm2022}/mtxTooltip.mjs.map +1 -1
  129. package/grid/cell.d.ts +1 -1
  130. package/grid/column-menu.d.ts +1 -1
  131. package/grid/column-resize/resizable-directives/resizable.d.ts +1 -1
  132. package/grid/expansion-toggle.d.ts +1 -1
  133. package/grid/grid.d.ts +2 -2
  134. package/loader/loader.d.ts +1 -1
  135. package/package.json +69 -109
  136. package/popover/popover-trigger.d.ts +1 -1
  137. package/popover/popover.d.ts +1 -1
  138. package/progress/progress.d.ts +1 -1
  139. package/select/option.d.ts +1 -1
  140. package/select/select.d.ts +1 -1
  141. package/slider/slider.d.ts +1 -1
  142. package/split/split-pane.d.ts +1 -1
  143. package/split/split.d.ts +1 -1
  144. package/tooltip/tooltip.d.ts +1 -1
  145. package/tooltip/tooltip.scss +1 -4
  146. package/esm2020/alert/alert-module.mjs +0 -18
  147. package/esm2020/alert/alert.mjs +0 -52
  148. package/esm2020/button/button-loading.mjs +0 -76
  149. package/esm2020/button/button-module.mjs +0 -20
  150. package/esm2020/checkbox-group/checkbox-group-module.mjs +0 -21
  151. package/esm2020/checkbox-group/checkbox-group.mjs +0 -233
  152. package/esm2020/colorpicker/colorpicker-input.mjs +0 -228
  153. package/esm2020/colorpicker/colorpicker-module.mjs +0 -63
  154. package/esm2020/colorpicker/colorpicker-toggle.mjs +0 -101
  155. package/esm2020/colorpicker/colorpicker.mjs +0 -365
  156. package/esm2020/column-resize/column-resize-directives/column-resize-flex.mjs +0 -45
  157. package/esm2020/column-resize/column-resize-directives/column-resize.mjs +0 -45
  158. package/esm2020/column-resize/column-resize-module.mjs +0 -28
  159. package/esm2020/column-resize/column-resize-notifier.mjs +0 -47
  160. package/esm2020/column-resize/column-resize.mjs +0 -82
  161. package/esm2020/column-resize/column-size-store.mjs +0 -20
  162. package/esm2020/column-resize/event-dispatcher.mjs +0 -67
  163. package/esm2020/column-resize/overlay-handle.mjs +0 -146
  164. package/esm2020/column-resize/resizable.mjs +0 -199
  165. package/esm2020/column-resize/resize-strategy.mjs +0 -232
  166. package/esm2020/core/datetime/datetime.module.mjs +0 -42
  167. package/esm2020/core/datetime/native-datetime-adapter.mjs +0 -138
  168. package/esm2020/core/pipes/is-template-ref.pipe.mjs +0 -14
  169. package/esm2020/core/pipes/pipes.module.mjs +0 -19
  170. package/esm2020/core/pipes/to-observable.pipe.mjs +0 -15
  171. package/esm2020/datetimepicker/calendar-body.mjs +0 -78
  172. package/esm2020/datetimepicker/calendar.mjs +0 -671
  173. package/esm2020/datetimepicker/clock.mjs +0 -349
  174. package/esm2020/datetimepicker/datetimepicker-input.mjs +0 -349
  175. package/esm2020/datetimepicker/datetimepicker-intl.mjs +0 -63
  176. package/esm2020/datetimepicker/datetimepicker-module.mjs +0 -82
  177. package/esm2020/datetimepicker/datetimepicker-toggle.mjs +0 -104
  178. package/esm2020/datetimepicker/datetimepicker.mjs +0 -527
  179. package/esm2020/datetimepicker/month-view.mjs +0 -148
  180. package/esm2020/datetimepicker/multi-year-view.mjs +0 -214
  181. package/esm2020/datetimepicker/time.mjs +0 -456
  182. package/esm2020/datetimepicker/year-view.mjs +0 -138
  183. package/esm2020/dialog/dialog-container.mjs +0 -35
  184. package/esm2020/dialog/dialog-module.mjs +0 -24
  185. package/esm2020/dialog/dialog.mjs +0 -74
  186. package/esm2020/drawer/drawer-container.mjs +0 -252
  187. package/esm2020/drawer/drawer-module.mjs +0 -22
  188. package/esm2020/drawer/drawer.mjs +0 -166
  189. package/esm2020/grid/cell.mjs +0 -116
  190. package/esm2020/grid/column-resize/column-resize-directives/column-resize-flex.mjs +0 -37
  191. package/esm2020/grid/column-resize/column-resize-directives/column-resize.mjs +0 -37
  192. package/esm2020/grid/column-resize/column-resize-module.mjs +0 -42
  193. package/esm2020/grid/column-resize/overlay-handle.mjs +0 -60
  194. package/esm2020/grid/column-resize/resizable-directives/resizable.mjs +0 -62
  195. package/esm2020/grid/column-resize/resize-strategy.mjs +0 -42
  196. package/esm2020/grid/expansion-toggle.mjs +0 -64
  197. package/esm2020/grid/grid-module.mjs +0 -136
  198. package/esm2020/grid/grid-pipes.mjs +0 -108
  199. package/esm2020/grid/grid-utils.mjs +0 -63
  200. package/esm2020/grid/grid.mjs +0 -628
  201. package/esm2020/loader/loader-module.mjs +0 -20
  202. package/esm2020/loader/loader.mjs +0 -69
  203. package/esm2020/popover/popover-content.mjs +0 -90
  204. package/esm2020/popover/popover-module.mjs +0 -24
  205. package/esm2020/popover/popover-target.mjs +0 -17
  206. package/esm2020/popover/popover-trigger.mjs +0 -471
  207. package/esm2020/popover/popover.mjs +0 -383
  208. package/esm2020/progress/progress-module.mjs +0 -18
  209. package/esm2020/progress/progress.mjs +0 -55
  210. package/esm2020/select/option.mjs +0 -57
  211. package/esm2020/select/select-module.mjs +0 -74
  212. package/esm2020/select/select.mjs +0 -560
  213. package/esm2020/select/templates.mjs +0 -124
  214. package/esm2020/slider/slider-module.mjs +0 -19
  215. package/esm2020/slider/slider.mjs +0 -1115
  216. package/esm2020/split/split-module.mjs +0 -19
  217. package/esm2020/split/split-pane.mjs +0 -149
  218. package/esm2020/split/split.mjs +0 -634
  219. package/esm2020/tooltip/tooltip-module.mjs +0 -24
  220. package/esm2020/tooltip/tooltip.mjs +0 -926
  221. package/fesm2015/mtxAlert.mjs +0 -74
  222. package/fesm2015/mtxAlert.mjs.map +0 -1
  223. package/fesm2015/mtxButton.mjs +0 -99
  224. package/fesm2015/mtxCheckboxGroup.mjs +0 -256
  225. package/fesm2015/mtxCheckboxGroup.mjs.map +0 -1
  226. package/fesm2015/mtxColorpicker.mjs +0 -767
  227. package/fesm2015/mtxColorpicker.mjs.map +0 -1
  228. package/fesm2015/mtxColumnResize.mjs +0 -959
  229. package/fesm2015/mtxCore.mjs +0 -374
  230. package/fesm2015/mtxCore.mjs.map +0 -1
  231. package/fesm2015/mtxDatetimepicker.mjs +0 -3164
  232. package/fesm2015/mtxDatetimepicker.mjs.map +0 -1
  233. package/fesm2015/mtxDialog.mjs +0 -130
  234. package/fesm2015/mtxDrawer.mjs +0 -578
  235. package/fesm2015/mtxDrawer.mjs.map +0 -1
  236. package/fesm2015/mtxGrid.mjs +0 -1514
  237. package/fesm2015/mtxGrid.mjs.map +0 -1
  238. package/fesm2015/mtxLoader.mjs +0 -93
  239. package/fesm2015/mtxLoader.mjs.map +0 -1
  240. package/fesm2015/mtxPopover.mjs +0 -1027
  241. package/fesm2015/mtxPopover.mjs.map +0 -1
  242. package/fesm2015/mtxProgress.mjs +0 -77
  243. package/fesm2015/mtxSelect.mjs +0 -814
  244. package/fesm2015/mtxSlider.mjs +0 -1139
  245. package/fesm2015/mtxSlider.mjs.map +0 -1
  246. package/fesm2015/mtxSplit.mjs +0 -1025
  247. package/fesm2015/mtxSplit.mjs.map +0 -1
  248. package/fesm2015/mtxTooltip.mjs +0 -982
  249. package/fesm2020/mtxButton.mjs.map +0 -1
  250. package/fesm2020/mtxColumnResize.mjs.map +0 -1
  251. package/fesm2020/mtxCore.mjs.map +0 -1
  252. package/fesm2020/mtxDatetimepicker.mjs.map +0 -1
  253. package/fesm2020/mtxDialog.mjs.map +0 -1
  254. package/fesm2020/mtxProgress.mjs.map +0 -1
  255. package/fesm2020/mtxSelect.mjs.map +0 -1
  256. package/fesm2020/mtxTooltip.mjs.map +0 -1
  257. package/fesm2020/ng-matero-extensions.mjs +0 -9
  258. package/fesm2020/ng-matero-extensions.mjs.map +0 -1
  259. /package/{esm2020 → esm2022}/alert/mtxAlert.mjs +0 -0
  260. /package/{esm2020 → esm2022}/alert/public-api.mjs +0 -0
  261. /package/{esm2020 → esm2022}/button/mtxButton.mjs +0 -0
  262. /package/{esm2020 → esm2022}/button/public-api.mjs +0 -0
  263. /package/{esm2020 → esm2022}/checkbox-group/interfaces.mjs +0 -0
  264. /package/{esm2020 → esm2022}/checkbox-group/mtxCheckboxGroup.mjs +0 -0
  265. /package/{esm2020 → esm2022}/checkbox-group/public-api.mjs +0 -0
  266. /package/{esm2020 → esm2022}/colorpicker/colorpicker-animations.mjs +0 -0
  267. /package/{esm2020 → esm2022}/colorpicker/mtxColorpicker.mjs +0 -0
  268. /package/{esm2020 → esm2022}/colorpicker/public-api.mjs +0 -0
  269. /package/{esm2020 → esm2022}/column-resize/column-resize-directives/constants.mjs +0 -0
  270. /package/{esm2020 → esm2022}/column-resize/mtxColumnResize.mjs +0 -0
  271. /package/{esm2020 → esm2022}/column-resize/polyfill.mjs +0 -0
  272. /package/{esm2020 → esm2022}/column-resize/public-api.mjs +0 -0
  273. /package/{esm2020 → esm2022}/column-resize/resize-ref.mjs +0 -0
  274. /package/{esm2020 → esm2022}/column-resize/selectors.mjs +0 -0
  275. /package/{esm2020 → esm2022}/core/datetime/datetime-formats.mjs +0 -0
  276. /package/{esm2020 → esm2022}/core/datetime/index.mjs +0 -0
  277. /package/{esm2020 → esm2022}/core/datetime/native-datetime-formats.mjs +0 -0
  278. /package/{esm2020 → esm2022}/core/mtxCore.mjs +0 -0
  279. /package/{esm2020 → esm2022}/core/pipes/index.mjs +0 -0
  280. /package/{esm2020 → esm2022}/core/public-api.mjs +0 -0
  281. /package/{esm2020 → esm2022}/datetimepicker/datetimepicker-animations.mjs +0 -0
  282. /package/{esm2020 → esm2022}/datetimepicker/datetimepicker-errors.mjs +0 -0
  283. /package/{esm2020 → esm2022}/datetimepicker/datetimepicker-filtertype.mjs +0 -0
  284. /package/{esm2020 → esm2022}/datetimepicker/datetimepicker-types.mjs +0 -0
  285. /package/{esm2020 → esm2022}/datetimepicker/mtxDatetimepicker.mjs +0 -0
  286. /package/{esm2020 → esm2022}/datetimepicker/public-api.mjs +0 -0
  287. /package/{esm2020 → esm2022}/dialog/dialog-config.mjs +0 -0
  288. /package/{esm2020 → esm2022}/dialog/mtxDialog.mjs +0 -0
  289. /package/{esm2020 → esm2022}/dialog/public-api.mjs +0 -0
  290. /package/{esm2020 → esm2022}/drawer/drawer-animation.mjs +0 -0
  291. /package/{esm2020 → esm2022}/drawer/drawer-config.mjs +0 -0
  292. /package/{esm2020 → esm2022}/drawer/drawer-ref.mjs +0 -0
  293. /package/{esm2020 → esm2022}/drawer/mtxDrawer.mjs +0 -0
  294. /package/{esm2020 → esm2022}/drawer/public-api.mjs +0 -0
  295. /package/{esm2020 → esm2022}/grid/column-resize/column-resize-directives/common.mjs +0 -0
  296. /package/{esm2020 → esm2022}/grid/column-resize/resizable-directives/common.mjs +0 -0
  297. /package/{esm2020 → esm2022}/grid/interfaces.mjs +0 -0
  298. /package/{esm2020 → esm2022}/grid/mtxGrid.mjs +0 -0
  299. /package/{esm2020 → esm2022}/grid/public-api.mjs +0 -0
  300. /package/{esm2020 → esm2022}/loader/mtxLoader.mjs +0 -0
  301. /package/{esm2020 → esm2022}/loader/public-api.mjs +0 -0
  302. /package/{esm2020 → esm2022}/ng-matero-extensions.mjs +0 -0
  303. /package/{esm2020 → esm2022}/popover/mtxPopover.mjs +0 -0
  304. /package/{esm2020 → esm2022}/popover/popover-animations.mjs +0 -0
  305. /package/{esm2020 → esm2022}/popover/popover-errors.mjs +0 -0
  306. /package/{esm2020 → esm2022}/popover/popover-interfaces.mjs +0 -0
  307. /package/{esm2020 → esm2022}/popover/popover-types.mjs +0 -0
  308. /package/{esm2020 → esm2022}/popover/public-api.mjs +0 -0
  309. /package/{esm2020 → esm2022}/progress/mtxProgress.mjs +0 -0
  310. /package/{esm2020 → esm2022}/progress/public-api.mjs +0 -0
  311. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  312. /package/{esm2020 → esm2022}/select/mtxSelect.mjs +0 -0
  313. /package/{esm2020 → esm2022}/select/public-api.mjs +0 -0
  314. /package/{esm2020 → esm2022}/slider/mtxSlider.mjs +0 -0
  315. /package/{esm2020 → esm2022}/slider/public-api.mjs +0 -0
  316. /package/{esm2020 → esm2022}/split/interfaces.mjs +0 -0
  317. /package/{esm2020 → esm2022}/split/mtxSplit.mjs +0 -0
  318. /package/{esm2020 → esm2022}/split/public-api.mjs +0 -0
  319. /package/{esm2020 → esm2022}/split/utils.mjs +0 -0
  320. /package/{esm2020 → esm2022}/tooltip/mtxTooltip.mjs +0 -0
  321. /package/{esm2020 → esm2022}/tooltip/public-api.mjs +0 -0
  322. /package/{esm2020 → esm2022}/tooltip/tooltip-animations.mjs +0 -0
  323. /package/{fesm2015 → fesm2022}/ng-matero-extensions.mjs +0 -0
  324. /package/{fesm2015 → fesm2022}/ng-matero-extensions.mjs.map +0 -0
@@ -1,628 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, ContentChildren, Directive, HostBinding, HostListener, InjectionToken, Optional, Inject, } from '@angular/core';
2
- import { trigger, state, style, transition, animate } from '@angular/animations';
3
- import { SelectionModel } from '@angular/cdk/collections';
4
- import { MatFooterRow, MatHeaderRowDef, MatRowDef, MatTable, MatTableDataSource, } from '@angular/material/table';
5
- import { MatPaginator } from '@angular/material/paginator';
6
- import { MatSort } from '@angular/material/sort';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "./grid-utils";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "@angular/material/table";
11
- import * as i4 from "@angular/material/sort";
12
- import * as i5 from "@angular/material/paginator";
13
- import * as i6 from "@angular/material/checkbox";
14
- import * as i7 from "@angular/material/button";
15
- import * as i8 from "@angular/material/progress-bar";
16
- import * as i9 from "./column-resize/column-resize-directives/column-resize";
17
- import * as i10 from "./column-resize/resizable-directives/resizable";
18
- import * as i11 from "./cell";
19
- import * as i12 from "./column-menu";
20
- import * as i13 from "./expansion-toggle";
21
- import * as i14 from "@ng-matero/extensions/core";
22
- import * as i15 from "./grid-pipes";
23
- /** Injection token that can be used to specify default grid options. */
24
- export const MTX_GRID_DEFAULT_OPTIONS = new InjectionToken('mtx-grid-default-options');
25
- export class MtxGrid {
26
- get _hasNoResult() {
27
- return (!this.data || this.data.length === 0) && !this.loading;
28
- }
29
- // TODO: Summary display conditions
30
- get _whetherShowSummary() {
31
- return this.showSummary;
32
- }
33
- constructor(_utils, _changeDetectorRef, _defaultOptions) {
34
- this._utils = _utils;
35
- this._changeDetectorRef = _changeDetectorRef;
36
- this._defaultOptions = _defaultOptions;
37
- this.dataSource = new MatTableDataSource();
38
- /** The grid's displayed columns. */
39
- this.displayedColumns = [];
40
- /** The grid's columns. */
41
- this.columns = [];
42
- /** The grid's data. */
43
- this.data = [];
44
- /** The total number of the data. */
45
- this.length = 0;
46
- /** Whether the grid is loading. */
47
- this.loading = false;
48
- /** Whether the column is resizable. */
49
- this.columnResizable = this._defaultOptions?.columnResizable ?? false;
50
- /** Placeholder for the empty value (`null`, `''`, `[]`). */
51
- this.emptyValuePlaceholder = this._defaultOptions?.emptyValuePlaceholder ?? '--';
52
- // ===== Page =====
53
- /** Whether to paginate the data on front end. */
54
- this.pageOnFront = this._defaultOptions?.pageOnFront ?? true;
55
- /** Whether to show the paginator. */
56
- this.showPaginator = this._defaultOptions?.showPaginator ?? true;
57
- /** Whether the paginator is disabled. */
58
- this.pageDisabled = this._defaultOptions?.pageDisabled ?? false;
59
- /** Whether to show the first/last buttons UI to the user. */
60
- this.showFirstLastButtons = this._defaultOptions?.showFirstLastButtons ?? true;
61
- /** The zero-based page index of the displayed list of items. */
62
- this.pageIndex = this._defaultOptions?.pageIndex ?? 0;
63
- /** Number of items to display on a page. */
64
- this.pageSize = this._defaultOptions?.pageSize ?? 10;
65
- /** The set of provided page size options to display to the user. */
66
- this.pageSizeOptions = this._defaultOptions?.pageSizeOptions ?? [10, 50, 100];
67
- /** Whether to hide the page size selection UI from the user. */
68
- this.hidePageSize = this._defaultOptions?.hidePageSize ?? false;
69
- /** Event emitted when the paginator changes the page size or page index. */
70
- this.page = new EventEmitter();
71
- // ===== Sort =====
72
- /** Whether to sort the data on front end. */
73
- this.sortOnFront = this._defaultOptions?.sortOnFront ?? true;
74
- /** The id of the most recently sorted MatSortable. */
75
- this.sortActive = this._defaultOptions?.sortActive ?? '';
76
- /** The sort direction of the currently active MatSortable. */
77
- this.sortDirection = this._defaultOptions?.sortDirection ?? '';
78
- /**
79
- * Whether to disable the user from clearing the sort by finishing the sort direction cycle.
80
- * May be overriden by the column's `disableClear` in `sortProp`.
81
- */
82
- this.sortDisableClear = this._defaultOptions?.sortDisableClear ?? false;
83
- /** Whether the sort is disabled. */
84
- this.sortDisabled = this._defaultOptions?.sortDisabled ?? false;
85
- /**
86
- * The direction to set when an MatSortable is initially sorted.
87
- * May be overriden by the column's `start` in `sortProp`.
88
- */
89
- this.sortStart = this._defaultOptions?.sortStart ?? 'asc';
90
- /** Event emitted when the user changes either the active sort or sort direction. */
91
- this.sortChange = new EventEmitter();
92
- // ===== Row =====
93
- /** Whether to use the row hover style. */
94
- this.rowHover = this._defaultOptions?.rowHover ?? false;
95
- /** Whether to use the row striped style. */
96
- this.rowStriped = this._defaultOptions?.rowStriped ?? false;
97
- /** Event emitted when the user clicks the row. */
98
- this.rowClick = new EventEmitter();
99
- // ===== Expandable Row =====
100
- this.expansionRowStates = [];
101
- /** Whether the row is expandable. */
102
- this.expandable = false;
103
- /** Event emitted when the user toggles the expandable row. */
104
- this.expansionChange = new EventEmitter();
105
- // ===== Row Selection =====
106
- this.rowSelection = new SelectionModel(true, []);
107
- /** Whether to support multiple row/cell selection. */
108
- this.multiSelectable = this._defaultOptions?.multiSelectable ?? true;
109
- /** Whether the user can select multiple rows with click. */
110
- this.multiSelectionWithClick = this._defaultOptions?.multiSelectionWithClick ?? false;
111
- /** The selected row items. */
112
- this.rowSelected = [];
113
- /** Whether the row is selectable. */
114
- this.rowSelectable = this._defaultOptions?.rowSelectable ?? false;
115
- /** Whether to hide the row selection checkbox. */
116
- this.hideRowSelectionCheckbox = this._defaultOptions?.hideRowSelectionCheckbox ?? false;
117
- /** Whether disable rows to be selected when clicked. */
118
- this.disableRowClickSelection = this._defaultOptions?.disableRowClickSelection ?? false;
119
- /** The formatter to disable the row selection or hide the row's checkbox. */
120
- this.rowSelectionFormatter = {};
121
- /** Event emitted when the row is selected. */
122
- this.rowSelectionChange = new EventEmitter();
123
- // ===== Cell Selection =====
124
- this.cellSelection = [];
125
- /** Whether the cell is selectable. */
126
- this.cellSelectable = this._defaultOptions?.cellSelectable ?? true;
127
- /** Event emitted when the cell is selected. */
128
- this.cellSelectionChange = new EventEmitter();
129
- // ===== Toolbar =====
130
- /** Whether to show the toolbar. */
131
- this.showToolbar = this._defaultOptions?.showToolbar ?? false;
132
- /** The text of the toolbar's title. */
133
- this.toolbarTitle = this._defaultOptions?.toolbarTitle ?? '';
134
- // ===== Column Menu =====
135
- /** Whether the column is hideable. */
136
- this.columnHideable = this._defaultOptions?.columnHideable ?? true;
137
- /** Hide or show when the column's checkbox is checked. */
138
- this.columnHideableChecked = this._defaultOptions?.columnHideableChecked ?? 'show';
139
- /** Whether the column is sortable. */
140
- this.columnSortable = this._defaultOptions?.columnSortable ?? true;
141
- /** Whether the column is pinnable. */
142
- this.columnPinnable = this._defaultOptions?.columnPinnable ?? true;
143
- /** Event emitted when the column is hided or is sorted. */
144
- this.columnChange = new EventEmitter();
145
- /** The options for the column pin list. */
146
- this.columnPinOptions = this._defaultOptions?.columnPinOptions ?? [];
147
- /** Whether to show the column menu button. */
148
- this.showColumnMenuButton = this._defaultOptions?.showColumnMenuButton ?? true;
149
- /** The text for the column menu button. */
150
- this.columnMenuButtonText = this._defaultOptions?.columnMenuButtonText ?? '';
151
- /** The type for the column menu button. */
152
- this.columnMenuButtonType = this._defaultOptions?.columnMenuButtonType ?? 'stroked';
153
- /** The color for the column menu button. */
154
- this.columnMenuButtonColor = this._defaultOptions?.columnMenuButtonColor;
155
- /** The class for the column menu button. */
156
- this.columnMenuButtonClass = this._defaultOptions?.columnMenuButtonClass ?? '';
157
- /** The icon for the column menu button. */
158
- this.columnMenuButtonIcon = this._defaultOptions?.columnMenuButtonIcon ?? '';
159
- /** Whether to show the column-menu's header. */
160
- this.showColumnMenuHeader = this._defaultOptions?.showColumnMenuHeader ?? false;
161
- /** The text for the column-menu's header. */
162
- this.columnMenuHeaderText = this._defaultOptions?.columnMenuHeaderText ?? 'Columns Header';
163
- /** Whether to show the the column-menu's footer. */
164
- this.showColumnMenuFooter = this._defaultOptions?.showColumnMenuFooter ?? false;
165
- /** The text for the column-menu's footer. */
166
- this.columnMenuFooterText = this._defaultOptions?.columnMenuFooterText ?? 'Columns Footer';
167
- // ===== No Result =====
168
- /** The displayed text for the empty data. */
169
- this.noResultText = this._defaultOptions?.noResultText ?? 'No records found';
170
- // ===== Row Templates =====
171
- /** Whether to use custom row template. If true, you should define a matRowDef. */
172
- this.useContentRowTemplate = false;
173
- // TODO: It can't use together with `useContentRowTemplate`
174
- this.useContentHeaderRowTemplate = false;
175
- // TODO: It's not working
176
- this.useContentFooterRowTemplate = false;
177
- // ===== Summary =====
178
- /** Whether to show the summary. */
179
- this.showSummary = false;
180
- // ===== Side Bar =====
181
- /** Whether to show the sidebar. */
182
- this.showSidebar = false;
183
- // ===== Status Bar =====
184
- /** Whether to show the status bar. */
185
- this.showStatusbar = false;
186
- }
187
- detectChanges() {
188
- this._changeDetectorRef.detectChanges();
189
- }
190
- _getColData(data, colDef) {
191
- return this._utils.getColData(data, colDef);
192
- }
193
- // Waiting for async data
194
- ngOnChanges(changes) {
195
- this._countPinnedPosition();
196
- this.displayedColumns = this.columns.filter(item => !item.hide).map(item => item.field);
197
- if (this.showColumnMenuButton) {
198
- this.columns.forEach(item => {
199
- if (this.columnHideableChecked === 'show') {
200
- item.show = !item.hide;
201
- }
202
- else {
203
- item.hide = !!item.hide;
204
- }
205
- });
206
- }
207
- if (this.rowSelectable && !this.hideRowSelectionCheckbox) {
208
- this.displayedColumns.unshift('MtxGridCheckboxColumnDef');
209
- }
210
- // We should copy each item of data for expansion data
211
- if (this.expandable) {
212
- this.expansionRowStates = []; // reset
213
- this.data?.forEach(_ => {
214
- this.expansionRowStates.push({ expanded: false });
215
- });
216
- }
217
- if (this.rowSelectable) {
218
- this.rowSelection = new SelectionModel(this.multiSelectable, this.rowSelected);
219
- }
220
- this.dataSource = new MatTableDataSource(this.data);
221
- this.dataSource.paginator = this.pageOnFront ? this.paginator : null;
222
- this.dataSource.sort = this.sortOnFront ? this.sort : null;
223
- // Only scroll top with data change
224
- if (changes.data) {
225
- this.scrollTop(0);
226
- }
227
- }
228
- ngAfterViewInit() {
229
- if (this.pageOnFront) {
230
- this.dataSource.paginator = this.paginator;
231
- }
232
- if (this.sortOnFront) {
233
- this.dataSource.sort = this.sort;
234
- }
235
- if (this.rowDefs?.length > 0 && this.useContentRowTemplate) {
236
- this.rowDefs.forEach(rowDef => this.table.addRowDef(rowDef));
237
- }
238
- if (this.headerRowDefs?.length > 0 && this.useContentHeaderRowTemplate) {
239
- this.headerRowDefs.forEach(headerRowDef => this.table.addHeaderRowDef(headerRowDef));
240
- }
241
- if (this.footerRowDefs?.length > 0 && this.useContentFooterRowTemplate) {
242
- this.footerRowDefs.forEach(footerRowDef => this.table.addFooterRowDef(footerRowDef));
243
- }
244
- }
245
- ngOnDestroy() { }
246
- _countPinnedPosition() {
247
- const count = (acc, cur) => acc + parseFloat(cur.width || '80px');
248
- const pinnedLeftCols = this.columns.filter(col => col.pinned && col.pinned === 'left');
249
- pinnedLeftCols.forEach((item, idx) => {
250
- item.left = pinnedLeftCols.slice(0, idx).reduce(count, 0) + 'px';
251
- });
252
- const pinnedRightCols = this.columns
253
- .filter(col => col.pinned && col.pinned === 'right')
254
- .reverse();
255
- pinnedRightCols.forEach((item, idx) => {
256
- item.right = pinnedRightCols.slice(0, idx).reduce(count, 0) + 'px';
257
- });
258
- }
259
- _getIndex(index, dataIndex) {
260
- return typeof index === 'undefined' ? dataIndex : index;
261
- }
262
- _onSortChange(sort) {
263
- this.sortChange.emit(sort);
264
- }
265
- _onRowDataChange(record) {
266
- this.rowChangeRecord = record;
267
- this._changeDetectorRef.markForCheck();
268
- }
269
- /** Expansion change event */
270
- _onExpansionChange(expansionRef, rowData, column, index) {
271
- this.expansionChange.emit({ expanded: expansionRef.expanded, data: rowData, index, column });
272
- }
273
- /** Cell select event */
274
- _selectCell(cellRef, rowData, colDef) {
275
- // If not the same cell
276
- if (this._selectedCell !== cellRef) {
277
- const colValue = this._utils.getCellValue(rowData, colDef);
278
- this.cellSelection = []; // reset
279
- this.cellSelection.push({ cellData: colValue, rowData, colDef });
280
- this.cellSelectionChange.emit(this.cellSelection);
281
- if (this._selectedCell) {
282
- this._selectedCell.deselect(); // the selectedCell will be undefined
283
- }
284
- }
285
- this._selectedCell = cellRef.selected ? cellRef : undefined;
286
- }
287
- /** Row select event */
288
- _selectRow(event, rowData, index) {
289
- if (this.rowSelectable &&
290
- !this.rowSelectionFormatter.disabled?.(rowData, index) &&
291
- !this.rowSelectionFormatter.hideCheckbox?.(rowData, index) &&
292
- !this.disableRowClickSelection) {
293
- // metaKey -> command key
294
- if (!this.multiSelectionWithClick && !event.ctrlKey && !event.metaKey) {
295
- this.rowSelection.clear();
296
- }
297
- this._toggleNormalCheckbox(rowData);
298
- }
299
- this.rowClick.emit({ rowData, index });
300
- }
301
- /** Whether the number of selected elements matches the total number of rows. */
302
- _isAllSelected() {
303
- const numSelected = this.rowSelection.selected.length;
304
- const numRows = this.dataSource.data.filter((row, index) => !this.rowSelectionFormatter.disabled?.(row, index)).length;
305
- return numSelected === numRows;
306
- }
307
- /** Select all rows if they are not all selected; otherwise clear selection. */
308
- _toggleMasterCheckbox() {
309
- this._isAllSelected()
310
- ? this.rowSelection.clear()
311
- : this.dataSource.data.forEach((row, index) => {
312
- if (!this.rowSelectionFormatter.disabled?.(row, index)) {
313
- this.rowSelection.select(row);
314
- }
315
- });
316
- this.rowSelectionChange.emit(this.rowSelection.selected);
317
- }
318
- /** Select normal row */
319
- _toggleNormalCheckbox(row) {
320
- this.rowSelection.toggle(row);
321
- this.rowSelectionChange.emit(this.rowSelection.selected);
322
- }
323
- /** Column change event */
324
- _onColumnChange(columns) {
325
- this.columnChange.emit(columns);
326
- this.displayedColumns = Object.assign([], this.getDisplayedColumnFields(columns));
327
- if (this.rowSelectable && !this.hideRowSelectionCheckbox) {
328
- this.displayedColumns.unshift('MtxGridCheckboxColumnDef');
329
- }
330
- }
331
- getDisplayedColumnFields(columns) {
332
- const fields = columns
333
- .filter(item => (this.columnHideableChecked === 'show' ? item.show : !item.hide))
334
- .map(item => item.field);
335
- return fields;
336
- }
337
- /** Customize expansion event */
338
- toggleExpansion(index) {
339
- if (!this.expandable) {
340
- throw new Error('The `expandable` should be set true.');
341
- }
342
- this.expansionRowStates[index].expanded = !this.expansionRowStates[index].expanded;
343
- return this.expansionRowStates[index].expanded;
344
- }
345
- /** Scroll to top when turn to the next page. */
346
- _onPage(e) {
347
- if (this.pageOnFront) {
348
- this.scrollTop(0);
349
- }
350
- this.page.emit(e);
351
- }
352
- scrollTop(value) {
353
- if (value == null) {
354
- return this.tableContainer?.nativeElement.scrollTop;
355
- }
356
- if (this.tableContainer && !this.loading) {
357
- this.tableContainer.nativeElement.scrollTop = value;
358
- }
359
- }
360
- scrollLeft(value) {
361
- if (value == null) {
362
- return this.tableContainer?.nativeElement.scrollLeft;
363
- }
364
- if (this.tableContainer && !this.loading) {
365
- this.tableContainer.nativeElement.scrollLeft = value;
366
- }
367
- }
368
- }
369
- /** @nocollapse */ MtxGrid.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MtxGrid, deps: [{ token: i1.MtxGridUtils }, { token: i0.ChangeDetectorRef }, { token: MTX_GRID_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
370
- /** @nocollapse */ MtxGrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: MtxGrid, selector: "mtx-grid", inputs: { displayedColumns: "displayedColumns", columns: "columns", data: "data", length: "length", loading: "loading", trackBy: "trackBy", columnResizable: "columnResizable", emptyValuePlaceholder: "emptyValuePlaceholder", pageOnFront: "pageOnFront", showPaginator: "showPaginator", pageDisabled: "pageDisabled", showFirstLastButtons: "showFirstLastButtons", pageIndex: "pageIndex", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hidePageSize: "hidePageSize", paginationTemplate: "paginationTemplate", sortOnFront: "sortOnFront", sortActive: "sortActive", sortDirection: "sortDirection", sortDisableClear: "sortDisableClear", sortDisabled: "sortDisabled", sortStart: "sortStart", rowHover: "rowHover", rowStriped: "rowStriped", expandable: "expandable", expansionTemplate: "expansionTemplate", multiSelectable: "multiSelectable", multiSelectionWithClick: "multiSelectionWithClick", rowSelected: "rowSelected", rowSelectable: "rowSelectable", hideRowSelectionCheckbox: "hideRowSelectionCheckbox", disableRowClickSelection: "disableRowClickSelection", rowSelectionFormatter: "rowSelectionFormatter", rowClassFormatter: "rowClassFormatter", cellSelectable: "cellSelectable", showToolbar: "showToolbar", toolbarTitle: "toolbarTitle", toolbarTemplate: "toolbarTemplate", columnHideable: "columnHideable", columnHideableChecked: "columnHideableChecked", columnSortable: "columnSortable", columnPinnable: "columnPinnable", columnPinOptions: "columnPinOptions", showColumnMenuButton: "showColumnMenuButton", columnMenuButtonText: "columnMenuButtonText", columnMenuButtonType: "columnMenuButtonType", columnMenuButtonColor: "columnMenuButtonColor", columnMenuButtonClass: "columnMenuButtonClass", columnMenuButtonIcon: "columnMenuButtonIcon", showColumnMenuHeader: "showColumnMenuHeader", columnMenuHeaderText: "columnMenuHeaderText", columnMenuHeaderTemplate: "columnMenuHeaderTemplate", showColumnMenuFooter: "showColumnMenuFooter", columnMenuFooterText: "columnMenuFooterText", columnMenuFooterTemplate: "columnMenuFooterTemplate", noResultText: "noResultText", noResultTemplate: "noResultTemplate", headerTemplate: "headerTemplate", headerExtraTemplate: "headerExtraTemplate", cellTemplate: "cellTemplate", useContentRowTemplate: "useContentRowTemplate", useContentHeaderRowTemplate: "useContentHeaderRowTemplate", useContentFooterRowTemplate: "useContentFooterRowTemplate", showSummary: "showSummary", summaryTemplate: "summaryTemplate", showSidebar: "showSidebar", sidebarTemplate: "sidebarTemplate", showStatusbar: "showStatusbar", statusbarTemplate: "statusbarTemplate" }, outputs: { page: "page", sortChange: "sortChange", rowClick: "rowClick", expansionChange: "expansionChange", rowSelectionChange: "rowSelectionChange", cellSelectionChange: "cellSelectionChange", columnChange: "columnChange" }, host: { classAttribute: "mtx-grid" }, queries: [{ propertyName: "rowDefs", predicate: MatRowDef }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "footerRowDefs", predicate: MatFooterRow }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "columnMenu", first: true, predicate: ["columnMenu"], descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], exportAs: ["mtxGrid"], usesOnChanges: true, ngImport: i0, template: "<!-- Progress bar-->\r\n<div class=\"mtx-grid-progress\" *ngIf=\"loading\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- Toolbar -->\r\n<div class=\"mtx-grid-toolbar\" *ngIf=\"showToolbar\">\r\n <div class=\"mtx-grid-toolbar-content\">\r\n <ng-template [ngIf]=\"toolbarTemplate\" [ngIfElse]=\"defaultToolbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultToolbarTemplate>\r\n <div class=\"mtx-grid-toolbar-title\" *ngIf=\"toolbarTitle\">{{toolbarTitle}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"mtx-grid-toolbar-actions\">\r\n <mtx-grid-column-menu *ngIf=\"showColumnMenuButton\" #columnMenu\r\n [columns]=\"columns\"\r\n [buttonText]=\"columnMenuButtonText\"\r\n [buttonType]=\"columnMenuButtonType\"\r\n [buttonColor]=\"columnMenuButtonColor\"\r\n [buttonClass]=\"columnMenuButtonClass\"\r\n [buttonIcon]=\"columnMenuButtonIcon\"\r\n [selectable]=\"columnHideable\"\r\n [selectableChecked]=\"columnHideableChecked\"\r\n [sortable]=\"columnSortable\"\r\n [pinnable]=\"columnPinnable\"\r\n [showHeader]=\"showColumnMenuHeader\"\r\n [headerText]=\"columnMenuHeaderText\"\r\n [headerTemplate]=\"columnMenuHeaderTemplate\"\r\n [showFooter]=\"showColumnMenuFooter\"\r\n [footerText]=\"columnMenuFooterText\"\r\n [footerTemplate]=\"columnMenuFooterTemplate\"\r\n [pinOptions]=\"columnPinOptions\"\r\n (columnChange)=\"_onColumnChange($event)\">\r\n </mtx-grid-column-menu>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-main mtx-grid-layout\">\r\n <!-- Table content -->\r\n <div class=\"mtx-grid-content mtx-grid-layout\">\r\n <div #tableContainer class=\"mat-table-container\"\r\n [ngClass]=\"{'mat-table-with-data': !_hasNoResult}\">\r\n <table mat-table *ngIf=\"!columnResizable\"\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n\r\n <!-- TODO: Use flexbox-based mat-table -->\r\n <table mat-table *ngIf=\"columnResizable\"\r\n columnResize\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n [resizable]=\"col.resizable\"\r\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n <!-- No result -->\r\n <div class=\"mtx-grid-no-result\" *ngIf=\"_hasNoResult\">\r\n <ng-template [ngIf]=\"noResultTemplate\" [ngIfElse]=\"defaultNoResultTpl\">\r\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultNoResultTpl>{{noResultText}}</ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tool sidebar -->\r\n <div class=\"mtx-grid-sidebar\" *ngIf=\"showSidebar\">\r\n <ng-template [ngIf]=\"sidebarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-footer\">\r\n <!-- Status Bar -->\r\n <div class=\"mtx-grid-statusbar\" *ngIf=\"showStatusbar\">\r\n <ng-template [ngIf]=\"statusbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Pagination -->\r\n <div class=\"mtx-grid-pagination\">\r\n <ng-template [ngIf]=\"paginationTemplate\" [ngIfElse]=\"defaultPaginationTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultPaginationTemplate>\r\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\r\n [showFirstLastButtons]=\"showFirstLastButtons\"\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [hidePageSize]=\"hidePageSize\"\r\n (page)=\"_onPage($event)\"\r\n [disabled]=\"pageDisabled\">\r\n </mat-paginator>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<!-- Header template for extra content -->\r\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\r\n <ng-template [ngIf]=\"headerExtraTemplate | isTemplateRef\" [ngIfElse]=\"headerExtraTpl\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerExtraTpl>\r\n <ng-template [ngIf]=\"$any(headerExtraTemplate)?.[col.field] | isTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n</ng-template>\r\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:80px}.mtx-grid .mat-table-sticky-left{border-right-width:1px;border-right-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left-width:1px;border-left-style:solid}.mtx-grid .mat-table-sticky-right{border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid .mat-mdc-header-cell,.mtx-grid .mat-mdc-footer-cell,.mtx-grid .mat-mdc-cell{padding:4px 10px;box-sizing:border-box}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:24px}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:10px;padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}.mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:10px}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-mdc-row:last-of-type .mat-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin:0 4px}.mtx-grid .mat-header-cell-inner{display:flex;align-items:center}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:48px;padding:8px;box-sizing:border-box}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:56px;padding:8px}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;width:40px;height:40px;vertical-align:middle}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:48px;overflow:hidden}.mtx-grid-checkbox-cell{flex:none;justify-content:center;width:60px;min-width:60px}.mtx-grid-checkbox-cell .mat-checkbox{display:flex;margin:0 10px}.mtx-grid-checkbox-cell .mat-checkbox-inner-container{margin-left:0}.mtx-grid-row-expand-button.mat-mdc-icon-button{width:40px;height:40px;padding:8px;vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button+mtx-grid-cell{vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button .mat-mdc-button-touch-target{width:100%;height:100%}.mtx-grid-icon{width:20px;height:20px;font-size:20px}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i2.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatTable; }), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderCellDef; }), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderRowDef; }), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatColumnDef; }), selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatCellDef; }), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatRowDef; }), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterCellDef; }), selector: "[matFooterCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterRowDef; }), selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatHeaderCell; }), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatCell; }), selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i3.MatFooterCell; }), selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i0.forwardRef(function () { return i3.MatHeaderRow; }), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatRow; }), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatFooterRow; }), selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.MatSort; }), selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(function () { return i4.MatSortHeader; }), selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i0.forwardRef(function () { return i5.MatPaginator; }), selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i0.forwardRef(function () { return i6.MatCheckbox; }), selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i0.forwardRef(function () { return i7.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return i8.MatProgressBar; }), selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i0.forwardRef(function () { return i9.MatColumnResize; }), selector: "table[mat-table][columnResize]" }, { kind: "directive", type: i0.forwardRef(function () { return i10.MatResizable; }), selector: "mat-header-cell[resizable], th[mat-header-cell][resizable]", inputs: ["matResizableMinWidthPx", "matResizableMaxWidthPx", "resizable"] }, { kind: "component", type: i0.forwardRef(function () { return i11.MtxGridCell; }), selector: "mtx-grid-cell", inputs: ["rowData", "colDef", "data", "summary", "placeholder"], outputs: ["rowDataChange"], exportAs: ["mtxGridCell"] }, { kind: "component", type: i0.forwardRef(function () { return i12.MtxGridColumnMenu; }), selector: "mtx-grid-column-menu", inputs: ["columns", "selectable", "selectableChecked", "sortable", "pinnable", "buttonText", "buttonType", "buttonColor", "buttonClass", "buttonIcon", "showHeader", "headerText", "headerTemplate", "showFooter", "footerText", "footerTemplate", "pinOptions"], outputs: ["columnChange"], exportAs: ["mtxGridColumnMenu"] }, { kind: "directive", type: i0.forwardRef(function () { return i13.MtxGridExpansionToggle; }), selector: "[mtx-grid-expansion-toggle]", inputs: ["opened", "expandableRow", "expansionRowTpl"], outputs: ["openedChange", "toggleChange"] }, { kind: "directive", type: i0.forwardRef(function () { return MtxGridSelectableCell; }), selector: "[mtx-grid-selectable-cell]", inputs: ["mtxSelectableRowData"], outputs: ["cellSelectionChange"] }, { kind: "pipe", type: i0.forwardRef(function () { return i2.AsyncPipe; }), name: "async" }, { kind: "pipe", type: i0.forwardRef(function () { return i14.MtxToObservablePipe; }), name: "toObservable" }, { kind: "pipe", type: i0.forwardRef(function () { return i14.MtxIsTemplateRefPipe; }), name: "isTemplateRef" }, { kind: "pipe", type: i0.forwardRef(function () { return i15.MtxGridRowClassPipe; }), name: "rowClass" }, { kind: "pipe", type: i0.forwardRef(function () { return i15.MtxGridColClassPipe; }), name: "colClass" }], animations: [
371
- trigger('expansion', [
372
- state('collapsed, void', style({ height: '0', minHeight: '0', visibility: 'hidden' })),
373
- state('expanded', style({ height: '*', visibility: 'visible' })),
374
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
375
- transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
376
- ]),
377
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
378
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MtxGrid, decorators: [{
379
- type: Component,
380
- args: [{ selector: 'mtx-grid', exportAs: 'mtxGrid', host: {
381
- class: 'mtx-grid',
382
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [
383
- trigger('expansion', [
384
- state('collapsed, void', style({ height: '0', minHeight: '0', visibility: 'hidden' })),
385
- state('expanded', style({ height: '*', visibility: 'visible' })),
386
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
387
- transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
388
- ]),
389
- ], template: "<!-- Progress bar-->\r\n<div class=\"mtx-grid-progress\" *ngIf=\"loading\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- Toolbar -->\r\n<div class=\"mtx-grid-toolbar\" *ngIf=\"showToolbar\">\r\n <div class=\"mtx-grid-toolbar-content\">\r\n <ng-template [ngIf]=\"toolbarTemplate\" [ngIfElse]=\"defaultToolbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultToolbarTemplate>\r\n <div class=\"mtx-grid-toolbar-title\" *ngIf=\"toolbarTitle\">{{toolbarTitle}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"mtx-grid-toolbar-actions\">\r\n <mtx-grid-column-menu *ngIf=\"showColumnMenuButton\" #columnMenu\r\n [columns]=\"columns\"\r\n [buttonText]=\"columnMenuButtonText\"\r\n [buttonType]=\"columnMenuButtonType\"\r\n [buttonColor]=\"columnMenuButtonColor\"\r\n [buttonClass]=\"columnMenuButtonClass\"\r\n [buttonIcon]=\"columnMenuButtonIcon\"\r\n [selectable]=\"columnHideable\"\r\n [selectableChecked]=\"columnHideableChecked\"\r\n [sortable]=\"columnSortable\"\r\n [pinnable]=\"columnPinnable\"\r\n [showHeader]=\"showColumnMenuHeader\"\r\n [headerText]=\"columnMenuHeaderText\"\r\n [headerTemplate]=\"columnMenuHeaderTemplate\"\r\n [showFooter]=\"showColumnMenuFooter\"\r\n [footerText]=\"columnMenuFooterText\"\r\n [footerTemplate]=\"columnMenuFooterTemplate\"\r\n [pinOptions]=\"columnPinOptions\"\r\n (columnChange)=\"_onColumnChange($event)\">\r\n </mtx-grid-column-menu>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-main mtx-grid-layout\">\r\n <!-- Table content -->\r\n <div class=\"mtx-grid-content mtx-grid-layout\">\r\n <div #tableContainer class=\"mat-table-container\"\r\n [ngClass]=\"{'mat-table-with-data': !_hasNoResult}\">\r\n <table mat-table *ngIf=\"!columnResizable\"\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n\r\n <!-- TODO: Use flexbox-based mat-table -->\r\n <table mat-table *ngIf=\"columnResizable\"\r\n columnResize\r\n [ngClass]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\r\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\r\n matSort\r\n [matSortActive]=\"sortActive\"\r\n [matSortDirection]=\"sortDirection\"\r\n [matSortDisableClear]=\"sortDisableClear\"\r\n [matSortDisabled]=\"sortDisabled\"\r\n [matSortStart]=\"sortStart\"\r\n (matSortChange)=\"_onSortChange($event)\"\r\n [trackBy]=\"trackBy\">\r\n\r\n <ng-container *ngIf=\"rowSelectable && !hideRowSelectionCheckbox\"\r\n matColumnDef=\"MtxGridCheckboxColumnDef\">\r\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"multiSelectable\"\r\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\r\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\r\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n class=\"mtx-grid-checkbox-cell\">\r\n <mat-checkbox *ngIf=\"!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))\"\r\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\r\n [checked]=\"rowSelection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let col of columns;\">\r\n <ng-container [matColumnDef]=\"col.field\"\r\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\r\n <th mat-header-cell *matHeaderCellDef\r\n [class]=\"col | colClass\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n [resizable]=\"col.resizable\"\r\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\r\n <div class=\"mat-header-cell-inner\">\r\n <ng-template [ngIf]=\"headerTemplate | isTemplateRef\" [ngIfElse]=\"headerTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerTpl>\r\n <ng-template [ngIf]=\"$any(headerTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultHeaderTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultHeaderTpl>\r\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\r\n [disabled]=\"!col.sortable\"\r\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\r\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\r\n [start]=\"col.sortProp?.start!\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n <span>{{col.header | toObservable | async}}</span>\r\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" *ngIf=\"col.sortable\"\r\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\"\r\n focusable=\"false\">\r\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\"></path>\r\n </svg>\r\n </div>\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\r\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\r\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\r\n mtx-grid-selectable-cell (cellSelectionChange)=\"_selectCell($event, row, col)\">\r\n <ng-template [ngIf]=\"cellTemplate | isTemplateRef\" [ngIfElse]=\"cellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #cellTpl>\r\n <ng-template [ngIf]=\"$any(cellTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"colDefCellTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #colDefCellTpl>\r\n <ng-template [ngIf]=\"col.cellTemplate\" [ngIfElse]=\"defaultCellTpl\"\r\n [ngTemplateOutlet]=\"col.cellTemplate!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultCellTpl>\r\n <button class=\"mtx-grid-row-expand-button\" *ngIf=\"col.showExpand\"\r\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\r\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\r\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\r\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\r\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\r\n (rowDataChange)=\"_onRowDataChange($event)\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef\r\n [ngClass]=\"{'mat-table-sticky-left': col.pinned === 'left', 'mat-table-sticky-right': col.pinned === 'right'}\"\r\n [ngStyle]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\r\n <span class=\"mtx-grid-expansion-placeholder\" *ngIf=\"col.showExpand\"></span>\r\n\r\n <ng-template [ngIf]=\"summaryTemplate | isTemplateRef\" [ngIfElse]=\"summaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #summaryTpl>\r\n <ng-template [ngIf]=\"$any(summaryTemplate)?.[col.field] | isTemplateRef\"\r\n [ngIfElse]=\"defaultSummaryTpl\">\r\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #defaultSummaryTpl>\r\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\r\n [placeholder]=\"emptyValuePlaceholder\">\r\n </mtx-grid-cell>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template [ngIf]=\"useContentHeaderRowTemplate\" [ngIfElse]=\"defaultHeaderRowTpl\">\r\n </ng-template>\r\n <ng-template #defaultHeaderRowTpl>\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"useContentRowTemplate\" [ngIfElse]=\"defaultRowTpl\"></ng-template>\r\n <ng-template #defaultRowTpl>\r\n <tr mat-row\r\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\r\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\r\n [ngClass]=\"{'selected': rowSelection.isSelected(row)}\"\r\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\">\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template [ngIf]=\"_whetherShowSummary\">\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n </ng-template>\r\n <ng-template [ngIf]=\"useContentFooterRowTemplate\"></ng-template>\r\n\r\n <ng-container *ngIf=\"expandable\">\r\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\r\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\r\n [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"mtx-grid-expansion-detail\"\r\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\r\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-row\r\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\r\n [ngClass]=\"['mtx-grid-expansion', expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed']\">\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n <!-- No result -->\r\n <div class=\"mtx-grid-no-result\" *ngIf=\"_hasNoResult\">\r\n <ng-template [ngIf]=\"noResultTemplate\" [ngIfElse]=\"defaultNoResultTpl\">\r\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultNoResultTpl>{{noResultText}}</ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tool sidebar -->\r\n <div class=\"mtx-grid-sidebar\" *ngIf=\"showSidebar\">\r\n <ng-template [ngIf]=\"sidebarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<div class=\"mtx-grid-footer\">\r\n <!-- Status Bar -->\r\n <div class=\"mtx-grid-statusbar\" *ngIf=\"showStatusbar\">\r\n <ng-template [ngIf]=\"statusbarTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Pagination -->\r\n <div class=\"mtx-grid-pagination\">\r\n <ng-template [ngIf]=\"paginationTemplate\" [ngIfElse]=\"defaultPaginationTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\r\n </ng-template>\r\n <ng-template #defaultPaginationTemplate>\r\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\r\n [showFirstLastButtons]=\"showFirstLastButtons\"\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [hidePageSize]=\"hidePageSize\"\r\n (page)=\"_onPage($event)\"\r\n [disabled]=\"pageDisabled\">\r\n </mat-paginator>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<!-- Header template for extra content -->\r\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\r\n <ng-template [ngIf]=\"headerExtraTemplate | isTemplateRef\" [ngIfElse]=\"headerExtraTpl\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #headerExtraTpl>\r\n <ng-template [ngIf]=\"$any(headerExtraTemplate)?.[col.field] | isTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n</ng-template>\r\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:80px}.mtx-grid .mat-table-sticky-left{border-right-width:1px;border-right-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left-width:1px;border-left-style:solid}.mtx-grid .mat-table-sticky-right{border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid .mat-mdc-header-cell,.mtx-grid .mat-mdc-footer-cell,.mtx-grid .mat-mdc-cell{padding:4px 10px;box-sizing:border-box}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:24px}.mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,.mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type){padding-left:10px;padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-footer-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell,[dir=rtl] .mtx-grid .mat-mdc-cell:first-of-type:not(:only-of-type).mtx-grid-checkbox-cell{padding-left:10px;padding-right:10px}.mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),.mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-right:24px}[dir=rtl] .mtx-grid .mat-mdc-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-footer-cell:last-of-type:not(:only-of-type),[dir=rtl] .mtx-grid .mat-mdc-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:10px}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-mdc-row:last-of-type .mat-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin:0 4px}.mtx-grid .mat-header-cell-inner{display:flex;align-items:center}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:48px;padding:8px;box-sizing:border-box}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left-width:1px;border-left-style:solid}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right-width:1px;border-right-style:solid}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:56px;padding:8px}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;width:40px;height:40px;vertical-align:middle}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:48px;overflow:hidden}.mtx-grid-checkbox-cell{flex:none;justify-content:center;width:60px;min-width:60px}.mtx-grid-checkbox-cell .mat-checkbox{display:flex;margin:0 10px}.mtx-grid-checkbox-cell .mat-checkbox-inner-container{margin-left:0}.mtx-grid-row-expand-button.mat-mdc-icon-button{width:40px;height:40px;padding:8px;vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button+mtx-grid-cell{vertical-align:middle}.mtx-grid-row-expand-button.mat-mdc-icon-button .mat-mdc-button-touch-target{width:100%;height:100%}.mtx-grid-icon{width:20px;height:20px;font-size:20px}\n"] }]
390
- }], ctorParameters: function () { return [{ type: i1.MtxGridUtils }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
391
- type: Optional
392
- }, {
393
- type: Inject,
394
- args: [MTX_GRID_DEFAULT_OPTIONS]
395
- }] }]; }, propDecorators: { table: [{
396
- type: ViewChild,
397
- args: [MatTable]
398
- }], paginator: [{
399
- type: ViewChild,
400
- args: [MatPaginator]
401
- }], sort: [{
402
- type: ViewChild,
403
- args: [MatSort]
404
- }], rowDefs: [{
405
- type: ContentChildren,
406
- args: [MatRowDef]
407
- }], headerRowDefs: [{
408
- type: ContentChildren,
409
- args: [MatHeaderRowDef]
410
- }], footerRowDefs: [{
411
- type: ContentChildren,
412
- args: [MatFooterRow]
413
- }], columnMenu: [{
414
- type: ViewChild,
415
- args: ['columnMenu']
416
- }], tableContainer: [{
417
- type: ViewChild,
418
- args: ['tableContainer']
419
- }], displayedColumns: [{
420
- type: Input
421
- }], columns: [{
422
- type: Input
423
- }], data: [{
424
- type: Input
425
- }], length: [{
426
- type: Input
427
- }], loading: [{
428
- type: Input
429
- }], trackBy: [{
430
- type: Input
431
- }], columnResizable: [{
432
- type: Input
433
- }], emptyValuePlaceholder: [{
434
- type: Input
435
- }], pageOnFront: [{
436
- type: Input
437
- }], showPaginator: [{
438
- type: Input
439
- }], pageDisabled: [{
440
- type: Input
441
- }], showFirstLastButtons: [{
442
- type: Input
443
- }], pageIndex: [{
444
- type: Input
445
- }], pageSize: [{
446
- type: Input
447
- }], pageSizeOptions: [{
448
- type: Input
449
- }], hidePageSize: [{
450
- type: Input
451
- }], page: [{
452
- type: Output
453
- }], paginationTemplate: [{
454
- type: Input
455
- }], sortOnFront: [{
456
- type: Input
457
- }], sortActive: [{
458
- type: Input
459
- }], sortDirection: [{
460
- type: Input
461
- }], sortDisableClear: [{
462
- type: Input
463
- }], sortDisabled: [{
464
- type: Input
465
- }], sortStart: [{
466
- type: Input
467
- }], sortChange: [{
468
- type: Output
469
- }], rowHover: [{
470
- type: Input
471
- }], rowStriped: [{
472
- type: Input
473
- }], rowClick: [{
474
- type: Output
475
- }], expandable: [{
476
- type: Input
477
- }], expansionTemplate: [{
478
- type: Input
479
- }], expansionChange: [{
480
- type: Output
481
- }], multiSelectable: [{
482
- type: Input
483
- }], multiSelectionWithClick: [{
484
- type: Input
485
- }], rowSelected: [{
486
- type: Input
487
- }], rowSelectable: [{
488
- type: Input
489
- }], hideRowSelectionCheckbox: [{
490
- type: Input
491
- }], disableRowClickSelection: [{
492
- type: Input
493
- }], rowSelectionFormatter: [{
494
- type: Input
495
- }], rowClassFormatter: [{
496
- type: Input
497
- }], rowSelectionChange: [{
498
- type: Output
499
- }], cellSelectable: [{
500
- type: Input
501
- }], cellSelectionChange: [{
502
- type: Output
503
- }], showToolbar: [{
504
- type: Input
505
- }], toolbarTitle: [{
506
- type: Input
507
- }], toolbarTemplate: [{
508
- type: Input
509
- }], columnHideable: [{
510
- type: Input
511
- }], columnHideableChecked: [{
512
- type: Input
513
- }], columnSortable: [{
514
- type: Input
515
- }], columnPinnable: [{
516
- type: Input
517
- }], columnChange: [{
518
- type: Output
519
- }], columnPinOptions: [{
520
- type: Input
521
- }], showColumnMenuButton: [{
522
- type: Input
523
- }], columnMenuButtonText: [{
524
- type: Input
525
- }], columnMenuButtonType: [{
526
- type: Input
527
- }], columnMenuButtonColor: [{
528
- type: Input
529
- }], columnMenuButtonClass: [{
530
- type: Input
531
- }], columnMenuButtonIcon: [{
532
- type: Input
533
- }], showColumnMenuHeader: [{
534
- type: Input
535
- }], columnMenuHeaderText: [{
536
- type: Input
537
- }], columnMenuHeaderTemplate: [{
538
- type: Input
539
- }], showColumnMenuFooter: [{
540
- type: Input
541
- }], columnMenuFooterText: [{
542
- type: Input
543
- }], columnMenuFooterTemplate: [{
544
- type: Input
545
- }], noResultText: [{
546
- type: Input
547
- }], noResultTemplate: [{
548
- type: Input
549
- }], headerTemplate: [{
550
- type: Input
551
- }], headerExtraTemplate: [{
552
- type: Input
553
- }], cellTemplate: [{
554
- type: Input
555
- }], useContentRowTemplate: [{
556
- type: Input
557
- }], useContentHeaderRowTemplate: [{
558
- type: Input
559
- }], useContentFooterRowTemplate: [{
560
- type: Input
561
- }], showSummary: [{
562
- type: Input
563
- }], summaryTemplate: [{
564
- type: Input
565
- }], showSidebar: [{
566
- type: Input
567
- }], sidebarTemplate: [{
568
- type: Input
569
- }], showStatusbar: [{
570
- type: Input
571
- }], statusbarTemplate: [{
572
- type: Input
573
- }] } });
574
- export class MtxGridSelectableCell {
575
- get selected() {
576
- return this._selected;
577
- }
578
- set mtxSelectableRowData(value) {
579
- if (value !== this._rowData) {
580
- this._rowData = value;
581
- }
582
- }
583
- constructor(_grid) {
584
- this._grid = _grid;
585
- this._selected = false;
586
- this.ctrlKeyPressed = false;
587
- this.shiftKeyPressed = false;
588
- this.cellSelectionChange = new EventEmitter();
589
- }
590
- onClick(event) {
591
- this.ctrlKeyPressed = event.ctrlKey;
592
- this.shiftKeyPressed = event.shiftKey;
593
- if (this._grid.cellSelectable) {
594
- this.select();
595
- }
596
- }
597
- select() {
598
- this._selected = true;
599
- this.cellSelectionChange.emit(this);
600
- }
601
- deselect() {
602
- this._selected = false;
603
- this.cellSelectionChange.emit(this);
604
- }
605
- toggle() {
606
- this._selected = !this._selected;
607
- this.cellSelectionChange.emit(this);
608
- }
609
- }
610
- /** @nocollapse */ MtxGridSelectableCell.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MtxGridSelectableCell, deps: [{ token: MtxGrid }], target: i0.ɵɵFactoryTarget.Directive });
611
- /** @nocollapse */ MtxGridSelectableCell.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.1", type: MtxGridSelectableCell, selector: "[mtx-grid-selectable-cell]", inputs: { mtxSelectableRowData: "mtxSelectableRowData" }, outputs: { cellSelectionChange: "cellSelectionChange" }, host: { listeners: { "click": "onClick($event)" }, properties: { "class.selected": "this.selected" } }, ngImport: i0 });
612
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MtxGridSelectableCell, decorators: [{
613
- type: Directive,
614
- args: [{
615
- selector: '[mtx-grid-selectable-cell]',
616
- }]
617
- }], ctorParameters: function () { return [{ type: MtxGrid }]; }, propDecorators: { selected: [{
618
- type: HostBinding,
619
- args: ['class.selected']
620
- }], mtxSelectableRowData: [{
621
- type: Input
622
- }], cellSelectionChange: [{
623
- type: Output
624
- }], onClick: [{
625
- type: HostListener,
626
- args: ['click', ['$event']]
627
- }] } });
628
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZ3JpZC9ncmlkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9ncmlkL2dyaWQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsU0FBUyxFQVVULGVBQWUsRUFDZixTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFFWixjQUFjLEVBQ2QsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsWUFBWSxFQUVaLGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLGtCQUFrQixHQUNuQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQVEsT0FBTyxFQUFpQixNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCdEUsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDM0IsQ0FBQztBQXFCRixNQUFNLE9BQU8sT0FBTztJQTZMbEIsSUFBSSxZQUFZO1FBQ2QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFD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QUU7WUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDOztxSUE5Q1UscUJBQXFCO3lIQUFyQixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNEJBQTRCO2lCQUN2QzsyRkFTSyxRQUFRO3NCQURYLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQU16QixvQkFBb0I7c0JBRHZCLEtBQUs7Z0JBT0ksbUJBQW1CO3NCQUE1QixNQUFNO2dCQUtQLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3Q2hpbGQsXG4gIE9uQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRWxlbWVudFJlZixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgUXVlcnlMaXN0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgS2V5VmFsdWVDaGFuZ2VSZWNvcmQsXG4gIEluamVjdGlvblRva2VuLFxuICBPcHRpb25hbCxcbiAgSW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgYW5pbWF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWF0Rm9vdGVyUm93LFxuICBNYXRGb290ZXJSb3dEZWYsXG4gIE1hdEhlYWRlclJvd0RlZixcbiAgTWF0Um93RGVmLFxuICBNYXRUYWJsZSxcbiAgTWF0VGFibGVEYXRhU291cmNlLFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBTb3J0LCBNYXRTb3J0LCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBUaGVtZVBhbGV0dGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcblxuaW1wb3J0IHtcbiAgTXR4R3JpZENvbHVtbixcbiAgTXR4R3JpZENlbGxUZW1wbGF0ZSxcbiAgTXR4R3JpZFJvd1NlbGVjdGlvbkZvcm1hdHRlcixcbiAgTXR4R3JpZFJvd0NsYXNzRm9ybWF0dGVyLFxuICBNdHhHcmlkQnV0dG9uVHlwZSxcbiAgTXR4R3JpZENvbHVtblBpbk9wdGlvbixcbiAgTXR4R3JpZERlZmF1bHRPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTXR4R3JpZEV4cGFuc2lvblRvZ2dsZSB9IGZyb20gJy4vZXhwYW5zaW9uLXRvZ2dsZSc7XG5pbXBvcnQgeyBNdHhHcmlkVXRpbHMgfSBmcm9tICcuL2dyaWQtdXRpbHMnO1xuaW1wb3J0IHsgTXR4R3JpZENvbHVtbk1lbnUgfSBmcm9tICcuL2NvbHVtbi1tZW51JztcblxuLyoqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZGVmYXVsdCBncmlkIG9wdGlvbnMuICovXG5leHBvcnQgY29uc3QgTVRYX0dSSURfREVGQVVMVF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuPE10eEdyaWREZWZhdWx0T3B0aW9ucz4oXG4gICdtdHgtZ3JpZC1kZWZhdWx0LW9wdGlvbnMnXG4pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdHgtZ3JpZCcsXG4gIGV4cG9ydEFzOiAnbXR4R3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ncmlkLnNjc3MnXSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnbXR4LWdyaWQnLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2V4cGFuc2lvbicsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQsIHZvaWQnLCBzdHlsZSh7IGhlaWdodDogJzAnLCBtaW5IZWlnaHQ6ICcwJywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pKSxcbiAgICAgIHRyYW5zaXRpb24oJ2V4cGFuZGVkIDw9PiBjb2xsYXBzZWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gdm9pZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcbiAgICBdKSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTXR4R3JpZCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChNYXRUYWJsZSkgdGFibGUhOiBNYXRUYWJsZTxhbnk+O1xuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQhOiBNYXRTb3J0O1xuICBAQ29udGVudENoaWxkcmVuKE1hdFJvd0RlZikgcm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRSb3dEZWY8YW55Pj47XG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0SGVhZGVyUm93RGVmKSBoZWFkZXJSb3dEZWZzITogUXVlcnlMaXN0PE1hdEhlYWRlclJvd0RlZj47XG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0Rm9vdGVyUm93KSBmb290ZXJSb3dEZWZzITogUXVlcnlMaXN0PE1hdEZvb3RlclJvd0RlZj47XG4gIEBWaWV3Q2hpbGQoJ2NvbHVtbk1lbnUnKSBjb2x1bW5NZW51ITogTXR4R3JpZENvbHVtbk1lbnU7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQ29udGFpbmVyJykgdGFibGVDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSgpO1xuXG4gIC8qKiBUaGUgZ3JpZCdzIGRpc3BsYXllZCBjb2x1bW5zLiAqL1xuICBASW5wdXQoKSBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogVGhlIGdyaWQncyBjb2x1bW5zLiAqL1xuICBASW5wdXQoKSBjb2x1bW5zOiBNdHhHcmlkQ29sdW1uW10gPSBbXTtcbiAgLyoqIFRoZSBncmlkJ3MgZGF0YS4gKi9cbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcbiAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGhlIGRhdGEuICovXG4gIEBJbnB1dCgpIGxlbmd0aCA9IDA7XG4gIC8qKiBXaGV0aGVyIHRoZSBncmlkIGlzIGxvYWRpbmcuICovXG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcbiAgLyoqIFRyYWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBkaWZmZXJlbmNlcyBpbiBkYXRhIGNoYW5nZXMuICovXG4gIEBJbnB1dCgpIHRyYWNrQnkhOiBUcmFja0J5RnVuY3Rpb248YW55PjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyByZXNpemFibGUuICovXG4gIEBJbnB1dCgpIGNvbHVtblJlc2l6YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5SZXNpemFibGUgPz8gZmFsc2U7XG4gIC8qKiBQbGFjZWhvbGRlciBmb3IgdGhlIGVtcHR5IHZhbHVlIChgbnVsbGAsIGAnJ2AsIGBbXWApLiAqL1xuICBASW5wdXQoKSBlbXB0eVZhbHVlUGxhY2Vob2xkZXIgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uZW1wdHlWYWx1ZVBsYWNlaG9sZGVyID8/ICctLSc7XG5cbiAgLy8gPT09PT0gUGFnZSA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHBhZ2luYXRlIHRoZSBkYXRhIG9uIGZyb250IGVuZC4gKi9cbiAgQElucHV0KCkgcGFnZU9uRnJvbnQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucGFnZU9uRnJvbnQgPz8gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgcGFnaW5hdG9yLiAqL1xuICBASW5wdXQoKSBzaG93UGFnaW5hdG9yID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNob3dQYWdpbmF0b3IgPz8gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHBhZ2luYXRvciBpcyBkaXNhYmxlZC4gKi9cbiAgQElucHV0KCkgcGFnZURpc2FibGVkID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VEaXNhYmxlZCA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgZmlyc3QvbGFzdCBidXR0b25zIFVJIHRvIHRoZSB1c2VyLiAqL1xuICBASW5wdXQoKSBzaG93Rmlyc3RMYXN0QnV0dG9ucyA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Rmlyc3RMYXN0QnV0dG9ucyA/PyB0cnVlO1xuICAvKiogVGhlIHplcm8tYmFzZWQgcGFnZSBpbmRleCBvZiB0aGUgZGlzcGxheWVkIGxpc3Qgb2YgaXRlbXMuICovXG4gIEBJbnB1dCgpIHBhZ2VJbmRleCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5wYWdlSW5kZXggPz8gMDtcbiAgLyoqIE51bWJlciBvZiBpdGVtcyB0byBkaXNwbGF5IG9uIGEgcGFnZS4gKi9cbiAgQElucHV0KCkgcGFnZVNpemUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucGFnZVNpemUgPz8gMTA7XG4gIC8qKiBUaGUgc2V0IG9mIHByb3ZpZGVkIHBhZ2Ugc2l6ZSBvcHRpb25zIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIuICovXG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9ucyA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5wYWdlU2l6ZU9wdGlvbnMgPz8gWzEwLCA1MCwgMTAwXTtcbiAgLyoqIFdoZXRoZXIgdG8gaGlkZSB0aGUgcGFnZSBzaXplIHNlbGVjdGlvbiBVSSBmcm9tIHRoZSB1c2VyLiAqL1xuICBASW5wdXQoKSBoaWRlUGFnZVNpemUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uaGlkZVBhZ2VTaXplID8/IGZhbHNlO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBwYWdpbmF0b3IgY2hhbmdlcyB0aGUgcGFnZSBzaXplIG9yIHBhZ2UgaW5kZXguICovXG4gIEBPdXRwdXQoKSBwYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBwYWdpbmF0aW9uLiAqL1xuICBASW5wdXQoKSBwYWdpbmF0aW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vID09PT09IFNvcnQgPT09PT1cblxuICAvKiogV2hldGhlciB0byBzb3J0IHRoZSBkYXRhIG9uIGZyb250IGVuZC4gKi9cbiAgQElucHV0KCkgc29ydE9uRnJvbnQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydE9uRnJvbnQgPz8gdHJ1ZTtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgbW9zdCByZWNlbnRseSBzb3J0ZWQgTWF0U29ydGFibGUuICovXG4gIEBJbnB1dCgpIHNvcnRBY3RpdmUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydEFjdGl2ZSA/PyAnJztcbiAgLyoqIFRoZSBzb3J0IGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBNYXRTb3J0YWJsZS4gKi9cbiAgQElucHV0KCkgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0RGlyZWN0aW9uID8/ICcnO1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSB1c2VyIGZyb20gY2xlYXJpbmcgdGhlIHNvcnQgYnkgZmluaXNoaW5nIHRoZSBzb3J0IGRpcmVjdGlvbiBjeWNsZS5cbiAgICogTWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgY29sdW1uJ3MgYGRpc2FibGVDbGVhcmAgaW4gYHNvcnRQcm9wYC5cbiAgICovXG4gIEBJbnB1dCgpIHNvcnREaXNhYmxlQ2xlYXIgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydERpc2FibGVDbGVhciA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHNvcnQgaXMgZGlzYWJsZWQuICovXG4gIEBJbnB1dCgpIHNvcnREaXNhYmxlZCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0RGlzYWJsZWQgPz8gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aW9uIHRvIHNldCB3aGVuIGFuIE1hdFNvcnRhYmxlIGlzIGluaXRpYWxseSBzb3J0ZWQuXG4gICAqIE1heSBiZSBvdmVycmlkZW4gYnkgdGhlIGNvbHVtbidzIGBzdGFydGAgaW4gYHNvcnRQcm9wYC5cbiAgICovXG4gIEBJbnB1dCgpIHNvcnRTdGFydDogJ2FzYycgfCAnZGVzYycgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydFN0YXJ0ID8/ICdhc2MnO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgZWl0aGVyIHRoZSBhY3RpdmUgc29ydCBvciBzb3J0IGRpcmVjdGlvbi4gKi9cbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG5cbiAgLy8gPT09PT0gUm93ID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gdXNlIHRoZSByb3cgaG92ZXIgc3R5bGUuICovXG4gIEBJbnB1dCgpIHJvd0hvdmVyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnJvd0hvdmVyID8/IGZhbHNlO1xuICAvKiogV2hldGhlciB0byB1c2UgdGhlIHJvdyBzdHJpcGVkIHN0eWxlLiAqL1xuICBASW5wdXQoKSByb3dTdHJpcGVkID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnJvd1N0cmlwZWQgPz8gZmFsc2U7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vID09PT09IEV4cGFuZGFibGUgUm93ID09PT09XG5cbiAgZXhwYW5zaW9uUm93U3RhdGVzOiBhbnlbXSA9IFtdO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSByb3cgaXMgZXhwYW5kYWJsZS4gKi9cbiAgQElucHV0KCkgZXhwYW5kYWJsZSA9IGZhbHNlO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgZXhwYW5kYWJsZSByb3cuICovXG4gIEBJbnB1dCgpIGV4cGFuc2lvblRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdXNlciB0b2dnbGVzIHRoZSBleHBhbmRhYmxlIHJvdy4gKi9cbiAgQE91dHB1dCgpIGV4cGFuc2lvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vID09PT09IFJvdyBTZWxlY3Rpb24gPT09PT1cblxuICByb3dTZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPGFueT4gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSk7XG5cbiAgLyoqIFdoZXRoZXIgdG8gc3VwcG9ydCBtdWx0aXBsZSByb3cvY2VsbCBzZWxlY3Rpb24uICovXG4gIEBJbnB1dCgpIG11bHRpU2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5tdWx0aVNlbGVjdGFibGUgPz8gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgY2FuIHNlbGVjdCBtdWx0aXBsZSByb3dzIHdpdGggY2xpY2suICovXG4gIEBJbnB1dCgpIG11bHRpU2VsZWN0aW9uV2l0aENsaWNrID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/Lm11bHRpU2VsZWN0aW9uV2l0aENsaWNrID8/IGZhbHNlO1xuICAvKiogVGhlIHNlbGVjdGVkIHJvdyBpdGVtcy4gKi9cbiAgQElucHV0KCkgcm93U2VsZWN0ZWQ6IGFueVtdID0gW107XG4gIC8qKiBXaGV0aGVyIHRoZSByb3cgaXMgc2VsZWN0YWJsZS4gKi9cbiAgQElucHV0KCkgcm93U2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5yb3dTZWxlY3RhYmxlID8/IGZhbHNlO1xuICAvKiogV2hldGhlciB0byBoaWRlIHRoZSByb3cgc2VsZWN0aW9uIGNoZWNrYm94LiAqL1xuICBASW5wdXQoKSBoaWRlUm93U2VsZWN0aW9uQ2hlY2tib3ggPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uaGlkZVJvd1NlbGVjdGlvbkNoZWNrYm94ID8/IGZhbHNlO1xuICAvKiogV2hldGhlciBkaXNhYmxlIHJvd3MgdG8gYmUgc2VsZWN0ZWQgd2hlbiBjbGlja2VkLiAqL1xuICBASW5wdXQoKSBkaXNhYmxlUm93Q2xpY2tTZWxlY3Rpb24gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uZGlzYWJsZVJvd0NsaWNrU2VsZWN0aW9uID8/IGZhbHNlO1xuICAvKiogVGhlIGZvcm1hdHRlciB0byBkaXNhYmxlIHRoZSByb3cgc2VsZWN0aW9uIG9yIGhpZGUgdGhlIHJvdydzIGNoZWNrYm94LiAqL1xuICBASW5wdXQoKSByb3dTZWxlY3Rpb25Gb3JtYXR0ZXI6IE10eEdyaWRSb3dTZWxlY3Rpb25Gb3JtYXR0ZXIgPSB7fTtcbiAgLyoqIFRoZSBmb3JtYXR0ZXIgdG8gc2V0IHRoZSByb3cncyBjbGFzcy4gKi9cbiAgQElucHV0KCkgcm93Q2xhc3NGb3JtYXR0ZXI/OiBNdHhHcmlkUm93Q2xhc3NGb3JtYXR0ZXI7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHJvdyBpcyBzZWxlY3RlZC4gKi9cbiAgQE91dHB1dCgpIHJvd1NlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgLy8gPT09PT0gQ2VsbCBTZWxlY3Rpb24gPT09PT1cblxuICBjZWxsU2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjZWxsIGlzIHNlbGVjdGFibGUuICovXG4gIEBJbnB1dCgpIGNlbGxTZWxlY3RhYmxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNlbGxTZWxlY3RhYmxlID8/IHRydWU7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGNlbGwgaXMgc2VsZWN0ZWQuICovXG4gIEBPdXRwdXQoKSBjZWxsU2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICBwcml2YXRlIF9zZWxlY3RlZENlbGw/OiBNdHhHcmlkU2VsZWN0YWJsZUNlbGw7XG5cbiAgLy8gPT09PT0gVG9vbGJhciA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRvb2xiYXIuICovXG4gIEBJbnB1dCgpIHNob3dUb29sYmFyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNob3dUb29sYmFyID8/IGZhbHNlO1xuICAvKiogVGhlIHRleHQgb2YgdGhlIHRvb2xiYXIncyB0aXRsZS4gKi9cbiAgQElucHV0KCkgdG9vbGJhclRpdGxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnRvb2xiYXJUaXRsZSA/PyAnJztcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRvb2xiYXIuICovXG4gIEBJbnB1dCgpIHRvb2xiYXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gQ29sdW1uIE1lbnUgPT09PT1cblxuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIGhpZGVhYmxlLiAqL1xuICBASW5wdXQoKSBjb2x1bW5IaWRlYWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5IaWRlYWJsZSA/PyB0cnVlO1xuICAvKiogSGlkZSBvciBzaG93IHdoZW4gdGhlIGNvbHVtbidzIGNoZWNrYm94IGlzIGNoZWNrZWQuICovXG4gIEBJbnB1dCgpIGNvbHVtbkhpZGVhYmxlQ2hlY2tlZDogJ3Nob3cnIHwgJ2hpZGUnID1cbiAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uSGlkZWFibGVDaGVja2VkID8/ICdzaG93JztcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZS4gKi9cbiAgQElucHV0KCkgY29sdW1uU29ydGFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uU29ydGFibGUgPz8gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwaW5uYWJsZS4gKi9cbiAgQElucHV0KCkgY29sdW1uUGlubmFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uUGlubmFibGUgPz8gdHJ1ZTtcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgY29sdW1uIGlzIGhpZGVkIG9yIGlzIHNvcnRlZC4gKi9cbiAgQE91dHB1dCgpIGNvbHVtbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TXR4R3JpZENvbHVtbltdPigpO1xuICAvKiogVGhlIG9wdGlvbnMgZm9yIHRoZSBjb2x1bW4gcGluIGxpc3QuICovXG4gIEBJbnB1dCgpIGNvbHVtblBpbk9wdGlvbnM6IE10eEdyaWRDb2x1bW5QaW5PcHRpb25bXSA9XG4gICAgdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtblBpbk9wdGlvbnMgPz8gW107XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBzaG93Q29sdW1uTWVudUJ1dHRvbiA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Q29sdW1uTWVudUJ1dHRvbiA/PyB0cnVlO1xuICAvKiogVGhlIHRleHQgZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25UZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25UZXh0ID8/ICcnO1xuICAvKiogVGhlIHR5cGUgZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25UeXBlOiBNdHhHcmlkQnV0dG9uVHlwZSA9XG4gICAgdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25UeXBlID8/ICdzdHJva2VkJztcbiAgLyoqIFRoZSBjb2xvciBmb3IgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUJ1dHRvbkNvbG9yOiBUaGVtZVBhbGV0dGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uTWVudUJ1dHRvbkNvbG9yO1xuICAvKiogVGhlIGNsYXNzIGZvciB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51QnV0dG9uQ2xhc3MgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uTWVudUJ1dHRvbkNsYXNzID8/ICcnO1xuICAvKiogVGhlIGljb24gZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25JY29uID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVCdXR0b25JY29uID8/ICcnO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGNvbHVtbi1tZW51J3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSBzaG93Q29sdW1uTWVudUhlYWRlciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Q29sdW1uTWVudUhlYWRlciA/PyBmYWxzZTtcbiAgLyoqIFRoZSB0ZXh0IGZvciB0aGUgY29sdW1uLW1lbnUncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVIZWFkZXJUZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVIZWFkZXJUZXh0ID8/ICdDb2x1bW5zIEhlYWRlcic7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBjb2x1bW4tbWVudSdzIGhlYWRlci4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdGhlIGNvbHVtbi1tZW51J3MgZm9vdGVyLiAqL1xuICBASW5wdXQoKSBzaG93Q29sdW1uTWVudUZvb3RlciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Q29sdW1uTWVudUZvb3RlciA/PyBmYWxzZTtcbiAgLyoqIFRoZSB0ZXh0IGZvciB0aGUgY29sdW1uLW1lbnUncyBmb290ZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVGb290ZXJUZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVGb290ZXJUZXh0ID8/ICdDb2x1bW5zIEZvb3Rlcic7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBjb2x1bW4tbWVudSdzIGZvb3Rlci4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUZvb3RlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyA9PT09PSBObyBSZXN1bHQgPT09PT1cblxuICAvKiogVGhlIGRpc3BsYXllZCB0ZXh0IGZvciB0aGUgZW1wdHkgZGF0YS4gKi9cbiAgQElucHV0KCkgbm9SZXN1bHRUZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/Lm5vUmVzdWx0VGV4dCA/PyAnTm8gcmVjb3JkcyBmb3VuZCc7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBlbXB0eSBkYXRhLiAqL1xuICBASW5wdXQoKSBub1Jlc3VsdFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBnZXQgX2hhc05vUmVzdWx0KCkge1xuICAgIHJldHVybiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGEubGVuZ3RoID09PSAwKSAmJiAhdGhpcy5sb2FkaW5nO1xuICB9XG5cbiAgLy8gPT09PT0gQ2VsbCBUZW1wbGF0ZXMgPT09PT1cblxuICAvKiogVGhlIGhlYWRlcidzIGNlbGwgdGVtcGxhdGUgZm9yIHRoZSBncmlkLiAqL1xuICBASW5wdXQoKSBoZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT4gfCBNdHhHcmlkQ2VsbFRlbXBsYXRlO1xuICAvKiogVGhlIGhlYWRlcidzIGNlbGwgdGVtcGxhdGUgZm9yIHRoZSBncmlkIGV4Y2x1ZGUgc29ydC4gKi9cbiAgQElucHV0KCkgaGVhZGVyRXh0cmFUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT4gfCBNdHhHcmlkQ2VsbFRlbXBsYXRlO1xuICAvKiogVGhlIGNlbGwgdGVtcGxhdGUgZm9yIHRoZSBncmlkLiAqL1xuICBASW5wdXQoKSBjZWxsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgTXR4R3JpZENlbGxUZW1wbGF0ZTtcblxuICAvLyA9PT09PSBSb3cgVGVtcGxhdGVzID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGN1c3RvbSByb3cgdGVtcGxhdGUuIElmIHRydWUsIHlvdSBzaG91bGQgZGVmaW5lIGEgbWF0Um93RGVmLiAqL1xuICBASW5wdXQoKSB1c2VDb250ZW50Um93VGVtcGxhdGUgPSBmYWxzZTtcbiAgLy8gVE9ETzogSXQgY2FuJ3QgdXNlIHRvZ2V0aGVyIHdpdGggYHVzZUNvbnRlbnRSb3dUZW1wbGF0ZWBcbiAgQElucHV0KCkgdXNlQ29udGVudEhlYWRlclJvd1RlbXBsYXRlID0gZmFsc2U7XG4gIC8vIFRPRE86IEl0J3Mgbm90IHdvcmtpbmdcbiAgQElucHV0KCkgdXNlQ29udGVudEZvb3RlclJvd1RlbXBsYXRlID0gZmFsc2U7XG5cbiAgLy8gPT09PT0gU3VtbWFyeSA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHN1bW1hcnkuICovXG4gIEBJbnB1dCgpIHNob3dTdW1tYXJ5ID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBzdW1tYXJ5LiAqL1xuICBASW5wdXQoKSBzdW1tYXJ5VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgTXR4R3JpZENlbGxUZW1wbGF0ZTtcblxuICAvLyBUT0RPOiBTdW1tYXJ5IGRpc3BsYXkgY29uZGl0aW9uc1xuICBnZXQgX3doZXRoZXJTaG93U3VtbWFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U3VtbWFyeTtcbiAgfVxuXG4gIC8vID09PT09IFNpZGUgQmFyID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgc2lkZWJhci4gKi9cbiAgQElucHV0KCkgc2hvd1NpZGViYXIgPSBmYWxzZTtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHNpZGViYXIuICovXG4gIEBJbnB1dCgpIHNpZGViYXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gU3RhdHVzIEJhciA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHN0YXR1cyBiYXIuICovXG4gIEBJbnB1dCgpIHNob3dTdGF0dXNiYXIgPSBmYWxzZTtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHN0YXR1cyBiYXIuICovXG4gIEBJbnB1dCgpIHN0YXR1c2JhclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKiogVGhlIGNoYW5nZWQgcmVjb3JkIG9mIHJvdyBkYXRhLiAqL1xuICByb3dDaGFuZ2VSZWNvcmQ/OiBLZXlWYWx1ZUNoYW5nZVJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdXRpbHM6IE10eEdyaWRVdGlscyxcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1UWF9HUklEX0RFRkFVTFRfT1BUSU9OUylcbiAgICBwcml2YXRlIF9kZWZhdWx0T3B0aW9ucz86IE10eEdyaWREZWZhdWx0T3B0aW9uc1xuICApIHt9XG5cbiAgZGV0ZWN0Q2hhbmdlcygpIHtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBfZ2V0Q29sRGF0YShkYXRhOiBhbnlbXSwgY29sRGVmOiBNdHhHcmlkQ29sdW1uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3V0aWxzLmdldENvbERhdGEoZGF0YSwgY29sRGVmKTtcbiAgfVxuXG4gIC8vIFdhaXRpbmcgZm9yIGFzeW5jIGRhdGFcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuX2NvdW50UGlubmVkUG9zaXRpb24oKTtcblxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRlKS5tYXAoaXRlbSA9PiBpdGVtLmZpZWxkKTtcblxuICAgIGlmICh0aGlzLnNob3dDb2x1bW5NZW51QnV0dG9uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uSGlkZWFibGVDaGVja2VkID09PSAnc2hvdycpIHtcbiAgICAgICAgICBpdGVtLnNob3cgPSAhaXRlbS5oaWRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uaGlkZSA9ICEhaXRlbS5oaWRlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dTZWxlY3RhYmxlICYmICF0aGlzLmhpZGVSb3dTZWxlY3Rpb25DaGVja2JveCkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnVuc2hpZnQoJ010eEdyaWRDaGVja2JveENvbHVtbkRlZicpO1xuICAgIH1cblxuICAgIC8vIFdlIHNob3VsZCBjb3B5IGVhY2ggaXRlbSBvZiBkYXRhIGZvciBleHBhbnNpb24gZGF0YVxuICAgIGlmICh0aGlzLmV4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5zaW9uUm93U3RhdGVzID0gW107IC8vIHJlc2V0XG5cbiAgICAgIHRoaXMuZGF0YT8uZm9yRWFjaChfID0+IHtcbiAgICAgICAgdGhpcy5leHBhbnNpb25Sb3dTdGF0ZXMucHVzaCh7IGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvd1NlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMucm93U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5tdWx0aVNlbGVjdGFibGUsIHRoaXMucm93U2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5kYXRhKTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2VPbkZyb250ID8gdGhpcy5wYWdpbmF0b3IgOiBudWxsO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0T25Gcm9udCA/IHRoaXMuc29ydCA6IG51bGw7XG5cbiAgICAvLyBPbmx5IHNjcm9sbCB0b3Agd2l0aCBkYXRhIGNoYW5nZVxuICAgIGlmIChjaGFuZ2VzLmRhdGEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9wKDApO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5wYWdlT25Gcm9udCkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRPbkZyb250KSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dEZWZzPy5sZW5ndGggPiAwICYmIHRoaXMudXNlQ29udGVudFJvd1RlbXBsYXRlKSB7XG4gICAgICB0aGlzLnJvd0RlZnMuZm9yRWFjaChyb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRSb3dEZWYocm93RGVmKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhlYWRlclJvd0RlZnM/Lmxlbmd0aCA+IDAgJiYgdGhpcy51c2VDb250ZW50SGVhZGVyUm93VGVtcGxhdGUpIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93RGVmcy5mb3JFYWNoKGhlYWRlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3dEZWYpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9vdGVyUm93RGVmcz8ubGVuZ3RoID4gMCAmJiB0aGlzLnVzZUNvbnRlbnRGb290ZXJSb3dUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5mb290ZXJSb3dEZWZzLmZvckVhY2goZm9vdGVyUm93RGVmID0+IHRoaXMudGFibGUuYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvd0RlZikpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge31cblxuICBfY291bnRQaW5uZWRQb3NpdGlvbigpIHtcbiAgICBjb25zdCBjb3VudCA9IChhY2M6IG51bWJlciwgY3VyOiBNdHhHcmlkQ29sdW1uKSA9PiBhY2MgKyBwYXJzZUZsb2F0KGN1ci53aWR0aCB8fCAnODBweCcpO1xuXG4gICAgY29uc3QgcGlubmVkTGVmdENvbHMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wucGlubmVkICYmIGNvbC5waW5uZWQgPT09ICdsZWZ0Jyk7XG4gICAgcGlubmVkTGVmdENvbHMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICBpdGVtLmxlZnQgPSBwaW5uZWRMZWZ0Q29scy5zbGljZSgwLCBpZHgpLnJlZHVjZShjb3VudCwgMCkgKyAncHgnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcGlubmVkUmlnaHRDb2xzID0gdGhpcy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbCA9PiBjb2wucGlubmVkICYmIGNvbC5waW5uZWQgPT09ICdyaWdodCcpXG4gICAgICAucmV2ZXJzZSgpO1xuICAgIHBpbm5lZFJpZ2h0Q29scy5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgIGl0ZW0ucmlnaHQgPSBwaW5uZWRSaWdodENvbHMuc2xpY2UoMCwgaWR4KS5yZWR1Y2UoY291bnQsIDApICsgJ3B4JztcbiAgICB9KTtcbiAgfVxuXG4gIF9nZXRJbmRleChpbmRleDogbnVtYmVyLCBkYXRhSW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgaW5kZXggPT09ICd1bmRlZmluZWQnID8gZGF0YUluZGV4IDogaW5kZXg7XG4gIH1cblxuICBfb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcbiAgfVxuXG4gIF9vblJvd0RhdGFDaGFuZ2UocmVjb3JkOiBLZXlWYWx1ZUNoYW5nZVJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnJvd0NoYW5nZVJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHBhbnNpb24gY2hhbmdlIGV2ZW50ICovXG4gIF9vbkV4cGFuc2lvbkNoYW5nZShcbiAgICBleHBhbnNpb25SZWY6IE10eEdyaWRFeHBhbnNpb25Ub2dnbGUsXG4gICAgcm93RGF0YTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb2x1bW46IE10eEdyaWRDb2x1bW4sXG4gICAgaW5kZXg6IG51bWJlclxuICApIHtcbiAgICB0aGlzLmV4cGFuc2lvbkNoYW5nZS5lbWl0KHsgZXhwYW5kZWQ6IGV4cGFuc2lvblJlZi5leHBhbmRlZCwgZGF0YTogcm93RGF0YSwgaW5kZXgsIGNvbHVtbiB9KTtcbiAgfVxuXG4gIC8qKiBDZWxsIHNlbGVjdCBldmVudCAqL1xuICBfc2VsZWN0Q2VsbChcbiAgICBjZWxsUmVmOiBNdHhHcmlkU2VsZWN0YWJsZUNlbGwsXG4gICAgcm93RGF0YTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb2xEZWY6IE10eEdyaWRDb2x1bW5cbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgbm90IHRoZSBzYW1lIGNlbGxcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRDZWxsICE9PSBjZWxsUmVmKSB7XG4gICAgICBjb25zdCBjb2xWYWx1ZSA9IHRoaXMuX3V0aWxzLmdldENlbGxWYWx1ZShyb3dEYXRhLCBjb2xEZWYpO1xuICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uID0gW107IC8vIHJlc2V0XG4gICAgICB0aGlzLmNlbGxTZWxlY3Rpb24ucHVzaCh7IGNlbGxEYXRhOiBjb2xWYWx1ZSwgcm93RGF0YSwgY29sRGVmIH0pO1xuXG4gICAgICB0aGlzLmNlbGxTZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmNlbGxTZWxlY3Rpb24pO1xuXG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWRDZWxsKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ2VsbC5kZXNlbGVjdCgpOyAvLyB0aGUgc2VsZWN0ZWRDZWxsIHdpbGwgYmUgdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0ZWRDZWxsID0gY2VsbFJlZi5zZWxlY3RlZCA/IGNlbGxSZWYgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogUm93IHNlbGVjdCBldmVudCAqL1xuICBfc2VsZWN0Um93KGV2ZW50OiBNb3VzZUV2ZW50LCByb3dEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5yb3dTZWxlY3RhYmxlICYmXG4gICAgICAhdGhpcy5yb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQ/Lihyb3dEYXRhLCBpbmRleCkgJiZcbiAgICAgICF0aGlzLnJvd1NlbGVjdGlvbkZvcm1hdHRlci5oaWRlQ2hlY2tib3g/Lihyb3dEYXRhLCBpbmRleCkgJiZcbiAgICAgICF0aGlzLmRpc2FibGVSb3dDbGlja1NlbGVjdGlvblxuICAgICkge1xuICAgICAgLy8gbWV0YUtleSAtPiBjb21tYW5kIGtleVxuICAgICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0aW9uV2l0aENsaWNrICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5KSB7XG4gICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RvZ2dsZU5vcm1hbENoZWNrYm94KHJvd0RhdGEpO1xuICAgIH1cblxuICAgIHRoaXMucm93Q2xpY2suZW1pdCh7IHJvd0RhdGEsIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbGVtZW50cyBtYXRjaGVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gKi9cbiAgX2lzQWxsU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnJvd1NlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZpbHRlcihcbiAgICAgIChyb3csIGluZGV4KSA9PiAhdGhpcy5yb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQ/Lihyb3csIGluZGV4KVxuICAgICkubGVuZ3RoO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgfVxuXG4gIC8qKiBTZWxlY3QgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cbiAgX3RvZ2dsZU1hc3RlckNoZWNrYm94KCkge1xuICAgIHRoaXMuX2lzQWxsU2VsZWN0ZWQoKVxuICAgICAgPyB0aGlzLnJvd1NlbGVjdGlvbi5jbGVhcigpXG4gICAgICA6IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMucm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkPy4ocm93LCBpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgdGhpcy5yb3dTZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnJvd1NlbGVjdGlvbi5zZWxlY3RlZCk7XG4gIH1cblxuICAvKiogU2VsZWN0IG5vcm1hbCByb3cgKi9cbiAgX3RvZ2dsZU5vcm1hbENoZWNrYm94KHJvdzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMucm93U2VsZWN0aW9uLnRvZ2dsZShyb3cpO1xuICAgIHRoaXMucm93U2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5yb3dTZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgLyoqIENvbHVtbiBjaGFuZ2UgZXZlbnQgKi9cbiAgX29uQ29sdW1uQ2hhbmdlKGNvbHVtbnM6IE10eEdyaWRDb2x1bW5bXSkge1xuICAgIHRoaXMuY29sdW1uQ2hhbmdlLmVtaXQoY29sdW1ucyk7XG5cbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSBPYmplY3QuYXNzaWduKFtdLCB0aGlzLmdldERpc3BsYXllZENvbHVtbkZpZWxkcyhjb2x1bW5zKSk7XG5cbiAgICBpZiAodGhpcy5yb3dTZWxlY3RhYmxlICYmICF0aGlzLmhpZGVSb3dTZWxlY3Rpb25DaGVja2JveCkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnVuc2hpZnQoJ010eEdyaWRDaGVja2JveENvbHVtbkRlZicpO1xuICAgIH1cbiAgfVxuXG4gIGdldERpc3BsYXllZENvbHVtbkZpZWxkcyhjb2x1bW5zOiBNdHhHcmlkQ29sdW1uW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZmllbGRzID0gY29sdW1uc1xuICAgICAgLmZpbHRlcihpdGVtID0+ICh0aGlzLmNvbHVtbkhpZGVhYmxlQ2hlY2tlZCA9PT0gJ3Nob3cnID8gaXRlbS5zaG93IDogIWl0ZW0uaGlkZSkpXG4gICAgICAubWFwKGl0ZW0gPT4gaXRlbS5maWVsZCk7XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfVxuXG4gIC8qKiBDdXN0b21pemUgZXhwYW5zaW9uIGV2ZW50ICovXG4gIHRvZ2dsZUV4cGFuc2lvbihpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmV4cGFuZGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBleHBhbmRhYmxlYCBzaG91bGQgYmUgc2V0IHRydWUuJyk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5zaW9uUm93U3RhdGVzW2luZGV4XS5leHBhbmRlZCA9ICF0aGlzLmV4cGFuc2lvblJvd1N0YXRlc1tpbmRleF0uZXhwYW5kZWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5zaW9uUm93U3RhdGVzW2luZGV4XS5leHBhbmRlZDtcbiAgfVxuXG4gIC8qKiBTY3JvbGwgdG8gdG9wIHdoZW4gdHVybiB0byB0aGUgbmV4dCBwYWdlLiAqL1xuICBfb25QYWdlKGU6IFBhZ2VFdmVudCkge1xuICAgIGlmICh0aGlzLnBhZ2VPbkZyb250KSB7XG4gICAgICB0aGlzLnNjcm9sbFRvcCgwKTtcbiAgICB9XG4gICAgdGhpcy5wYWdlLmVtaXQoZSk7XG4gIH1cblxuICBzY3JvbGxUb3AodmFsdWU/OiBudW1iZXIpOiBudW1iZXIgfCB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGVDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWJsZUNvbnRhaW5lciAmJiAhdGhpcy5sb2FkaW5nKSB7XG4gICAgICB0aGlzLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsTGVmdCh2YWx1ZT86IG51bWJlcik6IG51bWJlciB8IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZUNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICBpZiAodGhpcy50YWJsZUNvbnRhaW5lciAmJiAhdGhpcy5sb2FkaW5nKSB7XG4gICAgICB0aGlzLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbXR4LWdyaWQtc2VsZWN0YWJsZS1jZWxsXScsXG59KVxuZXhwb3J0IGNsYXNzIE10eEdyaWRTZWxlY3RhYmxlQ2VsbCB7XG4gIHByaXZhdGUgX3NlbGVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3Jvd0RhdGEhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIGN0cmxLZXlQcmVzc2VkID0gZmFsc2U7XG4gIHNoaWZ0S2V5UHJlc3NlZCA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2VsZWN0ZWQnKVxuICBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IG10eFNlbGVjdGFibGVSb3dEYXRhKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3Jvd0RhdGEpIHtcbiAgICAgIHRoaXMuX3Jvd0RhdGEgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCkgY2VsbFNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TXR4R3JpZFNlbGVjdGFibGVDZWxsPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dyaWQ6IE10eEdyaWQpIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jdHJsS2V5UHJlc3NlZCA9IGV2ZW50LmN0cmxLZXk7XG4gICAgdGhpcy5zaGlmdEtleVByZXNzZWQgPSBldmVudC5zaGlmdEtleTtcblxuICAgIGlmICh0aGlzLl9ncmlkLmNlbGxTZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHRydWU7XG4gICAgdGhpcy5jZWxsU2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcyk7XG4gIH1cblxuICBkZXNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2VsbFNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gIXRoaXMuX3NlbGVjdGVkO1xuICAgIHRoaXMuY2VsbFNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMpO1xuICB9XG59XG4iLCI8IS0tIFByb2dyZXNzIGJhci0tPlxyXG48ZGl2IGNsYXNzPVwibXR4LWdyaWQtcHJvZ3Jlc3NcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuPC9kaXY+XHJcblxyXG48IS0tIFRvb2xiYXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyXCIgKm5nSWY9XCJzaG93VG9vbGJhclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyLWNvbnRlbnRcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ0b29sYmFyVGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdFRvb2xiYXJUZW1wbGF0ZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidG9vbGJhclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUb29sYmFyVGVtcGxhdGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyLXRpdGxlXCIgKm5nSWY9XCJ0b29sYmFyVGl0bGVcIj57e3Rvb2xiYXJUaXRsZX19PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyLWFjdGlvbnNcIj5cclxuICAgIDxtdHgtZ3JpZC1jb2x1bW4tbWVudSAqbmdJZj1cInNob3dDb2x1bW5NZW51QnV0dG9uXCIgI2NvbHVtbk1lbnVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uVGV4dF09XCJjb2x1bW5NZW51QnV0dG9uVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1dHRvblR5cGVdPVwiY29sdW1uTWVudUJ1dHRvblR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25Db2xvcl09XCJjb2x1bW5NZW51QnV0dG9uQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25DbGFzc109XCJjb2x1bW5NZW51QnV0dG9uQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25JY29uXT1cImNvbHVtbk1lbnVCdXR0b25JY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJjb2x1bW5IaWRlYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVDaGVja2VkXT1cImNvbHVtbkhpZGVhYmxlQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cImNvbHVtblNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGlubmFibGVdPVwiY29sdW1uUGlubmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cInNob3dDb2x1bW5NZW51SGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVyVGV4dF09XCJjb2x1bW5NZW51SGVhZGVyVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlYWRlclRlbXBsYXRlXT1cImNvbHVtbk1lbnVIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dGb290ZXJdPVwic2hvd0NvbHVtbk1lbnVGb290ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb290ZXJUZXh0XT1cImNvbHVtbk1lbnVGb290ZXJUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVyVGVtcGxhdGVdPVwiY29sdW1uTWVudUZvb3RlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGluT3B0aW9uc109XCJjb2x1bW5QaW5PcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sdW1uQ2hhbmdlKT1cIl9vbkNvbHVtbkNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICA8L210eC1ncmlkLWNvbHVtbi1tZW51PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1tYWluIG10eC1ncmlkLWxheW91dFwiPlxyXG4gIDwhLS0gVGFibGUgY29udGVudCAtLT5cclxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtY29udGVudCBtdHgtZ3JpZC1sYXlvdXRcIj5cclxuICAgIDxkaXYgI3RhYmxlQ29udGFpbmVyIGNsYXNzPVwibWF0LXRhYmxlLWNvbnRhaW5lclwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXdpdGgtZGF0YSc6ICFfaGFzTm9SZXN1bHR9XCI+XHJcbiAgICAgIDx0YWJsZSBtYXQtdGFibGUgKm5nSWY9XCIhY29sdW1uUmVzaXphYmxlXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLWhvdmVyJzogcm93SG92ZXIsICdtYXQtdGFibGUtc3RyaXBlZCc6IHJvd1N0cmlwZWQsICdtYXQtdGFibGUtZXhwYW5kYWJsZSc6IGV4cGFuZGFibGV9XCJcclxuICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cImV4cGFuZGFibGVcIlxyXG4gICAgICAgICAgICAgbWF0U29ydFxyXG4gICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwic29ydEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0RGlzYWJsZUNsZWFyXT1cInNvcnREaXNhYmxlQ2xlYXJcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnREaXNhYmxlZF09XCJzb3J0RGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnRTdGFydF09XCJzb3J0U3RhcnRcIlxyXG4gICAgICAgICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwiX29uU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd1NlbGVjdGFibGUgJiYgIWhpZGVSb3dTZWxlY3Rpb25DaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJNdHhHcmlkQ2hlY2tib3hDb2x1bW5EZWZcIj5cclxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtdHgtZ3JpZC1jaGVja2JveC1jZWxsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJtdWx0aVNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIF9pc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFfaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IF90b2dnbGVNYXN0ZXJDaGVja2JveCgpIDogbnVsbFwiPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDtcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwiIShyb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuaGlkZUNoZWNrYm94ICYmIHJvd1NlbGVjdGlvbkZvcm1hdHRlci5oaWRlQ2hlY2tib3gocm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd1NlbGVjdGlvbkZvcm1hdHRlci5kaXNhYmxlZCAmJiByb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQocm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3dTZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IF90b2dnbGVOb3JtYWxDaGVja2JveChyb3cpIDogbnVsbFwiPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPjwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zO1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGlja3ldPVwiY29sLnBpbm5lZD09PSdsZWZ0J1wiIFtzdGlja3lFbmRdPVwiY29sLnBpbm5lZD09PSdyaWdodCdcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbCB8IGNvbENsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdtaW4td2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWhlYWRlci1jZWxsLWlubmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaGVhZGVyVGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cImhlYWRlclRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclRwbD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nSWZFbHNlXT1cImRlZmF1bHRIZWFkZXJUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXJUcGw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW21hdC1zb3J0LWhlYWRlcl09XCJjb2wuc29ydFByb3A/LmlkIHx8IGNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb2wuc29ydGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlQ2xlYXJdPVwiY29sLnNvcnRQcm9wPy5kaXNhYmxlQ2xlYXIgPz8gc29ydERpc2FibGVDbGVhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sLnNvcnRQcm9wPy5hcnJvd1Bvc2l0aW9uIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0XT1cImNvbC5zb3J0UHJvcD8uc3RhcnQhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tcGxhY2Vob2xkZXJcIiAqbmdJZj1cImNvbC5zaG93RXhwYW5kXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y29sLmhlYWRlciB8IHRvT2JzZXJ2YWJsZSB8IGFzeW5jfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm10eC1ncmlkLWljb24gbWF0LXNvcnQtaGVhZGVyLWljb25cIiAqbmdJZj1cImNvbC5zb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMywxM0gxNVYxMUgzTTMsNlY4SDIxVjZNMywxOEg5VjE2SDNWMThaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlckV4dHJhVHBsQmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGhlYWRlckV4dHJhVGVtcGxhdGUsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDtcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbCB8IGNvbENsYXNzOiByb3c6IHJvd0NoYW5nZVJlY29yZDogcm93Q2hhbmdlUmVjb3JkPy5jdXJyZW50VmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXQtdGFibGUtc3RpY2t5LWxlZnQnOiBjb2wucGlubmVkID09PSAnbGVmdCcsICdtYXQtdGFibGUtc3RpY2t5LXJpZ2h0JzogY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J31cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ21pbi13aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiXHJcbiAgICAgICAgICAgICAgICBtdHgtZ3JpZC1zZWxlY3RhYmxlLWNlbGwgKGNlbGxTZWxlY3Rpb25DaGFuZ2UpPVwiX3NlbGVjdENlbGwoJGV2ZW50LCByb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiY2VsbFRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZlwiIFtuZ0lmRWxzZV09XCJjZWxsVHBsXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShjZWxsVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsVHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoY2VsbFRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwiY29sRGVmQ2VsbFRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShjZWxsVGVtcGxhdGUpW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29sRGVmQ2VsbFRwbD5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjb2wuY2VsbFRlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHRDZWxsVHBsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wuY2VsbFRlbXBsYXRlIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUcGw+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibXR4LWdyaWQtcm93LWV4cGFuZC1idXR0b25cIiAqbmdJZj1cImNvbC5zaG93RXhwYW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIG10eC1ncmlkLWV4cGFuc2lvbi10b2dnbGUgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsob3BlbmVkKV09XCJleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVDaGFuZ2UpPVwiX29uRXhwYW5zaW9uQ2hhbmdlKCRldmVudCwgcm93LCBjb2wsIGRhdGFJbmRleCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdHgtZ3JpZC1pY29uIG10eC1ncmlkLXJvdy1leHBhbmQtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bXR4LWdyaWQtY2VsbCBbcm93RGF0YV09XCJyb3dcIiBbY29sRGVmXT1cImNvbFwiIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvd0RhdGFDaGFuZ2UpPVwiX29uUm93RGF0YUNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L210eC1ncmlkLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWZcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdtaW4td2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1wbGFjZWhvbGRlclwiICpuZ0lmPVwiY29sLnNob3dFeHBhbmRcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzdW1tYXJ5VGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cInN1bW1hcnlUcGxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KHN1bW1hcnlUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCwgZGF0YTogZGF0YSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdW1tYXJ5VHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwiZGVmYXVsdFN1bW1hcnlUcGxcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGF0YTogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFN1bW1hcnlUcGw+XHJcbiAgICAgICAgICAgICAgICA8bXR4LWdyaWQtY2VsbCBbc3VtbWFyeV09XCJ0cnVlXCIgW2RhdGFdPVwiZGF0YVwiIFtjb2xEZWZdPVwiY29sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgIDwvbXR4LWdyaWQtY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50SGVhZGVyUm93VGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdEhlYWRlclJvd1RwbFwiPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyUm93VHBsPlxyXG4gICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50Um93VGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdFJvd1RwbFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Um93VHBsPlxyXG4gICAgICAgICAgPHRyIG1hdC1yb3dcclxuICAgICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCJcclxuICAgICAgICAgICAgICBbY2xhc3NdPVwicm93IHwgcm93Q2xhc3M6IGluZGV4OiBkYXRhSW5kZXg6IHJvd0NsYXNzRm9ybWF0dGVyXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogcm93U2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KX1cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJfc2VsZWN0Um93KCRldmVudCwgcm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCI+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJfd2hldGhlclNob3dTdW1tYXJ5XCI+XHJcbiAgICAgICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidXNlQ29udGVudEZvb3RlclJvd1RlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cGFuZGFibGVcIj5cclxuICAgICAgICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZXhwYW5kYWJsZSByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIk10eEdyaWRFeHBhbnNpb25Db2x1bW5EZWZcIj5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleFwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImRpc3BsYXllZENvbHVtbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1kZXRhaWxcIlxyXG4gICAgICAgICAgICAgICAgICAgW0BleHBhbnNpb25dPVwiZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCdcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJleHBhbnNpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IGRhdGFJbmRleCwgZXhwYW5kZWQ6IGV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8dHIgbWF0LXJvd1xyXG4gICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ010eEdyaWRFeHBhbnNpb25Db2x1bW5EZWYnXTsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtdHgtZ3JpZC1leHBhbnNpb24nLCBleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ11cIj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICA8IS0tIFRPRE86IFVzZSBmbGV4Ym94LWJhc2VkIG1hdC10YWJsZSAtLT5cclxuICAgICAgPHRhYmxlIG1hdC10YWJsZSAqbmdJZj1cImNvbHVtblJlc2l6YWJsZVwiXHJcbiAgICAgICAgICAgICBjb2x1bW5SZXNpemVcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLWhvdmVyJzogcm93SG92ZXIsICdtYXQtdGFibGUtc3RyaXBlZCc6IHJvd1N0cmlwZWQsICdtYXQtdGFibGUtZXhwYW5kYWJsZSc6IGV4cGFuZGFibGV9XCJcclxuICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cImV4cGFuZGFibGVcIlxyXG4gICAgICAgICAgICAgbWF0U29ydFxyXG4gICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwic29ydEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcclxuICAgICAgICAgICAgIFttYXRTb3J0RGlzYWJsZUNsZWFyXT1cInNvcnREaXNhYmxlQ2xlYXJcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnREaXNhYmxlZF09XCJzb3J0RGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgW21hdFNvcnRTdGFydF09XCJzb3J0U3RhcnRcIlxyXG4gICAgICAgICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwiX29uU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd1NlbGVjdGFibGUgJiYgIWhpZGVSb3dTZWxlY3Rpb25DaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJNdHhHcmlkQ2hlY2tib3hDb2x1bW5EZWZcIj5cclxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtdHgtZ3JpZC1jaGVja2JveC1jZWxsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJtdWx0aVNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIF9pc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFfaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IF90b2dnbGVNYXN0ZXJDaGVja2JveCgpIDogbnVsbFwiPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDtcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwiIShyb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuaGlkZUNoZWNrYm94ICYmIHJvd1NlbGVjdGlvbkZvcm1hdHRlci5oaWRlQ2hlY2tib3gocm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd1NlbGVjdGlvbkZvcm1hdHRlci5kaXNhYmxlZCAmJiByb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQocm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3dTZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IF90b2dnbGVOb3JtYWxDaGVja2JveChyb3cpIDogbnVsbFwiPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPjwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zO1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGlja3ldPVwiY29sLnBpbm5lZD09PSdsZWZ0J1wiIFtzdGlja3lFbmRdPVwiY29sLnBpbm5lZD09PSdyaWdodCdcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbCB8IGNvbENsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbWF0LXRhYmxlLXN0aWNreS1sZWZ0JzogY29sLnBpbm5lZCA9PT0gJ2xlZnQnLCAnbWF0LXRhYmxlLXN0aWNreS1yaWdodCc6IGNvbC5waW5uZWQgPT09ICdyaWdodCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIlxyXG4gICAgICAgICAgICAgICAgW3Jlc2l6YWJsZV09XCJjb2wucmVzaXphYmxlXCJcclxuICAgICAgICAgICAgICAgIFttYXRSZXNpemFibGVNaW5XaWR0aFB4XT1cImNvbC5taW5XaWR0aFwiIFttYXRSZXNpemFibGVNYXhXaWR0aFB4XT1cImNvbC5tYXhXaWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtaGVhZGVyLWNlbGwtaW5uZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJoZWFkZXJUZW1wbGF0ZSB8IGlzVGVtcGxhdGVSZWZcIiBbbmdJZkVsc2VdPVwiaGVhZGVyVHBsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGhlYWRlclRlbXBsYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaGVhZGVyVHBsPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSk/Lltjb2wuZmllbGRdIHwgaXNUZW1wbGF0ZVJlZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwiZGVmYXVsdEhlYWRlclRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGhlYWRlclRlbXBsYXRlKVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlclRwbD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBbbWF0LXNvcnQtaGVhZGVyXT1cImNvbC5zb3J0UHJvcD8uaWQgfHwgY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbC5zb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVDbGVhcl09XCJjb2wuc29ydFByb3A/LmRpc2FibGVDbGVhciA/PyBzb3J0RGlzYWJsZUNsZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbYXJyb3dQb3NpdGlvbl09XCJjb2wuc29ydFByb3A/LmFycm93UG9zaXRpb24hXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbc3RhcnRdPVwiY29sLnNvcnRQcm9wPy5zdGFydCFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1wbGFjZWhvbGRlclwiICpuZ0lmPVwiY29sLnNob3dFeHBhbmRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjb2wuaGVhZGVyIHwgdG9PYnNlcnZhYmxlIHwgYXN5bmN9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwibXR4LWdyaWQtaWNvbiBtYXQtc29ydC1oZWFkZXItaWNvblwiICpuZ0lmPVwiY29sLnNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGU9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLDEzSDE1VjExSDNNMyw2VjhIMjFWNk0zLDE4SDlWMTZIM1YxOFpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyRXh0cmFUcGxCYXNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaGVhZGVyRXh0cmFUZW1wbGF0ZSwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4O1wiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sIHwgY29sQ2xhc3M6IHJvdzogcm93Q2hhbmdlUmVjb3JkIDpyb3dDaGFuZ2VSZWNvcmQ/LmN1cnJlbnRWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3ktbGVmdCc6IGNvbC5waW5uZWQgPT09ICdsZWZ0JywgJ21hdC10YWJsZS1zdGlja3ktcmlnaHQnOiBjb2wucGlubmVkID09PSAncmlnaHQnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogY29sLndpZHRoLCAnbGVmdCc6IGNvbC5sZWZ0LCAncmlnaHQnOiBjb2wucmlnaHR9XCJcclxuICAgICAgICAgICAgICAgIG10eC1ncmlkLXNlbGVjdGFibGUtY2VsbCAoY2VsbFNlbGVjdGlvbkNoYW5nZSk9XCJfc2VsZWN0Q2VsbCgkZXZlbnQsIHJvdywgY29sKVwiPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjZWxsVGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmXCIgW25nSWZFbHNlXT1cImNlbGxUcGxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGNlbGxUZW1wbGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCByb3dEYXRhOiByb3csIGluZGV4OiBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCksIGNvbERlZjogY29sIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGxUcGw+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiJGFueShjZWxsVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0lmRWxzZV09XCJjb2xEZWZDZWxsVHBsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGNlbGxUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb2xEZWZDZWxsVHBsPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImNvbC5jZWxsVGVtcGxhdGVcIiBbbmdJZkVsc2VdPVwiZGVmYXVsdENlbGxUcGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbC5jZWxsVGVtcGxhdGUhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbFRwbD5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtdHgtZ3JpZC1yb3ctZXhwYW5kLWJ1dHRvblwiICpuZ0lmPVwiY29sLnNob3dFeHBhbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gbXR4LWdyaWQtZXhwYW5zaW9uLXRvZ2dsZSB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhvcGVuZWQpXT1cImV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUNoYW5nZSk9XCJfb25FeHBhbnNpb25DaGFuZ2UoJGV2ZW50LCByb3csIGNvbCwgZGF0YUluZGV4KTtcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm10eC1ncmlkLWljb24gbXR4LWdyaWQtcm93LWV4cGFuZC1pY29uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmb2N1c2FibGU9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxtdHgtZ3JpZC1jZWxsIFtyb3dEYXRhXT1cInJvd1wiIFtjb2xEZWZdPVwiY29sXCIgW3BsYWNlaG9sZGVyXT1cImVtcHR5VmFsdWVQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm93RGF0YUNoYW5nZSk9XCJfb25Sb3dEYXRhQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDwvbXR4LWdyaWQtY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXQtdGFibGUtc3RpY2t5LWxlZnQnOiBjb2wucGlubmVkID09PSAnbGVmdCcsICdtYXQtdGFibGUtc3RpY2t5LXJpZ2h0JzogY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J31cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXR4LWdyaWQtZXhwYW5zaW9uLXBsYWNlaG9sZGVyXCIgKm5nSWY9XCJjb2wuc2hvd0V4cGFuZFwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInN1bW1hcnlUZW1wbGF0ZSB8IGlzVGVtcGxhdGVSZWZcIiBbbmdJZkVsc2VdPVwic3VtbWFyeVRwbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sLCBkYXRhOiBkYXRhIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1bW1hcnlUcGw+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiJGFueShzdW1tYXJ5VGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0lmRWxzZV09XCJkZWZhdWx0U3VtbWFyeVRwbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShzdW1tYXJ5VGVtcGxhdGUpW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBfZ2V0Q29sRGF0YShkYXRhLCBjb2wpLCBjb2xEYXRhOiBfZ2V0Q29sRGF0YShkYXRhLCBjb2wpLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U3VtbWFyeVRwbD5cclxuICAgICAgICAgICAgICAgIDxtdHgtZ3JpZC1jZWxsIFtzdW1tYXJ5XT1cInRydWVcIiBbZGF0YV09XCJkYXRhXCIgW2NvbERlZl09XCJjb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVtcHR5VmFsdWVQbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgPC9tdHgtZ3JpZC1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInVzZUNvbnRlbnRIZWFkZXJSb3dUZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0SGVhZGVyUm93VHBsXCI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXJSb3dUcGw+XHJcbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInVzZUNvbnRlbnRSb3dUZW1wbGF0ZVwiIFtuZ0lmRWxzZV09XCJkZWZhdWx0Um93VHBsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSb3dUcGw+XHJcbiAgICAgICAgICA8dHIgbWF0LXJvd1xyXG4gICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxyXG4gICAgICAgICAgICAgIFtjbGFzc109XCJyb3cgfCByb3dDbGFzczogaW5kZXg6IGRhdGFJbmRleDogcm93Q2xhc3NGb3JtYXR0ZXJcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQnOiByb3dTZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpfVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIl9zZWxlY3RSb3coJGV2ZW50LCByb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSlcIj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIl93aGV0aGVyU2hvd1N1bW1hcnlcIj5cclxuICAgICAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ1c2VDb250ZW50Rm9vdGVyUm93VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhwYW5kYWJsZVwiPlxyXG4gICAgICAgICAgPCEtLSBFeHBhbmRlZCBDb250ZW50IENvbHVtbiAtIFRoZSBleHBhbmRhYmxlIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiTXR4R3JpZEV4cGFuc2lvbkNvbHVtbkRlZlwiPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4XCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiZGlzcGxheWVkQ29sdW1ucy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtZXhwYW5zaW9uLWRldGFpbFwiXHJcbiAgICAgICAgICAgICAgICAgICBbQGV4cGFuc2lvbl09XCJleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImV4cGFuc2lvblRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogZGF0YUluZGV4LCBleHBhbmRlZDogZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDx0ciBtYXQtcm93XHJcbiAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnTXR4R3JpZEV4cGFuc2lvbkNvbHVtbkRlZiddOyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ210eC1ncmlkLWV4cGFuc2lvbicsIGV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXVwiPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gTm8gcmVzdWx0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLW5vLXJlc3VsdFwiICpuZ0lmPVwiX2hhc05vUmVzdWx0XCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJub1Jlc3VsdFRlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHROb1Jlc3VsdFRwbFwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJub1Jlc3VsdFRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Tm9SZXN1bHRUcGw+e3tub1Jlc3VsdFRleHR9fTwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBUb29sIHNpZGViYXIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLXNpZGViYXJcIiAqbmdJZj1cInNob3dTaWRlYmFyXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic2lkZWJhclRlbXBsYXRlXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJzaWRlYmFyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibXR4LWdyaWQtZm9vdGVyXCI+XHJcbiAgPCEtLSBTdGF0dXMgQmFyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1zdGF0dXNiYXJcIiAqbmdJZj1cInNob3dTdGF0dXNiYXJcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzdGF0dXNiYXJUZW1wbGF0ZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RhdHVzYmFyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBQYWdpbmF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1wYWdpbmF0aW9uXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwicGFnaW5hdGlvblRlbXBsYXRlXCIgW25nSWZFbHNlXT1cImRlZmF1bHRQYWdpbmF0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhZ2luYXRpb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UGFnaW5hdGlvblRlbXBsYXRlPlxyXG4gICAgICA8bWF0LXBhZ2luYXRvciBbY2xhc3MubWF0LXBhZ2luYXRvci1oaWRkZW5dPVwiIXNob3dQYWdpbmF0b3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwic2hvd0ZpcnN0TGFzdEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbGVuZ3RoXT1cImxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbaGlkZVBhZ2VTaXplXT1cImhpZGVQYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChwYWdlKT1cIl9vblBhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwYWdlRGlzYWJsZWRcIj5cclxuICAgICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIEhlYWRlciB0ZW1wbGF0ZSBmb3IgZXh0cmEgY29udGVudCAtLT5cclxuPG5nLXRlbXBsYXRlICNoZWFkZXJFeHRyYVRwbEJhc2UgbGV0LWhlYWRlckV4dHJhVGVtcGxhdGUgbGV0LWNvbD1cImNvbERlZlwiPlxyXG4gIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJoZWFkZXJFeHRyYVRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZlwiIFtuZ0lmRWxzZV09XCJoZWFkZXJFeHRyYVRwbFwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlckV4dHJhVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCB9XCI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPG5nLXRlbXBsYXRlICNoZWFkZXJFeHRyYVRwbD5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIkYW55KGhlYWRlckV4dHJhVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWZcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlckV4dHJhVGVtcGxhdGVbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=