aril 1.2.18 → 2.0.1-dev.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 (122) hide show
  1. package/boot/bridge/src/mfe-bridge.d.ts +42 -2
  2. package/boot/config/apps/index.d.ts +7 -1
  3. package/boot/config/apps/src/custom-reuse-outlet.component.d.ts +37 -0
  4. package/boot/config/apps/src/custom-route-reuse-strategy.class.d.ts +156 -0
  5. package/boot/config/apps/src/nav-link-context-menu.service.d.ts +33 -0
  6. package/boot/config/apps/src/nav-link.directive.d.ts +29 -0
  7. package/boot/config/apps/src/nav.service.d.ts +198 -0
  8. package/boot/config/apps/src/route-close.service.d.ts +9 -0
  9. package/boot/config/apps/src/safe-navigate.d.ts +17 -0
  10. package/boot/config/apps/src/tab-aware-url-serializer.d.ts +22 -0
  11. package/boot/config/plugins/src/getNgZone.d.ts +9 -1
  12. package/boot/mfe/src/app.component.d.ts +15 -4
  13. package/boot/mfe/src/isolated-location-strategy.d.ts +57 -0
  14. package/esm2022/boot/bridge/src/mfe-bridge.mjs +36 -5
  15. package/esm2022/boot/config/api/src/api.service.mjs +12 -3
  16. package/esm2022/boot/config/apps/index.mjs +8 -2
  17. package/esm2022/boot/config/apps/src/apps.service.mjs +14 -6
  18. package/esm2022/boot/config/apps/src/custom-reuse-outlet.component.mjs +207 -0
  19. package/esm2022/boot/config/apps/src/custom-route-reuse-strategy.class.mjs +540 -0
  20. package/esm2022/boot/config/apps/src/nav-link-context-menu.service.mjs +105 -0
  21. package/esm2022/boot/config/apps/src/nav-link.directive.mjs +45 -0
  22. package/esm2022/boot/config/apps/src/nav.service.mjs +675 -0
  23. package/esm2022/boot/config/apps/src/route-close.service.mjs +19 -0
  24. package/esm2022/boot/config/apps/src/safe-navigate.mjs +50 -0
  25. package/esm2022/boot/config/apps/src/tab-aware-url-serializer.mjs +50 -0
  26. package/esm2022/boot/config/plugins/src/getNgZone.mjs +13 -5
  27. package/esm2022/boot/host/src/app.component.mjs +1 -2
  28. package/esm2022/boot/host/src/bootstrap.mjs +22 -7
  29. package/esm2022/boot/mfe/src/app.component.mjs +143 -39
  30. package/esm2022/boot/mfe/src/bootstrap.mjs +197 -20
  31. package/esm2022/boot/mfe/src/isolated-location-strategy.mjs +142 -0
  32. package/esm2022/keycloak/src/auth.interceptor.mjs +17 -2
  33. package/esm2022/provider/src/prodiveHost.mjs +3 -5
  34. package/esm2022/provider/src/prodiveHostRouter.mjs +88 -9
  35. package/esm2022/theme/layout/app/expandableMenu/expandable-menu.component.mjs +81 -19
  36. package/esm2022/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.mjs +6 -4
  37. package/esm2022/theme/layout/app/general-search/general-search.component.mjs +4 -4
  38. package/esm2022/theme/layout/app/history/history-sidebar.component.mjs +6 -4
  39. package/esm2022/theme/layout/app/layout/app.layout.component.mjs +422 -20
  40. package/esm2022/theme/layout/app/layout/mfe.layout.component.mjs +22 -35
  41. package/esm2022/theme/layout/app/site-map/site-map-sidebar.component.mjs +6 -4
  42. package/esm2022/theme/layout/app/static-sidebar/static-sidebar.component.mjs +85 -27
  43. package/esm2022/theme/layout/app/topbar/app.topbar.component.mjs +3 -3
  44. package/esm2022/theme/layout/service/breadcrumb-publisher.service.mjs +86 -0
  45. package/esm2022/theme/layout/service/tab-session.service.mjs +126 -0
  46. package/esm2022/ui-business/ref-value/src/ref-value.component.mjs +15 -7
  47. package/esm2022/util/sync-active-tab-route/src/sync-active-tab-route.directive.mjs +29 -9
  48. package/fesm2022/aril-app.component-s14ruALV.mjs +183 -0
  49. package/fesm2022/aril-app.component-s14ruALV.mjs.map +1 -0
  50. package/fesm2022/aril-boot-bridge.mjs +35 -4
  51. package/fesm2022/aril-boot-bridge.mjs.map +1 -1
  52. package/fesm2022/aril-boot-config-api.mjs +11 -2
  53. package/fesm2022/aril-boot-config-api.mjs.map +1 -1
  54. package/fesm2022/aril-boot-config-apps.mjs +1678 -10
  55. package/fesm2022/aril-boot-config-apps.mjs.map +1 -1
  56. package/fesm2022/aril-boot-config-plugins.mjs +12 -4
  57. package/fesm2022/aril-boot-config-plugins.mjs.map +1 -1
  58. package/fesm2022/aril-boot-host.mjs +21 -7
  59. package/fesm2022/aril-boot-host.mjs.map +1 -1
  60. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs +183 -0
  61. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs.map +1 -0
  62. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs +631 -0
  63. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs.map +1 -0
  64. package/fesm2022/aril-boot-mfe.mjs +5 -3
  65. package/fesm2022/aril-boot-mfe.mjs.map +1 -1
  66. package/fesm2022/aril-keycloak.mjs +16 -1
  67. package/fesm2022/aril-keycloak.mjs.map +1 -1
  68. package/fesm2022/aril-provider.mjs +90 -12
  69. package/fesm2022/aril-provider.mjs.map +1 -1
  70. package/fesm2022/aril-theme-layout.mjs +2628 -2017
  71. package/fesm2022/aril-theme-layout.mjs.map +1 -1
  72. package/fesm2022/aril-ui-business-ref-value.mjs +14 -6
  73. package/fesm2022/aril-ui-business-ref-value.mjs.map +1 -1
  74. package/fesm2022/aril-util-sync-active-tab-route.mjs +28 -8
  75. package/fesm2022/aril-util-sync-active-tab-route.mjs.map +1 -1
  76. package/fesm2022/aril.mjs +354 -25
  77. package/fesm2022/aril.mjs.map +1 -1
  78. package/keycloak/src/auth.interceptor.d.ts +7 -0
  79. package/package.json +222 -222
  80. package/provider/src/prodiveHost.d.ts +1 -0
  81. package/theme/layout/app/expandableMenu/expandable-menu.component.d.ts +21 -4
  82. package/theme/layout/app/expandableMenu/expandable-menu.component.html +19 -5
  83. package/theme/layout/app/expandableMenu/expandable-menu.component.ts +69 -9
  84. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.html +1 -0
  85. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.ts +3 -1
  86. package/theme/layout/app/general-search/general-search.component.html +2 -1
  87. package/theme/layout/app/general-search/general-search.component.ts +2 -2
  88. package/theme/layout/app/history/history-sidebar.component.html +3 -1
  89. package/theme/layout/app/history/history-sidebar.component.ts +3 -1
  90. package/theme/layout/app/layout/app.layout.component.d.ts +105 -5
  91. package/theme/layout/app/layout/app.layout.component.html +102 -1
  92. package/theme/layout/app/layout/app.layout.component.scss +372 -0
  93. package/theme/layout/app/layout/app.layout.component.ts +452 -13
  94. package/theme/layout/app/layout/mfe.layout.component.d.ts +1 -5
  95. package/theme/layout/app/layout/mfe.layout.component.ts +12 -38
  96. package/theme/layout/app/site-map/site-map-sidebar.component.html +1 -0
  97. package/theme/layout/app/site-map/site-map-sidebar.component.ts +3 -1
  98. package/theme/layout/app/static-sidebar/static-sidebar.component.d.ts +26 -5
  99. package/theme/layout/app/static-sidebar/static-sidebar.component.html +11 -5
  100. package/theme/layout/app/static-sidebar/static-sidebar.component.ts +68 -13
  101. package/theme/layout/app/topbar/app.topbar.component.html +0 -1
  102. package/theme/layout/app/topbar/app.topbar.component.scss +1 -1
  103. package/theme/layout/service/breadcrumb-publisher.service.d.ts +24 -0
  104. package/theme/layout/service/breadcrumb-publisher.service.ts +95 -0
  105. package/theme/layout/service/tab-session.service.d.ts +52 -0
  106. package/theme/layout/service/tab-session.service.ts +138 -0
  107. package/theme/styles/layout/_breadcrumb.scss +95 -0
  108. package/theme/styles/layout/_content.scss +2 -2
  109. package/ui-business/ref-value/src/ref-value.component.d.ts +4 -2
  110. package/util/sync-active-tab-route/src/sync-active-tab-route.directive.d.ts +15 -2
  111. package/boot/config/apps/src/reuse-strategy.d.ts +0 -4
  112. package/esm2022/boot/config/apps/src/reuse-strategy.mjs +0 -9
  113. package/esm2022/theme/layout/app/breadcrumb/app.breadcrumb.component.mjs +0 -107
  114. package/fesm2022/aril-app.component-wxP3y8dg.mjs +0 -81
  115. package/fesm2022/aril-app.component-wxP3y8dg.mjs.map +0 -1
  116. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs +0 -80
  117. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs.map +0 -1
  118. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs +0 -315
  119. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs.map +0 -1
  120. package/theme/layout/app/breadcrumb/app.breadcrumb.component.d.ts +0 -25
  121. package/theme/layout/app/breadcrumb/app.breadcrumb.component.html +0 -8
  122. package/theme/layout/app/breadcrumb/app.breadcrumb.component.ts +0 -127
