@mediusinc/mng-commons 1.4.0 → 1.5.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  2. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  3. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  4. package/esm2020/lib/api/models/index.mjs +8 -8
  5. package/esm2020/lib/api/models/mappers.mjs +12 -12
  6. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  7. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  8. package/esm2020/lib/api/models/query-result.model.mjs +23 -23
  9. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  10. package/esm2020/lib/api/services/api.abstract.service.mjs +57 -57
  11. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +74 -74
  12. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +29 -29
  13. package/esm2020/lib/api/services/index.mjs +3 -3
  14. package/esm2020/lib/api/utils/index.mjs +2 -2
  15. package/esm2020/lib/api/utils/medius-rest.util.mjs +212 -212
  16. package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
  17. package/esm2020/lib/components/action/action.component.mjs +277 -275
  18. package/esm2020/lib/components/action/editor/action-editor.component.mjs +302 -302
  19. package/esm2020/lib/components/action/index.mjs +4 -4
  20. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +44 -44
  21. package/esm2020/lib/components/action/models/action-component.model.mjs +1 -1
  22. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  23. package/esm2020/lib/components/action/models/action-execution.model.mjs +248 -248
  24. package/esm2020/lib/components/action/models/index.mjs +4 -4
  25. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
  26. package/esm2020/lib/components/action/route/action-route.component.mjs +129 -129
  27. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +299 -299
  28. package/esm2020/lib/components/form/date-range/date-range.component.mjs +108 -108
  29. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +193 -193
  30. package/esm2020/lib/components/form/editor/form-editor.component.mjs +242 -242
  31. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +38 -38
  32. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +49 -49
  33. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +44 -44
  34. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +25 -25
  35. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +149 -149
  36. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +23 -23
  37. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +185 -185
  38. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +196 -196
  39. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +153 -153
  40. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  41. package/esm2020/lib/components/form/formly/fields/index.mjs +10 -10
  42. package/esm2020/lib/components/form/formly/formly.config.mjs +211 -211
  43. package/esm2020/lib/components/form/formly/index.mjs +1 -1
  44. package/esm2020/lib/components/form/formly/models/formly-config.model.mjs +1 -1
  45. package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +1 -1
  46. package/esm2020/lib/components/form/formly/models/index.mjs +2 -2
  47. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +14 -14
  48. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +82 -82
  49. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  50. package/esm2020/lib/components/form/index.mjs +4 -4
  51. package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
  52. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  53. package/esm2020/lib/components/form/models/form-editor.interface.mjs +1 -1
  54. package/esm2020/lib/components/form/models/index.mjs +2 -2
  55. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  56. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  57. package/esm2020/lib/components/layout/index.mjs +7 -7
  58. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  59. package/esm2020/lib/components/layout/menu-item.component.mjs +271 -271
  60. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  61. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  62. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +194 -194
  63. package/esm2020/lib/components/layout/topbar.component.mjs +64 -64
  64. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  65. package/esm2020/lib/components/tableview/index.mjs +6 -6
  66. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  67. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  68. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +146 -146
  69. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -52
  70. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +119 -119
  71. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +83 -83
  72. package/esm2020/lib/components/tableview/table/table.component.mjs +594 -594
  73. package/esm2020/lib/components/tableview/tableview.component.mjs +112 -112
  74. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  75. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  76. package/esm2020/lib/data-providers/index.mjs +6 -6
  77. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  78. package/esm2020/lib/data-providers/table.data-provider.mjs +37 -37
  79. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +23 -23
  80. package/esm2020/lib/data-providers/tableview.data-provider.mjs +44 -44
  81. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +76 -76
  82. package/esm2020/lib/descriptors/action-button.descriptor.mjs +59 -59
  83. package/esm2020/lib/descriptors/action.descriptor.mjs +576 -576
  84. package/esm2020/lib/descriptors/column.descriptor.mjs +404 -404
  85. package/esm2020/lib/descriptors/editor.descriptor.mjs +289 -289
  86. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +24 -24
  87. package/esm2020/lib/descriptors/field.descriptor.mjs +986 -986
  88. package/esm2020/lib/descriptors/filter.descriptor.mjs +367 -367
  89. package/esm2020/lib/descriptors/index.mjs +11 -11
  90. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  91. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  92. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  93. package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
  94. package/esm2020/lib/descriptors/table.descriptor.mjs +496 -496
  95. package/esm2020/lib/descriptors/tableview.descriptor.mjs +343 -343
  96. package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
  97. package/esm2020/lib/descriptors/types/column.type.mjs +20 -20
  98. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  99. package/esm2020/lib/descriptors/types/field.type.mjs +55 -55
  100. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  101. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  102. package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
  103. package/esm2020/lib/directives/component.directive.mjs +43 -43
  104. package/esm2020/lib/directives/index.mjs +2 -2
  105. package/esm2020/lib/directives/template.directive.mjs +27 -27
  106. package/esm2020/lib/mng-commons.module.mjs +484 -484
  107. package/esm2020/lib/models/column-value.model.mjs +1 -1
  108. package/esm2020/lib/models/config.model.mjs +1 -1
  109. package/esm2020/lib/models/enum.model.mjs +1 -1
  110. package/esm2020/lib/models/error.model.mjs +1 -1
  111. package/esm2020/lib/models/index.mjs +9 -9
  112. package/esm2020/lib/models/menu.model.mjs +1 -1
  113. package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
  114. package/esm2020/lib/models/user.model.mjs +1 -1
  115. package/esm2020/lib/models/version.model.mjs +1 -1
  116. package/esm2020/lib/models/view-container.model.mjs +1 -1
  117. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  118. package/esm2020/lib/pipes/class-map.pipe.mjs +21 -21
  119. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  120. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +37 -37
  121. package/esm2020/lib/pipes/enumerate.pipe.mjs +54 -54
  122. package/esm2020/lib/pipes/getter.pipe.mjs +19 -19
  123. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  124. package/esm2020/lib/pipes/index.mjs +11 -11
  125. package/esm2020/lib/pipes/json-path.pipe.mjs +78 -78
  126. package/esm2020/lib/pipes/locale-default-row-class.pipe.mjs +25 -25
  127. package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
  128. package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
  129. package/esm2020/lib/pipes/parametrize.pipe.mjs +84 -84
  130. package/esm2020/lib/pipes/template.pipe.mjs +23 -23
  131. package/esm2020/lib/router/index.mjs +2 -2
  132. package/esm2020/lib/router/models/index.mjs +1 -1
  133. package/esm2020/lib/router/models/router.model.mjs +1 -1
  134. package/esm2020/lib/router/route-builder.mjs +425 -425
  135. package/esm2020/lib/router/tableview-route-builder.mjs +186 -186
  136. package/esm2020/lib/security/authorization.guard.mjs +25 -25
  137. package/esm2020/lib/security/authorization.service.mjs +46 -46
  138. package/esm2020/lib/security/authorization.util.mjs +15 -15
  139. package/esm2020/lib/security/index.mjs +3 -3
  140. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  141. package/esm2020/lib/security/model/index.mjs +3 -3
  142. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  143. package/esm2020/lib/security/model/permissions.model.mjs +86 -86
  144. package/esm2020/lib/services/action-executor.service.mjs +554 -554
  145. package/esm2020/lib/services/commons.service.mjs +460 -460
  146. package/esm2020/lib/services/configuration.service.mjs +141 -141
  147. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  148. package/esm2020/lib/services/index.mjs +6 -6
  149. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  150. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  151. package/esm2020/lib/services/internal/index.mjs +2 -2
  152. package/esm2020/lib/services/navigation.service.mjs +47 -47
  153. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  154. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  155. package/esm2020/lib/services/providers/index.mjs +2 -2
  156. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  157. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  158. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  159. package/esm2020/lib/services/tokens/index.mjs +4 -4
  160. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  161. package/esm2020/lib/services/version.service.mjs +38 -38
  162. package/esm2020/lib/services/view-container.component.service.mjs +54 -54
  163. package/esm2020/lib/styles/button-style.builder.mjs +164 -164
  164. package/esm2020/lib/styles/index.mjs +2 -2
  165. package/esm2020/lib/styles/models/index.mjs +2 -2
  166. package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
  167. package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
  168. package/esm2020/lib/styles/styles.util.mjs +41 -41
  169. package/esm2020/lib/types/i18n.type.mjs +2 -0
  170. package/esm2020/lib/types/index.mjs +4 -3
  171. package/esm2020/lib/types/type.decorator.mjs +21 -21
  172. package/esm2020/lib/types/type.model.mjs +1 -1
  173. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  174. package/esm2020/lib/utils/date.util.mjs +117 -117
  175. package/esm2020/lib/utils/editor-formly.util.mjs +287 -287
  176. package/esm2020/lib/utils/enum.util.mjs +81 -81
  177. package/esm2020/lib/utils/export.util.mjs +19 -19
  178. package/esm2020/lib/utils/i18n.util.mjs +276 -233
  179. package/esm2020/lib/utils/index.mjs +10 -10
  180. package/esm2020/lib/utils/model.util.mjs +68 -68
  181. package/esm2020/lib/utils/notification.util.mjs +50 -50
  182. package/esm2020/lib/utils/route.util.mjs +23 -23
  183. package/esm2020/lib/utils/string.util.mjs +26 -26
  184. package/esm2020/lib/utils/tableview.util.mjs +159 -159
  185. package/esm2020/lib/utils/type.util.mjs +92 -92
  186. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  187. package/esm2020/public-api.mjs +54 -54
  188. package/fesm2015/mediusinc-mng-commons.mjs +13908 -13863
  189. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  190. package/fesm2020/mediusinc-mng-commons.mjs +13745 -13700
  191. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  192. package/index.d.ts +5 -5
  193. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  194. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  195. package/lib/api/models/filter-param.model.d.ts +23 -23
  196. package/lib/api/models/index.d.ts +8 -8
  197. package/lib/api/models/mappers.d.ts +6 -6
  198. package/lib/api/models/query-mode.model.d.ts +16 -16
  199. package/lib/api/models/query-param.model.d.ts +31 -31
  200. package/lib/api/models/query-result.model.d.ts +24 -24
  201. package/lib/api/models/serialization.model.d.ts +8 -8
  202. package/lib/api/services/api.abstract.service.d.ts +24 -24
  203. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  204. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  205. package/lib/api/services/index.d.ts +3 -3
  206. package/lib/api/utils/index.d.ts +2 -2
  207. package/lib/api/utils/medius-rest.util.d.ts +16 -16
  208. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  209. package/lib/components/action/action.component.d.ts +79 -79
  210. package/lib/components/action/editor/action-editor.component.d.ts +69 -69
  211. package/lib/components/action/index.d.ts +4 -4
  212. package/lib/components/action/localization/data-language-dropdown.component.d.ts +25 -25
  213. package/lib/components/action/models/action-component.model.d.ts +15 -15
  214. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  215. package/lib/components/action/models/action-execution.model.d.ts +135 -135
  216. package/lib/components/action/models/index.d.ts +4 -4
  217. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
  218. package/lib/components/action/route/action-route.component.d.ts +31 -31
  219. package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
  220. package/lib/components/form/date-range/date-range.component.d.ts +28 -28
  221. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
  222. package/lib/components/form/editor/form-editor.component.d.ts +52 -52
  223. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -13
  224. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -16
  225. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -15
  226. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -14
  227. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +29 -29
  228. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -11
  229. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -46
  230. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +24 -24
  231. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  232. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -7
  233. package/lib/components/form/formly/fields/index.d.ts +10 -10
  234. package/lib/components/form/formly/formly.config.d.ts +14 -14
  235. package/lib/components/form/formly/index.d.ts +1 -1
  236. package/lib/components/form/formly/models/formly-config.model.d.ts +11 -11
  237. package/lib/components/form/formly/models/formly-field.model.d.ts +16 -16
  238. package/lib/components/form/formly/models/index.d.ts +2 -2
  239. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -6
  240. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +11 -11
  241. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  242. package/lib/components/form/index.d.ts +4 -4
  243. package/lib/components/form/models/field-action-context.model.d.ts +17 -17
  244. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  245. package/lib/components/form/models/form-editor.interface.d.ts +10 -10
  246. package/lib/components/form/models/index.d.ts +2 -2
  247. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  248. package/lib/components/layout/footer.component.d.ts +9 -9
  249. package/lib/components/layout/index.d.ts +7 -7
  250. package/lib/components/layout/main-layout.component.d.ts +20 -20
  251. package/lib/components/layout/menu-item.component.d.ts +52 -52
  252. package/lib/components/layout/menu.component.d.ts +10 -10
  253. package/lib/components/layout/services/index.d.ts +1 -1
  254. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  255. package/lib/components/layout/topbar.component.d.ts +28 -28
  256. package/lib/components/layout/version.component.d.ts +19 -19
  257. package/lib/components/tableview/index.d.ts +6 -6
  258. package/lib/components/tableview/models/index.d.ts +1 -1
  259. package/lib/components/tableview/models/table.event.d.ts +17 -17
  260. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +33 -33
  261. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  262. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
  263. package/lib/components/tableview/table/column-value/column-value.component.d.ts +35 -35
  264. package/lib/components/tableview/table/table.component.d.ts +115 -115
  265. package/lib/components/tableview/tableview.component.d.ts +48 -48
  266. package/lib/data-providers/base.data-provider.d.ts +14 -14
  267. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  268. package/lib/data-providers/index.d.ts +6 -6
  269. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  270. package/lib/data-providers/table.data-provider.d.ts +27 -27
  271. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
  272. package/lib/data-providers/tableview.data-provider.d.ts +33 -33
  273. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
  274. package/lib/descriptors/action-button.descriptor.d.ts +22 -22
  275. package/lib/descriptors/action.descriptor.d.ts +223 -223
  276. package/lib/descriptors/column.descriptor.d.ts +130 -130
  277. package/lib/descriptors/editor.descriptor.d.ts +116 -116
  278. package/lib/descriptors/field-validation.descriptor.d.ts +19 -19
  279. package/lib/descriptors/field.descriptor.d.ts +345 -345
  280. package/lib/descriptors/filter.descriptor.d.ts +118 -118
  281. package/lib/descriptors/index.d.ts +11 -11
  282. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  283. package/lib/descriptors/interfaces/index.d.ts +2 -2
  284. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  285. package/lib/descriptors/model.descriptor.d.ts +18 -18
  286. package/lib/descriptors/table.descriptor.d.ts +193 -193
  287. package/lib/descriptors/tableview.descriptor.d.ts +129 -129
  288. package/lib/descriptors/types/action.type.d.ts +21 -21
  289. package/lib/descriptors/types/column.type.d.ts +18 -18
  290. package/lib/descriptors/types/editor.type.d.ts +6 -6
  291. package/lib/descriptors/types/field.type.d.ts +47 -47
  292. package/lib/descriptors/types/filter.type.d.ts +27 -27
  293. package/lib/descriptors/types/index.d.ts +6 -6
  294. package/lib/descriptors/types/table.type.d.ts +22 -22
  295. package/lib/directives/component.directive.d.ts +16 -16
  296. package/lib/directives/index.d.ts +2 -2
  297. package/lib/directives/template.directive.d.ts +13 -13
  298. package/lib/mng-commons.module.d.ts +99 -99
  299. package/lib/models/column-value.model.d.ts +4 -4
  300. package/lib/models/config.model.d.ts +40 -40
  301. package/lib/models/enum.model.d.ts +6 -6
  302. package/lib/models/error.model.d.ts +14 -14
  303. package/lib/models/index.d.ts +9 -9
  304. package/lib/models/menu.model.d.ts +30 -30
  305. package/lib/models/tableview-attr.model.d.ts +10 -10
  306. package/lib/models/user.model.d.ts +8 -8
  307. package/lib/models/version.model.d.ts +18 -18
  308. package/lib/models/view-container.model.d.ts +43 -43
  309. package/lib/pipes/boolean.pipe.d.ts +7 -7
  310. package/lib/pipes/class-map.pipe.d.ts +7 -7
  311. package/lib/pipes/enum.pipe.d.ts +8 -8
  312. package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
  313. package/lib/pipes/enumerate.pipe.d.ts +21 -21
  314. package/lib/pipes/getter.pipe.d.ts +7 -7
  315. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  316. package/lib/pipes/index.d.ts +11 -11
  317. package/lib/pipes/json-path.pipe.d.ts +13 -13
  318. package/lib/pipes/locale-default-row-class.pipe.d.ts +10 -10
  319. package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
  320. package/lib/pipes/models/internal/index.d.ts +1 -1
  321. package/lib/pipes/parametrize.pipe.d.ts +13 -13
  322. package/lib/pipes/template.pipe.d.ts +10 -10
  323. package/lib/router/index.d.ts +2 -2
  324. package/lib/router/models/index.d.ts +1 -1
  325. package/lib/router/models/router.model.d.ts +33 -33
  326. package/lib/router/route-builder.d.ts +98 -98
  327. package/lib/router/tableview-route-builder.d.ts +37 -37
  328. package/lib/security/authorization.guard.d.ts +11 -11
  329. package/lib/security/authorization.service.d.ts +19 -19
  330. package/lib/security/authorization.util.d.ts +5 -5
  331. package/lib/security/index.d.ts +3 -3
  332. package/lib/security/model/authorization.type.d.ts +6 -6
  333. package/lib/security/model/index.d.ts +3 -3
  334. package/lib/security/model/permission-service.interface.d.ts +6 -6
  335. package/lib/security/model/permissions.model.d.ts +37 -37
  336. package/lib/services/action-executor.service.d.ts +149 -149
  337. package/lib/services/commons.service.d.ts +93 -93
  338. package/lib/services/configuration.service.d.ts +57 -57
  339. package/lib/services/error-mapper.service.d.ts +7 -7
  340. package/lib/services/index.d.ts +6 -6
  341. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  342. package/lib/services/internal/commons-init.service.d.ts +16 -16
  343. package/lib/services/internal/index.d.ts +2 -2
  344. package/lib/services/navigation.service.d.ts +14 -14
  345. package/lib/services/providers/config-service.provider.d.ts +6 -6
  346. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  347. package/lib/services/providers/index.d.ts +2 -2
  348. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  349. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  350. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  351. package/lib/services/tokens/index.d.ts +4 -4
  352. package/lib/services/tokens/module-config.token.d.ts +3 -3
  353. package/lib/services/version.service.d.ts +13 -13
  354. package/lib/services/view-container.component.service.d.ts +31 -31
  355. package/lib/styles/button-style.builder.d.ts +67 -67
  356. package/lib/styles/index.d.ts +2 -2
  357. package/lib/styles/models/index.d.ts +2 -2
  358. package/lib/styles/models/style-level.enum.d.ts +10 -10
  359. package/lib/styles/models/style-size.enum.d.ts +7 -7
  360. package/lib/styles/styles.util.d.ts +14 -14
  361. package/lib/types/i18n.type.d.ts +1 -0
  362. package/lib/types/index.d.ts +3 -2
  363. package/lib/types/type.decorator.d.ts +4 -4
  364. package/lib/types/type.model.d.ts +23 -23
  365. package/lib/utils/action-data-provider.util.d.ts +20 -20
  366. package/lib/utils/date.util.d.ts +7 -7
  367. package/lib/utils/editor-formly.util.d.ts +12 -12
  368. package/lib/utils/enum.util.d.ts +50 -50
  369. package/lib/utils/export.util.d.ts +5 -5
  370. package/lib/utils/i18n.util.d.ts +85 -56
  371. package/lib/utils/index.d.ts +10 -10
  372. package/lib/utils/model.util.d.ts +8 -8
  373. package/lib/utils/notification.util.d.ts +12 -12
  374. package/lib/utils/route.util.d.ts +4 -4
  375. package/lib/utils/string.util.d.ts +4 -4
  376. package/lib/utils/tableview.util.d.ts +40 -40
  377. package/lib/utils/type.util.d.ts +57 -57
  378. package/package.json +1 -1
  379. package/public-api.d.ts +34 -34
  380. package/version-info.json +5 -5
  381. package/mediusinc-mng-commons-1.4.0.tgz +0 -0
