spiderly 0.0.2

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 (302) hide show
  1. package/README.md +3 -0
  2. package/esm2022/lib/components/auth/auth.module.mjs +65 -0
  3. package/esm2022/lib/components/auth/login/login.component.mjs +60 -0
  4. package/esm2022/lib/components/auth/partials/auth.component.mjs +53 -0
  5. package/esm2022/lib/components/auth/partials/login-verification.component.mjs +39 -0
  6. package/esm2022/lib/components/auth/partials/registration-verification.component.mjs +37 -0
  7. package/esm2022/lib/components/auth/partials/verification-wrapper.component.mjs +74 -0
  8. package/esm2022/lib/components/auth/registration/registration.component.mjs +59 -0
  9. package/esm2022/lib/components/base-details/role-base-details.component.mjs +171 -0
  10. package/esm2022/lib/components/base-form/base-form copy.mjs +247 -0
  11. package/esm2022/lib/components/card-skeleton/card-skeleton.component.mjs +25 -0
  12. package/esm2022/lib/components/footer/footer.component.mjs +16 -0
  13. package/esm2022/lib/components/index-card/index-card.component.mjs +57 -0
  14. package/esm2022/lib/components/info-card/info-card.component.mjs +29 -0
  15. package/esm2022/lib/components/layout/layout-base.component.mjs +120 -0
  16. package/esm2022/lib/components/layout/sidebar/menuitem.component.mjs +161 -0
  17. package/esm2022/lib/components/layout/sidebar/sidebar-menu.component.mjs +34 -0
  18. package/esm2022/lib/components/layout/sidebar/sidebar-menu.service.mjs +26 -0
  19. package/esm2022/lib/components/layout/sidebar/sidebar.component.mjs +21 -0
  20. package/esm2022/lib/components/layout/topbar/topbar.component.mjs +115 -0
  21. package/esm2022/lib/components/not-found/not-found.component.mjs +20 -0
  22. package/esm2022/lib/components/required/required.component.mjs +12 -0
  23. package/esm2022/lib/components/spiderly-buttons/google-button/google-button.component.mjs +43 -0
  24. package/esm2022/lib/components/spiderly-buttons/return-button/return-button.component.mjs +37 -0
  25. package/esm2022/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.mjs +20 -0
  26. package/esm2022/lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base.mjs +68 -0
  27. package/esm2022/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.mjs +22 -0
  28. package/esm2022/lib/components/spiderly-data-table/spiderly-data-table.component.mjs +502 -0
  29. package/esm2022/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.mjs +42 -0
  30. package/esm2022/lib/components/spiderly-form-control/spiderly-form-control.mjs +36 -0
  31. package/esm2022/lib/components/spiderly-panels/panel-body/panel-body.component.mjs +19 -0
  32. package/esm2022/lib/components/spiderly-panels/panel-footer/panel-footer.component.mjs +14 -0
  33. package/esm2022/lib/components/spiderly-panels/panel-header/panel-header.component.mjs +49 -0
  34. package/esm2022/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.mjs +20 -0
  35. package/esm2022/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.mjs +63 -0
  36. package/esm2022/lib/components/spiderly-panels/spiderly-panels.module.mjs +49 -0
  37. package/esm2022/lib/controls/base-autocomplete-control.mjs +18 -0
  38. package/esm2022/lib/controls/base-control.mjs +62 -0
  39. package/esm2022/lib/controls/base-dropdown-control.mjs +37 -0
  40. package/esm2022/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.mjs +60 -0
  41. package/esm2022/lib/controls/spiderly-calendar/spiderly-calendar.component.mjs +39 -0
  42. package/esm2022/lib/controls/spiderly-checkbox/spiderly-checkbox.component.mjs +45 -0
  43. package/esm2022/lib/controls/spiderly-colorpick/spiderly-colorpick.component.mjs +40 -0
  44. package/esm2022/lib/controls/spiderly-controls.module.mjs +112 -0
  45. package/esm2022/lib/controls/spiderly-dropdown/spiderly-dropdown.component.mjs +40 -0
  46. package/esm2022/lib/controls/spiderly-editor/spiderly-editor.component.mjs +59 -0
  47. package/esm2022/lib/controls/spiderly-file/spiderly-file.component.mjs +106 -0
  48. package/esm2022/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.mjs +38 -0
  49. package/esm2022/lib/controls/spiderly-multiselect/spiderly-multiselect.component.mjs +34 -0
  50. package/esm2022/lib/controls/spiderly-number/spiderly-number.component.mjs +44 -0
  51. package/esm2022/lib/controls/spiderly-password/spiderly-password.component.mjs +37 -0
  52. package/esm2022/lib/controls/spiderly-textarea/spiderly-textarea.component.mjs +34 -0
  53. package/esm2022/lib/controls/spiderly-textbox/spiderly-textbox.component.mjs +45 -0
  54. package/esm2022/lib/entities/base-entity.mjs +18 -0
  55. package/esm2022/lib/entities/codebook.mjs +10 -0
  56. package/esm2022/lib/entities/init-company-auth-dialog-details.mjs +9 -0
  57. package/esm2022/lib/entities/init-top-bar-data.mjs +12 -0
  58. package/esm2022/lib/entities/is-authorized-for-save-event.mjs +9 -0
  59. package/esm2022/lib/entities/last-menu-icon-index-clicked.mjs +8 -0
  60. package/esm2022/lib/entities/lazy-load-selected-ids-result.mjs +11 -0
  61. package/esm2022/lib/entities/menuchangeevent.mjs +3 -0
  62. package/esm2022/lib/entities/mime-type.mjs +15 -0
  63. package/esm2022/lib/entities/namebook.mjs +9 -0
  64. package/esm2022/lib/entities/primeng-option.mjs +9 -0
  65. package/esm2022/lib/entities/security-entities.mjs +169 -0
  66. package/esm2022/lib/entities/simple-save-result.mjs +9 -0
  67. package/esm2022/lib/entities/spiderly-button.mjs +11 -0
  68. package/esm2022/lib/entities/table-filter-context.mjs +3 -0
  69. package/esm2022/lib/entities/table-filter-sort-meta.mjs +3 -0
  70. package/esm2022/lib/entities/table-filter.mjs +15 -0
  71. package/esm2022/lib/entities/table-response.mjs +3 -0
  72. package/esm2022/lib/enums/security-enums.mjs +26 -0
  73. package/esm2022/lib/enums/verification-type-codes.mjs +6 -0
  74. package/esm2022/lib/guards/auth.guard.mjs +40 -0
  75. package/esm2022/lib/guards/not-auth.guard.mjs +32 -0
  76. package/esm2022/lib/handlers/spiderly-error-handler.mjs +30 -0
  77. package/esm2022/lib/handlers/spiderly-transloco-fallback-strategy.mjs +24 -0
  78. package/esm2022/lib/interceptors/http-loading.interceptor.mjs +27 -0
  79. package/esm2022/lib/interceptors/json-parser.interceptor.mjs +47 -0
  80. package/esm2022/lib/interceptors/jwt.interceptor.mjs +27 -0
  81. package/esm2022/lib/interceptors/unauthorized.interceptor.mjs +64 -0
  82. package/esm2022/lib/modules/core.module.mjs +140 -0
  83. package/esm2022/lib/modules/primeng.module.mjs +278 -0
  84. package/esm2022/lib/modules/spiderly-transloco.module.mjs +44 -0
  85. package/esm2022/lib/services/api.service.security.mjs +86 -0
  86. package/esm2022/lib/services/app-initializer.mjs +6 -0
  87. package/esm2022/lib/services/app-layout-base.service.mjs +132 -0
  88. package/esm2022/lib/services/auth-base.service.mjs +220 -0
  89. package/esm2022/lib/services/base-form.service.mjs +124 -0
  90. package/esm2022/lib/services/config-base.service.mjs +33 -0
  91. package/esm2022/lib/services/helper-functions.mjs +229 -0
  92. package/esm2022/lib/services/spiderly-message.service.mjs +64 -0
  93. package/esm2022/lib/services/spiderly-transloco-loader.mjs +20 -0
  94. package/esm2022/lib/services/translate-labels-abstract.service.mjs +15 -0
  95. package/esm2022/lib/services/validator-abstract.service.mjs +51 -0
  96. package/esm2022/public-api.mjs +94 -0
  97. package/esm2022/spiderly.mjs +5 -0
  98. package/fesm2022/spiderly.mjs +4807 -0
  99. package/fesm2022/spiderly.mjs.map +1 -0
  100. package/index.d.ts +5 -0
  101. package/lib/components/auth/auth.module.d.ts +17 -0
  102. package/lib/components/auth/login/login.component.d.ts +35 -0
  103. package/lib/components/auth/partials/auth.component.d.ts +21 -0
  104. package/lib/components/auth/partials/login-verification.component.d.ts +18 -0
  105. package/lib/components/auth/partials/registration-verification.component.d.ts +17 -0
  106. package/lib/components/auth/partials/verification-wrapper.component.d.ts +31 -0
  107. package/lib/components/auth/registration/registration.component.d.ts +34 -0
  108. package/lib/components/base-details/role-base-details.component.d.ts +50 -0
  109. package/lib/components/base-form/base-form copy.d.ts +54 -0
  110. package/lib/components/card-skeleton/card-skeleton.component.d.ts +12 -0
  111. package/lib/components/footer/footer.component.d.ts +9 -0
  112. package/lib/components/index-card/index-card.component.d.ts +22 -0
  113. package/lib/components/info-card/info-card.component.d.ts +11 -0
  114. package/lib/components/layout/layout-base.component.d.ts +37 -0
  115. package/lib/components/layout/sidebar/menuitem.component.d.ts +43 -0
  116. package/lib/components/layout/sidebar/sidebar-menu.component.d.ts +23 -0
  117. package/lib/components/layout/sidebar/sidebar-menu.service.d.ts +12 -0
  118. package/lib/components/layout/sidebar/sidebar.component.d.ts +11 -0
  119. package/lib/components/layout/topbar/topbar.component.d.ts +45 -0
  120. package/lib/components/not-found/not-found.component.d.ts +9 -0
  121. package/lib/components/required/required.component.d.ts +6 -0
  122. package/lib/components/spiderly-buttons/google-button/google-button.component.d.ts +17 -0
  123. package/lib/components/spiderly-buttons/return-button/return-button.component.d.ts +10 -0
  124. package/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.d.ts +6 -0
  125. package/lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base.d.ts +27 -0
  126. package/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.d.ts +8 -0
  127. package/lib/components/spiderly-data-table/spiderly-data-table.component.d.ts +157 -0
  128. package/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.d.ts +11 -0
  129. package/lib/components/spiderly-form-control/spiderly-form-control.d.ts +37 -0
  130. package/lib/components/spiderly-panels/panel-body/panel-body.component.d.ts +9 -0
  131. package/lib/components/spiderly-panels/panel-footer/panel-footer.component.d.ts +8 -0
  132. package/lib/components/spiderly-panels/panel-header/panel-header.component.d.ts +29 -0
  133. package/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.d.ts +10 -0
  134. package/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.d.ts +25 -0
  135. package/lib/components/spiderly-panels/spiderly-panels.module.d.ts +13 -0
  136. package/lib/controls/base-autocomplete-control.d.ts +9 -0
  137. package/lib/controls/base-control.d.ts +23 -0
  138. package/lib/controls/base-dropdown-control.d.ts +18 -0
  139. package/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.d.ts +18 -0
  140. package/lib/controls/spiderly-calendar/spiderly-calendar.component.d.ts +13 -0
  141. package/lib/controls/spiderly-checkbox/spiderly-checkbox.component.d.ts +14 -0
  142. package/lib/controls/spiderly-colorpick/spiderly-colorpick.component.d.ts +11 -0
  143. package/lib/controls/spiderly-controls.module.d.ts +22 -0
  144. package/lib/controls/spiderly-dropdown/spiderly-dropdown.component.d.ts +14 -0
  145. package/lib/controls/spiderly-editor/spiderly-editor.component.d.ts +16 -0
  146. package/lib/controls/spiderly-file/spiderly-file.component.d.ts +36 -0
  147. package/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.d.ts +13 -0
  148. package/lib/controls/spiderly-multiselect/spiderly-multiselect.component.d.ts +11 -0
  149. package/lib/controls/spiderly-number/spiderly-number.component.d.ts +15 -0
  150. package/lib/controls/spiderly-password/spiderly-password.component.d.ts +12 -0
  151. package/lib/controls/spiderly-textarea/spiderly-textarea.component.d.ts +11 -0
  152. package/lib/controls/spiderly-textbox/spiderly-textbox.component.d.ts +15 -0
  153. package/lib/entities/base-entity.d.ts +14 -0
  154. package/lib/entities/codebook.d.ts +9 -0
  155. package/lib/entities/init-company-auth-dialog-details.d.ts +9 -0
  156. package/lib/entities/init-top-bar-data.d.ts +16 -0
  157. package/lib/entities/is-authorized-for-save-event.d.ts +9 -0
  158. package/lib/entities/last-menu-icon-index-clicked.d.ts +7 -0
  159. package/lib/entities/lazy-load-selected-ids-result.d.ts +9 -0
  160. package/lib/entities/menuchangeevent.d.ts +4 -0
  161. package/lib/entities/mime-type.d.ts +11 -0
  162. package/lib/entities/namebook.d.ts +9 -0
  163. package/lib/entities/primeng-option.d.ts +9 -0
  164. package/lib/entities/security-entities.d.ts +211 -0
  165. package/lib/entities/simple-save-result.d.ts +7 -0
  166. package/lib/entities/spiderly-button.d.ts +13 -0
  167. package/lib/entities/table-filter-context.d.ts +5 -0
  168. package/lib/entities/table-filter-sort-meta.d.ts +4 -0
  169. package/lib/entities/table-filter.d.ts +23 -0
  170. package/lib/entities/table-response.d.ts +4 -0
  171. package/lib/enums/security-enums.d.ts +22 -0
  172. package/lib/enums/verification-type-codes.d.ts +4 -0
  173. package/lib/guards/auth.guard.d.ts +15 -0
  174. package/lib/guards/not-auth.guard.d.ts +12 -0
  175. package/lib/handlers/spiderly-error-handler.d.ts +14 -0
  176. package/lib/handlers/spiderly-transloco-fallback-strategy.d.ts +13 -0
  177. package/lib/interceptors/http-loading.interceptor.d.ts +11 -0
  178. package/lib/interceptors/json-parser.interceptor.d.ts +11 -0
  179. package/lib/interceptors/jwt.interceptor.d.ts +11 -0
  180. package/lib/interceptors/unauthorized.interceptor.d.ts +16 -0
  181. package/lib/modules/core.module.d.ts +13 -0
  182. package/lib/modules/primeng.module.d.ts +42 -0
  183. package/lib/modules/spiderly-transloco.module.d.ts +9 -0
  184. package/lib/services/api.service.security.d.ts +35 -0
  185. package/lib/services/app-initializer.d.ts +4 -0
  186. package/lib/services/app-layout-base.service.d.ts +60 -0
  187. package/lib/services/auth-base.service.d.ts +55 -0
  188. package/lib/services/base-form.service.d.ts +27 -0
  189. package/lib/services/config-base.service.d.ts +24 -0
  190. package/lib/services/helper-functions.d.ts +37 -0
  191. package/lib/services/spiderly-message.service.d.ts +17 -0
  192. package/lib/services/spiderly-transloco-loader.d.ts +10 -0
  193. package/lib/services/translate-labels-abstract.service.d.ts +7 -0
  194. package/lib/services/validator-abstract.service.d.ts +13 -0
  195. package/package.json +60 -0
  196. package/public-api.d.ts +90 -0
  197. package/styles/components/spiderly-data-table/spiderly-data-table.component.scss +34 -0
  198. package/styles/components/spiderly-panels/panel-footer/panel-footer.component.scss +10 -0
  199. package/styles/styles/layout/_config.scss +42 -0
  200. package/styles/styles/layout/_content.scss +12 -0
  201. package/styles/styles/layout/_footer.scss +9 -0
  202. package/styles/styles/layout/_main.scss +28 -0
  203. package/styles/styles/layout/_menu.scss +135 -0
  204. package/styles/styles/layout/_mixins.scss +13 -0
  205. package/styles/styles/layout/_preloading.scss +47 -0
  206. package/styles/styles/layout/_responsive.scss +100 -0
  207. package/styles/styles/layout/_spiderly-controls.scss +12 -0
  208. package/styles/styles/layout/_topbar.scss +231 -0
  209. package/styles/styles/layout/_typography.scss +63 -0
  210. package/styles/styles/layout/_utils.scss +20 -0
  211. package/styles/styles/layout/_variables.scss +903 -0
  212. package/styles/styles/layout/layout.scss +13 -0
  213. package/styles/styles/shared.scss +519 -0
  214. package/styles/styles/styles.scss +6 -0
  215. package/styles/styles/theme/base/_colors.scss +18 -0
  216. package/styles/styles/theme/base/_common.scss +75 -0
  217. package/styles/styles/theme/base/_components.scss +106 -0
  218. package/styles/styles/theme/base/_mixins.scss +343 -0
  219. package/styles/styles/theme/base/components/button/_button.scss +564 -0
  220. package/styles/styles/theme/base/components/button/_speeddial.scss +96 -0
  221. package/styles/styles/theme/base/components/button/_splitbutton.scss +381 -0
  222. package/styles/styles/theme/base/components/data/_carousel.scss +37 -0
  223. package/styles/styles/theme/base/components/data/_datatable.scss +338 -0
  224. package/styles/styles/theme/base/components/data/_dataview.scss +55 -0
  225. package/styles/styles/theme/base/components/data/_filter.scss +138 -0
  226. package/styles/styles/theme/base/components/data/_orderlist.scss +103 -0
  227. package/styles/styles/theme/base/components/data/_organizationchart.scss +50 -0
  228. package/styles/styles/theme/base/components/data/_paginator.scss +92 -0
  229. package/styles/styles/theme/base/components/data/_picklist.scss +103 -0
  230. package/styles/styles/theme/base/components/data/_timeline.scss +81 -0
  231. package/styles/styles/theme/base/components/data/_tree.scss +149 -0
  232. package/styles/styles/theme/base/components/data/_treetable.scss +256 -0
  233. package/styles/styles/theme/base/components/data/_virtualscroller.scss +28 -0
  234. package/styles/styles/theme/base/components/file/_fileupload.scss +64 -0
  235. package/styles/styles/theme/base/components/input/_autocomplete.scss +118 -0
  236. package/styles/styles/theme/base/components/input/_calendar.scss +263 -0
  237. package/styles/styles/theme/base/components/input/_cascadeselect.scss +130 -0
  238. package/styles/styles/theme/base/components/input/_checkbox.scss +90 -0
  239. package/styles/styles/theme/base/components/input/_chips.scss +55 -0
  240. package/styles/styles/theme/base/components/input/_colorpicker.scss +26 -0
  241. package/styles/styles/theme/base/components/input/_dropdown.scss +152 -0
  242. package/styles/styles/theme/base/components/input/_editor.scss +122 -0
  243. package/styles/styles/theme/base/components/input/_inputgroup.scss +75 -0
  244. package/styles/styles/theme/base/components/input/_inputmask.scss +16 -0
  245. package/styles/styles/theme/base/components/input/_inputnumber.scss +28 -0
  246. package/styles/styles/theme/base/components/input/_inputswitch.scss +60 -0
  247. package/styles/styles/theme/base/components/input/_inputtext.scss +100 -0
  248. package/styles/styles/theme/base/components/input/_listbox.scss +82 -0
  249. package/styles/styles/theme/base/components/input/_multiselect.scss +173 -0
  250. package/styles/styles/theme/base/components/input/_password.scss +52 -0
  251. package/styles/styles/theme/base/components/input/_radiobutton.scss +78 -0
  252. package/styles/styles/theme/base/components/input/_rating.scss +55 -0
  253. package/styles/styles/theme/base/components/input/_selectbutton.scss +50 -0
  254. package/styles/styles/theme/base/components/input/_slider.scss +71 -0
  255. package/styles/styles/theme/base/components/input/_togglebutton.scss +48 -0
  256. package/styles/styles/theme/base/components/input/_treeselect.scss +139 -0
  257. package/styles/styles/theme/base/components/menu/_breadcrumb.scss +42 -0
  258. package/styles/styles/theme/base/components/menu/_contextmenu.scss +39 -0
  259. package/styles/styles/theme/base/components/menu/_dock.scss +95 -0
  260. package/styles/styles/theme/base/components/menu/_megamenu.scss +55 -0
  261. package/styles/styles/theme/base/components/menu/_menu.scss +37 -0
  262. package/styles/styles/theme/base/components/menu/_menubar.scss +141 -0
  263. package/styles/styles/theme/base/components/menu/_panelmenu.scss +153 -0
  264. package/styles/styles/theme/base/components/menu/_slidemenu.scss +59 -0
  265. package/styles/styles/theme/base/components/menu/_steps.scss +56 -0
  266. package/styles/styles/theme/base/components/menu/_tabmenu.scss +74 -0
  267. package/styles/styles/theme/base/components/menu/_tieredmenu.scss +43 -0
  268. package/styles/styles/theme/base/components/messages/_inlinemessage.scss +69 -0
  269. package/styles/styles/theme/base/components/messages/_message.scss +107 -0
  270. package/styles/styles/theme/base/components/messages/_toast.scss +103 -0
  271. package/styles/styles/theme/base/components/misc/_avatar.scss +30 -0
  272. package/styles/styles/theme/base/components/misc/_badge.scss +48 -0
  273. package/styles/styles/theme/base/components/misc/_blockui.scss +0 -0
  274. package/styles/styles/theme/base/components/misc/_chip.scss +42 -0
  275. package/styles/styles/theme/base/components/misc/_inplace.scss +17 -0
  276. package/styles/styles/theme/base/components/misc/_progressbar.scss +17 -0
  277. package/styles/styles/theme/base/components/misc/_scrolltop.scss +25 -0
  278. package/styles/styles/theme/base/components/misc/_skeleton.scss +8 -0
  279. package/styles/styles/theme/base/components/misc/_tag.scss +40 -0
  280. package/styles/styles/theme/base/components/misc/_terminal.scss +12 -0
  281. package/styles/styles/theme/base/components/multimedia/_galleria.scss +155 -0
  282. package/styles/styles/theme/base/components/multimedia/_image.scss +49 -0
  283. package/styles/styles/theme/base/components/overlay/_confirmpopup.scss +72 -0
  284. package/styles/styles/theme/base/components/overlay/_dialog.scss +73 -0
  285. package/styles/styles/theme/base/components/overlay/_overlaypanel.scss +64 -0
  286. package/styles/styles/theme/base/components/overlay/_sidebar.scss +27 -0
  287. package/styles/styles/theme/base/components/overlay/_tooltip.scss +33 -0
  288. package/styles/styles/theme/base/components/panel/_accordion.scss +119 -0
  289. package/styles/styles/theme/base/components/panel/_card.scss +30 -0
  290. package/styles/styles/theme/base/components/panel/_divider.scss +31 -0
  291. package/styles/styles/theme/base/components/panel/_fieldset.scss +47 -0
  292. package/styles/styles/theme/base/components/panel/_panel.scss +58 -0
  293. package/styles/styles/theme/base/components/panel/_scrollpanel.scss +6 -0
  294. package/styles/styles/theme/base/components/panel/_splitter.scss +19 -0
  295. package/styles/styles/theme/base/components/panel/_tabview.scss +82 -0
  296. package/styles/styles/theme/base/components/panel/_toolbar.scss +11 -0
  297. package/styles/styles/theme/saga/_extensions.scss +27 -0
  298. package/styles/styles/theme/saga/_variables.scss +1 -0
  299. package/styles/styles/theme/saga/saga-blue/_extensions.scss +2 -0
  300. package/styles/styles/theme/saga/saga-blue/_fonts.scss +1 -0
  301. package/styles/styles/theme/saga/saga-blue/_variables.scss +1 -0
  302. package/styles/styles/theme/saga/saga-blue/theme.scss +4 -0