@@ -0,0 +1,57 @@
1
+ import { LocationStrategy } from '@angular/common';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Host modda her MFE Application'ı için kullanılan custom `LocationStrategy`. Browser
5
+ * URL'ine (`window.location.hash`) HİÇ YAZMAZ; tüm path/state internal alanlarda tutulur.
6
+ *
7
+ * Neden? Host modda host Router yegane URL kontrolcüsüdür. Eğer MFE Router da
8
+ * `HashLocationStrategy` kullansaydı, MFE içindeki bir `routerLink` tıklaması browser hash'ını
9
+ * değiştirir → `HashLocationStrategy` host Router'ı OTOMATİK tetikler → host Router'a
10
+ * tabsız (state'siz) navigation gelir → Strategy yanlış componentRef yaratır, tab
11
+ * izolasyonu bozulur. Bu otomatik sync'i kırmak için MFE Router'ın LocationStrategy'sini
12
+ * isolate ediyoruz: MFE içi navigation MFE Router'ın internal state'inde kalır, browser'a
13
+ * sızmaz, host'a istemsiz event göndermez.
14
+ *
15
+ * ## Tab içi history stack
16
+ * Browser back/forward butonu yerine MFE içinde **tab-içi history stack** çalışır:
17
+ * `pushState` her yeni navigation'da `backStack`'e mevcut konumu iter, `forwardStack`'i
18
+ * temizler; `back()` ve `forward()` stack'ler arasında değiş tokuş yapıp `popstate` event'i
19
+ * emit eder — Angular `Location` service bunu Router'a iletir, Router popstate-driven
20
+ * navigation cycle başlatır. Sonuçta kullanıcı **detay → liste** gibi MFE içi geri dönüşleri
21
+ * browser back butonuyla yapabilir, ama bu navigation **host Router'a yansımaz** → tab
22
+ * izolasyonu korunur, "geri" başka tab'a atlatmaz.
23
+ */
24
+ export declare class IsolatedLocationStrategy extends LocationStrategy {
25
+ /**
26
+ * Stack boyutu üst limiti — browser default'una (50 entry) yakın. Aşırı uzun
27
+ * session'larda memory'i sınırlı tutar; sınır aşıldığında en eski entry düşürülür.
28
+ */
29
+ private static readonly MAX_STACK_SIZE;
30
+ private internalPath;
31
+ private internalState;
32
+ /** Geri gidilebilecek path/state çiftleri (LIFO). */
33
+ private backStack;
34
+ /** İleri gidilebilecek path/state çiftleri (`back()` ile pop edilen entry'ler). */
35
+ private forwardStack;
36
+ private popStateHandlers;
37
+ /**
38
+ * `back/forward` sonrası Router'ın navigation cycle'ı sırasında çağrılabilen
39
+ * `pushState`'i `backStack`'e tekrar itmemek için flag. `replaceState` zaten stack'i
40
+ * değiştirmiyor — bu flag yalnızca pushState yolunu koruyor.
41
+ */
42
+ private isNavigatingViaHistory;
43
+ constructor();
44
+ path(_includeHash?: boolean): string;
45
+ prepareExternalUrl(internal: string): string;
46
+ pushState(state: unknown, _title: string, url: string, queryParams: string): void;
47
+ replaceState(state: unknown, _title: string, url: string, queryParams: string): void;
48
+ back(): void;
49
+ forward(): void;
50
+ historyGo(relativePosition: number): void;
51
+ onPopState(fn: (event: PopStateEvent) => void): void;
52
+ private emitPopState;
53
+ getBaseHref(): string;
54
+ getState(): unknown;
55
+ static ɵfac: i0.ɵɵFactoryDeclaration<IsolatedLocationStrategy, never>;
56
+ static ɵprov: i0.ɵɵInjectableDeclaration<IsolatedLocationStrategy>;
57
+ }
@@ -3,13 +3,47 @@ export class MfeBridge {
3
3
  constructor() {
4
4
  this.activeHost = signal(null);
5
5
  this.activeMF = signal(null);
6
- this.isHostMode = signal(false);
7
6
  this.hostMenuItems = signal([]);
8
7
  this.pluginJson = signal({});
9
8
  this.routeConfigs = signal(null);
10
9
  this.pageTitle = signal('');
10
+ this.breadcrumbs = signal([]);
11
+ /**
12
+ * Bir MFE Router'ında olan son `NavigationEnd`'in URL'i ve **hangi tab'a ait olduğu**.
13
+ * MFE içi sayfa içi navigation'lar host Router'a yansımayabiliyor → `NavService` tab
14
+ * navLink'ini güncellemek için bu signal'ı izler.
15
+ *
16
+ * **Neden tabId taşıyor**: Birden fazla tab'ın MFE Router'ı async event tetikleyebilir
17
+ * (örn. hidden container'daki tab2 `?activeTab=1` replaceState yaparken). `activeTabId`'ye
18
+ * bakarak update yaparsak yanlış tab'ı kontamine ederiz. Mesajda kaynak tabId'yi taşıyıp
19
+ * `NavService.syncActiveTabNavLinkForTab(tabId, url)` ile spesifik tab'ı update ederiz.
20
+ *
21
+ * **Custom `equal`**: AppComponent her MFE NavigationEnd'de `set({tabId, url})` çağırır;
22
+ * yeni object reference olduğu için default reference-equality re-emit eder. Bu durumda
23
+ * aynı tab+url ile sürekli effect tetiklenir → tab navLink'i kullanıcının anasayfaya
24
+ * geçtiği gibi (host route'lar MFE NavigationEnd tetiklemez ama signal eski değerinde
25
+ * kalır) state değişikliklerini geri alır. Value-equality ile yalnızca gerçek URL
26
+ * değişikliklerinde tetiklensin.
27
+ */
28
+ this.activeMFEUrl = signal(null, {
29
+ equal: (a, b) => a?.tabId === b?.tabId && a?.url === b?.url && a?.title === b?.title
30
+ });
31
+ /**
32
+ * Aktif tab'ın `tabId`'si — `NavService` tab değişimlerinde günceller.
33
+ * Plugin Router proxy'leri (`provideHostRouter`) bu signal'ı okuyup `navigate`/`navigateByUrl`
34
+ * çağrılarına `extras.state._tab` enjekte eder → plugin'lerin yaptığı tüm host
35
+ * navigation'ları otomatik tab-aware olur, Strategy doğru tab handle'ını korur.
36
+ */
37
+ this.activeTabId = signal('');
11
38
  this.hostNgZone = null;
12
39
  this.hostRouter = null;
40
+ /**
41
+ * Host (shell) `Location` servisi. Host modda MFE/plugin child injector'larından
42
+ * erişilemez (child Location izole `IsolatedLocationStrategy`'ye bağlı); browser
43
+ * adres çubuğuna `replaceState` ile yazmak isteyen directive'ler (örn. `?activeTab`
44
+ * senkronizasyonu) bunu kullanır. `hostRouter` ile aynı pattern.
45
+ */
46
+ this.hostLocation = null;
13
47
  this.mirrored = false;
14
48
  }
15
49
  mirrorToWindow() {
@@ -25,9 +59,6 @@ export class MfeBridge {
25
59
  effect(() => {
26
60
  w.activeMF = this.activeMF() ?? undefined;
27
61
  });
28
- effect(() => {
29
- w.isHostMode = this.isHostMode();
30
- });
31
62
  effect(() => {
32
63
  w.pluginJson = this.pluginJson();
33
64
  });
@@ -56,4 +87,4 @@ export const bridge = (() => {
56
87
  }
57
88
  return g[BRIDGE_SLOT];
58
89
  })();
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZlLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvYm9vdC9icmlkZ2Uvc3JjL21mZS1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBdUIvRCxNQUFNLE9BQU8sU0FBUztJQUF0QjtRQUNVLGVBQVUsR0FBRyxNQUFNLENBQWMsSUFBSSxDQUFDLENBQUM7UUFDdkMsYUFBUSxHQUFHLE1BQU0sQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUNyQyxlQUFVLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLGtCQUFhLEdBQUcsTUFBTSxDQUFtQixFQUFFLENBQUMsQ0FBQztRQUM3QyxlQUFVLEdBQUcsTUFBTSxDQUEwQixFQUFFLENBQUMsQ0FBQztRQUNqRCxpQkFBWSxHQUFHLE1BQU0sQ0FBdUIsSUFBSSxDQUFDLENBQUM7UUFDbEQsY0FBUyxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUV4QyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUV6QixhQUFRLEdBQUcsS0FBSyxDQUFDO0lBb0MxQixDQUFDO0lBbENBLGNBQWM7UUFDYixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztZQUFFLE9BQU87UUFDM0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFckIsTUFBTSxDQUFDLEdBQUcsTUFBb0MsQ0FBQztRQUUvQyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDckMsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLFNBQVMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxTQUFTLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1gsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1gsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1gsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksU0FBUyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFO1lBQ2xDLFlBQVksRUFBRSxJQUFJO1lBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVTtTQUMxQixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUU7WUFDdEMsWUFBWSxFQUFFLElBQUk7WUFDbEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVO1NBQzFCLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRDtBQUVELHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLG1EQUFtRDtBQUNuRCxNQUFNLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQWMsQ0FBQyxHQUFHLEVBQUU7SUFDdEMsTUFBTSxDQUFDLEdBQUcsVUFBdUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBRSxDQUFDO0FBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1pvbmUsIFNpZ25hbCwgZWZmZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHR5cGUgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBBcHBzLCBQbHVnaW5NZW51SXRlbSB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvYXBwcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlQ29uZmlnIHtcclxuXHRwYXRoOiBzdHJpbmc7XHJcblx0Y29udGVudDogc3RyaW5nO1xyXG5cdHZlcnNpb246IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lXaW5kb3dTbG90cyB7XHJcblx0YWN0aXZlSG9zdD86IEFwcHM7XHJcblx0YWN0aXZlTUY/OiBBcHBzO1xyXG5cdGlzSG9zdE1vZGU/OiBib29sZWFuO1xyXG5cdGhvc3RNZW51SXRlbXM/OiBTaWduYWw8UGx1Z2luTWVudUl0ZW1bXT47XHJcblx0cGx1Z2luSnNvbj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cdHJvdXRlQ29uZmlncz86IFJvdXRlQ29uZmlnW107XHJcblx0bmdab25lPzogTmdab25lO1xyXG5cdGhvc3RSb3V0ZXI/OiBSb3V0ZXI7XHJcblx0X19BUklMX1BBR0VfVElUTEVfXz86IFNpZ25hbDxzdHJpbmc+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTWZlQnJpZGdlIHtcclxuXHRyZWFkb25seSBhY3RpdmVIb3N0ID0gc2lnbmFsPEFwcHMgfCBudWxsPihudWxsKTtcclxuXHRyZWFkb25seSBhY3RpdmVNRiA9IHNpZ25hbDxBcHBzIHwgbnVsbD4obnVsbCk7XHJcblx0cmVhZG9ubHkgaXNIb3N0TW9kZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblx0cmVhZG9ubHkgaG9zdE1lbnVJdGVtcyA9IHNpZ25hbDxQbHVnaW5NZW51SXRlbVtdPihbXSk7XHJcblx0cmVhZG9ubHkgcGx1Z2luSnNvbiA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe30pO1xyXG5cdHJlYWRvbmx5IHJvdXRlQ29uZmlncyA9IHNpZ25hbDxSb3V0ZUNvbmZpZ1tdIHwgbnVsbD4obnVsbCk7XHJcblx0cmVhZG9ubHkgcGFnZVRpdGxlID0gc2lnbmFsPHN0cmluZz4oJycpO1xyXG5cclxuXHRob3N0Tmdab25lOiBOZ1pvbmUgfCBudWxsID0gbnVsbDtcclxuXHRob3N0Um91dGVyOiBSb3V0ZXIgfCBudWxsID0gbnVsbDtcclxuXHJcblx0cHJpdmF0ZSBtaXJyb3JlZCA9IGZhbHNlO1xyXG5cclxuXHRtaXJyb3JUb1dpbmRvdygpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLm1pcnJvcmVkIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XHJcblx0XHR0aGlzLm1pcnJvcmVkID0gdHJ1ZTtcclxuXHJcblx0XHRjb25zdCB3ID0gd2luZG93IGFzIFdpbmRvdyAmIExlZ2FjeVdpbmRvd1Nsb3RzO1xyXG5cclxuXHRcdHcuaG9zdE1lbnVJdGVtcyA9IHRoaXMuaG9zdE1lbnVJdGVtcztcclxuXHRcdHcuX19BUklMX1BBR0VfVElUTEVfXyA9IHRoaXMucGFnZVRpdGxlO1xyXG5cclxuXHRcdGVmZmVjdCgoKSA9PiB7XHJcblx0XHRcdHcuYWN0aXZlSG9zdCA9IHRoaXMuYWN0aXZlSG9zdCgpID8/IHVuZGVmaW5lZDtcclxuXHRcdH0pO1xyXG5cdFx0ZWZmZWN0KCgpID0+IHtcclxuXHRcdFx0dy5hY3RpdmVNRiA9IHRoaXMuYWN0aXZlTUYoKSA/PyB1bmRlZmluZWQ7XHJcblx0XHR9KTtcclxuXHRcdGVmZmVjdCgoKSA9PiB7XHJcblx0XHRcdHcuaXNIb3N0TW9kZSA9IHRoaXMuaXNIb3N0TW9kZSgpO1xyXG5cdFx0fSk7XHJcblx0XHRlZmZlY3QoKCkgPT4ge1xyXG5cdFx0XHR3LnBsdWdpbkpzb24gPSB0aGlzLnBsdWdpbkpzb24oKTtcclxuXHRcdH0pO1xyXG5cdFx0ZWZmZWN0KCgpID0+IHtcclxuXHRcdFx0dy5yb3V0ZUNvbmZpZ3MgPSB0aGlzLnJvdXRlQ29uZmlncygpID8/IHVuZGVmaW5lZDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3LCAnbmdab25lJywge1xyXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogKCkgPT4gdGhpcy5ob3N0Tmdab25lXHJcblx0XHR9KTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3LCAnaG9zdFJvdXRlcicsIHtcclxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6ICgpID0+IHRoaXMuaG9zdFJvdXRlclxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG4vLyBNb2R1bGUgRmVkZXJhdGlvbiBzaGFyZWQgY29uZmlnIG9sbWFkxLHEn8SxIGR1cnVtbGFyIGnDp2luIGdsb2JhbFRoaXMgc2xvdFxyXG4vLyDDvHplcmluZGVuIHRlayBpbnN0YW5jZSBnYXJhbnRpc2kuIEhvc3QgdmUgaGVyIHJlbW90ZSBNRkUgYXlyxLEgYnVuZGxlIG9sc2FcclxuLy8gYmlsZSBheW7EsSBKUyByZWFsbSdpbmRlIGF5bsSxIGluc3RhbmNlJ8SxIG9rdXIg4oCUIGVza2kgZ2xvYmFsVGhpcyBzw7Z6bGXFn21lc2luaW5cclxuLy8geWFwdMSxxJ/EsSBnw7ZyZXZpIHRlayBiaXIgdGlwbGkgc2xvdHRhIGJpcmxlxZ90aXJpci5cclxuY29uc3QgQlJJREdFX1NMT1QgPSAnX19hcmlsTWZlQnJpZGdlX18nO1xyXG50eXBlIEJyaWRnZVNsb3RIb3N0ID0geyBbQlJJREdFX1NMT1RdPzogTWZlQnJpZGdlIH07XHJcbmV4cG9ydCBjb25zdCBicmlkZ2U6IE1mZUJyaWRnZSA9ICgoKSA9PiB7XHJcblx0Y29uc3QgZyA9IGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBCcmlkZ2VTbG90SG9zdDtcclxuXHRpZiAoIWdbQlJJREdFX1NMT1RdKSB7XHJcblx0XHRnW0JSSURHRV9TTE9UXSA9IG5ldyBNZmVCcmlkZ2UoKTtcclxuXHR9XHJcblx0cmV0dXJuIGdbQlJJREdFX1NMT1RdITtcclxufSkoKTtcclxuIl19
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZlLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvYm9vdC9icmlkZ2Uvc3JjL21mZS1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBMkIvRCxNQUFNLE9BQU8sU0FBUztJQUF0QjtRQUNVLGVBQVUsR0FBRyxNQUFNLENBQWMsSUFBSSxDQUFDLENBQUM7UUFDdkMsYUFBUSxHQUFHLE1BQU0sQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUNyQyxrQkFBYSxHQUFHLE1BQU0sQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFDN0MsZUFBVSxHQUFHLE1BQU0sQ0FBMEIsRUFBRSxDQUFDLENBQUM7UUFDakQsaUJBQVksR0FBRyxNQUFNLENBQXVCLElBQUksQ0FBQyxDQUFDO1FBQ2xELGNBQVMsR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxNQUFNLENBQWUsRUFBRSxDQUFDLENBQUM7UUFDaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7V0FnQkc7UUFDTSxpQkFBWSxHQUFHLE1BQU0sQ0FBd0QsSUFBSSxFQUFFO1lBQzNGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSztTQUNwRixDQUFDLENBQUM7UUFFSDs7Ozs7V0FLRztRQUNNLGdCQUFXLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDOzs7OztXQUtHO1FBQ0gsaUJBQVksR0FBb0IsSUFBSSxDQUFDO1FBRTdCLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFpQzFCLENBQUM7SUEvQkEsY0FBYztRQUNiLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO1lBQUUsT0FBTztRQUMzRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQixNQUFNLENBQUMsR0FBRyxNQUFvQyxDQUFDO1FBRS9DLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNyQyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUV2QyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1gsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksU0FBUyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLFNBQVMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxTQUFTLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUU7WUFDbEMsWUFBWSxFQUFFLElBQUk7WUFDbEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVO1NBQzFCLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRTtZQUN0QyxZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVU7U0FDMUIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNEO0FBRUQseUVBQXlFO0FBQ3pFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsbURBQW1EO0FBQ25ELE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBYyxDQUFDLEdBQUcsRUFBRTtJQUN0QyxNQUFNLENBQUMsR0FBRyxVQUF1QyxDQUFDO0lBQ2xELElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFFLENBQUM7QUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ1pvbmUsIFNpZ25hbCwgZWZmZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHR5cGUgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBBcHBzLCBQbHVnaW5NZW51SXRlbSB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvYXBwcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlQ29uZmlnIHtcclxuXHRwYXRoOiBzdHJpbmc7XHJcblx0Y29udGVudDogc3RyaW5nO1xyXG5cdHZlcnNpb246IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCcmVhZGNydW1iIHtcclxuXHRsYWJlbDogc3RyaW5nO1xyXG5cdHVybD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lXaW5kb3dTbG90cyB7XHJcblx0YWN0aXZlSG9zdD86IEFwcHM7XHJcblx0YWN0aXZlTUY/OiBBcHBzO1xyXG5cdGhvc3RNZW51SXRlbXM/OiBTaWduYWw8UGx1Z2luTWVudUl0ZW1bXT47XHJcblx0cGx1Z2luSnNvbj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cdHJvdXRlQ29uZmlncz86IFJvdXRlQ29uZmlnW107XHJcblx0bmdab25lPzogTmdab25lO1xyXG5cdGhvc3RSb3V0ZXI/OiBSb3V0ZXI7XHJcblx0X19BUklMX1BBR0VfVElUTEVfXz86IFNpZ25hbDxzdHJpbmc+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTWZlQnJpZGdlIHtcclxuXHRyZWFkb25seSBhY3RpdmVIb3N0ID0gc2lnbmFsPEFwcHMgfCBudWxsPihudWxsKTtcclxuXHRyZWFkb25seSBhY3RpdmVNRiA9IHNpZ25hbDxBcHBzIHwgbnVsbD4obnVsbCk7XHJcblx0cmVhZG9ubHkgaG9zdE1lbnVJdGVtcyA9IHNpZ25hbDxQbHVnaW5NZW51SXRlbVtdPihbXSk7XHJcblx0cmVhZG9ubHkgcGx1Z2luSnNvbiA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe30pO1xyXG5cdHJlYWRvbmx5IHJvdXRlQ29uZmlncyA9IHNpZ25hbDxSb3V0ZUNvbmZpZ1tdIHwgbnVsbD4obnVsbCk7XHJcblx0cmVhZG9ubHkgcGFnZVRpdGxlID0gc2lnbmFsPHN0cmluZz4oJycpO1xyXG5cdHJlYWRvbmx5IGJyZWFkY3J1bWJzID0gc2lnbmFsPEJyZWFkY3J1bWJbXT4oW10pO1xyXG5cdC8qKlxyXG5cdCAqIEJpciBNRkUgUm91dGVyJ8SxbmRhIG9sYW4gc29uIGBOYXZpZ2F0aW9uRW5kYCdpbiBVUkwnaSB2ZSAqKmhhbmdpIHRhYidhIGFpdCBvbGR1xJ91KiouXHJcblx0ICogTUZFIGnDp2kgc2F5ZmEgacOnaSBuYXZpZ2F0aW9uJ2xhciBob3N0IFJvdXRlcidhIHlhbnPEsW1heWFiaWxpeW9yIOKGkiBgTmF2U2VydmljZWAgdGFiXHJcblx0ICogbmF2TGluaydpbmkgZ8O8bmNlbGxlbWVrIGnDp2luIGJ1IHNpZ25hbCfEsSBpemxlci5cclxuXHQgKlxyXG5cdCAqICoqTmVkZW4gdGFiSWQgdGHFn8SxeW9yKio6IEJpcmRlbiBmYXpsYSB0YWInxLFuIE1GRSBSb3V0ZXInxLEgYXN5bmMgZXZlbnQgdGV0aWtsZXllYmlsaXJcclxuXHQgKiAow7Zybi4gaGlkZGVuIGNvbnRhaW5lcidkYWtpIHRhYjIgYD9hY3RpdmVUYWI9MWAgcmVwbGFjZVN0YXRlIHlhcGFya2VuKS4gYGFjdGl2ZVRhYklkYCd5ZVxyXG5cdCAqIGJha2FyYWsgdXBkYXRlIHlhcGFyc2FrIHlhbmzEscWfIHRhYifEsSBrb250YW1pbmUgZWRlcml6LiBNZXNhamRhIGtheW5hayB0YWJJZCd5aSB0YcWfxLF5xLFwXHJcblx0ICogYE5hdlNlcnZpY2Uuc3luY0FjdGl2ZVRhYk5hdkxpbmtGb3JUYWIodGFiSWQsIHVybClgIGlsZSBzcGVzaWZpayB0YWInxLEgdXBkYXRlIGVkZXJpei5cclxuXHQgKlxyXG5cdCAqICoqQ3VzdG9tIGBlcXVhbGAqKjogQXBwQ29tcG9uZW50IGhlciBNRkUgTmF2aWdhdGlvbkVuZCdkZSBgc2V0KHt0YWJJZCwgdXJsfSlgIMOnYcSfxLFyxLFyO1xyXG5cdCAqIHllbmkgb2JqZWN0IHJlZmVyZW5jZSBvbGR1xJ91IGnDp2luIGRlZmF1bHQgcmVmZXJlbmNlLWVxdWFsaXR5IHJlLWVtaXQgZWRlci4gQnUgZHVydW1kYVxyXG5cdCAqIGF5bsSxIHRhYit1cmwgaWxlIHPDvHJla2xpIGVmZmVjdCB0ZXRpa2xlbmlyIOKGkiB0YWIgbmF2TGluaydpIGt1bGxhbsSxY8SxbsSxbiBhbmFzYXlmYXlhXHJcblx0ICogZ2XDp3RpxJ9pIGdpYmkgKGhvc3Qgcm91dGUnbGFyIE1GRSBOYXZpZ2F0aW9uRW5kIHRldGlrbGVtZXogYW1hIHNpZ25hbCBlc2tpIGRlxJ9lcmluZGVcclxuXHQgKiBrYWzEsXIpIHN0YXRlIGRlxJ9pxZ9pa2xpa2xlcmluaSBnZXJpIGFsxLFyLiBWYWx1ZS1lcXVhbGl0eSBpbGUgeWFsbsSxemNhIGdlcsOnZWsgVVJMXHJcblx0ICogZGXEn2nFn2lrbGlrbGVyaW5kZSB0ZXRpa2xlbnNpbi5cclxuXHQgKi9cclxuXHRyZWFkb25seSBhY3RpdmVNRkVVcmwgPSBzaWduYWw8eyB0YWJJZDogc3RyaW5nOyB1cmw6IHN0cmluZzsgdGl0bGU/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwsIHtcclxuXHRcdGVxdWFsOiAoYSwgYikgPT4gYT8udGFiSWQgPT09IGI/LnRhYklkICYmIGE/LnVybCA9PT0gYj8udXJsICYmIGE/LnRpdGxlID09PSBiPy50aXRsZVxyXG5cdH0pO1xyXG5cclxuXHQvKipcclxuXHQgKiBBa3RpZiB0YWInxLFuIGB0YWJJZGAnc2kg4oCUIGBOYXZTZXJ2aWNlYCB0YWIgZGXEn2nFn2ltbGVyaW5kZSBnw7xuY2VsbGVyLlxyXG5cdCAqIFBsdWdpbiBSb3V0ZXIgcHJveHknbGVyaSAoYHByb3ZpZGVIb3N0Um91dGVyYCkgYnUgc2lnbmFsJ8SxIG9rdXl1cCBgbmF2aWdhdGVgL2BuYXZpZ2F0ZUJ5VXJsYFxyXG5cdCAqIMOnYcSfcsSxbGFyxLFuYSBgZXh0cmFzLnN0YXRlLl90YWJgIGVuamVrdGUgZWRlciDihpIgcGx1Z2luJ2xlcmluIHlhcHTEscSfxLEgdMO8bSBob3N0XHJcblx0ICogbmF2aWdhdGlvbidsYXLEsSBvdG9tYXRpayB0YWItYXdhcmUgb2x1ciwgU3RyYXRlZ3kgZG/En3J1IHRhYiBoYW5kbGUnxLFuxLEga29ydXIuXHJcblx0ICovXHJcblx0cmVhZG9ubHkgYWN0aXZlVGFiSWQgPSBzaWduYWw8c3RyaW5nPignJyk7XHJcblxyXG5cdGhvc3ROZ1pvbmU6IE5nWm9uZSB8IG51bGwgPSBudWxsO1xyXG5cdGhvc3RSb3V0ZXI6IFJvdXRlciB8IG51bGwgPSBudWxsO1xyXG5cdC8qKlxyXG5cdCAqIEhvc3QgKHNoZWxsKSBgTG9jYXRpb25gIHNlcnZpc2kuIEhvc3QgbW9kZGEgTUZFL3BsdWdpbiBjaGlsZCBpbmplY3RvcidsYXLEsW5kYW5cclxuXHQgKiBlcmnFn2lsZW1leiAoY2hpbGQgTG9jYXRpb24gaXpvbGUgYElzb2xhdGVkTG9jYXRpb25TdHJhdGVneWAneWUgYmHEn2zEsSk7IGJyb3dzZXJcclxuXHQgKiBhZHJlcyDDp3VidcSfdW5hIGByZXBsYWNlU3RhdGVgIGlsZSB5YXptYWsgaXN0ZXllbiBkaXJlY3RpdmUnbGVyICjDtnJuLiBgP2FjdGl2ZVRhYmBcclxuXHQgKiBzZW5rcm9uaXphc3lvbnUpIGJ1bnUga3VsbGFuxLFyLiBgaG9zdFJvdXRlcmAgaWxlIGF5bsSxIHBhdHRlcm4uXHJcblx0ICovXHJcblx0aG9zdExvY2F0aW9uOiBMb2NhdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRwcml2YXRlIG1pcnJvcmVkID0gZmFsc2U7XHJcblxyXG5cdG1pcnJvclRvV2luZG93KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMubWlycm9yZWQgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcclxuXHRcdHRoaXMubWlycm9yZWQgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHcgPSB3aW5kb3cgYXMgV2luZG93ICYgTGVnYWN5V2luZG93U2xvdHM7XHJcblxyXG5cdFx0dy5ob3N0TWVudUl0ZW1zID0gdGhpcy5ob3N0TWVudUl0ZW1zO1xyXG5cdFx0dy5fX0FSSUxfUEFHRV9USVRMRV9fID0gdGhpcy5wYWdlVGl0bGU7XHJcblxyXG5cdFx0ZWZmZWN0KCgpID0+IHtcclxuXHRcdFx0dy5hY3RpdmVIb3N0ID0gdGhpcy5hY3RpdmVIb3N0KCkgPz8gdW5kZWZpbmVkO1xyXG5cdFx0fSk7XHJcblx0XHRlZmZlY3QoKCkgPT4ge1xyXG5cdFx0XHR3LmFjdGl2ZU1GID0gdGhpcy5hY3RpdmVNRigpID8/IHVuZGVmaW5lZDtcclxuXHRcdH0pO1xyXG5cdFx0ZWZmZWN0KCgpID0+IHtcclxuXHRcdFx0dy5wbHVnaW5Kc29uID0gdGhpcy5wbHVnaW5Kc29uKCk7XHJcblx0XHR9KTtcclxuXHRcdGVmZmVjdCgoKSA9PiB7XHJcblx0XHRcdHcucm91dGVDb25maWdzID0gdGhpcy5yb3V0ZUNvbmZpZ3MoKSA/PyB1bmRlZmluZWQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodywgJ25nWm9uZScsIHtcclxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6ICgpID0+IHRoaXMuaG9zdE5nWm9uZVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodywgJ2hvc3RSb3V0ZXInLCB7XHJcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiAoKSA9PiB0aGlzLmhvc3RSb3V0ZXJcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuLy8gTW9kdWxlIEZlZGVyYXRpb24gc2hhcmVkIGNvbmZpZyBvbG1hZMSxxJ/EsSBkdXJ1bWxhciBpw6dpbiBnbG9iYWxUaGlzIHNsb3RcclxuLy8gw7x6ZXJpbmRlbiB0ZWsgaW5zdGFuY2UgZ2FyYW50aXNpLiBIb3N0IHZlIGhlciByZW1vdGUgTUZFIGF5csSxIGJ1bmRsZSBvbHNhXHJcbi8vIGJpbGUgYXluxLEgSlMgcmVhbG0naW5kZSBheW7EsSBpbnN0YW5jZSfEsSBva3VyIOKAlCBlc2tpIGdsb2JhbFRoaXMgc8O2emxlxZ9tZXNpbmluXHJcbi8vIHlhcHTEscSfxLEgZ8O2cmV2aSB0ZWsgYmlyIHRpcGxpIHNsb3R0YSBiaXJsZcWfdGlyaXIuXHJcbmNvbnN0IEJSSURHRV9TTE9UID0gJ19fYXJpbE1mZUJyaWRnZV9fJztcclxudHlwZSBCcmlkZ2VTbG90SG9zdCA9IHsgW0JSSURHRV9TTE9UXT86IE1mZUJyaWRnZSB9O1xyXG5leHBvcnQgY29uc3QgYnJpZGdlOiBNZmVCcmlkZ2UgPSAoKCkgPT4ge1xyXG5cdGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgQnJpZGdlU2xvdEhvc3Q7XHJcblx0aWYgKCFnW0JSSURHRV9TTE9UXSkge1xyXG5cdFx0Z1tCUklER0VfU0xPVF0gPSBuZXcgTWZlQnJpZGdlKCk7XHJcblx0fVxyXG5cdHJldHVybiBnW0JSSURHRV9TTE9UXSE7XHJcbn0pKCk7XHJcbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import { isDevMode } from '@angular/core';
2
2
  import { KeycloakEventType } from 'keycloak-angular';
3
- import { EMPTY, finalize, firstValueFrom, from, fromEvent, switchMap, takeUntil, tap } from 'rxjs';
3
+ import { EMPTY, catchError, finalize, firstValueFrom, from, fromEvent, switchMap, takeUntil, tap } from 'rxjs';
4
4
  import { bridge } from 'aril/boot/bridge';
5
5
  import { Apps } from 'aril/boot/config/apps';
6
6
  import { ApiConfigsFactory } from './interfaces';
@@ -24,7 +24,16 @@ export const loadApiConfigs = (httpClient, keycloak, appName, microAppService) =
24
24
  dispatchEvent(new CustomEvent(`${app}:update-keycloak`, { detail: keycloak }));
25
25
  }
26
26
  });
