@mediusinc/mng-commons 3.5.0 → 3.6.0-rc.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 (253) hide show
  1. package/assets/fonts/poppins-v20-latin-500.woff +0 -0
  2. package/assets/fonts/poppins-v20-latin-500.woff2 +0 -0
  3. package/assets/fonts/poppins-v20-latin-600.woff +0 -0
  4. package/assets/fonts/poppins-v20-latin-600.woff2 +0 -0
  5. package/assets/fonts/poppins-v20-latin-700.woff +0 -0
  6. package/assets/fonts/poppins-v20-latin-700.woff2 +0 -0
  7. package/assets/fonts/poppins-v20-latin-regular.woff +0 -0
  8. package/assets/fonts/poppins-v20-latin-regular.woff2 +0 -0
  9. package/assets/i18n/en.json +6 -2
  10. package/assets/i18n/sl.json +6 -2
  11. package/esm2022/lib/api/models/filter-match-type.model.mjs +3 -1
  12. package/esm2022/lib/api/utils/medius-rest.util.mjs +70 -40
  13. package/esm2022/lib/components/action/action.component.mjs +5 -5
  14. package/esm2022/lib/components/action/editor/action-editor.component.mjs +8 -7
  15. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +96 -23
  16. package/esm2022/lib/components/form/date-range/date-range.component.mjs +14 -5
  17. package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +3 -3
  18. package/esm2022/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +2 -2
  19. package/esm2022/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +3 -3
  20. package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +17 -3
  21. package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +16 -4
  22. package/esm2022/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +2 -2
  23. package/esm2022/lib/components/layout/menu-item.component.mjs +3 -3
  24. package/esm2022/lib/components/layout/topbar.component.mjs +2 -2
  25. package/esm2022/lib/components/layoutV2/breadcrumb.component.mjs +30 -0
  26. package/esm2022/lib/components/layoutV2/footer.component.mjs +19 -0
  27. package/esm2022/lib/components/layoutV2/index.mjs +8 -0
  28. package/esm2022/lib/components/layoutV2/main-layout.component.mjs +89 -0
  29. package/esm2022/lib/components/layoutV2/menu-item.component.mjs +229 -0
  30. package/esm2022/lib/components/layoutV2/menu.component.mjs +31 -0
  31. package/esm2022/lib/components/layoutV2/model/index.mjs +3 -0
  32. package/esm2022/lib/components/layoutV2/model/layout-state.model.mjs +2 -0
  33. package/esm2022/lib/components/layoutV2/model/menu.model.mjs +2 -0
  34. package/esm2022/lib/components/layoutV2/services/index.mjs +3 -0
  35. package/esm2022/lib/components/layoutV2/services/main-layout.component.service.mjs +53 -0
  36. package/esm2022/lib/components/layoutV2/services/menu.service.mjs +122 -0
  37. package/esm2022/lib/components/layoutV2/sidebar.component.mjs +54 -0
  38. package/esm2022/lib/components/layoutV2/topbar-user.component.mjs +40 -0
  39. package/esm2022/lib/components/layoutV2/topbar.component.mjs +75 -0
  40. package/esm2022/lib/components/layoutV2/version.component.mjs +63 -0
  41. package/esm2022/lib/components/pages/error/error.page.component.mjs +3 -3
  42. package/esm2022/lib/components/pages/not-found/not-found.page.component.mjs +3 -3
  43. package/esm2022/lib/components/tableview/index.mjs +2 -1
  44. package/esm2022/lib/components/tableview/table/column-filter/column-filter.component.mjs +3 -6
  45. package/esm2022/lib/components/tableview/table/column-filter-full/column-filter-full.component.mjs +471 -0
  46. package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +2 -2
  47. package/esm2022/lib/components/tableview/table/table.component.mjs +24 -16
  48. package/esm2022/lib/components/tableview/tableview.component.mjs +6 -5
  49. package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +131 -34
  50. package/esm2022/lib/descriptors/editor/field.descriptor.mjs +25 -13
  51. package/esm2022/lib/descriptors/table/table.descriptor.mjs +10 -1
  52. package/esm2022/lib/descriptors/types/filter.type.mjs +3 -1
  53. package/esm2022/lib/directives/dialog-keydown-handler.directive.mjs +49 -0
  54. package/esm2022/lib/directives/index.mjs +2 -1
  55. package/esm2022/lib/mng-commons.module.mjs +10 -3
  56. package/esm2022/lib/models/common-init-event-enum.model.mjs +11 -0
  57. package/esm2022/lib/models/config.model.mjs +1 -1
  58. package/esm2022/lib/models/index.mjs +3 -1
  59. package/esm2022/lib/models/menu-config.model.mjs +2 -0
  60. package/esm2022/lib/models/menu.model.mjs +1 -1
  61. package/esm2022/lib/router/route-builder.mjs +55 -16
  62. package/esm2022/lib/router/routes-builder.mjs +9 -1
  63. package/esm2022/lib/services/action-executor.service.mjs +3 -4
  64. package/esm2022/lib/services/commons.service.mjs +26 -4
  65. package/esm2022/lib/services/internal/commons-init.service.mjs +28 -3
  66. package/esm2022/lib/utils/coercion.util.mjs +6 -0
  67. package/esm2022/lib/utils/index.mjs +2 -1
  68. package/esm2022/lib/utils/route.util.mjs +25 -1
  69. package/fesm2022/mediusinc-mng-commons.mjs +1897 -308
  70. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  71. package/lib/api/models/filter-match-type.model.d.ts +3 -1
  72. package/lib/components/action/action.component.d.ts +1 -0
  73. package/lib/components/action/editor/action-editor.component.d.ts +2 -1
  74. package/lib/components/form/autocomplete/autocomplete.component.d.ts +26 -4
  75. package/lib/components/form/date-range/date-range.component.d.ts +4 -1
  76. package/lib/components/layoutV2/breadcrumb.component.d.ts +10 -0
  77. package/lib/components/layoutV2/footer.component.d.ts +8 -0
  78. package/lib/components/layoutV2/index.d.ts +7 -0
  79. package/lib/components/layoutV2/main-layout.component.d.ts +23 -0
  80. package/lib/components/layoutV2/menu-item.component.d.ts +38 -0
  81. package/lib/components/layoutV2/menu.component.d.ts +12 -0
  82. package/lib/components/layoutV2/model/index.d.ts +2 -0
  83. package/lib/components/layoutV2/model/layout-state.model.d.ts +11 -0
  84. package/lib/components/layoutV2/model/menu.model.d.ts +4 -0
  85. package/lib/components/layoutV2/services/index.d.ts +2 -0
  86. package/lib/components/layoutV2/services/main-layout.component.service.d.ts +14 -0
  87. package/lib/components/layoutV2/services/menu.service.d.ts +22 -0
  88. package/lib/components/layoutV2/sidebar.component.d.ts +19 -0
  89. package/lib/components/layoutV2/topbar-user.component.d.ts +16 -0
  90. package/lib/components/layoutV2/topbar.component.d.ts +23 -0
  91. package/lib/components/layoutV2/version.component.d.ts +19 -0
  92. package/lib/components/tableview/index.d.ts +1 -0
  93. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +2 -3
  94. package/lib/components/tableview/table/column-filter-full/column-filter-full.component.d.ts +85 -0
  95. package/lib/components/tableview/table/table.component.d.ts +8 -6
  96. package/lib/descriptors/editor/editor.descriptor.d.ts +139 -42
  97. package/lib/descriptors/editor/field.descriptor.d.ts +35 -30
  98. package/lib/descriptors/table/table.descriptor.d.ts +3 -0
  99. package/lib/descriptors/types/filter.type.d.ts +3 -1
  100. package/lib/directives/dialog-keydown-handler.directive.d.ts +12 -0
  101. package/lib/directives/index.d.ts +1 -0
  102. package/lib/mng-commons.module.d.ts +50 -48
  103. package/lib/models/common-init-event-enum.model.d.ts +9 -0
  104. package/lib/models/config.model.d.ts +9 -8
  105. package/lib/models/index.d.ts +2 -0
  106. package/lib/models/menu-config.model.d.ts +15 -0
  107. package/lib/models/menu.model.d.ts +3 -1
  108. package/lib/router/route-builder.d.ts +21 -3
  109. package/lib/router/routes-builder.d.ts +5 -0
  110. package/lib/services/internal/commons-init.service.d.ts +5 -0
  111. package/lib/utils/coercion.util.d.ts +2 -0
  112. package/lib/utils/index.d.ts +1 -0
  113. package/lib/utils/route.util.d.ts +19 -30
  114. package/package.json +2 -2
  115. package/scss/common/layout/_breadcrumb.scss +0 -1
  116. package/scss/mng-commons-dark-v2.scss +9 -0
  117. package/scss/mng-commons-light-v2.scss +9 -0
  118. package/scss/mng-overrides/_theme_autocomplete.scss +10 -12
  119. package/scss/mng-overrides/_theme_fileupload.scss +24 -0
  120. package/scss/mng-overrides/_theme_styles.scss +1 -0
  121. package/scss/v2/layout/_animation.scss +53 -0
  122. package/scss/v2/layout/_breadcrumb.scss +97 -0
  123. package/scss/v2/layout/_config.scss +42 -0
  124. package/scss/v2/layout/_content.scss +3 -0
  125. package/scss/v2/layout/_fonts.scss +32 -0
  126. package/scss/v2/layout/_layout_dark.scss +12 -0
  127. package/scss/v2/layout/_layout_light.scss +12 -0
  128. package/scss/v2/layout/_main.scss +54 -0
  129. package/scss/v2/layout/_profile.scss +10 -0
  130. package/scss/v2/layout/_responsive.scss +131 -0
  131. package/scss/v2/layout/_sidebar_drawer.scss +283 -0
  132. package/scss/v2/layout/_sidebar_horizontal.scss +168 -0
  133. package/scss/v2/layout/_sidebar_reveal.scss +201 -0
  134. package/scss/v2/layout/_sidebar_slim.scss +157 -0
  135. package/scss/v2/layout/_sidebar_slim_plus.scss +167 -0
  136. package/scss/v2/layout/_sidebar_vertical.scss +176 -0
  137. package/scss/v2/layout/_topbar.scss +174 -0
  138. package/scss/v2/layout/_typography.scss +62 -0
  139. package/scss/v2/layout/_utils.scss +33 -0
  140. package/scss/v2/layout/layout.scss +24 -0
  141. package/scss/v2/layout/mng/_mng_layout_footer.scss +33 -0
  142. package/scss/v2/layout/mng/_mng_layout_menu.scss +10 -0
  143. package/scss/v2/layout/mng/_mng_layout_styles.scss +3 -0
  144. package/scss/v2/layout/mng/_mng_layout_topbar.scss +16 -0
  145. package/scss/v2/layout/preloading.scss +84 -0
  146. package/scss/v2/theme/theme-base/_colors.scss +18 -0
  147. package/scss/v2/theme/theme-base/_common.scss +73 -0
  148. package/scss/v2/theme/theme-base/_components.scss +106 -0
  149. package/scss/v2/theme/theme-base/_mixins.scss +203 -0
  150. package/scss/v2/theme/theme-base/components/button/_button.scss +564 -0
  151. package/scss/v2/theme/theme-base/components/button/_speeddial.scss +86 -0
  152. package/scss/v2/theme/theme-base/components/button/_splitbutton.scss +381 -0
  153. package/scss/v2/theme/theme-base/components/data/_carousel.scss +37 -0
  154. package/scss/v2/theme/theme-base/components/data/_datatable.scss +338 -0
  155. package/scss/v2/theme/theme-base/components/data/_dataview.scss +55 -0
  156. package/scss/v2/theme/theme-base/components/data/_filter.scss +138 -0
  157. package/scss/v2/theme/theme-base/components/data/_fullcalendar.scss +329 -0
  158. package/scss/v2/theme/theme-base/components/data/_orderlist.scss +103 -0
  159. package/scss/v2/theme/theme-base/components/data/_organizationchart.scss +50 -0
  160. package/scss/v2/theme/theme-base/components/data/_paginator.scss +92 -0
  161. package/scss/v2/theme/theme-base/components/data/_picklist.scss +103 -0
  162. package/scss/v2/theme/theme-base/components/data/_timeline.scss +38 -0
  163. package/scss/v2/theme/theme-base/components/data/_tree.scss +149 -0
  164. package/scss/v2/theme/theme-base/components/data/_treetable.scss +256 -0
  165. package/scss/v2/theme/theme-base/components/data/_virtualscroller.scss +28 -0
  166. package/scss/v2/theme/theme-base/components/file/_fileupload.scss +58 -0
  167. package/scss/v2/theme/theme-base/components/input/_autocomplete.scss +117 -0
  168. package/scss/v2/theme/theme-base/components/input/_calendar.scss +263 -0
  169. package/scss/v2/theme/theme-base/components/input/_cascadeselect.scss +130 -0
  170. package/scss/v2/theme/theme-base/components/input/_checkbox.scss +90 -0
  171. package/scss/v2/theme/theme-base/components/input/_chips.scss +54 -0
  172. package/scss/v2/theme/theme-base/components/input/_colorpicker.scss +19 -0
  173. package/scss/v2/theme/theme-base/components/input/_dropdown.scss +135 -0
  174. package/scss/v2/theme/theme-base/components/input/_editor.scss +122 -0
  175. package/scss/v2/theme/theme-base/components/input/_inputgroup.scss +75 -0
  176. package/scss/v2/theme/theme-base/components/input/_inputmask.scss +16 -0
  177. package/scss/v2/theme/theme-base/components/input/_inputnumber.scss +28 -0
  178. package/scss/v2/theme/theme-base/components/input/_inputswitch.scss +60 -0
  179. package/scss/v2/theme/theme-base/components/input/_inputtext.scss +99 -0
  180. package/scss/v2/theme/theme-base/components/input/_listbox.scss +82 -0
  181. package/scss/v2/theme/theme-base/components/input/_multiselect.scss +173 -0
  182. package/scss/v2/theme/theme-base/components/input/_password.scss +52 -0
  183. package/scss/v2/theme/theme-base/components/input/_radiobutton.scss +78 -0
  184. package/scss/v2/theme/theme-base/components/input/_rating.scss +55 -0
  185. package/scss/v2/theme/theme-base/components/input/_selectbutton.scss +50 -0
  186. package/scss/v2/theme/theme-base/components/input/_slider.scss +71 -0
  187. package/scss/v2/theme/theme-base/components/input/_togglebutton.scss +48 -0
  188. package/scss/v2/theme/theme-base/components/input/_treeselect.scss +139 -0
  189. package/scss/v2/theme/theme-base/components/menu/_breadcrumb.scss +42 -0
  190. package/scss/v2/theme/theme-base/components/menu/_contextmenu.scss +61 -0
  191. package/scss/v2/theme/theme-base/components/menu/_dock.scss +86 -0
  192. package/scss/v2/theme/theme-base/components/menu/_megamenu.scss +106 -0
  193. package/scss/v2/theme/theme-base/components/menu/_menu.scss +45 -0
  194. package/scss/v2/theme/theme-base/components/menu/_menubar.scss +188 -0
  195. package/scss/v2/theme/theme-base/components/menu/_panelmenu.scss +140 -0
  196. package/scss/v2/theme/theme-base/components/menu/_slidemenu.scss +64 -0
  197. package/scss/v2/theme/theme-base/components/menu/_steps.scss +56 -0
  198. package/scss/v2/theme/theme-base/components/menu/_tabmenu.scss +74 -0
  199. package/scss/v2/theme/theme-base/components/menu/_tieredmenu.scss +65 -0
  200. package/scss/v2/theme/theme-base/components/messages/_inlinemessage.scss +69 -0
  201. package/scss/v2/theme/theme-base/components/messages/_message.scss +107 -0
  202. package/scss/v2/theme/theme-base/components/messages/_toast.scss +100 -0
  203. package/scss/v2/theme/theme-base/components/misc/_avatar.scss +30 -0
  204. package/scss/v2/theme/theme-base/components/misc/_badge.scss +48 -0
  205. package/scss/v2/theme/theme-base/components/misc/_blockui.scss +0 -0
  206. package/scss/v2/theme/theme-base/components/misc/_chip.scss +38 -0
  207. package/scss/v2/theme/theme-base/components/misc/_inplace.scss +17 -0
  208. package/scss/v2/theme/theme-base/components/misc/_progressbar.scss +17 -0
  209. package/scss/v2/theme/theme-base/components/misc/_scrolltop.scss +25 -0
  210. package/scss/v2/theme/theme-base/components/misc/_skeleton.scss +8 -0
  211. package/scss/v2/theme/theme-base/components/misc/_tag.scss +40 -0
  212. package/scss/v2/theme/theme-base/components/misc/_terminal.scss +11 -0
  213. package/scss/v2/theme/theme-base/components/multimedia/_galleria.scss +149 -0
  214. package/scss/v2/theme/theme-base/components/multimedia/_image.scss +49 -0
  215. package/scss/v2/theme/theme-base/components/overlay/_confirmpopup.scss +72 -0
  216. package/scss/v2/theme/theme-base/components/overlay/_dialog.scss +69 -0
  217. package/scss/v2/theme/theme-base/components/overlay/_overlaypanel.scss +64 -0
  218. package/scss/v2/theme/theme-base/components/overlay/_sidebar.scss +27 -0
  219. package/scss/v2/theme/theme-base/components/overlay/_tooltip.scss +33 -0
  220. package/scss/v2/theme/theme-base/components/panel/_accordion.scss +119 -0
  221. package/scss/v2/theme/theme-base/components/panel/_card.scss +30 -0
  222. package/scss/v2/theme/theme-base/components/panel/_divider.scss +31 -0
  223. package/scss/v2/theme/theme-base/components/panel/_fieldset.scss +47 -0
  224. package/scss/v2/theme/theme-base/components/panel/_panel.scss +58 -0
  225. package/scss/v2/theme/theme-base/components/panel/_scrollpanel.scss +6 -0
  226. package/scss/v2/theme/theme-base/components/panel/_splitter.scss +19 -0
  227. package/scss/v2/theme/theme-base/components/panel/_tabview.scss +78 -0
  228. package/scss/v2/theme/theme-base/components/panel/_toolbar.scss +11 -0
  229. package/scss/v2/theme/theme-base/mng/_mng_mixins.scss +69 -0
  230. package/scss/v2/theme/theme-base/mng/_mng_theme_autocomplete.scss +34 -0
  231. package/scss/v2/theme/theme-base/mng/_mng_theme_button.scss +68 -0
  232. package/scss/v2/theme/theme-base/mng/_mng_theme_datatable.scss +146 -0
  233. package/scss/v2/theme/theme-base/mng/_mng_theme_datepicker.scss +21 -0
  234. package/scss/v2/theme/theme-base/mng/_mng_theme_dialog.scss +206 -0
  235. package/scss/v2/theme/theme-base/mng/_mng_theme_dropdown.scss +22 -0
  236. package/scss/v2/theme/theme-base/mng/_mng_theme_fileupload.scss +24 -0
  237. package/scss/v2/theme/theme-base/mng/_mng_theme_forms.scss +66 -0
  238. package/scss/v2/theme/theme-base/mng/_mng_theme_image.scss +27 -0
  239. package/scss/v2/theme/theme-base/mng/_mng_theme_input.scss +31 -0
  240. package/scss/v2/theme/theme-base/mng/_mng_theme_menu.scss +5 -0
  241. package/scss/v2/theme/theme-base/mng/_mng_theme_multiselect.scss +20 -0
  242. package/scss/v2/theme/theme-base/mng/_mng_theme_styles.scss +17 -0
  243. package/scss/v2/theme/theme-base/mng/_mng_theme_tableview.scss +97 -0
  244. package/scss/v2/theme/theme-base/mng/_mng_theme_tabview.scss +11 -0
  245. package/scss/v2/theme/theme-base/mng/_mng_theme_toast.scss +3 -0
  246. package/scss/v2/theme/theme-base/mng/_mng_theme_toolbar.scss +5 -0
  247. package/scss/v2/theme/theme-base/mng/_mng_variables.scss +15 -0
  248. package/scss/v2/theme/theme-dark/_extensions.scss +100 -0
  249. package/scss/v2/theme/theme-dark/_variables.scss +937 -0
  250. package/scss/v2/theme/theme-dark/blue/theme.scss +13 -0
  251. package/scss/v2/theme/theme-light/_extensions.scss +100 -0
  252. package/scss/v2/theme/theme-light/_variables.scss +937 -0
  253. package/scss/v2/theme/theme-light/blue/theme.scss +13 -0
