ngx-register-base 1.2.3 → 1.3.1

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 (479) hide show
  1. package/ng-package.json +15 -0
  2. package/package.json +12 -15
  3. package/schematics/ng-update/replace-menu-state-token/index.ts +33 -0
  4. package/schematics/ng-update/update-prefix/index.ts +38 -0
  5. package/schematics/utils/{utils.d.ts → utils.ts} +9 -2
  6. package/src/lib/components/checkbox-selector/checkbox-selector.component.html +91 -0
  7. package/src/lib/components/checkbox-selector/checkbox-selector.component.less +67 -0
  8. package/src/lib/components/checkbox-selector/checkbox-selector.component.ts +176 -0
  9. package/src/lib/components/checkbox-selector/checkbox-selector.types.ts +8 -0
  10. package/src/lib/components/column-settings/column-settings.component.html +160 -0
  11. package/src/lib/components/column-settings/column-settings.component.less +131 -0
  12. package/src/lib/components/column-settings/column-settings.component.ts +352 -0
  13. package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.html +65 -0
  14. package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.less +79 -0
  15. package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.ts +114 -0
  16. package/src/lib/components/column-settings/consts/column-settings.consts.ts +9 -0
  17. package/src/lib/components/column-settings/types/column-settings.types.ts +26 -0
  18. package/src/lib/components/divider/divider.component.html +4 -0
  19. package/src/lib/components/divider/divider.component.less +10 -0
  20. package/src/lib/components/divider/divider.component.ts +12 -0
  21. package/src/lib/components/filter-button/filter-button.component.html +20 -0
  22. package/src/lib/components/filter-button/filter-button.component.less +41 -0
  23. package/src/lib/components/filter-button/filter-button.component.ts +18 -0
  24. package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.html +22 -0
  25. package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.less +23 -0
  26. package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.ts +31 -0
  27. package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.html +49 -0
  28. package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.less +37 -0
  29. package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.ts +66 -0
  30. package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.html +147 -0
  31. package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.less +45 -0
  32. package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.ts +114 -0
  33. package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.html +44 -0
  34. package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.less +49 -0
  35. package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.ts +167 -0
  36. package/src/lib/components/filters/components/filter-list/filter-list.service.ts +97 -0
  37. package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.html +18 -0
  38. package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.less +55 -0
  39. package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.ts +69 -0
  40. package/src/lib/components/filters/components/filter-list.module.ts +29 -0
  41. package/src/lib/components/filters/register-table-filter.component.html +53 -0
  42. package/src/lib/components/filters/register-table-filter.component.less +17 -0
  43. package/src/lib/components/filters/register-table-filter.component.ts +167 -0
  44. package/src/lib/components/filters/register-table-filter.module.ts +22 -0
  45. package/src/lib/components/inputs/inputs.module.ts +104 -0
  46. package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.html +49 -0
  47. package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.less +70 -0
  48. package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.ts +52 -0
  49. package/src/lib/components/inputs/param-custom/param-custom.component.html +1 -0
  50. package/src/lib/components/inputs/param-custom/param-custom.component.ts +9 -0
  51. package/src/lib/components/inputs/param-date/param-date.component.html +55 -0
  52. package/src/lib/components/inputs/param-date/param-date.component.less +67 -0
  53. package/src/lib/components/inputs/param-date/param-date.component.ts +77 -0
  54. package/src/lib/components/inputs/param-date-range/param-date-range.component.html +45 -0
  55. package/src/lib/components/inputs/param-date-range/param-date-range.component.less +75 -0
  56. package/src/lib/components/inputs/param-date-range/param-date-range.component.ts +67 -0
  57. package/src/lib/components/inputs/param-date-time/param-date-time.component.html +70 -0
  58. package/src/lib/components/inputs/param-date-time/param-date-time.component.less +72 -0
  59. package/src/lib/components/inputs/param-date-time/param-date-time.component.ts +101 -0
  60. package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.html +67 -0
  61. package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.less +103 -0
  62. package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.ts +128 -0
  63. package/src/lib/components/inputs/param-month/param-month.component.html +46 -0
  64. package/src/lib/components/inputs/param-month/param-month.component.less +72 -0
  65. package/src/lib/components/inputs/param-month/param-month.component.ts +55 -0
  66. package/src/lib/components/inputs/param-month-range/param-month-range.component.html +39 -0
  67. package/src/lib/components/inputs/param-month-range/param-month-range.component.less +71 -0
  68. package/src/lib/components/inputs/param-month-range/param-month-range.component.ts +76 -0
  69. package/src/lib/components/inputs/param-multi-select/param-multi-select.component.html +84 -0
  70. package/src/lib/components/inputs/param-multi-select/param-multi-select.component.less +108 -0
  71. package/src/lib/components/inputs/param-multi-select/param-multi-select.component.ts +448 -0
  72. package/src/lib/components/inputs/param-select/param-select.component.html +106 -0
  73. package/src/lib/components/inputs/param-select/param-select.component.less +26 -0
  74. package/src/lib/components/inputs/param-select/param-select.component.ts +318 -0
  75. package/src/lib/components/inputs/param-switcher/param-switcher.component.html +8 -0
  76. package/src/lib/components/inputs/param-switcher/param-switcher.component.less +53 -0
  77. package/src/lib/components/inputs/param-switcher/param-switcher.component.ts +13 -0
  78. package/src/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.ts +29 -0
  79. package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.html +19 -0
  80. package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.less +76 -0
  81. package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.ts +134 -0
  82. package/src/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.ts +8 -0
  83. package/src/lib/components/inputs/param-text/param-text.component.html +59 -0
  84. package/src/lib/components/inputs/param-text/param-text.component.less +33 -0
  85. package/src/lib/components/inputs/param-text/param-text.component.ts +36 -0
  86. package/src/lib/components/inputs/param-textarea/param-textarea.component.html +61 -0
  87. package/src/lib/components/inputs/param-textarea/param-textarea.component.less +21 -0
  88. package/src/lib/components/inputs/param-textarea/param-textarea.component.ts +33 -0
  89. package/src/lib/components/inputs/param-toggle/param-toggle.component.html +40 -0
  90. package/src/lib/components/inputs/param-toggle/param-toggle.component.less +69 -0
  91. package/src/lib/components/inputs/param-toggle/param-toggle.component.ts +14 -0
  92. package/src/lib/components/inputs/param-tree/consts/param-tree.consts.ts +59 -0
  93. package/src/lib/components/inputs/param-tree/param-tree.component.html +51 -0
  94. package/src/lib/components/inputs/param-tree/param-tree.component.less +3 -0
  95. package/src/lib/components/inputs/param-tree/param-tree.component.ts +282 -0
  96. package/src/lib/components/inputs/param-tree/services/param-tree.service.ts +176 -0
  97. package/src/lib/components/inputs/param-tree/services/sync-tree-loader.service.ts +18 -0
  98. package/{lib/components/inputs/param-tree/tokens/param-tree.tokens.d.ts → src/lib/components/inputs/param-tree/tokens/param-tree.tokens.ts} +2 -1
  99. package/src/lib/components/inputs/param-tree/types/param-tree.types.ts +39 -0
  100. package/src/lib/components/inputs/param-tree/utils/param-tree.utils.ts +18 -0
  101. package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.html +78 -0
  102. package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.less +109 -0
  103. package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.ts +89 -0
  104. package/src/lib/components/inputs/param-tree-select/param-tree-select.component.html +54 -0
  105. package/src/lib/components/inputs/param-tree-select/param-tree-select.component.less +56 -0
  106. package/src/lib/components/inputs/param-tree-select/param-tree-select.component.ts +91 -0
  107. package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.html +5 -0
  108. package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.ts +13 -0
  109. package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.html +4 -0
  110. package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.ts +11 -0
  111. package/src/lib/components/menu-constructor/sproc-menu-constructor.component.html +95 -0
  112. package/src/lib/components/menu-constructor/sproc-menu-constructor.component.less +183 -0
  113. package/src/lib/components/menu-constructor/sproc-menu-constructor.component.ts +687 -0
  114. package/src/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.ts +32 -0
  115. package/src/lib/components/menu-constructor/store/sproc-menu-constructor.consts.ts +46 -0
  116. package/{lib/components/menu-constructor/store/sproc-menu.tokens.d.ts → src/lib/components/menu-constructor/store/sproc-menu.tokens.ts} +4 -1
  117. package/src/lib/components/page-menu/README.md +60 -0
  118. package/src/lib/components/page-menu/schema/sproc-page-menu.consts.ts +8 -0
  119. package/src/lib/components/page-menu/schema/sproc-page-menu.schema.ts +35 -0
  120. package/src/lib/components/page-menu/schema/sproc-page-menu.tokens.ts +5 -0
  121. package/src/lib/components/page-menu/schema/sproc-page-menu.types.ts +42 -0
  122. package/src/lib/components/page-menu/sproc-page-menu.component.html +166 -0
  123. package/src/lib/components/page-menu/sproc-page-menu.component.less +228 -0
  124. package/src/lib/components/page-menu/sproc-page-menu.component.ts +337 -0
  125. package/src/lib/components/paginator/paginator.component.html +97 -0
  126. package/src/lib/components/paginator/paginator.component.less +101 -0
  127. package/src/lib/components/paginator/paginator.component.ts +192 -0
  128. package/src/lib/components/paginator/types/paginator.types.ts +16 -0
  129. package/src/lib/components/register-table/consts/register-table.consts.ts +3 -0
  130. package/src/lib/components/register-table/directives/cell-template.directive.ts +11 -0
  131. package/src/lib/components/register-table/directives/header-template.directive.ts +11 -0
  132. package/src/lib/components/register-table/model/schema.ts +62 -0
  133. package/src/lib/components/register-table/pipes/class-by-type.pipe.ts +28 -0
  134. package/src/lib/components/register-table/pipes/sticky-column.pipe.ts +11 -0
  135. package/src/lib/components/register-table/register-table.component.html +257 -0
  136. package/src/lib/components/register-table/register-table.component.less +151 -0
  137. package/src/lib/components/register-table/register-table.component.ts +743 -0
  138. package/src/lib/components/reset-settings-form/reset-settings-form.component.html +14 -0
  139. package/src/lib/components/reset-settings-form/reset-settings-form.component.less +26 -0
  140. package/src/lib/components/reset-settings-form/reset-settings-form.component.ts +15 -0
  141. package/src/lib/components/search-input/search-input.component.html +6 -0
  142. package/src/lib/components/search-input/search-input.component.less +17 -0
  143. package/src/lib/components/search-input/search-input.component.ts +31 -0
  144. package/src/lib/components/sliding-panel/sliding-panel.component.html +13 -0
  145. package/src/lib/components/sliding-panel/sliding-panel.component.less +112 -0
  146. package/src/lib/components/sliding-panel/sliding-panel.component.ts +36 -0
  147. package/src/lib/components/sliding-panel/sliding-panel.module.ts +11 -0
  148. package/src/lib/consts/date-time.consts.ts +1 -0
  149. package/src/lib/consts/index.ts +8 -0
  150. package/src/lib/consts/inputs.consts.ts +9 -0
  151. package/src/lib/consts/month.consts.ts +82 -0
  152. package/src/lib/consts/params.consts.ts +1 -0
  153. package/src/lib/consts/register-base.consts.ts +40 -0
  154. package/src/lib/core/form-group-wrapper/errors-consts.ts +6 -0
  155. package/src/lib/core/form-group-wrapper/form-group-wrapper.ts +109 -0
  156. package/src/lib/core/input-control/input-control.ts +30 -0
  157. package/src/lib/core/param/param-base.ts +262 -0
  158. package/src/lib/core/param/param-date-base.ts +30 -0
  159. package/src/lib/core/param/param-select-base.ts +118 -0
  160. package/src/lib/core/param/param-text-base.ts +23 -0
  161. package/{lib/core/param/param.tokens.d.ts → src/lib/core/param/param.tokens.ts} +2 -1
  162. package/src/lib/core/register-base/register-base.store.ts +84 -0
  163. package/src/lib/core/register-base/register-base.ts +854 -0
  164. package/src/lib/directives/date/date-time.types.ts +36 -0
  165. package/src/lib/directives/date/format-date.pipe.ts +28 -0
  166. package/src/lib/directives/number/number-only.directive.ts +36 -0
  167. package/src/lib/directives/sticky/sticky-relative.directive.ts +30 -0
  168. package/src/lib/directives/sticky/sticky-relative.service.ts +34 -0
  169. package/src/lib/directives/sticky/sticky.directive.ts +189 -0
  170. package/src/lib/services/date-time.service.ts +399 -0
  171. package/src/lib/services/dialog/dialog.service.ts +62 -0
  172. package/{lib/services/dialog/dialog.types.d.ts → src/lib/services/dialog/dialog.types.ts} +8 -4
  173. package/src/lib/services/dom-intersection.service.ts +23 -0
  174. package/src/lib/services/filter/filters-state.service.ts +83 -0
  175. package/src/lib/services/filter/filters-transmit.service.ts +105 -0
  176. package/src/lib/services/filter/filters.service.ts +21 -0
  177. package/src/lib/services/inputs-state.service.ts +157 -0
  178. package/src/lib/services/inputs.service.ts +114 -0
  179. package/src/lib/services/key-pressed.service.ts +40 -0
  180. package/src/lib/services/resize-window-observer.service.ts +37 -0
  181. package/src/lib/services/selected-objects-state.service.ts +159 -0
  182. package/src/lib/store/fast-query-store.service.ts +132 -0
  183. package/{lib/types/event.types.d.ts → src/lib/types/event.types.ts} +1 -1
  184. package/src/lib/types/hasura.types.ts +41 -0
  185. package/src/lib/types/inputs.types.ts +63 -0
  186. package/src/lib/types/params.types.ts +42 -0
  187. package/src/lib/types/register-base.types.ts +161 -0
  188. package/src/lib/types/sub-types.ts +15 -0
  189. package/src/lib/types/user-profile.types.ts +18 -0
  190. package/src/lib/utils/functions.ts +11 -0
  191. package/src/lib/utils/get-url-segment.ts +46 -0
  192. package/src/lib/utils/prizm.shared.module.ts +176 -0
  193. package/src/lib/utils/rxjs.ts +33 -0
  194. package/src/lib/utils/select-all-utils.ts +16 -0
  195. package/tsconfig.lib.json +16 -0
  196. package/tsconfig.lib.prod.json +11 -0
  197. package/tsconfig.schematics.json +26 -0
  198. package/tsconfig.spec.json +15 -0
  199. package/esm2022/lib/components/checkbox-selector/checkbox-selector.component.mjs +0 -129
  200. package/esm2022/lib/components/checkbox-selector/checkbox-selector.types.mjs +0 -8
  201. package/esm2022/lib/components/column-settings/column-settings.component.mjs +0 -249
  202. package/esm2022/lib/components/column-settings/components/column-settings-template/column-settings-template.component.mjs +0 -80
  203. package/esm2022/lib/components/column-settings/consts/column-settings.consts.mjs +0 -10
  204. package/esm2022/lib/components/column-settings/index.mjs +0 -3
  205. package/esm2022/lib/components/column-settings/types/column-settings.types.mjs +0 -7
  206. package/esm2022/lib/components/divider/divider.component.mjs +0 -16
  207. package/esm2022/lib/components/filter-button/filter-button.component.mjs +0 -19
  208. package/esm2022/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.mjs +0 -31
  209. package/esm2022/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.mjs +0 -57
  210. package/esm2022/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.mjs +0 -110
  211. package/esm2022/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.mjs +0 -130
  212. package/esm2022/lib/components/filters/components/filter-list/filter-list.service.mjs +0 -89
  213. package/esm2022/lib/components/filters/components/filter-list/filters-section/filters-section.component.mjs +0 -41
  214. package/esm2022/lib/components/filters/components/filter-list.module.mjs +0 -45
  215. package/esm2022/lib/components/filters/index.mjs +0 -3
  216. package/esm2022/lib/components/filters/register-table-filter.component.mjs +0 -155
  217. package/esm2022/lib/components/filters/register-table-filter.module.mjs +0 -39
  218. package/esm2022/lib/components/index.mjs +0 -11
  219. package/esm2022/lib/components/inputs/index.mjs +0 -20
  220. package/esm2022/lib/components/inputs/inputs.module.mjs +0 -166
  221. package/esm2022/lib/components/inputs/param-calendar-year/param-calendar-year.component.mjs +0 -45
  222. package/esm2022/lib/components/inputs/param-custom/param-custom.component.mjs +0 -12
  223. package/esm2022/lib/components/inputs/param-date/param-date.component.mjs +0 -76
  224. package/esm2022/lib/components/inputs/param-date-range/param-date-range.component.mjs +0 -61
  225. package/esm2022/lib/components/inputs/param-date-time/param-date-time.component.mjs +0 -86
  226. package/esm2022/lib/components/inputs/param-date-time-range/param-date-time-range.component.mjs +0 -96
  227. package/esm2022/lib/components/inputs/param-month/param-month.component.mjs +0 -50
  228. package/esm2022/lib/components/inputs/param-month-range/param-month-range.component.mjs +0 -62
  229. package/esm2022/lib/components/inputs/param-multi-select/param-multi-select.component.mjs +0 -309
  230. package/esm2022/lib/components/inputs/param-select/param-select.component.mjs +0 -209
  231. package/esm2022/lib/components/inputs/param-switcher/param-switcher.component.mjs +0 -21
  232. package/esm2022/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.mjs +0 -28
  233. package/esm2022/lib/components/inputs/param-switcher-date-time-range/index.mjs +0 -3
  234. package/esm2022/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.mjs +0 -105
  235. package/esm2022/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.mjs +0 -10
  236. package/esm2022/lib/components/inputs/param-text/param-text.component.mjs +0 -40
  237. package/esm2022/lib/components/inputs/param-textarea/param-textarea.component.mjs +0 -38
  238. package/esm2022/lib/components/inputs/param-toggle/param-toggle.component.mjs +0 -20
  239. package/esm2022/lib/components/inputs/param-tree/consts/param-tree.consts.mjs +0 -37
  240. package/esm2022/lib/components/inputs/param-tree/index.mjs +0 -8
  241. package/esm2022/lib/components/inputs/param-tree/param-tree.component.mjs +0 -207
  242. package/esm2022/lib/components/inputs/param-tree/services/param-tree.service.mjs +0 -116
  243. package/esm2022/lib/components/inputs/param-tree/services/sync-tree-loader.service.mjs +0 -20
  244. package/esm2022/lib/components/inputs/param-tree/tokens/param-tree.tokens.mjs +0 -3
  245. package/esm2022/lib/components/inputs/param-tree/types/param-tree.types.mjs +0 -2
  246. package/esm2022/lib/components/inputs/param-tree/utils/param-tree.utils.mjs +0 -9
  247. package/esm2022/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.mjs +0 -80
  248. package/esm2022/lib/components/inputs/param-tree-select/param-tree-select.component.mjs +0 -85
  249. package/esm2022/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.mjs +0 -15
  250. package/esm2022/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.mjs +0 -12
  251. package/esm2022/lib/components/menu-constructor/index.mjs +0 -5
  252. package/esm2022/lib/components/menu-constructor/sproc-menu-constructor.component.mjs +0 -559
  253. package/esm2022/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.mjs +0 -3
  254. package/esm2022/lib/components/menu-constructor/store/sproc-menu-constructor.consts.mjs +0 -5
  255. package/esm2022/lib/components/menu-constructor/store/sproc-menu.tokens.mjs +0 -3
  256. package/esm2022/lib/components/page-menu/index.mjs +0 -6
  257. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.consts.mjs +0 -9
  258. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.schema.mjs +0 -2
  259. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.tokens.mjs +0 -4
  260. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.types.mjs +0 -3
  261. package/esm2022/lib/components/page-menu/sproc-page-menu.component.mjs +0 -275
  262. package/esm2022/lib/components/paginator/paginator.component.mjs +0 -159
  263. package/esm2022/lib/components/paginator/types/paginator.types.mjs +0 -2
  264. package/esm2022/lib/components/register-table/consts/register-table.consts.mjs +0 -4
  265. package/esm2022/lib/components/register-table/directives/cell-template.directive.mjs +0 -19
  266. package/esm2022/lib/components/register-table/directives/header-template.directive.mjs +0 -18
  267. package/esm2022/lib/components/register-table/index.mjs +0 -4
  268. package/esm2022/lib/components/register-table/model/schema.mjs +0 -10
  269. package/esm2022/lib/components/register-table/pipes/class-by-type.pipe.mjs +0 -33
  270. package/esm2022/lib/components/register-table/pipes/sticky-column.pipe.mjs +0 -17
  271. package/esm2022/lib/components/register-table/register-table.component.mjs +0 -544
  272. package/esm2022/lib/components/reset-settings-form/reset-settings-form.component.mjs +0 -18
  273. package/esm2022/lib/components/search-input/search-input.component.mjs +0 -28
  274. package/esm2022/lib/components/sliding-panel/sliding-panel.component.mjs +0 -48
  275. package/esm2022/lib/components/sliding-panel/sliding-panel.module.mjs +0 -19
  276. package/esm2022/lib/consts/date-time.consts.mjs +0 -2
  277. package/esm2022/lib/consts/index.mjs +0 -4
  278. package/esm2022/lib/consts/inputs.consts.mjs +0 -4
  279. package/esm2022/lib/consts/month.consts.mjs +0 -77
  280. package/esm2022/lib/consts/params.consts.mjs +0 -2
  281. package/esm2022/lib/consts/register-base.consts.mjs +0 -26
  282. package/esm2022/lib/core/form-group-wrapper/errors-consts.mjs +0 -8
  283. package/esm2022/lib/core/form-group-wrapper/form-group-wrapper.mjs +0 -81
  284. package/esm2022/lib/core/form-group-wrapper/index.mjs +0 -2
  285. package/esm2022/lib/core/index.mjs +0 -5
  286. package/esm2022/lib/core/input-control/index.mjs +0 -2
  287. package/esm2022/lib/core/input-control/input-control.mjs +0 -11
  288. package/esm2022/lib/core/param/index.mjs +0 -6
  289. package/esm2022/lib/core/param/param-base.mjs +0 -215
  290. package/esm2022/lib/core/param/param-date-base.mjs +0 -26
  291. package/esm2022/lib/core/param/param-select-base.mjs +0 -114
  292. package/esm2022/lib/core/param/param-text-base.mjs +0 -25
  293. package/esm2022/lib/core/param/param.tokens.mjs +0 -4
  294. package/esm2022/lib/core/register-base/index.mjs +0 -3
  295. package/esm2022/lib/core/register-base/register-base.mjs +0 -575
  296. package/esm2022/lib/core/register-base/register-base.store.mjs +0 -43
  297. package/esm2022/lib/directives/date/date-time.types.mjs +0 -34
  298. package/esm2022/lib/directives/date/format-date.pipe.mjs +0 -33
  299. package/esm2022/lib/directives/index.mjs +0 -3
  300. package/esm2022/lib/directives/number/number-only.directive.mjs +0 -41
  301. package/esm2022/lib/directives/sticky/index.mjs +0 -3
  302. package/esm2022/lib/directives/sticky/sticky-relative.directive.mjs +0 -32
  303. package/esm2022/lib/directives/sticky/sticky-relative.service.mjs +0 -32
  304. package/esm2022/lib/directives/sticky/sticky.directive.mjs +0 -169
  305. package/esm2022/lib/services/date-time.service.mjs +0 -314
  306. package/esm2022/lib/services/dialog/dialog.service.mjs +0 -53
  307. package/esm2022/lib/services/dialog/dialog.types.mjs +0 -2
  308. package/esm2022/lib/services/dialog/index.mjs +0 -3
  309. package/esm2022/lib/services/dom-intersection.service.mjs +0 -22
  310. package/esm2022/lib/services/filter/filters-state.service.mjs +0 -65
  311. package/esm2022/lib/services/filter/filters-transmit.service.mjs +0 -82
  312. package/esm2022/lib/services/filter/filters.service.mjs +0 -23
  313. package/esm2022/lib/services/index.mjs +0 -8
  314. package/esm2022/lib/services/inputs-state.service.mjs +0 -130
  315. package/esm2022/lib/services/inputs.service.mjs +0 -88
  316. package/esm2022/lib/services/key-pressed.service.mjs +0 -37
  317. package/esm2022/lib/services/resize-window-observer.service.mjs +0 -33
  318. package/esm2022/lib/services/selected-objects-state.service.mjs +0 -123
  319. package/esm2022/lib/store/fast-query-store.service.mjs +0 -110
  320. package/esm2022/lib/store/index.mjs +0 -2
  321. package/esm2022/lib/types/event.types.mjs +0 -2
  322. package/esm2022/lib/types/hasura.types.mjs +0 -2
  323. package/esm2022/lib/types/index.mjs +0 -7
  324. package/esm2022/lib/types/inputs.types.mjs +0 -19
  325. package/esm2022/lib/types/params.types.mjs +0 -2
  326. package/esm2022/lib/types/register-base.types.mjs +0 -6
  327. package/esm2022/lib/types/sub-types.mjs +0 -2
  328. package/esm2022/lib/types/user-profile.types.mjs +0 -2
  329. package/esm2022/lib/utils/functions.mjs +0 -10
  330. package/esm2022/lib/utils/get-url-segment.mjs +0 -35
  331. package/esm2022/lib/utils/index.mjs +0 -5
  332. package/esm2022/lib/utils/prizm.shared.module.mjs +0 -284
  333. package/esm2022/lib/utils/rxjs.mjs +0 -28
  334. package/esm2022/lib/utils/select-all-utils.mjs +0 -11
  335. package/esm2022/ngx-register-base.mjs +0 -5
  336. package/esm2022/public-api.mjs +0 -9
  337. package/fesm2022/ngx-register-base.mjs +0 -7465
  338. package/fesm2022/ngx-register-base.mjs.map +0 -1
  339. package/index.d.ts +0 -5
  340. package/lib/components/checkbox-selector/checkbox-selector.component.d.ts +0 -33
  341. package/lib/components/checkbox-selector/checkbox-selector.types.d.ts +0 -7
  342. package/lib/components/column-settings/column-settings.component.d.ts +0 -80
  343. package/lib/components/column-settings/components/column-settings-template/column-settings-template.component.d.ts +0 -24
  344. package/lib/components/column-settings/consts/column-settings.consts.d.ts +0 -8
  345. package/lib/components/column-settings/types/column-settings.types.d.ts +0 -22
  346. package/lib/components/divider/divider.component.d.ts +0 -6
  347. package/lib/components/filter-button/filter-button.component.d.ts +0 -8
  348. package/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.d.ts +0 -14
  349. package/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.d.ts +0 -25
  350. package/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.d.ts +0 -39
  351. package/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.d.ts +0 -41
  352. package/lib/components/filters/components/filter-list/filter-list.service.d.ts +0 -20
  353. package/lib/components/filters/components/filter-list/filters-section/filters-section.component.d.ts +0 -15
  354. package/lib/components/filters/components/filter-list.module.d.ts +0 -15
  355. package/lib/components/filters/register-table-filter.component.d.ts +0 -40
  356. package/lib/components/filters/register-table-filter.module.d.ts +0 -13
  357. package/lib/components/inputs/inputs.module.d.ts +0 -31
  358. package/lib/components/inputs/param-calendar-year/param-calendar-year.component.d.ts +0 -19
  359. package/lib/components/inputs/param-custom/param-custom.component.d.ts +0 -6
  360. package/lib/components/inputs/param-date/param-date.component.d.ts +0 -20
  361. package/lib/components/inputs/param-date-range/param-date-range.component.d.ts +0 -26
  362. package/lib/components/inputs/param-date-time/param-date-time.component.d.ts +0 -25
  363. package/lib/components/inputs/param-date-time-range/param-date-time-range.component.d.ts +0 -28
  364. package/lib/components/inputs/param-month/param-month.component.d.ts +0 -18
  365. package/lib/components/inputs/param-month-range/param-month-range.component.d.ts +0 -21
  366. package/lib/components/inputs/param-multi-select/param-multi-select.component.d.ts +0 -46
  367. package/lib/components/inputs/param-select/param-select.component.d.ts +0 -30
  368. package/lib/components/inputs/param-switcher/param-switcher.component.d.ts +0 -8
  369. package/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.d.ts +0 -2
  370. package/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.d.ts +0 -19
  371. package/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.d.ts +0 -8
  372. package/lib/components/inputs/param-text/param-text.component.d.ts +0 -10
  373. package/lib/components/inputs/param-textarea/param-textarea.component.d.ts +0 -10
  374. package/lib/components/inputs/param-toggle/param-toggle.component.d.ts +0 -9
  375. package/lib/components/inputs/param-tree/consts/param-tree.consts.d.ts +0 -7
  376. package/lib/components/inputs/param-tree/param-tree.component.d.ts +0 -41
  377. package/lib/components/inputs/param-tree/services/param-tree.service.d.ts +0 -37
  378. package/lib/components/inputs/param-tree/services/sync-tree-loader.service.d.ts +0 -10
  379. package/lib/components/inputs/param-tree/types/param-tree.types.d.ts +0 -32
  380. package/lib/components/inputs/param-tree/utils/param-tree.utils.d.ts +0 -7
  381. package/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.d.ts +0 -31
  382. package/lib/components/inputs/param-tree-select/param-tree-select.component.d.ts +0 -30
  383. package/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.d.ts +0 -6
  384. package/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.d.ts +0 -5
  385. package/lib/components/menu-constructor/sproc-menu-constructor.component.d.ts +0 -113
  386. package/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.d.ts +0 -24
  387. package/lib/components/menu-constructor/store/sproc-menu-constructor.consts.d.ts +0 -36
  388. package/lib/components/page-menu/schema/sproc-page-menu.consts.d.ts +0 -7
  389. package/lib/components/page-menu/schema/sproc-page-menu.schema.d.ts +0 -30
  390. package/lib/components/page-menu/schema/sproc-page-menu.tokens.d.ts +0 -3
  391. package/lib/components/page-menu/schema/sproc-page-menu.types.d.ts +0 -36
  392. package/lib/components/page-menu/sproc-page-menu.component.d.ts +0 -48
  393. package/lib/components/paginator/paginator.component.d.ts +0 -52
  394. package/lib/components/paginator/types/paginator.types.d.ts +0 -15
  395. package/lib/components/register-table/consts/register-table.consts.d.ts +0 -3
  396. package/lib/components/register-table/directives/cell-template.directive.d.ts +0 -9
  397. package/lib/components/register-table/directives/header-template.directive.d.ts +0 -9
  398. package/lib/components/register-table/model/schema.d.ts +0 -52
  399. package/lib/components/register-table/pipes/class-by-type.pipe.d.ts +0 -8
  400. package/lib/components/register-table/pipes/sticky-column.pipe.d.ts +0 -7
  401. package/lib/components/register-table/register-table.component.d.ts +0 -165
  402. package/lib/components/reset-settings-form/reset-settings-form.component.d.ts +0 -9
  403. package/lib/components/search-input/search-input.component.d.ts +0 -11
  404. package/lib/components/sliding-panel/sliding-panel.component.d.ts +0 -14
  405. package/lib/components/sliding-panel/sliding-panel.module.d.ts +0 -9
  406. package/lib/consts/date-time.consts.d.ts +0 -1
  407. package/lib/consts/index.d.ts +0 -3
  408. package/lib/consts/inputs.consts.d.ts +0 -4
  409. package/lib/consts/month.consts.d.ts +0 -49
  410. package/lib/consts/params.consts.d.ts +0 -1
  411. package/lib/consts/register-base.consts.d.ts +0 -19
  412. package/lib/core/form-group-wrapper/errors-consts.d.ts +0 -5
  413. package/lib/core/form-group-wrapper/form-group-wrapper.d.ts +0 -15
  414. package/lib/core/input-control/input-control.d.ts +0 -11
  415. package/lib/core/param/param-base.d.ts +0 -68
  416. package/lib/core/param/param-date-base.d.ts +0 -18
  417. package/lib/core/param/param-select-base.d.ts +0 -42
  418. package/lib/core/param/param-text-base.d.ts +0 -15
  419. package/lib/core/register-base/register-base.d.ts +0 -168
  420. package/lib/core/register-base/register-base.store.d.ts +0 -35
  421. package/lib/directives/date/date-time.types.d.ts +0 -32
  422. package/lib/directives/date/format-date.pipe.d.ts +0 -10
  423. package/lib/directives/number/number-only.directive.d.ts +0 -10
  424. package/lib/directives/sticky/sticky-relative.directive.d.ts +0 -13
  425. package/lib/directives/sticky/sticky-relative.service.d.ts +0 -15
  426. package/lib/directives/sticky/sticky.directive.d.ts +0 -27
  427. package/lib/services/date-time.service.d.ts +0 -80
  428. package/lib/services/dialog/dialog.service.d.ts +0 -22
  429. package/lib/services/dom-intersection.service.d.ts +0 -8
  430. package/lib/services/filter/filters-state.service.d.ts +0 -21
  431. package/lib/services/filter/filters-transmit.service.d.ts +0 -28
  432. package/lib/services/filter/filters.service.d.ts +0 -12
  433. package/lib/services/inputs-state.service.d.ts +0 -57
  434. package/lib/services/inputs.service.d.ts +0 -28
  435. package/lib/services/key-pressed.service.d.ts +0 -15
  436. package/lib/services/resize-window-observer.service.d.ts +0 -11
  437. package/lib/services/selected-objects-state.service.d.ts +0 -47
  438. package/lib/store/fast-query-store.service.d.ts +0 -19
  439. package/lib/types/hasura.types.d.ts +0 -35
  440. package/lib/types/inputs.types.d.ts +0 -41
  441. package/lib/types/params.types.d.ts +0 -27
  442. package/lib/types/register-base.types.d.ts +0 -123
  443. package/lib/types/sub-types.d.ts +0 -8
  444. package/lib/types/user-profile.types.d.ts +0 -17
  445. package/lib/utils/functions.d.ts +0 -3
  446. package/lib/utils/get-url-segment.d.ts +0 -7
  447. package/lib/utils/prizm.shared.module.d.ts +0 -14
  448. package/lib/utils/rxjs.d.ts +0 -10
  449. package/lib/utils/select-all-utils.d.ts +0 -8
  450. package/schematics/ng-update/replace-menu-state-token/index.d.ts +0 -2
  451. package/schematics/ng-update/replace-menu-state-token/index.js +0 -29
  452. package/schematics/ng-update/replace-menu-state-token/index.js.map +0 -1
  453. package/schematics/ng-update/update-prefix/index.d.ts +0 -2
  454. package/schematics/ng-update/update-prefix/index.js +0 -33
  455. package/schematics/ng-update/update-prefix/index.js.map +0 -1
  456. package/schematics/utils/utils.js +0 -25
  457. package/schematics/utils/utils.js.map +0 -1
  458. /package/{lib/components/column-settings/index.d.ts → src/lib/components/column-settings/index.ts} +0 -0
  459. /package/{lib/components/filters/index.d.ts → src/lib/components/filters/index.ts} +0 -0
  460. /package/{lib/components/index.d.ts → src/lib/components/index.ts} +0 -0
  461. /package/{lib/components/inputs/index.d.ts → src/lib/components/inputs/index.ts} +0 -0
  462. /package/{lib/components/inputs/param-switcher-date-time-range/index.d.ts → src/lib/components/inputs/param-switcher-date-time-range/index.ts} +0 -0
  463. /package/{lib/components/inputs/param-tree/index.d.ts → src/lib/components/inputs/param-tree/index.ts} +0 -0
  464. /package/{lib/components/menu-constructor/index.d.ts → src/lib/components/menu-constructor/index.ts} +0 -0
  465. /package/{lib/components/page-menu/index.d.ts → src/lib/components/page-menu/index.ts} +0 -0
  466. /package/{lib/components/register-table/index.d.ts → src/lib/components/register-table/index.ts} +0 -0
  467. /package/{lib/core/form-group-wrapper/index.d.ts → src/lib/core/form-group-wrapper/index.ts} +0 -0
  468. /package/{lib/core/index.d.ts → src/lib/core/index.ts} +0 -0
  469. /package/{lib/core/input-control/index.d.ts → src/lib/core/input-control/index.ts} +0 -0
  470. /package/{lib/core/param/index.d.ts → src/lib/core/param/index.ts} +0 -0
  471. /package/{lib/core/register-base/index.d.ts → src/lib/core/register-base/index.ts} +0 -0
  472. /package/{lib/directives/index.d.ts → src/lib/directives/index.ts} +0 -0
  473. /package/{lib/directives/sticky/index.d.ts → src/lib/directives/sticky/index.ts} +0 -0
  474. /package/{lib/services/dialog/index.d.ts → src/lib/services/dialog/index.ts} +0 -0
  475. /package/{lib/services/index.d.ts → src/lib/services/index.ts} +0 -0
  476. /package/{lib/store/index.d.ts → src/lib/store/index.ts} +0 -0
  477. /package/{lib/types/index.d.ts → src/lib/types/index.ts} +0 -0
  478. /package/{lib/utils/index.d.ts → src/lib/utils/index.ts} +0 -0
  479. /package/{public-api.d.ts → src/public-api.ts} +0 -0