27
- })));
27
+ })),
28
+ // Browser arka plandayken refresh edilince token endpoint 400 (invalid_grant /
29
+ // süresi dolmuş refresh token / silent-SSO timeout) dönüp `keycloak.init()` reject
30
+ // olabiliyor. Yakalanmazsa "ERROR undefined" + auth'suz bozuk açılış oluyordu.
31
+ // Hatayı yakalayıp temiz yeniden login'e yönlendir (Keycloak login → mevcut URL'e döner).
32
+ catchError((err) => {
33
+ console.error("Keycloak init başarısız — yeniden login'e yönlendiriliyor:", err);
34
+ void keycloak.login();
35
+ return EMPTY;
36
+ }));
28
37
  }), switchMap(() => microAppService?.init(httpClient, API_CONFIGS.api).pipe(tap((result) => {
29
38
  bridge.hostMenuItems.set(result.menuItems);
30
39
  bridge.pluginJson.set(result.plugins);
@@ -61,4 +70,4 @@ export const loadInitData = (httpClient) => () => new Promise((resolve, _reject)
61
70
  }
62
71
  });
63
72
  });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL2Jvb3QvY29uZmlnL2FwaS9zcmMvYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkcsT0FBTyxFQUFlLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWpELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7QUFFbkQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUMxQixDQUFDLFVBQXNCLEVBQUUsUUFBeUIsRUFBRSxPQUFlLEVBQUUsZUFBaUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQy9HLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDN0IsVUFBVTtLQUNSLEdBQUcsQ0FBb0IsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7S0FDNUYsSUFBSSxDQUNKLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQ3JCLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUs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QUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEdBQUcsK0JBQStCLENBQUM7SUFDbkUsVUFBVSxDQUFDLEdBQUcsQ0FBZ0IsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2pELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2QsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDWCxDQUFDO1FBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxRQUFRLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqRSxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7S0FDRCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgS2V5Y2xvYWtFdmVudFR5cGUsIEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBFTVBUWSwgZmluYWxpemUsIGZpcnN0VmFsdWVGcm9tLCBmcm9tLCBmcm9tRXZlbnQsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFJvdXRlQ29uZmlnLCBicmlkZ2UgfSBmcm9tICdhcmlsL2Jvb3QvYnJpZGdlJztcclxuaW1wb3J0IHsgQXBwcywgTWljcm9BcHBTZXJ2aWNlIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuXHJcbmltcG9ydCB7IEFwaUNvbmZpZ3NGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuXHJcbmV4cG9ydCBjb25zdCBBUElfQ09ORklHUyA9IG5ldyBBcGlDb25maWdzRmFjdG9yeSgpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGxvYWRBcGlDb25maWdzID1cclxuXHQoaHR0cENsaWVudDogSHR0cENsaWVudCwga2V5Y2xvYWs6IEtleWNsb2FrU2VydmljZSwgYXBwTmFtZTogc3RyaW5nLCBtaWNyb0FwcFNlcnZpY2U/OiBNaWNyb0FwcFNlcnZpY2UpID0+ICgpID0+XHJcblx0XHRuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT5cclxuXHRcdFx0aHR0cENsaWVudFxyXG5cdFx0XHRcdC5nZXQ8QXBpQ29uZmlnc0ZhY3Rvcnk+KGlzRGV2TW9kZSgpID8gJy4vYXNzZXRzL2xvY2FsLWNvbmZpZ3MvYXBpLmxvY2FsLmpzb24nIDogJy4vYXBpLmpzb24nKVxyXG5cdFx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdFx0c3dpdGNoTWFwKChjb25maWdzKSA9PiB7XHJcblx0XHRcdFx0XHRcdGJyaWRnZS5ob3N0TWVudUl0ZW1zLnNldChbXSk7XHJcblx0XHRcdFx0XHRcdGJyaWRnZS5wbHVnaW5Kc29uLnNldCh7fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKEFQSV9DT05GSUdTLCB7IC4uLmNvbmZpZ3MgfSk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZnJvbShcclxuXHRcdFx0XHRcdFx0XHRrZXljbG9hay5pbml0KHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZzogQVBJX0NPTkZJR1Mua2V5Y2xvYWssXHJcblx0XHRcdFx0XHRcdFx0XHRsb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXA6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0XHRpbml0T3B0aW9uczogeyBvbkxvYWQ6ICdsb2dpbi1yZXF1aXJlZCcsIGNoZWNrTG9naW5JZnJhbWU6IGZhbHNlIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRiZWFyZXJFeGNsdWRlZFVybHM6IFsnL2Fzc2V0cyddXHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0KS5waXBlKFxyXG5cdFx0XHRcdFx0XHRcdGZpbmFsaXplKCgpID0+XHJcblx0XHRcdFx0XHRcdFx0XHRhZGRFdmVudExpc3RlbmVyKCdtb2R1bGUtcmVhZHknLCAoZXZlbnQpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYXBwID0gKGV2ZW50IGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGAke2FwcH06aW5pdC1rZXljbG9ha2AsIHsgZGV0YWlsOiBrZXljbG9hayB9KSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXljbG9hay5rZXljbG9ha0V2ZW50cyQucGlwZSh0YWtlVW50aWwoZnJvbUV2ZW50KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpKSkuc3Vic2NyaWJlKChlKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGUudHlwZSA9PT0gS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoUmVmcmVzaFN1Y2Nlc3MpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGAke2FwcH06dXBkYXRlLWtleWNsb2FrYCwgeyBkZXRhaWw6IGtleWNsb2FrIH0pKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRcdHN3aXRjaE1hcChcclxuXHRcdFx0XHRcdFx0KCkgPT5cclxuXHRcdFx0XHRcdFx0XHRtaWNyb0FwcFNlcnZpY2U/LmluaXQoaHR0cENsaWVudCwgQVBJX0NPTkZJR1MuYXBpKS5waXBlKFxyXG5cdFx0XHRcdFx0XHRcdFx0dGFwKChyZXN1bHQpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJpZGdlLmhvc3RNZW51SXRlbXMuc2V0KHJlc3VsdC5tZW51SXRlbXMpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmlkZ2UucGx1Z2luSnNvbi5zZXQocmVzdWx0LnBsdWdpbnMpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQpID8/IEVNUFRZXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoKVxyXG5cdFx0XHRcdC5hZGQocmVzb2x2ZSlcclxuXHRcdCk7XHJcblxyXG4vKipcclxuICogb25seSB3b3JrcyB3aGVuIGlzSG9zdE1vZGUgaXMgdHJ1ZVxyXG4gKiBtaWNyby1hcHAgYWNjZXNzIGl0cyBvd24gYXBpLmpzb24gZmlsZSB3aGVuIG9wZW5lZCBpbiBob3N0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0QXBpQ29uZmlnT25NRkVNb2RlKFxyXG5cdGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcblx0a2V5Y2xvYWs6IEtleWNsb2FrU2VydmljZSxcclxuXHRhcHBOYW1lOiBBcHBzXHJcbik6ICgpID0+IFByb21pc2U8YW55PiB7XHJcblx0cmV0dXJuICgpID0+IHtcclxuXHRcdGNvbnN0IG9ic2VydmFibGUkID0gaHR0cENsaWVudFxyXG5cdFx0XHQuZ2V0PEFwaUNvbmZpZ3NGYWN0b3J5Pihpc0Rldk1vZGUoKSA/ICcuL2Fzc2V0cy9sb2NhbC1jb25maWdzL2FwaS5sb2NhbC5qc29uJyA6ICcuL2FwaS5qc29uJylcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0dGFwKChjb25maWdzKSA9PiB7XHJcblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKEFQSV9DT05GSUdTLCB7IC4uLmNvbmZpZ3MgfSk7XHJcblx0XHRcdFx0XHRpZiAoYXBwTmFtZSAhPT0gQXBwcy5USE9SICYmIGFwcE5hbWUgIT09IEFwcHMuWUVBUCkge1xyXG5cdFx0XHRcdFx0XHRBUElfQ09ORklHUy5hcGkgPSBBUElfQ09ORklHUy5nZXRFeHRlcm5hbEFwcEVuZHBvaW50KGFwcE5hbWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9ic2VydmFibGUkKTtcclxuXHR9O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9hZEluaXREYXRhID0gKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpID0+ICgpID0+XHJcblx0bmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIF9yZWplY3QpID0+IHtcclxuXHRcdGNvbnN0IGVuZHBvaW50ID0gQVBJX0NPTkZJR1MuYXBpICsgJy91aS1yb3V0ZS1jb250ZW50LWNvbmZpZ3MvYWxsJztcclxuXHRcdGh0dHBDbGllbnQuZ2V0PFJvdXRlQ29uZmlnW10+KGVuZHBvaW50KS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRuZXh0OiAoZGF0YSkgPT4ge1xyXG5cdFx0XHRcdGJyaWRnZS5yb3V0ZUNvbmZpZ3Muc2V0KGRhdGEpO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0ZXJyb3I6IChlcnIpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBpbml0IGRhdGEgZnJvbSAke2VuZHBvaW50fTpgLCBlcnIpO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fSk7XHJcbiJdfQ==
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL2Jvb3QvY29uZmlnL2FwaS9zcmMvYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9HLE9BQU8sRUFBZSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FDMUIsQ0FBQyxVQUFzQixFQUFFLFFBQXlCLEVBQUUsT0FBZSxFQUFFLGVBQWlDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUMvRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzdCLFVBQVU7S0FDUixHQUFHLENBQW9CLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0tBQzVGLElBQUksQ0FDSixTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUNyQixNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcs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QUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0QsQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUNGLENBQUM7UUFFSCxPQUFPLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsVUFBc0IsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQzVELElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEdBQUcsK0JBQStCLENBQUM7SUFDbkUsVUFBVSxDQUFDLEdBQUcsQ0FBZ0IsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2pELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2QsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDWCxDQUFDO1FBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxRQUFRLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqRSxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7S0FDRCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgS2V5Y2xvYWtFdmVudFR5cGUsIEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBFTVBUWSwgY2F0Y2hFcnJvciwgZmluYWxpemUsIGZpcnN0VmFsdWVGcm9tLCBmcm9tLCBmcm9tRXZlbnQsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFJvdXRlQ29uZmlnLCBicmlkZ2UgfSBmcm9tICdhcmlsL2Jvb3QvYnJpZGdlJztcclxuaW1wb3J0IHsgQXBwcywgTWljcm9BcHBTZXJ2aWNlIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuXHJcbmltcG9ydCB7IEFwaUNvbmZpZ3NGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuXHJcbmV4cG9ydCBjb25zdCBBUElfQ09ORklHUyA9IG5ldyBBcGlDb25maWdzRmFjdG9yeSgpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGxvYWRBcGlDb25maWdzID1cclxuXHQoaHR0cENsaWVudDogSHR0cENsaWVudCwga2V5Y2xvYWs6IEtleWNsb2FrU2VydmljZSwgYXBwTmFtZTogc3RyaW5nLCBtaWNyb0FwcFNlcnZpY2U/OiBNaWNyb0FwcFNlcnZpY2UpID0+ICgpID0+XHJcblx0XHRuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT5cclxuXHRcdFx0aHR0cENsaWVudFxyXG5cdFx0XHRcdC5nZXQ8QXBpQ29uZmlnc0ZhY3Rvcnk+KGlzRGV2TW9kZSgpID8gJy4vYXNzZXRzL2xvY2FsLWNvbmZpZ3MvYXBpLmxvY2FsLmpzb24nIDogJy4vYXBpLmpzb24nKVxyXG5cdFx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdFx0c3dpdGNoTWFwKChjb25maWdzKSA9PiB7XHJcblx0XHRcdFx0XHRcdGJyaWRnZS5ob3N0TWVudUl0ZW1zLnNldChbXSk7XHJcblx0XHRcdFx0XHRcdGJyaWRnZS5wbHVnaW5Kc29uLnNldCh7fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKEFQSV9DT05GSUdTLCB7IC4uLmNvbmZpZ3MgfSk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZnJvbShcclxuXHRcdFx0XHRcdFx0XHRrZXljbG9hay5pbml0KHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZzogQVBJX0NPTkZJR1Mua2V5Y2xvYWssXHJcblx0XHRcdFx0XHRcdFx0XHRsb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXA6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0XHRpbml0T3B0aW9uczogeyBvbkxvYWQ6ICdsb2dpbi1yZXF1aXJlZCcsIGNoZWNrTG9naW5JZnJhbWU6IGZhbHNlIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRiZWFyZXJFeGNsdWRlZFVybHM6IFsnL2Fzc2V0cyddXHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0KS5waXBlKFxyXG5cdFx0XHRcdFx0XHRcdGZpbmFsaXplKCgpID0+XHJcblx0XHRcdFx0XHRcdFx0XHRhZGRFdmVudExpc3RlbmVyKCdtb2R1bGUtcmVhZHknLCAoZXZlbnQpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYXBwID0gKGV2ZW50IGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGAke2FwcH06aW5pdC1rZXljbG9ha2AsIHsgZGV0YWlsOiBrZXljbG9hayB9KSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXljbG9hay5rZXljbG9ha0V2ZW50cyQucGlwZSh0YWtlVW50aWwoZnJvbUV2ZW50KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpKSkuc3Vic2NyaWJlKChlKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGUudHlwZSA9PT0gS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoUmVmcmVzaFN1Y2Nlc3MpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGAke2FwcH06dXBkYXRlLWtleWNsb2FrYCwgeyBkZXRhaWw6IGtleWNsb2FrIH0pKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0XHRcdC8vIEJyb3dzZXIgYXJrYSBwbGFuZGF5a2VuIHJlZnJlc2ggZWRpbGluY2UgdG9rZW4gZW5kcG9pbnQgNDAwIChpbnZhbGlkX2dyYW50IC9cclxuXHRcdFx0XHRcdFx0XHQvLyBzw7xyZXNpIGRvbG11xZ8gcmVmcmVzaCB0b2tlbiAvIHNpbGVudC1TU08gdGltZW91dCkgZMO2bsO8cCBga2V5Y2xvYWsuaW5pdCgpYCByZWplY3RcclxuXHRcdFx0XHRcdFx0XHQvLyBvbGFiaWxpeW9yLiBZYWthbGFubWF6c2EgXCJFUlJPUiB1bmRlZmluZWRcIiArIGF1dGgnc3V6IGJvenVrIGHDp8SxbMSxxZ8gb2x1eW9yZHUuXHJcblx0XHRcdFx0XHRcdFx0Ly8gSGF0YXnEsSB5YWthbGF5xLFwIHRlbWl6IHllbmlkZW4gbG9naW4nZSB5w7ZubGVuZGlyIChLZXljbG9hayBsb2dpbiDihpIgbWV2Y3V0IFVSTCdlIGTDtm5lcikuXHJcblx0XHRcdFx0XHRcdFx0Y2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiS2V5Y2xvYWsgaW5pdCBiYcWfYXLEsXPEsXog4oCUIHllbmlkZW4gbG9naW4nZSB5w7ZubGVuZGlyaWxpeW9yOlwiLCBlcnIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0dm9pZCBrZXljbG9hay5sb2dpbigpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIEVNUFRZO1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRcdHN3aXRjaE1hcChcclxuXHRcdFx0XHRcdFx0KCkgPT5cclxuXHRcdFx0XHRcdFx0XHRtaWNyb0FwcFNlcnZpY2U/LmluaXQoaHR0cENsaWVudCwgQVBJX0NPTkZJR1MuYXBpKS5waXBlKFxyXG5cdFx0XHRcdFx0XHRcdFx0dGFwKChyZXN1bHQpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJpZGdlLmhvc3RNZW51SXRlbXMuc2V0KHJlc3VsdC5tZW51SXRlbXMpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmlkZ2UucGx1Z2luSnNvbi5zZXQocmVzdWx0LnBsdWdpbnMpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQpID8/IEVNUFRZXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoKVxyXG5cdFx0XHRcdC5hZGQocmVzb2x2ZSlcclxuXHRcdCk7XHJcblxyXG4vKipcclxuICogb25seSB3b3JrcyB3aGVuIGlzSG9zdE1vZGUgaXMgdHJ1ZVxyXG4gKiBtaWNyby1hcHAgYWNjZXNzIGl0cyBvd24gYXBpLmpzb24gZmlsZSB3aGVuIG9wZW5lZCBpbiBob3N0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0QXBpQ29uZmlnT25NRkVNb2RlKFxyXG5cdGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcblx0a2V5Y2xvYWs6IEtleWNsb2FrU2VydmljZSxcclxuXHRhcHBOYW1lOiBBcHBzXHJcbik6ICgpID0+IFByb21pc2U8YW55PiB7XHJcblx0cmV0dXJuICgpID0+IHtcclxuXHRcdGNvbnN0IG9ic2VydmFibGUkID0gaHR0cENsaWVudFxyXG5cdFx0XHQuZ2V0PEFwaUNvbmZpZ3NGYWN0b3J5Pihpc0Rldk1vZGUoKSA/ICcuL2Fzc2V0cy9sb2NhbC1jb25maWdzL2FwaS5sb2NhbC5qc29uJyA6ICcuL2FwaS5qc29uJylcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0dGFwKChjb25maWdzKSA9PiB7XHJcblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKEFQSV9DT05GSUdTLCB7IC4uLmNvbmZpZ3MgfSk7XHJcblx0XHRcdFx0XHRpZiAoYXBwTmFtZSAhPT0gQXBwcy5USE9SICYmIGFwcE5hbWUgIT09IEFwcHMuWUVBUCkge1xyXG5cdFx0XHRcdFx0XHRBUElfQ09ORklHUy5hcGkgPSBBUElfQ09ORklHUy5nZXRFeHRlcm5hbEFwcEVuZHBvaW50KGFwcE5hbWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9ic2VydmFibGUkKTtcclxuXHR9O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9hZEluaXREYXRhID0gKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpID0+ICgpID0+XHJcblx0bmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIF9yZWplY3QpID0+IHtcclxuXHRcdGNvbnN0IGVuZHBvaW50ID0gQVBJX0NPTkZJR1MuYXBpICsgJy91aS1yb3V0ZS1jb250ZW50LWNvbmZpZ3MvYWxsJztcclxuXHRcdGh0dHBDbGllbnQuZ2V0PFJvdXRlQ29uZmlnW10+KGVuZHBvaW50KS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRuZXh0OiAoZGF0YSkgPT4ge1xyXG5cdFx0XHRcdGJyaWRnZS5yb3V0ZUNvbmZpZ3Muc2V0KGRhdGEpO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0ZXJyb3I6IChlcnIpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBpbml0IGRhdGEgZnJvbSAke2VuZHBvaW50fTpgLCBlcnIpO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fSk7XHJcbiJdfQ==
@@ -1,4 +1,10 @@
1
1
  export * from './src/apps.service';