@@ -0,0 +1,502 @@
1
+ import { Component, EventEmitter, Inject, Input, LOCALE_ID, Output, ViewChild } from '@angular/core';
2
+ import { SpiderlyDeleteConfirmationComponent } from '../spiderly-delete-dialog/spiderly-delete-confirmation.component';
3
+ import { CommonModule, formatDate } from '@angular/common';
4
+ import { FormsModule } from '@angular/forms';
5
+ import { firstValueFrom } from 'rxjs';
6
+ import { TranslocoDirective } from '@jsverse/transloco';
7
+ import { SpiderlyControlsModule } from '../../controls/spiderly-controls.module';
8
+ import { exportListToExcel } from '../../services/helper-functions';
9
+ import { PrimengModule } from '../../modules/primeng.module';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/router";
12
+ import * as i2 from "primeng/dynamicdialog";
13
+ import * as i3 from "../../services/spiderly-message.service";
14
+ import * as i4 from "@jsverse/transloco";
15
+ import * as i5 from "@angular/forms";
16
+ import * as i6 from "@angular/common";
17
+ import * as i7 from "primeng/table";
18
+ import * as i8 from "primeng/api";
19
+ import * as i9 from "primeng/button";
20
+ import * as i10 from "primeng/multiselect";
21
+ import * as i11 from "primeng/tooltip";
22
+ import * as i12 from "primeng/checkbox";
23
+ import * as i13 from "../spiderly-buttons/spiderly-button/spiderly-button.component";
24
+ import * as i14 from "../../controls/spiderly-number/spiderly-number.component";
25
+ export class SpiderlyDataTableComponent {
26
+ ;
27
+ constructor(router, dialogService, route, messageService, translocoService, locale) {
28
+ this.router = router;
29
+ this.dialogService = dialogService;
30
+ this.route = route;
31
+ this.messageService = messageService;
32
+ this.translocoService = translocoService;
33
+ this.locale = locale;
34
+ this.tableIcon = 'pi pi-list';
35
+ this.rows = 10;
36
+ this.showPaginator = true; // FT: Pass only when hasLazyLoad === false
37
+ this.showCardWrapper = true;
38
+ this.readonly = false;
39
+ this.onTotalRecordsChange = new EventEmitter();
40
+ this.loading = true;
41
+ this.newlySelectedItems = [];
42
+ this.fakeSelectedItems = []; // FT: Only for showing checkboxes, we will not send this to the backend
43
+ this.currentPageSelectedItemsFromDb = []; // FT: Made so we can add only newly selected items to the newlySelectedItems
44
+ this.unselectedItems = [];
45
+ this.onLazyLoad = new EventEmitter();
46
+ this.rowsSelectedNumber = 0;
47
+ this.isAllSelected = null;
48
+ this.fakeIsAllSelected = false; // FT: Only for showing checkboxes, we will not send this to the backend
49
+ this.isFirstTimeLazyLoad = true;
50
+ this.onIsAllSelectedChange = new EventEmitter();
51
+ this.matchModeDateOptions = [];
52
+ this.matchModeNumberOptions = [];
53
+ this.showAddButton = true;
54
+ this.showExportToExcelButton = true;
55
+ this.showReloadTableButton = false;
56
+ this.hasLazyLoad = true;
57
+ this.selectedItemIds = []; // FT: Pass only when hasLazyLoad === false, it's enough if the M2M association hasn't additional fields
58
+ this.selectedItems = []; // FT: Pass only when hasLazyLoad === false
59
+ this.onRowSelect = new EventEmitter();
60
+ this.onRowUnselect = new EventEmitter();
61
+ this.clientFilterCount = 0;
62
+ }
63
+ ngOnInit() {
64
+ this.matchModeDateOptions = [
65
+ { label: this.translocoService.translate('OnDate'), value: 'equals' },
66
+ { label: this.translocoService.translate('DatesBefore'), value: 'dateBefore' },
67
+ { label: this.translocoService.translate('DatesAfter'), value: 'dateAfter' },
68
+ ];
69
+ this.matchModeNumberOptions = [
70
+ { label: this.translocoService.translate('Equals'), value: 'equals' },
71
+ { label: this.translocoService.translate('MoreThan'), value: 'gte' },
72
+ { label: this.translocoService.translate('LessThan'), value: 'lte' },
73
+ ];
74
+ if (this.hasLazyLoad === false) {
75
+ this.clientLoad();
76
+ }
77
+ }
78
+ lazyLoad(event) {
79
+ this.lastLazyLoadEvent = event;
80
+ let tableFilter = event;
81
+ tableFilter.additionalFilterIdLong = this.additionalFilterIdLong;
82
+ this.onLazyLoad.next(tableFilter);
83
+ this.getTableDataObservableMethod(tableFilter).subscribe({
84
+ next: async (res) => {
85
+ this.items = res.data;
86
+ this.totalRecords = res.totalRecords;
87
+ this.onTotalRecordsChange.next(res.totalRecords);
88
+ if (this.selectedLazyLoadObservableMethod != null) {
89
+ let selectedRowsMethodResult = await firstValueFrom(this.selectedLazyLoadObservableMethod(tableFilter));
90
+ this.currentPageSelectedItemsFromDb = [...selectedRowsMethodResult.selectedIds];
91
+ if (this.isFirstTimeLazyLoad == true) {
92
+ this.rowsSelectedNumber = selectedRowsMethodResult.totalRecordsSelected;
93
+ this.setFakeIsAllSelected();
94
+ this.isFirstTimeLazyLoad = false;
95
+ }
96
+ if (this.isAllSelected == true) {
97
+ let idsToInsert = [...this.items.map(x => x.id)];
98
+ idsToInsert = idsToInsert.filter(x => this.unselectedItems.includes(x) == false);
99
+ this.fakeSelectedItems = [...idsToInsert]; // FT: Only for showing checkboxes, we will not send this to the backend
100
+ }
101
+ else if (this.isAllSelected == false) {
102
+ this.fakeSelectedItems = [...this.newlySelectedItems]; // FT: Only for showing checkboxes, we will not send this to the backend
103
+ }
104
+ else if (this.isAllSelected == null) {
105
+ let idsToInsert = [...selectedRowsMethodResult.selectedIds, ...this.newlySelectedItems];
106
+ idsToInsert = idsToInsert.filter(x => this.unselectedItems.includes(x) == false);
107
+ this.fakeSelectedItems = [...idsToInsert];
108
+ }
109
+ }
110
+ this.loading = false;
111
+ },
112
+ error: () => {
113
+ this.loading = false;
114
+ },
115
+ });
116
+ }
117
+ clientLoad() {
118
+ this.loading = false;
119
+ this.loadFormArrayItems();
120
+ this.totalRecords = this.items.length;
121
+ this.onTotalRecordsChange.next(this.items.length);
122
+ if (this.getAlreadySelectedItemIds) {
123
+ this.selectedItemIds = this.getAlreadySelectedItemIds(this.additionalIndexes);
124
+ }
125
+ if (this.getAlreadySelectedItems) {
126
+ this.selectedItems = this.getAlreadySelectedItems(this.additionalIndexes);
127
+ }
128
+ this.rowsSelectedNumber = this.selectedItemIds.length;
129
+ this.setFakeIsAllSelected();
130
+ }
131
+ filter(event) {
132
+ if (this.hasLazyLoad && this.selectionMode === 'multiple')
133
+ this.selectAll(false); // FT: We need to do it like this because: totalRecords: 1 -> selectedRecords from earlyer selection 2 -> unselect current -> all checkbox is set to true
134
+ if (this.hasLazyLoad === false && this.selectionMode === 'multiple') {
135
+ if (this.clientFilterCount === 0) {
136
+ this.loadFormArrayItems();
137
+ this.clientFilterCount++;
138
+ }
139
+ else {
140
+ this.clientFilterCount--;
141
+ }
142
+ }
143
+ }
144
+ loadFormArrayItems() {
145
+ this.items = this.getFormArrayItems(this.additionalIndexes);
146
+ this.items.forEach((item, index) => {
147
+ item.index = index;
148
+ });
149
+ }
150
+ getColHeaderWidth(filterType) {
151
+ switch (filterType) {
152
+ case 'text':
153
+ return 'min-width: 12rem;';
154
+ case 'date':
155
+ return 'min-width: 10rem;';
156
+ case 'multiselect':
157
+ return 'min-width: 12rem;';
158
+ case 'boolean':
159
+ return 'min-width: 8rem;';
160
+ case 'numeric':
161
+ return 'min-width: 12rem;';
162
+ default:
163
+ return 'width: 0rem;'; // fitting content of the row like this
164
+ }
165
+ }
166
+ getColMatchModeOptions(filterType) {
167
+ switch (filterType) {
168
+ case 'text':
169
+ return null;
170
+ case 'date':
171
+ return this.matchModeDateOptions;
172
+ case 'multiselect':
173
+ return null;
174
+ case 'boolean':
175
+ return null;
176
+ case 'numeric':
177
+ return this.matchModeNumberOptions;
178
+ default:
179
+ return null;
180
+ }
181
+ }
182
+ getColMatchMode(filterType) {
183
+ switch (filterType) {
184
+ case 'text':
185
+ return 'contains';
186
+ case 'date':
187
+ return null;
188
+ case 'multiselect':
189
+ return 'in';
190
+ case 'boolean':
191
+ return 'equals';
192
+ case 'numeric':
193
+ return null;
194
+ default:
195
+ return null;
196
+ }
197
+ }
198
+ isDropOrMulti(filterType) {
199
+ if (filterType == 'dropdown' || filterType == 'multiselect') {
200
+ return true;
201
+ }
202
+ else {
203
+ return false;
204
+ }
205
+ }
206
+ navigateToDetails(rowId) {
207
+ this.router.navigate([rowId], { relativeTo: this.route });
208
+ }
209
+ deleteObject(rowId) {
210
+ this.deleteRef = this.dialogService.open(SpiderlyDeleteConfirmationComponent, {
211
+ header: this.translocoService.translate('AreYouSure'),
212
+ width: '400px',
213
+ data: { deleteItemFromTableObservableMethod: this.deleteItemFromTableObservableMethod, id: rowId, }
214
+ });
215
+ this.deleteRef.onClose.subscribe((deletedSuccessfully) => {
216
+ if (deletedSuccessfully === true) {
217
+ this.messageService.successMessage(this.translocoService.translate('SuccessfullyDeletedMessage'));
218
+ this.reload();
219
+ }
220
+ });
221
+ }
222
+ reload() {
223
+ this.loading = true;
224
+ this.items = null;
225
+ this.lazyLoad(this.lastLazyLoadEvent);
226
+ }
227
+ showActions() {
228
+ return this.cols.some(x => x.actions?.length > 0);
229
+ }
230
+ getStyleForBodyColumn(col) {
231
+ switch (col.filterType) {
232
+ case 'numeric':
233
+ return 'text-align: right;';
234
+ default:
235
+ return null;
236
+ }
237
+ }
238
+ getClassForAction(action) {
239
+ switch (action.field) {
240
+ case 'Details':
241
+ return 'pi pi-pencil text-lg cursor-pointer primary-color';
242
+ case 'Delete':
243
+ return 'pi pi-trash text-lg text-red-500 cursor-pointer';
244
+ default:
245
+ return `${action.icon} ${action.style} text-lg cursor-pointer`;
246
+ }
247
+ }
248
+ getMethodForAction(action, rowData) {
249
+ switch (action.field) {
250
+ case 'Details':
251
+ return this.navigateToDetails(rowData.id);
252
+ case 'Delete':
253
+ return this.deleteObject(rowData.id);
254
+ default:
255
+ return action.onClick(rowData.id);
256
+ }
257
+ }
258
+ getRowData(rowData, col) {
259
+ switch (col.filterType) {
260
+ case 'text':
261
+ return rowData[col.field];
262
+ case 'date':
263
+ if (rowData[col.field] == null)
264
+ return null;
265
+ if (col.showTime)
266
+ return formatDate(rowData[col.field], 'dd.MM.yyyy. HH:mm', this.locale);
267
+ else
268
+ return formatDate(rowData[col.field], 'dd.MM.yyyy.', this.locale);
269
+ case 'multiselect':
270
+ return rowData[col.field];
271
+ case 'boolean':
272
+ return rowData[col.field] == true ? this.translocoService.translate('Yes') : this.translocoService.translate('No');
273
+ case 'numeric':
274
+ // TODO FT: make decimal pipe
275
+ return rowData[col.field];
276
+ default:
277
+ return null;
278
+ }
279
+ }
280
+ colTrackByFn(index, item) {
281
+ return item.field;
282
+ }
283
+ actionTrackByFn(index, item) {
284
+ return `${index}${item.field}`;
285
+ }
286
+ exportListToExcel() {
287
+ let tableFilter = this.lastLazyLoadEvent;
288
+ tableFilter.additionalFilterIdLong = this.additionalFilterIdLong;
289
+ exportListToExcel(this.exportTableDataToExcelObservableMethod, tableFilter);
290
+ }
291
+ clear(table) {
292
+ table.clear();
293
+ }
294
+ //#region Selection
295
+ setFakeIsAllSelected() {
296
+ if (this.rowsSelectedNumber == this.totalRecords)
297
+ this.fakeIsAllSelected = true;
298
+ else
299
+ this.fakeIsAllSelected = false;
300
+ }
301
+ selectAll(checked) {
302
+ this.unselectedItems.length = 0;
303
+ this.newlySelectedItems.length = 0;
304
+ if (checked == true) {
305
+ this.isAllSelected = true;
306
+ this.fakeIsAllSelected = true;
307
+ this.onIsAllSelectedChange.next(new AllClickEvent({ checked: true, additionalIndexes: this.additionalIndexes }));
308
+ this.rowsSelectedNumber = this.totalRecords;
309
+ this.fakeSelectedItems = [...this.items.map(x => x.id)];
310
+ this.selectedItemIds = [...this.items.map(x => x.id)];
311
+ }
312
+ else {
313
+ this.isAllSelected = false;
314
+ this.fakeIsAllSelected = false;
315
+ this.onIsAllSelectedChange.next(new AllClickEvent({ checked: false, additionalIndexes: this.additionalIndexes }));
316
+ this.rowsSelectedNumber = 0;
317
+ this.fakeSelectedItems = [];
318
+ this.selectedItemIds = [];
319
+ }
320
+ }
321
+ selectRow(id, index) {
322
+ if (this.isRowSelected(id)) {
323
+ this.rowUnselect(id);
324
+ this.onRowUnselect.next(new RowClickEvent({ index: index, id: id, additionalIndexes: this.additionalIndexes }));
325
+ }
326
+ else {
327
+ this.rowSelect(id);
328
+ this.onRowSelect.next(new RowClickEvent({ index: index, id: id, additionalIndexes: this.additionalIndexes }));
329
+ }
330
+ }
331
+ isRowSelected(id) {
332
+ if (this.hasLazyLoad) {
333
+ return this.fakeSelectedItems.find(x => x === id) != undefined;
334
+ }
335
+ else {
336
+ return this.selectedItemIds.find(x => x === id) != undefined;
337
+ }
338
+ }
339
+ rowSelect(id) {
340
+ if (this.isAllSelected == false || this.currentPageSelectedItemsFromDb.includes(id) == false) {
341
+ this.newlySelectedItems.push(id);
342
+ }
343
+ if (this.hasLazyLoad) {
344
+ this.fakeSelectedItems.push(id);
345
+ }
346
+ else {
347
+ this.selectedItemIds.push(id);
348
+ }
349
+ this.rowsSelectedNumber++;
350
+ const index = this.unselectedItems.indexOf(id);
351
+ if (index !== -1) {
352
+ this.unselectedItems.splice(index, 1); // FT: Splice is mutating the array
353
+ }
354
+ this.setFakeIsAllSelected();
355
+ }
356
+ rowUnselect(id) {
357
+ if (this.isAllSelected == true || this.currentPageSelectedItemsFromDb.includes(id) == true) {
358
+ this.unselectedItems.push(id);
359
+ }
360
+ this.rowsSelectedNumber--;
361
+ const index = this.newlySelectedItems.indexOf(id);
362
+ const fakeIndex = this.fakeSelectedItems.indexOf(id);
363
+ const nonLazyLoadIndex = this.selectedItemIds.indexOf(id);
364
+ if (index !== -1) {
365
+ this.newlySelectedItems.splice(index, 1); // FT: Splice is mutating the array
366
+ }
367
+ if (fakeIndex !== -1) {
368
+ this.fakeSelectedItems.splice(fakeIndex, 1); // FT: Splice is mutating the array
369
+ }
370
+ if (nonLazyLoadIndex !== -1) {
371
+ this.selectedItemIds.splice(nonLazyLoadIndex, 1); // FT: Splice is mutating the array
372
+ }
373
+ this.setFakeIsAllSelected();
374
+ }
375
+ //#endregion
376
+ //#region Client side table
377
+ // FT: Can do it with Id also, because we are never adding the new record in the table at the same page.
378
+ getFormArrayControlByIndex(formControlName, index) {
379
+ if (this.getFormControl) {
380
+ return this.getFormControl(formControlName, index, this.additionalIndexes);
381
+ }
382
+ else {
383
+ return null;
384
+ }
385
+ }
386
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpiderlyDataTableComponent, deps: [{ token: i1.Router }, { token: i2.DialogService }, { token: i1.ActivatedRoute }, { token: i3.SpiderlyMessageService }, { token: i4.TranslocoService }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
387
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SpiderlyDataTableComponent, isStandalone: true, selector: "spiderly-data-table", inputs: { tableTitle: "tableTitle", tableIcon: "tableIcon", items: "items", rows: "rows", cols: "cols", showPaginator: "showPaginator", showCardWrapper: "showCardWrapper", readonly: "readonly", getTableDataObservableMethod: "getTableDataObservableMethod", exportTableDataToExcelObservableMethod: "exportTableDataToExcelObservableMethod", deleteItemFromTableObservableMethod: "deleteItemFromTableObservableMethod", newlySelectedItems: "newlySelectedItems", unselectedItems: "unselectedItems", selectionMode: "selectionMode", selectedLazyLoadObservableMethod: "selectedLazyLoadObservableMethod", additionalFilterIdLong: "additionalFilterIdLong", showAddButton: "showAddButton", showExportToExcelButton: "showExportToExcelButton", showReloadTableButton: "showReloadTableButton", getFormArrayItems: "getFormArrayItems", hasLazyLoad: "hasLazyLoad", getAlreadySelectedItemIds: "getAlreadySelectedItemIds", getAlreadySelectedItems: "getAlreadySelectedItems", getFormControl: "getFormControl", additionalIndexes: "additionalIndexes" }, outputs: { onTotalRecordsChange: "onTotalRecordsChange", onLazyLoad: "onLazyLoad", onIsAllSelectedChange: "onIsAllSelectedChange", onRowSelect: "onRowSelect", onRowUnselect: "onRowUnselect" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["dt"], descendants: true }], ngImport: i0, template: "<ng-container *transloco=\"let t\">\r\n <div [class]=\"showCardWrapper ? 'card responsive-card-padding overflow-auto' : ''\">\r\n <p-table #dt [value]=\"items\" [rows]=\"rows\" [rowHover]=\"true\" styleClass=\"p-datatable-gridlines\" [paginator]=\"showPaginator\" responsiveLayout=\"scroll\" [lazy]=\"hasLazyLoad\"\r\n (onLazyLoad)=\"lazyLoad($event)\" [totalRecords]=\"totalRecords\" class=\"spiderly-table\" [loading]=\"(items === undefined || loading === true)\" [selectionMode]=\"selectionMode\" dataKey=\"id\" \r\n (onFilter)=\"filter($event)\"> \r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"table-header overflow-auto\">\r\n <div style=\"display: flex; align-items: center; gap: 8px;\">\r\n <i class=\"{{tableIcon}} text-2xl primary-color\"></i>\r\n <h5 style=\"margin: 0px;\">{{tableTitle}}</h5>\r\n </div>\r\n <div style=\"display: flex; gap: 8px;\">\r\n <button pButton [label]=\"t('ClearFilters')\" class=\"p-button-outlined remove-button-border-focus\" style=\"flex: none;\" icon=\"pi pi-filter-slash\" (click)=\"clear(dt)\"></button>\r\n <button pButton *ngIf=\"showExportToExcelButton\" [label]=\"t('ExportToExcel')\" class=\"p-button-outlined remove-button-border-focus\" style=\"flex: none;\" icon=\"pi pi-download\" (click)=\"exportListToExcel()\"></button>\r\n <button pButton *ngIf=\"showReloadTableButton\" [label]=\"t('Reload')\" class=\"p-button-outlined remove-button-border-focus\" style=\"flex: none;\" icon=\"pi pi-refresh\" (click)=\"reload()\"></button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width: 0rem;\" *ngIf=\"selectionMode == 'multiple'\">\r\n <div style=\"display: flex; gap: 8px;\">\r\n <p-checkbox [disabled]=\"readonly\" (onChange)=\"selectAll($event.checked)\" [(ngModel)]=\"fakeIsAllSelected\" [binary]=\"true\"></p-checkbox> ({{rowsSelectedNumber}})\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let col of cols; trackBy: colTrackByFn\">\r\n <th [style]=\"getColHeaderWidth(col.filterType)\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n {{col.name}}\r\n <!-- <p-sortIcon field=\"\"></p-sortIcon> -->\r\n <!-- <p-columnFilter type=\"date\" field=\"date\" display=\"menu\"></p-columnFilter> -->\r\n <p-columnFilter *ngIf=\"col.filterType != null\" [type]=\"col.filterType\" [field]=\"col.filterField ?? col.field\" display=\"menu\" [placeholder]=\"col.filterPlaceholder\" \r\n [showOperator]=\"false\" [showMatchModes]=\"col.showMatchModes\" [showAddButton]=\"col.showAddButton\" [matchModeOptions]=\"getColMatchModeOptions(col.filterType)\"\r\n [matchMode]=\"getColMatchMode(col.filterType)\"\r\n >\r\n <ng-container *ngIf=\"isDropOrMulti(col.filterType)\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-multiSelect [ngModel]=\"value\" [options]=\"col.dropdownOrMultiselectValues\" [placeholder]=\"t('All')\" (onChange)=\"filter($event.value)\" optionLabel=\"label\" optionValue=\"value\" [style]=\"{'width':'240px'}\">\r\n <ng-template let-item pTemplate=\"item\">\r\n <div class=\"p-multiselect-representative-option\">\r\n <span class=\"ml-2\">{{ item.label }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n </ng-container>\r\n </p-columnFilter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-index=\"rowIndex\" let-editing=\"editing\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == 'multiple'\">\r\n <p-checkbox [disabled]=\"readonly\" (onChange)=\"selectRow(rowData.id, rowData.index)\" [ngModel]=\"isRowSelected(rowData.id)\" [binary]=\"true\"></p-checkbox>\r\n </td>\r\n <ng-container *ngFor=\"let col of cols; trackBy: colTrackByFn\">\r\n <td [pTooltip]=\"getRowData(rowData, col)\" [style]=\"getStyleForBodyColumn(col)\" *ngIf=\"!col.editable\">\r\n <div style=\"display: flex; align-items: center; justify-content: center; gap: 18px;\">\r\n <ng-container *ngFor=\"let action of col.actions; trackBy: actionTrackByFn\" >\r\n <span [pTooltip]=\"action.name\" [class]=\"getClassForAction(action)\" (click)=\"getMethodForAction(action, rowData)\"></span>\r\n </ng-container>\r\n </div>\r\n {{getRowData(rowData, col)}}\r\n </td>\r\n <td *ngIf=\"col.editable\">\r\n <spiderly-number [control]=\"getFormArrayControlByIndex(col.field, rowData.index)\" [showLabel]=\"false\"></spiderly-number>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"cols?.length + (selectionMode === 'multiple' ? 1 : 0)\">{{t('NoRecordsFound')}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"loadingbody\">\r\n <tr>\r\n <td [attr.colspan]=\"cols?.length + (selectionMode === 'multiple' ? 1 : 0)\">{{t('Loading')}}...</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorleft\">\r\n {{t('TotalRecords')}}: {{totalRecords}}\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorright\">\r\n <div style=\"display: flex; justify-content: end; gap: 10px;\">\r\n <spiderly-button *ngIf=\"showAddButton\" [label]=\"t('AddNew')\" icon=\"pi pi-plus\" (onClick)=\"navigateToDetails(0)\"></spiderly-button>\r\n </div>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n</ng-container>", styles: [".table-header{display:flex;justify-content:space-between;align-items:center}@media (max-width: 640px){.table-header{display:flex;flex-direction:column;align-items:start;gap:14px}}.spiderly-table .p-paginator{padding:1rem}@media (min-width: 1400px){.spiderly-table .p-paginator-left-content{position:absolute;padding:14px;left:0}}@media (min-width: 1400px){.spiderly-table .p-paginator-right-content{position:absolute;padding:14px;right:0}}\n", ":is() :is(.remove-button-border-focus:focus,.remove-button-border-focus:enabled:focus){box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;background-color:var(--gray-200)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: PrimengModule }, { kind: "component", type: i7.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i9.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i11.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i12.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: SpiderlyControlsModule }, { kind: "component", type: i13.SpiderlyButtonComponent, selector: "spiderly-button" }, { kind: "component", type: i14.SpiderlyNumberComponent, selector: "spiderly-number", inputs: ["prefix", "showButtons", "decimal", "maxFractionDigits"] }] }); }
388
+ }
389
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpiderlyDataTableComponent, decorators: [{
390
+ type: Component,
391
+ args: [{ selector: 'spiderly-data-table', imports: [
392
+ FormsModule,
393
+ CommonModule,
394
+ PrimengModule,
395
+ TranslocoDirective,
396
+ SpiderlyControlsModule,
397
+ ], standalone: true, template: "<ng-container *transloco=\"let t\">\r\n <div [class]=\"showCardWrapper ? 'card responsive-card-padding overflow-auto' : ''\">\r\n <p-table #dt [value]=\"items\" [rows]=\"rows\" [rowHover]=\"true\" styleClass=\"p-datatable-gridlines\" [paginator]=\"showPaginator\" responsiveLayout=\"scroll\" [lazy]=\"hasLazyLoad\"\r\n (onLazyLoad)=\"lazyLoad($event)\" [totalRecords]=\"totalRecords\" class=\"spiderly-table\" [loading]=\"(items === undefined || loading === true)\" [selectionMode]=\"selectionMode\" dataKey=\"id\" \r\n (onFilter)=\"filter($event)\"> \r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"table-header overflow-auto\">\r\n <div style=\"display: flex; align-items: center; gap: 8px;\">\r\n <i class=\"{{tableIcon}} text-2xl primary-color\"></i>\r\n <h5 style=\"margin: 0px;\">{{tableTitle}}</h5>\r\n </div>\r\n <div style=\"display: flex; gap: 8px;\">\r\n <button pButton [label]=\"t('ClearFilters')\" class=\"p-button-outlined remove-button-border-focus\" style=\"flex: none;\" icon=\"pi pi-filter-slash\" (click)=\"clear(dt)\"></button>\r\n <button pButton *ngIf=\"showExportToExcelButton\" [label]=\"t('ExportToExcel')\" class=\"p-button-outlined remove-button-border-focus\" style=\"flex: none;\" icon=\"pi pi-download\" (click)=\"exportListToExcel()\"></button>\r\n <button pButton *ngIf=\"showReloadTableButton\" [label]=\"t('Reload')\" class=\"p-button-outlined remove-button-border-focus\" style=\"flex: none;\" icon=\"pi pi-refresh\" (click)=\"reload()\"></button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width: 0rem;\" *ngIf=\"selectionMode == 'multiple'\">\r\n <div style=\"display: flex; gap: 8px;\">\r\n <p-checkbox [disabled]=\"readonly\" (onChange)=\"selectAll($event.checked)\" [(ngModel)]=\"fakeIsAllSelected\" [binary]=\"true\"></p-checkbox> ({{rowsSelectedNumber}})\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let col of cols; trackBy: colTrackByFn\">\r\n <th [style]=\"getColHeaderWidth(col.filterType)\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n {{col.name}}\r\n <!-- <p-sortIcon field=\"\"></p-sortIcon> -->\r\n <!-- <p-columnFilter type=\"date\" field=\"date\" display=\"menu\"></p-columnFilter> -->\r\n <p-columnFilter *ngIf=\"col.filterType != null\" [type]=\"col.filterType\" [field]=\"col.filterField ?? col.field\" display=\"menu\" [placeholder]=\"col.filterPlaceholder\" \r\n [showOperator]=\"false\" [showMatchModes]=\"col.showMatchModes\" [showAddButton]=\"col.showAddButton\" [matchModeOptions]=\"getColMatchModeOptions(col.filterType)\"\r\n [matchMode]=\"getColMatchMode(col.filterType)\"\r\n >\r\n <ng-container *ngIf=\"isDropOrMulti(col.filterType)\">\r\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\r\n <p-multiSelect [ngModel]=\"value\" [options]=\"col.dropdownOrMultiselectValues\" [placeholder]=\"t('All')\" (onChange)=\"filter($event.value)\" optionLabel=\"label\" optionValue=\"value\" [style]=\"{'width':'240px'}\">\r\n <ng-template let-item pTemplate=\"item\">\r\n <div class=\"p-multiselect-representative-option\">\r\n <span class=\"ml-2\">{{ item.label }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n </ng-container>\r\n </p-columnFilter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-index=\"rowIndex\" let-editing=\"editing\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == 'multiple'\">\r\n <p-checkbox [disabled]=\"readonly\" (onChange)=\"selectRow(rowData.id, rowData.index)\" [ngModel]=\"isRowSelected(rowData.id)\" [binary]=\"true\"></p-checkbox>\r\n </td>\r\n <ng-container *ngFor=\"let col of cols; trackBy: colTrackByFn\">\r\n <td [pTooltip]=\"getRowData(rowData, col)\" [style]=\"getStyleForBodyColumn(col)\" *ngIf=\"!col.editable\">\r\n <div style=\"display: flex; align-items: center; justify-content: center; gap: 18px;\">\r\n <ng-container *ngFor=\"let action of col.actions; trackBy: actionTrackByFn\" >\r\n <span [pTooltip]=\"action.name\" [class]=\"getClassForAction(action)\" (click)=\"getMethodForAction(action, rowData)\"></span>\r\n </ng-container>\r\n </div>\r\n {{getRowData(rowData, col)}}\r\n </td>\r\n <td *ngIf=\"col.editable\">\r\n <spiderly-number [control]=\"getFormArrayControlByIndex(col.field, rowData.index)\" [showLabel]=\"false\"></spiderly-number>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"cols?.length + (selectionMode === 'multiple' ? 1 : 0)\">{{t('NoRecordsFound')}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"loadingbody\">\r\n <tr>\r\n <td [attr.colspan]=\"cols?.length + (selectionMode === 'multiple' ? 1 : 0)\">{{t('Loading')}}...</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorleft\">\r\n {{t('TotalRecords')}}: {{totalRecords}}\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorright\">\r\n <div style=\"display: flex; justify-content: end; gap: 10px;\">\r\n <spiderly-button *ngIf=\"showAddButton\" [label]=\"t('AddNew')\" icon=\"pi pi-plus\" (onClick)=\"navigateToDetails(0)\"></spiderly-button>\r\n </div>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n</ng-container>", styles: [".table-header{display:flex;justify-content:space-between;align-items:center}@media (max-width: 640px){.table-header{display:flex;flex-direction:column;align-items:start;gap:14px}}.spiderly-table .p-paginator{padding:1rem}@media (min-width: 1400px){.spiderly-table .p-paginator-left-content{position:absolute;padding:14px;left:0}}@media (min-width: 1400px){.spiderly-table .p-paginator-right-content{position:absolute;padding:14px;right:0}}\n", ":is() :is(.remove-button-border-focus:focus,.remove-button-border-focus:enabled:focus){box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;background-color:var(--gray-200)}\n"] }]
398
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i2.DialogService }, { type: i1.ActivatedRoute }, { type: i3.SpiderlyMessageService }, { type: i4.TranslocoService }, { type: undefined, decorators: [{
399
+ type: Inject,
400
+ args: [LOCALE_ID]
401
+ }] }], propDecorators: { table: [{
402
+ type: ViewChild,
403
+ args: ['dt']
404
+ }], tableTitle: [{
405
+ type: Input
406
+ }], tableIcon: [{
407
+ type: Input
408
+ }], items: [{
409
+ type: Input
410
+ }], rows: [{
411
+ type: Input
412
+ }], cols: [{
413
+ type: Input
414
+ }], showPaginator: [{
415
+ type: Input
416
+ }], showCardWrapper: [{
417
+ type: Input
418
+ }], readonly: [{
419
+ type: Input
420
+ }], onTotalRecordsChange: [{
421
+ type: Output
422
+ }], getTableDataObservableMethod: [{
423
+ type: Input
424
+ }], exportTableDataToExcelObservableMethod: [{
425
+ type: Input
426
+ }], deleteItemFromTableObservableMethod: [{
427
+ type: Input
428
+ }], newlySelectedItems: [{
429
+ type: Input
430
+ }], unselectedItems: [{
431
+ type: Input
432
+ }], selectionMode: [{
433
+ type: Input
434
+ }], onLazyLoad: [{
435
+ type: Output
436
+ }], onIsAllSelectedChange: [{
437
+ type: Output
438
+ }], selectedLazyLoadObservableMethod: [{
439
+ type: Input
440
+ }], additionalFilterIdLong: [{
441
+ type: Input
442
+ }], showAddButton: [{
443
+ type: Input
444
+ }], showExportToExcelButton: [{
445
+ type: Input
446
+ }], showReloadTableButton: [{
447
+ type: Input
448
+ }], getFormArrayItems: [{
449
+ type: Input
450
+ }], hasLazyLoad: [{
451
+ type: Input
452
+ }], getAlreadySelectedItemIds: [{
453
+ type: Input
454
+ }], getAlreadySelectedItems: [{
455
+ type: Input
456
+ }], getFormControl: [{
457
+ type: Input
458
+ }], additionalIndexes: [{
459
+ type: Input
460
+ }], onRowSelect: [{
461
+ type: Output
462
+ }], onRowUnselect: [{
463
+ type: Output
464
+ }] } });
465
+ export class Action {
466
+ constructor({ name, field, icon, style, onClick, } = {}) {
467
+ this.name = name;
468
+ this.field = field;
469
+ this.icon = icon;
470
+ this.style = style;
471
+ this.onClick = onClick;
472
+ }
473
+ }
474
+ export class Column {
475
+ constructor({ name, field, filterField, filterType, filterPlaceholder, showMatchModes, showAddButton, dropdownOrMultiselectValues, actions, editable, showTime, } = {}) {
476
+ this.name = name;
477
+ this.field = field;
478
+ this.filterField = filterField;
479
+ this.filterType = filterType;
480
+ this.filterPlaceholder = filterPlaceholder;
481
+ this.showMatchModes = showMatchModes;
482
+ this.showAddButton = showAddButton;
483
+ this.dropdownOrMultiselectValues = dropdownOrMultiselectValues;
484
+ this.actions = actions;
485
+ this.editable = editable;
486
+ this.showTime = showTime;
487
+ }
488
+ }
489
+ export class RowClickEvent {
490
+ constructor({ index, id, additionalIndexes } = {}) {
491
+ this.index = index;
492
+ this.id = id;
493
+ this.additionalIndexes = additionalIndexes;
494
+ }
495
+ }
496
+ export class AllClickEvent {
497
+ constructor({ checked, additionalIndexes } = {}) {
498
+ this.checked = checked;
499
+ this.additionalIndexes = additionalIndexes;
500
+ }
501
+ }
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpZGVybHktZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGlkZXJseS9zcmMvbGliL2NvbXBvbmVudHMvc3BpZGVybHktZGF0YS10YWJsZS9zcGlkZXJseS1kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwaWRlcmx5L3NyYy9saWIvY29tcG9uZW50cy9zcGlkZXJseS1kYXRhLXRhYmxlL3NwaWRlcmx5LWRhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs3RyxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUN2SCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsY0FBYyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRWxELE9BQU8sRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUlqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QjdELE1BQU0sT0FBTywwQkFBMEI7SUFXcUMsQ0FBQztJQTRDM0UsWUFDVSxNQUFjLEVBQ2QsYUFBNEIsRUFDNUIsS0FBcUIsRUFDckIsY0FBc0MsRUFDdEMsZ0JB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Q0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsMkJBQTJCLENBQUM7UUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFLeEIsWUFDRSxFQUNFLEtBQUssRUFDTCxFQUFFLEVBQ0YsaUJBQWlCLEtBS2YsRUFBRTtRQUVOLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxhQUFhO0lBSXhCLFlBQ0UsRUFDRSxPQUFPLEVBQ1AsaUJBQWlCLEtBSWYsRUFBRTtRQUVOLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQUM3QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgTE9DQUxFX0lELCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTZWxlY3RJdGVtIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBUYWJsZSwgVGFibGVGaWx0ZXJFdmVudCwgVGFibGVMYXp5TG9hZEV2ZW50IH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBTcGlkZXJseURlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3NwaWRlcmx5LWRlbGV0ZS1kaWFsb2cvc3BpZGVybHktZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIGZvcm1hdERhdGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3BpZGVybHlNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NwaWRlcmx5LW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFByaW1lbmdPcHRpb24gfSBmcm9tICcuLi8uLi9lbnRpdGllcy9wcmltZW5nLW9wdGlvbic7XHJcbmltcG9ydCB7IFRyYW5zbG9jb0RpcmVjdGl2ZSwgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XHJcbmltcG9ydCB7IFNwaWRlcmx5Q29udHJvbHNNb2R1bGUgfSBmcm9tICcuLi8uLi9jb250cm9scy9zcGlkZXJseS1jb250cm9scy5tb2R1bGUnO1xyXG5pbXBvcnQgeyBTcGlkZXJseUZvcm1Db250cm9sIH0gZnJvbSAnLi4vc3BpZGVybHktZm9ybS1jb250cm9sL3NwaWRlcmx5LWZvcm0tY29udHJvbCc7XHJcbmltcG9ydCB7IFRhYmxlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9lbnRpdGllcy90YWJsZS1yZXNwb25zZSc7XHJcbmltcG9ydCB7IExhenlMb2FkU2VsZWN0ZWRJZHNSZXN1bHQgfSBmcm9tICcuLi8uLi9lbnRpdGllcy9sYXp5LWxvYWQtc2VsZWN0ZWQtaWRzLXJlc3VsdCc7XHJcbmltcG9ydCB7IGV4cG9ydExpc3RUb0V4Y2VsIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaGVscGVyLWZ1bmN0aW9ucyc7XHJcbmltcG9ydCB7IFRhYmxlRmlsdGVyIH0gZnJvbSAnLi4vLi4vZW50aXRpZXMvdGFibGUtZmlsdGVyJztcclxuaW1wb3J0IHsgUHJpbWVuZ01vZHVsZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvcHJpbWVuZy5tb2R1bGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGlkZXJseS1kYXRhLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3BpZGVybHktZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICdzcGlkZXJseS1kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJyxcclxuICBzdHlsZXM6IFtgXHJcbiAgXHQ6aG9zdCB7XHJcblx0XHQgIDo6bmctZGVlcCB7XHJcblx0XHQgICAgLnJlbW92ZS1idXR0b24tYm9yZGVyLWZvY3VzOmZvY3VzLCBcclxuICAgICAgICAucmVtb3ZlLWJ1dHRvbi1ib3JkZXItZm9jdXM6ZW5hYmxlZDpmb2N1cyB7XHJcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcclxuICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XHJcbiAgICAgICAgLW1vei1ib3gtc2hhZG93OiBub25lO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdyYXktMjAwKTtcclxuXHRcdCAgICB9XHJcblx0XHQgIH1cclxuXHQgIH1cclxuICBgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFByaW1lbmdNb2R1bGUsXHJcbiAgICBUcmFuc2xvY29EaXJlY3RpdmUsXHJcbiAgICBTcGlkZXJseUNvbnRyb2xzTW9kdWxlLFxyXG4gIF0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwaWRlcmx5RGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCdkdCcpIHRhYmxlOiBUYWJsZTtcclxuICBASW5wdXQoKSB0YWJsZVRpdGxlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdGFibGVJY29uOiBzdHJpbmcgPSAncGkgcGktbGlzdCc7XHJcbiAgQElucHV0KCkgaXRlbXM6IGFueVtdOyAvLyBGVDogUGFzcyBvbmx5IHdoZW4gaGFzTGF6eUxvYWQgPT09IGZhbHNlXHJcbiAgQElucHV0KCkgcm93czogbnVtYmVyID0gMTA7XHJcbiAgQElucHV0KCkgY29sczogQ29sdW1uW107XHJcbiAgQElucHV0KCkgc2hvd1BhZ2luYXRvcjogYm9vbGVhbiA9IHRydWU7IC8vIEZUOiBQYXNzIG9ubHkgd2hlbiBoYXNMYXp5TG9hZCA9PT0gZmFsc2VcclxuICBASW5wdXQoKSBzaG93Q2FyZFdyYXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgdG90YWxSZWNvcmRzOiBudW1iZXI7XHJcbiAgQE91dHB1dCgpIG9uVG90YWxSZWNvcmRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTs7XHJcbiAgXHJcbiAgQElucHV0KCkgZ2V0VGFibGVEYXRhT2JzZXJ2YWJsZU1ldGhvZDogKHRhYmxlRmlsdGVyOiBUYWJsZUZpbHRlcikgPT4gT2JzZXJ2YWJsZTxUYWJsZVJlc3BvbnNlPjtcclxuICBASW5wdXQoKSBleHBvcnRUYWJsZURhdGFUb0V4Y2VsT2JzZXJ2YWJsZU1ldGhvZDogKHRhYmxlRmlsdGVyOiBUYWJsZUZpbHRlcikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIEBJbnB1dCgpIGRlbGV0ZUl0ZW1Gcm9tVGFibGVPYnNlcnZhYmxlTWV0aG9kOiAocm93SWQ6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xyXG5cclxuICBsYXN0TGF6eUxvYWRFdmVudDogVGFibGVMYXp5TG9hZEV2ZW50O1xyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIFxyXG4gIEBJbnB1dCgpIG5ld2x5U2VsZWN0ZWRJdGVtczogbnVtYmVyW10gPSBbXTtcclxuICBmYWtlU2VsZWN0ZWRJdGVtczogbnVtYmVyW10gPSBbXTsgLy8gRlQ6IE9ubHkgZm9yIHNob3dpbmcgY2hlY2tib3hlcywgd2Ugd2lsbCBub3Qgc2VuZCB0aGlzIHRvIHRoZSBiYWNrZW5kXHJcbiAgY3VycmVudFBhZ2VTZWxlY3RlZEl0ZW1zRnJvbURiOiBudW1iZXJbXSA9IFtdOyAvLyBGVDogTWFkZSBzbyB3ZSBjYW4gYWRkIG9ubHkgbmV3bHkgc2VsZWN0ZWQgaXRlbXMgdG8gdGhlIG5ld2x5U2VsZWN0ZWRJdGVtc1xyXG4gIEBJbnB1dCgpIHVuc2VsZWN0ZWRJdGVtczogbnVtYmVyW10gPSBbXTtcclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyB8ICdtdWx0aXBsZScgfCB1bmRlZmluZWQgfCBudWxsO1xyXG4gIEBPdXRwdXQoKSBvbkxhenlMb2FkOiBFdmVudEVtaXR0ZXI8VGFibGVGaWx0ZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIHJvd3NTZWxlY3RlZE51bWJlcjogbnVtYmVyID0gMDtcclxuICBpc0FsbFNlbGVjdGVkOiBib29sZWFuID0gbnVsbDtcclxuICBmYWtlSXNBbGxTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBGVDogT25seSBmb3Igc2hvd2luZyBjaGVja2JveGVzLCB3ZSB3aWxsIG5vdCBzZW5kIHRoaXMgdG8gdGhlIGJhY2tlbmRcclxuICBpc0ZpcnN0VGltZUxhenlMb2FkOiBib29sZWFuID0gdHJ1ZTtcclxuICBAT3V0cHV0KCkgb25Jc0FsbFNlbGVjdGVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QWxsQ2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRMYXp5TG9hZE9ic2VydmFibGVNZXRob2Q6ICh0YWJsZUZpbHRlcjogVGFibGVGaWx0ZXIpID0+IE9ic2VydmFibGU8TGF6eUxvYWRTZWxlY3RlZElkc1Jlc3VsdD47XHJcbiAgQElucHV0KCkgYWRkaXRpb25hbEZpbHRlcklkTG9uZzogbnVtYmVyO1xyXG4gIFxyXG4gIG1hdGNoTW9kZURhdGVPcHRpb25zOiBTZWxlY3RJdGVtW10gPSBbXTtcclxuICBtYXRjaE1vZGVOdW1iZXJPcHRpb25zOiBTZWxlY3RJdGVtW10gPSBbXTtcclxuICBASW5wdXQoKSBzaG93QWRkQnV0dG9uOiBib29sZWFuID0gdHJ1ZTsgXHJcbiAgQElucHV0KCkgc2hvd0V4cG9ydFRvRXhjZWxCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dSZWxvYWRUYWJsZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBkZWxldGVSZWY6IER5bmFtaWNEaWFsb2dSZWY7XHJcblxyXG4gIC8vIENsaWVudCBzaWRlIHRhYmxlXHJcbiAgLy8gQElucHV0KCkgZm9ybUFycmF5SXRlbXM6IGFueVtdOyAvLyBGVDogUGFzcyB0aGlzIG9ubHkgaWYgeW91IGhhdmUgc29tZSBhZGRpdGlvbmFsIGxvZ2ljIGZvciBzaG93aW5nIGRhdGFcclxuICBASW5wdXQoKSBnZXRGb3JtQXJyYXlJdGVtczogKGFkZGl0aW9uYWxJbmRleGVzPzogYW55KSA9PiBhbnlbXTtcclxuICBASW5wdXQoKSBoYXNMYXp5TG9hZDogYm9vbGVhbiA9IHRydWU7IFxyXG4gIHNlbGVjdGVkSXRlbUlkczogbnVtYmVyW10gPSBbXTsgLy8gRlQ6IFBhc3Mgb25seSB3aGVuIGhhc0xhenlMb2FkID09PSBmYWxzZSwgaXQncyBlbm91Z2ggaWYgdGhlIE0yTSBhc3NvY2lhdGlvbiBoYXNuJ3QgYWRkaXRpb25hbCBmaWVsZHNcclxuICBASW5wdXQoKSBnZXRBbHJlYWR5U2VsZWN0ZWRJdGVtSWRzOiAoYWRkaXRpb25hbEluZGV4ZXM/OiBhbnkpID0+IG51bWJlcltdOyAvLyBGVDogUGFzcyBvbmx5IHdoZW4gaGFzTGF6eUxvYWQgPT09IGZhbHNlLCBpdCdzIGVub3VnaCBpZiB0aGUgTTJNIGFzc29jaWF0aW9uIGhhc24ndCBhZGRpdGlvbmFsIGZpZWxkc1xyXG4gIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107IC8vIEZUOiBQYXNzIG9ubHkgd2hlbiBoYXNMYXp5TG9hZCA9PT0gZmFsc2VcclxuICBASW5wdXQoKSBnZXRBbHJlYWR5U2VsZWN0ZWRJdGVtczogKGFkZGl0aW9uYWxJbmRleGVzPzogYW55KSA9PiBhbnlbXTsgLy8gRlQ6IFBhc3Mgb25seSB3aGVuIGhhc0xhenlMb2FkID09PSBmYWxzZSwgaXQncyBlbm91Z2ggaWYgdGhlIE0yTSBhc3NvY2lhdGlvbiBoYXNuJ3QgYWRkaXRpb25hbCBmaWVsZHNcclxuICBASW5wdXQoKSBnZXRGb3JtQ29udHJvbDogKGZvcm1Db250cm9sTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBhZGRpdGlvbmFsSW5kZXhlcz86IGFueSkgPT4gU3BpZGVybHlGb3JtQ29udHJvbDtcclxuICBASW5wdXQoKSBhZGRpdGlvbmFsSW5kZXhlczogYW55O1xyXG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdDogRXZlbnRFbWl0dGVyPFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvblJvd1Vuc2VsZWN0OiBFdmVudEVtaXR0ZXI8Um93Q2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogU3BpZGVybHlNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsb2NvU2VydmljZTogVHJhbnNsb2NvU2VydmljZSxcclxuICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIGxvY2FsZTogc3RyaW5nXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubWF0Y2hNb2RlRGF0ZU9wdGlvbnMgPSBbXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ09uRGF0ZScpLCB2YWx1ZTogJ2VxdWFscycgfSxcclxuICAgICAgeyBsYWJlbDogdGhpcy50cmFuc2xvY29TZXJ2aWNlLnRyYW5zbGF0ZSgnRGF0ZXNCZWZvcmUnKSwgdmFsdWU6ICdkYXRlQmVmb3JlJyB9LFxyXG4gICAgICB7IGxhYmVsOiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdEYXRlc0FmdGVyJyksIHZhbHVlOiAnZGF0ZUFmdGVyJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICB0aGlzLm1hdGNoTW9kZU51bWJlck9wdGlvbnMgPSBbXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ0VxdWFscycpLCB2YWx1ZTogJ2VxdWFscycgfSxcclxuICAgICAgeyBsYWJlbDogdGhpcy50cmFuc2xvY29TZXJ2aWNlLnRyYW5zbGF0ZSgnTW9yZVRoYW4nKSwgdmFsdWU6ICdndGUnIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ0xlc3NUaGFuJyksIHZhbHVlOiAnbHRlJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBpZiAodGhpcy5oYXNMYXp5TG9hZCA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5jbGllbnRMb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGxhenlMb2FkKGV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpIHtcclxuICAgIHRoaXMubGFzdExhenlMb2FkRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICBsZXQgdGFibGVGaWx0ZXI6IFRhYmxlRmlsdGVyID0gZXZlbnQgYXMgdW5rbm93biBhcyBUYWJsZUZpbHRlcjtcclxuICAgIHRhYmxlRmlsdGVyLmFkZGl0aW9uYWxGaWx0ZXJJZExvbmcgPSB0aGlzLmFkZGl0aW9uYWxGaWx0ZXJJZExvbmc7XHJcblxyXG4gICAgdGhpcy5vbkxhenlMb2FkLm5leHQodGFibGVGaWx0ZXIpO1xyXG4gICAgXHJcbiAgICB0aGlzLmdldFRhYmxlRGF0YU9ic2VydmFibGVNZXRob2QodGFibGVGaWx0ZXIpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGFzeW5jIChyZXMpID0+IHsgXHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IHJlcy5kYXRhO1xyXG4gICAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gcmVzLnRvdGFsUmVjb3JkcztcclxuICAgICAgICB0aGlzLm9uVG90YWxSZWNvcmRzQ2hhbmdlLm5leHQocmVzLnRvdGFsUmVjb3Jkcyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMYXp5TG9hZE9ic2VydmFibGVNZXRob2QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IHNlbGVjdGVkUm93c01ldGhvZFJlc3VsdDogTGF6eUxvYWRTZWxlY3RlZElkc1Jlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc2VsZWN0ZWRMYXp5TG9hZE9ic2VydmFibGVNZXRob2QodGFibGVGaWx0ZXIpKTtcclxuICBcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VTZWxlY3RlZEl0ZW1zRnJvbURiID0gWy4uLnNlbGVjdGVkUm93c01ldGhvZFJlc3VsdC5zZWxlY3RlZElkc107XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNGaXJzdFRpbWVMYXp5TG9hZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm93c1NlbGVjdGVkTnVtYmVyID0gc2VsZWN0ZWRSb3dzTWV0aG9kUmVzdWx0LnRvdGFsUmVjb3Jkc1NlbGVjdGVkO1xyXG4gICAgICAgICAgICB0aGlzLnNldEZha2VJc0FsbFNlbGVjdGVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaXJzdFRpbWVMYXp5TG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGxldCBpZHNUb0luc2VydCA9IFsuLi50aGlzLml0ZW1zLm1hcCh4ID0+IHguaWQpXTtcclxuICAgICAgICAgICAgaWRzVG9JbnNlcnQgPSBpZHNUb0luc2VydC5maWx0ZXIoeCA9PiB0aGlzLnVuc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyh4KSA9PSBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmFrZVNlbGVjdGVkSXRlbXMgPSBbLi4uaWRzVG9JbnNlcnRdOyAvLyBGVDogT25seSBmb3Igc2hvd2luZyBjaGVja2JveGVzLCB3ZSB3aWxsIG5vdCBzZW5kIHRoaXMgdG8gdGhlIGJhY2tlbmRcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZha2VTZWxlY3RlZEl0ZW1zID0gWy4uLnRoaXMubmV3bHlTZWxlY3RlZEl0ZW1zXTsgLy8gRlQ6IE9ubHkgZm9yIHNob3dpbmcgY2hlY2tib3hlcywgd2Ugd2lsbCBub3Qgc2VuZCB0aGlzIHRvIHRoZSBiYWNrZW5kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgaWRzVG9JbnNlcnQgPSBbLi4uc2VsZWN0ZWRSb3dzTWV0aG9kUmVzdWx0LnNlbGVjdGVkSWRzLCAuLi50aGlzLm5ld2x5U2VsZWN0ZWRJdGVtc107XHJcbiAgICAgICAgICAgIGlkc1RvSW5zZXJ0ID0gaWRzVG9JbnNlcnQuZmlsdGVyKHggPT4gdGhpcy51bnNlbGVjdGVkSXRlbXMuaW5jbHVkZXMoeCkgPT0gZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmZha2VTZWxlY3RlZEl0ZW1zID0gWy4uLmlkc1RvSW5zZXJ0XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGllbnRMb2FkKCl7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmxvYWRGb3JtQXJyYXlJdGVtcygpO1xyXG4gICAgdGhpcy50b3RhbFJlY29yZHMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcclxuICAgIHRoaXMub25Ub3RhbFJlY29yZHNDaGFuZ2UubmV4dCh0aGlzLml0ZW1zLmxlbmd0aCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0QWxyZWFkeVNlbGVjdGVkSXRlbUlkcykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IHRoaXMuZ2V0QWxyZWFkeVNlbGVjdGVkSXRlbUlkcyh0aGlzLmFkZGl0aW9uYWxJbmRleGVzKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmdldEFscmVhZHlTZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0QWxyZWFkeVNlbGVjdGVkSXRlbXModGhpcy5hZGRpdGlvbmFsSW5kZXhlcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvd3NTZWxlY3RlZE51bWJlciA9IHRoaXMuc2VsZWN0ZWRJdGVtSWRzLmxlbmd0aDtcclxuICAgIHRoaXMuc2V0RmFrZUlzQWxsU2VsZWN0ZWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xpZW50RmlsdGVyQ291bnQgPSAwO1xyXG5cclxuICBmaWx0ZXIoZXZlbnQ6IFRhYmxlRmlsdGVyRXZlbnQpe1xyXG4gICAgaWYgKHRoaXMuaGFzTGF6eUxvYWQgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKVxyXG4gICAgICB0aGlzLnNlbGVjdEFsbChmYWxzZSk7IC8vIEZUOiBXZSBuZWVkIHRvIGRvIGl0IGxpa2UgdGhpcyBiZWNhdXNlOiB0b3RhbFJlY29yZHM6IDEgLT4gc2VsZWN0ZWRSZWNvcmRzIGZyb20gZWFybHllciBzZWxlY3Rpb24gMiAtPiB1bnNlbGVjdCBjdXJyZW50IC0+IGFsbCBjaGVja2JveCBpcyBzZXQgdG8gdHJ1ZVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0xhenlMb2FkID09PSBmYWxzZSAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScpIHtcclxuICAgICAgaWYgKHRoaXMuY2xpZW50RmlsdGVyQ291bnQgPT09IDApIHtcclxuICAgICAgICB0aGlzLmxvYWRGb3JtQXJyYXlJdGVtcygpO1xyXG4gICAgICAgIHRoaXMuY2xpZW50RmlsdGVyQ291bnQrKztcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5jbGllbnRGaWx0ZXJDb3VudC0tO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRGb3JtQXJyYXlJdGVtcygpe1xyXG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuZ2V0Rm9ybUFycmF5SXRlbXModGhpcy5hZGRpdGlvbmFsSW5kZXhlcyk7XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgIGl0ZW0uaW5kZXggPSBpbmRleDtcclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuICBnZXRDb2xIZWFkZXJXaWR0aChmaWx0ZXJUeXBlOiBzdHJpbmcpIHtcclxuICAgIHN3aXRjaCAoZmlsdGVyVHlwZSkge1xyXG4gICAgICBjYXNlICd0ZXh0JzpcclxuICAgICAgICByZXR1cm4gJ21pbi13aWR0aDogMTJyZW07JztcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgcmV0dXJuICdtaW4td2lkdGg6IDEwcmVtOyc7XHJcbiAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcclxuICAgICAgICByZXR1cm4gJ21pbi13aWR0aDogMTJyZW07JztcclxuICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgcmV0dXJuICdtaW4td2lkdGg6IDhyZW07JztcclxuICAgICAgY2FzZSAnbnVtZXJpYyc6XHJcbiAgICAgICAgcmV0dXJuICdtaW4td2lkdGg6IDEycmVtOyc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICd3aWR0aDogMHJlbTsnOyAvLyBmaXR0aW5nIGNvbnRlbnQgb2YgdGhlIHJvdyBsaWtlIHRoaXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbE1hdGNoTW9kZU9wdGlvbnMoZmlsdGVyVHlwZTogc3RyaW5nKXtcclxuICAgIHN3aXRjaCAoZmlsdGVyVHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaE1vZGVEYXRlT3B0aW9ucztcclxuICAgICAgICBjYXNlICdtdWx0aXNlbGVjdCc6XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICBjYXNlICdib29sZWFuJzpcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIGNhc2UgJ251bWVyaWMnOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hNb2RlTnVtYmVyT3B0aW9ucztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgXHJcbiAgZ2V0Q29sTWF0Y2hNb2RlKGZpbHRlclR5cGU6IHN0cmluZyl7XHJcbiAgICBzd2l0Y2ggKGZpbHRlclR5cGUpIHtcclxuICAgICAgICBjYXNlICd0ZXh0JzpcclxuICAgICAgICAgIHJldHVybiAnY29udGFpbnMnO1xyXG4gICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxyXG4gICAgICAgICAgcmV0dXJuICdpbic7XHJcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgICByZXR1cm4gJ2VxdWFscyc7XHJcbiAgICAgICAgY2FzZSAnbnVtZXJpYyc6XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIGlzRHJvcE9yTXVsdGkoZmlsdGVyVHlwZTogc3RyaW5nKXtcclxuICAgIGlmIChmaWx0ZXJUeXBlID09ICdkcm9wZG93bicgfHwgZmlsdGVyVHlwZSA9PSAnbXVsdGlzZWxlY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IFxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb0RldGFpbHMocm93SWQ6IG51bWJlcil7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcm93SWRdLCB7cmVsYXRpdmVUbzogdGhpcy5yb3V0ZX0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlT2JqZWN0KHJvd0lkOiBudW1iZXIpe1xyXG4gICAgdGhpcy5kZWxldGVSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihTcGlkZXJseURlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgXHJcbiAgICAgIHsgXHJcbiAgICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdBcmVZb3VTdXJlJyksXHJcbiAgICAgICAgd2lkdGg6ICc0MDBweCcsXHJcbiAgICAgICAgZGF0YTp7IGRlbGV0ZUl0ZW1Gcm9tVGFibGVPYnNlcnZhYmxlTWV0aG9kOiB0aGlzLmRlbGV0ZUl0ZW1Gcm9tVGFibGVPYnNlcnZhYmxlTWV0aG9kLCBpZDogcm93SWQsIH0gXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kZWxldGVSZWYub25DbG9zZS5zdWJzY3JpYmUoKGRlbGV0ZWRTdWNjZXNzZnVsbHk6IGJvb2xlYW4pPT57XHJcbiAgICAgICAgaWYoZGVsZXRlZFN1Y2Nlc3NmdWxseSA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3NNZXNzYWdlKHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ1N1Y2Nlc3NmdWxseURlbGV0ZWRNZXNzYWdlJykpO1xyXG4gICAgICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVsb2FkKCl7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5pdGVtcyA9IG51bGw7XHJcbiAgICB0aGlzLmxhenlMb2FkKHRoaXMubGFzdExhenlMb2FkRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgc2hvd0FjdGlvbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2xzLnNvbWUoeCA9PiB4LmFjdGlvbnM/Lmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3R5bGVGb3JCb2R5Q29sdW1uKGNvbDogQ29sdW1uPGFueT4pIHtcclxuICAgIHN3aXRjaChjb2wuZmlsdGVyVHlwZSl7XHJcbiAgICAgIGNhc2UgJ251bWVyaWMnOlxyXG4gICAgICAgIHJldHVybiAndGV4dC1hbGlnbjogcmlnaHQ7JztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENsYXNzRm9yQWN0aW9uKGFjdGlvbjogQWN0aW9uKTogc3RyaW5ne1xyXG4gICAgc3dpdGNoKGFjdGlvbi5maWVsZCl7XHJcbiAgICAgIGNhc2UgJ0RldGFpbHMnOlxyXG4gICAgICAgIHJldHVybiAncGkgcGktcGVuY2lsIHRleHQtbGcgY3Vyc29yLXBvaW50ZXIgcHJpbWFyeS1jb2xvcic7XHJcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6XHJcbiAgICAgICAgcmV0dXJuICdwaSBwaS10cmFzaCB0ZXh0LWxnIHRleHQtcmVkLTUwMCBjdXJzb3ItcG9pbnRlcic7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGAke2FjdGlvbi5pY29ufSAke2FjdGlvbi5zdHlsZX0gdGV4dC1sZyBjdXJzb3ItcG9pbnRlcmA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRNZXRob2RGb3JBY3Rpb24oYWN0aW9uOiBBY3Rpb24sIHJvd0RhdGE6IGFueSl7XHJcbiAgICBzd2l0Y2goYWN0aW9uLmZpZWxkKXtcclxuICAgICAgY2FzZSAnRGV0YWlscyc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGVUb0RldGFpbHMocm93RGF0YS5pZCk7XHJcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlT2JqZWN0KHJvd0RhdGEuaWQpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBhY3Rpb24ub25DbGljayhyb3dEYXRhLmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJvd0RhdGEocm93RGF0YTogYW55LCBjb2w6IENvbHVtbik6IHN0cmluZ3tcclxuICAgICAgc3dpdGNoIChjb2wuZmlsdGVyVHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICAgICAgcmV0dXJuIHJvd0RhdGFbY29sLmZpZWxkXTtcclxuICAgICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICAgIGlmIChyb3dEYXRhW2NvbC5maWVsZF0gPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGlmIChjb2wuc2hvd1RpbWUpXHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXREYXRlKHJvd0RhdGFbY29sLmZpZWxkXSwgJ2RkLk1NLnl5eXkuIEhIOm1tJywgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZShyb3dEYXRhW2NvbC5maWVsZF0sICdkZC5NTS55eXl5LicsIHRoaXMubG9jYWxlKTtcclxuICAgICAgICBjYXNlICdtdWx0aXNlbGVjdCc6XHJcbiAgICAgICAgICByZXR1cm4gcm93RGF0YVtjb2wuZmllbGRdO1xyXG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxyXG4gICAgICAgICAgcmV0dXJuIHJvd0RhdGFbY29sLmZpZWxkXSA9PSB0cnVlID8gdGhpcy50cmFuc2xvY29TZXJ2aWNlLnRyYW5zbGF0ZSgnWWVzJykgOiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdObycpO1xyXG4gICAgICAgIGNhc2UgJ251bWVyaWMnOlxyXG4gICAgICAgICAgLy8gVE9ETyBGVDogbWFrZSBkZWNpbWFsIHBpcGVcclxuICAgICAgICAgIHJldHVybiByb3dEYXRhW2NvbC5maWVsZF07XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBjb2xUcmFja0J5Rm4oaW5kZXgsIGl0ZW0pe1xyXG4gICAgcmV0dXJuIGl0ZW0uZmllbGQ7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25UcmFja0J5Rm4oaW5kZXgsIGl0ZW06IEFjdGlvbil7XHJcbiAgICByZXR1cm4gYCR7aW5kZXh9JHtpdGVtLmZpZWxkfWBcclxuICB9XHJcblxyXG4gIGV4cG9ydExpc3RUb0V4Y2VsKCkge1xyXG4gICAgbGV0IHRhYmxlRmlsdGVyOiBUYWJsZUZpbHRlciA9IHRoaXMubGFzdExhenlMb2FkRXZlbnQgYXMgdW5rbm93biBhcyBUYWJsZUZpbHRlcjtcclxuICAgIHRhYmxlRmlsdGVyLmFkZGl0aW9uYWxGaWx0ZXJJZExvbmcgPSB0aGlzLmFkZGl0aW9uYWxGaWx0ZXJJZExvbmc7XHJcblxyXG4gICAgZXhwb3J0TGlzdFRvRXhjZWwodGhpcy5leHBvcnRUYWJsZURhdGFUb0V4Y2VsT2JzZXJ2YWJsZU1ldGhvZCwgdGFibGVGaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXIodGFibGU6IFRhYmxlKSB7XHJcbiAgICB0YWJsZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIFNlbGVjdGlvblxyXG5cclxuICBzZXRGYWtlSXNBbGxTZWxlY3RlZCgpe1xyXG4gICAgaWYodGhpcy5yb3dzU2VsZWN0ZWROdW1iZXIgPT0gdGhpcy50b3RhbFJlY29yZHMpXHJcbiAgICAgIHRoaXMuZmFrZUlzQWxsU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmZha2VJc0FsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBbGwoY2hlY2tlZDogYm9vbGVhbil7XHJcbiAgICB0aGlzLnVuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5uZXdseVNlbGVjdGVkSXRlbXMubGVuZ3RoID0gMDtcclxuXHJcbiAgICBpZiAoY2hlY2tlZCA9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZmFrZUlzQWxsU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9uSXNBbGxTZWxlY3RlZENoYW5nZS5uZXh0KG5ldyBBbGxDbGlja0V2ZW50KHtjaGVja2VkOiB0cnVlLCBhZGRpdGlvbmFsSW5kZXhlczogdGhpcy5hZGRpdGlvbmFsSW5kZXhlc30pKTtcclxuICAgICAgdGhpcy5yb3dzU2VsZWN0ZWROdW1iZXIgPSB0aGlzLnRvdGFsUmVjb3JkcztcclxuICAgICAgdGhpcy5mYWtlU2VsZWN0ZWRJdGVtcyA9IFsuLi50aGlzLml0ZW1zLm1hcCh4ID0+IHguaWQpXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBbLi4udGhpcy5pdGVtcy5tYXAoeCA9PiB4LmlkKV1cclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZha2VJc0FsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub25Jc0FsbFNlbGVjdGVkQ2hhbmdlLm5leHQobmV3IEFsbENsaWNrRXZlbnQoe2NoZWNrZWQ6IGZhbHNlLCBhZGRpdGlvbmFsSW5kZXhlczogdGhpcy5hZGRpdGlvbmFsSW5kZXhlc30pKTtcclxuICAgICAgdGhpcy5yb3dzU2VsZWN0ZWROdW1iZXIgPSAwO1xyXG4gICAgICB0aGlzLmZha2VTZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSb3coaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChpZCkpIHtcclxuICAgICAgdGhpcy5yb3dVbnNlbGVjdChpZCk7XHJcbiAgICAgIHRoaXMub25Sb3dVbnNlbGVjdC5uZXh0KG5ldyBSb3dDbGlja0V2ZW50KHsgaW5kZXg6IGluZGV4LCBpZDogaWQsIGFkZGl0aW9uYWxJbmRleGVzOiB0aGlzLmFkZGl0aW9uYWxJbmRleGVzIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm93U2VsZWN0KGlkKTtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5uZXh0KG5ldyBSb3dDbGlja0V2ZW50KHsgaW5kZXg6IGluZGV4LCBpZDogaWQsIGFkZGl0aW9uYWxJbmRleGVzOiB0aGlzLmFkZGl0aW9uYWxJbmRleGVzIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzUm93U2VsZWN0ZWQoaWQ6IG51bWJlcil7XHJcbiAgICBpZiAodGhpcy5oYXNMYXp5TG9hZCl7XHJcbiAgICAgIHJldHVybiB0aGlzLmZha2VTZWxlY3RlZEl0ZW1zLmZpbmQoeCA9PiB4ID09PSBpZCkgIT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbUlkcy5maW5kKHggPT4geCA9PT0gaWQpICE9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJvd1NlbGVjdChpZDogbnVtYmVyKXtcclxuICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQgPT0gZmFsc2UgfHwgdGhpcy5jdXJyZW50UGFnZVNlbGVjdGVkSXRlbXNGcm9tRGIuaW5jbHVkZXMoaWQpID09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMubmV3bHlTZWxlY3RlZEl0ZW1zLnB1c2goaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0xhenlMb2FkKXtcclxuICAgICAgdGhpcy5mYWtlU2VsZWN0ZWRJdGVtcy5wdXNoKGlkKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcy5wdXNoKGlkKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5yb3dzU2VsZWN0ZWROdW1iZXIrKztcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMudW5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoaWQpO1xyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICB0aGlzLnVuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBGVDogU3BsaWNlIGlzIG11dGF0aW5nIHRoZSBhcnJheVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0RmFrZUlzQWxsU2VsZWN0ZWQoKTtcclxuICB9XHJcbiAgXHJcbiAgcm93VW5zZWxlY3QoaWQ6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCA9PSB0cnVlIHx8IHRoaXMuY3VycmVudFBhZ2VTZWxlY3RlZEl0ZW1zRnJvbURiLmluY2x1ZGVzKGlkKSA9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMudW5zZWxlY3RlZEl0ZW1zLnB1c2goaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm93c1NlbGVjdGVkTnVtYmVyLS07XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm5ld2x5U2VsZWN0ZWRJdGVtcy5pbmRleE9mKGlkKTtcclxuICAgIGNvbnN0IGZha2VJbmRleCA9IHRoaXMuZmFrZVNlbGVjdGVkSXRlbXMuaW5kZXhPZihpZCk7XHJcbiAgICBjb25zdCBub25MYXp5TG9hZEluZGV4ID0gdGhpcy5zZWxlY3RlZEl0ZW1JZHMuaW5kZXhPZihpZCk7XHJcblxyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICB0aGlzLm5ld2x5U2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBGVDogU3BsaWNlIGlzIG11dGF0aW5nIHRoZSBhcnJheVxyXG4gICAgfVxyXG4gICAgaWYgKGZha2VJbmRleCAhPT0gLTEpIHtcclxuICAgICAgdGhpcy5mYWtlU2VsZWN0ZWRJdGVtcy5zcGxpY2UoZmFrZUluZGV4LCAxKTsgLy8gRlQ6IFNwbGljZSBpcyBtdXRhdGluZyB0aGUgYXJyYXlcclxuICAgIH1cclxuICAgIGlmIChub25MYXp5TG9hZEluZGV4ICE9PSAtMSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcy5zcGxpY2Uobm9uTGF6eUxvYWRJbmRleCwgMSk7IC8vIEZUOiBTcGxpY2UgaXMgbXV0YXRpbmcgdGhlIGFycmF5XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRGYWtlSXNBbGxTZWxlY3RlZCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIENsaWVudCBzaWRlIHRhYmxlXHJcblxyXG4gIC8vIEZUOiBDYW4gZG8gaXQgd2l0aCBJZCBhbHNvLCBiZWNhdXNlIHdlIGFyZSBuZXZlciBhZGRpbmcgdGhlIG5ldyByZWNvcmQgaW4gdGhlIHRhYmxlIGF0IHRoZSBzYW1lIHBhZ2UuXHJcbiAgZ2V0Rm9ybUFycmF5Q29udHJvbEJ5SW5kZXgoZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBTcGlkZXJseUZvcm1Db250cm9se1xyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUNvbnRyb2woZm9ybUNvbnRyb2xOYW1lLCBpbmRleCwgdGhpcy5hZGRpdGlvbmFsSW5kZXhlcyk7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWN0aW9uIHtcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIGZpZWxkPzogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgc3R5bGU/OiBzdHJpbmc7XHJcbiAgb25DbGljaz86IChpZDogbnVtYmVyKSA9PiB2b2lkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHtcclxuICAgICAgbmFtZSxcclxuICAgICAgZmllbGQsXHJcbiAgICAgIGljb24sXHJcbiAgICAgIHN0eWxlLFxyXG4gICAgICBvbkNsaWNrLFxyXG4gICAgfTp7XHJcbiAgICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICAgIGZpZWxkPzogc3RyaW5nO1xyXG4gICAgICBpY29uPzogc3RyaW5nO1xyXG4gICAgICBzdHlsZT86IHN0cmluZztcclxuICAgICAgb25DbGljaz86ICgpID0+IHZvaWQ7XHJcbiAgICB9ID0ge31cclxuICAgICkge1xyXG4gICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XHJcbiAgICAgIHRoaXMuaWNvbiA9IGljb247XHJcbiAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcclxuICAgICAgdGhpcy5vbkNsaWNrID0gb25DbGljaztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb2x1bW48VCA9IGFueT4ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBmaWVsZD86IHN0cmluZyAmIGtleW9mIFQ7XHJcbiAgZmlsdGVyRmllbGQ/OiBzdHJpbmcgJiBrZXlvZiBUOyAvLyBGVDogTWFkZSBzcGVjaWZpY2FseSBmb3IgbXVsdGlhdXRvY29tcGxldGUsIG1heWJlIGZvciBzb21ldGhpbmcgbW9yZSBpbiB0aGUgZnV0dXJlXHJcbiAgZmlsdGVyVHlwZT86ICd0ZXh0JyB8ICdkYXRlJyB8ICdtdWx0aXNlbGVjdCcgfCAnYm9vbGVhbicgfCAnbnVtZXJpYyc7XHJcbiAgZmlsdGVyUGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgc2hvd01hdGNoTW9kZXM/OiBib29sZWFuO1xyXG4gIHNob3dBZGRCdXR0b24/OiBib29sZWFuO1xyXG4gIGRyb3Bkb3duT3JNdWx0aXNlbGVjdFZhbHVlcz86IFByaW1lbmdPcHRpb25bXTtcclxuICBhY3Rpb25zPzogQWN0aW9uW107XHJcbiAgZWRpdGFibGU/OiBib29sZWFuO1xyXG4gIHNob3dUaW1lPzogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGZpZWxkLFxyXG4gICAgICBmaWx0ZXJGaWVsZCxcclxuICAgICAgZmlsdGVyVHlwZSxcclxuICAgICAgZmlsdGVyUGxhY2Vob2xkZXIsXHJcbiAgICAgIHNob3dNYXRjaE1vZGVzLFxyXG4gICAgICBzaG93QWRkQnV0dG9uLFxyXG4gICAgICBkcm9wZG93bk9yTXVsdGlzZWxlY3RWYWx1ZXMsXHJcbiAgICAgIGFjdGlvbnMsXHJcbiAgICAgIGVkaXRhYmxlLFxyXG4gICAgICBzaG93VGltZSxcclxuICAgIH06e1xyXG4gICAgICBuYW1lPzogc3RyaW5nO1xyXG4gICAgICBmaWVsZD86IHN0cmluZyAmIGtleW9mIFQ7XHJcbiAgICAgIGZpbHRlckZpZWxkPzogc3RyaW5nICYga2V5b2YgVDsgLy8gRlQ6IE1hZGUgc3BlY2lmaWNhbHkgZm9yIG11bHRpYXV0b2NvbXBsZXRlLCBtYXliZSBmb3Igc29tZXRoaW5nIG1vcmUgaW4gdGhlIGZ1dHVyZTtcclxuICAgICAgZmlsdGVyVHlwZT86ICd0ZXh0JyB8ICdkYXRlJyB8ICdtdWx0aXNlbGVjdCcgfCAnYm9vbGVhbicgfCAnbnVtZXJpYyc7XHJcbiAgICAgIGZpbHRlclBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG4gICAgICBzaG93TWF0Y2hNb2Rlcz86IGJvb2xlYW47XHJcbiAgICAgIHNob3dBZGRCdXR0b24/OiBib29sZWFuO1xyXG4gICAgICBkcm9wZG93bk9yTXVsdGlzZWxlY3RWYWx1ZXM/OiBQcmltZW5nT3B0aW9uW107XHJcbiAgICAgIGFjdGlvbnM/OiBBY3Rpb25bXTtcclxuICAgICAgZWRpdGFibGU/OiBib29sZWFuO1xyXG4gICAgICBzaG93VGltZT86IGJvb2xlYW47XHJcbiAgICB9ID0ge31cclxuICAgICkge1xyXG4gICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XHJcbiAgICAgIHRoaXMuZmlsdGVyRmllbGQgPSBmaWx0ZXJGaWVsZDtcclxuICAgICAgdGhpcy5maWx0ZXJUeXBlID0gZmlsdGVyVHlwZTtcclxuICAgICAgdGhpcy5maWx0ZXJQbGFjZWhvbGRlciA9IGZpbHRlclBsYWNlaG9sZGVyO1xyXG4gICAgICB0aGlzLnNob3dNYXRjaE1vZGVzID0gc2hvd01hdGNoTW9kZXM7XHJcbiAgICAgIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IHNob3dBZGRCdXR0b247XHJcbiAgICAgIHRoaXMuZHJvcGRvd25Pck11bHRpc2VsZWN0VmFsdWVzID0gZHJvcGRvd25Pck11bHRpc2VsZWN0VmFsdWVzO1xyXG4gICAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zO1xyXG4gICAgICB0aGlzLmVkaXRhYmxlID0gZWRpdGFibGU7XHJcbiAgICAgIHRoaXMuc2hvd1RpbWUgPSBzaG93VGltZTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSb3dDbGlja0V2ZW50IHtcclxuICBpbmRleD86IG51bWJlcjtcclxuICBpZD86IG51bWJlcjtcclxuICBhZGRpdGlvbmFsSW5kZXhlcz86IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB7XHJcbiAgICAgIGluZGV4LCBcclxuICAgICAgaWQsIFxyXG4gICAgICBhZGRpdGlvbmFsSW5kZXhlc1xyXG4gICAgfTp7XHJcbiAgICAgIGluZGV4PzogbnVtYmVyOyBcclxuICAgICAgaWQ/OiBudW1iZXI7IFxyXG4gICAgICBhZGRpdGlvbmFsSW5kZXhlcz86IGFueTtcclxuICAgIH0gPSB7fVxyXG4gICAgKSB7XHJcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB0aGlzLmFkZGl0aW9uYWxJbmRleGVzID0gYWRkaXRpb25hbEluZGV4ZXM7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWxsQ2xpY2tFdmVudCB7XHJcbiAgY2hlY2tlZD86IGJvb2xlYW47XHJcbiAgYWRkaXRpb25hbEluZGV4ZXM/OiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAge1xyXG4gICAgICBjaGVja2VkLCBcclxuICAgICAgYWRkaXRpb25hbEluZGV4ZXNcclxuICAgIH06e1xyXG4gICAgICBjaGVja2VkPzogYm9vbGVhbjsgXHJcbiAgICAgIGFkZGl0aW9uYWxJbmRleGVzPzogYW55O1xyXG4gICAgfSA9IHt9XHJcbiAgICApIHtcclxuICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcbiAgICB0aGlzLmFkZGl0aW9uYWxJbmRleGVzID0gYWRkaXRpb25hbEluZGV4ZXM7XHJcbiAgfVxyXG59IiwiPG5nLWNvbnRhaW5lciAqdHJhbnNsb2NvPVwibGV0IHRcIj5cclxuICA8ZGl2IFtjbGFzc109XCJzaG93Q2FyZFdyYXBwZXIgPyAnY2FyZCByZXNwb25zaXZlLWNhcmQtcGFkZGluZyBvdmVyZmxvdy1hdXRvJyA6ICcnXCI+XHJcbiAgICA8cC10YWJsZSAjZHQgW3ZhbHVlXT1cIml0ZW1zXCIgW3Jvd3NdPVwicm93c1wiIFtyb3dIb3Zlcl09XCJ0cnVlXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLWdyaWRsaW5lc1wiIFtwYWdpbmF0b3JdPVwic2hvd1BhZ2luYXRvclwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBbbGF6eV09XCJoYXNMYXp5TG9hZFwiXHJcbiAgICAob25MYXp5TG9hZCk9XCJsYXp5TG9hZCgkZXZlbnQpXCIgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIiBjbGFzcz1cInNwaWRlcmx5LXRhYmxlXCIgW2xvYWRpbmddPVwiKGl0ZW1zID09PSB1bmRlZmluZWQgfHwgbG9hZGluZyA9PT0gdHJ1ZSlcIiBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCIgZGF0YUtleT1cImlkXCIgXHJcbiAgICAob25GaWx0ZXIpPVwiZmlsdGVyKCRldmVudClcIj4gXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlciBvdmVyZmxvdy1hdXRvXCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwie3t0YWJsZUljb259fSB0ZXh0LTJ4bCBwcmltYXJ5LWNvbG9yXCI+PC9pPlxyXG4gICAgICAgICAgICA8aDUgc3R5bGU9XCJtYXJnaW46IDBweDtcIj57e3RhYmxlVGl0bGV9fTwvaDU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIFtsYWJlbF09XCJ0KCdDbGVhckZpbHRlcnMnKVwiIGNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcmVtb3ZlLWJ1dHRvbi1ib3JkZXItZm9jdXNcIiBzdHlsZT1cImZsZXg6IG5vbmU7XCIgaWNvbj1cInBpIHBpLWZpbHRlci1zbGFzaFwiIChjbGljayk9XCJjbGVhcihkdClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uICpuZ0lmPVwic2hvd0V4cG9ydFRvRXhjZWxCdXR0b25cIiBbbGFiZWxdPVwidCgnRXhwb3J0VG9FeGNlbCcpXCIgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCByZW1vdmUtYnV0dG9uLWJvcmRlci1mb2N1c1wiIHN0eWxlPVwiZmxleDogbm9uZTtcIiBpY29uPVwicGkgcGktZG93bmxvYWRcIiAoY2xpY2spPVwiZXhwb3J0TGlzdFRvRXhjZWwoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gKm5nSWY9XCJzaG93UmVsb2FkVGFibGVCdXR0b25cIiBbbGFiZWxdPVwidCgnUmVsb2FkJylcIiBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHJlbW92ZS1idXR0b24tYm9yZGVyLWZvY3VzXCIgc3R5bGU9XCJmbGV4OiBub25lO1wiIGljb249XCJwaSBwaS1yZWZyZXNoXCIgKGNsaWNrKT1cInJlbG9hZCgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAwcmVtO1wiICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSAnbXVsdGlwbGUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cclxuICAgICAgICAgICAgICA8cC1jaGVja2JveCBbZGlzYWJsZWRdPVwicmVhZG9ubHlcIiAob25DaGFuZ2UpPVwic2VsZWN0QWxsKCRldmVudC5jaGVja2VkKVwiIFsobmdNb2RlbCldPVwiZmFrZUlzQWxsU2VsZWN0ZWRcIiBbYmluYXJ5XT1cInRydWVcIj48L3AtY2hlY2tib3g+ICh7e3Jvd3NTZWxlY3RlZE51bWJlcn19KVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sczsgdHJhY2tCeTogY29sVHJhY2tCeUZuXCI+XHJcbiAgICAgICAgICAgIDx0aCBbc3R5bGVdPVwiZ2V0Q29sSGVhZGVyV2lkdGgoY29sLmZpbHRlclR5cGUpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIHt7Y29sLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPCEtLSA8cC1zb3J0SWNvbiBmaWVsZD1cIlwiPjwvcC1zb3J0SWNvbj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxwLWNvbHVtbkZpbHRlciB0eXBlPVwiZGF0ZVwiIGZpZWxkPVwiZGF0ZVwiIGRpc3BsYXk9XCJtZW51XCI+PC9wLWNvbHVtbkZpbHRlcj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgKm5nSWY9XCJjb2wuZmlsdGVyVHlwZSAhPSBudWxsXCIgW3R5cGVdPVwiY29sLmZpbHRlclR5cGVcIiBbZmllbGRdPVwiY29sLmZpbHRlckZpZWxkID8/IGNvbC5maWVsZFwiIGRpc3BsYXk9XCJtZW51XCIgW3BsYWNlaG9sZGVyXT1cImNvbC5maWx0ZXJQbGFjZWhvbGRlclwiIFxyXG4gICAgICAgICAgICAgICAgW3Nob3dPcGVyYXRvcl09XCJmYWxzZVwiIFtzaG93TWF0Y2hNb2Rlc109XCJjb2wuc2hvd01hdGNoTW9kZXNcIiBbc2hvd0FkZEJ1dHRvbl09XCJjb2wuc2hvd0FkZEJ1dHRvblwiIFttYXRjaE1vZGVPcHRpb25zXT1cImdldENvbE1hdGNoTW9kZU9wdGlvbnMoY29sLmZpbHRlclR5cGUpXCJcclxuICAgICAgICAgICAgICAgIFttYXRjaE1vZGVdPVwiZ2V0Q29sTWF0Y2hNb2RlKGNvbC5maWx0ZXJUeXBlKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEcm9wT3JNdWx0aShjb2wuZmlsdGVyVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbbmdNb2RlbF09XCJ2YWx1ZVwiIFtvcHRpb25zXT1cImNvbC5kcm9wZG93bk9yTXVsdGlzZWxlY3RWYWx1ZXNcIiBbcGxhY2Vob2xkZXJdPVwidCgnQWxsJylcIiAob25DaGFuZ2UpPVwiZmlsdGVyKCRldmVudC52YWx1ZSlcIiBvcHRpb25MYWJlbD1cImxhYmVsXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIFtzdHlsZV09XCJ7J3dpZHRoJzonMjQwcHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtbXVsdGlzZWxlY3QtcmVwcmVzZW50YXRpdmUtb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1pbmRleD1cInJvd0luZGV4XCIgbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCI+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSAnbXVsdGlwbGUnXCI+XHJcbiAgICAgICAgICAgICAgPHAtY2hlY2tib3ggW2Rpc2FibGVkXT1cInJlYWRvbmx5XCIgKG9uQ2hhbmdlKT1cInNlbGVjdFJvdyhyb3dEYXRhLmlkLCByb3dEYXRhLmluZGV4KVwiIFtuZ01vZGVsXT1cImlzUm93U2VsZWN0ZWQocm93RGF0YS5pZClcIiBbYmluYXJ5XT1cInRydWVcIj48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHM7IHRyYWNrQnk6IGNvbFRyYWNrQnlGblwiPlxyXG4gICAgICAgICAgICA8dGQgW3BUb29sdGlwXT1cImdldFJvd0RhdGEocm93RGF0YSwgY29sKVwiIFtzdHlsZV09XCJnZXRTdHlsZUZvckJvZHlDb2x1bW4oY29sKVwiICpuZ0lmPVwiIWNvbC5lZGl0YWJsZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiAxOHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbC5hY3Rpb25zOyB0cmFja0J5OiBhY3Rpb25UcmFja0J5Rm5cIiA+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtwVG9vbHRpcF09XCJhY3Rpb24ubmFtZVwiIFtjbGFzc109XCJnZXRDbGFzc0ZvckFjdGlvbihhY3Rpb24pXCIgKGNsaWNrKT1cImdldE1ldGhvZEZvckFjdGlvbihhY3Rpb24sIHJvd0RhdGEpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAge3tnZXRSb3dEYXRhKHJvd0RhdGEsIGNvbCl9fVxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJjb2wuZWRpdGFibGVcIj5cclxuICAgICAgICAgICAgICA8c3BpZGVybHktbnVtYmVyIFtjb250cm9sXT1cImdldEZvcm1BcnJheUNvbnRyb2xCeUluZGV4KGNvbC5maWVsZCwgcm93RGF0YS5pbmRleClcIiBbc2hvd0xhYmVsXT1cImZhbHNlXCI+PC9zcGlkZXJseS1udW1iZXI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiY29scz8ubGVuZ3RoICsgKHNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScgPyAxIDogMClcIj57e3QoJ05vUmVjb3Jkc0ZvdW5kJyl9fTwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxvYWRpbmdib2R5XCI+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiY29scz8ubGVuZ3RoICsgKHNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScgPyAxIDogMClcIj57e3QoJ0xvYWRpbmcnKX19Li4uPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicGFnaW5hdG9ybGVmdFwiPlxyXG4gICAgICAgIHt7dCgnVG90YWxSZWNvcmRzJyl9fToge3t0b3RhbFJlY29yZHN9fVxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicGFnaW5hdG9ycmlnaHRcIj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBlbmQ7IGdhcDogMTBweDtcIj5cclxuICAgICAgICAgIDxzcGlkZXJseS1idXR0b24gKm5nSWY9XCJzaG93QWRkQnV0dG9uXCIgW2xhYmVsXT1cInQoJ0FkZE5ldycpXCIgaWNvbj1cInBpIHBpLXBsdXNcIiAob25DbGljayk9XCJuYXZpZ2F0ZVRvRGV0YWlscygwKVwiPjwvc3BpZGVybHktYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLXRhYmxlPlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj4iXX0=