@@ -1,544 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, inject, input, output, signal, untracked, viewChild, viewChildren, } from '@angular/core';
2
- import { DomIntersectionService } from '../../services/dom-intersection.service';
3
- import { TuiHint, TuiIcon, TuiLoader, TuiScrollbar } from '@taiga-ui/core';
4
- import { TuiTable } from '@taiga-ui/addon-table';
5
- import { AsyncPipe, DecimalPipe, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
6
- import { EColumnDataType, } from './model/schema';
7
- import { TuiCheckbox } from '@taiga-ui/kit';
8
- import { EDatePattern, ETimezone } from '../../directives/date/date-time.types';
9
- import { outputFromObservable, takeUntilDestroyed, toObservable, toSignal, } from '@angular/core/rxjs-interop';
10
- import { HeaderTemplateDirective } from './directives/header-template.directive';
11
- import { DateTimeService } from '../../services/date-time.service';
12
- import { CellTemplateDirective } from './directives/cell-template.directive';
13
- import { FormsModule, ReactiveFormsModule } from '@angular/forms';
14
- import { KEY_PRESSED, KeyPressedService } from '../../services/key-pressed.service';
15
- import { EOrder, THS_WIDTH_CHANGES_DEBOUNCE_TIME_MLS } from '../../consts/register-base.consts';
16
- import { ClassByTypePipe } from './pipes/class-by-type.pipe';
17
- import { StickyColumnPipe } from './pipes/sticky-column.pipe';
18
- import { CHECKBOX_SELECTOR_KEY, CHECKBOX_SELECTOR_WIDTH_PX, MIN_COL_WIDTH_PX, } from './consts/register-table.consts';
19
- import { BehaviorSubject, combineLatest, debounceTime, map, skip, Subject, switchMap, tap, } from 'rxjs';
20
- import { CheckboxSelectorComponent } from '../checkbox-selector/checkbox-selector.component';
21
- import { distinctUntilChangedJSONs } from '../../utils';
22
- import { StickyDirective, StickyRelativeDirective } from '../../directives';
23
- import { ERegisterObjectState } from '../../types';
24
- import { SelectedObjectsStateService } from '../../services';
25
- import { TuiResizable, TuiResizer } from '@taiga-ui/cdk';
26
- import { FormatDatePipe } from '../../directives/date/format-date.pipe';
27
- import { PaginatorComponent } from '../paginator/paginator.component';
28
- import * as i0 from "@angular/core";
29
- import * as i1 from "@taiga-ui/addon-table";
30
- import * as i2 from "@taiga-ui/core";
31
- /** Общий компонент для создания таблицы ресстра */
32
- export class RegisterTableComponent {
33
- constructor() {
34
- /** Переданный контент для заголовков таблицы, темплейты с директивой HeaderTemplateDirective */
35
- this.headerTemplates = contentChildren(HeaderTemplateDirective);
36
- /** Переданный контент для ячеек таблицы, темплейты с директивой CellTemplateDirective */
37
- this.cellTemplates = contentChildren(CellTemplateDirective);
38
- /** Элементы строк таблицы */
39
- this.bodyRows = viewChildren('bodyRow', { read: ElementRef });
40
- /** Элемент скролла таблицы */
41
- this.scrollbar = viewChild(TuiScrollbar, { read: ElementRef });
42
- /** Состояние загрузки данных таблицы */
43
- this.isLoading = input.required();
44
- /** Состояние загрузки данных пагинации */
45
- this.isPaginatorLoading = input(false);
46
- /** Номер страницы */
47
- this.page = input.required();
48
- /** Количество записей на одной странице */
49
- this.limit = input.required();
50
- /** Отображение колонки выбора строк (по умолчанию отображается) */
51
- this.checkboxColumn = input(true);
52
- /** Список столбцов */
53
- this.columns = input.required();
54
- /** Данные столбцов */
55
- this.columnsData = input.required();
56
- /** Идентификаторы фиксированных слева столбцов */
57
- this.stickyLeftIds = input();
58
- /** Идентификаторы фиксированных слева столбцов */
59
- this.stickyRightIds = input();
60
- /** Всего записей */
61
- this.totalRecords = input.required();
62
- /** Всего записей, без учета фильтра */
63
- this.totalNotFiltered = input.required();
64
- /** Значения таблицы */
65
- this.rowData = input.required();
66
- /**
67
- * @description Идентификаторы выбранных записей
68
- *
69
- * @deprecated Используйте stateObjects
70
- * */
71
- this.selectedIds = input(new Set());
72
- /**
73
- * @description Объекты выбранных записей
74
- *
75
- * @deprecated Используйте stateObjects
76
- * */
77
- this.selectedObjects = input(new Set());
78
- /** Загрузка дополнительных записей при выборе соответствущего пункта в чекбокс-селекторе */
79
- this.isSelectloading = input(false);
80
- /** Текст пустой таблицы */
81
- this.emptyText = input('Нет данных');
82
- /** Дизейбл сортировки */
83
- this.sortingDisabled = input(false);
84
- /** Максимальное значения выбора чекбоксов через поле ввода */
85
- this.checkboxInputMaxValue = input(null);
86
- /** Дизейбл выбора чекбоксов */
87
- this.checkboxDisabled = input(false);
88
- /** Дизейбл выбора чекбоксов */
89
- this.paginatorDisabled = input(false);
90
- this.selectedCounter = computed(() => {
91
- const selectedSize = this._selectedService?.selectedValues()?.size ?? null;
92
- const unselectedSize = this._selectedService?.unselectedValues()?.size ?? 0;
93
- const unfetchedObjects = this._selectedService?.stateUnfetchedObjects();
94
- const isNotSelected = unfetchedObjects !== ERegisterObjectState.SELECTED;
95
- if (selectedSize === null) {
96
- this._deprecatedSelectedRowsCounter();
97
- return this.selectedIds().size;
98
- }
99
- return isNotSelected ? selectedSize : this.totalRecords() - unselectedSize;
100
- });
101
- this.dts = inject(DateTimeService);
102
- this.destroyRef = inject(DestroyRef);
103
- this._shift = inject(KeyPressedService);
104
- this._domIntersectionService = inject(DomIntersectionService);
105
- // TODO удалить optional: true после выполнения задачи SMA2-3134
106
- this._selectedService = inject(SelectedObjectsStateService, {
107
- optional: true,
108
- });
109
- /** Событие выбора в чекбокс-селекторе */
110
- this.selectChanged = output();
111
- /** Событие изменения значений пагинатора */
112
- this.paginatorChange = output();
113
- /** Событие нажатия на строку */
114
- this.rowClick = output();
115
- /** Событие двойного нажатия на строку */
116
- this.rowDblClick = output();
117
- /** Событие нажатия на строку */
118
- this.rowSelected = output();
119
- /** Событие сортировки значений в таблице */
120
- this.sort = output();
121
- /** Событие изменения ширины колонки */
122
- this._thsWidthMap = computed(() => new Map(this.columnsData().map(({ name, width }) => [name, new BehaviorSubject(width)])));
123
- this.thsWidthChange = outputFromObservable(toObservable(this._thsWidthMap).pipe(switchMap((changes) => combineLatest([...changes.entries()].map(([name, $width]) => $width.asObservable().pipe(map((width) => ({ name, width }))))).pipe(distinctUntilChangedJSONs(), debounceTime(THS_WIDTH_CHANGES_DEBOUNCE_TIME_MLS), skip(1)))));
124
- /** Событие изменения видимых строк таблицы */
125
- this._observerRowsVisibilityDOM$ = toObservable(this.bodyRows).pipe(switchMap((bodyRows) => combineLatest(bodyRows.map((bodyRow, index) => this._domIntersectionService.createAndObserve(bodyRow).pipe(
126
- // TODO удалить tap, как только перестанет использоваться is_visible по проекту
127
- tap((isVisible) => {
128
- this.rowData()[index].is_visible = isVisible;
129
- }), map((isVisible) => (isVisible ? this.rowData()[index] : undefined))))).pipe(map((visibleRows) => visibleRows.filter((visibleRow) => !!visibleRow)))));
130
- this.visibleRowsChange = outputFromObservable(this._observerRowsVisibilityDOM$);
131
- this.EColumnDataType = EColumnDataType;
132
- this.ETimezone = ETimezone;
133
- this.EDatePattern = EDatePattern;
134
- this.ERegisterObjectState = ERegisterObjectState;
135
- this.CHECKBOX_SELECTOR_KEY = CHECKBOX_SELECTOR_KEY;
136
- this.CHECKBOX_SELECTOR_WIDTH_PX = CHECKBOX_SELECTOR_WIDTH_PX;
137
- this.stickyThStyle = Object.freeze({ 'z-index': 22 });
138
- this.stickyTdStyle = Object.freeze({ 'z-index': 21 });
139
- this.columnsWithCheckboxes = computed(() => [
140
- CHECKBOX_SELECTOR_KEY,
141
- ...this.columns(),
142
- ]);
143
- this.scrollPosition = signal({ top: 0, left: 0 });
144
- this.tableWidth = toSignal(combineLatest([toObservable(this.columnsWithCheckboxes), toObservable(this._thsWidthMap)]).pipe(map(({ 0: visibleColumns, 1: changes }) => new Map([...changes.entries()].filter(([thName]) => visibleColumns.includes(thName)))), switchMap((changes) => combineLatest([...changes.entries()].map(({ 1: $width }) => $width.asObservable().pipe(map((width) => width)))).pipe(map((widths) => {
145
- let tableWidth = this.checkboxColumn() ? CHECKBOX_SELECTOR_WIDTH_PX : 0;
146
- for (const width of widths) {
147
- tableWidth += width ? Number(width) : 0;
148
- }
149
- return tableWidth;
150
- })))));
151
- this.stateObjects = this._selectedService?.state;
152
- this.visibleColumnsTree = computed(() => this._filterVisibleColumns(this.columnsData(), this.columns()));
153
- this.maxDepth = computed(() => this._getMaxDepth(this.visibleColumnsTree()));
154
- this.leaves = computed(() => this._getFlatLeaves(this.visibleColumnsTree()));
155
- this.headerRows = computed(() => {
156
- const maxDepth = this.maxDepth();
157
- const rows = Array.from({ length: maxDepth }, () => []);
158
- if (maxDepth === 0) {
159
- return rows;
160
- }
161
- for (const col of this.visibleColumnsTree()) {
162
- this._buildHeaderRecursive(col, 0, maxDepth, rows);
163
- }
164
- return rows;
165
- });
166
- this._deprecatedSelectedRowsCounter = signal(0);
167
- this.timeZoneChanges$ = this.dts.isTimeZoneChanged$;
168
- this.columnOrders = new Map();
169
- this._projectedHeadersMap = new Map();
170
- this._projectedCellsMap = new Map();
171
- this._clickedRow$ = new Subject();
172
- this._hoveredRow$ = new BehaviorSubject(null);
173
- this._setScrollPositionAfterDataLoading();
174
- this._projectHeaderTemplates();
175
- this._projectCellTemplates();
176
- // TODO удалить метод, как только перестанет использоваться is_visible по проекту
177
- this._syncRowVisibilityDOM();
178
- effect(() => {
179
- const data = this.rowData();
180
- if (data.length > 0 && !this.lastSelectedRow) {
181
- [this.lastSelectedRow] = data;
182
- }
183
- });
184
- }
185
- _setScrollPositionAfterDataLoading() {
186
- effect(() => {
187
- if (!this.isLoading()) {
188
- untracked(() => {
189
- const { top, left } = this.scrollPosition();
190
- const scrollbarElement = this.scrollbar()?.nativeElement;
191
- if (scrollbarElement) {
192
- scrollbarElement.scrollTop = top;
193
- scrollbarElement.scrollLeft = left;
194
- }
195
- });
196
- }
197
- });
198
- }
199
- _projectHeaderTemplates() {
200
- effect(() => {
201
- this._projectedHeadersMap.clear();
202
- for (const template of this.headerTemplates()) {
203
- this._projectedHeadersMap.set(template.headerTemplateName(), template.tpl);
204
- }
205
- });
206
- }
207
- _projectCellTemplates() {
208
- effect(() => {
209
- this._projectedCellsMap.clear();
210
- for (const template of this.cellTemplates()) {
211
- this._projectedCellsMap.set(template.cellTemplateName, template.tpl);
212
- }
213
- });
214
- }
215
- _syncRowVisibilityDOM() {
216
- this._observerRowsVisibilityDOM$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
217
- }
218
- ngOnDestroy() {
219
- this._clickedRow$.complete();
220
- this._hoveredRow$.complete();
221
- for (const subject of this._thsWidthMap().values()) {
222
- subject.complete();
223
- }
224
- }
225
- getProjectionHeaderByName(name) {
226
- return this._projectedHeadersMap.get(name);
227
- }
228
- getProjectionCellByName(name) {
229
- return this._projectedCellsMap.get(name);
230
- }
231
- sortChange({ sortComparator }) {
232
- if (!sortComparator) {
233
- return;
234
- }
235
- const id = sortComparator({}, {});
236
- const columnOrder = this.columnOrders.get(id);
237
- if (this._shift.isPressed()) {
238
- this.updateColumnOrder(id, columnOrder);
239
- }
240
- else {
241
- this.columnOrders.clear();
242
- this.updateColumnOrder(id, columnOrder);
243
- }
244
- this.sort.emit([...this.columnOrders.values()]);
245
- }
246
- updateColumnOrder(id, columnOrder) {
247
- if (columnOrder) {
248
- const { options } = columnOrder;
249
- const { order } = options;
250
- if (order === EOrder.DESC) {
251
- this.columnOrders.delete(id);
252
- }
253
- else {
254
- this.columnOrders.set(id, { options: { ...options, order: EOrder.DESC } });
255
- }
256
- }
257
- else {
258
- this.columnOrders.set(id, { options: { id, order: EOrder.ASC } });
259
- }
260
- }
261
- setThName(thName) {
262
- return () => thName;
263
- }
264
- checkAvailableColumnSorting(columnData) {
265
- const { sortable, type } = columnData;
266
- const availableSortColumnTypes = [
267
- EColumnDataType.TEXT,
268
- EColumnDataType.DATE,
269
- EColumnDataType.NUM,
270
- ];
271
- return !this.sortingDisabled() && sortable !== false && availableSortColumnTypes.includes(type);
272
- }
273
- checkResizeBlocked(columnData) {
274
- const resizableBlockedTypes = [
275
- EColumnDataType.CHECKBOX,
276
- EColumnDataType.ICON,
277
- EColumnDataType.ICON_SVG,
278
- ];
279
- return columnData.fixed || resizableBlockedTypes.includes(columnData.type);
280
- }
281
- onRowHover(row) {
282
- this._hoveredRow$.next(row);
283
- }
284
- onRowClick(event, row) {
285
- const blueHighlightsSelected = window.getSelection();
286
- blueHighlightsSelected?.removeAllRanges();
287
- const stateObjects = this.stateObjects?.();
288
- // TODO оставить только if после SMA2-3134
289
- if (stateObjects) {
290
- if (event.shiftKey) {
291
- this._changeRangeRowsState(stateObjects, this.lastSelectedRow, row);
292
- }
293
- else {
294
- if (event.ctrlKey) {
295
- this._changeOnlyRowState(stateObjects, row, true);
296
- }
297
- else {
298
- this._changeOnlyRowState(stateObjects, row);
299
- }
300
- this.lastSelectedRow = row;
301
- }
302
- this.rowClick.emit(row);
303
- const selectedObjects = this._selectedService?.selectedValues();
304
- if (selectedObjects) {
305
- this.rowSelected.emit({
306
- row: [...selectedObjects],
307
- count: selectedObjects.size,
308
- });
309
- }
310
- this._clickedRow$.next(row);
311
- return;
312
- }
313
- if (event.shiftKey) {
314
- this._selectRangeRows(this.lastSelectedRow, row);
315
- }
316
- else {
317
- if (event.ctrlKey) {
318
- this._selectOnlyRow(row, true);
319
- }
320
- else {
321
- this._selectOnlyRow(row);
322
- }
323
- this.lastSelectedRow = row;
324
- }
325
- this.rowClick.emit(row);
326
- this.rowSelected.emit({
327
- row: [...this.selectedObjects()],
328
- count: this.selectedObjects().size,
329
- });
330
- }
331
- _changeOnlyRowState(state, row, saveSelected) {
332
- if (typeof row !== 'object' || !row || !('id' in row)) {
333
- console.error('Поле id отсутствует в элементе', row);
334
- return;
335
- }
336
- const id = row.id;
337
- const wasSelected = state.get(id)?.state === ERegisterObjectState.SELECTED;
338
- if (saveSelected) {
339
- this.updateStateObjectByKey(id, {
340
- state: wasSelected ? ERegisterObjectState.UNSELECTED : ERegisterObjectState.SELECTED,
341
- });
342
- }
343
- else {
344
- this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
345
- this.updateStateObjectByKey(id, { state: ERegisterObjectState.SELECTED });
346
- }
347
- }
348
- _selectOnlyRow(row, saveSelected) {
349
- if (typeof row !== 'object' || !row || !('id' in row)) {
350
- console.error('Поле id отсутствует в элементе', row);
351
- return;
352
- }
353
- const id = row.id;
354
- const wasSelected = this.selectedIds().has(id);
355
- if (saveSelected) {
356
- if (wasSelected) {
357
- this.selectedIds().delete(id);
358
- this.selectedObjects().delete(row);
359
- }
360
- else {
361
- this.selectedIds().add(id);
362
- this.selectedObjects().add(row);
363
- }
364
- }
365
- else {
366
- this.selectedIds().clear();
367
- this.selectedObjects().clear();
368
- this.selectedIds().add(id);
369
- this.selectedObjects().add(row);
370
- }
371
- this._emitDeprecatedSelectedRows();
372
- }
373
- _emitDeprecatedSelectedRows() {
374
- this._deprecatedSelectedRowsCounter.update((value) => value + 1);
375
- }
376
- _changeRangeRowsState(stateObjects, previousRow, currentRow) {
377
- this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
378
- let prevIndex = this.rowData().indexOf(previousRow);
379
- let currIndex = this.rowData().indexOf(currentRow);
380
- if (prevIndex > currIndex) {
381
- const tempIndex = prevIndex;
382
- prevIndex = currIndex;
383
- currIndex = tempIndex;
384
- }
385
- const idsObjectsShouldSelected = new Set(this.rowData()
386
- .slice(prevIndex === -1 ? 0 : prevIndex, currIndex + 1)
387
- .map((row) => row.id));
388
- const slicedStateObjects = new Map([...stateObjects].filter(([key]) => idsObjectsShouldSelected.has(key)));
389
- for (const key of slicedStateObjects.keys()) {
390
- this.updateStateObjectByKey(key, { state: ERegisterObjectState.SELECTED });
391
- }
392
- }
393
- _selectRangeRows(previousRow, currentRow) {
394
- let prevIndex = this.rowData().indexOf(previousRow);
395
- let currIndex = this.rowData().indexOf(currentRow);
396
- if (prevIndex > currIndex) {
397
- const tempIndex = prevIndex;
398
- prevIndex = currIndex;
399
- currIndex = tempIndex;
400
- }
401
- const itemsShouldSelected = this.rowData().slice(prevIndex === -1 ? 0 : prevIndex, currIndex + 1);
402
- this.selectedIds().clear();
403
- this.selectedObjects().clear();
404
- this._emitDeprecatedSelectedRows();
405
- for (const item of itemsShouldSelected) {
406
- this.selectedIds().add(item.id);
407
- this.selectedObjects().add(item);
408
- }
409
- }
410
- thResizeChanges(name, width) {
411
- const thWidthChangesEntry = this._thsWidthMap().get(name);
412
- if (thWidthChangesEntry) {
413
- const validWidth = width > MIN_COL_WIDTH_PX ? width : MIN_COL_WIDTH_PX;
414
- thWidthChangesEntry.next(validWidth.toString());
415
- }
416
- }
417
- getThWidth(name) {
418
- const thWidthChangesEntry = this._thsWidthMap().get(name);
419
- return thWidthChangesEntry?.getValue();
420
- }
421
- saveScrollEndPosition() {
422
- const scrollbarElement = this.scrollbar()?.nativeElement;
423
- if (scrollbarElement && !this.isLoading()) {
424
- const { scrollTop, scrollLeft } = scrollbarElement;
425
- this.scrollPosition.set({
426
- top: scrollTop,
427
- left: scrollLeft,
428
- });
429
- }
430
- }
431
- updateAllStateObjectsByState(state) {
432
- this._selectedService?.setAllStateObjectsByState(state);
433
- }
434
- updateStateObjectByKey(key, updates) {
435
- this._selectedService?.setStateObjectByKey(key, updates);
436
- }
437
- markRowBeforeSelect(row) {
438
- const shiftPressed = this._shift.isPressed();
439
- const prevRow = this.lastSelectedRow;
440
- const hoveredRow = this._hoveredRow$.getValue();
441
- if (shiftPressed && prevRow && hoveredRow) {
442
- let beforeIndex = this.rowData().indexOf(prevRow);
443
- let afterIndex = this.rowData().indexOf(hoveredRow);
444
- if (beforeIndex > afterIndex) {
445
- const tempIndex = beforeIndex;
446
- beforeIndex = afterIndex;
447
- afterIndex = tempIndex;
448
- }
449
- const currentIndex = this.rowData().indexOf(row);
450
- return beforeIndex <= currentIndex && currentIndex <= afterIndex;
451
- }
452
- return false;
453
- }
454
- _buildHeaderRecursive(col, level, maxDepth, rows) {
455
- const children = col.children || [];
456
- const hasChildren = children.length > 0;
457
- const customRowspan = col.rowspan || 1;
458
- const nextLevel = level + customRowspan;
459
- let colspan = 0;
460
- if (hasChildren) {
461
- for (const child of children) {
462
- colspan += this._buildHeaderRecursive(child, nextLevel, maxDepth, rows);
463
- }
464
- }
465
- else {
466
- colspan = 1;
467
- }
468
- const rowspan = hasChildren ? customRowspan : maxDepth - level;
469
- if (rows[level]) {
470
- rows[level].push({ col, rowspan, colspan });
471
- }
472
- return colspan;
473
- }
474
- _getFlatLeaves(columns) {
475
- return columns.flatMap((col) => {
476
- if (col.children && col.children.length > 0) {
477
- return this._getFlatLeaves(col.children);
478
- }
479
- return [col];
480
- });
481
- }
482
- _filterVisibleColumns(columns, showedNames) {
483
- return columns
484
- .map((col) => {
485
- if (col.children && col.children.length > 0) {
486
- const visibleChildren = this._filterVisibleColumns(col.children, showedNames);
487
- return { ...col, children: visibleChildren };
488
- }
489
- return col;
490
- })
491
- .filter((col) => showedNames.includes(col.name) || (col.children && col.children.length > 0));
492
- }
493
- _getMaxDepth(columns) {
494
- if (!columns || columns.length === 0) {
495
- return 0;
496
- }
497
- return 1 + Math.max(...columns.map((c) => this._getMaxDepth(c.children || [])));
498
- }
499
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
500
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RegisterTableComponent, isStandalone: true, selector: "sproc-register-table", inputs: { isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: true, transformFunction: null }, isPaginatorLoading: { classPropertyName: "isPaginatorLoading", publicName: "isPaginatorLoading", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: true, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: true, transformFunction: null }, checkboxColumn: { classPropertyName: "checkboxColumn", publicName: "checkboxColumn", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, columnsData: { classPropertyName: "columnsData", publicName: "columnsData", isSignal: true, isRequired: true, transformFunction: null }, stickyLeftIds: { classPropertyName: "stickyLeftIds", publicName: "stickyLeftIds", isSignal: true, isRequired: false, transformFunction: null }, stickyRightIds: { classPropertyName: "stickyRightIds", publicName: "stickyRightIds", isSignal: true, isRequired: false, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, totalNotFiltered: { classPropertyName: "totalNotFiltered", publicName: "totalNotFiltered", isSignal: true, isRequired: true, transformFunction: null }, rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: true, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, selectedObjects: { classPropertyName: "selectedObjects", publicName: "selectedObjects", isSignal: true, isRequired: false, transformFunction: null }, isSelectloading: { classPropertyName: "isSelectloading", publicName: "isSelectloading", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, sortingDisabled: { classPropertyName: "sortingDisabled", publicName: "sortingDisabled", isSignal: true, isRequired: false, transformFunction: null }, checkboxInputMaxValue: { classPropertyName: "checkboxInputMaxValue", publicName: "checkboxInputMaxValue", isSignal: true, isRequired: false, transformFunction: null }, checkboxDisabled: { classPropertyName: "checkboxDisabled", publicName: "checkboxDisabled", isSignal: true, isRequired: false, transformFunction: null }, paginatorDisabled: { classPropertyName: "paginatorDisabled", publicName: "paginatorDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectChanged: "selectChanged", paginatorChange: "paginatorChange", rowClick: "rowClick", rowDblClick: "rowDblClick", rowSelected: "rowSelected", sort: "sort", thsWidthChange: "thsWidthChange", visibleRowsChange: "visibleRowsChange" }, providers: [
501
- DomIntersectionService,
502
- KeyPressedService,
503
- {
504
- provide: KEY_PRESSED,
505
- useValue: 'Shift',
506
- },
507
- ], queries: [{ propertyName: "headerTemplates", predicate: HeaderTemplateDirective, isSignal: true }, { propertyName: "cellTemplates", predicate: CellTemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "bodyRows", predicate: ["bodyRow"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "scrollbar", first: true, predicate: TuiScrollbar, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n ></sproc-checkbox-selector>\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"cell.col.value!\"\n ></tui-icon>\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"columnData.value!\"\n ></tui-icon>\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n >\n </sproc-paginator>\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"], dependencies: [{ kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: FormatDatePipe, name: "formatDate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.TuiTableDirective, selector: "table[tuiTable]", inputs: ["columns", "direction", "size", "sorter"], outputs: ["directionChange", "sorterChange", "sortChange"] }, { kind: "component", type: i1.TuiTableTbody, selector: "tbody[tuiTbody]", inputs: ["data", "heading", "open"], outputs: ["openChange"] }, { kind: "component", type: i1.TuiTableThGroup, selector: "tr[tuiThGroup]" }, { kind: "component", type: i1.TuiTableTh, selector: "th[tuiTh]", inputs: ["sorter", "resizable", "sticky", "requiredSort"] }, { kind: "component", type: i1.TuiTableTd, selector: "th[tuiTd], td[tuiTd]" }, { kind: "component", type: i1.TuiTableTr, selector: "tr[tuiTr]" }, { kind: "directive", type: i1.TuiTableCell, selector: "ng-template[tuiCell]", inputs: ["tuiCell"] }, { kind: "directive", type: i1.TuiTableHead, selector: "[tuiHead]", inputs: ["tuiHead"] }, { kind: "directive", type: i1.TuiTableSortBy, selector: "table[tuiTable][tuiSortBy]", inputs: ["tuiSortBy"], outputs: ["tuiSortByChange", "tuiSortChange"] }, { kind: "directive", type: i1.TuiTableSortable, selector: "th[tuiTh][tuiSortable]", inputs: ["tuiSortable"] }, { kind: "pipe", type: ClassByTypePipe, name: "classByType" }, { kind: "pipe", type: StickyColumnPipe, name: "stickyColumn" }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "component", type: PaginatorComponent, selector: "sproc-paginator", inputs: ["textOnPage", "totalRecords", "pageLinkSize", "showMoreDisabled", "disabled", "rows", "page", "paginatorOptions", "rowsCountOptions", "selectedCounter", "totalNotFiltered", "isLoading", "minRowsCount", "maxRowsCount"], outputs: ["rowsChange", "pageChange", "paginatorChange"] }, { kind: "component", type: CheckboxSelectorComponent, selector: "sproc-checkbox-selector", inputs: ["totalRecords", "selected", "disabled", "loading", "inputMaxValue"], outputs: ["onApply"] }, { kind: "directive", type: StickyDirective, selector: "[stickyLeft], [stickyRight], [stickyTop], [stickyBottom]", inputs: ["stickyLeft", "stickyRight", "stickyTop", "stickyBottom", "stickyRelative", "position", "stylesOnSticky"] }, { kind: "directive", type: StickyRelativeDirective, selector: "[stickyRelative]", inputs: ["columns"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiResizer, selector: "[tuiResizer]", inputs: ["tuiResizer"], outputs: ["tuiSizeChange"] }, { kind: "directive", type: TuiResizable, selector: "[tuiResizable]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
508
- }
509
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterTableComponent, decorators: [{
510
- type: Component,
511
- args: [{ selector: 'sproc-register-table', standalone: true, imports: [
512
- TuiScrollbar,
513
- TuiLoader,
514
- NgClass,
515
- NgStyle,
516
- TuiCheckbox,
517
- NgTemplateOutlet,
518
- DecimalPipe,
519
- FormatDatePipe,
520
- AsyncPipe,
521
- FormsModule,
522
- ReactiveFormsModule,
523
- TuiLoader,
524
- TuiTable,
525
- ClassByTypePipe,
526
- StickyColumnPipe,
527
- TuiHint,
528
- PaginatorComponent,
529
- CheckboxSelectorComponent,
530
- StickyDirective,
531
- StickyRelativeDirective,
532
- TuiIcon,
533
- TuiResizer,
534
- TuiResizable,
535
- ], providers: [
536
- DomIntersectionService,
537
- KeyPressedService,
538
- {
539
- provide: KEY_PRESSED,
540
- useValue: 'Shift',
541
- },
542
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n ></sproc-checkbox-selector>\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"cell.col.value!\"\n ></tui-icon>\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"columnData.value!\"\n ></tui-icon>\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n >\n </sproc-paginator>\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"] }]
543
- }], ctorParameters: () => [] });
544
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZ2lzdGVyLWJhc2Uvc3JjL2xpYi9jb21wb25lbnRzL3JlZ2lzdGVyLXRhYmxlL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9yZWdpc3Rlci10YWJsZS9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFFTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUVMLGVBQWUsR0FJaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUNMLG9CQUFv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Uzt3QkFDVCxXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsU0FBUzt3QkFDVCxRQUFRO3dCQUNSLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGtCQUFrQjt3QkFDbEIseUJBQXlCO3dCQUN6QixlQUFlO3dCQUNmLHVCQUF1Qjt3QkFDdkIsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLFlBQVk7cUJBQ2IsYUFDVTt3QkFDVCxzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakI7NEJBQ0UsT0FBTyxFQUFFLFdBQVc7NEJBQ3BCLFFBQVEsRUFBRSxPQUFPO3lCQUNsQjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIERlc3Ryb3lSZWYsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxuICB2aWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tSW50ZXJzZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RvbS1pbnRlcnNlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBUdWlIaW50LCBUdWlJY29uLCBUdWlMb2FkZXIsIFR1aVNjcm9sbGJhciB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aVRhYmxlLCBUdWlUYWJsZVNvcnRDaGFuZ2UgfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tdGFibGUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBEZWNpbWFsUGlwZSwgTmdDbGFzcywgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb2x1bW5EYXRhVHlwZXMsXG4gIEVDb2x1bW5EYXRhVHlwZSxcbiAgSUNvbHVtbkRhdGEsXG4gIFJlZ2lzdGVyVGFibGVDZWxsU29ydGVyLFxuICBUaFdpZHRoRW50cnksXG59IGZyb20gJy4vbW9kZWwvc2NoZW1hJztcbmltcG9ydCB7IFR1aUNoZWNrYm94IH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBFRGF0ZVBhdHRlcm4sIEVUaW1lem9uZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZGF0ZS9kYXRlLXRpbWUudHlwZXMnO1xuaW1wb3J0IHtcbiAgb3V0cHV0RnJvbU9ic2VydmFibGUsXG4gIHRha2VVbnRpbERlc3Ryb3llZCxcbiAgdG9PYnNlcnZhYmxlLFxuICB0b1NpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvaGVhZGVyLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRlVGltZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRlLXRpbWUuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2VsbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBLRVlfUFJFU1NFRCwgS2V5UHJlc3NlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9rZXktcHJlc3NlZC5zZXJ2aWNlJztcbmltcG9ydCB7IEVPcmRlciwgVEhTX1dJRFRIX0NIQU5HRVNfREVCT1VOQ0VfVElNRV9NTFMgfSBmcm9tICcuLi8uLi9jb25zdHMvcmVnaXN0ZXItYmFzZS5jb25zdHMnO1xuaW1wb3J0IHsgQ2xhc3NCeVR5cGVQaXBlIH0gZnJvbSAnLi9waXBlcy9jbGFzcy1ieS10eXBlLnBpcGUnO1xuaW1wb3J0IHsgU3RpY2t5Q29sdW1uUGlwZSB9IGZyb20gJy4vcGlwZXMvc3RpY2t5LWNvbHVtbi5waXBlJztcbmltcG9ydCB7XG4gIENIRUNLQk9YX1NFTEVDVE9SX0tFWSxcbiAgQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFgsXG4gIE1JTl9DT0xfV0lEVEhfUFgsXG59IGZyb20gJy4vY29uc3RzL3JlZ2lzdGVyLXRhYmxlLmNvbnN0cyc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgbWFwLFxuICBza2lwLFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGVja2JveFNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gtc2VsZWN0b3IvY2hlY2tib3gtc2VsZWN0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkSlNPTnMgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBTdGlja3lEaXJlY3RpdmUsIFN0aWNreVJlbGF0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBTY2FsYXJVVUlEIH0gZnJvbSAnaGFzdXJhJztcbmltcG9ydCB7IEVSZWdpc3Rlck9iamVjdFN0YXRlLCBJUmVnaXN0ZXJPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBcHBseVNlbGVjdGlvblR5cGVzIH0gZnJvbSAnLi4vY2hlY2tib3gtc2VsZWN0b3IvY2hlY2tib3gtc2VsZWN0b3IudHlwZXMnO1xuaW1wb3J0IHsgU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgVHVpUmVzaXphYmxlLCBUdWlSZXNpemVyIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBGb3JtYXREYXRlUGlwZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZGF0ZS9mb3JtYXQtZGF0ZS5waXBlJztcbmltcG9ydCB7IElQYWdpbmF0b3JPdXRwdXQgfSBmcm9tICcuLi9wYWdpbmF0b3IvdHlwZXMvcGFnaW5hdG9yLnR5cGVzJztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcblxuLyoqINCe0LHRidC40Lkg0LrQvtC80L/QvtC90LXQvdGCINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINGC0LDQsdC70LjRhtGLINGA0LXRgdGB0YLRgNCwICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcHJvYy1yZWdpc3Rlci10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC5sZXNzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBUdWlTY3JvbGxiYXIsXG4gICAgVHVpTG9hZGVyLFxuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBUdWlDaGVja2JveCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIERlY2ltYWxQaXBlLFxuICAgIEZvcm1hdERhdGVQaXBlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFR1aUxvYWRlcixcbiAgICBUdWlUYWJsZSxcbiAgICBDbGFzc0J5VHlwZVBpcGUsXG4gICAgU3RpY2t5Q29sdW1uUGlwZSxcbiAgICBUdWlIaW50LFxuICAgIFBhZ2luYXRvckNvbXBvbmVudCxcbiAgICBDaGVja2JveFNlbGVjdG9yQ29tcG9uZW50LFxuICAgIFN0aWNreURpcmVjdGl2ZSxcbiAgICBTdGlja3lSZWxhdGl2ZURpcmVjdGl2ZSxcbiAgICBUdWlJY29uLFxuICAgIFR1aVJlc2l6ZXIsXG4gICAgVHVpUmVzaXphYmxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBEb21JbnRlcnNlY3Rpb25TZXJ2aWNlLFxuICAgIEtleVByZXNzZWRTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEtFWV9QUkVTU0VELFxuICAgICAgdXNlVmFsdWU6ICdTaGlmdCcsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINC30LDQs9C+0LvQvtCy0LrQvtCyINGC0LDQsdC70LjRhtGLLCDRgtC10LzQv9C70LXQudGC0Ysg0YEg0LTQuNGA0LXQutGC0LjQstC+0LkgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGhlYWRlclRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbjxIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZT4oSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINGP0YfQtdC10Log0YLQsNCx0LvQuNGG0YssINGC0LXQvNC/0LvQtdC50YLRiyDRgSDQtNC40YDQtdC60YLQuNCy0L7QuSBDZWxsVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGNlbGxUZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW48Q2VsbFRlbXBsYXRlRGlyZWN0aXZlPihDZWxsVGVtcGxhdGVEaXJlY3RpdmUpO1xuXG4gIC8qKiDQrdC70LXQvNC10L3RgtGLINGB0YLRgNC+0Log0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIGJvZHlSb3dzID0gdmlld0NoaWxkcmVuKCdib2R5Um93JywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAvKiog0K3Qu9C10LzQtdC90YIg0YHQutGA0L7Qu9C70LAg0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIHNjcm9sbGJhciA9IHZpZXdDaGlsZChUdWlTY3JvbGxiYXIsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgLyoqINCh0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LPRgNGD0LfQutC4INC00LDQvdC90YvRhSDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgaXNMb2FkaW5nID0gaW5wdXQucmVxdWlyZWQ8Ym9vbGVhbiB8IG51bGw+KCk7XG4gIC8qKiDQodC+0YHRgtC+0Y/QvdC40LUg0LfQsNCz0YDRg9C30LrQuCDQtNCw0L3QvdGL0YUg0L/QsNCz0LjQvdCw0YbQuNC4ICovXG4gIHB1YmxpYyBpc1BhZ2luYXRvckxvYWRpbmcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiDQndC+0LzQtdGAINGB0YLRgNCw0L3QuNGG0YsgKi9cbiAgcHVibGljIHBhZ2UgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXIgfCBudWxsPigpO1xuICAvKiog0JrQvtC70LjRh9C10YHRgtCy0L4g0LfQsNC/0LjRgdC10Lkg0L3QsCDQvtC00L3QvtC5INGB0YLRgNCw0L3QuNGG0LUgKi9cbiAgcHVibGljIGxpbWl0ID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyIHwgbnVsbD4oKTtcbiAgLyoqINCe0YLQvtCx0YDQsNC20LXQvdC40LUg0LrQvtC70L7QvdC60Lgg0LLRi9Cx0L7RgNCwINGB0YLRgNC+0LogKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC+0YLQvtCx0YDQsNC20LDQtdGC0YHRjykgKi9cbiAgcHVibGljIGNoZWNrYm94Q29sdW1uID0gaW5wdXQodHJ1ZSk7XG4gIC8qKiDQodC/0LjRgdC+0Log0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgY29sdW1ucyA9IGlucHV0LnJlcXVpcmVkPHN0cmluZ1tdPigpO1xuICAvKiog0JTQsNC90L3Ri9C1INGB0YLQvtC70LHRhtC+0LIgKi9cbiAgcHVibGljIGNvbHVtbnNEYXRhID0gaW5wdXQucmVxdWlyZWQ8SUNvbHVtbkRhdGFbXT4oKTtcbiAgLyoqINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0YTQuNC60YHQuNGA0L7QstCw0L3QvdGL0YUg0YHQu9C10LLQsCDRgdGC0L7Qu9Cx0YbQvtCyICovXG4gIHB1YmxpYyBzdGlja3lMZWZ0SWRzID0gaW5wdXQ8c3RyaW5nW10gfCB1bmRlZmluZWQ+KCk7XG4gIC8qKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNGLINGE0LjQutGB0LjRgNC+0LLQsNC90L3Ri9GFINGB0LvQtdCy0LAg0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgc3RpY2t5UmlnaHRJZHMgPSBpbnB1dDxzdHJpbmdbXSB8IHVuZGVmaW5lZD4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LkgKi9cbiAgcHVibGljIHRvdGFsUmVjb3JkcyA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LksINCx0LXQtyDRg9GH0LXRgtCwINGE0LjQu9GM0YLRgNCwICovXG4gIHB1YmxpYyB0b3RhbE5vdEZpbHRlcmVkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICAvKiog0JfQvdCw0YfQtdC90LjRjyDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgcm93RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZElkcyA9IGlucHV0KG5ldyBTZXQ8U2NhbGFyVVVJRD4oKSk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24g0J7QsdGK0LXQutGC0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSBpbnB1dChuZXcgU2V0PGFueT4oKSk7XG4gIC8qKiDQl9Cw0LPRgNGD0LfQutCwINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0YUg0LfQsNC/0LjRgdC10Lkg0L/RgNC4INCy0YvQsdC+0YDQtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0YnQtdCz0L4g0L/Rg9C90LrRgtCwINCyINGH0LXQutCx0L7QutGBLdGB0LXQu9C10LrRgtC+0YDQtSAqL1xuICBwdWJsaWMgaXNTZWxlY3Rsb2FkaW5nID0gaW5wdXQ8Ym9vbGVhbiB8IG51bGw+KGZhbHNlKTtcbiAgLyoqINCi0LXQutGB0YIg0L/Rg9GB0YLQvtC5INGC0LDQsdC70LjRhtGLICovXG4gIHB1YmxpYyBlbXB0eVRleHQgPSBpbnB1dDxzdHJpbmc+KCfQndC10YIg0LTQsNC90L3Ri9GFJyk7XG4gIC8qKiDQlNC40LfQtdC50LHQuyDRgdC+0YDRgtC40YDQvtCy0LrQuCAqL1xuICBwdWJsaWMgc29ydGluZ0Rpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuICAvKiog0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40Y8g0LLRi9Cx0L7RgNCwINGH0LXQutCx0L7QutGB0L7QsiDRh9C10YDQtdC3INC/0L7Qu9C1INCy0LLQvtC00LAgKi9cbiAgcHVibGljIGNoZWNrYm94SW5wdXRNYXhWYWx1ZSA9IGlucHV0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICAvKiog0JTQuNC30LXQudCx0Lsg0LLRi9Cx0L7RgNCwINGH0LXQutCx0L7QutGB0L7QsiAqL1xuICBwdWJsaWMgY2hlY2tib3hEaXNhYmxlZCA9IGlucHV0KGZhbHNlKTtcbiAgLyoqINCU0LjQt9C10LnQsdC7INCy0YvQsdC+0YDQsCDRh9C10LrQsdC+0LrRgdC+0LIgKi9cbiAgcHVibGljIHBhZ2luYXRvckRpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuXG4gIHB1YmxpYyBzZWxlY3RlZENvdW50ZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlPy5zZWxlY3RlZFZhbHVlcygpPy5zaXplID8/IG51bGw7XG4gICAgY29uc3QgdW5zZWxlY3RlZFNpemUgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnVuc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyAwO1xuICAgIGNvbnN0IHVuZmV0Y2hlZE9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnN0YXRlVW5mZXRjaGVkT2JqZWN0cygpO1xuICAgIGNvbnN0IGlzTm90U2VsZWN0ZWQgPSB1bmZldGNoZWRPYmplY3RzICE9PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRDtcblxuICAgIGlmIChzZWxlY3RlZFNpemUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlcHJlY2F0ZWRTZWxlY3RlZFJvd3NDb3VudGVyKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcygpLnNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzTm90U2VsZWN0ZWQgPyBzZWxlY3RlZFNpemUgOiB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdW5zZWxlY3RlZFNpemU7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkdHMgPSBpbmplY3QoRGF0ZVRpbWVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2hpZnQgPSBpbmplY3QoS2V5UHJlc3NlZFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kb21JbnRlcnNlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KERvbUludGVyc2VjdGlvblNlcnZpY2UpO1xuICAvLyBUT0RPINGD0LTQsNC70LjRgtGMIG9wdGlvbmFsOiB0cnVlINC/0L7RgdC70LUg0LLRi9C/0L7Qu9C90LXQvdC40Y8g0LfQsNC00LDRh9C4IFNNQTItMzEzNFxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZFNlcnZpY2UgPSBpbmplY3QoU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuXG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQstGL0LHQvtGA0LAg0LIg0YfQtdC60LHQvtC60YEt0YHQtdC70LXQutGC0L7RgNC1ICovXG4gIHB1YmxpYyBzZWxlY3RDaGFuZ2VkID0gb3V0cHV0PEFwcGx5U2VsZWN0aW9uVHlwZXM+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0LfQvdCw0YfQtdC90LjQuSDQv9Cw0LPQuNC90LDRgtC+0YDQsCAqL1xuICBwdWJsaWMgcGFnaW5hdG9yQ2hhbmdlID0gb3V0cHV0PElQYWdpbmF0b3JPdXRwdXQ+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINGB0YLRgNC+0LrRgyAqL1xuICBwdWJsaWMgcm93Q2xpY2sgPSBvdXRwdXQ8YW55PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0LTQstC+0LnQvdC+0LPQviDQvdCw0LbQsNGC0LjRjyDQvdCwINGB0YLRgNC+0LrRgyAqL1xuICBwdWJsaWMgcm93RGJsQ2xpY2sgPSBvdXRwdXQ8YW55PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0L3QsNC20LDRgtC40Y8g0L3QsCDRgdGC0YDQvtC60YMgKi9cbiAgcHVibGljIHJvd1NlbGVjdGVkID0gb3V0cHV0PHsgcm93OiBhbnlbXTsgY291bnQ6IG51bWJlciB9PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0YHQvtGA0YLQuNGA0L7QstC60Lgg0LfQvdCw0YfQtdC90LjQuSDQsiDRgtCw0LHQu9C40YbQtSAqL1xuICBwdWJsaWMgc29ydCA9IG91dHB1dDxSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxhbnk+W10+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0YjQuNGA0LjQvdGLINC60L7Qu9C+0L3QutC4ICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Roc1dpZHRoTWFwID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gbmV3IE1hcCh0aGlzLmNvbHVtbnNEYXRhKCkubWFwKCh7IG5hbWUsIHdpZHRoIH0pID0+IFtuYW1lLCBuZXcgQmVoYXZpb3JTdWJqZWN0KHdpZHRoKV0pKVxuICApO1xuICBwdWJsaWMgdGhzV2lkdGhDaGFuZ2UgPSBvdXRwdXRGcm9tT2JzZXJ2YWJsZTxUaFdpZHRoRW50cnlbXT4oXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMuX3Roc1dpZHRoTWFwKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChjaGFuZ2VzKSA9PlxuICAgICAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgIFsuLi5jaGFuZ2VzLmVudHJpZXMoKV0ubWFwKChbbmFtZSwgJHdpZHRoXSkgPT5cbiAgICAgICAgICAgICR3aWR0aC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgod2lkdGgpID0+ICh7IG5hbWUsIHdpZHRoIH0pKSlcbiAgICAgICAgICApXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZEpTT05zKCksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKFRIU19XSURUSF9DSEFOR0VTX0RFQk9VTkNFX1RJTUVfTUxTKSxcbiAgICAgICAgICBza2lwKDEpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0LLQuNC00LjQvNGL0YUg0YHRgtGA0L7QuiDRgtCw0LHQu9C40YbRiyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9vYnNlcnZlclJvd3NWaXNpYmlsaXR5RE9NJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmJvZHlSb3dzKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoYm9keVJvd3MpID0+XG4gICAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgICBib2R5Um93cy5tYXAoKGJvZHlSb3csIGluZGV4KSA9PlxuICAgICAgICAgIHRoaXMuX2RvbUludGVyc2VjdGlvblNlcnZpY2UuY3JlYXRlQW5kT2JzZXJ2ZShib2R5Um93KS5waXBlKFxuICAgICAgICAgICAgLy8gVE9ETyDRg9C00LDQu9C40YLRjCB0YXAsINC60LDQuiDRgtC+0LvRjNC60L4g0L/QtdGA0LXRgdGC0LDQvdC10YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyBpc192aXNpYmxlINC/0L4g0L/RgNC+0LXQutGC0YNcbiAgICAgICAgICAgIHRhcCgoaXNWaXNpYmxlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucm93RGF0YSgpW2luZGV4XS5pc192aXNpYmxlID0gaXNWaXNpYmxlO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKGlzVmlzaWJsZSkgPT4gKGlzVmlzaWJsZSA/IHRoaXMucm93RGF0YSgpW2luZGV4XSA6IHVuZGVmaW5lZCkpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnBpcGUobWFwKCh2aXNpYmxlUm93cykgPT4gdmlzaWJsZVJvd3MuZmlsdGVyKCh2aXNpYmxlUm93KSA9PiAhIXZpc2libGVSb3cpKSlcbiAgICApXG4gICk7XG4gIHB1YmxpYyB2aXNpYmxlUm93c0NoYW5nZSA9IG91dHB1dEZyb21PYnNlcnZhYmxlPGFueVtdPih0aGlzLl9vYnNlcnZlclJvd3NWaXNpYmlsaXR5RE9NJCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVDb2x1bW5EYXRhVHlwZSA9IEVDb2x1bW5EYXRhVHlwZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVUaW1lem9uZSA9IEVUaW1lem9uZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVEYXRlUGF0dGVybiA9IEVEYXRlUGF0dGVybjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVSZWdpc3Rlck9iamVjdFN0YXRlID0gRVJlZ2lzdGVyT2JqZWN0U3RhdGU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVE9SX0tFWSA9IENIRUNLQk9YX1NFTEVDVE9SX0tFWTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVE9SX1dJRFRIX1BYID0gQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFg7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0aWNreVRoU3R5bGUgPSBPYmplY3QuZnJlZXplKHsgJ3otaW5kZXgnOiAyMiB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0aWNreVRkU3R5bGUgPSBPYmplY3QuZnJlZXplKHsgJ3otaW5kZXgnOiAyMSB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sdW1uc1dpdGhDaGVja2JveGVzID0gY29tcHV0ZWQoKCkgPT4gW1xuICAgIENIRUNLQk9YX1NFTEVDVE9SX0tFWSxcbiAgICAuLi50aGlzLmNvbHVtbnMoKSxcbiAgXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzY3JvbGxQb3NpdGlvbiA9IHNpZ25hbDx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4oeyB0b3A6IDAsIGxlZnQ6IDAgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZVdpZHRoID0gdG9TaWduYWwoXG4gICAgY29tYmluZUxhdGVzdChbdG9PYnNlcnZhYmxlKHRoaXMuY29sdW1uc1dpdGhDaGVja2JveGVzKSwgdG9PYnNlcnZhYmxlKHRoaXMuX3Roc1dpZHRoTWFwKV0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgICh7IDA6IHZpc2libGVDb2x1bW5zLCAxOiBjaGFuZ2VzIH0pID0+XG4gICAgICAgICAgbmV3IE1hcChbLi4uY2hhbmdlcy5lbnRyaWVzKCldLmZpbHRlcigoW3RoTmFtZV0pID0+IHZpc2libGVDb2x1bW5zLmluY2x1ZGVzKHRoTmFtZSkpKVxuICAgICAgKSxcbiAgICAgIHN3aXRjaE1hcCgoY2hhbmdlcykgPT5cbiAgICAgICAgY29tYmluZUxhdGVzdChcbiAgICAgICAgICBbLi4uY2hhbmdlcy5lbnRyaWVzKCldLm1hcCgoeyAxOiAkd2lkdGggfSkgPT5cbiAgICAgICAgICAgICR3aWR0aC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgod2lkdGgpID0+IHdpZHRoKSlcbiAgICAgICAgICApXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBtYXAoKHdpZHRocykgPT4ge1xuICAgICAgICAgICAgbGV0IHRhYmxlV2lkdGggPSB0aGlzLmNoZWNrYm94Q29sdW1uKCkgPyBDSEVDS0JPWF9TRUxFQ1RPUl9XSURUSF9QWCA6IDA7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgd2lkdGggb2Ygd2lkdGhzKSB7XG4gICAgICAgICAgICAgIHRhYmxlV2lkdGggKz0gd2lkdGggPyBOdW1iZXIod2lkdGgpIDogMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRhYmxlV2lkdGg7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBwcm90ZWN0ZWQgc3RhdGVPYmplY3RzID0gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlPy5zdGF0ZTtcblxuICBwcm90ZWN0ZWQgdmlzaWJsZUNvbHVtbnNUcmVlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLl9maWx0ZXJWaXNpYmxlQ29sdW1ucyh0aGlzLmNvbHVtbnNEYXRhKCksIHRoaXMuY29sdW1ucygpKVxuICApO1xuICBwcm90ZWN0ZWQgbWF4RGVwdGggPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9nZXRNYXhEZXB0aCh0aGlzLnZpc2libGVDb2x1bW5zVHJlZSgpKSk7XG4gIHByb3RlY3RlZCBsZWF2ZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9nZXRGbGF0TGVhdmVzKHRoaXMudmlzaWJsZUNvbHVtbnNUcmVlKCkpKTtcblxuICBwcm90ZWN0ZWQgaGVhZGVyUm93cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBtYXhEZXB0aCA9IHRoaXMubWF4RGVwdGgoKTtcbiAgICBjb25zdCByb3dzOiB7IGNvbDogSUNvbHVtbkRhdGE7IHJvd3NwYW46IG51bWJlcjsgY29sc3BhbjogbnVtYmVyIH1bXVtdID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBtYXhEZXB0aCB9LFxuICAgICAgKCkgPT4gW11cbiAgICApO1xuXG4gICAgaWYgKG1heERlcHRoID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnZpc2libGVDb2x1bW5zVHJlZSgpKSB7XG4gICAgICB0aGlzLl9idWlsZEhlYWRlclJlY3Vyc2l2ZShjb2wsIDAsIG1heERlcHRoLCByb3dzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfZGVwcmVjYXRlZFNlbGVjdGVkUm93c0NvdW50ZXIgPSBzaWduYWwoMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVab25lQ2hhbmdlcyQgPSB0aGlzLmR0cy5pc1RpbWVab25lQ2hhbmdlZCQ7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbHVtbk9yZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxhbnk+PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2plY3RlZEhlYWRlcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVjdGVkQ2VsbHNNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jbGlja2VkUm93JCA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaG92ZXJlZFJvdyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBsYXN0U2VsZWN0ZWRSb3c6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2V0U2Nyb2xsUG9zaXRpb25BZnRlckRhdGFMb2FkaW5nKCk7XG4gICAgdGhpcy5fcHJvamVjdEhlYWRlclRlbXBsYXRlcygpO1xuICAgIHRoaXMuX3Byb2plY3RDZWxsVGVtcGxhdGVzKCk7XG4gICAgLy8gVE9ETyDRg9C00LDQu9C40YLRjCDQvNC10YLQvtC0LCDQutCw0Log0YLQvtC70YzQutC+INC/0LXRgNC10YHRgtCw0L3QtdGCINC40YHQv9C+0LvRjNC30L7QstCw0YLRjNGB0Y8gaXNfdmlzaWJsZSDQv9C+INC/0YDQvtC10LrRgtGDXG4gICAgdGhpcy5fc3luY1Jvd1Zpc2liaWxpdHlET00oKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5yb3dEYXRhKCk7XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgIXRoaXMubGFzdFNlbGVjdGVkUm93KSB7XG4gICAgICAgIFt0aGlzLmxhc3RTZWxlY3RlZFJvd10gPSBkYXRhO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsUG9zaXRpb25BZnRlckRhdGFMb2FkaW5nKCk6IHZvaWQge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5zY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbGJhckVsZW1lbnQgPSB0aGlzLnNjcm9sbGJhcigpPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHNjcm9sbGJhckVsZW1lbnQpIHtcbiAgICAgICAgICAgIHNjcm9sbGJhckVsZW1lbnQuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICAgICAgc2Nyb2xsYmFyRWxlbWVudC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvamVjdEhlYWRlclRlbXBsYXRlcygpOiB2b2lkIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcHJvamVjdGVkSGVhZGVyc01hcC5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiB0aGlzLmhlYWRlclRlbXBsYXRlcygpKSB7XG4gICAgICAgIHRoaXMuX3Byb2plY3RlZEhlYWRlcnNNYXAuc2V0KHRlbXBsYXRlLmhlYWRlclRlbXBsYXRlTmFtZSgpLCB0ZW1wbGF0ZS50cGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvamVjdENlbGxUZW1wbGF0ZXMoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3Byb2plY3RlZENlbGxzTWFwLmNsZWFyKCk7XG4gICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRoaXMuY2VsbFRlbXBsYXRlcygpKSB7XG4gICAgICAgIHRoaXMuX3Byb2plY3RlZENlbGxzTWFwLnNldCh0ZW1wbGF0ZS5jZWxsVGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZS50cGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Jvd1Zpc2liaWxpdHlET00oKTogdm9pZCB7XG4gICAgdGhpcy5fb2JzZXJ2ZXJSb3dzVmlzaWJpbGl0eURPTSQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fY2xpY2tlZFJvdyQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9ob3ZlcmVkUm93JC5jb21wbGV0ZSgpO1xuICAgIGZvciAoY29uc3Qgc3ViamVjdCBvZiB0aGlzLl90aHNXaWR0aE1hcCgpLnZhbHVlcygpKSB7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByb2plY3Rpb25IZWFkZXJCeU5hbWUobmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3RlZEhlYWRlcnNNYXAuZ2V0KG5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByb2plY3Rpb25DZWxsQnlOYW1lKG5hbWU6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0ZWRDZWxsc01hcC5nZXQobmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc29ydENoYW5nZSh7IHNvcnRDb21wYXJhdG9yIH06IFR1aVRhYmxlU29ydENoYW5nZTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGFueT4+Pik6IHZvaWQge1xuICAgIGlmICghc29ydENvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHNvcnRDb21wYXJhdG9yKHt9LCB7fSkgYXMgYW55IGFzIHN0cmluZztcbiAgICBjb25zdCBjb2x1bW5PcmRlciA9IHRoaXMuY29sdW1uT3JkZXJzLmdldChpZCk7XG5cbiAgICBpZiAodGhpcy5fc2hpZnQuaXNQcmVzc2VkKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uT3JkZXIoaWQsIGNvbHVtbk9yZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5PcmRlcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uT3JkZXIoaWQsIGNvbHVtbk9yZGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvcnQuZW1pdChbLi4udGhpcy5jb2x1bW5PcmRlcnMudmFsdWVzKCldKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uT3JkZXIoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjb2x1bW5PcmRlcjogUmVnaXN0ZXJUYWJsZUNlbGxTb3J0ZXI8YW55PiB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uT3JkZXIpIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gY29sdW1uT3JkZXI7XG4gICAgICBjb25zdCB7IG9yZGVyIH0gPSBvcHRpb25zO1xuXG4gICAgICBpZiAob3JkZXIgPT09IEVPcmRlci5ERVNDKSB7XG4gICAgICAgIHRoaXMuY29sdW1uT3JkZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbk9yZGVycy5zZXQoaWQsIHsgb3B0aW9uczogeyAuLi5vcHRpb25zLCBvcmRlcjogRU9yZGVyLkRFU0MgfSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5PcmRlcnMuc2V0KGlkLCB7IG9wdGlvbnM6IHsgaWQsIG9yZGVyOiBFT3JkZXIuQVNDIH0gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldFRoTmFtZSh0aE5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuICgpID0+IHRoTmFtZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0F2YWlsYWJsZUNvbHVtblNvcnRpbmcoY29sdW1uRGF0YTogSUNvbHVtbkRhdGEpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHNvcnRhYmxlLCB0eXBlIH0gPSBjb2x1bW5EYXRhO1xuICAgIGNvbnN0IGF2YWlsYWJsZVNvcnRDb2x1bW5UeXBlczogQ29sdW1uRGF0YVR5cGVzW10gPSBbXG4gICAgICBFQ29sdW1uRGF0YVR5cGUuVEVYVCxcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5EQVRFLFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLk5VTSxcbiAgICBdO1xuXG4gICAgcmV0dXJuICF0aGlzLnNvcnRpbmdEaXNhYmxlZCgpICYmIHNvcnRhYmxlICE9PSBmYWxzZSAmJiBhdmFpbGFibGVTb3J0Q29sdW1uVHlwZXMuaW5jbHVkZXModHlwZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tSZXNpemVCbG9ja2VkKGNvbHVtbkRhdGE6IElDb2x1bW5EYXRhKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzaXphYmxlQmxvY2tlZFR5cGVzOiBDb2x1bW5EYXRhVHlwZXNbXSA9IFtcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5DSEVDS0JPWCxcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5JQ09OLFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLklDT05fU1ZHLFxuICAgIF07XG5cbiAgICByZXR1cm4gY29sdW1uRGF0YS5maXhlZCB8fCByZXNpemFibGVCbG9ja2VkVHlwZXMuaW5jbHVkZXMoY29sdW1uRGF0YS50eXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0hvdmVyKHJvdzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuX2hvdmVyZWRSb3ckLm5leHQocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBibHVlSGlnaGxpZ2h0c1NlbGVjdGVkID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGJsdWVIaWdobGlnaHRzU2VsZWN0ZWQ/LnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgY29uc3Qgc3RhdGVPYmplY3RzID0gdGhpcy5zdGF0ZU9iamVjdHM/LigpO1xuXG4gICAgLy8gVE9ETyDQvtGB0YLQsNCy0LjRgtGMINGC0L7Qu9GM0LrQviBpZiDQv9C+0YHQu9C1IFNNQTItMzEzNFxuICAgIGlmIChzdGF0ZU9iamVjdHMpIHtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICB0aGlzLl9jaGFuZ2VSYW5nZVJvd3NTdGF0ZShzdGF0ZU9iamVjdHMsIHRoaXMubGFzdFNlbGVjdGVkUm93LCByb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9jaGFuZ2VPbmx5Um93U3RhdGUoc3RhdGVPYmplY3RzLCByb3csIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NoYW5nZU9ubHlSb3dTdGF0ZShzdGF0ZU9iamVjdHMsIHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRSb3cgPSByb3c7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZE9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNlbGVjdGVkVmFsdWVzKCk7XG5cbiAgICAgIGlmIChzZWxlY3RlZE9iamVjdHMpIHtcbiAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHtcbiAgICAgICAgICByb3c6IFsuLi5zZWxlY3RlZE9iamVjdHNdLFxuICAgICAgICAgIGNvdW50OiBzZWxlY3RlZE9iamVjdHMuc2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NsaWNrZWRSb3ckLm5leHQocm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFJhbmdlUm93cyh0aGlzLmxhc3RTZWxlY3RlZFJvdywgcm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0T25seVJvdyhyb3csIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0T25seVJvdyhyb3cpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRSb3cgPSByb3c7XG4gICAgfVxuXG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHtcbiAgICAgIHJvdzogWy4uLnRoaXMuc2VsZWN0ZWRPYmplY3RzKCldLFxuICAgICAgY291bnQ6IHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoYW5nZU9ubHlSb3dTdGF0ZShcbiAgICBzdGF0ZTogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdD4sXG4gICAgcm93OiB1bmtub3duLFxuICAgIHNhdmVTZWxlY3RlZD86IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiByb3cgIT09ICdvYmplY3QnIHx8ICFyb3cgfHwgISgnaWQnIGluIHJvdykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ9Cf0L7Qu9C1IGlkINC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0LIg0Y3Qu9C10LzQtdC90YLQtScsIHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSByb3cuaWQgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gc3RhdGUuZ2V0KGlkKT8uc3RhdGUgPT09IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgaWYgKHNhdmVTZWxlY3RlZCkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZU9iamVjdEJ5S2V5KGlkLCB7XG4gICAgICAgIHN0YXRlOiB3YXNTZWxlY3RlZCA/IEVSZWdpc3Rlck9iamVjdFN0YXRlLlVOU0VMRUNURUQgOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoRVJlZ2lzdGVyT2JqZWN0U3RhdGUuVU5TRUxFQ1RFRCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoaWQsIHsgc3RhdGU6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdE9ubHlSb3cocm93OiB1bmtub3duLCBzYXZlU2VsZWN0ZWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiByb3cgIT09ICdvYmplY3QnIHx8ICFyb3cgfHwgISgnaWQnIGluIHJvdykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ9Cf0L7Qu9C1IGlkINC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0LIg0Y3Qu9C10LzQtdC90YLQtScsIHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSByb3cuaWQgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZElkcygpLmhhcyhpZCk7XG5cbiAgICBpZiAoc2F2ZVNlbGVjdGVkKSB7XG4gICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZElkcygpLmRlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuZGVsZXRlKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuYWRkKGlkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMoKS5hZGQocm93KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcygpLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cygpLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuYWRkKGlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuYWRkKHJvdyk7XG4gICAgfVxuICAgIHRoaXMuX2VtaXREZXByZWNhdGVkU2VsZWN0ZWRSb3dzKCk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0RGVwcmVjYXRlZFNlbGVjdGVkUm93cygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXByZWNhdGVkU2VsZWN0ZWRSb3dzQ291bnRlci51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZSArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlUmFuZ2VSb3dzU3RhdGUoXG4gICAgc3RhdGVPYmplY3RzOiBNYXA8U2NhbGFyVVVJRCwgSVJlZ2lzdGVyT2JqZWN0PixcbiAgICBwcmV2aW91c1JvdzogdW5rbm93bixcbiAgICBjdXJyZW50Um93OiB1bmtub3duXG4gICk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5VTlNFTEVDVEVEKTtcblxuICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKHByZXZpb3VzUm93KTtcbiAgICBsZXQgY3VyckluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihjdXJyZW50Um93KTtcblxuICAgIGlmIChwcmV2SW5kZXggPiBjdXJySW5kZXgpIHtcbiAgICAgIGNvbnN0IHRlbXBJbmRleCA9IHByZXZJbmRleDtcbiAgICAgIHByZXZJbmRleCA9IGN1cnJJbmRleDtcbiAgICAgIGN1cnJJbmRleCA9IHRlbXBJbmRleDtcbiAgICB9XG5cbiAgICBjb25zdCBpZHNPYmplY3RzU2hvdWxkU2VsZWN0ZWQ6IFNldDxTY2FsYXJVVUlEPiA9IG5ldyBTZXQoXG4gICAgICB0aGlzLnJvd0RhdGEoKVxuICAgICAgICAuc2xpY2UocHJldkluZGV4ID09PSAtMSA/IDAgOiBwcmV2SW5kZXgsIGN1cnJJbmRleCArIDEpXG4gICAgICAgIC5tYXAoKHJvdykgPT4gcm93LmlkKVxuICAgICk7XG5cbiAgICBjb25zdCBzbGljZWRTdGF0ZU9iamVjdHMgPSBuZXcgTWFwKFxuICAgICAgWy4uLnN0YXRlT2JqZWN0c10uZmlsdGVyKChba2V5XSkgPT4gaWRzT2JqZWN0c1Nob3VsZFNlbGVjdGVkLmhhcyhrZXkpKVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzbGljZWRTdGF0ZU9iamVjdHMua2V5cygpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5LCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RSYW5nZVJvd3MocHJldmlvdXNSb3c6IHVua25vd24sIGN1cnJlbnRSb3c6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihwcmV2aW91c1Jvdyk7XG4gICAgbGV0IGN1cnJJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2YoY3VycmVudFJvdyk7XG5cbiAgICBpZiAocHJldkluZGV4ID4gY3VyckluZGV4KSB7XG4gICAgICBjb25zdCB0ZW1wSW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICBwcmV2SW5kZXggPSBjdXJySW5kZXg7XG4gICAgICBjdXJySW5kZXggPSB0ZW1wSW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXNTaG91bGRTZWxlY3RlZCA9IHRoaXMucm93RGF0YSgpLnNsaWNlKFxuICAgICAgcHJldkluZGV4ID09PSAtMSA/IDAgOiBwcmV2SW5kZXgsXG4gICAgICBjdXJySW5kZXggKyAxXG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuY2xlYXIoKTtcbiAgICB0aGlzLl9lbWl0RGVwcmVjYXRlZFNlbGVjdGVkUm93cygpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zU2hvdWxkU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5hZGQoaXRlbS5pZCk7XG4gICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cygpLmFkZChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdGhSZXNpemVDaGFuZ2VzKG5hbWU6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRoV2lkdGhDaGFuZ2VzRW50cnkgPSB0aGlzLl90aHNXaWR0aE1hcCgpLmdldChuYW1lKTtcblxuICAgIGlmICh0aFdpZHRoQ2hhbmdlc0VudHJ5KSB7XG4gICAgICBjb25zdCB2YWxpZFdpZHRoID0gd2lkdGggPiBNSU5fQ09MX1dJRFRIX1BYID8gd2lkdGggOiBNSU5fQ09MX1dJRFRIX1BYO1xuICAgICAgdGhXaWR0aENoYW5nZXNFbnRyeS5uZXh0KHZhbGlkV2lkdGgudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRoV2lkdGgobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0aFdpZHRoQ2hhbmdlc0VudHJ5ID0gdGhpcy5fdGhzV2lkdGhNYXAoKS5nZXQobmFtZSk7XG5cbiAgICByZXR1cm4gdGhXaWR0aENoYW5nZXNFbnRyeT8uZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzYXZlU2Nyb2xsRW5kUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsYmFyRWxlbWVudCA9IHRoaXMuc2Nyb2xsYmFyKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoc2Nyb2xsYmFyRWxlbWVudCAmJiAhdGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSA9IHNjcm9sbGJhckVsZW1lbnQ7XG5cbiAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24uc2V0KHtcbiAgICAgICAgdG9wOiBzY3JvbGxUb3AsXG4gICAgICAgIGxlZnQ6IHNjcm9sbExlZnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShzdGF0ZTogRVJlZ2lzdGVyT2JqZWN0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNldEFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5OiBTY2FsYXJVVUlELCB1cGRhdGVzOiBQYXJ0aWFsPElSZWdpc3Rlck9iamVjdD4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNldFN0YXRlT2JqZWN0QnlLZXkoa2V5LCB1cGRhdGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrUm93QmVmb3JlU2VsZWN0KHJvdzogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNoaWZ0UHJlc3NlZCA9IHRoaXMuX3NoaWZ0LmlzUHJlc3NlZCgpO1xuICAgIGNvbnN0IHByZXZSb3cgPSB0aGlzLmxhc3RTZWxlY3RlZFJvdztcbiAgICBjb25zdCBob3ZlcmVkUm93ID0gdGhpcy5faG92ZXJlZFJvdyQuZ2V0VmFsdWUoKTtcblxuICAgIGlmIChzaGlmdFByZXNzZWQgJiYgcHJldlJvdyAmJiBob3ZlcmVkUm93KSB7XG4gICAgICBsZXQgYmVmb3JlSW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKHByZXZSb3cpO1xuICAgICAgbGV0IGFmdGVySW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKGhvdmVyZWRSb3cpO1xuXG4gICAgICBpZiAoYmVmb3JlSW5kZXggPiBhZnRlckluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRlbXBJbmRleCA9IGJlZm9yZUluZGV4O1xuICAgICAgICBiZWZvcmVJbmRleCA9IGFmdGVySW5kZXg7XG4gICAgICAgIGFmdGVySW5kZXggPSB0ZW1wSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2Yocm93KTtcblxuICAgICAgcmV0dXJuIGJlZm9yZUluZGV4IDw9IGN1cnJlbnRJbmRleCAmJiBjdXJyZW50SW5kZXggPD0gYWZ0ZXJJbmRleDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZEhlYWRlclJlY3Vyc2l2ZShcbiAgICBjb2w6IElDb2x1bW5EYXRhLFxuICAgIGxldmVsOiBudW1iZXIsXG4gICAgbWF4RGVwdGg6IG51bWJlcixcbiAgICByb3dzOiB7IGNvbDogSUNvbHVtbkRhdGE7IHJvd3NwYW46IG51bWJlcjsgY29sc3BhbjogbnVtYmVyIH1bXVtdXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2wuY2hpbGRyZW4gfHwgW107XG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBjaGlsZHJlbi5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgY3VzdG9tUm93c3BhbiA9IGNvbC5yb3dzcGFuIHx8IDE7XG4gICAgY29uc3QgbmV4dExldmVsID0gbGV2ZWwgKyBjdXN0b21Sb3dzcGFuO1xuXG4gICAgbGV0IGNvbHNwYW4gPSAwO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbHNwYW4gKz0gdGhpcy5fYnVpbGRIZWFkZXJSZWN1cnNpdmUoY2hpbGQsIG5leHRMZXZlbCwgbWF4RGVwdGgsIHJvd3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2xzcGFuID0gMTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzcGFuID0gaGFzQ2hpbGRyZW4gPyBjdXN0b21Sb3dzcGFuIDogbWF4RGVwdGggLSBsZXZlbDtcblxuICAgIGlmIChyb3dzW2xldmVsXSkge1xuICAgICAgcm93c1tsZXZlbF0ucHVzaCh7IGNvbCwgcm93c3BhbiwgY29sc3BhbiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sc3BhbjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEZsYXRMZWF2ZXMoY29sdW1uczogSUNvbHVtbkRhdGFbXSk6IElDb2x1bW5EYXRhW10ge1xuICAgIHJldHVybiBjb2x1bW5zLmZsYXRNYXAoKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5jaGlsZHJlbiAmJiBjb2wuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RmxhdExlYXZlcyhjb2wuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtjb2xdO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyVmlzaWJsZUNvbHVtbnMoY29sdW1uczogSUNvbHVtbkRhdGFbXSwgc2hvd2VkTmFtZXM6IHN0cmluZ1tdKTogSUNvbHVtbkRhdGFbXSB7XG4gICAgcmV0dXJuIGNvbHVtbnNcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBpZiAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkcmVuID0gdGhpcy5fZmlsdGVyVmlzaWJsZUNvbHVtbnMoY29sLmNoaWxkcmVuLCBzaG93ZWROYW1lcyk7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uY29sLCBjaGlsZHJlbjogdmlzaWJsZUNoaWxkcmVuIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChjb2wpID0+IHNob3dlZE5hbWVzLmluY2x1ZGVzKGNvbC5uYW1lKSB8fCAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRNYXhEZXB0aChjb2x1bW5zOiBJQ29sdW1uRGF0YVtdKTogbnVtYmVyIHtcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiAxICsgTWF0aC5tYXgoLi4uY29sdW1ucy5tYXAoKGMpID0+IHRoaXMuX2dldE1heERlcHRoKGMuY2hpbGRyZW4gfHwgW10pKSk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3NlY3Rpb25cIj5cbiAgPHR1aS1zY3JvbGxiYXIgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fc2Nyb2xsYWJsZVwiIChzY3JvbGxlbmQpPVwic2F2ZVNjcm9sbEVuZFBvc2l0aW9uKClcIj5cbiAgICA8dHVpLWxvYWRlciBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19sb2FkZXJcIiBbc2hvd0xvYWRlcl09XCJpc0xvYWRpbmcoKSB8fCBmYWxzZVwiIFtvdmVybGF5XT1cInRydWVcIj5cbiAgICAgIDx0YWJsZVxuICAgICAgICB0dWlUYWJsZVxuICAgICAgICBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgc3RpY2t5UmVsYXRpdmVcbiAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1dpdGhDaGVja2JveGVzKClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwidGFibGVXaWR0aCgpXCJcbiAgICAgICAgdHVpU29ydEJ5PVwiXCJcbiAgICAgICAgKHNvcnRDaGFuZ2UpPVwic29ydENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIEBmb3IgKGhyb3cgb2YgaGVhZGVyUm93cygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ciB0dWlUaEdyb3VwPlxuICAgICAgICAgICAgICBAaWYgKCRmaXJzdCAmJiBjaGVja2JveENvbHVtbigpKSB7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICB0dWlUaFxuICAgICAgICAgICAgICAgICAgKnR1aUhlYWQ9XCJDSEVDS0JPWF9TRUxFQ1RPUl9LRVlcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fdGgtYmFja2dyb3VuZC0tdGFibGUtY2VsbC1ibHVlIHJlZ2lzdGVyLXRhYmxlX19jZWxsLWljb24gcmVnaXN0ZXItdGFibGVfX2NlbGwtY2hlY2tib3gtc2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIkNIRUNLQk9YX1NFTEVDVE9SX1dJRFRIX1BYXCJcbiAgICAgICAgICAgICAgICAgIFtzb3J0ZXJdPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgICBbcm93U3Bhbl09XCJtYXhEZXB0aCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3Byb2MtY2hlY2tib3gtc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkSWRzKClcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNTZWxlY3Rsb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2tib3hEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQXBwbHkpPVwic2VsZWN0Q2hhbmdlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgPjwvc3Byb2MtY2hlY2tib3gtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAZm9yIChjZWxsIG9mIGhyb3c7IHRyYWNrIGNlbGwuY29sLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBAbGV0IHRoQ2xhc3MgPSBjZWxsLmNvbC5jbGFzcyA/PyAnJztcbiAgICAgICAgICAgICAgICBAbGV0IHRoVHlwZSA9IGNlbGwuY29sLnR5cGU7XG4gICAgICAgICAgICAgICAgQGxldCB0aE5hbWUgPSBjZWxsLmNvbC5uYW1lO1xuICAgICAgICAgICAgICAgIEBsZXQgc29ydGFibGUgPSBjaGVja0F2YWlsYWJsZUNvbHVtblNvcnRpbmcoY2VsbC5jb2wpO1xuICAgICAgICAgICAgICAgIEBsZXQgcmVzaXplQmxvY2tlZCA9IGNoZWNrUmVzaXplQmxvY2tlZChjZWxsLmNvbCk7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICB0dWlUaFxuICAgICAgICAgICAgICAgICAgdHVpUmVzaXphYmxlXG4gICAgICAgICAgICAgICAgICAqdHVpSGVhZD1cInRoTmFtZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ3JlZ2lzdGVyLXRhYmxlX190aCcsIHRoVHlwZSB8IGNsYXNzQnlUeXBlLCB0aENsYXNzXVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5TGVmdF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lMZWZ0SWRzKCkpXCJcbiAgICAgICAgICAgICAgICAgIFtzdGlja3lSaWdodF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lSaWdodElkcygpKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVzT25TdGlja3ldPVwic3RpY2t5VGhTdHlsZVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY2VsbC5jb2wuaGVhZGVyU3R5bGUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJnZXRUaFdpZHRoKHRoTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbdHVpU29ydGFibGVdPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgW3NvcnRlcl09XCJzb3J0YWJsZSA/IHNldFRoTmFtZSh0aE5hbWUpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbdHVpSGludF09XCJjZWxsLmNvbC50b29sdGlwVGV4dCA/PyBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dTcGFuXT1cImNlbGwucm93c3BhblwiXG4gICAgICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjZWxsLmNvbHNwYW5cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIub3JkZXJdPVwiY29sdW1uT3JkZXJzLmdldCh0aE5hbWUpPy5vcHRpb25zPy5vcmRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjZWxsLmNvbC5pc0hlYWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IHRoUHJvamVjdGlvbiA9IGdldFByb2plY3Rpb25IZWFkZXJCeU5hbWUodGhOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRoUHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoUHJvamVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNlbGwuY29sLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAodGhUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZS0taWNvbi1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImNlbGwuY29sLnZhbHVlIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC90dWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OX1NWRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImNlbGwuY29sLnZhbHVlXCIgW2FsdF09XCJ0aE5hbWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLlRFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2VsbC5jb2wuc3ZnU3JjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZWxsLmNvbC5zdmdTcmNcIiBbYWx0XT1cInRoTmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtb3ZlcmZsb3ctLWVsbGlwc2lzXCIgW25nU3R5bGVdPVwiY2VsbC5jb2wudGV4dFN0eWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNlbGwuY29sLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuTlVNKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJjZWxsLmNvbC50ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJjZWxsLmNvbC50ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoIXJlc2l6ZUJsb2NrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX2NlbGwtcmVzaXplclwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R1aVJlc2l6ZXJdPVwiWzEsIDBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAodHVpU2l6ZUNoYW5nZSk9XCJ0aFJlc2l6ZUNoYW5nZXMoY2VsbC5jb2wubmFtZSwgJGV2ZW50WzBdKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgQGxldCByb3dzID0gcm93RGF0YSgpO1xuICAgICAgICA8dGJvZHkgdHVpVGJvZHk+XG4gICAgICAgICAgQGZvciAocm93IG9mIHJvd3M7IHRyYWNrIHJvdy5pZCkge1xuICAgICAgICAgICAgQGxldCBzdGF0ZSA9IHN0YXRlT2JqZWN0cz8uKCk7XG4gICAgICAgICAgICBAbGV0IHRyU2VsZWN0ZWQgPVxuICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgID8gc3RhdGUuZ2V0KHJvdy5pZCk/LnN0YXRlID09PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJZHMoKS5oYXMocm93LmlkKTtcblxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICNib2R5Um93XG4gICAgICAgICAgICAgIHR1aVRyXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3Jvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJ0clNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNoaWZ0LXByZXNzZWRdPVwibWFya1Jvd0JlZm9yZVNlbGVjdChyb3cpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Sb3dIb3Zlcihyb3cpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25Sb3dIb3ZlcihudWxsKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblJvd0NsaWNrKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICAgIChkYmxjbGljayk9XCJyb3dEYmxDbGljay5lbWl0KHJvdylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKGNoZWNrYm94Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIHR1aVRkXG4gICAgICAgICAgICAgICAgICAqdHVpQ2VsbD1cIkNIRUNLQk9YX1NFTEVDVE9SX0tFWVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19jZWxsLWNoZWNrYm94LXNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjaGVja2JveERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBmb3IgKGNvbHVtbkRhdGEgb2YgbGVhdmVzKCk7IHRyYWNrIGNvbHVtbkRhdGEubmFtZSkge1xuICAgICAgICAgICAgICAgIEBsZXQgdGRUeXBlID0gY29sdW1uRGF0YS50eXBlO1xuICAgICAgICAgICAgICAgIEBsZXQgdGRLZXkgPSBjb2x1bW5EYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgQGxldCB0ZFZhbHVlID0gcm93W3RkS2V5XTtcbiAgICAgICAgICAgICAgICBAbGV0IHRkQ2xhc3MgPSBjb2x1bW5EYXRhLmNsYXNzVGQgPz8gJyc7XG5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIHR1aVRkXG4gICAgICAgICAgICAgICAgICAqdHVpQ2VsbD1cInRkS2V5XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlt0ZFR5cGUgfCBjbGFzc0J5VHlwZTogJ3RkJywgdGRDbGFzc11cIlxuICAgICAgICAgICAgICAgICAgW3N0aWNreUxlZnRdPVwidGRLZXkgfCBzdGlja3lDb2x1bW46IHN0aWNreUxlZnRJZHMoKVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5UmlnaHRdPVwidGRLZXkgfCBzdGlja3lDb2x1bW46IHN0aWNreVJpZ2h0SWRzKClcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlc09uU3RpY2t5XT1cInN0aWNreVRkU3R5bGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uRGF0YS5pc1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgdGRQcm9qZWN0aW9uID0gZ2V0UHJvamVjdGlvbkNlbGxCeU5hbWUodGRLZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAodGRQcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGRQcm9qZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogdGRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAodGRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZS0taWNvbi1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiY29sdW1uRGF0YS52YWx1ZSFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC90dWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OX1NWRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0ZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb2x1bW5EYXRhLnZhbHVlXCIgW2FsdF09XCJ0ZEtleVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIXRkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLlRFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0dWlIaW50XT1cInRkVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/PyAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRkVmFsdWUgPyBjb2x1bW5EYXRhLnBvc3RmaXggOiAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLk5VTSkge1xuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/PyAnJyB8IG51bWJlcjogY29sdW1uRGF0YS5udW1iZXJQaXBlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZFZhbHVlID8gY29sdW1uRGF0YS5wb3N0Zml4IDogJycgfX1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybWF0RGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVGltZXpvbmUuVVRDXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbkRhdGEuZGF0ZVBhdHRlcm4gPz8gRURhdGVQYXR0ZXJuLkRBVEVfVElNRV9XSVRIT1VUX1NFQ09ORFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRpbWVab25lQ2hhbmdlcyQgfCBhc3luYykpID8/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/IGNvbHVtbkRhdGEucG9zdGZpeCA6ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJlbXB0eS1sYXllclwiPlxuICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyZWQtdGV4dFwiPnt7IGVtcHR5VGV4dCgpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC90dWktbG9hZGVyPlxuICA8L3R1aS1zY3JvbGxiYXI+XG5cbiAgPHNwcm9jLXBhZ2luYXRvclxuICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3BhZ2luYXRvclwiXG4gICAgW3BhZ2VdPVwicGFnZSgpXCJcbiAgICBbcm93c109XCJsaW1pdCgpXCJcbiAgICBbcGFnZUxpbmtTaXplXT1cIjFcIlxuICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzKClcIlxuICAgIFt0b3RhbE5vdEZpbHRlcmVkXT1cInRvdGFsTm90RmlsdGVyZWQoKVwiXG4gICAgW3Jvd3NDb3VudE9wdGlvbnNdPVwiWzMwLCA0MCwgNTBdXCJcbiAgICBbc2VsZWN0ZWRDb3VudGVyXT1cInNlbGVjdGVkQ291bnRlcigpXCJcbiAgICAocGFnaW5hdG9yQ2hhbmdlKT1cInBhZ2luYXRvckNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmF0b3JEaXNhYmxlZCgpXCJcbiAgICBbaXNMb2FkaW5nXT1cImlzUGFnaW5hdG9yTG9hZGluZygpXCJcbiAgPlxuICA8L3Nwcm9jLXBhZ2luYXRvcj5cbjwvc2VjdGlvbj5cbiJdfQ==