2
2
  export * from './src/interfaces';
3
- export * from './src/reuse-strategy';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL2Jvb3QvY29uZmlnL2FwcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NyYy9hcHBzLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy9pbnRlcmZhY2VzJztcclxuZXhwb3J0ICogZnJvbSAnLi9zcmMvcmV1c2Utc3RyYXRlZ3knO1xyXG4iXX0=
3
+ export * from './src/custom-route-reuse-strategy.class';
4
+ export * from './src/route-close.service';
5
+ export * from './src/nav.service';
6
+ export * from './src/nav-link-context-menu.service';
7
+ export * from './src/nav-link.directive';
8
+ export * from './src/tab-aware-url-serializer';
9
+ export * from './src/safe-navigate';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL2Jvb3QvY29uZmlnL2FwcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NyYy9hcHBzLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy9pbnRlcmZhY2VzJztcclxuZXhwb3J0ICogZnJvbSAnLi9zcmMvY3VzdG9tLXJvdXRlLXJldXNlLXN0cmF0ZWd5LmNsYXNzJztcclxuZXhwb3J0ICogZnJvbSAnLi9zcmMvcm91dGUtY2xvc2Uuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vc3JjL25hdi5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9zcmMvbmF2LWxpbmstY29udGV4dC1tZW51LnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy9uYXYtbGluay5kaXJlY3RpdmUnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy90YWItYXdhcmUtdXJsLXNlcmlhbGl6ZXInO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy9zYWZlLW5hdmlnYXRlJztcclxuIl19
@@ -1,10 +1,11 @@
1
1
  import { Injectable, inject, isDevMode } from '@angular/core';