@@ -1,461 +1,461 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { NavigationEnd } from '@angular/router';
3
- import { BehaviorSubject, ReplaySubject, Subject, distinctUntilChanged } from 'rxjs';
4
- import { filter, map } from 'rxjs/operators';
5
- import { FilterMatchModeEnum } from '../descriptors/types';
6
- import { MNG_BROWSER_STORAGE_IT, MNG_MODULE_CONFIG_IT } from './tokens';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/router";
9
- import * as i2 from "primeng/api";
10
- import * as i3 from "@ngx-translate/core";
11
- import * as i4 from "@angular/platform-browser";
12
- export class MngCommonsService {
13
- constructor(router, primengConfig, translate, titleService, filterService, moduleConfig, localStorage) {
14
- this.router = router;
15
- this.primengConfig = primengConfig;
16
- this.translate = translate;
17
- this.titleService = titleService;
18
- this.filterService = filterService;
19
- this.moduleConfig = moduleConfig;
20
- this.localStorage = localStorage;
21
- // menu
22
- this._menuMode = 'sidebar';
23
- this._menuModeSubject = new BehaviorSubject(this._menuMode);
24
- this._menuItems = [];
25
- this._menuPinEnabled = false;
26
- this._menuSidebarSlim = false;
27
- this._menuActiveKeySubject = new Subject();
28
- this._menuResetSubject = new Subject();
29
- // breadcrumbs
30
- this.breadcrumbHomeSubject = new BehaviorSubject({
31
- icon: 'pi pi-home',
32
- routerLink: '/'
33
- });
34
- this.breadcrumbsSubject = new BehaviorSubject([]);
35
- // visual
36
- this._colorScheme = 'light';
37
- this.userSubject = new ReplaySubject(1);
38
- this._userRoles = [];
39
- this.userRolesSubject = new BehaviorSubject([]);
40
- // language
41
- this.languageSubject = new ReplaySubject(1);
42
- this.dataLanguageSubject = new ReplaySubject(1);
43
- }
44
- // APP section
45
- get appName() {
46
- return this.moduleConfig?.app?.name ?? 'app.name';
47
- }
48
- get appOwner() {
49
- return this.moduleConfig?.app?.owner ?? 'app.owner';
50
- }
51
- get appLogoLight() {
52
- return this.moduleConfig?.app?.logoPathLight ? this.moduleConfig.app.logoPathLight : this.moduleConfig?.app?.logoPath ?? 'assets/layout/images/logo.png';
53
- }
54
- get appLogoDark() {
55
- return this.moduleConfig?.app?.logoPathDark ? this.moduleConfig.app.logoPathDark : this.moduleConfig?.app?.logoPath ?? 'assets/layout/images/logo.png';
56
- }
57
- get appLogoNameLight() {
58
- return this.moduleConfig?.app?.logoNamePathLight
59
- ? this.moduleConfig.app.logoNamePathLight
60
- : this.moduleConfig?.app?.logoNamePath ?? 'assets/layout/images/logo-appname.png';
61
- }
62
- get appLogoNameDark() {
63
- return this.moduleConfig?.app?.logoNamePathDark ? this.moduleConfig.app.logoNamePathDark : this.moduleConfig?.app?.logoNamePath ?? 'assets/layout/images/logo-appname.png';
64
- }
65
- get appLanguages() {
66
- return this.moduleConfig?.app?.languages ?? ['en'];
67
- }
68
- get appLanguage() {
69
- const lsLang = this.localStorage.getItem('lang');
70
- if (lsLang && this.appLanguages.some(l => l === lsLang)) {
71
- return lsLang;
72
- }
73
- return null;
74
- }
75
- set appLanguage(language) {
76
- if (language === null) {
77
- this.localStorage.removeItem('lang');
78
- this.languageSubject.next(language);
79
- return;
80
- }
81
- if (this.appLanguages.some(l => l === language)) {
82
- this.localStorage.setItem('lang', language);
83
- this.languageSubject.next(language);
84
- this.translate.use(language);
85
- }
86
- }
87
- get appLanguage$() {
88
- return this.languageSubject.asObservable().pipe(distinctUntilChanged());
89
- }
90
- initLanguage() {
91
- const browserLang = this.translate.getBrowserLang();
92
- if (browserLang && this.appLanguages.some(l => l === browserLang)) {
93
- this.appLanguage = browserLang;
94
- return browserLang;
95
- }
96
- const defaultLanguage = this.appLanguages?.length > 0 ? this.appLanguages[0] : 'en';
97
- this.appLanguage = defaultLanguage;
98
- return defaultLanguage;
99
- }
100
- getOrInitLanguage() {
101
- return this.appLanguage || this.initLanguage();
102
- }
103
- get appDataLanguages() {
104
- return this.moduleConfig?.app?.dataLanguages ?? ['en'];
105
- }
106
- get appDataLanguageDefault() {
107
- return this.appDataLanguages[0];
108
- }
109
- get appDataLanguage() {
110
- const dataLang = this.localStorage.getItem('dataLang');
111
- if (dataLang && this.appDataLanguages.some(dl => dl === dataLang)) {
112
- return dataLang;
113
- }
114
- return this.defaultDataLanguage;
115
- }
116
- set appDataLanguage(dataLanguage) {
117
- if (dataLanguage === null) {
118
- this.localStorage.removeItem('dataLang');
119
- this.dataLanguageSubject.next(dataLanguage);
120
- return;
121
- }
122
- if (this.appDataLanguages.some(dl => dl === dataLanguage)) {
123
- this.localStorage.setItem('dataLang', dataLanguage);
124
- this.dataLanguageSubject.next(dataLanguage);
125
- }
126
- }
127
- get appDataLanguage$() {
128
- return this.dataLanguageSubject.asObservable().pipe(distinctUntilChanged());
129
- }
130
- // We assume, that default data language is the first one from the array of all available data languages
131
- get defaultDataLanguage() {
132
- return this.appDataLanguages[0];
133
- }
134
- get appVersion() {
135
- return this.moduleConfig?.app?.version;
136
- }
137
- // MENU section
138
- get menuModeIsStatic() {
139
- return this._menuMode === 'static';
140
- }
141
- get menuModeIsStatic$() {
142
- return this._menuModeSubject.pipe(map(e => e === 'static'));
143
- }
144
- get menuModeIsOverlay() {
145
- return this._menuMode === 'overlay';
146
- }
147
- get menuModeIsOverlay$() {
148
- return this._menuModeSubject.pipe(map(e => e === 'overlay'));
149
- }
150
- get menuModeIsSlim() {
151
- return this._menuMode === 'slim';
152
- }
153
- get menuModeIsSlim$() {
154
- return this._menuModeSubject.pipe(map(e => e === 'slim'));
155
- }
156
- get menuModeIsSidebar() {
157
- return this._menuMode === 'sidebar';
158
- }
159
- get menuModeIsSidebar$() {
160
- return this._menuModeSubject.pipe(map(e => e === 'sidebar'));
161
- }
162
- get menuActiveKey$() {
163
- return this._menuActiveKeySubject.asObservable();
164
- }
165
- get menuReset$() {
166
- return this._menuResetSubject.asObservable();
167
- }
168
- get menuItems() {
169
- return this._menuItems;
170
- }
171
- set menuItems(menuItems) {
172
- this._menuItems = menuItems;
173
- }
174
- get menuPinEnabled() {
175
- return this._menuPinEnabled;
176
- }
177
- get menuSidebarSlim() {
178
- return this._menuSidebarSlim;
179
- }
180
- // BREADCRUMB section
181
- get breadcrumbHome$() {
182
- return this.breadcrumbHomeSubject.asObservable();
183
- }
184
- get breadcrumbs$() {
185
- return this.breadcrumbsSubject.asObservable();
186
- }
187
- // VISUAL section
188
- get colorSchemeIsLight() {
189
- return this._colorScheme === 'light';
190
- }
191
- get colorSchemeIsDark() {
192
- return this._colorScheme === 'dark';
193
- }
194
- // USER section
195
- get user() {
196
- return this._user;
197
- }
198
- set user(user) {
199
- this._user = user;
200
- this.userSubject.next(user);
201
- }
202
- get user$() {
203
- return this.userSubject.asObservable();
204
- }
205
- get userRoles() {
206
- return this._userRoles;
207
- }
208
- set userRoles(roles) {
209
- this._userRoles = roles;
210
- this.userRolesSubject.next(roles);
211
- }
212
- get userRoles$() {
213
- return this.userRolesSubject.asObservable();
214
- }
215
- reset() {
216
- this._menuMode = this.moduleConfig?.menu?.mode ?? 'sidebar';
217
- this._menuModeSubject.next(this._menuMode);
218
- this._menuItems = this.moduleConfig?.menu?.menuItems ?? [];
219
- this._menuPinEnabled = this.moduleConfig?.menu?.pinEnabled ?? false;
220
- this._menuSidebarSlim = this.moduleConfig?.menu?.sidebarSlim ?? false;
221
- // visual
222
- this._colorScheme = this.moduleConfig?.app?.colorScheme ?? 'light';
223
- // ripple
224
- this.primengConfig.ripple = true;
225
- this.primengConfig.filterMatchModeOptions = {
226
- text: [FilterMatchModeEnum.Contains, FilterMatchModeEnum.Equals, FilterMatchModeEnum.NotEquals, FilterMatchModeEnum.StartsWith, FilterMatchModeEnum.EndsWith],
227
- numeric: [FilterMatchModeEnum.Equals, FilterMatchModeEnum.NotEquals, FilterMatchModeEnum.LessThan, FilterMatchModeEnum.GreaterThan],
228
- date: [FilterMatchModeEnum.DateIs, FilterMatchModeEnum.DateBefore, FilterMatchModeEnum.DateAfter, FilterMatchModeEnum.Between]
229
- };
230
- // translate
231
- this.translate.langs = this.appLanguages;
232
- const lang = this.getOrInitLanguage();
233
- this.languageSubject.next(lang);
234
- this.dataLanguageSubject.next(this.appDataLanguage);
235
- this.translate.use(lang);
236
- this.translate.get('mngPrime').subscribe(value => this.primengConfig.setTranslation(value));
237
- this.routerEventsSubscription?.unsubscribe();
238
- this.routerEventsSubscription = this.router.events
239
- .pipe(
240
- // Filter the NavigationEnd events as the breadcrumb is updated only when the route reaches its end
241
- filter(event => event instanceof NavigationEnd))
242
- .subscribe(() => {
243
- this.updateBreadcrumbs();
244
- this.setPageTitle();
245
- });
246
- this.translateLangChangeSubscription?.unsubscribe();
247
- this.translateLangChangeSubscription = this.translate.onLangChange.subscribe(() => {
248
- this.updateBreadcrumbs();
249
- this.setPageTitle();
250
- });
251
- }
252
- // MENU actions
253
- menuChangeActiveKey(key) {
254
- this._menuActiveKeySubject.next(key);
255
- }
256
- menuReset() {
257
- this._menuResetSubject.next(null);
258
- }
259
- // BREADCRUMB actions
260
- findBreadcrumbItem(item) {
261
- const items = this.breadcrumbsSubject.value;
262
- if (item.id) {
263
- return items.find(i => i.id && i.id === item.id) ?? null;
264
- }
265
- else if (item.routerLink) {
266
- const routerLinkStr = Array.isArray(item.routerLink) ? item.routerLink.join('/') : item.routerLink;
267
- return items.find(i => i.routerLink && (Array.isArray(i.routerLink) ? i.routerLink.join('/') : i.routerLink) === routerLinkStr) ?? null;
268
- }
269
- else if (item.positionIndex) {
270
- return items.find(i => i.positionIndex && i.positionIndex === i.positionIndex) ?? null;
271
- }
272
- else if (item.label) {
273
- return items.find(i => i.label && i.label === i.label) ?? null;
274
- }
275
- else if (item.icon) {
276
- return items.find(i => i.icon && i.icon === i.icon) ?? null;
277
- }
278
- return null;
279
- }
280
- updateBreadcrumbItem(item) {
281
- const items = [...this.breadcrumbsSubject.value];
282
- let posIdx = -1;
283
- if (item.id) {
284
- posIdx = items.findIndex(i => i.id && i.id === item.id);
285
- }
286
- else if (item.routerLink) {
287
- const routerLinkStr = Array.isArray(item.routerLink) ? item.routerLink.join('/') : item.routerLink;
288
- posIdx = items.findIndex(i => i.routerLink && (Array.isArray(i.routerLink) ? i.routerLink.join('/') : i.routerLink) === routerLinkStr);
289
- }
290
- else if (item.positionIndex) {
291
- posIdx = items.findIndex(i => i.positionIndex && i.positionIndex === i.positionIndex);
292
- }
293
- else if (item.label) {
294
- posIdx = items.findIndex(i => i.label && i.label === i.label);
295
- }
296
- else if (item.icon) {
297
- posIdx = items.findIndex(i => i.icon && i.icon === i.icon);
298
- }
299
- if (posIdx < 0) {
300
- return false;
301
- }
302
- items[posIdx] = {
303
- ...items[posIdx],
304
- ...item,
305
- updated: true
306
- };
307
- this.breadcrumbsSubject.next(items);
308
- return true;
309
- }
310
- updateBreadcrumbs() {
311
- if (this.breadcrumbsTranslateSubscription) {
312
- this.breadcrumbsTranslateSubscription.unsubscribe();
313
- this.breadcrumbsTranslateSubscription = undefined;
314
- }
315
- if (this.breadcrumbHomeTranslateSubscription) {
316
- this.breadcrumbHomeTranslateSubscription.unsubscribe();
317
- this.breadcrumbHomeTranslateSubscription = undefined;
318
- }
319
- const rootRoute = this.router.routerState.snapshot.root;
320
- const homeBreadcrumb = this.generateHomeBreadcrumb(rootRoute);
321
- if (homeBreadcrumb) {
322
- if (homeBreadcrumb.label) {
323
- this.breadcrumbHomeTranslateSubscription = this.translate.get(homeBreadcrumb.label).subscribe(i18n => {
324
- homeBreadcrumb.label = i18n;
325
- this.breadcrumbHomeSubject.next(homeBreadcrumb);
326
- });
327
- }
328
- else {
329
- this.breadcrumbHomeSubject.next(homeBreadcrumb);
330
- }
331
- }
332
- const breadcrumbs = [];
333
- this.generateBreadcrumbs(rootRoute, [], breadcrumbs);
334
- breadcrumbs.forEach((b, idx) => {
335
- b.positionIndex = idx;
336
- });
337
- const i18nKeys = breadcrumbs.filter(b => typeof b.label === 'string').map(b => b.label);
338
- if (i18nKeys.length > 0) {
339
- this.breadcrumbsTranslateSubscription = this.translate.get(i18nKeys).subscribe(i18n => {
340
- // Construct the breadcrumb hierarchy
341
- breadcrumbs.forEach(b => {
342
- if (b.label && i18n[b.label]) {
343
- b.label = i18n[b.label];
344
- }
345
- });
346
- // Emit the new breadcrumbs
347
- this.breadcrumbsSubject.next(breadcrumbs);
348
- });
349
- }
350
- else {
351
- this.breadcrumbsSubject.next(breadcrumbs);
352
- }
353
- }
354
- generateHomeBreadcrumb(route) {
355
- if (!route) {
356
- return null;
357
- }
358
- const routeData = route.data;
359
- const breadcrumbRouteData = routeData?.breadcrumb;
360
- if (breadcrumbRouteData && typeof breadcrumbRouteData === 'object' && 'isHome' in breadcrumbRouteData) {
361
- if (breadcrumbRouteData.isHome === false) {
362
- return null;
363
- }
364
- const breadcrumb = this.createBreadcrumb('/', breadcrumbRouteData, true);
365
- if (breadcrumb) {
366
- if (typeof breadcrumb.icon === 'undefined') {
367
- breadcrumb.icon = 'pi pi-home';
368
- }
369
- return breadcrumb;
370
- }
371
- }
372
- else {
373
- return this.generateHomeBreadcrumb(route.firstChild);
374
- }
375
- return null;
376
- }
377
- generateBreadcrumbs(route, parentUrlSegments, breadcrumbs) {
378
- if (!route) {
379
- return;
380
- }
381
- const routeData = route.data;
382
- const routeUrlSegments = parentUrlSegments.concat(route.url.map(url => url.path));
383
- const routeUrl = `/${routeUrlSegments.join('/')}`;
384
- if (routeData?.breadcrumb) {
385
- const breadcrumbRouteData = routeData.breadcrumb;
386
- if (Array.isArray(breadcrumbRouteData)) {
387
- for (const breadcrumbRouteDataItem of breadcrumbRouteData) {
388
- const breadcrumb = this.createBreadcrumb(routeUrl, breadcrumbRouteDataItem);
389
- if (breadcrumb) {
390
- breadcrumbs.push(breadcrumb);
391
- }
392
- }
393
- }
394
- else if (typeof breadcrumbRouteData === 'function') {
395
- breadcrumbs.push(...breadcrumbRouteData(routeUrl, route));
396
- }
397
- else {
398
- const breadcrumb = this.createBreadcrumb(routeUrl, breadcrumbRouteData);
399
- if (breadcrumb) {
400
- breadcrumbs.push(breadcrumb);
401
- }
402
- }
403
- }
404
- this.generateBreadcrumbs(route.firstChild, routeUrlSegments, breadcrumbs);
405
- }
406
- createBreadcrumb(routeUrl, routeBreadcrumb, includeHome = false) {
407
- const existingBreadcrumb = this.findBreadcrumbItem({ routerLink: routeUrl });
408
- if (existingBreadcrumb?.updated) {
409
- return existingBreadcrumb;
410
- }
411
- if (typeof routeBreadcrumb === 'string') {
412
- // check for updated existing breadcrumb
413
- return {
414
- id: routeUrl,
415
- label: routeBreadcrumb,
416
- routerLink: routeUrl
417
- };
418
- }
419
- else {
420
- if (!includeHome && typeof routeBreadcrumb.isHome !== 'undefined') {
421
- // home should not be included
422
- return null;
423
- }
424
- if (typeof routeBreadcrumb.routerLink === 'undefined') {
425
- routeBreadcrumb.routerLink = routeUrl;
426
- }
427
- routeBreadcrumb.id = routeUrl;
428
- return routeBreadcrumb;
429
- }
430
- }
431
- // TITLE section
432
- setPageTitle(title) {
433
- let currentRoute = this.router.routerState.snapshot.root;
434
- while (currentRoute.firstChild) {
435
- currentRoute = currentRoute.firstChild;
436
- }
437
- const routeData = currentRoute.data;
438
- const pageTitle = title ?? routeData.pageTitle;
439
- this.titleService.setTitle(this.formatPageTitle(pageTitle));
440
- }
441
- formatPageTitle(titlePrefix) {
442
- const titlePieces = [];
443
- if (titlePrefix) {
444
- titlePieces.push(this.translate.instant(titlePrefix));
445
- }
446
- titlePieces.push(this.translate.instant('app.name'));
447
- return titlePieces.join(' - ');
448
- }
449
- }
450
- MngCommonsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngCommonsService, deps: [{ token: i1.Router }, { token: i2.PrimeNGConfig }, { token: i3.TranslateService }, { token: i4.Title }, { token: i2.FilterService }, { token: MNG_MODULE_CONFIG_IT }, { token: MNG_BROWSER_STORAGE_IT }], target: i0.ɵɵFactoryTarget.Injectable });
451
- MngCommonsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngCommonsService });
452
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngCommonsService, decorators: [{
453
- type: Injectable
454
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.PrimeNGConfig }, { type: i3.TranslateService }, { type: i4.Title }, { type: i2.FilterService }, { type: undefined, decorators: [{
455
- type: Inject,
456
- args: [MNG_MODULE_CONFIG_IT]
457
- }] }, { type: Storage, decorators: [{
458
- type: Inject,
459
- args: [MNG_BROWSER_STORAGE_IT]
460
- }] }]; } });
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { NavigationEnd } from '@angular/router';
3
+ import { BehaviorSubject, ReplaySubject, Subject, distinctUntilChanged } from 'rxjs';
4
+ import { filter, map } from 'rxjs/operators';
5
+ import { FilterMatchModeEnum } from '../descriptors/types';
6
+ import { MNG_BROWSER_STORAGE_IT, MNG_MODULE_CONFIG_IT } from './tokens';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ import * as i2 from "primeng/api";
10
+ import * as i3 from "@ngx-translate/core";
11
+ import * as i4 from "@angular/platform-browser";
12
+ export class MngCommonsService {
13
+ constructor(router, primengConfig, translate, titleService, filterService, moduleConfig, localStorage) {
14
+ this.router = router;
15
+ this.primengConfig = primengConfig;
16
+ this.translate = translate;
17
+ this.titleService = titleService;
18
+ this.filterService = filterService;
19
+ this.moduleConfig = moduleConfig;
20
+ this.localStorage = localStorage;
21
+ // menu
22
+ this._menuMode = 'sidebar';
23
+ this._menuModeSubject = new BehaviorSubject(this._menuMode);
24
+ this._menuItems = [];
25
+ this._menuPinEnabled = false;
26
+ this._menuSidebarSlim = false;
27
+ this._menuActiveKeySubject = new Subject();
28
+ this._menuResetSubject = new Subject();
29
+ // breadcrumbs
30
+ this.breadcrumbHomeSubject = new BehaviorSubject({
31
+ icon: 'pi pi-home',
32
+ routerLink: '/'
33
+ });
34
+ this.breadcrumbsSubject = new BehaviorSubject([]);
35
+ // visual
36
+ this._colorScheme = 'light';
37
+ this.userSubject = new ReplaySubject(1);
38
+ this._userRoles = [];
39
+ this.userRolesSubject = new BehaviorSubject([]);
40
+ // language
41
+ this.languageSubject = new ReplaySubject(1);
42
+ this.dataLanguageSubject = new ReplaySubject(1);
43
+ }
44
+ // APP section
45
+ get appName() {
46
+ return this.moduleConfig?.app?.name ?? 'app.name';
47
+ }
48
+ get appOwner() {
49
+ return this.moduleConfig?.app?.owner ?? 'app.owner';
50
+ }
51
+ get appLogoLight() {
52
+ return this.moduleConfig?.app?.logoPathLight ? this.moduleConfig.app.logoPathLight : this.moduleConfig?.app?.logoPath ?? 'assets/layout/images/logo.png';
53
+ }
54
+ get appLogoDark() {
55
+ return this.moduleConfig?.app?.logoPathDark ? this.moduleConfig.app.logoPathDark : this.moduleConfig?.app?.logoPath ?? 'assets/layout/images/logo.png';
56
+ }
57
+ get appLogoNameLight() {
58
+ return this.moduleConfig?.app?.logoNamePathLight
59
+ ? this.moduleConfig.app.logoNamePathLight
60
+ : this.moduleConfig?.app?.logoNamePath ?? 'assets/layout/images/logo-appname.png';
61
+ }
62
+ get appLogoNameDark() {
63
+ return this.moduleConfig?.app?.logoNamePathDark ? this.moduleConfig.app.logoNamePathDark : this.moduleConfig?.app?.logoNamePath ?? 'assets/layout/images/logo-appname.png';
64
+ }
65
+ get appLanguages() {
66
+ return this.moduleConfig?.app?.languages ?? ['en'];
67
+ }
68
+ get appLanguage() {
69
+ const lsLang = this.localStorage.getItem('lang');
70
+ if (lsLang && this.appLanguages.some(l => l === lsLang)) {
71
+ return lsLang;
72
+ }
73
+ return null;
74
+ }
75
+ set appLanguage(language) {
76
+ if (language === null) {
77
+ this.localStorage.removeItem('lang');
78
+ this.languageSubject.next(language);
79
+ return;
80
+ }
81
+ if (this.appLanguages.some(l => l === language)) {
82
+ this.localStorage.setItem('lang', language);
83
+ this.languageSubject.next(language);
84
+ this.translate.use(language);
85
+ }
86
+ }
87
+ get appLanguage$() {
88
+ return this.languageSubject.asObservable().pipe(distinctUntilChanged());
89
+ }
90
+ initLanguage() {
91
+ const browserLang = this.translate.getBrowserLang();
92
+ if (browserLang && this.appLanguages.some(l => l === browserLang)) {
93
+ this.appLanguage = browserLang;
94
+ return browserLang;
95
+ }
96
+ const defaultLanguage = this.appLanguages?.length > 0 ? this.appLanguages[0] : 'en';
97
+ this.appLanguage = defaultLanguage;
98
+ return defaultLanguage;
99
+ }
100
+ getOrInitLanguage() {
101
+ return this.appLanguage || this.initLanguage();
102
+ }
103
+ get appDataLanguages() {
104
+ return this.moduleConfig?.app?.dataLanguages ?? ['en'];
105
+ }
106
+ get appDataLanguageDefault() {
107
+ return this.appDataLanguages[0];
108
+ }
109
+ get appDataLanguage() {
110
+ const dataLang = this.localStorage.getItem('dataLang');
111
+ if (dataLang && this.appDataLanguages.some(dl => dl === dataLang)) {
112
+ return dataLang;
113
+ }
114
+ return this.defaultDataLanguage;
115
+ }
116
+ set appDataLanguage(dataLanguage) {
117
+ if (dataLanguage === null) {
118
+ this.localStorage.removeItem('dataLang');
119
+ this.dataLanguageSubject.next(dataLanguage);
120
+ return;
121
+ }
122
+ if (this.appDataLanguages.some(dl => dl === dataLanguage)) {
123
+ this.localStorage.setItem('dataLang', dataLanguage);
124
+ this.dataLanguageSubject.next(dataLanguage);
125
+ }
126
+ }
127
+ get appDataLanguage$() {
128
+ return this.dataLanguageSubject.asObservable().pipe(distinctUntilChanged());
129
+ }
130
+ // We assume, that default data language is the first one from the array of all available data languages
131
+ get defaultDataLanguage() {
132
+ return this.appDataLanguages[0];
133
+ }
134
+ get appVersion() {
135
+ return this.moduleConfig?.app?.version;
136
+ }
137
+ // MENU section
138
+ get menuModeIsStatic() {
139
+ return this._menuMode === 'static';
140
+ }
141
+ get menuModeIsStatic$() {
142
+ return this._menuModeSubject.pipe(map(e => e === 'static'));
143
+ }
144
+ get menuModeIsOverlay() {
145
+ return this._menuMode === 'overlay';
146
+ }
147
+ get menuModeIsOverlay$() {
148
+ return this._menuModeSubject.pipe(map(e => e === 'overlay'));
149
+ }
150
+ get menuModeIsSlim() {
151
+ return this._menuMode === 'slim';
152
+ }
153
+ get menuModeIsSlim$() {
154
+ return this._menuModeSubject.pipe(map(e => e === 'slim'));
155
+ }
156
+ get menuModeIsSidebar() {
157
+ return this._menuMode === 'sidebar';
158
+ }
159
+ get menuModeIsSidebar$() {
160
+ return this._menuModeSubject.pipe(map(e => e === 'sidebar'));
161
+ }
162
+ get menuActiveKey$() {
163
+ return this._menuActiveKeySubject.asObservable();
164
+ }
165
+ get menuReset$() {
166
+ return this._menuResetSubject.asObservable();
167
+ }
168
+ get menuItems() {
169
+ return this._menuItems;
170
+ }
171
+ set menuItems(menuItems) {
172
+ this._menuItems = menuItems;
173
+ }
174
+ get menuPinEnabled() {
175
+ return this._menuPinEnabled;
176
+ }
177
+ get menuSidebarSlim() {
178
+ return this._menuSidebarSlim;
179
+ }
180
+ // BREADCRUMB section
181
+ get breadcrumbHome$() {
182
+ return this.breadcrumbHomeSubject.asObservable();
183
+ }
184
+ get breadcrumbs$() {
185
+ return this.breadcrumbsSubject.asObservable();
186
+ }
187
+ // VISUAL section
188
+ get colorSchemeIsLight() {
189
+ return this._colorScheme === 'light';
190
+ }
191
+ get colorSchemeIsDark() {
192
+ return this._colorScheme === 'dark';
193
+ }
194
+ // USER section
195
+ get user() {
196
+ return this._user;
197
+ }
198
+ set user(user) {
199
+ this._user = user;
200
+ this.userSubject.next(user);
201
+ }
202
+ get user$() {
203
+ return this.userSubject.asObservable();
204
+ }
205
+ get userRoles() {
206
+ return this._userRoles;
207
+ }
208
+ set userRoles(roles) {
209
+ this._userRoles = roles;
210
+ this.userRolesSubject.next(roles);
211
+ }
212
+ get userRoles$() {
213
+ return this.userRolesSubject.asObservable();
214
+ }
215
+ reset() {
216
+ this._menuMode = this.moduleConfig?.menu?.mode ?? 'sidebar';
217
+ this._menuModeSubject.next(this._menuMode);
218
+ this._menuItems = this.moduleConfig?.menu?.menuItems ?? [];
219
+ this._menuPinEnabled = this.moduleConfig?.menu?.pinEnabled ?? false;
220
+ this._menuSidebarSlim = this.moduleConfig?.menu?.sidebarSlim ?? false;
221
+ // visual
222
+ this._colorScheme = this.moduleConfig?.app?.colorScheme ?? 'light';
223
+ // ripple
224
+ this.primengConfig.ripple = true;
225
+ this.primengConfig.filterMatchModeOptions = {
226
+ text: [FilterMatchModeEnum.Contains, FilterMatchModeEnum.Equals, FilterMatchModeEnum.NotEquals, FilterMatchModeEnum.StartsWith, FilterMatchModeEnum.EndsWith],
227
+ numeric: [FilterMatchModeEnum.Equals, FilterMatchModeEnum.NotEquals, FilterMatchModeEnum.LessThan, FilterMatchModeEnum.GreaterThan],
228
+ date: [FilterMatchModeEnum.DateIs, FilterMatchModeEnum.DateBefore, FilterMatchModeEnum.DateAfter, FilterMatchModeEnum.Between]
229
+ };
230
+ // translate
231
+ this.translate.langs = this.appLanguages;
232
+ const lang = this.getOrInitLanguage();
233
+ this.languageSubject.next(lang);
234
+ this.dataLanguageSubject.next(this.appDataLanguage);
235
+ this.translate.use(lang);
236
+ this.translate.get('mngPrime').subscribe(value => this.primengConfig.setTranslation(value));
237
+ this.routerEventsSubscription?.unsubscribe();
238
+ this.routerEventsSubscription = this.router.events
239
+ .pipe(
240
+ // Filter the NavigationEnd events as the breadcrumb is updated only when the route reaches its end
241
+ filter(event => event instanceof NavigationEnd))
242
+ .subscribe(() => {
243
+ this.updateBreadcrumbs();
244
+ this.setPageTitle();
245
+ });
246
+ this.translateLangChangeSubscription?.unsubscribe();
247
+ this.translateLangChangeSubscription = this.translate.onLangChange.subscribe(() => {
248
+ this.updateBreadcrumbs();
249
+ this.setPageTitle();
250
+ });
251
+ }
252
+ // MENU actions
253
+ menuChangeActiveKey(key) {
254
+ this._menuActiveKeySubject.next(key);
255
+ }
256
+ menuReset() {
257
+ this._menuResetSubject.next(null);
258
+ }
259
+ // BREADCRUMB actions
260
+ findBreadcrumbItem(item) {
261
+ const items = this.breadcrumbsSubject.value;
262
+ if (item.id) {
263
+ return items.find(i => i.id && i.id === item.id) ?? null;
264
+ }
265
+ else if (item.routerLink) {
266
+ const routerLinkStr = Array.isArray(item.routerLink) ? item.routerLink.join('/') : item.routerLink;
267
+ return items.find(i => i.routerLink && (Array.isArray(i.routerLink) ? i.routerLink.join('/') : i.routerLink) === routerLinkStr) ?? null;
268
+ }
269
+ else if (item.positionIndex) {
270
+ return items.find(i => i.positionIndex && i.positionIndex === i.positionIndex) ?? null;
271
+ }
272
+ else if (item.label) {
273
+ return items.find(i => i.label && i.label === i.label) ?? null;
274
+ }
275
+ else if (item.icon) {
276
+ return items.find(i => i.icon && i.icon === i.icon) ?? null;
277
+ }
278
+ return null;
279
+ }
280
+ updateBreadcrumbItem(item) {
281
+ const items = [...this.breadcrumbsSubject.value];
282
+ let posIdx = -1;
283
+ if (item.id) {
284
+ posIdx = items.findIndex(i => i.id && i.id === item.id);
285
+ }
286
+ else if (item.routerLink) {
287
+ const routerLinkStr = Array.isArray(item.routerLink) ? item.routerLink.join('/') : item.routerLink;
288
+ posIdx = items.findIndex(i => i.routerLink && (Array.isArray(i.routerLink) ? i.routerLink.join('/') : i.routerLink) === routerLinkStr);
289
+ }
290
+ else if (item.positionIndex) {
291
+ posIdx = items.findIndex(i => i.positionIndex && i.positionIndex === i.positionIndex);
292
+ }
293
+ else if (item.label) {
294
+ posIdx = items.findIndex(i => i.label && i.label === i.label);
295
+ }
296
+ else if (item.icon) {
297
+ posIdx = items.findIndex(i => i.icon && i.icon === i.icon);
298
+ }
299
+ if (posIdx < 0) {
300
+ return false;
301
+ }
302
+ items[posIdx] = {
303
+ ...items[posIdx],
304
+ ...item,
305
+ updated: true
306
+ };
307
+ this.breadcrumbsSubject.next(items);
308
+ return true;
309
+ }
310
+ updateBreadcrumbs() {
311
+ if (this.breadcrumbsTranslateSubscription) {
312
+ this.breadcrumbsTranslateSubscription.unsubscribe();
313
+ this.breadcrumbsTranslateSubscription = undefined;
314
+ }
315
+ if (this.breadcrumbHomeTranslateSubscription) {
316
+ this.breadcrumbHomeTranslateSubscription.unsubscribe();
317
+ this.breadcrumbHomeTranslateSubscription = undefined;
318
+ }
319
+ const rootRoute = this.router.routerState.snapshot.root;
320
+ const homeBreadcrumb = this.generateHomeBreadcrumb(rootRoute);
321
+ if (homeBreadcrumb) {
322
+ if (homeBreadcrumb.label) {
323
+ this.breadcrumbHomeTranslateSubscription = this.translate.get(homeBreadcrumb.label).subscribe(i18n => {
324
+ homeBreadcrumb.label = i18n;
325
+ this.breadcrumbHomeSubject.next(homeBreadcrumb);
326
+ });
327
+ }
328
+ else {
329
+ this.breadcrumbHomeSubject.next(homeBreadcrumb);
330
+ }
331
+ }
332
+ const breadcrumbs = [];
333
+ this.generateBreadcrumbs(rootRoute, [], breadcrumbs);
334
+ breadcrumbs.forEach((b, idx) => {
335
+ b.positionIndex = idx;
336
+ });
337
+ const i18nKeys = breadcrumbs.filter(b => typeof b.label === 'string').map(b => b.label);
338
+ if (i18nKeys.length > 0) {
339
+ this.breadcrumbsTranslateSubscription = this.translate.get(i18nKeys).subscribe(i18n => {
340
+ // Construct the breadcrumb hierarchy
341
+ breadcrumbs.forEach(b => {
342
+ if (b.label && i18n[b.label]) {
343
+ b.label = i18n[b.label];
344
+ }
345
+ });
346
+ // Emit the new breadcrumbs
347
+ this.breadcrumbsSubject.next(breadcrumbs);
348
+ });
349
+ }
350
+ else {
351
+ this.breadcrumbsSubject.next(breadcrumbs);
352
+ }
353
+ }
354
+ generateHomeBreadcrumb(route) {
355
+ if (!route) {
356
+ return null;
357
+ }
358
+ const routeData = route.data;
359
+ const breadcrumbRouteData = routeData?.breadcrumb;
360
+ if (breadcrumbRouteData && typeof breadcrumbRouteData === 'object' && 'isHome' in breadcrumbRouteData) {
361
+ if (breadcrumbRouteData.isHome === false) {
362
+ return null;
363
+ }
364
+ const breadcrumb = this.createBreadcrumb('/', breadcrumbRouteData, true);
365
+ if (breadcrumb) {
366
+ if (typeof breadcrumb.icon === 'undefined') {
367
+ breadcrumb.icon = 'pi pi-home';
368
+ }
369
+ return breadcrumb;
370
+ }
371
+ }
372
+ else {
373
+ return this.generateHomeBreadcrumb(route.firstChild);
374
+ }
375
+ return null;
376
+ }
377
+ generateBreadcrumbs(route, parentUrlSegments, breadcrumbs) {
378
+ if (!route) {
379
+ return;
380
+ }
381
+ const routeData = route.data;
382
+ const routeUrlSegments = parentUrlSegments.concat(route.url.map(url => url.path));
383
+ const routeUrl = `/${routeUrlSegments.join('/')}`;
384
+ if (routeData?.breadcrumb) {
385
+ const breadcrumbRouteData = routeData.breadcrumb;
386
+ if (Array.isArray(breadcrumbRouteData)) {
387
+ for (const breadcrumbRouteDataItem of breadcrumbRouteData) {
388
+ const breadcrumb = this.createBreadcrumb(routeUrl, breadcrumbRouteDataItem);
389
+ if (breadcrumb) {
390
+ breadcrumbs.push(breadcrumb);
391
+ }
392
+ }
393
+ }
394
+ else if (typeof breadcrumbRouteData === 'function') {
395
+ breadcrumbs.push(...breadcrumbRouteData(routeUrl, route));
396
+ }
397
+ else {
398
+ const breadcrumb = this.createBreadcrumb(routeUrl, breadcrumbRouteData);
399
+ if (breadcrumb) {
400
+ breadcrumbs.push(breadcrumb);
401
+ }
402
+ }
403
+ }
404
+ this.generateBreadcrumbs(route.firstChild, routeUrlSegments, breadcrumbs);
405
+ }
406
+ createBreadcrumb(routeUrl, routeBreadcrumb, includeHome = false) {
407
+ const existingBreadcrumb = this.findBreadcrumbItem({ routerLink: routeUrl });
408
+ if (existingBreadcrumb?.updated) {
409
+ return existingBreadcrumb;
410
+ }
411
+ if (typeof routeBreadcrumb === 'string') {
412
+ // check for updated existing breadcrumb
413
+ return {
414
+ id: routeUrl,
415
+ label: routeBreadcrumb,
416
+ routerLink: routeUrl
417
+ };
418
+ }
419
+ else {
420
+ if (!includeHome && typeof routeBreadcrumb.isHome !== 'undefined') {
421
+ // home should not be included
422
+ return null;
423
+ }
424
+ if (typeof routeBreadcrumb.routerLink === 'undefined') {
425
+ routeBreadcrumb.routerLink = routeUrl;
426
+ }
427
+ routeBreadcrumb.id = routeUrl;
428
+ return routeBreadcrumb;
429
+ }
430
+ }
431
+ // TITLE section
432
+ setPageTitle(title) {
433
+ let currentRoute = this.router.routerState.snapshot.root;
434
+ while (currentRoute.firstChild) {
435
+ currentRoute = currentRoute.firstChild;
436
+ }
437
+ const routeData = currentRoute.data;
438
+ const pageTitle = title ?? routeData.pageTitle;
439
+ this.titleService.setTitle(this.formatPageTitle(pageTitle));
440
+ }
441
+ formatPageTitle(titlePrefix) {
442
+ const titlePieces = [];
443
+ if (titlePrefix) {
444
+ titlePieces.push(this.translate.instant(titlePrefix));
445
+ }
446
+ titlePieces.push(this.translate.instant('app.name'));
447
+ return titlePieces.join(' - ');
448
+ }
449
+ }
450
+ MngCommonsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngCommonsService, deps: [{ token: i1.Router }, { token: i2.PrimeNGConfig }, { token: i3.TranslateService }, { token: i4.Title }, { token: i2.FilterService }, { token: MNG_MODULE_CONFIG_IT }, { token: MNG_BROWSER_STORAGE_IT }], target: i0.ɵɵFactoryTarget.Injectable });
451
+ MngCommonsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngCommonsService });
452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngCommonsService, decorators: [{
453
+ type: Injectable
454
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.PrimeNGConfig }, { type: i3.TranslateService }, { type: i4.Title }, { type: i2.FilterService }, { type: undefined, decorators: [{
455
+ type: Inject,
456
+ args: [MNG_MODULE_CONFIG_IT]
457
+ }] }, { type: Storage, decorators: [{
458
+ type: Inject,
459
+ args: [MNG_BROWSER_STORAGE_IT]
460
+ }] }]; } });
461
461
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9jb21tb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUF5QixhQUFhLEVBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUk5RSxPQUFPLEVBQUMsZUFBZSxFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQWdCLG9CQUFvQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdHLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHekQsT0FBTyxFQUFDLHNCQUFzQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sVUFBVSxDQUFDOzs7Ozs7QUFHdEUsTUFBTSxPQUFPLGlCQUFpQjtJQW9DMUIsWUFDWSxNQUFjLEVBQ2QsYUFBNEIsRUFDNUIsU0FBMkIsRUFDM0IsWUFBbUIsRUFDbkIsYUFBNEIsRUFDRSxZQUE2QixFQUMzQixZQUFxQjtRQU5yRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQU87UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDRSxpQkFBWSxHQUFaLFlBQVksQ0FBaUI7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQVM7UUF0Q2pFLE9BQU87UUFDQyxjQUFTLEdBQThDLFNBQVMsQ0FBQztRQUNqRSxxQkFBZ0IsR0FBdUQsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNHLGVBQVUsR0FBa0IsRUFBRSxDQUFDO1FBQy9CLG9CQUFl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T0FBTyxlQUFlLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBRVQsWUFBWSxDQUFDLEtBQWM7UUFDOUIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUN6RCxPQUFPLFlBQVksQ0FBQyxVQUFVLEVBQUU7WUFDNUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUM7U0FDMUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBcUIsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUUvQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVPLGVBQWUsQ0FBQyxXQUFvQjtRQUN4QyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFdkIsSUFBSSxXQUFXLEVBQUU7WUFDYixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFckQsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7OzhHQXhnQlEsaUJBQWlCLHVKQTBDZCxvQkFBb0IsYUFDcEIsc0JBQXNCO2tIQTNDekIsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7OzBCQTJDRixNQUFNOzJCQUFDLG9CQUFvQjs4QkFDMEIsT0FBTzswQkFBNUQsTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RpdGxlfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgTmF2aWdhdGlvbkVuZCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJTZXJ2aWNlLCBQcmltZU5HQ29uZmlnfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBkaXN0aW5jdFVudGlsQ2hhbmdlZH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7RmlsdGVyTWF0Y2hNb2RlRW51bX0gZnJvbSAnLi4vZGVzY3JpcHRvcnMvdHlwZXMnO1xuaW1wb3J0IHtJVXNlciwgTW5nTWVudUl0ZW0sIE1uZ01vZHVsZUNvbmZpZ30gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TW5nQnJlYWRjcnVtYk1lbnVJdGVtLCBNbmdSb3V0ZXJEYXRhfSBmcm9tICcuLi9yb3V0ZXIvbW9kZWxzJztcbmltcG9ydCB7TU5HX0JST1dTRVJfU1RPUkFHRV9JVCwgTU5HX01PRFVMRV9DT05GSUdfSVR9IGZyb20gJy4vdG9rZW5zJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1uZ0NvbW1vbnNTZXJ2aWNlIHtcbiAgICAvLyBpbnRlcm5hbFxuICAgIHByaXZhdGUgcm91dGVyRXZlbnRzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgdHJhbnNsYXRlTGFuZ0NoYW5nZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8vIG1lbnVcbiAgICBwcml2YXRlIF9tZW51TW9kZTogJ3N0YXRpYycgfCAnc2lkZWJhcicgfCAnc2xpbScgfCAnb3ZlcmxheScgPSAnc2lkZWJhcic7XG4gICAgcHJpdmF0ZSBfbWVudU1vZGVTdWJqZWN0OiBTdWJqZWN0PCdzdGF0aWMnIHwgJ3NpZGViYXInIHwgJ3NsaW0nIHwgJ292ZXJsYXknPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy5fbWVudU1vZGUpO1xuICAgIHByaXZhdGUgX21lbnVJdGVtczogTW5nTWVudUl0ZW1bXSA9IFtdO1xuICAgIHByaXZhdGUgX21lbnVQaW5FbmFibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbWVudVNpZGViYXJTbGltID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbWVudUFjdGl2ZUtleVN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfbWVudVJlc2V0U3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICAvLyBicmVhZGNydW1ic1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJlYWRjcnVtYkhvbWVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNbmdNZW51SXRlbSB8IG51bGw+KHtcbiAgICAgICAgaWNvbjogJ3BpIHBpLWhvbWUnLFxuICAgICAgICByb3V0ZXJMaW5rOiAnLydcbiAgICB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJyZWFkY3J1bWJzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TW5nTWVudUl0ZW1bXT4oW10pO1xuICAgIHByaXZhdGUgYnJlYWRjcnVtYnNUcmFuc2xhdGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBicmVhZGNydW1iSG9tZVRyYW5zbGF0ZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8vIHZpc3VhbFxuICAgIHByaXZhdGUgX2NvbG9yU2NoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnID0gJ2xpZ2h0JztcblxuICAgIC8vIHVzZXJcbiAgICBwcml2YXRlIF91c2VyPzogSVVzZXI7XG4gICAgcHJpdmF0ZSB1c2VyU3ViamVjdDogU3ViamVjdDxJVXNlciB8IHVuZGVmaW5lZD4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgICBwcml2YXRlIF91c2VyUm9sZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBwcml2YXRlIHVzZXJSb2xlc1N1YmplY3Q6IFN1YmplY3Q8QXJyYXk8c3RyaW5nPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PHN0cmluZz4+KFtdKTtcblxuICAgIC8vIGxhbmd1YWdlXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmcgfCBudWxsPigxKTtcbiAgICBwcml2YXRlIGRhdGFMYW5ndWFnZVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmcgfCBudWxsPigxKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHByaW1lbmdDb25maWc6IFByaW1lTkdDb25maWcsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRpdGxlU2VydmljZTogVGl0bGUsXG4gICAgICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcbiAgICAgICAgQEluamVjdChNTkdfTU9EVUxFX0NPTkZJR19JVCkgcHJpdmF0ZSBtb2R1bGVDb25maWc6IE1uZ01vZHVsZUNvbmZpZyxcbiAgICAgICAgQEluamVjdChNTkdfQlJPV1NFUl9TVE9SQUdFX0lUKSBwcml2YXRlIGxvY2FsU3RvcmFnZTogU3RvcmFnZVxuICAgICkge31cblxuICAgIC8vIEFQUCBzZWN0aW9uXG5cbiAgICBwdWJsaWMgZ2V0IGFwcE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZUNvbmZpZz8uYXBwPy5uYW1lID8/ICdhcHAubmFtZSc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhcHBPd25lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlQ29uZmlnPy5hcHA/Lm93bmVyID8/ICdhcHAub3duZXInO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwTG9nb0xpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2R1bGVDb25maWc/LmFwcD8ubG9nb1BhdGhMaWdodCA/IHRoaXMubW9kdWxlQ29uZmlnLmFwcC5sb2dvUGF0aExpZ2h0IDogdGhpcy5tb2R1bGVDb25maWc/LmFwcD8ubG9nb1BhdGggPz8gJ2Fzc2V0cy9sYXlvdXQvaW1hZ2VzL2xvZ28ucG5nJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFwcExvZ29EYXJrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2R1bGVDb25maWc/LmFwcD8ubG9nb1BhdGhEYXJrID8gdGhpcy5tb2R1bGVDb25maWcuYXBwLmxvZ29QYXRoRGFyayA6IHRoaXMubW9kdWxlQ29uZmlnPy5hcHA/LmxvZ29QYXRoID8/ICdhc3NldHMvbGF5b3V0L2ltYWdlcy9sb2dvLnBuZyc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhcHBMb2dvTmFtZUxpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2R1bGVDb25maWc/LmFwcD8ubG9nb05hbWVQYXRoTGlnaHRcbiAgICAgICAgICAgID8gdGhpcy5tb2R1bGVDb25maWcuYXBwLmxvZ29OYW1lUGF0aExpZ2h0XG4gICAgICAgICAgICA6IHRoaXMubW9kdWxlQ29uZmlnPy5hcHA/LmxvZ29OYW1lUGF0aCA/PyAnYXNzZXRzL2xheW91dC9pbWFnZXMvbG9nby1hcHBuYW1lLnBuZyc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhcHBMb2dvTmFtZURhcmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZUNvbmZpZz8uYXBwPy5sb2dvTmFtZVBhdGhEYXJrID8gdGhpcy5tb2R1bGVDb25maWcuYXBwLmxvZ29OYW1lUGF0aERhcmsgOiB0aGlzLm1vZHVsZUNvbmZpZz8uYXBwPy5sb2dvTmFtZVBhdGggPz8gJ2Fzc2V0cy9sYXlvdXQvaW1hZ2VzL2xvZ28tYXBwbmFtZS5wbmcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwTGFuZ3VhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2R1bGVDb25maWc/LmFwcD8ubGFuZ3VhZ2VzID8/IFsnZW4nXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFwcExhbmd1YWdlKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBsc0xhbmcgPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5nJyk7XG4gICAgICAgIGlmIChsc0xhbmcgJiYgdGhpcy5hcHBMYW5ndWFnZXMuc29tZShsID0+IGwgPT09IGxzTGFuZykpIHtcbiAgICAgICAgICAgIHJldHVybiBsc0xhbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhcHBMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAobGFuZ3VhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2xhbmcnKTtcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTdWJqZWN0Lm5leHQobGFuZ3VhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFwcExhbmd1YWdlcy5zb21lKGwgPT4gbCA9PT0gbGFuZ3VhZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsYW5nJywgbGFuZ3VhZ2UpO1xuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVN1YmplY3QubmV4dChsYW5ndWFnZSk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UobGFuZ3VhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhcHBMYW5ndWFnZSQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0TGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnJvd3NlckxhbmcgPSB0aGlzLnRyYW5zbGF0ZS5nZXRCcm93c2VyTGFuZygpO1xuICAgICAgICBpZiAoYnJvd3NlckxhbmcgJiYgdGhpcy5hcHBMYW5ndWFnZXMuc29tZShsID0+IGwgPT09IGJyb3dzZXJMYW5nKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBMYW5ndWFnZSA9IGJyb3dzZXJMYW5nO1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJMYW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZmF1bHRMYW5ndWFnZSA9IHRoaXMuYXBwTGFuZ3VhZ2VzPy5sZW5ndGggPiAwID8gdGhpcy5hcHBMYW5ndWFnZXNbMF0gOiAnZW4nO1xuICAgICAgICB0aGlzLmFwcExhbmd1YWdlID0gZGVmYXVsdExhbmd1YWdlO1xuICAgICAgICByZXR1cm4gZGVmYXVsdExhbmd1YWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPckluaXRMYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBMYW5ndWFnZSB8fCB0aGlzLmluaXRMYW5ndWFnZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwRGF0YUxhbmd1YWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlQ29uZmlnPy5hcHA/LmRhdGFMYW5ndWFnZXMgPz8gWydlbiddO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwRGF0YUxhbmd1YWdlRGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwRGF0YUxhbmd1YWdlc1swXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFwcERhdGFMYW5ndWFnZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZGF0YUxhbmcgPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXRhTGFuZycpO1xuICAgICAgICBpZiAoZGF0YUxhbmcgJiYgdGhpcy5hcHBEYXRhTGFuZ3VhZ2VzLnNvbWUoZGwgPT4gZGwgPT09IGRhdGFMYW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFMYW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREYXRhTGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhcHBEYXRhTGFuZ3VhZ2UoZGF0YUxhbmd1YWdlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmIChkYXRhTGFuZ3VhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2RhdGFMYW5nJyk7XG4gICAgICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZVN1YmplY3QubmV4dChkYXRhTGFuZ3VhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFwcERhdGFMYW5ndWFnZXMuc29tZShkbCA9PiBkbCA9PT0gZGF0YUxhbmd1YWdlKSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGF0YUxhbmcnLCBkYXRhTGFuZ3VhZ2UpO1xuICAgICAgICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2VTdWJqZWN0Lm5leHQoZGF0YUxhbmd1YWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwRGF0YUxhbmd1YWdlJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUxhbmd1YWdlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFdlIGFzc3VtZSwgdGhhdCBkZWZhdWx0IGRhdGEgbGFuZ3VhZ2UgaXMgdGhlIGZpcnN0IG9uZSBmcm9tIHRoZSBhcnJheSBvZiBhbGwgYXZhaWxhYmxlIGRhdGEgbGFuZ3VhZ2VzXG4gICAgcHVibGljIGdldCBkZWZhdWx0RGF0YUxhbmd1YWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBEYXRhTGFuZ3VhZ2VzWzBdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlQ29uZmlnPy5hcHA/LnZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gTUVOVSBzZWN0aW9uXG5cbiAgICBwdWJsaWMgZ2V0IG1lbnVNb2RlSXNTdGF0aWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZW51TW9kZSA9PT0gJ3N0YXRpYyc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZW51TW9kZUlzU3RhdGljJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnVNb2RlU3ViamVjdC5waXBlKG1hcChlID0+IGUgPT09ICdzdGF0aWMnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZW51TW9kZUlzT3ZlcmxheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnVNb2RlID09PSAnb3ZlcmxheSc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZW51TW9kZUlzT3ZlcmxheSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZW51TW9kZVN1YmplY3QucGlwZShtYXAoZSA9PiBlID09PSAnb3ZlcmxheScpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1lbnVNb2RlSXNTbGltKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVudU1vZGUgPT09ICdzbGltJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1lbnVNb2RlSXNTbGltJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnVNb2RlU3ViamVjdC5waXBlKG1hcChlID0+IGUgPT09ICdzbGltJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWVudU1vZGVJc1NpZGViYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZW51TW9kZSA9PT0gJ3NpZGViYXInO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWVudU1vZGVJc1NpZGViYXIkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVudU1vZGVTdWJqZWN0LnBpcGUobWFwKGUgPT4gZSA9PT0gJ3NpZGViYXInKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZW51QWN0aXZlS2V5JCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVudUFjdGl2ZUtleVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZW51UmVzZXQkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZW51UmVzZXRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVudUl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbWVudUl0ZW1zKG1lbnVJdGVtczogTW5nTWVudUl0ZW1bXSkge1xuICAgICAgICB0aGlzLl9tZW51SXRlbXMgPSBtZW51SXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZW51UGluRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnVQaW5FbmFibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWVudVNpZGViYXJTbGltKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVudVNpZGViYXJTbGltO1xuICAgIH1cblxuICAgIC8vIEJSRUFEQ1JVTUIgc2VjdGlvblxuICAgIHB1YmxpYyBnZXQgYnJlYWRjcnVtYkhvbWUkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5icmVhZGNydW1iSG9tZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBicmVhZGNydW1icyQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyZWFkY3J1bWJzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyBWSVNVQUwgc2VjdGlvblxuXG4gICAgcHVibGljIGdldCBjb2xvclNjaGVtZUlzTGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xvclNjaGVtZSA9PT0gJ2xpZ2h0JztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbG9yU2NoZW1lSXNEYXJrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sb3JTY2hlbWUgPT09ICdkYXJrJztcbiAgICB9XG5cbiAgICAvLyBVU0VSIHNlY3Rpb25cblxuICAgIHB1YmxpYyBnZXQgdXNlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB1c2VyKHVzZXI6IElVc2VyIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3VzZXIgPSB1c2VyO1xuICAgICAgICB0aGlzLnVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1c2VyJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1c2VyUm9sZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyUm9sZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB1c2VyUm9sZXMocm9sZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5fdXNlclJvbGVzID0gcm9sZXM7XG4gICAgICAgIHRoaXMudXNlclJvbGVzU3ViamVjdC5uZXh0KHJvbGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHVzZXJSb2xlcyQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJSb2xlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9tZW51TW9kZSA9IHRoaXMubW9kdWxlQ29uZmlnPy5tZW51Py5tb2RlID8/ICdzaWRlYmFyJztcbiAgICAgICAgdGhpcy5fbWVudU1vZGVTdWJqZWN0Lm5leHQodGhpcy5fbWVudU1vZGUpO1xuICAgICAgICB0aGlzLl9tZW51SXRlbXMgPSB0aGlzLm1vZHVsZUNvbmZpZz8ubWVudT8ubWVudUl0ZW1zID8/IFtdO1xuICAgICAgICB0aGlzLl9tZW51UGluRW5hYmxlZCA9IHRoaXMubW9kdWxlQ29uZmlnPy5tZW51Py5waW5FbmFibGVkID8/IGZhbHNlO1xuICAgICAgICB0aGlzLl9tZW51U2lkZWJhclNsaW0gPSB0aGlzLm1vZHVsZUNvbmZpZz8ubWVudT8uc2lkZWJhclNsaW0gPz8gZmFsc2U7XG5cbiAgICAgICAgLy8gdmlzdWFsXG4gICAgICAgIHRoaXMuX2NvbG9yU2NoZW1lID0gdGhpcy5tb2R1bGVDb25maWc/LmFwcD8uY29sb3JTY2hlbWUgPz8gJ2xpZ2h0JztcblxuICAgICAgICAvLyByaXBwbGVcbiAgICAgICAgdGhpcy5wcmltZW5nQ29uZmlnLnJpcHBsZSA9IHRydWU7XG4gICAgICAgIHRoaXMucHJpbWVuZ0NvbmZpZy5maWx0ZXJNYXRjaE1vZGVPcHRpb25zID0ge1xuICAgICAgICAgICAgdGV4dDogW0ZpbHRlck1hdGNoTW9kZUVudW0uQ29udGFpbnMsIEZpbHRlck1hdGNoTW9kZUVudW0uRXF1YWxzLCBGaWx0ZXJNYXRjaE1vZGVFbnVtLk5vdEVxdWFscywgRmlsdGVyTWF0Y2hNb2RlRW51bS5TdGFydHNXaXRoLCBGaWx0ZXJNYXRjaE1vZGVFbnVtLkVuZHNXaXRoXSxcbiAgICAgICAgICAgIG51bWVyaWM6IFtGaWx0ZXJNYXRjaE1vZGVFbnVtLkVxdWFscywgRmlsdGVyTWF0Y2hNb2RlRW51bS5Ob3RFcXVhbHMsIEZpbHRlck1hdGNoTW9kZUVudW0uTGVzc1RoYW4sIEZpbHRlck1hdGNoTW9kZUVudW0uR3JlYXRlclRoYW5dLFxuICAgICAgICAgICAgZGF0ZTogW0ZpbHRlck1hdGNoTW9kZUVudW0uRGF0ZUlzLCBGaWx0ZXJNYXRjaE1vZGVFbnVtLkRhdGVCZWZvcmUsIEZpbHRlck1hdGNoTW9kZUVudW0uRGF0ZUFmdGVyLCBGaWx0ZXJNYXRjaE1vZGVFbnVtLkJldHdlZW5dXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gdHJhbnNsYXRlXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLmxhbmdzID0gdGhpcy5hcHBMYW5ndWFnZXM7XG4gICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmdldE9ySW5pdExhbmd1YWdlKCk7XG5cbiAgICAgICAgdGhpcy5sYW5ndWFnZVN1YmplY3QubmV4dChsYW5nKTtcbiAgICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2VTdWJqZWN0Lm5leHQodGhpcy5hcHBEYXRhTGFuZ3VhZ2UpO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKTtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUuZ2V0KCdtbmdQcmltZScpLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnByaW1lbmdDb25maWcuc2V0VHJhbnNsYXRpb24odmFsdWUpKTtcblxuICAgICAgICB0aGlzLnJvdXRlckV2ZW50c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXJFdmVudHNTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIEZpbHRlciB0aGUgTmF2aWdhdGlvbkVuZCBldmVudHMgYXMgdGhlIGJyZWFkY3J1bWIgaXMgdXBkYXRlZCBvbmx5IHdoZW4gdGhlIHJvdXRlIHJlYWNoZXMgaXRzIGVuZFxuICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJyZWFkY3J1bWJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYWdlVGl0bGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZUxhbmdDaGFuZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlTGFuZ0NoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCcmVhZGNydW1icygpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYWdlVGl0bGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTUVOVSBhY3Rpb25zXG5cbiAgICBtZW51Q2hhbmdlQWN0aXZlS2V5KGtleTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21lbnVBY3RpdmVLZXlTdWJqZWN0Lm5leHQoa2V5KTtcbiAgICB9XG5cbiAgICBtZW51UmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX21lbnVSZXNldFN1YmplY3QubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICAvLyBCUkVBRENSVU1CIGFjdGlvbnNcbiAgICBwdWJsaWMgZmluZEJyZWFkY3J1bWJJdGVtKGl0ZW06IE1uZ01lbnVJdGVtKTogTW5nTWVudUl0ZW0gfCBudWxsIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmJyZWFkY3J1bWJzU3ViamVjdC52YWx1ZTtcbiAgICAgICAgaWYgKGl0ZW0uaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5maW5kKGkgPT4gaS5pZCAmJiBpLmlkID09PSBpdGVtLmlkKSA/PyBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgY29uc3Qgcm91dGVyTGlua1N0ciA9IEFycmF5LmlzQXJyYXkoaXRlbS5yb3V0ZXJMaW5rKSA/IGl0ZW0ucm91dGVyTGluay5qb2luKCcvJykgOiBpdGVtLnJvdXRlckxpbms7XG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmluZChpID0+IGkucm91dGVyTGluayAmJiAoQXJyYXkuaXNBcnJheShpLnJvdXRlckxpbmspID8gaS5yb3V0ZXJMaW5rLmpvaW4oJy8nKSA6IGkucm91dGVyTGluaykgPT09IHJvdXRlckxpbmtTdHIpID8/IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5wb3NpdGlvbkluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmluZChpID0+IGkucG9zaXRpb25JbmRleCAmJiBpLnBvc2l0aW9uSW5kZXggPT09IGkucG9zaXRpb25JbmRleCkgPz8gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLmxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmluZChpID0+IGkubGFiZWwgJiYgaS5sYWJlbCA9PT0gaS5sYWJlbCkgPz8gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5maW5kKGkgPT4gaS5pY29uICYmIGkuaWNvbiA9PT0gaS5pY29uKSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVCcmVhZGNydW1iSXRlbShpdGVtOiBNbmdNZW51SXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmJyZWFkY3J1bWJzU3ViamVjdC52YWx1ZV07XG4gICAgICAgIGxldCBwb3NJZHggPSAtMTtcbiAgICAgICAgaWYgKGl0ZW0uaWQpIHtcbiAgICAgICAgICAgIHBvc0lkeCA9IGl0ZW1zLmZpbmRJbmRleChpID0+IGkuaWQgJiYgaS5pZCA9PT0gaXRlbS5pZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5yb3V0ZXJMaW5rKSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZXJMaW5rU3RyID0gQXJyYXkuaXNBcnJheShpdGVtLnJvdXRlckxpbmspID8gaXRlbS5yb3V0ZXJMaW5rLmpvaW4oJy8nKSA6IGl0ZW0ucm91dGVyTGluaztcbiAgICAgICAgICAgIHBvc0lkeCA9IGl0ZW1zLmZpbmRJbmRleChpID0+IGkucm91dGVyTGluayAmJiAoQXJyYXkuaXNBcnJheShpLnJvdXRlckxpbmspID8gaS5yb3V0ZXJMaW5rLmpvaW4oJy8nKSA6IGkucm91dGVyTGluaykgPT09IHJvdXRlckxpbmtTdHIpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ucG9zaXRpb25JbmRleCkge1xuICAgICAgICAgICAgcG9zSWR4ID0gaXRlbXMuZmluZEluZGV4KGkgPT4gaS5wb3NpdGlvbkluZGV4ICYmIGkucG9zaXRpb25JbmRleCA9PT0gaS5wb3NpdGlvbkluZGV4KTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLmxhYmVsKSB7XG4gICAgICAgICAgICBwb3NJZHggPSBpdGVtcy5maW5kSW5kZXgoaSA9PiBpLmxhYmVsICYmIGkubGFiZWwgPT09IGkubGFiZWwpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICAgICAgcG9zSWR4ID0gaXRlbXMuZmluZEluZGV4KGkgPT4gaS5pY29uICYmIGkuaWNvbiA9PT0gaS5pY29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NJZHggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtc1twb3NJZHhdID0ge1xuICAgICAgICAgICAgLi4uaXRlbXNbcG9zSWR4XSxcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICB1cGRhdGVkOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5icmVhZGNydW1ic1N1YmplY3QubmV4dChpdGVtcyk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVCcmVhZGNydW1icygpIHtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWRjcnVtYnNUcmFuc2xhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYnNUcmFuc2xhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYnNUcmFuc2xhdGVTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYnJlYWRjcnVtYkhvbWVUcmFuc2xhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYkhvbWVUcmFuc2xhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYkhvbWVUcmFuc2xhdGVTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb290Um91dGUgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC5yb290O1xuXG4gICAgICAgIGNvbnN0IGhvbWVCcmVhZGNydW1iID0gdGhpcy5nZW5lcmF0ZUhvbWVCcmVhZGNydW1iKHJvb3RSb3V0ZSk7XG4gICAgICAgIGlmIChob21lQnJlYWRjcnVtYikge1xuICAgICAgICAgICAgaWYgKGhvbWVCcmVhZGNydW1iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icmVhZGNydW1iSG9tZVRyYW5zbGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudHJhbnNsYXRlLmdldChob21lQnJlYWRjcnVtYi5sYWJlbCkuc3Vic2NyaWJlKGkxOG4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBob21lQnJlYWRjcnVtYi5sYWJlbCA9IGkxOG47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYkhvbWVTdWJqZWN0Lm5leHQoaG9tZUJyZWFkY3J1bWIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWJIb21lU3ViamVjdC5uZXh0KGhvbWVCcmVhZGNydW1iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJyZWFkY3J1bWJzOiBNbmdNZW51SXRlbVtdID0gW107XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVCcmVhZGNydW1icyhyb290Um91dGUsIFtdLCBicmVhZGNydW1icyk7XG5cbiAgICAgICAgYnJlYWRjcnVtYnMuZm9yRWFjaCgoYiwgaWR4KSA9PiB7XG4gICAgICAgICAgICBiLnBvc2l0aW9uSW5kZXggPSBpZHg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGkxOG5LZXlzOiBBcnJheTxzdHJpbmc+ID0gYnJlYWRjcnVtYnMuZmlsdGVyKGIgPT4gdHlwZW9mIGIubGFiZWwgPT09ICdzdHJpbmcnKS5tYXAoYiA9PiBiLmxhYmVsISk7XG4gICAgICAgIGlmIChpMThuS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWJzVHJhbnNsYXRlU3Vic2NyaXB0aW9uID0gdGhpcy50cmFuc2xhdGUuZ2V0KGkxOG5LZXlzKS5zdWJzY3JpYmUoaTE4biA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBicmVhZGNydW1iIGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgIGJyZWFkY3J1bWJzLmZvckVhY2goYiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiLmxhYmVsICYmIGkxOG5bYi5sYWJlbF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIubGFiZWwgPSBpMThuW2IubGFiZWxdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBFbWl0IHRoZSBuZXcgYnJlYWRjcnVtYnNcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWJzU3ViamVjdC5uZXh0KGJyZWFkY3J1bWJzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5icmVhZGNydW1ic1N1YmplY3QubmV4dChicmVhZGNydW1icyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSG9tZUJyZWFkY3J1bWIocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsKTogTW5nTWVudUl0ZW0gfCBudWxsIHtcbiAgICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3V0ZURhdGEgPSByb3V0ZS5kYXRhIGFzIE1uZ1JvdXRlckRhdGE7XG4gICAgICAgIGNvbnN0IGJyZWFkY3J1bWJSb3V0ZURhdGEgPSByb3V0ZURhdGE/LmJyZWFkY3J1bWI7XG4gICAgICAgIGlmIChicmVhZGNydW1iUm91dGVEYXRhICYmIHR5cGVvZiBicmVhZGNydW1iUm91dGVEYXRhID09PSAnb2JqZWN0JyAmJiAnaXNIb21lJyBpbiBicmVhZGNydW1iUm91dGVEYXRhKSB7XG4gICAgICAgICAgICBpZiAoYnJlYWRjcnVtYlJvdXRlRGF0YS5pc0hvbWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBicmVhZGNydW1iID0gdGhpcy5jcmVhdGVCcmVhZGNydW1iKCcvJywgYnJlYWRjcnVtYlJvdXRlRGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoYnJlYWRjcnVtYikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYnJlYWRjcnVtYi5pY29uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBicmVhZGNydW1iLmljb24gPSAncGkgcGktaG9tZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBicmVhZGNydW1iO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVIb21lQnJlYWRjcnVtYihyb3V0ZS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlQnJlYWRjcnVtYnMocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsLCBwYXJlbnRVcmxTZWdtZW50czogc3RyaW5nW10sIGJyZWFkY3J1bWJzOiBNbmdNZW51SXRlbVtdKSB7XG4gICAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvdXRlRGF0YSA9IHJvdXRlLmRhdGEgYXMgTW5nUm91dGVyRGF0YTtcbiAgICAgICAgY29uc3Qgcm91dGVVcmxTZWdtZW50cyA9IHBhcmVudFVybFNlZ21lbnRzLmNvbmNhdChyb3V0ZS51cmwubWFwKHVybCA9PiB1cmwucGF0aCkpO1xuICAgICAgICBjb25zdCByb3V0ZVVybCA9IGAvJHtyb3V0ZVVybFNlZ21lbnRzLmpvaW4oJy8nKX1gO1xuICAgICAgICBpZiAocm91dGVEYXRhPy5icmVhZGNydW1iKSB7XG4gICAgICAgICAgICBjb25zdCBicmVhZGNydW1iUm91dGVEYXRhID0gcm91dGVEYXRhLmJyZWFkY3J1bWI7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJyZWFkY3J1bWJSb3V0ZURhdGEpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBicmVhZGNydW1iUm91dGVEYXRhSXRlbSBvZiBicmVhZGNydW1iUm91dGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFkY3J1bWIgPSB0aGlzLmNyZWF0ZUJyZWFkY3J1bWIocm91dGVVcmwsIGJyZWFkY3J1bWJSb3V0ZURhdGFJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFkY3J1bWIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFkY3J1bWJzLnB1c2goYnJlYWRjcnVtYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBicmVhZGNydW1iUm91dGVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYnJlYWRjcnVtYnMucHVzaCguLi5icmVhZGNydW1iUm91dGVEYXRhKHJvdXRlVXJsLCByb3V0ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBicmVhZGNydW1iID0gdGhpcy5jcmVhdGVCcmVhZGNydW1iKHJvdXRlVXJsLCBicmVhZGNydW1iUm91dGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJlYWRjcnVtYikge1xuICAgICAgICAgICAgICAgICAgICBicmVhZGNydW1icy5wdXNoKGJyZWFkY3J1bWIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlbmVyYXRlQnJlYWRjcnVtYnMocm91dGUuZmlyc3RDaGlsZCwgcm91dGVVcmxTZWdtZW50cywgYnJlYWRjcnVtYnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQnJlYWRjcnVtYihyb3V0ZVVybDogc3RyaW5nLCByb3V0ZUJyZWFkY3J1bWI6IHN0cmluZyB8IE1uZ0JyZWFkY3J1bWJNZW51SXRlbSwgaW5jbHVkZUhvbWUgPSBmYWxzZSk6IE1uZ01lbnVJdGVtIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQnJlYWRjcnVtYiA9IHRoaXMuZmluZEJyZWFkY3J1bWJJdGVtKHtyb3V0ZXJMaW5rOiByb3V0ZVVybH0pO1xuICAgICAgICBpZiAoZXhpc3RpbmdCcmVhZGNydW1iPy51cGRhdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdCcmVhZGNydW1iO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygcm91dGVCcmVhZGNydW1iID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHVwZGF0ZWQgZXhpc3RpbmcgYnJlYWRjcnVtYlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogcm91dGVVcmwsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHJvdXRlQnJlYWRjcnVtYixcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rOiByb3V0ZVVybFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaW5jbHVkZUhvbWUgJiYgdHlwZW9mIHJvdXRlQnJlYWRjcnVtYi5pc0hvbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgLy8gaG9tZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlQnJlYWRjcnVtYi5yb3V0ZXJMaW5rID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJvdXRlQnJlYWRjcnVtYi5yb3V0ZXJMaW5rID0gcm91dGVVcmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3V0ZUJyZWFkY3J1bWIuaWQgPSByb3V0ZVVybDtcbiAgICAgICAgICAgIHJldHVybiByb3V0ZUJyZWFkY3J1bWI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUSVRMRSBzZWN0aW9uXG5cbiAgICBwdWJsaWMgc2V0UGFnZVRpdGxlKHRpdGxlPzogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjdXJyZW50Um91dGUgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC5yb290O1xuICAgICAgICB3aGlsZSAoY3VycmVudFJvdXRlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSb3V0ZSA9IGN1cnJlbnRSb3V0ZS5maXJzdENoaWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm91dGVEYXRhID0gY3VycmVudFJvdXRlLmRhdGEgYXMgTW5nUm91dGVyRGF0YTtcbiAgICAgICAgY29uc3QgcGFnZVRpdGxlID0gdGl0bGUgPz8gcm91dGVEYXRhLnBhZ2VUaXRsZTtcblxuICAgICAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSh0aGlzLmZvcm1hdFBhZ2VUaXRsZShwYWdlVGl0bGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdFBhZ2VUaXRsZSh0aXRsZVByZWZpeD86IHN0cmluZykge1xuICAgICAgICBjb25zdCB0aXRsZVBpZWNlcyA9IFtdO1xuXG4gICAgICAgIGlmICh0aXRsZVByZWZpeCkge1xuICAgICAgICAgICAgdGl0bGVQaWVjZXMucHVzaCh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHRpdGxlUHJlZml4KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aXRsZVBpZWNlcy5wdXNoKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FwcC5uYW1lJykpO1xuXG4gICAgICAgIHJldHVybiB0aXRsZVBpZWNlcy5qb2luKCcgLSAnKTtcbiAgICB9XG59XG4iXX0=