@@ -0,0 +1,229 @@
1
+ import { animate, state, style, transition, trigger } from '@angular/animations';
2
+ import { AsyncPipe, NgClass, NgForOf, NgIf } from '@angular/common';
3
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, EventEmitter, HostBinding, Injector, Input, Output, ViewChild, inject, runInInjectionContext, signal } from '@angular/core';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { ActivatedRoute, GuardsCheckEnd, NavigationEnd, Router, RouterModule } from '@angular/router';
6
+ import { TranslateModule } from '@ngx-translate/core';
7
+ import { RippleModule } from 'primeng/ripple';
8
+ import { TooltipModule } from 'primeng/tooltip';
9
+ import { BehaviorSubject, Observable, combineLatest, distinctUntilChanged, from, of } from 'rxjs';
10
+ import { first, map } from 'rxjs/operators';
11
+ import { MngAuthorizationService } from '../../security';
12
+ import { MenuService, MngMainLayoutComponentV2Service } from './services';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "primeng/ripple";
15
+ import * as i2 from "@angular/router";
16
+ import * as i3 from "@ngx-translate/core";
17
+ export class MngMenuItemComponent {
18
+ constructor() {
19
+ this.router = inject(Router);
20
+ this.injector = inject(Injector);
21
+ this.destroyRef = inject(DestroyRef);
22
+ this.route = inject(ActivatedRoute);
23
+ this.menuService = inject(MenuService);
24
+ this.authorization = inject(MngAuthorizationService);
25
+ this.layoutService = inject(MngMainLayoutComponentV2Service);
26
+ this.isPermittedSubject = new BehaviorSubject(true);
27
+ this.guardsIsAllowedSubject = new BehaviorSubject(true);
28
+ this.childrenVisibilitySubject = [];
29
+ this.root = false;
30
+ this.visibleChangeEventEmitter = new EventEmitter();
31
+ this.active = signal(false);
32
+ this.visible = signal(false);
33
+ this.guardsIsAllowed$ = this.guardsIsAllowedSubject.asObservable().pipe(distinctUntilChanged());
34
+ this.isPermitted$ = this.isPermittedSubject.asObservable().pipe(distinctUntilChanged());
35
+ this.menuService.menuSource$.pipe(takeUntilDestroyed()).subscribe(value => {
36
+ setTimeout(() => {
37
+ this.active.set(this.item.key === value.key || value.key.startsWith((this.item.key ?? '') + '-'));
38
+ });
39
+ });
40
+ this.menuService.resetSource$.pipe(takeUntilDestroyed()).subscribe(() => {
41
+ this.active.set(false);
42
+ });
43
+ }
44
+ ngOnInit() {
45
+ if (this.item.routerLink) {
46
+ if (typeof this.item.routerLink === 'string') {
47
+ this.itemUrl = this.item.routerLink;
48
+ }
49
+ else {
50
+ this.itemUrl = this.router.parseUrl(this.item.routerLink.join('/'));
51
+ }
52
+ }
53
+ this.routerEventsSubscription = this.router.events.subscribe(next => {
54
+ if (next instanceof GuardsCheckEnd && next.shouldActivate) {
55
+ this.checkIfMenuItemIsAllowedFromGuard(next.state);
56
+ }
57
+ else if (next instanceof NavigationEnd) {
58
+ if (!this.layoutService.isMobile()) {
59
+ this.active.set(false);
60
+ }
61
+ else {
62
+ this.updateActiveStateFromRoute();
63
+ }
64
+ }
65
+ });
66
+ if (this.item.permissions) {
67
+ this.authorization
68
+ .isPermitted(this.item.permissions)
69
+ .pipe(takeUntilDestroyed(this.destroyRef))
70
+ .subscribe({
71
+ next: isPermitted => {
72
+ this.isPermittedSubject.next(isPermitted);
73
+ }
74
+ });
75
+ }
76
+ this.checkIfMenuItemIsAllowedFromGuard(this.router.routerState.snapshot);
77
+ combineLatest([of(this.item.visible !== false), this.isPermitted$, this.guardsIsAllowed$])
78
+ .pipe(takeUntilDestroyed(this.destroyRef))
79
+ .subscribe({
80
+ next: res => {
81
+ const isVisible = res.every(r => r === true);
82
+ this.active.set(!isVisible);
83
+ this.visible.set(isVisible);
84
+ }
85
+ });
86
+ this.processItemChildrenVisibility();
87
+ }
88
+ ngOnDestroy() {
89
+ this.routerEventsSubscription?.unsubscribe();
90
+ this.guardsIsAllowedSubscription?.unsubscribe();
91
+ }
92
+ get submenuAnimation() {
93
+ return this.root ? 'expanded' : this.active() ? 'expanded' : 'collapsed';
94
+ }
95
+ get activeClass() {
96
+ return this.active() && !this.root;
97
+ }
98
+ itemClick(event) {
99
+ // avoid processing disabled items
100
+ if (this.item.disabled) {
101
+ event.preventDefault();
102
+ return;
103
+ }
104
+ // toggle active state
105
+ if (!(this.item.items || this.item.lazyChildren)) {
106
+ if (this.layoutService.isMobile()) {
107
+ this.layoutService.state.staticMenuMobileActive$.next(false);
108
+ }
109
+ }
110
+ }
111
+ onChildVisibleChange(visible, item, idx) {
112
+ this.childrenVisibilitySubject[idx].next(visible);
113
+ }
114
+ checkIfMenuItemIsAllowedFromGuard(routerState) {
115
+ this.guardsIsAllowedSubscription?.unsubscribe();
116
+ if (this.item.guards?.length) {
117
+ const obs = [];
118
+ for (const guard of this.item.guards) {
119
+ if (guard && typeof guard === 'function') {
120
+ const guardFnInstance = guard;
121
+ runInInjectionContext(this.injector, () => {
122
+ const canActivateRes = guardFnInstance(this.route.snapshot, routerState);
123
+ let canActivateObs;
124
+ if (canActivateRes instanceof Observable) {
125
+ canActivateObs = canActivateRes;
126
+ }
127
+ else if (canActivateRes instanceof Promise) {
128
+ canActivateObs = from(canActivateRes);
129
+ }
130
+ else {
131
+ canActivateObs = of(canActivateRes);
132
+ }
133
+ obs.push(canActivateObs.pipe(first(), map(res => res === true) // if url tree is present, that means redirect and implies not allowed
134
+ ));
135
+ });
136
+ }
137
+ }
138
+ this.guardsIsAllowedSubscription = combineLatest(obs)
139
+ .pipe(first())
140
+ .subscribe(next => {
141
+ const result = next.every(n => n === true);
142
+ this.guardsIsAllowedSubject.next(result);
143
+ });
144
+ }
145
+ else {
146
+ this.guardsIsAllowedSubject.next(true);
147
+ }
148
+ }
149
+ updateActiveStateFromRoute() {
150
+ if (this.itemUrl) {
151
+ this.active.set(this.router.isActive(this.itemUrl, {
152
+ matrixParams: 'ignored',
153
+ queryParams: 'ignored',
154
+ paths: this.item.items ? 'subset' : 'exact',
155
+ fragment: 'ignored'
156
+ }));
157
+ }
158
+ else {
159
+ this.active.set(false);
160
+ }
161
+ }
162
+ processItemChildrenVisibility() {
163
+ if (this.item.items) {
164
+ this.childrenVisibilitySubject = this.item.items.map(() => new BehaviorSubject(true));
165
+ combineLatest(this.childrenVisibilitySubject.map(s => s.asObservable().pipe(distinctUntilChanged())))
166
+ .pipe(takeUntilDestroyed(this.destroyRef))
167
+ .subscribe(visible => {
168
+ const anyChildVisible = visible.some(v => v === true);
169
+ this.active.set(!anyChildVisible);
170
+ });
171
+ }
172
+ }
173
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
174
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: MngMenuItemComponent, isStandalone: true, selector: "[mng-menuitem-v2]", inputs: { item: "item", root: "root" }, outputs: { visibleChangeEventEmitter: "visibleChange" }, host: { properties: { "class.layout-root-menuitem": "this.root", "class.active-menuitem": "this.activeClass" } }, viewQueries: [{ propertyName: "submenu", first: true, predicate: ["submenu"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"visible()\">\n <div *ngIf=\"root\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"!item.href && (!item.routerLink || item.items)\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items || item.lazyChildren\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"!item.href && item.routerLink && !item.items\"\n (click)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? '' + (this.active() ? ' active-route' : '')\"\n [preserveFragment]=\"item.preserveFragment\"\n [skipLocationChange]=\"item.skipLocationChange\"\n [replaceUrl]=\"item.replaceUrl\"\n [queryParams]=\"item.queryParams\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items || item.lazyChildren\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.href && !item.items\"\n (click)=\"itemClick($event)\"\n [attr.href]=\"item.href\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items || item.lazyChildren\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n\n <ul #submenu *ngIf=\"item.items\" [@children]=\"submenuAnimation\">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem-v2 [item]=\"child\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, item, i)\"></li>\n </ng-template>\n </ul>\n</ng-container>\n", dependencies: [{ kind: "component", type: MngMenuItemComponent, selector: "[mng-menuitem-v2]", inputs: ["item", "root"], outputs: ["visibleChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i1.Ripple, selector: "[pRipple]" }, { kind: "ngmodule", type: TooltipModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], animations: [
175
+ trigger('children', [
176
+ state('collapsed', style({
177
+ height: '0'
178
+ })),
179
+ state('expanded', style({
180
+ height: '*'
181
+ })),
182
+ state('hidden', style({
183
+ display: 'none'
184
+ })),
185
+ state('visible', style({
186
+ display: 'block'
187
+ })),
188
+ transition('collapsed <=> expanded', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
189
+ ])
190
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
191
+ }
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngMenuItemComponent, decorators: [{
193
+ type: Component,
194
+ args: [{ standalone: true, selector: '[mng-menuitem-v2]', imports: [NgIf, NgClass, RippleModule, TooltipModule, RouterModule, NgForOf, TranslateModule, AsyncPipe], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
195
+ trigger('children', [
196
+ state('collapsed', style({
197
+ height: '0'
198
+ })),
199
+ state('expanded', style({
200
+ height: '*'
201
+ })),
202
+ state('hidden', style({
203
+ display: 'none'
204
+ })),
205
+ state('visible', style({
206
+ display: 'block'
207
+ })),
208
+ transition('collapsed <=> expanded', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
209
+ ])
210
+ ], template: "<ng-container *ngIf=\"visible()\">\n <div *ngIf=\"root\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"!item.href && (!item.routerLink || item.items)\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items || item.lazyChildren\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"!item.href && item.routerLink && !item.items\"\n (click)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? '' + (this.active() ? ' active-route' : '')\"\n [preserveFragment]=\"item.preserveFragment\"\n [skipLocationChange]=\"item.skipLocationChange\"\n [replaceUrl]=\"item.replaceUrl\"\n [queryParams]=\"item.queryParams\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items || item.lazyChildren\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.href && !item.items\"\n (click)=\"itemClick($event)\"\n [attr.href]=\"item.href\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items || item.lazyChildren\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n\n <ul #submenu *ngIf=\"item.items\" [@children]=\"submenuAnimation\">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem-v2 [item]=\"child\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, item, i)\"></li>\n </ng-template>\n </ul>\n</ng-container>\n" }]
211
+ }], ctorParameters: function () { return []; }, propDecorators: { item: [{
212
+ type: Input,
213
+ args: [{ required: true }]
214
+ }], root: [{
215
+ type: Input
216
+ }, {
217
+ type: HostBinding,
218
+ args: ['class.layout-root-menuitem']
219
+ }], visibleChangeEventEmitter: [{
220
+ type: Output,
221
+ args: ['visibleChange']
222
+ }], submenu: [{
223
+ type: ViewChild,
224
+ args: ['submenu']
225
+ }], activeClass: [{
226
+ type: HostBinding,
227
+ args: ['class.active-menuitem']
228
+ }] } });
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXRWMi9tZW51LWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2xheW91dFYyL21lbnUtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixxQkFBcUIsRUFDckIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBQyxjQUFjLEVBQWlCLGNBQWMsRUFBd0IsYUFBYSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStCLE1BQU0saUJBQWlCLENBQUM7QUFFdkssT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBRSxVQUFVLEVBQWdCLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLE1BQU0s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LE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkE2RWhCLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlcn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge0FzeW5jUGlwZSwgTmdDbGFzcywgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbiAgICBydW5JbkluamVjdGlvbkNvbnRleHQsXG4gICAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIENhbkFjdGl2YXRlRm4sIEd1YXJkc0NoZWNrRW5kLCBJc0FjdGl2ZU1hdGNoT3B0aW9ucywgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJNb2R1bGUsIFJvdXRlclN0YXRlU25hcHNob3QsIFVybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7UmlwcGxlTW9kdWxlfSBmcm9tICdwcmltZW5nL3JpcHBsZSc7XG5pbXBvcnQge1Rvb2x0aXBNb2R1bGV9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZnJvbSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TW5nTWVudUl0ZW19IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0F1dGhvcml6YXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi9zZWN1cml0eSc7XG5pbXBvcnQge01lbnVTZXJ2aWNlLCBNbmdNYWluTGF5b3V0Q29tcG9uZW50VjJTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW21uZy1tZW51aXRlbS12Ml0nLFxuICAgIHRlbXBsYXRlVXJsOiAnbWVudS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbTmdJZiwgTmdDbGFzcywgUmlwcGxlTW9kdWxlLCBUb29sdGlwTW9kdWxlLCBSb3V0ZXJNb2R1bGUsIE5nRm9yT2YsIFRyYW5zbGF0ZU1vZHVsZSwgQXN5bmNQaXBlXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIHRyaWdnZXIoJ2NoaWxkcmVuJywgW1xuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ2NvbGxhcHNlZCcsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcwJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ2V4cGFuZGVkJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJyonXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ3Zpc2libGUnLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignY29sbGFwc2VkIDw9PiBleHBhbmRlZCcsIGFuaW1hdGUoJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKScpKVxuICAgICAgICBdKVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTW5nTWVudUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZW51U2VydmljZSA9IGluamVjdChNZW51U2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRob3JpemF0aW9uID0gaW5qZWN0KE1uZ0F1dGhvcml6YXRpb25TZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxheW91dFNlcnZpY2UgPSBpbmplY3QoTW5nTWFpbkxheW91dENvbXBvbmVudFYyU2VydmljZSk7XG5cbiAgICBwcml2YXRlIGlzUGVybWl0dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gICAgcHJpdmF0ZSBpc1Blcm1pdHRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJpdmF0ZSBndWFyZHNJc0FsbG93ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgICBwcml2YXRlIGd1YXJkc0lzQWxsb3dlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJpdmF0ZSBjaGlsZHJlblZpc2liaWxpdHlTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5bXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBpdGVtVXJsPzogc3RyaW5nIHwgVXJsVHJlZTtcblxuICAgIHByaXZhdGUgcm91dGVyRXZlbnRzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgZ3VhcmRzSXNBbGxvd2VkU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIGl0ZW0hOiBNbmdNZW51SXRlbTtcbiAgICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzLmxheW91dC1yb290LW1lbnVpdGVtJykgcm9vdCA9IGZhbHNlO1xuICAgIEBPdXRwdXQoJ3Zpc2libGVDaGFuZ2UnKSB2aXNpYmxlQ2hhbmdlRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQFZpZXdDaGlsZCgnc3VibWVudScpIHN1Ym1lbnUhOiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIGFjdGl2ZSA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHVibGljIHZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkJCA9IHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLmlzUGVybWl0dGVkJCA9IHRoaXMuaXNQZXJtaXR0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgICAgICAgdGhpcy5tZW51U2VydmljZS5tZW51U291cmNlJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUuc2V0KHRoaXMuaXRlbS5rZXkgPT09IHZhbHVlLmtleSB8fCB2YWx1ZS5rZXkuc3RhcnRzV2l0aCgodGhpcy5pdGVtLmtleSA/PyAnJykgKyAnLScpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1lbnVTZXJ2aWNlLnJlc2V0U291cmNlJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUuc2V0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLml0ZW0ucm91dGVyTGluayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1VcmwgPSB0aGlzLml0ZW0ucm91dGVyTGluaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtVXJsID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodGhpcy5pdGVtLnJvdXRlckxpbmsuam9pbignLycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm91dGVyRXZlbnRzU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShuZXh0ID0+IHtcbiAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgR3VhcmRzQ2hlY2tFbmQgJiYgbmV4dC5zaG91bGRBY3RpdmF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJZk1lbnVJdGVtSXNBbGxvd2VkRnJvbUd1YXJkKG5leHQuc3RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5sYXlvdXRTZXJ2aWNlLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0YXRlRnJvbVJvdXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtLnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhvcml6YXRpb25cbiAgICAgICAgICAgICAgICAuaXNQZXJtaXR0ZWQodGhpcy5pdGVtLnBlcm1pc3Npb25zKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiBpc1Blcm1pdHRlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUGVybWl0dGVkU3ViamVjdC5uZXh0KGlzUGVybWl0dGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja0lmTWVudUl0ZW1Jc0FsbG93ZWRGcm9tR3VhcmQodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xuXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW29mKHRoaXMuaXRlbS52aXNpYmxlICE9PSBmYWxzZSksIHRoaXMuaXNQZXJtaXR0ZWQkLCB0aGlzLmd1YXJkc0lzQWxsb3dlZCRdKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1Zpc2libGUgPSByZXMuZXZlcnkociA9PiByID09PSB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUuc2V0KCFpc1Zpc2libGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2libGUuc2V0KGlzVmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzSXRlbUNoaWxkcmVuVmlzaWJpbGl0eSgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnJvdXRlckV2ZW50c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5ndWFyZHNJc0FsbG93ZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHN1Ym1lbnVBbmltYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QgPyAnZXhwYW5kZWQnIDogdGhpcy5hY3RpdmUoKSA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFjdGl2ZS1tZW51aXRlbScpXG4gICAgZ2V0IGFjdGl2ZUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmUoKSAmJiAhdGhpcy5yb290O1xuICAgIH1cblxuICAgIHB1YmxpYyBpdGVtQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIC8vIGF2b2lkIHByb2Nlc3NpbmcgZGlzYWJsZWQgaXRlbXNcbiAgICAgICAgaWYgKHRoaXMuaXRlbS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvZ2dsZSBhY3RpdmUgc3RhdGVcbiAgICAgICAgaWYgKCEodGhpcy5pdGVtLml0ZW1zIHx8IHRoaXMuaXRlbS5sYXp5Q2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRTZXJ2aWNlLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuc3RhdGljTWVudU1vYmlsZUFjdGl2ZSQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25DaGlsZFZpc2libGVDaGFuZ2UodmlzaWJsZTogYm9vbGVhbiwgaXRlbTogTW5nTWVudUl0ZW0sIGlkeDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5WaXNpYmlsaXR5U3ViamVjdFtpZHhdLm5leHQodmlzaWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0lmTWVudUl0ZW1Jc0FsbG93ZWRGcm9tR3VhcmQocm91dGVyU3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpIHtcbiAgICAgICAgdGhpcy5ndWFyZHNJc0FsbG93ZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlmICh0aGlzLml0ZW0uZ3VhcmRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBndWFyZCBvZiB0aGlzLml0ZW0uZ3VhcmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGd1YXJkICYmIHR5cGVvZiBndWFyZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBndWFyZEZuSW5zdGFuY2UgPSBndWFyZCBhcyBDYW5BY3RpdmF0ZUZuO1xuXG4gICAgICAgICAgICAgICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5BY3RpdmF0ZVJlcyA9IGd1YXJkRm5JbnN0YW5jZSh0aGlzLnJvdXRlLnNuYXBzaG90LCByb3V0ZXJTdGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYW5BY3RpdmF0ZU9iczogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuQWN0aXZhdGVSZXMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWN0aXZhdGVPYnMgPSBjYW5BY3RpdmF0ZVJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuQWN0aXZhdGVSZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWN0aXZhdGVPYnMgPSBmcm9tKGNhbkFjdGl2YXRlUmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWN0aXZhdGVPYnMgPSBvZihjYW5BY3RpdmF0ZVJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5BY3RpdmF0ZU9icy5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAocmVzID0+IHJlcyA9PT0gdHJ1ZSkgLy8gaWYgdXJsIHRyZWUgaXMgcHJlc2VudCwgdGhhdCBtZWFucyByZWRpcmVjdCBhbmQgaW1wbGllcyBub3QgYWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3Vic2NyaXB0aW9uID0gY29tYmluZUxhdGVzdChvYnMpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKG5leHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LmV2ZXJ5KG4gPT4gbiA9PT0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3ViamVjdC5uZXh0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmd1YXJkc0lzQWxsb3dlZFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQWN0aXZlU3RhdGVGcm9tUm91dGUoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1VcmwpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlLnNldChcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5pc0FjdGl2ZSh0aGlzLml0ZW1VcmwsIDxJc0FjdGl2ZU1hdGNoT3B0aW9ucz57XG4gICAgICAgICAgICAgICAgICAgIG1hdHJpeFBhcmFtczogJ2lnbm9yZWQnLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogJ2lnbm9yZWQnLFxuICAgICAgICAgICAgICAgICAgICBwYXRoczogdGhpcy5pdGVtLml0ZW1zID8gJ3N1YnNldCcgOiAnZXhhY3QnLFxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudDogJ2lnbm9yZWQnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZS5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzSXRlbUNoaWxkcmVuVmlzaWJpbGl0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlblZpc2liaWxpdHlTdWJqZWN0ID0gdGhpcy5pdGVtLml0ZW1zLm1hcCgoKSA9PiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpKTtcblxuICAgICAgICAgICAgY29tYmluZUxhdGVzdCh0aGlzLmNoaWxkcmVuVmlzaWJpbGl0eVN1YmplY3QubWFwKHMgPT4gcy5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpKSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHZpc2libGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbnlDaGlsZFZpc2libGUgPSB2aXNpYmxlLnNvbWUodiA9PiB2ID09PSB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUuc2V0KCFhbnlDaGlsZFZpc2libGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpc2libGUoKVwiPlxuICAgIDxkaXYgKm5nSWY9XCJyb290XCIgY2xhc3M9XCJsYXlvdXQtbWVudWl0ZW0tcm9vdC10ZXh0XCI+XG4gICAgICAgIHt7IGl0ZW0ubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGFcbiAgICAgICAgKm5nSWY9XCIhaXRlbS5ocmVmICYmICghaXRlbS5yb3V0ZXJMaW5rIHx8IGl0ZW0uaXRlbXMpXCJcbiAgICAgICAgW2F0dHIuaHJlZl09XCJpdGVtLmhyZWZcIlxuICAgICAgICAoY2xpY2spPVwiaXRlbUNsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJpdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICAgIFthdHRyLnRhcmdldF09XCJpdGVtLnRhcmdldFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIjBcIlxuICAgICAgICBbbmdDbGFzc109XCJpdGVtLmNsYXNzTmFtZSA/PyAnJ1wiXG4gICAgICAgIHBSaXBwbGU+XG4gICAgICAgIDxpIFtuZ0NsYXNzXT1cIml0ZW0uaWNvbiA/PyAnJ1wiIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLWljb25cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLXRleHRcIj57eyBpdGVtLmxhYmVsISB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1mdyBwaS1hbmdsZS1kb3duIGxheW91dC1zdWJtZW51LXRvZ2dsZXJcIiAqbmdJZj1cIml0ZW0uaXRlbXMgfHwgaXRlbS5sYXp5Q2hpbGRyZW5cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWVudWl0ZW0tYmFkZ2VcIiAqbmdJZj1cIml0ZW0uYmFkZ2VcIj57eyBpdGVtLmJhZGdlIH19PC9zcGFuPlxuICAgIDwvYT5cbiAgICA8YVxuICAgICAgICAqbmdJZj1cIiFpdGVtLmhyZWYgJiYgaXRlbS5yb3V0ZXJMaW5rICYmICFpdGVtLml0ZW1zXCJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGljaygkZXZlbnQpXCJcbiAgICAgICAgW3JvdXRlckxpbmtdPVwiaXRlbS5yb3V0ZXJMaW5rXCJcbiAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0udGFyZ2V0XCJcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiMFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3NOYW1lID8/ICcnICsgKHRoaXMuYWN0aXZlKCkgPyAnIGFjdGl2ZS1yb3V0ZScgOiAnJylcIlxuICAgICAgICBbcHJlc2VydmVGcmFnbWVudF09XCJpdGVtLnByZXNlcnZlRnJhZ21lbnRcIlxuICAgICAgICBbc2tpcExvY2F0aW9uQ2hhbmdlXT1cIml0ZW0uc2tpcExvY2F0aW9uQ2hhbmdlXCJcbiAgICAgICAgW3JlcGxhY2VVcmxdPVwiaXRlbS5yZXBsYWNlVXJsXCJcbiAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIml0ZW0ucXVlcnlQYXJhbXNcIlxuICAgICAgICBwUmlwcGxlPlxuICAgICAgICA8aSBbbmdDbGFzc109XCJpdGVtLmljb24gPz8gJydcIiBjbGFzcz1cImxheW91dC1tZW51aXRlbS1pY29uXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxheW91dC1tZW51aXRlbS10ZXh0XCI+e3sgaXRlbS5sYWJlbCEgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDxpIGNsYXNzPVwicGkgcGktZncgcGktYW5nbGUtZG93biBsYXlvdXQtc3VibWVudS10b2dnbGVyXCIgKm5nSWY9XCJpdGVtLml0ZW1zIHx8IGl0ZW0ubGF6eUNoaWxkcmVuXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnVpdGVtLWJhZGdlXCIgKm5nSWY9XCJpdGVtLmJhZGdlXCI+e3sgaXRlbS5iYWRnZSB9fTwvc3Bhbj5cbiAgICA8L2E+XG4gICAgPGFcbiAgICAgICAgKm5nSWY9XCJpdGVtLmhyZWYgJiYgIWl0ZW0uaXRlbXNcIlxuICAgICAgICAoY2xpY2spPVwiaXRlbUNsaWNrKCRldmVudClcIlxuICAgICAgICBbYXR0ci5ocmVmXT1cIml0ZW0uaHJlZlwiXG4gICAgICAgIFthdHRyLnRhcmdldF09XCJpdGVtLnRhcmdldFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIjBcIlxuICAgICAgICBbbmdDbGFzc109XCJpdGVtLmNsYXNzTmFtZSA/PyAnJ1wiXG4gICAgICAgIHBSaXBwbGU+XG4gICAgICAgIDxpIFtuZ0NsYXNzXT1cIml0ZW0uaWNvbiA/PyAnJ1wiIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLWljb25cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLXRleHRcIj57eyBpdGVtLmxhYmVsISB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1mdyBwaS1hbmdsZS1kb3duIGxheW91dC1zdWJtZW51LXRvZ2dsZXJcIiAqbmdJZj1cIml0ZW0uaXRlbXMgfHwgaXRlbS5sYXp5Q2hpbGRyZW5cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWVudWl0ZW0tYmFkZ2VcIiAqbmdJZj1cIml0ZW0uYmFkZ2VcIj57eyBpdGVtLmJhZGdlIH19PC9zcGFuPlxuICAgIDwvYT5cblxuICAgIDx1bCAjc3VibWVudSAqbmdJZj1cIml0ZW0uaXRlbXNcIiBbQGNoaWxkcmVuXT1cInN1Ym1lbnVBbmltYXRpb25cIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1jaGlsZCBsZXQtaT1cImluZGV4XCIgW25nRm9yT2ZdPVwiaXRlbS5pdGVtc1wiPlxuICAgICAgICAgICAgPGxpIG1uZy1tZW51aXRlbS12MiBbaXRlbV09XCJjaGlsZFwiIFtjbGFzc109XCJjaGlsZC5iYWRnZUNsYXNzTmFtZVwiICh2aXNpYmxlQ2hhbmdlKT1cIm9uQ2hpbGRWaXNpYmxlQ2hhbmdlKCRldmVudCwgaXRlbSwgaSlcIj48L2xpPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvdWw+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { NgForOf, NgIf } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { ActivatedRoute } from '@angular/router';
4
+ import { MngCommonsService } from '../../services';
5
+ import { MngMenuItemComponent } from './menu-item.component';
6
+ import { MenuService } from './services';
7
+ import * as i0 from "@angular/core";
8
+ export class MngMenuComponent {
9
+ constructor() {
10
+ this.route = inject(ActivatedRoute);
11
+ this.menuService = inject(MenuService);
12
+ this.mngCommons = inject(MngCommonsService);
13
+ this.menuItems = [];
14
+ }
15
+ ngOnInit() {
16
+ if (Array.isArray(this.mngCommons.menuItems)) {
17
+ this.menuItems = [{ items: this.mngCommons.menuItems }];
18
+ }
19
+ else if (Array.isArray(this.route.snapshot.data?.menuItems)) {
20
+ this.menuItems = [{ items: this.route.snapshot.data.menuItems }];
21
+ }
22
+ this.menuService.initialize(this.menuItems);
23
+ }
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: MngMenuComponent, isStandalone: true, selector: "mng-menu-v2", ngImport: i0, template: "<ul class=\"layout-menu\">\n <ng-container *ngFor=\"let item of menuItems\">\n <li mng-menuitem-v2 *ngIf=\"!item.separator\" [item]=\"item\" [root]=\"true\"></li>\n <li *ngIf=\"item.separator\" class=\"menu-separator\"></li>\n </ng-container>\n</ul>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MngMenuItemComponent, selector: "[mng-menuitem-v2]", inputs: ["item", "root"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngMenuComponent, decorators: [{
28
+ type: Component,
29
+ args: [{ standalone: true, selector: 'mng-menu-v2', imports: [NgForOf, NgIf, MngMenuItemComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"layout-menu\">\n <ng-container *ngFor=\"let item of menuItems\">\n <li mng-menuitem-v2 *ngIf=\"!item.separator\" [item]=\"item\" [root]=\"true\"></li>\n <li *ngIf=\"item.separator\" class=\"menu-separator\"></li>\n </ng-container>\n</ul>\n" }]
30
+ }] });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGF5b3V0VjIvbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGF5b3V0VjIvbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUkvQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDOztBQVN2QyxNQUFNLE9BQU8sZ0JBQWdCO0lBUDdCO1FBUXFCLFVBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWpELGNBQVMsR0FBdUIsRUFBRSxDQUFDO0tBVzdDO0lBVEcsUUFBUTtRQUNKLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBQyxDQUFDLENBQUM7U0FDekQ7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBa0MsRUFBRSxTQUFTLENBQUMsRUFBRTtZQUMxRixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBQyxLQUFLLEVBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBc0IsQ0FBQyxTQUFVLEVBQUMsQ0FBQyxDQUFDO1NBQ3RGO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7OEdBZlEsZ0JBQWdCO2tHQUFoQixnQkFBZ0IsdUVDakI3QixpUkFNQSw0Q0RPYyxPQUFPLG1IQUFFLElBQUksNkZBQUUsb0JBQW9COzsyRkFJcEMsZ0JBQWdCO2tCQVA1QixTQUFTO2lDQUNNLElBQUksWUFDTixhQUFhLFdBQ2QsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixDQUFDLG1CQUU3Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ0Zvck9mLCBOZ0lmfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQsIGluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge01uZ01lbnVJdGVtfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdSb3V0ZXJEYXRhfSBmcm9tICcuLi8uLi9yb3V0ZXIvbW9kZWxzJztcbmltcG9ydCB7TW5nQ29tbW9uc1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7TW5nTWVudUl0ZW1Db21wb25lbnR9IGZyb20gJy4vbWVudS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQge01lbnVTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1tZW51LXYyJyxcbiAgICBpbXBvcnRzOiBbTmdGb3JPZiwgTmdJZiwgTW5nTWVudUl0ZW1Db21wb25lbnRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNbmdNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbnVTZXJ2aWNlID0gaW5qZWN0KE1lbnVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1uZ0NvbW1vbnMgPSBpbmplY3QoTW5nQ29tbW9uc1NlcnZpY2UpO1xuXG4gICAgcHVibGljIG1lbnVJdGVtczogQXJyYXk8TW5nTWVudUl0ZW0+ID0gW107XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tbmdDb21tb25zLm1lbnVJdGVtcykpIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zID0gW3tpdGVtczogdGhpcy5tbmdDb21tb25zLm1lbnVJdGVtc31dO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoKHRoaXMucm91dGUuc25hcHNob3QuZGF0YSBhcyBNbmdSb3V0ZXJEYXRhIHwgdW5kZWZpbmVkKT8ubWVudUl0ZW1zKSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBbe2l0ZW1zOiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhIGFzIE1uZ1JvdXRlckRhdGEpLm1lbnVJdGVtcyF9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVudVNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLm1lbnVJdGVtcyk7XG4gICAgfVxufVxuIiwiPHVsIGNsYXNzPVwibGF5b3V0LW1lbnVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1lbnVJdGVtc1wiPlxuICAgICAgICA8bGkgbW5nLW1lbnVpdGVtLXYyICpuZ0lmPVwiIWl0ZW0uc2VwYXJhdG9yXCIgW2l0ZW1dPVwiaXRlbVwiIFtyb290XT1cInRydWVcIj48L2xpPlxuICAgICAgICA8bGkgKm5nSWY9XCJpdGVtLnNlcGFyYXRvclwiIGNsYXNzPVwibWVudS1zZXBhcmF0b3JcIj48L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC91bD5cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './menu.model';
2
+ export * from './layout-state.model';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGF5b3V0VjIvbW9kZWwvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbWVudS5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2xheW91dC1zdGF0ZS5tb2RlbCc7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LXN0YXRlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2xheW91dFYyL21vZGVsL2xheW91dC1zdGF0ZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFN0YXRlIHtcbiAgICBzdGF0aWNNZW51RGVza3RvcEluYWN0aXZlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgIG92ZXJsYXlNZW51QWN0aXZlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgIHJpZ2h0TWVudUFjdGl2ZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICBjb25maWdTaWRlYmFyVmlzaWJsZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICBzdGF0aWNNZW51TW9iaWxlQWN0aXZlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgIG1lbnVIb3ZlckFjdGl2ZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICBzaWRlYmFyQWN0aXZlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgIGFuY2hvcmVkJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXRWMi9tb2RlbC9tZW51Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE1lbnVDaGFuZ2VFdmVudCB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgcm91dGVFdmVudD86IGJvb2xlYW47XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './main-layout.component.service';
2
+ export * from './menu.service';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGF5b3V0VjIvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9tYWluLWxheW91dC5jb21wb25lbnQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL21lbnUuc2VydmljZSc7XG4iXX0=
@@ -0,0 +1,53 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { BehaviorSubject, Subject } from 'rxjs';
3
+ import { MNG_MODULE_CONFIG_IT } from '../../../services/tokens';
4
+ import * as i0 from "@angular/core";
5
+ export class MngMainLayoutComponentV2Service {
6
+ constructor() {
7
+ this.config = inject(MNG_MODULE_CONFIG_IT);
8
+ this.state = {
9
+ staticMenuDesktopInactive$: new BehaviorSubject(false),
10
+ overlayMenuActive$: new BehaviorSubject(false),
11
+ rightMenuActive$: new BehaviorSubject(false),
12
+ configSidebarVisible$: new BehaviorSubject(false),
13
+ staticMenuMobileActive$: new BehaviorSubject(false),
14
+ menuHoverActive$: new BehaviorSubject(false),
15
+ sidebarActive$: new BehaviorSubject(false),
16
+ anchored$: new BehaviorSubject(false)
17
+ };
18
+ this.overlayOpen = new Subject();
19
+ this.overlayOpen$ = this.overlayOpen.asObservable();
20
+ }
21
+ onMenuToggle() {
22
+ if (this.isOverlay()) {
23
+ this.state.overlayMenuActive$.next(!this.state.overlayMenuActive$.value);
24
+ if (this.state.overlayMenuActive$.value) {
25
+ this.overlayOpen.next(null);
26
+ }
27
+ }
28
+ if (this.isDesktop()) {
29
+ this.state.staticMenuDesktopInactive$.next(!this.state.staticMenuDesktopInactive$.value);
30
+ }
31
+ else {
32
+ this.state.staticMenuMobileActive$.next(!this.state.staticMenuMobileActive$.value);
33
+ if (this.state.staticMenuMobileActive$.value) {
34
+ this.overlayOpen.next(null);
35
+ }
36
+ }
37
+ }
38
+ isOverlay() {
39
+ return this.config.menuV2?.mode === 'overlay';
40
+ }
41
+ isDesktop() {
42
+ return window.innerWidth > 991;
43
+ }
44
+ isMobile() {
45
+ return !this.isDesktop();
46
+ }
47
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngMainLayoutComponentV2Service, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
48
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngMainLayoutComponentV2Service }); }
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngMainLayoutComponentV2Service, decorators: [{
51
+ type: Injectable
52
+ }] });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1sYXlvdXQuY29tcG9uZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGF5b3V0VjIvc2VydmljZXMvbWFpbi1sYXlvdXQuY29tcG9uZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBSTlELE1BQU0sT0FBTywrQkFBK0I7SUFENUM7UUFFWSxXQUFNLEdBQW9CLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXhELFVBQUssR0FBZ0I7WUFDeEIsMEJBQTBCLEVBQUUsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDO1lBQy9ELGtCQUFrQixFQUFFLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQztZQUN2RCxnQkFBZ0IsRUFBRSxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUM7WUFDckQscUJBQXFCLEVBQUUsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDO1lBQzFELHVCQUF1QixFQUFFLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQztZQUM1RCxnQkFBZ0IsRUFBRSxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUM7WUFDckQsY0FBYyxFQUFFLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQztZQUNuRCxTQUFTLEVBQUUsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDO1NBQ2pELENBQUM7UUFFTSxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDbEMsaUJBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0tBaUN6RDtJQS9CRyxZQUFZO1FBQ1IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXpFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9CO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUY7YUFBTTtZQUNILElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVuRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFO2dCQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQjtTQUNKO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO0lBQ25DLENBQUM7SUFFRCxRQUFRO1FBQ0osT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM3QixDQUFDOzhHQS9DUSwrQkFBK0I7a0hBQS9CLCtCQUErQjs7MkZBQS9CLCtCQUErQjtrQkFEM0MsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgaW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge01uZ01vZHVsZUNvbmZpZ30gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7TU5HX01PRFVMRV9DT05GSUdfSVR9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3Rva2Vucyc7XG5pbXBvcnQge0xheW91dFN0YXRlfSBmcm9tICcuLi9tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNbmdNYWluTGF5b3V0Q29tcG9uZW50VjJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGNvbmZpZzogTW5nTW9kdWxlQ29uZmlnID0gaW5qZWN0KE1OR19NT0RVTEVfQ09ORklHX0lUKTtcblxuICAgIHB1YmxpYyBzdGF0ZTogTGF5b3V0U3RhdGUgPSB7XG4gICAgICAgIHN0YXRpY01lbnVEZXNrdG9wSW5hY3RpdmUkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgICAgb3ZlcmxheU1lbnVBY3RpdmUkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgICAgcmlnaHRNZW51QWN0aXZlJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICAgIGNvbmZpZ1NpZGViYXJWaXNpYmxlJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICAgIHN0YXRpY01lbnVNb2JpbGVBY3RpdmUkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgICAgbWVudUhvdmVyQWN0aXZlJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICAgIHNpZGViYXJBY3RpdmUkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgICAgYW5jaG9yZWQkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuICAgIH07XG5cbiAgICBwcml2YXRlIG92ZXJsYXlPcGVuID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHB1YmxpYyBvdmVybGF5T3BlbiQgPSB0aGlzLm92ZXJsYXlPcGVuLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgb25NZW51VG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5pc092ZXJsYXkoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5vdmVybGF5TWVudUFjdGl2ZSQubmV4dCghdGhpcy5zdGF0ZS5vdmVybGF5TWVudUFjdGl2ZSQudmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5vdmVybGF5TWVudUFjdGl2ZSQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlPcGVuLm5leHQobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0Rlc2t0b3AoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zdGF0aWNNZW51RGVza3RvcEluYWN0aXZlJC5uZXh0KCF0aGlzLnN0YXRlLnN0YXRpY01lbnVEZXNrdG9wSW5hY3RpdmUkLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhdGljTWVudU1vYmlsZUFjdGl2ZSQubmV4dCghdGhpcy5zdGF0ZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlJC52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmUkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5T3Blbi5uZXh0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNPdmVybGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubWVudVYyPy5tb2RlID09PSAnb3ZlcmxheSc7XG4gICAgfVxuXG4gICAgaXNEZXNrdG9wKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPiA5OTE7XG4gICAgfVxuXG4gICAgaXNNb2JpbGUoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0Rlc2t0b3AoKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,122 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { NavigationEnd, Router } from '@angular/router';
3
+ import { ReplaySubject, Subject, take } from 'rxjs';
4
+ import { filter } from 'rxjs/operators';
5
+ import { MngLoggerService, MngRouterService } from '../../../services';
6
+ import { RouteUtil } from '../../../utils/route.util';
7
+ import * as i0 from "@angular/core";
8
+ export class MenuService {
9
+ constructor() {
10
+ this.logger = MngLoggerService.create('MenuService');
11
+ this.router = inject(Router);
12
+ this.mngRouter = inject(MngRouterService);
13
+ this.menuSource = new ReplaySubject(1);
14
+ this.resetSource = new Subject();
15
+ this.menuSource$ = this.menuSource.asObservable();
16
+ this.resetSource$ = this.resetSource.asObservable();
17
+ this.menuItems = [];
18
+ this.routeLoadedChildrenSubscriptions = [];
19
+ }
20
+ initialize(menuItems) {
21
+ this.menuItems = menuItems;
22
+ this.routeLoadedChildrenSubscriptions.forEach(s => s.unsubscribe());
23
+ this.routeLoadedChildrenSubscriptions = [];
24
+ this.generateMenuItemKeys(menuItems);
25
+ this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(e => {
26
+ this.findAndSetActiveMenuItem(e.urlAfterRedirects);
27
+ });
28
+ this.findAndSetActiveMenuItem(this.router.url);
29
+ }
30
+ generateMenuItemKeys(menuItems, parentKey = '') {
31
+ menuItems.forEach((item, idx) => {
32
+ if (!item.index) {
33
+ item.index = idx;
34
+ item.key = parentKey ? parentKey + '-' + idx : idx.toString();
35
+ }
36
+ if (item.items) {
37
+ this.generateMenuItemKeys(item.items, item.key);
38
+ }
39
+ else if (item.lazyChildren) {
40
+ this.listenToMenuItemLazyChildrenLoad(item);
41
+ }
42
+ });
43
+ }
44
+ findAndSetActiveMenuItem(url) {
45
+ const matches = this.findActiveRouteMatches(this.menuItems, url);
46
+ if (matches.length === 0) {
47
+ this.reset();
48
+ }
49
+ else {
50
+ const matchKey = matches[0][matches[0].length - 1].key;
51
+ if (matchKey) {
52
+ this.menuSource.next({
53
+ key: matchKey,
54
+ routeEvent: true
55
+ });
56
+ }
57
+ else {
58
+ this.logger.warn(`Found active menu item for url ${url}, but item key is not present`, matches);
59
+ this.reset();
60
+ }
61
+ if (matches.length > 1) {
62
+ this.logger.warn(`Multiple active menu items found for url ${url}`, matches);
63
+ }
64
+ }
65
+ }
66
+ listenToMenuItemLazyChildrenLoad(menuItem) {
67
+ this.routeLoadedChildrenSubscriptions.push(this.mngRouter
68
+ .getRouteLoadedChildren$(menuItem.routerLink ?? '/')
69
+ .pipe(take(1))
70
+ .subscribe({
71
+ next: routes => {
72
+ let menuItems = routes.filter(r => Array.isArray(r.data?.menuItems)).flatMap(r => r.data.menuItems);
73
+ menuItems = RouteUtil.adjustMenuLazyChildrenRouterLinks(menuItem, menuItems);
74
+ menuItem.items = menuItems;
75
+ menuItem.lazyChildren = false;
76
+ this.generateMenuItemKeys(menuItem.items, menuItem.key);
77
+ this.findAndSetActiveMenuItem(this.router.url);
78
+ }
79
+ }));
80
+ }
81
+ findActiveRouteMatches(menuItems, url) {
82
+ const matches = [];
83
+ for (const menuItem of menuItems) {
84
+ if (menuItem.routerLink) {
85
+ const isActive = RouteUtil.doesUrlMatchRouterLink(menuItem.routerLink, url);
86
+ if (isActive) {
87
+ if (Array.isArray(menuItem.items)) {
88
+ const itemsMatches = this.findActiveRouteMatches(menuItem.items, url);
89
+ if (itemsMatches.length > 0) {
90
+ matches.push(...itemsMatches.map(c => [menuItem, ...c]));
91
+ }
92
+ else {
93
+ matches.push([menuItem]);
94
+ }
95
+ }
96
+ else {
97
+ matches.push([menuItem]);
98
+ }
99
+ }
100
+ }
101
+ else if (Array.isArray(menuItem.items)) {
102
+ const itemsMatches = this.findActiveRouteMatches(menuItem.items, url);
103
+ if (itemsMatches.length > 0) {
104
+ matches.push(...itemsMatches.map(c => [menuItem, ...c]));
105
+ }
106
+ }
107
+ }
108
+ return matches;
109
+ }
110
+ reset() {
111
+ this.resetSource.next(true);
112
+ }
113
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
114
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MenuService, providedIn: 'root' }); }
115
+ }
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MenuService, decorators: [{
117
+ type: Injectable,
118
+ args: [{
119
+ providedIn: 'root'
120
+ }]
121
+ }] });
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2xheW91dFYyL3NlcnZpY2VzL21lbnUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsYUFBYSxFQUFFLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRELE9BQU8sRUFBQyxhQUFhLEVBQUUsT0FBTyxFQUFnQixJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSXRDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQzs7QUFNcEQsTUFBTSxPQUFPLFdBQVc7SUFIeEI7UUFJcUIsV0FBTSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyQyxlQUFVLEdBQUcsSUFBSSxhQUFhLENBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ25ELGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUU3QyxnQkFBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0MsaUJBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXZDLGNBQVMsR0FBdUIsRUFBRSxDQUFDO1FBQ25DLHFDQUFnQyxHQUFtQixFQUFFLENBQUM7S0F3R2pFO0lBdEdHLFVBQVUsQ0FBQyxTQUE2QjtRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUUzQixJQUFJLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLEVBQUUsQ0FBQztRQUUzQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNuRixJQUFJLENBQUMsd0JBQXdCLENBQUUsQ0FBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFNBQTZCLEVBQUUsU0FBUyxHQUFHLEVBQUU7UUFDdEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDYixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDakU7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ25EO2lCQUFNLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9DO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sd0JBQXdCLENBQUMsR0FBVztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQjthQUFNO1lBQ0gsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3ZELElBQUksUUFBUSxFQUFFO2dCQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO29CQUNqQixHQUFHLEVBQUUsUUFBUTtvQkFDYixVQUFVLEVBQUUsSUFBSTtpQkFDbkIsQ0FBQyxDQUFDO2FBQ047aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEdBQUcsK0JBQStCLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNoQjtZQUVELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNoRjtTQUNKO0lBQ0wsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLFFBQXFCO1FBQzFELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQ3RDLElBQUksQ0FBQyxTQUFTO2FBQ1QsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUM7YUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FBQztZQUNQLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFDWCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBRSxDQUFDLENBQUMsSUFBa0MsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQUMsQ0FBQyxJQUFzQixDQUFDLFNBQVUsQ0FBQyxDQUFDO2dCQUN2SixTQUFTLEdBQUcsU0FBUyxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFN0UsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQzNCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUU5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUM7U0FDSixDQUFDLENBQ1QsQ0FBQztJQUNOLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxTQUE2QixFQUFFLEdBQVc7UUFDckUsTUFBTSxPQUFPLEdBQW9CLEVBQUUsQ0FBQztRQUNwQyxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRTtZQUM5QixJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLFFBQVEsRUFBRTtvQkFDVixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUMvQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDdEUsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDNUQ7NkJBQU07NEJBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7eUJBQzVCO3FCQUNKO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3FCQUM1QjtpQkFDSjthQUNKO2lCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM1RDthQUNKO1NBQ0o7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7OEdBbEhRLFdBQVc7a0hBQVgsV0FBVyxjQUZSLE1BQU07OzJGQUVULFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBpbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOYXZpZ2F0aW9uRW5kLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7UmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TW5nTWVudUl0ZW19IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ1JvdXRlckRhdGF9IGZyb20gJy4uLy4uLy4uL3JvdXRlci9tb2RlbHMnO1xuaW1wb3J0IHtNbmdMb2dnZXJTZXJ2aWNlLCBNbmdSb3V0ZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1JvdXRlVXRpbH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcm91dGUudXRpbCc7XG5pbXBvcnQge01lbnVDaGFuZ2VFdmVudH0gZnJvbSAnLi4vbW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE1lbnVTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IE1uZ0xvZ2dlclNlcnZpY2UuY3JlYXRlKCdNZW51U2VydmljZScpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtbmdSb3V0ZXIgPSBpbmplY3QoTW5nUm91dGVyU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZW51U291cmNlID0gbmV3IFJlcGxheVN1YmplY3Q8TWVudUNoYW5nZUV2ZW50PigxKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2V0U291cmNlID0gbmV3IFN1YmplY3QoKTtcblxuICAgIG1lbnVTb3VyY2UkID0gdGhpcy5tZW51U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHJlc2V0U291cmNlJCA9IHRoaXMucmVzZXRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIG1lbnVJdGVtczogQXJyYXk8TW5nTWVudUl0ZW0+ID0gW107XG4gICAgcHJpdmF0ZSByb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIGluaXRpYWxpemUobWVudUl0ZW1zOiBBcnJheTxNbmdNZW51SXRlbT4pIHtcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBtZW51SXRlbXM7XG5cbiAgICAgICAgdGhpcy5yb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5yb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9ucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVNZW51SXRlbUtleXMobWVudUl0ZW1zKTtcblxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSkuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5maW5kQW5kU2V0QWN0aXZlTWVudUl0ZW0oKGUgYXMgTmF2aWdhdGlvbkVuZCkudXJsQWZ0ZXJSZWRpcmVjdHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh0aGlzLnJvdXRlci51cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVNZW51SXRlbUtleXMobWVudUl0ZW1zOiBBcnJheTxNbmdNZW51SXRlbT4sIHBhcmVudEtleSA9ICcnKSB7XG4gICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uaW5kZXggPSBpZHg7XG4gICAgICAgICAgICAgICAgaXRlbS5rZXkgPSBwYXJlbnRLZXkgPyBwYXJlbnRLZXkgKyAnLScgKyBpZHggOiBpZHgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlTWVudUl0ZW1LZXlzKGl0ZW0uaXRlbXMsIGl0ZW0ua2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5sYXp5Q2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlblRvTWVudUl0ZW1MYXp5Q2hpbGRyZW5Mb2FkKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh1cmw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKHRoaXMubWVudUl0ZW1zLCB1cmwpO1xuICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gbWF0Y2hlc1swXVttYXRjaGVzWzBdLmxlbmd0aCAtIDFdLmtleTtcbiAgICAgICAgICAgIGlmIChtYXRjaEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVudVNvdXJjZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBtYXRjaEtleSxcbiAgICAgICAgICAgICAgICAgICAgcm91dGVFdmVudDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBGb3VuZCBhY3RpdmUgbWVudSBpdGVtIGZvciB1cmwgJHt1cmx9LCBidXQgaXRlbSBrZXkgaXMgbm90IHByZXNlbnRgLCBtYXRjaGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBNdWx0aXBsZSBhY3RpdmUgbWVudSBpdGVtcyBmb3VuZCBmb3IgdXJsICR7dXJsfWAsIG1hdGNoZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaXN0ZW5Ub01lbnVJdGVtTGF6eUNoaWxkcmVuTG9hZChtZW51SXRlbTogTW5nTWVudUl0ZW0pIHtcbiAgICAgICAgdGhpcy5yb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5tbmdSb3V0ZXJcbiAgICAgICAgICAgICAgICAuZ2V0Um91dGVMb2FkZWRDaGlsZHJlbiQobWVudUl0ZW0ucm91dGVyTGluayA/PyAnLycpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogcm91dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZW51SXRlbXMgPSByb3V0ZXMuZmlsdGVyKHIgPT4gQXJyYXkuaXNBcnJheSgoci5kYXRhIGFzIE1uZ1JvdXRlckRhdGEgfCB1bmRlZmluZWQpPy5tZW51SXRlbXMpKS5mbGF0TWFwKHIgPT4gKHIuZGF0YSBhcyBNbmdSb3V0ZXJEYXRhKS5tZW51SXRlbXMhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtcyA9IFJvdXRlVXRpbC5hZGp1c3RNZW51TGF6eUNoaWxkcmVuUm91dGVyTGlua3MobWVudUl0ZW0sIG1lbnVJdGVtcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtLml0ZW1zID0gbWVudUl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0ubGF6eUNoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNZW51SXRlbUtleXMobWVudUl0ZW0uaXRlbXMsIG1lbnVJdGVtLmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh0aGlzLnJvdXRlci51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBY3RpdmVSb3V0ZU1hdGNoZXMobWVudUl0ZW1zOiBBcnJheTxNbmdNZW51SXRlbT4sIHVybDogc3RyaW5nKTogTW5nTWVudUl0ZW1bXVtdIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlczogTW5nTWVudUl0ZW1bXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVudUl0ZW0gb2YgbWVudUl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWVudUl0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gUm91dGVVdGlsLmRvZXNVcmxNYXRjaFJvdXRlckxpbmsobWVudUl0ZW0ucm91dGVyTGluaywgdXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVudUl0ZW0uaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtc01hdGNoZXMgPSB0aGlzLmZpbmRBY3RpdmVSb3V0ZU1hdGNoZXMobWVudUl0ZW0uaXRlbXMsIHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXNNYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goLi4uaXRlbXNNYXRjaGVzLm1hcChjID0+IFttZW51SXRlbSwgLi4uY10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKFttZW51SXRlbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKFttZW51SXRlbV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1lbnVJdGVtLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zTWF0Y2hlcyA9IHRoaXMuZmluZEFjdGl2ZVJvdXRlTWF0Y2hlcyhtZW51SXRlbS5pdGVtcywgdXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbXNNYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKC4uLml0ZW1zTWF0Y2hlcy5tYXAoYyA9PiBbbWVudUl0ZW0sIC4uLmNdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnJlc2V0U291cmNlLm5leHQodHJ1ZSk7XG4gICAgfVxufVxuIl19