2
2
  import { Router } from '@angular/router';
3
- import { WebComponentWrapper, startsWith } from '@angular-architects/module-federation-tools';
3
+ import { startsWith } from '@angular-architects/module-federation-tools';
4
4
  import { KeycloakService } from 'keycloak-angular';
5
5
  import { catchError, map, of } from 'rxjs';
6
6
  import { ForbiddenComponent, NotFoundComponent } from 'aril/boot/pages';
7
7
  import { AuthGuard } from './auth.guard';
8
+ import { ArilWebComponentWrapper } from './custom-reuse-outlet.component';
8
9
  import { setRoutePermissions } from './route-permissions';
9
10
  import { ShadowDOMWrapperComponent } from './showdowDOMWrapper';
10
11
  import * as i0 from "@angular/core";
@@ -41,11 +42,18 @@ export class MicroAppService {
41
42
  }));
42
43
  }
43
44
  buildRoutes(options) {
44
- const routes = options.map((options) => {
45
+ const routes = options.map((opt) => {
46
+ if (!opt.remoteName) {
47
+ // `remoteName` boşsa Strategy `getRouteKey` doğru tab key üretemiyor → tab izolasyonu
48
+ // silent kırılıyordu. Fail-fast: config hatasını boot-time'da yakala, runtime'da
49
+ // kullanıcı boş tab'lar görmesin.
50
+ throw new Error(`[MicroAppService.buildRoutes] PluginConfig.remoteName eksik. ` +
51
+ `Route oluşturulamaz — config kontrol et: ${JSON.stringify(opt)}`);
52
+ }
45
53
  return {
46
- matcher: startsWith(options.remoteName),
47
- component: options.shadowDomPassive ? WebComponentWrapper : ShadowDOMWrapperComponent,
48
- data: options,
54
+ matcher: startsWith(opt.remoteName),
55
+ component: opt.shadowDomPassive ? ArilWebComponentWrapper : ShadowDOMWrapperComponent,
56
+ data: opt,
49
57
  canActivate: [AuthGuard]
50
58
  };
51
59
  });
@@ -80,4 +88,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
80
88
  type: Injectable,
81
89
  args: [{ providedIn: 'root' }]
82
90
  }] });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L2NvbmZpZy9hcHBzL3NyYy9hcHBzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQ04sbUJBQW1CLEVBRW5CLFVBQVUsRUFDVixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQWMsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFRaEUsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFa0IsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixhQUFRLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTVDLGNBQVMsR0FBYSxFQUFFLENBQUM7S0EwRWpDO0lBeEVBLElBQUksQ0FBQyxVQUFzQixFQUFFLE9BQWU7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzlDLE9BQU8sVUFBVTthQUNmLEdBQUcsQ0FBVSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENB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QUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVPLGFBQWEsQ0FBQyxjQUF5QjtRQUM5QyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDOzhHQTdFVyxlQUFlO2tIQUFmLGVBQWUsY0FERixNQUFNOzsyRkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQge1xyXG5cdFdlYkNvbXBvbmVudFdyYXBwZXIsXHJcblx0V2ViQ29tcG9uZW50V3JhcHBlck9wdGlvbnMsXHJcblx0c3RhcnRzV2l0aFxyXG59IGZyb20gJ0Bhbmd1bGFyLWFyY2hpdGVjdHMvbW9kdWxlLWZlZGVyYXRpb24tdG9vbHMnO1xyXG5pbXBvcnQgeyBLZXljbG9ha1NlcnZpY2UgfSBmcm9tICdrZXljbG9hay1hbmd1bGFyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRm9yYmlkZGVuQ29tcG9uZW50LCBOb3RGb3VuZENvbXBvbmVudCB9IGZyb20gJ2FyaWwvYm9vdC9wYWdlcyc7XHJcblxyXG5pbXBvcnQgeyBBdXRoR3VhcmQgfSBmcm9tICcuL2F1dGguZ3VhcmQnO1xyXG5pbXBvcnQgeyBBcHBzRFRPLCBFeHRlbnNpb25Db25maWcsIFBsdWdpbkNvbmZpZywgUGx1Z2luTWVudUl0ZW0gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBzZXRSb3V0ZVBlcm1pc3Npb25zIH0gZnJvbSAnLi9yb3V0ZS1wZXJtaXNzaW9ucyc7XHJcbmltcG9ydCB7IFNoYWRvd0RPTVdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL3Nob3dkb3dET01XcmFwcGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWljcm9BcHBJbml0UmVzdWx0IHtcclxuXHRtZW51SXRlbXM6IFBsdWdpbk1lbnVJdGVtW107XHJcblx0cGx1Z2luczogUmVjb3JkPHN0cmluZywgRXh0ZW5zaW9uQ29uZmlnPjtcclxufVxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIE1pY3JvQXBwU2VydmljZSB7XHJcblx0cHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuXHRwcml2YXRlIHJlYWRvbmx5IGtleWNsb2FrID0gaW5qZWN0KEtleWNsb2FrU2VydmljZSk7XHJcblxyXG5cdHByaXZhdGUgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHRpbml0KGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGhvc3RBUEk6IHN0cmluZyk6IE9ic2VydmFibGU8TWljcm9BcHBJbml0UmVzdWx0PiB7XHJcblx0XHR0aGlzLnVzZXJSb2xlcyA9IHRoaXMua2V5Y2xvYWsuZ2V0VXNlclJvbGVzKCk7XHJcblx0XHRyZXR1cm4gaHR0cENsaWVudFxyXG5cdFx0XHQuZ2V0PEFwcHNEVE8+KGlzRGV2TW9kZSgpID8gJy4vYXNzZXRzL2xvY2FsLWNvbmZpZ3MvYXBwLmxvY2FsLmpzb24nIDogaG9zdEFQSSArICcvdWktc2lkZWJhci1jb25maWdzJylcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0bWFwKChhcHBzKSA9PiB7XHJcblx0XHRcdFx0XHRzZXRSb3V0ZVBlcm1pc3Npb25zKGFwcHMubWVudUl0ZW1zKTtcclxuXHRcdFx0XHRcdGNvbnN0IHJvdXRlcyA9IHRoaXMuYnVpbGRSb3V0ZXMoWy4uLmFwcHMubW9kdWxlcywgLi4uYXBwcy5wbHVnaW5zXSk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5yb3V0ZXIucmVzZXRDb25maWcoW1xyXG5cdFx0XHRcdFx0XHQuLi50aGlzLnJvdXRlci5jb25maWcsXHJcblx0XHRcdFx0XHRcdC4uLnJvdXRlcyxcclxuXHRcdFx0XHRcdFx0eyBwYXRoOiAnZm9yYmlkZGVuJywgY29tcG9uZW50OiBGb3JiaWRkZW5Db21wb25lbnQgfSxcclxuXHRcdFx0XHRcdFx0eyBwYXRoOiAnKionLCBjb21wb25lbnQ6IE5vdEZvdW5kQ29tcG9uZW50IH1cclxuXHRcdFx0XHRcdF0pO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZpbHRlcmVkTWVudUl0ZW1zID0gdGhpcy5maWx0ZXJNZW51SXRlbXNCeVJvbGUoYXBwcy5tZW51SXRlbXMpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0bWVudUl0ZW1zOiBbXHJcblx0XHRcdFx0XHRcdFx0eyByb290OiB0cnVlLCBsYWJlbDogeyB0cjogJ0FuYXNheWZhJywgZW46ICdIb21lJyB9LCBpY29uOiAncGkgcGktZncgcGktaG9tZScsIHJvdXRlckxpbms6ICcvJyB9IGFzIFBsdWdpbk1lbnVJdGVtLFxyXG5cdFx0XHRcdFx0XHRcdC4uLmZpbHRlcmVkTWVudUl0ZW1zXHJcblx0XHRcdFx0XHRcdF0sXHJcblx0XHRcdFx0XHRcdHBsdWdpbnM6IGFwcHMuZXh0ZW5zaW9ucyB8fCB7fVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0XHRjYXRjaEVycm9yKChlcnIpID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdFcnJvciBNaWNybyBBcHBzIExvYWRpbmcnLCBlcnIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIG9mPE1pY3JvQXBwSW5pdFJlc3VsdD4oeyBtZW51SXRlbXM6IFtdLCBwbHVnaW5zOiB7fSB9KTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cdH1cclxuXHJcblx0YnVpbGRSb3V0ZXMob3B0aW9uczogUGx1Z2luQ29uZmlnW10pOiBSb3V0ZXMge1xyXG5cdFx0Y29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBvcHRpb25zLm1hcCgob3B0aW9ucykgPT4ge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdG1hdGNoZXI6IHN0YXJ0c1dpdGgob3B0aW9ucy5yZW1vdGVOYW1lKSxcclxuXHRcdFx0XHRjb21wb25lbnQ6IG9wdGlvbnMuc2hhZG93RG9tUGFzc2l2ZSA/IFdlYkNvbXBvbmVudFdyYXBwZXIgOiBTaGFkb3dET01XcmFwcGVyQ29tcG9uZW50LFxyXG5cdFx0XHRcdGRhdGE6IG9wdGlvbnMgYXMgV2ViQ29tcG9uZW50V3JhcHBlck9wdGlvbnMsXHJcblx0XHRcdFx0Y2FuQWN0aXZhdGU6IFtBdXRoR3VhcmRdXHJcblx0XHRcdH07XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gcm91dGVzO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBmaWx0ZXJNZW51SXRlbXNCeVJvbGUoaXRlbXM6IFBsdWdpbk1lbnVJdGVtW10pOiBQbHVnaW5NZW51SXRlbVtdIHtcclxuXHRcdHJldHVybiBpdGVtcy5yZWR1Y2U8UGx1Z2luTWVudUl0ZW1bXT4oKGFjYywgaXRlbSkgPT4ge1xyXG5cdFx0XHRpZiAoIXRoaXMuaGFzUGVybWlzc2lvbihpdGVtLnBlcm1pdHRlZFJvbGVzKSkge1xyXG5cdFx0XHRcdHJldHVybiBhY2M7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGZpbHRlcmVkSXRlbSA9IHsgLi4uaXRlbSB9O1xyXG5cclxuXHRcdFx0aWYgKGZpbHRlcmVkSXRlbS5pdGVtcz8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0ZmlsdGVyZWRJdGVtLml0ZW1zID0gdGhpcy5maWx0ZXJNZW51SXRlbXNCeVJvbGUoZmlsdGVyZWRJdGVtLml0ZW1zKTtcclxuXHJcblx0XHRcdFx0aWYgKCFmaWx0ZXJlZEl0ZW0uaXRlbXMubGVuZ3RoICYmICFmaWx0ZXJlZEl0ZW0ucm91dGVyTGluaykge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGFjYy5wdXNoKGZpbHRlcmVkSXRlbSk7XHJcblx0XHRcdHJldHVybiBhY2M7XHJcblx0XHR9LCBbXSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGhhc1Blcm1pc3Npb24ocGVybWl0dGVkUm9sZXM/OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFwZXJtaXR0ZWRSb2xlcz8ubGVuZ3RoKSB7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHBlcm1pdHRlZFJvbGVzLnNvbWUoKHJvbGUpID0+IHRoaXMudXNlclJvbGVzLmluY2x1ZGVzKHJvbGUpKTtcclxuXHR9XHJcbn1cclxuIl19
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L2NvbmZpZy9hcHBzL3NyYy9hcHBzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBRU4sVUFBVSxFQUNWLE1BQU0sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBYyxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQVFoRSxNQUFNLE9BQU8sZUFBZTtJQUQ1QjtRQUVrQixXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLGFBQVEsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFNUMsY0FBUyxHQUFhLEVBQUUsQ0FBQztLQW1GakM7SUFqRkEsSUFBSSxDQUFDLFVBQXNCLEVBQUUsT0FBZTtRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUMsT0FBTyxVQUFVO2FBQ2Ys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QUM7Z0JBQ2hDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUM1RCxPQUFPLEdBQUcsQ0FBQztnQkFDWixDQUFDO1lBQ0YsQ0FBQztZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkIsT0FBTyxHQUFHLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8sYUFBYSxDQUFDLGNBQXlCO1FBQzlDLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7OEdBdEZXLGVBQWU7a0hBQWYsZUFBZSxjQURGLE1BQU07OzJGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCwgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7XHJcblx0V2ViQ29tcG9uZW50V3JhcHBlck9wdGlvbnMsXHJcblx0c3RhcnRzV2l0aFxyXG59IGZyb20gJ0Bhbmd1bGFyLWFyY2hpdGVjdHMvbW9kdWxlLWZlZGVyYXRpb24tdG9vbHMnO1xyXG5pbXBvcnQgeyBLZXljbG9ha1NlcnZpY2UgfSBmcm9tICdrZXljbG9hay1hbmd1bGFyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRm9yYmlkZGVuQ29tcG9uZW50LCBOb3RGb3VuZENvbXBvbmVudCB9IGZyb20gJ2FyaWwvYm9vdC9wYWdlcyc7XHJcblxyXG5pbXBvcnQgeyBBdXRoR3VhcmQgfSBmcm9tICcuL2F1dGguZ3VhcmQnO1xyXG5pbXBvcnQgeyBBcmlsV2ViQ29tcG9uZW50V3JhcHBlciB9IGZyb20gJy4vY3VzdG9tLXJldXNlLW91dGxldC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBcHBzRFRPLCBFeHRlbnNpb25Db25maWcsIFBsdWdpbkNvbmZpZywgUGx1Z2luTWVudUl0ZW0gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBzZXRSb3V0ZVBlcm1pc3Npb25zIH0gZnJvbSAnLi9yb3V0ZS1wZXJtaXNzaW9ucyc7XHJcbmltcG9ydCB7IFNoYWRvd0RPTVdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL3Nob3dkb3dET01XcmFwcGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWljcm9BcHBJbml0UmVzdWx0IHtcclxuXHRtZW51SXRlbXM6IFBsdWdpbk1lbnVJdGVtW107XHJcblx0cGx1Z2luczogUmVjb3JkPHN0cmluZywgRXh0ZW5zaW9uQ29uZmlnPjtcclxufVxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIE1pY3JvQXBwU2VydmljZSB7XHJcblx0cHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuXHRwcml2YXRlIHJlYWRvbmx5IGtleWNsb2FrID0gaW5qZWN0KEtleWNsb2FrU2VydmljZSk7XHJcblxyXG5cdHByaXZhdGUgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHRpbml0KGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGhvc3RBUEk6IHN0cmluZyk6IE9ic2VydmFibGU8TWljcm9BcHBJbml0UmVzdWx0PiB7XHJcblx0XHR0aGlzLnVzZXJSb2xlcyA9IHRoaXMua2V5Y2xvYWsuZ2V0VXNlclJvbGVzKCk7XHJcblx0XHRyZXR1cm4gaHR0cENsaWVudFxyXG5cdFx0XHQuZ2V0PEFwcHNEVE8+KGlzRGV2TW9kZSgpID8gJy4vYXNzZXRzL2xvY2FsLWNvbmZpZ3MvYXBwLmxvY2FsLmpzb24nIDogaG9zdEFQSSArICcvdWktc2lkZWJhci1jb25maWdzJylcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0bWFwKChhcHBzKSA9PiB7XHJcblx0XHRcdFx0XHRzZXRSb3V0ZVBlcm1pc3Npb25zKGFwcHMubWVudUl0ZW1zKTtcclxuXHRcdFx0XHRcdGNvbnN0IHJvdXRlcyA9IHRoaXMuYnVpbGRSb3V0ZXMoWy4uLmFwcHMubW9kdWxlcywgLi4uYXBwcy5wbHVnaW5zXSk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5yb3V0ZXIucmVzZXRDb25maWcoW1xyXG5cdFx0XHRcdFx0XHQuLi50aGlzLnJvdXRlci5jb25maWcsXHJcblx0XHRcdFx0XHRcdC4uLnJvdXRlcyxcclxuXHRcdFx0XHRcdFx0eyBwYXRoOiAnZm9yYmlkZGVuJywgY29tcG9uZW50OiBGb3JiaWRkZW5Db21wb25lbnQgfSxcclxuXHRcdFx0XHRcdFx0eyBwYXRoOiAnKionLCBjb21wb25lbnQ6IE5vdEZvdW5kQ29tcG9uZW50IH1cclxuXHRcdFx0XHRcdF0pO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZpbHRlcmVkTWVudUl0ZW1zID0gdGhpcy5maWx0ZXJNZW51SXRlbXNCeVJvbGUoYXBwcy5tZW51SXRlbXMpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0bWVudUl0ZW1zOiBbXHJcblx0XHRcdFx0XHRcdFx0eyByb290OiB0cnVlLCBsYWJlbDogeyB0cjogJ0FuYXNheWZhJywgZW46ICdIb21lJyB9LCBpY29uOiAncGkgcGktZncgcGktaG9tZScsIHJvdXRlckxpbms6ICcvJyB9IGFzIFBsdWdpbk1lbnVJdGVtLFxyXG5cdFx0XHRcdFx0XHRcdC4uLmZpbHRlcmVkTWVudUl0ZW1zXHJcblx0XHRcdFx0XHRcdF0sXHJcblx0XHRcdFx0XHRcdHBsdWdpbnM6IGFwcHMuZXh0ZW5zaW9ucyB8fCB7fVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0XHRjYXRjaEVycm9yKChlcnIpID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdFcnJvciBNaWNybyBBcHBzIExvYWRpbmcnLCBlcnIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIG9mPE1pY3JvQXBwSW5pdFJlc3VsdD4oeyBtZW51SXRlbXM6IFtdLCBwbHVnaW5zOiB7fSB9KTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cdH1cclxuXHJcblx0YnVpbGRSb3V0ZXMob3B0aW9uczogUGx1Z2luQ29uZmlnW10pOiBSb3V0ZXMge1xyXG5cdFx0Y29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBvcHRpb25zLm1hcCgob3B0KSA9PiB7XHJcblx0XHRcdGlmICghb3B0LnJlbW90ZU5hbWUpIHtcclxuXHRcdFx0XHQvLyBgcmVtb3RlTmFtZWAgYm/Fn3NhIFN0cmF0ZWd5IGBnZXRSb3V0ZUtleWAgZG/En3J1IHRhYiBrZXkgw7xyZXRlbWl5b3Ig4oaSIHRhYiBpem9sYXN5b251XHJcblx0XHRcdFx0Ly8gc2lsZW50IGvEsXLEsWzEsXlvcmR1LiBGYWlsLWZhc3Q6IGNvbmZpZyBoYXRhc8SxbsSxIGJvb3QtdGltZSdkYSB5YWthbGEsIHJ1bnRpbWUnZGFcclxuXHRcdFx0XHQvLyBrdWxsYW7EsWPEsSBib8WfIHRhYidsYXIgZ8O2cm1lc2luLlxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcclxuXHRcdFx0XHRcdGBbTWljcm9BcHBTZXJ2aWNlLmJ1aWxkUm91dGVzXSBQbHVnaW5Db25maWcucmVtb3RlTmFtZSBla3Npay4gYCArXHJcblx0XHRcdFx0XHRgUm91dGUgb2x1xZ90dXJ1bGFtYXog4oCUIGNvbmZpZyBrb250cm9sIGV0OiAke0pTT04uc3RyaW5naWZ5KG9wdCl9YFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRtYXRjaGVyOiBzdGFydHNXaXRoKG9wdC5yZW1vdGVOYW1lKSxcclxuXHRcdFx0XHRjb21wb25lbnQ6IG9wdC5zaGFkb3dEb21QYXNzaXZlID8gQXJpbFdlYkNvbXBvbmVudFdyYXBwZXIgOiBTaGFkb3dET01XcmFwcGVyQ29tcG9uZW50LFxyXG5cdFx0XHRcdGRhdGE6IG9wdCBhcyBXZWJDb21wb25lbnRXcmFwcGVyT3B0aW9ucyxcclxuXHRcdFx0XHRjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZF1cclxuXHRcdFx0fTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiByb3V0ZXM7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGZpbHRlck1lbnVJdGVtc0J5Um9sZShpdGVtczogUGx1Z2luTWVudUl0ZW1bXSk6IFBsdWdpbk1lbnVJdGVtW10ge1xyXG5cdFx0cmV0dXJuIGl0ZW1zLnJlZHVjZTxQbHVnaW5NZW51SXRlbVtdPigoYWNjLCBpdGVtKSA9PiB7XHJcblx0XHRcdGlmICghdGhpcy5oYXNQZXJtaXNzaW9uKGl0ZW0ucGVybWl0dGVkUm9sZXMpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZmlsdGVyZWRJdGVtID0geyAuLi5pdGVtIH07XHJcblxyXG5cdFx0XHRpZiAoZmlsdGVyZWRJdGVtLml0ZW1zPy5sZW5ndGgpIHtcclxuXHRcdFx0XHRmaWx0ZXJlZEl0ZW0uaXRlbXMgPSB0aGlzLmZpbHRlck1lbnVJdGVtc0J5Um9sZShmaWx0ZXJlZEl0ZW0uaXRlbXMpO1xyXG5cclxuXHRcdFx0XHRpZiAoIWZpbHRlcmVkSXRlbS5pdGVtcy5sZW5ndGggJiYgIWZpbHRlcmVkSXRlbS5yb3V0ZXJMaW5rKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gYWNjO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YWNjLnB1c2goZmlsdGVyZWRJdGVtKTtcclxuXHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdH0sIFtdKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgaGFzUGVybWlzc2lvbihwZXJtaXR0ZWRSb2xlcz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIXBlcm1pdHRlZFJvbGVzPy5sZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcGVybWl0dGVkUm9sZXMuc29tZSgocm9sZSkgPT4gdGhpcy51c2VyUm9sZXMuaW5jbHVkZXMocm9sZSkpO1xyXG5cdH1cclxufVxyXG4iXX0=
@@ -0,0 +1,207 @@
1
+ import { Component, ElementRef, Input, ViewChild, } from '@angular/core';
2
+ import { loadRemoteModule, } from '@angular-architects/module-federation-runtime';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ // eslint-disable-next-line @angular-eslint/component-class-suffix
6
+ export class ArilWebComponentWrapper {
7
+ constructor(route) {
8
+ this.route = route;
9
+ this.isDestroyed = false;
10
+ // setupEvents tarafından bağlanan listener'ları izleriz — ngOnDestroy/yeniden bind sırasında
11
+ // doğru şekilde kaldırılmaları için.
12
+ this.registeredEvents = [];
13
+ // Route reuse stratejisi ile wrapper arasındaki sözleşme:
14
+ // - `needsRestore`: strategy retrieve sırasında set eder; ngAfterViewInit element'i view'a ekler.
15
+ // - `propsUpdated`: restore sonrası populateProps çağrısının ngOnChanges ile çakışmasını
16
+ // engellemek için kullanılır (idempotency flag).
17
+ this.needsRestore = false;
18
+ this.propsUpdated = false;
19
+ }
20
+ ngOnInit() {
21
+ // Component tekrar eklendiğinde (reuse durumunda)
22
+ // Element restore işlemini dene (view hazır olmayabilir, o durumda ngAfterViewInit'te tekrar denenecek)
23
+ if (this.element) {
24
+ console.log('[ArilWC] ngOnInit: Element mevcut, restore deneniyor...');
25
+ // setTimeout ile bir sonraki tick'te dene (view henüz hazır olmayabilir)
26
+ setTimeout(() => {
27
+ this.restoreElement();
28
+ }, 0);
29
+ }
30
+ }
31
+ ngOnChanges() {
32
+ if (!this.element || this.isDestroyed)
33
+ return;
34
+ this.populateProps();
35
+ }
36
+ populateProps() {
37
+ if (!this.element || !this.props)
38
+ return;
39
+ // Custom element'e dinamik prop set ediyoruz; HTMLElement bunun için index signature
40
+ // taşımıyor, bu yüzden Record cast'i ile yazıyoruz.
41
+ const target = this.element;
42
+ for (const prop in this.props) {
43
+ target[prop] = this.props[prop];
44
+ }
45
+ }
46
+ setupEvents() {
47
+ if (!this.element)
48
+ return;
49
+ // İdempotent: önce eski listener'ları kaldır, sonra yenilerini bağla.
50
+ this.teardownEvents();
51
+ if (!this.events)
52
+ return;
53
+ for (const event in this.events) {
54
+ const handler = this.events[event];
55
+ this.element.addEventListener(event, handler);
56
+ this.registeredEvents.push({ name: event, handler });
57
+ }
58
+ }
59
+ teardownEvents() {
60
+ if (!this.element) {
61
+ this.registeredEvents = [];
62
+ return;
63
+ }
64
+ for (const { name, handler } of this.registeredEvents) {
65
+ this.element.removeEventListener(name, handler);
66
+ }
67
+ this.registeredEvents = [];
68
+ }
69
+ restoreElement() {
70
+ if (!this.element) {
71
+ console.warn('restoreElement: element yok');
72
+ return;
73
+ }
74
+ if (!this.vc?.nativeElement) {
75
+ console.warn('restoreElement: vc.nativeElement yok, tekrar denenecek');
76
+ // View henüz hazır değilse, bir sonraki lifecycle hook'ta tekrar dene
77
+ return;
78
+ }
79
+ // Hidden container'dan element'i al
80
+ const hiddenContainer = this.getHiddenContainer();
81
+ if (hiddenContainer.contains(this.element)) {
82
+ // Element hidden container'da, geri al
83
+ hiddenContainer.removeChild(this.element);
84
+ this.vc.nativeElement.appendChild(this.element);
85
+ this.populateProps();
86
+ console.log('Web component hidden container\'dan geri alındı ve DOM\'a eklendi');
87
+ }
88
+ else if (!this.vc.nativeElement.contains(this.element)) {
89
+ // Element başka bir yerdeyse veya hiçbir yerde değilse, direkt ekle
90
+ if (this.element.parentNode) {
91
+ this.element.parentNode.removeChild(this.element);
92
+ }
93
+ this.vc.nativeElement.appendChild(this.element);
94
+ this.populateProps();
95
+ console.log('Web component DOM\'a geri eklendi');
96
+ }
97
+ else {
98
+ // Element zaten DOM'da, sadece props'ları güncelle
99
+ this.populateProps();
100
+ console.log('Web component zaten DOM\'da, props güncellendi');
101
+ }
102
+ }
103
+ getHiddenContainer() {
104
+ const slot = globalThis;
105
+ let container = slot.__arilWebComponentHiddenContainer;
106
+ if (!container) {
107
+ container = document.createElement('div');
108
+ container.style.display = 'none';
109
+ container.style.position = 'absolute';
110
+ container.style.left = '-9999px';
111
+ container.style.top = '-9999px';
112
+ container.style.visibility = 'hidden';
113
+ document.body.appendChild(container);
114
+ slot.__arilWebComponentHiddenContainer = container;
115
+ }
116
+ return container;
117
+ }
118
+ async ngAfterContentInit() {
119
+ const options = this.options ?? this.route.snapshot.data;
120
+ if (!options) {
121
+ console.warn('Web component options bulunamadı');
122
+ return;
123
+ }
124
+ // Eğer element zaten varsa (reuse durumunda), restore işlemi ngAfterViewInit'te yapılacak
125
+ if (this.element) {
126
+ return;
127
+ }
128
+ try {
129
+ await loadRemoteModule(options);
130
+ this.element = document.createElement(options.elementName);
131
+ // Tab izolasyonu için tab kimliğini element'e attribute olarak yaz. MFE bootstrap.ts
132
+ // `connectedCallback`'te bu attribute'u okuyup kendine ait yeni bir Angular Application
133
+ // yaratır → her tab kendi Injector + Router'ına sahip olur. Subscribe ile sonraki
134
+ // `_tab` değişimlerini de yakala (firstCheckForRoute replaceUrl sonrası).
135
+ this.routeSub = this.route.queryParams.subscribe((params) => {
136
+ const tabId = params['_tab'] ?? '';
137
+ if (tabId && this.element && this.element.getAttribute('aril-tab-id') !== tabId) {
138
+ this.element.setAttribute('aril-tab-id', tabId);
139
+ }
140
+ });
141
+ this.populateProps();
142
+ this.setupEvents();
143
+ if (this.vc?.nativeElement) {
144
+ this.vc.nativeElement.appendChild(this.element);
145
+ }
146
+ }
147
+ catch (error) {
148
+ console.error('Web component yüklenirken hata:', error);
149
+ }
150
+ }
151
+ ngAfterViewInit() {
152
+ // View hazır olduğunda, eğer element varsa (reuse durumunda) restore et
153
+ if (this.element) {
154
+ console.log('ngAfterViewInit: Element mevcut, restore deneniyor...');
155
+ // Strategy `needsRestore` flag'i set etmişse: element hidden container'dan çıkarılmış
156
+ // ama view henüz hazır olmadığı için view'a eklenememiş. Şimdi ekle.
157
+ if (this.needsRestore) {
158
+ this.needsRestore = false;
159
+ if (this.vc?.nativeElement && !this.vc.nativeElement.contains(this.element)) {
160
+ this.vc.nativeElement.appendChild(this.element);
161
+ this.populateProps();
162
+ this.propsUpdated = true;
163
+ console.log('Web component element component view\'a eklendi (ngAfterViewInit)');
164
+ }
165
+ }
166
+ else if (!this.propsUpdated) {
167
+ // Normal restore işlemi (eğer props güncellenmemişse)
168
+ this.restoreElement();
169
+ this.propsUpdated = true;
170
+ }
171
+ else {
172
+ // Element zaten view'da, sadece props'ları güncelle
173
+ this.populateProps();
174
+ }
175
+ }
176
+ }
177
+ ngOnDestroy() {
178
+ // Route reuse stratejisi kullanıldığında, component destroy edilmez
179
+ // Route reuse stratejisi store() metodunda element'i hidden container'a taşıyacak.
180
+ // Yine de gerçekten destroy edildiğimiz senaryolarda (farklı remote, tab cleanup vs.)
181
+ // event listener'ları + queryParams subscription sızdırmamak için kaldırırız.
182
+ this.teardownEvents();
183
+ this.routeSub?.unsubscribe();
184
+ this.routeSub = undefined;
185
+ this.isDestroyed = true;
186
+ }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ArilWebComponentWrapper, deps: [{ token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
188
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: ArilWebComponentWrapper, selector: "mft-wc-wrapper", inputs: { options: "options", props: "props", events: "events" }, viewQueries: [{ propertyName: "vc", first: true, predicate: ["vc"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: '<div #vc></div>', isInline: true }); }
189
+ }
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ArilWebComponentWrapper, decorators: [{
191
+ type: Component,
192
+ args: [{
193
+ // eslint-disable-next-line @angular-eslint/component-selector
194
+ selector: 'mft-wc-wrapper',
195
+ template: '<div #vc></div>',
196
+ }]
197
+ }], ctorParameters: () => [{ type: i1.ActivatedRoute }], propDecorators: { vc: [{
198
+ type: ViewChild,
199
+ args: ['vc', { read: ElementRef, static: true }]
200
+ }], options: [{
201
+ type: Input
202
+ }], props: [{
203
+ type: Input
204
+ }], events: [{
205
+ type: Input
206
+ }] } });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJldXNlLW91dGxldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL2Jvb3QvY29uZmlnL2FwcHMvc3JjL2N1c3RvbS1yZXVzZS1vdXRsZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFJTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLCtDQUErQyxDQUFDOzs7QUFXdkQsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBTyx1QkFBdUI7SUFxQmxDLFlBQW9CLEtBQXFCO1FBQXJCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBWmpDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzVCLDZGQUE2RjtRQUM3RixxQ0FBcUM7UUFDN0IscUJBQWdCLEdBQW9ELEVBQUUsQ0FBQztRQUUvRSwwREFBMEQ7UUFDMUQsa0dBQWtHO1FBQ2xHLHlGQUF5RjtRQUN6RixtREFBbUQ7UUFDbkQsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsaUJBQVksR0FBRyxLQUFLLENBQUM7SUFFdUIsQ0FBQztJQUU3QyxRQUFRO1FBQ04sa0RBQWtEO1FBQ2xELHdHQUF3RztRQUN4RyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7WUFDdkUseUVBQXlFO1lBQ3pFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztR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RSxtRkFBbUY7UUFDbkYsc0ZBQXNGO1FBQ3RGLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDOzhHQTVNVSx1QkFBdUI7a0dBQXZCLHVCQUF1Qiw2TEFDVCxVQUFVLGdFQUp6QixpQkFBaUI7OzJGQUdoQix1QkFBdUI7a0JBTm5DLFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixRQUFRLEVBQUUsaUJBQWlCO2lCQUM1QjttRkFJQyxFQUFFO3NCQURELFNBQVM7dUJBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUcxQyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQge1xyXG4gIExvYWRSZW1vdGVNb2R1bGVPcHRpb25zLFxyXG4gIGxvYWRSZW1vdGVNb2R1bGUsXHJcbn0gZnJvbSAnQGFuZ3VsYXItYXJjaGl0ZWN0cy9tb2R1bGUtZmVkZXJhdGlvbi1ydW50aW1lJztcclxuXHJcbmV4cG9ydCB0eXBlIFdlYkNvbXBvbmVudFdyYXBwZXJPcHRpb25zID0gTG9hZFJlbW90ZU1vZHVsZU9wdGlvbnMgJiB7XHJcbiAgZWxlbWVudE5hbWU6IHN0cmluZztcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdtZnQtd2Mtd3JhcHBlcicsXHJcbiAgdGVtcGxhdGU6ICc8ZGl2ICN2Yz48L2Rpdj4nLFxyXG59KVxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1jbGFzcy1zdWZmaXhcclxuZXhwb3J0IGNsYXNzIEFyaWxXZWJDb21wb25lbnRXcmFwcGVyIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZCgndmMnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHZjPzogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCkgb3B0aW9ucz86IFdlYkNvbXBvbmVudFdyYXBwZXJPcHRpb25zO1xyXG4gIEBJbnB1dCgpIHByb3BzPzogeyBbcHJvcDogc3RyaW5nXTogdW5rbm93biB9O1xyXG4gIEBJbnB1dCgpIGV2ZW50cz86IHsgW2V2ZW50OiBzdHJpbmddOiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkIH07XHJcblxyXG4gIGVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIGlzRGVzdHJveWVkID0gZmFsc2U7XHJcbiAgLy8gc2V0dXBFdmVudHMgdGFyYWbEsW5kYW4gYmHEn2xhbmFuIGxpc3RlbmVyJ2xhcsSxIGl6bGVyaXog4oCUIG5nT25EZXN0cm95L3llbmlkZW4gYmluZCBzxLFyYXPEsW5kYVxyXG4gIC8vIGRvxJ9ydSDFn2VraWxkZSBrYWxkxLFyxLFsbWFsYXLEsSBpw6dpbi5cclxuICBwcml2YXRlIHJlZ2lzdGVyZWRFdmVudHM6IHsgbmFtZTogc3RyaW5nOyBoYW5kbGVyOiAoZTogRXZlbnQpID0+IHZvaWQgfVtdID0gW107XHJcbiAgcHJpdmF0ZSByb3V0ZVN1Yj86IHsgdW5zdWJzY3JpYmUoKTogdm9pZCB9O1xyXG4gIC8vIFJvdXRlIHJldXNlIHN0cmF0ZWppc2kgaWxlIHdyYXBwZXIgYXJhc8SxbmRha2kgc8O2emxlxZ9tZTpcclxuICAvLyAtIGBuZWVkc1Jlc3RvcmVgOiBzdHJhdGVneSByZXRyaWV2ZSBzxLFyYXPEsW5kYSBzZXQgZWRlcjsgbmdBZnRlclZpZXdJbml0IGVsZW1lbnQnaSB2aWV3J2EgZWtsZXIuXHJcbiAgLy8gLSBgcHJvcHNVcGRhdGVkYDogcmVzdG9yZSBzb25yYXPEsSBwb3B1bGF0ZVByb3BzIMOnYcSfcsSxc8SxbsSxbiBuZ09uQ2hhbmdlcyBpbGUgw6dha8SxxZ9tYXPEsW7EsVxyXG4gIC8vICAgZW5nZWxsZW1layBpw6dpbiBrdWxsYW7EsWzEsXIgKGlkZW1wb3RlbmN5IGZsYWcpLlxyXG4gIG5lZWRzUmVzdG9yZSA9IGZhbHNlO1xyXG4gIHByb3BzVXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBDb21wb25lbnQgdGVrcmFyIGVrbGVuZGnEn2luZGUgKHJldXNlIGR1cnVtdW5kYSlcclxuICAgIC8vIEVsZW1lbnQgcmVzdG9yZSBpxZ9sZW1pbmkgZGVuZSAodmlldyBoYXrEsXIgb2xtYXlhYmlsaXIsIG8gZHVydW1kYSBuZ0FmdGVyVmlld0luaXQndGUgdGVrcmFyIGRlbmVuZWNlaylcclxuICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1tBcmlsV0NdIG5nT25Jbml0OiBFbGVtZW50IG1ldmN1dCwgcmVzdG9yZSBkZW5lbml5b3IuLi4nKTtcclxuICAgICAgLy8gc2V0VGltZW91dCBpbGUgYmlyIHNvbnJha2kgdGljayd0ZSBkZW5lICh2aWV3IGhlbsO8eiBoYXrEsXIgb2xtYXlhYmlsaXIpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzdG9yZUVsZW1lbnQoKTtcclxuICAgICAgfSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50IHx8IHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnBvcHVsYXRlUHJvcHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcG9wdWxhdGVQcm9wcygpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50IHx8ICF0aGlzLnByb3BzKSByZXR1cm47XHJcblxyXG4gICAgLy8gQ3VzdG9tIGVsZW1lbnQnZSBkaW5hbWlrIHByb3Agc2V0IGVkaXlvcnV6OyBIVE1MRWxlbWVudCBidW51biBpw6dpbiBpbmRleCBzaWduYXR1cmVcclxuICAgIC8vIHRhxZ/EsW3EsXlvciwgYnUgecO8emRlbiBSZWNvcmQgY2FzdCdpIGlsZSB5YXrEsXlvcnV6LlxyXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5lbGVtZW50IGFzIEhUTUxFbGVtZW50ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcy5wcm9wcykge1xyXG4gICAgICB0YXJnZXRbcHJvcF0gPSB0aGlzLnByb3BzW3Byb3BdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEV2ZW50cygpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50KSByZXR1cm47XHJcbiAgICAvLyDEsGRlbXBvdGVudDogw7ZuY2UgZXNraSBsaXN0ZW5lcidsYXLEsSBrYWxkxLFyLCBzb25yYSB5ZW5pbGVyaW5pIGJhxJ9sYS5cclxuICAgIHRoaXMudGVhcmRvd25FdmVudHMoKTtcclxuICAgIGlmICghdGhpcy5ldmVudHMpIHJldHVybjtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuZXZlbnRzKSB7XHJcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmV2ZW50c1tldmVudF07XHJcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcclxuICAgICAgdGhpcy5yZWdpc3RlcmVkRXZlbnRzLnB1c2goeyBuYW1lOiBldmVudCwgaGFuZGxlciB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGVhcmRvd25FdmVudHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyZWRFdmVudHMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCB7IG5hbWUsIGhhbmRsZXIgfSBvZiB0aGlzLnJlZ2lzdGVyZWRFdmVudHMpIHtcclxuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRFdmVudHMgPSBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzdG9yZUVsZW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3Jlc3RvcmVFbGVtZW50OiBlbGVtZW50IHlvaycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnZjPy5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybigncmVzdG9yZUVsZW1lbnQ6IHZjLm5hdGl2ZUVsZW1lbnQgeW9rLCB0ZWtyYXIgZGVuZW5lY2VrJyk7XHJcbiAgICAgIC8vIFZpZXcgaGVuw7x6IGhhesSxciBkZcSfaWxzZSwgYmlyIHNvbnJha2kgbGlmZWN5Y2xlIGhvb2sndGEgdGVrcmFyIGRlbmVcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhpZGRlbiBjb250YWluZXInZGFuIGVsZW1lbnQnaSBhbFxyXG4gICAgY29uc3QgaGlkZGVuQ29udGFpbmVyID0gdGhpcy5nZXRIaWRkZW5Db250YWluZXIoKTtcclxuICAgIFxyXG4gICAgaWYgKGhpZGRlbkNvbnRhaW5lci5jb250YWlucyh0aGlzLmVsZW1lbnQpKSB7XHJcbiAgICAgIC8vIEVsZW1lbnQgaGlkZGVuIGNvbnRhaW5lcidkYSwgZ2VyaSBhbFxyXG4gICAgICBoaWRkZW5Db250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KTtcclxuICAgICAgdGhpcy52Yy5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgIHRoaXMucG9wdWxhdGVQcm9wcygpO1xyXG4gICAgICBjb25zb2xlLmxvZygnV2ViIGNvbXBvbmVudCBoaWRkZW4gY29udGFpbmVyXFwnZGFuIGdlcmkgYWzEsW5kxLEgdmUgRE9NXFwnYSBla2xlbmRpJyk7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnZjLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGhpcy5lbGVtZW50KSkge1xyXG4gICAgICAvLyBFbGVtZW50IGJhxZ9rYSBiaXIgeWVyZGV5c2UgdmV5YSBoacOnYmlyIHllcmRlIGRlxJ9pbHNlLCBkaXJla3QgZWtsZVxyXG4gICAgICBpZiAodGhpcy5lbGVtZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmMubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICB0aGlzLnBvcHVsYXRlUHJvcHMoKTtcclxuICAgICAgY29uc29sZS5sb2coJ1dlYiBjb21wb25lbnQgRE9NXFwnYSBnZXJpIGVrbGVuZGknKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEVsZW1lbnQgemF0ZW4gRE9NJ2RhLCBzYWRlY2UgcHJvcHMnbGFyxLEgZ8O8bmNlbGxlXHJcbiAgICAgIHRoaXMucG9wdWxhdGVQcm9wcygpO1xyXG4gICAgICBjb25zb2xlLmxvZygnV2ViIGNvbXBvbmVudCB6YXRlbiBET01cXCdkYSwgcHJvcHMgZ8O8bmNlbGxlbmRpJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhpZGRlbkNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBjb25zdCBzbG90ID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHsgX19hcmlsV2ViQ29tcG9uZW50SGlkZGVuQ29udGFpbmVyPzogSFRNTEVsZW1lbnQgfTtcclxuICAgIGxldCBjb250YWluZXIgPSBzbG90Ll9fYXJpbFdlYkNvbXBvbmVudEhpZGRlbkNvbnRhaW5lcjtcclxuICAgIGlmICghY29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7XHJcbiAgICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSAnLTk5OTlweCc7XHJcbiAgICAgIGNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgc2xvdC5fX2FyaWxXZWJDb21wb25lbnRIaWRkZW5Db250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9XHJcbiAgICAgIHRoaXMub3B0aW9ucyA/PyAodGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhIGFzIFdlYkNvbXBvbmVudFdyYXBwZXJPcHRpb25zKTtcclxuXHJcbiAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdXZWIgY29tcG9uZW50IG9wdGlvbnMgYnVsdW5hbWFkxLEnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEXEn2VyIGVsZW1lbnQgemF0ZW4gdmFyc2EgKHJldXNlIGR1cnVtdW5kYSksIHJlc3RvcmUgacWfbGVtaSBuZ0FmdGVyVmlld0luaXQndGUgeWFwxLFsYWNha1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgbG9hZFJlbW90ZU1vZHVsZShvcHRpb25zKTtcclxuXHJcbiAgICAgIHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQob3B0aW9ucy5lbGVtZW50TmFtZSk7XHJcblxyXG4gICAgICAvLyBUYWIgaXpvbGFzeW9udSBpw6dpbiB0YWIga2ltbGnEn2luaSBlbGVtZW50J2UgYXR0cmlidXRlIG9sYXJhayB5YXouIE1GRSBib290c3RyYXAudHNcclxuICAgICAgLy8gYGNvbm5lY3RlZENhbGxiYWNrYCd0ZSBidSBhdHRyaWJ1dGUndSBva3V5dXAga2VuZGluZSBhaXQgeWVuaSBiaXIgQW5ndWxhciBBcHBsaWNhdGlvblxyXG4gICAgICAvLyB5YXJhdMSxciDihpIgaGVyIHRhYiBrZW5kaSBJbmplY3RvciArIFJvdXRlcifEsW5hIHNhaGlwIG9sdXIuIFN1YnNjcmliZSBpbGUgc29ucmFraVxyXG4gICAgICAvLyBgX3RhYmAgZGXEn2nFn2ltbGVyaW5pIGRlIHlha2FsYSAoZmlyc3RDaGVja0ZvclJvdXRlIHJlcGxhY2VVcmwgc29ucmFzxLEpLlxyXG4gICAgICB0aGlzLnJvdXRlU3ViID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhYklkID0gKHBhcmFtc1snX3RhYiddIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gJyc7XHJcbiAgICAgICAgaWYgKHRhYklkICYmIHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlsLXRhYi1pZCcpICE9PSB0YWJJZCkge1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpbC10YWItaWQnLCB0YWJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMucG9wdWxhdGVQcm9wcygpO1xyXG4gICAgICB0aGlzLnNldHVwRXZlbnRzKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy52Yz8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMudmMubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdXZWIgY29tcG9uZW50IHnDvGtsZW5pcmtlbiBoYXRhOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIFZpZXcgaGF6xLFyIG9sZHXEn3VuZGEsIGXEn2VyIGVsZW1lbnQgdmFyc2EgKHJldXNlIGR1cnVtdW5kYSkgcmVzdG9yZSBldFxyXG4gICAgaWYgKHRoaXMuZWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLmxvZygnbmdBZnRlclZpZXdJbml0OiBFbGVtZW50IG1ldmN1dCwgcmVzdG9yZSBkZW5lbml5b3IuLi4nKTtcclxuXHJcbiAgICAgIC8vIFN0cmF0ZWd5IGBuZWVkc1Jlc3RvcmVgIGZsYWcnaSBzZXQgZXRtacWfc2U6IGVsZW1lbnQgaGlkZGVuIGNvbnRhaW5lcidkYW4gw6fEsWthcsSxbG3EscWfXHJcbiAgICAgIC8vIGFtYSB2aWV3IGhlbsO8eiBoYXrEsXIgb2xtYWTEscSfxLEgacOnaW4gdmlldydhIGVrbGVuZW1lbWnFny4gxZ5pbWRpIGVrbGUuXHJcbiAgICAgIGlmICh0aGlzLm5lZWRzUmVzdG9yZSkge1xyXG4gICAgICAgIHRoaXMubmVlZHNSZXN0b3JlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMudmM/Lm5hdGl2ZUVsZW1lbnQgJiYgIXRoaXMudmMubmF0aXZlRWxlbWVudC5jb250YWlucyh0aGlzLmVsZW1lbnQpKSB7XHJcbiAgICAgICAgICB0aGlzLnZjLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQcm9wcygpO1xyXG4gICAgICAgICAgdGhpcy5wcm9wc1VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1dlYiBjb21wb25lbnQgZWxlbWVudCBjb21wb25lbnQgdmlld1xcJ2EgZWtsZW5kaSAobmdBZnRlclZpZXdJbml0KScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghdGhpcy5wcm9wc1VwZGF0ZWQpIHtcclxuICAgICAgICAvLyBOb3JtYWwgcmVzdG9yZSBpxZ9sZW1pIChlxJ9lciBwcm9wcyBnw7xuY2VsbGVubWVtacWfc2UpXHJcbiAgICAgICAgdGhpcy5yZXN0b3JlRWxlbWVudCgpO1xyXG4gICAgICAgIHRoaXMucHJvcHNVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBFbGVtZW50IHphdGVuIHZpZXcnZGEsIHNhZGVjZSBwcm9wcydsYXLEsSBnw7xuY2VsbGVcclxuICAgICAgICB0aGlzLnBvcHVsYXRlUHJvcHMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAvLyBSb3V0ZSByZXVzZSBzdHJhdGVqaXNpIGt1bGxhbsSxbGTEscSfxLFuZGEsIGNvbXBvbmVudCBkZXN0cm95IGVkaWxtZXpcclxuICAgIC8vIFJvdXRlIHJldXNlIHN0cmF0ZWppc2kgc3RvcmUoKSBtZXRvZHVuZGEgZWxlbWVudCdpIGhpZGRlbiBjb250YWluZXInYSB0YcWfxLF5YWNhay5cclxuICAgIC8vIFlpbmUgZGUgZ2Vyw6dla3RlbiBkZXN0cm95IGVkaWxkacSfaW1peiBzZW5hcnlvbGFyZGEgKGZhcmtsxLEgcmVtb3RlLCB0YWIgY2xlYW51cCB2cy4pXHJcbiAgICAvLyBldmVudCBsaXN0ZW5lcidsYXLEsSArIHF1ZXJ5UGFyYW1zIHN1YnNjcmlwdGlvbiBzxLF6ZMSxcm1hbWFrIGnDp2luIGthbGTEsXLEsXLEsXouXHJcbiAgICB0aGlzLnRlYXJkb3duRXZlbnRzKCk7XHJcbiAgICB0aGlzLnJvdXRlU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5yb3V0ZVN1YiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xyXG4gIH1cclxufVxyXG4iXX0=