ngx-register-base 1.3.0 → 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,575 +0,0 @@
1
- import { ChangeDetectorRef, DestroyRef, Directive, inject, } from '@angular/core';
2
- import { Router } from '@angular/router';
3
- import { BehaviorSubject, catchError, combineLatest, debounceTime, filter as rxjsFilter, map, ReplaySubject, switchMap, take, tap, throwError, } from 'rxjs';
4
- import { ERegisterObjectState, EInputsAction, EInputsState, } from '../../types';
5
- import { EColumnStatus, } from '../../components/column-settings/types/column-settings.types';
6
- import { SelectionTypes, } from '../../components/checkbox-selector/checkbox-selector.types';
7
- import { FiltersStateService, FiltersService, FiltersTransmitService, SelectedObjectsStateService, } from '../../services';
8
- import { SEARCH_INPUT_DEBOUNCE_TIME_MLS, SETTINGS_TYPE, USER_PROFILE_LOADER, USER_SETTINGS_LOADER, } from '../../consts/register-base.consts';
9
- import { getLastSegmentOfPathName, isNonNull } from '../../utils';
10
- import { DEFAULT_LIMIT } from '../../services/inputs-state.service';
11
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
12
- import _ from 'lodash';
13
- import { RegisterBaseStore } from './register-base.store';
14
- import * as i0 from "@angular/core";
15
- export class RegisterBase {
16
- get limit() {
17
- return this._limit;
18
- }
19
- get offset() {
20
- return this._offset;
21
- }
22
- /** Uuid'ы всех выбранных или исключаемых объектов реестра (зависит от состояния еще не загруженных объектов) */
23
- get idsFromState() {
24
- const service = this.selectedService;
25
- if (!service) {
26
- throw new Error('SelectedObjectsStateService не запровайжен');
27
- }
28
- return service.keys();
29
- }
30
- /** Все выбранные uuid'ы реестра */
31
- get selectedIdsFromState() {
32
- const service = this.selectedService;
33
- if (!service) {
34
- throw new Error('SelectedObjectsStateService не запровайжен');
35
- }
36
- return service.selectedKeys();
37
- }
38
- /** Все выбранные объекты реестра */
39
- get selectedObjectsFromState() {
40
- const service = this.selectedService;
41
- if (!service) {
42
- throw new Error('SelectedObjectsStateService не запровайжен');
43
- }
44
- return service.selectedValues();
45
- }
46
- constructor(injector, columnsData) {
47
- this.injector = injector;
48
- /** Сервисы управления фильтрами */
49
- this.filtersService = inject(FiltersService);
50
- this.stateService = inject(FiltersStateService);
51
- this.transmitter = inject(FiltersTransmitService, { optional: true });
52
- /** Сервис управления пользователем */
53
- this.userService = inject(USER_PROFILE_LOADER);
54
- /** Сервис управления данными в реестре */
55
- this.baseStore = inject((RegisterBaseStore), { optional: true });
56
- // TODO удалить optional: true после выполнения задачи SMA2-3134
57
- this.selectedService = inject((SelectedObjectsStateService), {
58
- optional: true,
59
- });
60
- // TODO protected readonly navigationService = inject(NavigationService);
61
- this.router = inject(Router);
62
- this.cdr = inject(ChangeDetectorRef);
63
- this.destroyRef = inject(DestroyRef);
64
- this.settingsService = inject(USER_SETTINGS_LOADER);
65
- this.filterApplied$ = this.stateService.gqlValues$.pipe(map((filter) => Number(filter.length) > 0));
66
- this.page$ = this.stateService.page$;
67
- this.limit$ = this.stateService.limit$;
68
- this.selectedRecordsLoading$ = new BehaviorSubject(false);
69
- this.data = [];
70
- this.visibleData = [];
71
- this.dataCount = 0;
72
- /** @deprecated Используйте selectedObjectsFromState */
73
- this.selectedObjects = new Set();
74
- /** @deprecated Используйте selectedIdsFromState */
75
- this.selectedIds = new Set();
76
- this._user = this.userService.getUserProfile();
77
- this.stickyLeftIds = [];
78
- this.stickyRightIds = [];
79
- this.currentFilter = null;
80
- this.filterState = [];
81
- this._modulePath = getLastSegmentOfPathName(this.router.url);
82
- this._defaultFilterApplied$ = new ReplaySubject();
83
- /**
84
- * Контрол строки поиска
85
- */
86
- this.searchInput = this.filtersService.searchInput;
87
- this._selectionType$ = this.selectedService?.selectionType$ ?? new BehaviorSubject(null);
88
- this.stateObjects = this.selectedService?.state;
89
- this.columnsData = columnsData;
90
- this._defaultColumnsWidths = new Map(columnsData.map((col) => [col.name, col.width]));
91
- this.columns = this._getDefaultColumnsRecursive(columnsData);
92
- this._subscribeOnSettings();
93
- this._fetchSavedPageRowsLimit();
94
- const state = this.router.getCurrentNavigation()?.extras?.state;
95
- if (state) {
96
- this.filterState = this.parseToFilters(state);
97
- }
98
- }
99
- _subscribeOnSettings() {
100
- this.settingsService.settings$
101
- .pipe(takeUntilDestroyed(this.destroyRef))
102
- .subscribe(([userSetting]) => {
103
- const { tableColumnsWidth } = userSetting?.settings ?? {};
104
- const type = userSetting?.settings_type;
105
- if (type && type !== SETTINGS_TYPE.COLUMNS) {
106
- return;
107
- }
108
- const cleanedCurrent = this._omitUndefined(this._columnsSettings?.settings.tableColumnsWidth);
109
- const cleanedNew = this._omitUndefined(tableColumnsWidth);
110
- if (!_.isEqual(cleanedCurrent, cleanedNew)) {
111
- this._setColumnsWidth(tableColumnsWidth);
112
- }
113
- this._columnsSettings = userSetting;
114
- });
115
- }
116
- _omitUndefined(arr) {
117
- return _.map(arr ?? [], (obj) => _.omitBy(obj, _.isUndefined));
118
- }
119
- _setColumnsWidth(columnsWidth) {
120
- const thsWidthMap = new Map(columnsWidth?.map(({ name, width }) => [name, width]));
121
- this.columnsData = this.columnsData.map((col) => {
122
- const defaultWidth = this._defaultColumnsWidths.get(col.name);
123
- const currentWidth = thsWidthMap.has(col.name) ? thsWidthMap.get(col.name) : null;
124
- const width = currentWidth === null ? defaultWidth : currentWidth;
125
- return {
126
- ...col,
127
- width,
128
- };
129
- });
130
- }
131
- _fetchSavedPageRowsLimit() {
132
- this.settingsService
133
- .fetchUserSettings$({
134
- id_user: {
135
- _eq: this._user.id,
136
- },
137
- settings_type: {
138
- _eq: SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT,
139
- },
140
- module_name: {
141
- _eq: this._modulePath,
142
- },
143
- }, true)
144
- .subscribe(([firstSetting]) => {
145
- this._pageRowsLimitSetting = firstSetting;
146
- const { pageRowsLimit } = firstSetting?.settings ?? {};
147
- this.stateService.setLimit(pageRowsLimit ?? DEFAULT_LIMIT);
148
- });
149
- }
150
- ngOnInit() {
151
- this.filtersForm = this.buildForm;
152
- this.filtersService.init(this.filtersForm);
153
- this.stateService.setState({ state: EInputsState.HIDDEN, action: EInputsAction.OPEN });
154
- this.fetchTotalObjects(this.baseFilter(this._user));
155
- this._subscribeOnMutationCompleted();
156
- this.subscribeOnPaging();
157
- // TODO проверить нужна ли Перезагрузка страницы
158
- // if (this.navigationService.previousUrl === null) {
159
- // this.stateService.setOffset(0);
160
- // this.stateService.setPage(1);
161
- // }
162
- this.baseStore?.count$?.subscribe((count) => {
163
- this.dataCount = count;
164
- this.stateService.setCount(count);
165
- });
166
- }
167
- ngAfterViewInit(searchLimiter = 2) {
168
- this._setFilters();
169
- this.subscribeOnSearchChanges(searchLimiter);
170
- }
171
- _setFilters() {
172
- const queryFilters = this.transmitter?.filters;
173
- const querySearch = this.transmitter?.search;
174
- let filters;
175
- if (querySearch) {
176
- this.searchInput.setValue(querySearch);
177
- }
178
- if (!queryFilters || queryFilters.length > 0) {
179
- filters = queryFilters || [];
180
- }
181
- this.applyBaseFilter();
182
- this._initDefaultFilter(filters);
183
- }
184
- applyBaseFilter(_data) { }
185
- ngOnDestroy() {
186
- this.actionCompleted$.complete();
187
- this.selectedRecordsLoading$.complete();
188
- this.filtersService.clear();
189
- this.stateService.setOffset(0);
190
- this.stateService.setGqlValues({});
191
- if (this.searchInput?.value) {
192
- this.stateService.setSearchFilterValue('');
193
- this.stateService.setGqlValues(this.filtersService.gqlFilter);
194
- }
195
- }
196
- applyFilters(filters) {
197
- this.filtersService.setUserSettingsFilterValues(filters);
198
- this.stateService.setGqlValues(this.filtersService.gqlFilter);
199
- }
200
- setData(data, count) {
201
- this.data = data;
202
- if (count !== undefined) {
203
- this.dataCount = count;
204
- this.stateService.setCount(count);
205
- }
206
- this.cdr.markForCheck();
207
- }
208
- updateAllStateObjectsByState(state) {
209
- this.selectedService?.setAllStateObjectsByState(state);
210
- }
211
- updateStateObjectByKey(key, updates) {
212
- this.selectedService?.setStateObjectByKey(key, updates);
213
- }
214
- clearSelections(data) {
215
- this.selectedIds.clear();
216
- this.selectedObjects.clear();
217
- if (this.selectedService) {
218
- this.selectedService?.resetState(data);
219
- this.buildActions({
220
- row: [],
221
- count: 0,
222
- });
223
- }
224
- }
225
- actionCompleted() {
226
- const filter = this.buildFilter(this.limit, this.offset, this._filterState);
227
- this.currentFilter = filter;
228
- this.clearSelections();
229
- this.objectsSubscription({ filter });
230
- }
231
- buildActions(_data) { }
232
- subscribeOnSearchChanges(limiter) {
233
- this.searchInput?.valueChanges
234
- .pipe(rxjsFilter((value) => !value || value.length > limiter), debounceTime(SEARCH_INPUT_DEBOUNCE_TIME_MLS), takeUntilDestroyed(this.destroyRef))
235
- .subscribe(() => {
236
- this.stateService.setGqlValues(this.filtersService.gqlFilter);
237
- });
238
- }
239
- updateRegister() {
240
- this.stateService.setLimit(this.stateService.limit);
241
- }
242
- subscribeOnPaging() {
243
- this._defaultFilterApplied$
244
- .pipe(take(1), switchMap(() => combineLatest([
245
- this.stateService.limit$.pipe(rxjsFilter(isNonNull)),
246
- this.stateService.offset$,
247
- this.stateService.gqlValues$.pipe(tap((data) => {
248
- if (Number(data.length) > 0) {
249
- this.selectChanged(null);
250
- }
251
- })),
252
- this.stateService.sorter$,
253
- ]).pipe(debounceTime(250))), catchError((e) => {
254
- console.error('pagination', e);
255
- return throwError(() => new Error(e));
256
- }), takeUntilDestroyed(this.destroyRef))
257
- .subscribe(([limit, offset, gqlFilter, sorter]) => {
258
- const filter = this.buildFilter(limit, offset, gqlFilter, sorter);
259
- const gqlFilterUpdated = !_.isEqual(this._filterState, gqlFilter);
260
- this.currentFilter = filter;
261
- this._filterState = gqlFilter;
262
- this._limit = limit;
263
- this._offset = offset;
264
- if (this.stateObjects) {
265
- if (gqlFilterUpdated) {
266
- this.selectedService?.resetState();
267
- }
268
- this.objectsSubscription({ filter, callback: this._setStateObjects.bind(this) });
269
- }
270
- else {
271
- this.objectsSubscription({ filter });
272
- }
273
- this.fetchTotalFilteredObjects?.(filter.where);
274
- });
275
- }
276
- _setStateObjects(data) {
277
- this.selectedService?.loadStateObjects(data);
278
- }
279
- selectChanged(value) {
280
- this._selectionType$.next(value);
281
- const stateObjects = this.stateObjects;
282
- if (stateObjects) {
283
- this._changeStateObjects(stateObjects(), value);
284
- return;
285
- }
286
- const filter = this._selectChangedFilter(value);
287
- this.currentFilter = filter;
288
- this.buildActions({
289
- row: [...(this.selectedObjects ?? [])],
290
- count: this.selectedObjects ? this.selectedObjects.size : 0,
291
- });
292
- if (!filter) {
293
- return;
294
- }
295
- this.selectedRecordsLoading$.next(true);
296
- this.objectsSubscription({
297
- filter,
298
- callback: this._setSelected.bind(this),
299
- });
300
- }
301
- _changeStateObjects(stateObjects, value) {
302
- if (value === SelectionTypes.ALL) {
303
- this.updateAllStateObjectsByState(ERegisterObjectState.SELECTED);
304
- }
305
- else if (value === SelectionTypes.INVERSE) {
306
- this._inverseStateObjects(stateObjects);
307
- }
308
- else if (value === SelectionTypes.VISIBLE) {
309
- this._selectVisibleStateObjects();
310
- }
311
- else if (typeof value === 'number') {
312
- this._selectFirstNStateObjects(value);
313
- }
314
- else {
315
- this.clearSelections(this.data);
316
- }
317
- this.buildActions({
318
- row: [...this.selectedObjectsFromState],
319
- count: this.selectedObjectsFromState.size,
320
- });
321
- }
322
- _inverseStateObjects(stateObjects) {
323
- for (const [key, { state }] of stateObjects) {
324
- const inverseState = state === ERegisterObjectState.SELECTED
325
- ? ERegisterObjectState.UNSELECTED
326
- : ERegisterObjectState.SELECTED;
327
- this.updateStateObjectByKey(key, { state: inverseState });
328
- }
329
- }
330
- _selectVisibleStateObjects() {
331
- this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
332
- for (const visibleObject of this.visibleData) {
333
- this.updateStateObjectByKey(visibleObject.id, { state: ERegisterObjectState.SELECTED });
334
- }
335
- }
336
- _selectFirstNStateObjects(value) {
337
- this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
338
- if (value > this.limit) {
339
- const { sorter } = this.stateService;
340
- const filter = this.buildFilter(value, this.offset, this._filterState, sorter.length > 0 ? sorter : undefined);
341
- this.objectsSubscription({
342
- filter,
343
- callback: this._selectFirstNLoadingObjects.bind(this),
344
- noSet: true,
345
- });
346
- }
347
- else {
348
- const firstNObjects = this.data.slice(0, value);
349
- this._selectFirstNLoadingObjects(firstNObjects);
350
- }
351
- }
352
- _selectFirstNLoadingObjects(objects) {
353
- for (const object of objects) {
354
- this.updateStateObjectByKey(object.id, { state: ERegisterObjectState.SELECTED, object });
355
- }
356
- }
357
- filterToggle() {
358
- this.stateService.toggle();
359
- }
360
- onPaginatorChange(paginatorChange) {
361
- const { rows, first, page } = paginatorChange;
362
- if (this.stateService.limit !== rows) {
363
- this.stateService.setLimit(rows);
364
- this._savePageRowsLimit(rows);
365
- }
366
- if (this.stateService.offset !== first - 1) {
367
- this.stateService.setOffset(first - 1);
368
- }
369
- if (this.stateService.page !== page) {
370
- this.stateService.setPage(page);
371
- }
372
- }
373
- _savePageRowsLimit(pageRowsLimit) {
374
- this.settingsService
375
- .upsertReturningOne$(SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT)
376
- .subscribe((setting) => {
377
- this._pageRowsLimitSetting = setting || undefined;
378
- });
379
- this.settingsService.upsertUserSettingsByUserId({
380
- settings: {
381
- id: this._pageRowsLimitSetting?.id,
382
- settings_type: SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT,
383
- module_name: this._modulePath,
384
- settings: { pageRowsLimit },
385
- },
386
- hidden: true,
387
- });
388
- }
389
- updateColumnSettings({ settings }) {
390
- if (settings) {
391
- this.stickyLeftIds = this._getColumnIdsRecursive(settings.stickyLeft);
392
- this.stickyRightIds = this._getColumnIdsRecursive(settings.stickyRight, (el) => el.status === EColumnStatus.DEFAULT);
393
- this.columns = [
394
- ...this.stickyLeftIds,
395
- ...this._getColumnIdsRecursive(settings.columns, (el) => el.status === EColumnStatus.DEFAULT),
396
- ...this.stickyRightIds,
397
- ];
398
- }
399
- this.cdr.markForCheck();
400
- }
401
- _getColumnIdsRecursive(columns, predicate) {
402
- const filteredColumns = predicate
403
- ? columns.filter((col, index, array) => predicate(col, index, array))
404
- : columns;
405
- return filteredColumns.flatMap((column) => {
406
- const { id, children } = column;
407
- if (children) {
408
- return [id, ...this._getColumnIdsRecursive(children, predicate)];
409
- }
410
- return [id];
411
- });
412
- }
413
- updateSort(sort) {
414
- this.stateService.setSorter(sort);
415
- }
416
- saveThsWidthToUserSettings(tableColumnsWidth) {
417
- const settings = this._columnsSettings;
418
- if (settings) {
419
- settings.settings.tableColumnsWidth = tableColumnsWidth;
420
- }
421
- this.settingsService.upsertUserSettingsByUserId({
422
- settings: {
423
- id: this._columnsSettings?.id,
424
- settings_type: SETTINGS_TYPE.COLUMNS,
425
- module_name: this._modulePath,
426
- settings: { ...this._columnsSettings?.settings, tableColumnsWidth },
427
- },
428
- hidden: true,
429
- updateSettings: true,
430
- });
431
- }
432
- get filtersAreOpened() {
433
- return this.stateService.state.state !== EInputsState.HIDDEN;
434
- }
435
- _subscribeOnMutationCompleted() {
436
- this.actionCompleted$
437
- .pipe(takeUntilDestroyed(this.destroyRef))
438
- .subscribe(() => this.actionCompleted());
439
- }
440
- _initDefaultFilter(queryFilters) {
441
- this.settingsService
442
- .fetchUserSettings$({
443
- id_user: {
444
- _eq: this._user.id,
445
- },
446
- settings_type: {
447
- _in: [SETTINGS_TYPE.FILTER, SETTINGS_TYPE.REGISTER_PINNED_INPUTS],
448
- },
449
- module_name: {
450
- _eq: this._modulePath,
451
- },
452
- })
453
- .pipe(take(1))
454
- .subscribe((userSettings) => {
455
- const pinnedFilter = userSettings.find(({ settings_type: type }) => type === SETTINGS_TYPE.REGISTER_PINNED_INPUTS);
456
- const isPinned = !!pinnedFilter?.settings.pinned;
457
- const favoriteFilter = userSettings.find(({ settings }) => settings.favorite);
458
- if (isPinned) {
459
- this.stateService.setPin(true);
460
- this.stateService.setState({
461
- state: EInputsState.FILTER_LIST,
462
- action: EInputsAction.APPLY_SAVED_FILTER,
463
- });
464
- }
465
- if (queryFilters || this.searchInput?.getRawValue()) {
466
- this.applyFilters(queryFilters ?? []);
467
- }
468
- else if (pinnedFilter && isPinned) {
469
- this._applyFilterSettings(pinnedFilter);
470
- }
471
- else if (favoriteFilter) {
472
- this._applyFilterSettings(favoriteFilter);
473
- }
474
- this._defaultFilterApplied$.next(true);
475
- });
476
- }
477
- _applyFilterSettings(settings) {
478
- this.filtersService.setUserSettingsFilterValues(settings.settings.filter ?? []);
479
- const { gqlFilter } = this.filtersService;
480
- this.stateService.setGqlValues(gqlFilter);
481
- this.stateService.setState({
482
- state: EInputsState.HIDDEN,
483
- action: EInputsAction.APPLY_SAVED_FILTER,
484
- });
485
- }
486
- _selectChangedFilter(selection) {
487
- let filter = null;
488
- if (selection === null) {
489
- this.clearSelections();
490
- return;
491
- }
492
- if (selection === SelectionTypes.ALL || typeof selection === 'number') {
493
- filter = this._handleAllOrNumberSelection(selection);
494
- }
495
- else if (selection === SelectionTypes.VISIBLE) {
496
- this._selectVisibleItems();
497
- }
498
- else if (selection === SelectionTypes.INVERSE) {
499
- filter = this._handleInverseSelection();
500
- }
501
- return filter;
502
- }
503
- _handleAllOrNumberSelection(selection) {
504
- let filter = null;
505
- const { sorter } = this.stateService;
506
- if (selection === SelectionTypes.ALL) {
507
- filter = this.buildFilter(undefined, undefined, this._filterState);
508
- }
509
- else if (typeof selection === 'number') {
510
- if (selection > this.limit) {
511
- filter = this.buildFilter(selection, 0, this._filterState, sorter.length > 0 ? sorter : undefined);
512
- }
513
- else {
514
- this._selectFirstNItems(selection);
515
- }
516
- }
517
- return filter;
518
- }
519
- _selectFirstNItems(count) {
520
- this.selectedObjects = new Set(this.data.slice(0, count));
521
- this.selectedIds = new Set(this.data.map((d) => d.id).slice(0, count));
522
- }
523
- _selectVisibleItems() {
524
- this.selectedObjects = new Set(this.visibleData);
525
- this.selectedIds = new Set(this.visibleData.map((d) => d.id));
526
- }
527
- _handleInverseSelection() {
528
- const inverseFilter = { id: { _nin: [...this.selectedIds] } };
529
- const updatedFilterState = Array.isArray(this._filterState)
530
- ? [...this._filterState, inverseFilter]
531
- : [this._filterState, inverseFilter];
532
- return this.buildFilter(undefined, undefined, updatedFilterState);
533
- }
534
- _setSelected(data) {
535
- this.selectedObjects = new Set(data);
536
- this.selectedIds = new Set(data.map((d) => d.id));
537
- this.selectedRecordsLoading$.next(false);
538
- }
539
- parseToFilters(input) {
540
- return Object.entries(input).map(([key, value]) => ({
541
- id: key,
542
- value,
543
- }));
544
- }
545
- get selectedCount() {
546
- const selectedSize = this.selectedService?.selectedValues()?.size ?? null;
547
- const unselectedSize = this.selectedService?.unselectedValues()?.size ?? 0;
548
- const unfetchedObjects = this.selectedService?.stateUnfetchedObjects();
549
- const isNotSelected = unfetchedObjects !== ERegisterObjectState.SELECTED;
550
- if (selectedSize === null) {
551
- return this.selectedIds.size;
552
- }
553
- return isNotSelected ? selectedSize : this.dataCount - unselectedSize;
554
- }
555
- _getDefaultColumnsRecursive(columnsData) {
556
- return columnsData.flatMap((column) => {
557
- const { name, children } = column;
558
- if (children) {
559
- return [name, ...this._getDefaultColumnsRecursive(children)];
560
- }
561
- return [name];
562
- });
563
- }
564
- get notAllFetched() {
565
- const unfetchedState = this.selectedService.stateUnfetchedObjects();
566
- const allFetched = this.stateObjects().size === this.dataCount;
567
- return unfetchedState === ERegisterObjectState.SELECTED && !allFetched;
568
- }
569
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
570
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: RegisterBase, ngImport: i0 }); }
571
- }
572
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterBase, decorators: [{
573
- type: Directive
574
- }], ctorParameters: () => [{ type: i0.Injector }, { type: undefined }] });
575
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29yZS9yZWdpc3Rlci1iYXNlL3JlZ2lzdGVyLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sR0FJUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLElBQUksVUFBVSxFQUNwQixHQUFHLEVBRUgsYUFBYSxFQUViLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxvQkFBb0IsRUFPcEIsYUFBYSxFQUNiLFlBQVksR0FHYixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sOERBQThELENBQUM7QUFPdEUsT0FBTyxFQUVMLGNBQWMsR0FDZixNQUFNLDREQUE0RCxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QiwyQkFBMkIsR0FDNUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEdBQ3JCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUcxRCxNQUFNLE9BQWdCLFlBQVk7SUEyR2hDLElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnSEFBZ0g7SUFDaEgsSUFBVyxZQUFZO1FBQ3JCLE1BQU0sT0FBTyxHQUEwQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRTVFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxJQUFXLG9CQUFvQjtRQUM3QixNQUFNLE9BQU8sR0FBMEMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUU1RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsSUFBVyx3QkFBd0I7UUFDakMsTUFBTSxPQUFPLEdBQTBDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFFNUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBWUQsWUFDcUIsUUFBa0IsRUFDckMsV0FBMEI7UUFEUCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBNUp2QyxtQ0FBbUM7UUFDaEIsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEMsaUJBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzQyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLHNDQUFzQztRQUNuQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdELDBDQUEwQztRQUN2QixjQUFTLEdBQUcsTUFBTSxDQUFDLENBQUEsaUJBQW9CLENBQUEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLGdFQUFnRTtRQUM3QyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFBLDJCQUE4QixDQUFBLEVBQUU7WUFDMUUsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7UUFDSCx5RUFBeUU7UUFDdEQsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVsQyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRWhELG1CQUFjLEdBQXdCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDckYsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUMzQyxDQUFDO1FBQ2MsVUFBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ2hDLFdBQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNsQyw0QkFBdUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUk5RCxTQUFJLEdBQVEsRUFBRSxDQUFDO1FBQ2YsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNyQix1REFBdUQ7UUFDaEQsb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBTyxDQUFDO1FBQ3hDLG1EQUFtRDtRQUM1QyxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFjLENBQUM7UUFDcEMsVUFBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUMsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDN0IsbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFDOUIsa0JBQWEsR0FBaUMsSUFBSSxDQUFDO1FBS2hELGdCQUFXLEdBQW9DLEVBQUUsQ0FBQztRQUtwRCxnQkFBVyxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsMkJBQXNCLEdBQUcsSUFBSSxhQUFhLEVBQVcsQ0FBQztRQVM5RDs7V0FFRztRQUNJLGdCQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFZLENBQUM7UUF5RnJDLG9CQUFlLEdBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsY0FBYyxJQUFJLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztRQUV6RSxpQkFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDO1FBTXpELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztRQUNoRSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUzthQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRTtZQUMzQixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxXQUFXLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksR0FBRyxXQUFXLEVBQUUsYUFBYSxDQUFDO1lBRXhDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzNDLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDeEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FDbEQsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUUxRCxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sY0FBYyxDQUFDLEdBQStCO1FBQ3BELE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsWUFBd0M7UUFDL0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzlDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFDO1lBQy9ELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRWxGLE1BQU0sS0FBSyxHQUFHLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBRWxFLE9BQU87Z0JBQ0wsR0FBRyxHQUFHO2dCQUNOLEtBQUs7YUFDTixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxlQUFlO2FBQ2pCLGtCQUFrQixDQUNqQjtZQUNFLE9BQU8sRUFBRTtnQkFDUCxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2FBQ25CO1lBQ0QsYUFBYSxFQUFFO2dCQUNiLEdBQUcsRUFBRSxhQUFhLENBQUMsd0JBQXdCO2FBQzVDO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUN0QjtTQUNGLEVBQ0QsSUFBSSxDQUNMO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxZQUFZLENBQUM7WUFDMUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLFlBQVksRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO1lBRXZELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV2RixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixnREFBZ0Q7UUFDaEQscURBQXFEO1FBQ3JELG9DQUFvQztRQUNwQyxrQ0FBa0M7UUFDbEMsSUFBSTtRQUVKLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGVBQWUsQ0FBQyxhQUFhLEdBQUcsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDO1FBQzdDLElBQUksT0FBb0QsQ0FBQztRQUV6RCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVTLGVBQWUsQ0FBQyxLQUFXLElBQVMsQ0FBQztJQUV4QyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVuQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRVMsWUFBWSxDQUFDLE9BQXdDO1FBQzdELElBQUksQ0FBQyxjQUFjLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRVMsT0FBTyxDQUFDLElBQVMsRUFBRSxLQUFjO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFUyw0QkFBNEIsQ0FBQyxLQUEyQjtRQUNoRSxJQUFJLENBQUMsZUFBZSxFQUFFLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxHQUFlLEVBQUUsT0FBb0M7UUFDcEYsSUFBSSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVTLGVBQWUsQ0FBQyxJQUFVO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNoQixHQUFHLEVBQUUsRUFBRTtnQkFDUCxLQUFLLEVBQUUsQ0FBQzthQUNULENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRVMsZUFBZTtRQUN2QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFFNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVTLFlBQVksQ0FBQyxLQUFrQyxJQUFTLENBQUM7SUFFekQsd0JBQXdCLENBQUMsT0FBZTtRQUNoRCxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVk7YUFDM0IsSUFBSSxDQUNILFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFDdkQsWUFBWSxDQUFDLDhCQUE4QixDQUFDLEVBQzVDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDcEM7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsc0JBQXNCO2FBQ3hCLElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNiLGFBQWEsQ0FBQztZQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPO1lBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDL0IsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0g7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87U0FDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDM0IsRUFDRCxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRS9CLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLEVBQ0Ysa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUNwQzthQUNBLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQztnQkFDckMsQ0FBQztnQkFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBUztRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBMEI7UUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUV2QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVoRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ2hCLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZCLE1BQU07WUFDTixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsWUFBaUQsRUFDakQsS0FBMEI7UUFFMUIsSUFBSSxLQUFLLEtBQUssY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3BDLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ2hCLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSTtTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsWUFBaUQ7UUFDNUUsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFlBQVksR0FDaEIsS0FBSyxLQUFLLG9CQUFvQixDQUFDLFFBQVE7Z0JBQ3JDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVO2dCQUNqQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBRXBDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkUsS0FBSyxNQUFNLGFBQWEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDO0lBQ0gsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEtBQWE7UUFDN0MsSUFBSSxDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5FLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUM3QixLQUFLLEVBQ0wsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsWUFBWSxFQUNqQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3ZDLENBQUM7WUFDRixJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZCLE1BQU07Z0JBQ04sUUFBUSxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQixDQUFDLE9BQVk7UUFDOUMsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMzRixDQUFDO0lBQ0gsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0saUJBQWlCLENBQUMsZUFLeEI7UUFDQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFFOUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGFBQXFCO1FBQzlDLElBQUksQ0FBQyxlQUFlO2FBQ2pCLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQzthQUMzRCxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNyQixJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxJQUFJLFNBQVMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUM7WUFDOUMsUUFBUSxFQUFFO2dCQUNSLEVBQUUsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRTtnQkFDbEMsYUFBYSxFQUFFLGFBQWEsQ0FBQyx3QkFBd0I7Z0JBQ3JELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsUUFBUSxFQUFFLEVBQUUsYUFBYSxFQUFFO2FBQzVCO1lBQ0QsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sb0JBQW9CLENBQUMsRUFBRSxRQUFRLEVBQTBCO1FBQzlELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQy9DLFFBQVEsQ0FBQyxXQUFXLEVBQ3BCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxPQUFPLENBQzVDLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxHQUFHO2dCQUNiLEdBQUcsSUFBSSxDQUFDLGFBQWE7Z0JBQ3JCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUM1QixRQUFRLENBQUMsT0FBTyxFQUNoQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxhQUFhLENBQUMsT0FBTyxDQUM1QztnQkFDRCxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sc0JBQXNCLENBQzVCLE9BQTBCLEVBQzFCLFNBQXdGO1FBRXhGLE1BQU0sZUFBZSxHQUFHLFNBQVM7WUFDL0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVaLE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDO1lBRWhDLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBRUQsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLElBQW9DO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFUywwQkFBMEIsQ0FBQyxpQkFBaUM7UUFDcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3ZDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzFELENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDO1lBQzlDLFFBQVEsRUFBRTtnQkFDUixFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7Z0JBQzdCLGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTztnQkFDcEMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUU7YUFDcEU7WUFDRCxNQUFNLEVBQUUsSUFBSTtZQUNaLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFjLGdCQUFnQjtRQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQy9ELENBQUM7SUFFTyw2QkFBNkI7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQjthQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsWUFBeUQ7UUFDbEYsSUFBSSxDQUFDLGVBQWU7YUFDakIsa0JBQWtCLENBQUM7WUFDbEIsT0FBTyxFQUFFO2dCQUNQLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDbkI7WUFDRCxhQUFhLEVBQUU7Z0JBQ2IsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsc0JBQXNCLENBQUM7YUFDbEU7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXO2FBQ3RCO1NBQ0YsQ0FBQzthQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYixTQUFTLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMxQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUNwQyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUMzRSxDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2pELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFOUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7b0JBQ3pCLEtBQUssRUFBRSxZQUFZLENBQUMsV0FBVztvQkFDL0IsTUFBTSxFQUFFLGFBQWEsQ0FBQyxrQkFBa0I7aUJBQ3pDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7aUJBQU0sSUFBSSxZQUFZLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxQyxDQUFDO2lCQUFNLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxRQUF5QjtRQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQ3pCLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTTtZQUMxQixNQUFNLEVBQUUsYUFBYSxDQUFDLGtCQUFrQjtTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBOEI7UUFDekQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRWxCLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksU0FBUyxLQUFLLGNBQWMsQ0FBQyxHQUFHLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEUsTUFBTSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQU0sSUFBSSxTQUFTLEtBQUssY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7YUFBTSxJQUFJLFNBQVMsS0FBSyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEQsTUFBTSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sMkJBQTJCLENBQUMsU0FBOEI7UUFDaEUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXJDLElBQUksU0FBUyxLQUFLLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN6QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUN2QixTQUFTLEVBQ1QsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLEVBQ2pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDdkMsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBYTtRQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLE1BQU0sYUFBYSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBYyxDQUFDO1FBQzFFLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV2QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBUztRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRVMsY0FBYyxDQUFDLEtBQTZCO1FBQ3BELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRCxFQUFFLEVBQUUsR0FBRztZQUNQLEtBQUs7U0FDTixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFjLGFBQWE7UUFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1FBQzFFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixLQUFLLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztRQUV6RSxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztJQUN4RSxDQUFDO0lBRU8sMkJBQTJCLENBQUMsV0FBMEI7UUFDNUQsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUM7WUFFbEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFjLGFBQWE7UUFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNyRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBYSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFaEUsT0FBTyxjQUFjLEtBQUssb0JBQW9CLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pFLENBQUM7K0dBendCbUIsWUFBWTttR0FBWixZQUFZOzs0RkFBWixZQUFZO2tCQURqQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBmaWx0ZXIgYXMgcnhqc0ZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBSZXBsYXlTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEVSZWdpc3Rlck9iamVjdFN0YXRlLFxuICBJUmVnaXN0ZXJCYXNlLFxuICBJUmVnaXN0ZXJPYmplY3QsXG4gIElUcFVzZXJTZXR0aW5ncyxcbiAgSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXIsXG4gIE9iamVjdHNTdWJzY3JpcHRpb25Db25maWcsXG4gIElVc2VyUHJvZmlsZSxcbiAgRUlucHV0c0FjdGlvbixcbiAgRUlucHV0c1N0YXRlLFxuICBHcWxGaWVsZCxcbiAgR3FsRmllbGRzLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge1xuICBFQ29sdW1uU3RhdHVzLFxuICBJQ29sdW1uU2V0dGluZ3MsXG4gIElDb2x1bW5TZXR0aW5nc0NoYW5nZXMsXG59IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXNldHRpbmdzL3R5cGVzL2NvbHVtbi1zZXR0aW5ncy50eXBlcyc7XG5pbXBvcnQge1xuICBJQ29sdW1uRGF0YSxcbiAgSUhhc3VyYVF1ZXJ5RmlsdGVyLFxuICBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcixcbiAgVGhXaWR0aEVudHJ5LFxufSBmcm9tICcuLi8uLi9jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEFwcGx5U2VsZWN0aW9uVHlwZXMsXG4gIFNlbGVjdGlvblR5cGVzLFxufSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NoZWNrYm94LXNlbGVjdG9yL2NoZWNrYm94LXNlbGVjdG9yLnR5cGVzJztcbmltcG9ydCB7XG4gIEZpbHRlcnNTdGF0ZVNlcnZpY2UsXG4gIEZpbHRlcnNTZXJ2aWNlLFxuICBGaWx0ZXJzVHJhbnNtaXRTZXJ2aWNlLFxuICBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIFNFQVJDSF9JTlBVVF9ERUJPVU5DRV9USU1FX01MUyxcbiAgU0VUVElOR1NfVFlQRSxcbiAgVVNFUl9QUk9GSUxFX0xPQURFUixcbiAgVVNFUl9TRVRUSU5HU19MT0FERVIsXG59IGZyb20gJy4uLy4uL2NvbnN0cy9yZWdpc3Rlci1iYXNlLmNvbnN0cyc7XG5pbXBvcnQgeyBnZXRMYXN0U2VnbWVudE9mUGF0aE5hbWUsIGlzTm9uTnVsbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IEZvcm1Hcm91cFdyYXBwZXIgfSBmcm9tICcuLi9mb3JtLWdyb3VwLXdyYXBwZXInO1xuaW1wb3J0IHsgREVGQVVMVF9MSU1JVCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0cy1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTY2FsYXJVVUlEIH0gZnJvbSAnaGFzdXJhJztcbmltcG9ydCB7IFJlZ2lzdGVyQmFzZVN0b3JlIH0gZnJvbSAnLi9yZWdpc3Rlci1iYXNlLnN0b3JlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVnaXN0ZXJCYXNlPFQgZXh0ZW5kcyBJUmVnaXN0ZXJCYXNlLCBGb3JtID0gYW55PlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKiDQodC10YDQstC40YHRiyDRg9C/0YDQsNCy0LvQtdC90LjRjyDRhNC40LvRjNGC0YDQsNC80LggKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlcnNTZXJ2aWNlID0gaW5qZWN0KEZpbHRlcnNTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0YXRlU2VydmljZSA9IGluamVjdChGaWx0ZXJzU3RhdGVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbWl0dGVyID0gaW5qZWN0KEZpbHRlcnNUcmFuc21pdFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIC8qKiDQodC10YDQstC40YEg0YPQv9GA0LDQstC70LXQvdC40Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C10LwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHVzZXJTZXJ2aWNlID0gaW5qZWN0KFVTRVJfUFJPRklMRV9MT0FERVIpO1xuICAvKiog0KHQtdGA0LLQuNGBINGD0L/RgNCw0LLQu9C10L3QuNGPINC00LDQvdC90YvQvNC4INCyINGA0LXQtdGB0YLRgNC1ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBiYXNlU3RvcmUgPSBpbmplY3QoUmVnaXN0ZXJCYXNlU3RvcmU8VD4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIC8vIFRPRE8g0YPQtNCw0LvQuNGC0Ywgb3B0aW9uYWw6IHRydWUg0L/QvtGB0LvQtSDQstGL0L/QvtC70L3QtdC90LjRjyDQt9Cw0LTQsNGH0LggU01BMi0zMTM0XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZFNlcnZpY2UgPSBpbmplY3QoU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlPFQ+LCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuICAvLyBUT0RPIHByb3RlY3RlZCByZWFkb25seSBuYXZpZ2F0aW9uU2VydmljZSA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KFVTRVJfU0VUVElOR1NfTE9BREVSKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyQXBwbGllZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXRlU2VydmljZS5ncWxWYWx1ZXMkLnBpcGUoXG4gICAgbWFwKChmaWx0ZXIpID0+IE51bWJlcihmaWx0ZXIubGVuZ3RoKSA+IDApXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlJCA9IHRoaXMuc3RhdGVTZXJ2aWNlLnBhZ2UkO1xuICBwdWJsaWMgcmVhZG9ubHkgbGltaXQkID0gdGhpcy5zdGF0ZVNlcnZpY2UubGltaXQkO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWRSZWNvcmRzTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBwdWJsaWMgY29sdW1uc0RhdGE6IElDb2x1bW5EYXRhW107XG4gIHB1YmxpYyBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgcHVibGljIGRhdGE6IFRbXSA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZURhdGE6IFRbXSA9IFtdO1xuICBwdWJsaWMgZGF0YUNvdW50ID0gMDtcbiAgLyoqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc2VsZWN0ZWRPYmplY3RzRnJvbVN0YXRlICovXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSBuZXcgU2V0PGFueT4oKTtcbiAgLyoqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc2VsZWN0ZWRJZHNGcm9tU3RhdGUgKi9cbiAgcHVibGljIHNlbGVjdGVkSWRzID0gbmV3IFNldDxTY2FsYXJVVUlEPigpO1xuICBwdWJsaWMgX3VzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQcm9maWxlKCk7XG4gIHB1YmxpYyBzdGlja3lMZWZ0SWRzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgc3RpY2t5UmlnaHRJZHM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBjdXJyZW50RmlsdGVyOiBJSGFzdXJhUXVlcnlGaWx0ZXI8VD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqINCk0L7RgNC80LAg0YTQuNC70YzRgtGA0L7QslxuICAgKi9cbiAgcHJvdGVjdGVkIGZpbHRlcnNGb3JtITogRm9ybUdyb3VwV3JhcHBlcjxGb3JtPjtcbiAgcHJvdGVjdGVkIGZpbHRlclN0YXRlOiBJVHBVc2VyU2V0dGluZ3NTZXR0aW5nc0ZpbHRlcltdID0gW107XG5cbiAgcHJpdmF0ZSBfbGltaXQhOiBudW1iZXI7XG4gIHByaXZhdGUgX29mZnNldCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUhOiBHcWxGaWVsZHM7XG4gIHByaXZhdGUgX21vZHVsZVBhdGggPSBnZXRMYXN0U2VnbWVudE9mUGF0aE5hbWUodGhpcy5yb3V0ZXIudXJsKTtcbiAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlckFwcGxpZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgLyoqXG4gICAqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LksINCx0LXQtyDRg9GH0LXRgtCwINGE0LjQu9GM0YLRgNCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgdG90YWxOb3RGaWx0ZXJlZCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqXG4gICAqINCc0LDRgNGI0YDRg9GC0Ysg0LTQu9GPINCx0YDQtdC00LrRgNCw0LzQsdCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3Qgcm91dGVzOiBhbnlbXTtcbiAgLyoqXG4gICAqINCa0L7QvdGC0YDQvtC7INGB0YLRgNC+0LrQuCDQv9C+0LjRgdC60LBcbiAgICovXG4gIHB1YmxpYyBzZWFyY2hJbnB1dCA9IHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2VhcmNoSW5wdXQhO1xuICAvKipcbiAgICog0JTQtdC50YHRgtCy0LjQtSDQt9Cw0LLQtdGA0YjQtdC90L5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBhY3Rpb25Db21wbGV0ZWQkOiBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+O1xuICAvKipcbiAgICog0J/QvtC70YPRh9C10L3QuNC1INC+0LHRidC10LPQviDQutC+0LvQuNGH0LXRgdGC0LLQsCDQt9Cw0L/QuNGB0LXQuVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGZldGNoVG90YWxPYmplY3RzOiAoXG4gICAgb2JzZXJ2YWJsZU9yVmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICkgPT4gU3Vic2NyaXB0aW9uO1xuICAvKipcbiAgICog0JfQsNC/0YDQvtGBINC90LAg0LrQvtC70LjRh9C10YHRgtCy0L4g0L7RgtGE0LjQu9GM0YLRgNC+0LLQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqL1xuICBwdWJsaWMgZmV0Y2hUb3RhbEZpbHRlcmVkT2JqZWN0czpcbiAgICB8ICgob2JzZXJ2YWJsZU9yVmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIGFueT4+KSA9PiBTdWJzY3JpcHRpb24pXG4gICAgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiDQn9C+0LTQv9C40YHQutCwINC90LAg0L/QvtC70YPRh9C10L3QuNC1INCy0YHQtdGFINC+0LHRitC10LrRgtC+0LIg0Lgg0YEg0L7QsdGA0LDRgtC90YvQvCDQstGL0LfQvtCy0L7QvFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IG9iamVjdHNTdWJzY3JpcHRpb246IChcbiAgICBvYnNlcnZhYmxlT3JWYWx1ZTogT2JqZWN0c1N1YnNjcmlwdGlvbkNvbmZpZzxUPiB8IE9ic2VydmFibGU8T2JqZWN0c1N1YnNjcmlwdGlvbkNvbmZpZzxUPj5cbiAgKSA9PiBTdWJzY3JpcHRpb247XG4gIC8qKlxuICAgKiDQkdCw0LfQvtCy0YvQuSDRhNC40LvRjNGC0YAsINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYmFzZUZpbHRlcjogKHVzZXI6IElVc2VyUHJvZmlsZSB8IHVuZGVmaW5lZCkgPT4gUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAvKipcbiAgICog0KHQsdC+0YDQutCwINGE0LjQu9GM0YLRgNCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYnVpbGRGaWx0ZXIoXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgb2Zmc2V0PzogbnVtYmVyLFxuICAgIGdxbEZpbHRlcj86IEdxbEZpZWxkcyxcbiAgICBzb3J0ZXI/OiBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxUPltdXG4gICk6IGFueTtcblxuICAvKipcbiAgICog0KHQsdC+0YDQutCwINGE0LjQu9GM0YLRgNC+0LIg0YDQtdC10YHRgtGA0LBcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgYnVpbGRGb3JtKCk6IEZvcm1Hcm91cFdyYXBwZXI8Rm9ybT47XG5cbiAgcHVibGljIGdldCBsaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29mZnNldDtcbiAgfVxuXG4gIC8qKiBVdWlkJ9GLINCy0YHQtdGFINCy0YvQsdGA0LDQvdC90YvRhSDQuNC70Lgg0LjRgdC60LvRjtGH0LDQtdC80YvRhSDQvtCx0YrQtdC60YLQvtCyINGA0LXQtdGB0YLRgNCwICjQt9Cw0LLQuNGB0LjRgiDQvtGCINGB0L7RgdGC0L7Rj9C90LjRjyDQtdGJ0LUg0L3QtSDQt9Cw0LPRgNGD0LbQtdC90L3Ri9GFINC+0LHRitC10LrRgtC+0LIpICovXG4gIHB1YmxpYyBnZXQgaWRzRnJvbVN0YXRlKCk6IFNldDxTY2FsYXJVVUlEPiB7XG4gICAgY29uc3Qgc2VydmljZTogU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlPFQ+IHwgbnVsbCA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlO1xuXG4gICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbGVjdGVkT2JqZWN0c1N0YXRlU2VydmljZSDQvdC1INC30LDQv9GA0L7QstCw0LnQttC10L0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmljZS5rZXlzKCk7XG4gIH1cblxuICAvKiog0JLRgdC1INCy0YvQsdGA0LDQvdC90YvQtSB1dWlkJ9GLINGA0LXQtdGB0YLRgNCwICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJZHNGcm9tU3RhdGUoKTogU2V0PFNjYWxhclVVSUQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlOiBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2U8VD4gfCBudWxsID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U7XG5cbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlINC90LUg0LfQsNC/0YDQvtCy0LDQudC20LXQvScpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdGVkS2V5cygpO1xuICB9XG5cbiAgLyoqINCS0YHQtSDQstGL0LHRgNCw0L3QvdGL0LUg0L7QsdGK0LXQutGC0Ysg0YDQtdC10YHRgtGA0LAgKi9cbiAgcHVibGljIGdldCBzZWxlY3RlZE9iamVjdHNGcm9tU3RhdGUoKTogU2V0PFQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlOiBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2U8VD4gfCBudWxsID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U7XG5cbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlINC90LUg0LfQsNC/0YDQvtCy0LDQudC20LXQvScpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdGVkVmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5zU2V0dGluZ3M6IElUcFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcGFnZVJvd3NMaW1pdFNldHRpbmc6IElUcFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0Q29sdW1uc1dpZHRoczogTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3Rpb25UeXBlJCA9XG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNlbGVjdGlvblR5cGUkID8/IG5ldyBCZWhhdmlvclN1YmplY3Q8QXBwbHlTZWxlY3Rpb25UeXBlcz4obnVsbCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlT2JqZWN0cyA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5zdGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcbiAgICBjb2x1bW5zRGF0YTogSUNvbHVtbkRhdGFbXVxuICApIHtcbiAgICB0aGlzLmNvbHVtbnNEYXRhID0gY29sdW1uc0RhdGE7XG4gICAgdGhpcy5fZGVmYXVsdENvbHVtbnNXaWR0aHMgPSBuZXcgTWFwKGNvbHVtbnNEYXRhLm1hcCgoY29sKSA9PiBbY29sLm5hbWUsIGNvbC53aWR0aF0pKTtcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl9nZXREZWZhdWx0Q29sdW1uc1JlY3Vyc2l2ZShjb2x1bW5zRGF0YSk7XG4gICAgdGhpcy5fc3Vic2NyaWJlT25TZXR0aW5ncygpO1xuICAgIHRoaXMuX2ZldGNoU2F2ZWRQYWdlUm93c0xpbWl0KCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpPy5leHRyYXM/LnN0YXRlO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJTdGF0ZSA9IHRoaXMucGFyc2VUb0ZpbHRlcnMoc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3N1YnNjcmliZU9uU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MkXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt1c2VyU2V0dGluZ10pID0+IHtcbiAgICAgICAgY29uc3QgeyB0YWJsZUNvbHVtbnNXaWR0aCB9ID0gdXNlclNldHRpbmc/LnNldHRpbmdzID8/IHt9O1xuICAgICAgICBjb25zdCB0eXBlID0gdXNlclNldHRpbmc/LnNldHRpbmdzX3R5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgJiYgdHlwZSAhPT0gU0VUVElOR1NfVFlQRS5DT0xVTU5TKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW5lZEN1cnJlbnQgPSB0aGlzLl9vbWl0VW5kZWZpbmVkKFxuICAgICAgICAgIHRoaXMuX2NvbHVtbnNTZXR0aW5ncz8uc2V0dGluZ3MudGFibGVDb2x1bW5zV2lkdGhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY2xlYW5lZE5ldyA9IHRoaXMuX29taXRVbmRlZmluZWQodGFibGVDb2x1bW5zV2lkdGgpO1xuXG4gICAgICAgIGlmICghXy5pc0VxdWFsKGNsZWFuZWRDdXJyZW50LCBjbGVhbmVkTmV3KSkge1xuICAgICAgICAgIHRoaXMuX3NldENvbHVtbnNXaWR0aCh0YWJsZUNvbHVtbnNXaWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb2x1bW5zU2V0dGluZ3MgPSB1c2VyU2V0dGluZztcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb21pdFVuZGVmaW5lZChhcnI6IFRoV2lkdGhFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIF8ubWFwKGFyciA/PyBbXSwgKG9iaikgPT4gXy5vbWl0Qnkob2JqLCBfLmlzVW5kZWZpbmVkKSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDb2x1bW5zV2lkdGgoY29sdW1uc1dpZHRoOiBUaFdpZHRoRW50cnlbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHRoc1dpZHRoTWFwID0gbmV3IE1hcChjb2x1bW5zV2lkdGg/Lm1hcCgoeyBuYW1lLCB3aWR0aCB9KSA9PiBbbmFtZSwgd2lkdGhdKSk7XG5cbiAgICB0aGlzLmNvbHVtbnNEYXRhID0gdGhpcy5jb2x1bW5zRGF0YS5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gdGhpcy5fZGVmYXVsdENvbHVtbnNXaWR0aHMuZ2V0KGNvbC5uYW1lKSE7XG4gICAgICBjb25zdCBjdXJyZW50V2lkdGggPSB0aHNXaWR0aE1hcC5oYXMoY29sLm5hbWUpID8gdGhzV2lkdGhNYXAuZ2V0KGNvbC5uYW1lKSA6IG51bGw7XG5cbiAgICAgIGNvbnN0IHdpZHRoID0gY3VycmVudFdpZHRoID09PSBudWxsID8gZGVmYXVsdFdpZHRoIDogY3VycmVudFdpZHRoO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2wsXG4gICAgICAgIHdpZHRoLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoU2F2ZWRQYWdlUm93c0xpbWl0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3NTZXJ2aWNlXG4gICAgICAuZmV0Y2hVc2VyU2V0dGluZ3MkKFxuICAgICAgICB7XG4gICAgICAgICAgaWRfdXNlcjoge1xuICAgICAgICAgICAgX2VxOiB0aGlzLl91c2VyLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0dGluZ3NfdHlwZToge1xuICAgICAgICAgICAgX2VxOiBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BBR0VfUk9XU19MSU1JVCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vZHVsZV9uYW1lOiB7XG4gICAgICAgICAgICBfZXE6IHRoaXMuX21vZHVsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW2ZpcnN0U2V0dGluZ10pID0+IHtcbiAgICAgICAgdGhpcy5fcGFnZVJvd3NMaW1pdFNldHRpbmcgPSBmaXJzdFNldHRpbmc7XG4gICAgICAgIGNvbnN0IHsgcGFnZVJvd3NMaW1pdCB9ID0gZmlyc3RTZXR0aW5nPy5zZXR0aW5ncyA/PyB7fTtcblxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRMaW1pdChwYWdlUm93c0xpbWl0ID8/IERFRkFVTFRfTElNSVQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IHRoaXMuYnVpbGRGb3JtO1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2UuaW5pdCh0aGlzLmZpbHRlcnNGb3JtKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRTdGF0ZSh7IHN0YXRlOiBFSW5wdXRzU3RhdGUuSElEREVOLCBhY3Rpb246IEVJbnB1dHNBY3Rpb24uT1BFTiB9KTtcblxuICAgIHRoaXMuZmV0Y2hUb3RhbE9iamVjdHModGhpcy5iYXNlRmlsdGVyKHRoaXMuX3VzZXIpKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVPbk11dGF0aW9uQ29tcGxldGVkKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVPblBhZ2luZygpO1xuXG4gICAgLy8gVE9ETyDQv9GA0L7QstC10YDQuNGC0Ywg0L3Rg9C20L3QsCDQu9C4INCf0LXRgNC10LfQsNCz0YDRg9C30LrQsCDRgdGC0YDQsNC90LjRhtGLXG4gICAgLy8gaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucHJldmlvdXNVcmwgPT09IG51bGwpIHtcbiAgICAvLyAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE9mZnNldCgwKTtcbiAgICAvLyAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldFBhZ2UoMSk7XG4gICAgLy8gfVxuXG4gICAgdGhpcy5iYXNlU3RvcmU/LmNvdW50JD8uc3Vic2NyaWJlKChjb3VudCkgPT4ge1xuICAgICAgdGhpcy5kYXRhQ291bnQgPSBjb3VudDtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldENvdW50KGNvdW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoc2VhcmNoTGltaXRlciA9IDIpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVPblNlYXJjaENoYW5nZXMoc2VhcmNoTGltaXRlcik7XG4gIH1cblxuICBwcml2YXRlIF9zZXRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5RmlsdGVycyA9IHRoaXMudHJhbnNtaXR0ZXI/LmZpbHRlcnM7XG4gICAgY29uc3QgcXVlcnlTZWFyY2ggPSB0aGlzLnRyYW5zbWl0dGVyPy5zZWFyY2g7XG4gICAgbGV0IGZpbHRlcnM6IElUcFVzZXJTZXR0aW5nc1NldHRpbmdzRmlsdGVyW10gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocXVlcnlTZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuc2V0VmFsdWUocXVlcnlTZWFyY2gpO1xuICAgIH1cblxuICAgIGlmICghcXVlcnlGaWx0ZXJzIHx8IHF1ZXJ5RmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWx0ZXJzID0gcXVlcnlGaWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbHlCYXNlRmlsdGVyKCk7XG4gICAgdGhpcy5faW5pdERlZmF1bHRGaWx0ZXIoZmlsdGVycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlCYXNlRmlsdGVyKF9kYXRhPzogYW55KTogdm9pZCB7fVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNvbXBsZXRlZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5maWx0ZXJzU2VydmljZS5jbGVhcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE9mZnNldCgwKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRHcWxWYWx1ZXMoe30pO1xuXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQ/LnZhbHVlKSB7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRTZWFyY2hGaWx0ZXJWYWx1ZSgnJyk7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRHcWxWYWx1ZXModGhpcy5maWx0ZXJzU2VydmljZS5ncWxGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBseUZpbHRlcnMoZmlsdGVyczogSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXJbXSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2V0VXNlclNldHRpbmdzRmlsdGVyVmFsdWVzKGZpbHRlcnMpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEdxbFZhbHVlcyh0aGlzLmZpbHRlcnNTZXJ2aWNlLmdxbEZpbHRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0RGF0YShkYXRhOiBUW10sIGNvdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgIGlmIChjb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRhdGFDb3VudCA9IGNvdW50O1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0Q291bnQoY291bnQpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGU6IEVSZWdpc3Rlck9iamVjdFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNldEFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5OiBTY2FsYXJVVUlELCB1cGRhdGVzOiBQYXJ0aWFsPElSZWdpc3Rlck9iamVjdDxUPj4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2V0U3RhdGVPYmplY3RCeUtleShrZXksIHVwZGF0ZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyU2VsZWN0aW9ucyhkYXRhPzogVFtdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzLmNsZWFyKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5yZXNldFN0YXRlKGRhdGEpO1xuICAgICAgdGhpcy5idWlsZEFjdGlvbnMoe1xuICAgICAgICByb3c6IFtdLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25Db21wbGV0ZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5idWlsZEZpbHRlcih0aGlzLmxpbWl0LCB0aGlzLm9mZnNldCwgdGhpcy5fZmlsdGVyU3RhdGUpO1xuICAgIHRoaXMuY3VycmVudEZpbHRlciA9IGZpbHRlcjtcblxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7XG4gICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHsgZmlsdGVyIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkQWN0aW9ucyhfZGF0YTogeyByb3c6IFRbXTsgY291bnQ6IG51bWJlciB9KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblNlYXJjaENoYW5nZXMobGltaXRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hJbnB1dD8udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgcnhqc0ZpbHRlcigodmFsdWUpID0+ICF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPiBsaW1pdGVyKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKFNFQVJDSF9JTlBVVF9ERUJPVU5DRV9USU1FX01MUyksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0R3FsVmFsdWVzKHRoaXMuZmlsdGVyc1NlcnZpY2UuZ3FsRmlsdGVyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlZ2lzdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExpbWl0KHRoaXMuc3RhdGVTZXJ2aWNlLmxpbWl0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJzY3JpYmVPblBhZ2luZygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWZhdWx0RmlsdGVyQXBwbGllZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmxpbWl0JC5waXBlKHJ4anNGaWx0ZXIoaXNOb25OdWxsKSksXG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5vZmZzZXQkLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuZ3FsVmFsdWVzJC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGRhdGEubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hhbmdlZChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc29ydGVyJCxcbiAgICAgICAgICBdKS5waXBlKGRlYm91bmNlVGltZSgyNTApKVxuICAgICAgICApLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigncGFnaW5hdGlvbicsIGUpO1xuXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGUpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbbGltaXQsIG9mZnNldCwgZ3FsRmlsdGVyLCBzb3J0ZXJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIobGltaXQsIG9mZnNldCwgZ3FsRmlsdGVyLCBzb3J0ZXIpO1xuICAgICAgICBjb25zdCBncWxGaWx0ZXJVcGRhdGVkID0gIV8uaXNFcXVhbCh0aGlzLl9maWx0ZXJTdGF0ZSwgZ3FsRmlsdGVyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZSA9IGdxbEZpbHRlcjtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZU9iamVjdHMpIHtcbiAgICAgICAgICBpZiAoZ3FsRmlsdGVyVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnJlc2V0U3RhdGUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNTdWJzY3JpcHRpb24oeyBmaWx0ZXIsIGNhbGxiYWNrOiB0aGlzLl9zZXRTdGF0ZU9iamVjdHMuYmluZCh0aGlzKSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9iamVjdHNTdWJzY3JpcHRpb24oeyBmaWx0ZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaFRvdGFsRmlsdGVyZWRPYmplY3RzPy4oZmlsdGVyLndoZXJlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U3RhdGVPYmplY3RzKGRhdGE6IFRbXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5sb2FkU3RhdGVPYmplY3RzKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdENoYW5nZWQodmFsdWU6IEFwcGx5U2VsZWN0aW9uVHlwZXMpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25UeXBlJC5uZXh0KHZhbHVlKTtcblxuICAgIGNvbnN0IHN0YXRlT2JqZWN0cyA9IHRoaXMuc3RhdGVPYmplY3RzO1xuXG4gICAgaWYgKHN0YXRlT2JqZWN0cykge1xuICAgICAgdGhpcy5fY2hhbmdlU3RhdGVPYmplY3RzKHN0YXRlT2JqZWN0cygpLCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9zZWxlY3RDaGFuZ2VkRmlsdGVyKHZhbHVlKTtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIgPSBmaWx0ZXI7XG5cbiAgICB0aGlzLmJ1aWxkQWN0aW9ucyh7XG4gICAgICByb3c6IFsuLi4odGhpcy5zZWxlY3RlZE9iamVjdHMgPz8gW10pXSxcbiAgICAgIGNvdW50OiB0aGlzLnNlbGVjdGVkT2JqZWN0cyA/IHRoaXMuc2VsZWN0ZWRPYmplY3RzLnNpemUgOiAwLFxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWx0ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHtcbiAgICAgIGZpbHRlcixcbiAgICAgIGNhbGxiYWNrOiB0aGlzLl9zZXRTZWxlY3RlZC5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlU3RhdGVPYmplY3RzKFxuICAgIHN0YXRlT2JqZWN0czogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdDxUPj4sXG4gICAgdmFsdWU6IEFwcGx5U2VsZWN0aW9uVHlwZXNcbiAgKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBTZWxlY3Rpb25UeXBlcy5BTEwpIHtcbiAgICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gU2VsZWN0aW9uVHlwZXMuSU5WRVJTRSkge1xuICAgICAgdGhpcy5faW52ZXJzZVN0YXRlT2JqZWN0cyhzdGF0ZU9iamVjdHMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFNlbGVjdGlvblR5cGVzLlZJU0lCTEUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFZpc2libGVTdGF0ZU9iamVjdHMoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuX3NlbGVjdEZpcnN0TlN0YXRlT2JqZWN0cyh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZEFjdGlvbnMoe1xuICAgICAgcm93OiBbLi4udGhpcy5zZWxlY3RlZE9iamVjdHNGcm9tU3RhdGVdLFxuICAgICAgY291bnQ6IHRoaXMuc2VsZWN0ZWRPYmplY3RzRnJvbVN0YXRlLnNpemUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbnZlcnNlU3RhdGVPYmplY3RzKHN0YXRlT2JqZWN0czogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdDxUPj4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHsgc3RhdGUgfV0gb2Ygc3RhdGVPYmplY3RzKSB7XG4gICAgICBjb25zdCBpbnZlcnNlU3RhdGUgPVxuICAgICAgICBzdGF0ZSA9PT0gRVJlZ2lzdGVyT2JqZWN0U3RhdGUuU0VMRUNURURcbiAgICAgICAgICA/IEVSZWdpc3Rlck9iamVjdFN0YXRlLlVOU0VMRUNURURcbiAgICAgICAgICA6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5LCB7IHN0YXRlOiBpbnZlcnNlU3RhdGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0VmlzaWJsZVN0YXRlT2JqZWN0cygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoRVJlZ2lzdGVyT2JqZWN0U3RhdGUuVU5TRUxFQ1RFRCk7XG4gICAgZm9yIChjb25zdCB2aXNpYmxlT2JqZWN0IG9mIHRoaXMudmlzaWJsZURhdGEpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVPYmplY3RCeUtleSh2aXNpYmxlT2JqZWN0LmlkLCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RGaXJzdE5TdGF0ZU9iamVjdHModmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5VTlNFTEVDVEVEKTtcblxuICAgIGlmICh2YWx1ZSA+IHRoaXMubGltaXQpIHtcbiAgICAgIGNvbnN0IHsgc29ydGVyIH0gPSB0aGlzLnN0YXRlU2VydmljZTtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLm9mZnNldCxcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUsXG4gICAgICAgIHNvcnRlci5sZW5ndGggPiAwID8gc29ydGVyIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHtcbiAgICAgICAgZmlsdGVyLFxuICAgICAgICBjYWxsYmFjazogdGhpcy5fc2VsZWN0Rmlyc3ROTG9hZGluZ09iamVjdHMuYmluZCh0aGlzKSxcbiAgICAgICAgbm9TZXQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlyc3ROT2JqZWN0cyA9IHRoaXMuZGF0YS5zbGljZSgwLCB2YWx1ZSk7XG4gICAgICB0aGlzLl9zZWxlY3RGaXJzdE5Mb2FkaW5nT2JqZWN0cyhmaXJzdE5PYmplY3RzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RGaXJzdE5Mb2FkaW5nT2JqZWN0cyhvYmplY3RzOiBUW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBvYmplY3RzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkob2JqZWN0LmlkLCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCwgb2JqZWN0IH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJUb2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UudG9nZ2xlKCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdpbmF0b3JDaGFuZ2UocGFnaW5hdG9yQ2hhbmdlOiB7XG4gICAgZmlyc3Q6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcGFnZXNDb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICByb3dzOiBudW1iZXI7XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCB7IHJvd3MsIGZpcnN0LCBwYWdlIH0gPSBwYWdpbmF0b3JDaGFuZ2U7XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNlcnZpY2UubGltaXQgIT09IHJvd3MpIHtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExpbWl0KHJvd3MpO1xuICAgICAgdGhpcy5fc2F2ZVBhZ2VSb3dzTGltaXQocm93cyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGVTZXJ2aWNlLm9mZnNldCAhPT0gZmlyc3QgLSAxKSB7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRPZmZzZXQoZmlyc3QgLSAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNlcnZpY2UucGFnZSAhPT0gcGFnZSkge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0UGFnZShwYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUGFnZVJvd3NMaW1pdChwYWdlUm93c0xpbWl0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzU2VydmljZVxuICAgICAgLnVwc2VydFJldHVybmluZ09uZSQoU0VUVElOR1NfVFlQRS5SRUdJU1RFUl9QQUdFX1JPV1NfTElNSVQpXG4gICAgICAuc3Vic2NyaWJlKChzZXR0aW5nKSA9PiB7XG4gICAgICAgIHRoaXMuX3BhZ2VSb3dzTGltaXRTZXR0aW5nID0gc2V0dGluZyB8fCB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB0aGlzLnNldHRpbmdzU2VydmljZS51cHNlcnRVc2VyU2V0dGluZ3NCeVVzZXJJZCh7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBpZDogdGhpcy5fcGFnZVJvd3NMaW1pdFNldHRpbmc/LmlkLFxuICAgICAgICBzZXR0aW5nc190eXBlOiBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BBR0VfUk9XU19MSU1JVCxcbiAgICAgICAgbW9kdWxlX25hbWU6IHRoaXMuX21vZHVsZVBhdGgsXG4gICAgICAgIHNldHRpbmdzOiB7IHBhZ2VSb3dzTGltaXQgfSxcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uU2V0dGluZ3MoeyBzZXR0aW5ncyB9OiBJQ29sdW1uU2V0dGluZ3NDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICB0aGlzLnN0aWNreUxlZnRJZHMgPSB0aGlzLl9nZXRDb2x1bW5JZHNSZWN1cnNpdmUoc2V0dGluZ3Muc3RpY2t5TGVmdCk7XG4gICAgICB0aGlzLnN0aWNreVJpZ2h0SWRzID0gdGhpcy5fZ2V0Q29sdW1uSWRzUmVjdXJzaXZlKFxuICAgICAgICBzZXR0aW5ncy5zdGlja3lSaWdodCxcbiAgICAgICAgKGVsKSA9PiBlbC5zdGF0dXMgPT09IEVDb2x1bW5TdGF0dXMuREVGQVVMVFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29sdW1ucyA9IFtcbiAgICAgICAgLi4udGhpcy5zdGlja3lMZWZ0SWRzLFxuICAgICAgICAuLi50aGlzLl9nZXRDb2x1bW5JZHNSZWN1cnNpdmUoXG4gICAgICAgICAgc2V0dGluZ3MuY29sdW1ucyxcbiAgICAgICAgICAoZWwpID0+IGVsLnN0YXR1cyA9PT0gRUNvbHVtblN0YXR1cy5ERUZBVUxUXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMuc3RpY2t5UmlnaHRJZHMsXG4gICAgICBdO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29sdW1uSWRzUmVjdXJzaXZlKFxuICAgIGNvbHVtbnM6IElDb2x1bW5TZXR0aW5nc1tdLFxuICAgIHByZWRpY2F0ZT86ICh2YWx1ZTogSUNvbHVtblNldHRpbmdzLCBpbmRleDogbnVtYmVyLCBhcnJheTogSUNvbHVtblNldHRpbmdzW10pID0+IHVua25vd25cbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IHByZWRpY2F0ZVxuICAgICAgPyBjb2x1bW5zLmZpbHRlcigoY29sLCBpbmRleCwgYXJyYXkpID0+IHByZWRpY2F0ZShjb2wsIGluZGV4LCBhcnJheSkpXG4gICAgICA6IGNvbHVtbnM7XG5cbiAgICByZXR1cm4gZmlsdGVyZWRDb2x1bW5zLmZsYXRNYXAoKGNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgeyBpZCwgY2hpbGRyZW4gfSA9IGNvbHVtbjtcblxuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBbaWQsIC4uLnRoaXMuX2dldENvbHVtbklkc1JlY3Vyc2l2ZShjaGlsZHJlbiwgcHJlZGljYXRlKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaWRdO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogUmVnaXN0ZXJUYWJsZUNlbGxTb3J0ZXI8YW55PltdKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U29ydGVyKHNvcnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVUaHNXaWR0aFRvVXNlclNldHRpbmdzKHRhYmxlQ29sdW1uc1dpZHRoOiBUaFdpZHRoRW50cnlbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5fY29sdW1uc1NldHRpbmdzO1xuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgc2V0dGluZ3Muc2V0dGluZ3MudGFibGVDb2x1bW5zV2lkdGggPSB0YWJsZUNvbHVtbnNXaWR0aDtcbiAgICB9XG5cbiAgICB0aGlzLnNldHRpbmdzU2VydmljZS51cHNlcnRVc2VyU2V0dGluZ3NCeVVzZXJJZCh7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBpZDogdGhpcy5fY29sdW1uc1NldHRpbmdzPy5pZCxcbiAgICAgICAgc2V0dGluZ3NfdHlwZTogU0VUVElOR1NfVFlQRS5DT0xVTU5TLFxuICAgICAgICBtb2R1bGVfbmFtZTogdGhpcy5fbW9kdWxlUGF0aCxcbiAgICAgICAgc2V0dGluZ3M6IHsgLi4udGhpcy5fY29sdW1uc1NldHRpbmdzPy5zZXR0aW5ncywgdGFibGVDb2x1bW5zV2lkdGggfSxcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICB1cGRhdGVTZXR0aW5nczogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZmlsdGVyc0FyZU9wZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUuc3RhdGUgIT09IEVJbnB1dHNTdGF0ZS5ISURERU47XG4gIH1cblxuICBwcml2YXRlIF9zdWJzY3JpYmVPbk11dGF0aW9uQ29tcGxldGVkKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ29tcGxldGVkJFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuYWN0aW9uQ29tcGxldGVkKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdERlZmF1bHRGaWx0ZXIocXVlcnlGaWx0ZXJzOiBJVHBVc2VyU2V0dGluZ3NTZXR0aW5nc0ZpbHRlcltdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5nc1NlcnZpY2VcbiAgICAgIC5mZXRjaFVzZXJTZXR0aW5ncyQoe1xuICAgICAgICBpZF91c2VyOiB7XG4gICAgICAgICAgX2VxOiB0aGlzLl91c2VyLmlkLFxuICAgICAgICB9LFxuICAgICAgICBzZXR0aW5nc190eXBlOiB7XG4gICAgICAgICAgX2luOiBbU0VUVElOR1NfVFlQRS5GSUxURVIsIFNFVFRJTkdTX1RZUEUuUkVHSVNURVJfUElOTkVEX0lOUFVUU10sXG4gICAgICAgIH0sXG4gICAgICAgIG1vZHVsZV9uYW1lOiB7XG4gICAgICAgICAgX2VxOiB0aGlzLl9tb2R1bGVQYXRoLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh1c2VyU2V0dGluZ3MpID0+IHtcbiAgICAgICAgY29uc3QgcGlubmVkRmlsdGVyID0gdXNlclNldHRpbmdzLmZpbmQoXG4gICAgICAgICAgKHsgc2V0dGluZ3NfdHlwZTogdHlwZSB9KSA9PiB0eXBlID09PSBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BJTk5FRF9JTlBVVFNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNQaW5uZWQgPSAhIXBpbm5lZEZpbHRlcj8uc2V0dGluZ3MucGlubmVkO1xuICAgICAgICBjb25zdCBmYXZvcml0ZUZpbHRlciA9IHVzZXJTZXR0aW5ncy5maW5kKCh7IHNldHRpbmdzIH0pID0+IHNldHRpbmdzLmZhdm9yaXRlKTtcblxuICAgICAgICBpZiAoaXNQaW5uZWQpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRQaW4odHJ1ZSk7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3RhdGU6IEVJbnB1dHNTdGF0ZS5GSUxURVJfTElTVCxcbiAgICAgICAgICAgIGFjdGlvbjogRUlucHV0c0FjdGlvbi5BUFBMWV9TQVZFRF9GSUxURVIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocXVlcnlGaWx0ZXJzIHx8IHRoaXMuc2VhcmNoSW5wdXQ/LmdldFJhd1ZhbHVlKCkpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVycyhxdWVyeUZpbHRlcnMgPz8gW10pO1xuICAgICAgICB9IGVsc2UgaWYgKHBpbm5lZEZpbHRlciAmJiBpc1Bpbm5lZCkge1xuICAgICAgICAgIHRoaXMuX2FwcGx5RmlsdGVyU2V0dGluZ3MocGlubmVkRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChmYXZvcml0ZUZpbHRlcikge1xuICAgICAgICAgIHRoaXMuX2FwcGx5RmlsdGVyU2V0dGluZ3MoZmF2b3JpdGVGaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGVmYXVsdEZpbHRlckFwcGxpZWQkLm5leHQodHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5RmlsdGVyU2V0dGluZ3Moc2V0dGluZ3M6IElUcFVzZXJTZXR0aW5ncyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2V0VXNlclNldHRpbmdzRmlsdGVyVmFsdWVzKHNldHRpbmdzLnNldHRpbmdzLmZpbHRlciA/PyBbXSk7XG4gICAgY29uc3QgeyBncWxGaWx0ZXIgfSA9IHRoaXMuZmlsdGVyc1NlcnZpY2U7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0R3FsVmFsdWVzKGdxbEZpbHRlcik7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U3RhdGUoe1xuICAgICAgc3RhdGU6IEVJbnB1dHNTdGF0ZS5ISURERU4sXG4gICAgICBhY3Rpb246IEVJbnB1dHNBY3Rpb24uQVBQTFlfU0FWRURfRklMVEVSLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Q2hhbmdlZEZpbHRlcihzZWxlY3Rpb246IEFwcGx5U2VsZWN0aW9uVHlwZXMpOiBhbnkge1xuICAgIGxldCBmaWx0ZXIgPSBudWxsO1xuXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uID09PSBTZWxlY3Rpb25UeXBlcy5BTEwgfHwgdHlwZW9mIHNlbGVjdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGZpbHRlciA9IHRoaXMuX2hhbmRsZUFsbE9yTnVtYmVyU2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb24gPT09IFNlbGVjdGlvblR5cGVzLlZJU0lCTEUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFZpc2libGVJdGVtcygpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uID09PSBTZWxlY3Rpb25UeXBlcy5JTlZFUlNFKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLl9oYW5kbGVJbnZlcnNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUFsbE9yTnVtYmVyU2VsZWN0aW9uKHNlbGVjdGlvbjogQXBwbHlTZWxlY3Rpb25UeXBlcyk6IGFueSB7XG4gICAgbGV0IGZpbHRlciA9IG51bGw7XG4gICAgY29uc3QgeyBzb3J0ZXIgfSA9IHRoaXMuc3RhdGVTZXJ2aWNlO1xuXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gU2VsZWN0aW9uVHlwZXMuQUxMKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmJ1aWxkRmlsdGVyKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLl9maWx0ZXJTdGF0ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHNlbGVjdGlvbiA+IHRoaXMubGltaXQpIHtcbiAgICAgICAgZmlsdGVyID0gdGhpcy5idWlsZEZpbHRlcihcbiAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZSxcbiAgICAgICAgICBzb3J0ZXIubGVuZ3RoID4gMCA/IHNvcnRlciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Rmlyc3ROSXRlbXMoc2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Rmlyc3ROSXRlbXMoY291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gbmV3IFNldCh0aGlzLmRhdGEuc2xpY2UoMCwgY291bnQpKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLmRhdGEubWFwKChkKSA9PiBkLmlkKS5zbGljZSgwLCBjb3VudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0VmlzaWJsZUl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gbmV3IFNldCh0aGlzLnZpc2libGVEYXRhKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLnZpc2libGVEYXRhLm1hcCgoZCkgPT4gZC5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSW52ZXJzZVNlbGVjdGlvbigpOiBhbnkge1xuICAgIGNvbnN0IGludmVyc2VGaWx0ZXIgPSB7IGlkOiB7IF9uaW46IFsuLi50aGlzLnNlbGVjdGVkSWRzXSB9IH0gYXMgR3FsRmllbGQ7XG4gICAgY29uc3QgdXBkYXRlZEZpbHRlclN0YXRlID0gQXJyYXkuaXNBcnJheSh0aGlzLl9maWx0ZXJTdGF0ZSlcbiAgICAgID8gWy4uLnRoaXMuX2ZpbHRlclN0YXRlLCBpbnZlcnNlRmlsdGVyXVxuICAgICAgOiBbdGhpcy5fZmlsdGVyU3RhdGUsIGludmVyc2VGaWx0ZXJdO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVwZGF0ZWRGaWx0ZXJTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRTZWxlY3RlZChkYXRhOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cyA9IG5ldyBTZXQoZGF0YSk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IG5ldyBTZXQoZGF0YS5tYXAoKGQpID0+IGQuaWQpKTtcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlVG9GaWx0ZXJzKGlucHV0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGlucHV0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIGlkOiBrZXksXG4gICAgICB2YWx1ZSxcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBzZWxlY3RlZFNpemUgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyBudWxsO1xuICAgIGNvbnN0IHVuc2VsZWN0ZWRTaXplID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnVuc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyAwO1xuICAgIGNvbnN0IHVuZmV0Y2hlZE9iamVjdHMgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc3RhdGVVbmZldGNoZWRPYmplY3RzKCk7XG4gICAgY29uc3QgaXNOb3RTZWxlY3RlZCA9IHVuZmV0Y2hlZE9iamVjdHMgIT09IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgaWYgKHNlbGVjdGVkU2l6ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuc2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNOb3RTZWxlY3RlZCA/IHNlbGVjdGVkU2l6ZSA6IHRoaXMuZGF0YUNvdW50IC0gdW5zZWxlY3RlZFNpemU7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZWZhdWx0Q29sdW1uc1JlY3Vyc2l2ZShjb2x1bW5zRGF0YTogSUNvbHVtbkRhdGFbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY29sdW1uc0RhdGEuZmxhdE1hcCgoY29sdW1uKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNoaWxkcmVuIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gW25hbWUsIC4uLnRoaXMuX2dldERlZmF1bHRDb2x1bW5zUmVjdXJzaXZlKGNoaWxkcmVuKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbbmFtZV07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG5vdEFsbEZldGNoZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdW5mZXRjaGVkU3RhdGUgPSB0aGlzLnNlbGVjdGVkU2VydmljZSEuc3RhdGVVbmZldGNoZWRPYmplY3RzKCk7XG4gICAgY29uc3QgYWxsRmV0Y2hlZCA9IHRoaXMuc3RhdGVPYmplY3RzISgpLnNpemUgPT09IHRoaXMuZGF0YUNvdW50O1xuXG4gICAgcmV0dXJuIHVuZmV0Y2hlZFN0YXRlID09PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCAmJiAhYWxsRmV0Y2hlZDtcbiAgfVxufVxuIl19