aril 1.2.17 → 2.0.1-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) 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 +24 -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/table/src/table.component.mjs +10 -10
  47. package/esm2022/ui-business/ref-value/src/ref-value.component.mjs +15 -7
  48. package/esm2022/util/sync-active-tab-route/src/sync-active-tab-route.directive.mjs +29 -9
  49. package/fesm2022/aril-app.component-s14ruALV.mjs +183 -0
  50. package/fesm2022/aril-app.component-s14ruALV.mjs.map +1 -0
  51. package/fesm2022/aril-boot-bridge.mjs +35 -4
  52. package/fesm2022/aril-boot-bridge.mjs.map +1 -1
  53. package/fesm2022/aril-boot-config-api.mjs +11 -2
  54. package/fesm2022/aril-boot-config-api.mjs.map +1 -1
  55. package/fesm2022/aril-boot-config-apps.mjs +1678 -10
  56. package/fesm2022/aril-boot-config-apps.mjs.map +1 -1
  57. package/fesm2022/aril-boot-config-plugins.mjs +12 -4
  58. package/fesm2022/aril-boot-config-plugins.mjs.map +1 -1
  59. package/fesm2022/aril-boot-host.mjs +21 -7
  60. package/fesm2022/aril-boot-host.mjs.map +1 -1
  61. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs +183 -0
  62. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs.map +1 -0
  63. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs +631 -0
  64. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs.map +1 -0
  65. package/fesm2022/aril-boot-mfe.mjs +5 -3
  66. package/fesm2022/aril-boot-mfe.mjs.map +1 -1
  67. package/fesm2022/aril-keycloak.mjs +16 -1
  68. package/fesm2022/aril-keycloak.mjs.map +1 -1
  69. package/fesm2022/aril-provider.mjs +90 -12
  70. package/fesm2022/aril-provider.mjs.map +1 -1
  71. package/fesm2022/aril-theme-layout.mjs +2630 -2017
  72. package/fesm2022/aril-theme-layout.mjs.map +1 -1
  73. package/fesm2022/aril-ui-business-ref-value.mjs +14 -6
  74. package/fesm2022/aril-ui-business-ref-value.mjs.map +1 -1
  75. package/fesm2022/aril-ui-table.mjs +9 -9
  76. package/fesm2022/aril-ui-table.mjs.map +1 -1
  77. package/fesm2022/aril-util-sync-active-tab-route.mjs +28 -8
  78. package/fesm2022/aril-util-sync-active-tab-route.mjs.map +1 -1
  79. package/fesm2022/aril.mjs +354 -25
  80. package/fesm2022/aril.mjs.map +1 -1
  81. package/keycloak/src/auth.interceptor.d.ts +7 -0
  82. package/package.json +188 -188
  83. package/provider/src/prodiveHost.d.ts +1 -0
  84. package/theme/layout/app/expandableMenu/expandable-menu.component.d.ts +21 -4
  85. package/theme/layout/app/expandableMenu/expandable-menu.component.html +19 -5
  86. package/theme/layout/app/expandableMenu/expandable-menu.component.ts +69 -9
  87. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.html +1 -0
  88. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.ts +3 -1
  89. package/theme/layout/app/general-search/general-search.component.html +2 -1
  90. package/theme/layout/app/general-search/general-search.component.ts +2 -2
  91. package/theme/layout/app/history/history-sidebar.component.html +3 -1
  92. package/theme/layout/app/history/history-sidebar.component.ts +3 -1
  93. package/theme/layout/app/layout/app.layout.component.d.ts +105 -5
  94. package/theme/layout/app/layout/app.layout.component.html +102 -1
  95. package/theme/layout/app/layout/app.layout.component.scss +372 -0
  96. package/theme/layout/app/layout/app.layout.component.ts +452 -13
  97. package/theme/layout/app/layout/mfe.layout.component.d.ts +7 -5
  98. package/theme/layout/app/layout/mfe.layout.component.ts +13 -39
  99. package/theme/layout/app/site-map/site-map-sidebar.component.html +1 -0
  100. package/theme/layout/app/site-map/site-map-sidebar.component.ts +3 -1
  101. package/theme/layout/app/static-sidebar/static-sidebar.component.d.ts +26 -5
  102. package/theme/layout/app/static-sidebar/static-sidebar.component.html +11 -5
  103. package/theme/layout/app/static-sidebar/static-sidebar.component.ts +68 -13
  104. package/theme/layout/app/topbar/app.topbar.component.html +0 -1
  105. package/theme/layout/app/topbar/app.topbar.component.scss +1 -1
  106. package/theme/layout/service/breadcrumb-publisher.service.d.ts +24 -0
  107. package/theme/layout/service/breadcrumb-publisher.service.ts +95 -0
  108. package/theme/layout/service/tab-session.service.d.ts +52 -0
  109. package/theme/layout/service/tab-session.service.ts +138 -0
  110. package/theme/styles/layout/_breadcrumb.scss +95 -0
  111. package/theme/styles/layout/_content.scss +2 -2
  112. package/ui/table/src/table.component.d.ts +2 -2
  113. package/ui-business/ref-value/src/ref-value.component.d.ts +4 -2
  114. package/util/sync-active-tab-route/src/sync-active-tab-route.directive.d.ts +15 -2
  115. package/boot/config/apps/src/reuse-strategy.d.ts +0 -4
  116. package/esm2022/boot/config/apps/src/reuse-strategy.mjs +0 -9
  117. package/esm2022/theme/layout/app/breadcrumb/app.breadcrumb.component.mjs +0 -107
  118. package/fesm2022/aril-app.component-wxP3y8dg.mjs +0 -81
  119. package/fesm2022/aril-app.component-wxP3y8dg.mjs.map +0 -1
  120. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs +0 -80
  121. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs.map +0 -1
  122. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs +0 -315
  123. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs.map +0 -1
  124. package/theme/layout/app/breadcrumb/app.breadcrumb.component.d.ts +0 -25
  125. package/theme/layout/app/breadcrumb/app.breadcrumb.component.html +0 -8
  126. package/theme/layout/app/breadcrumb/app.breadcrumb.component.ts +0 -127
@@ -1,39 +1,53 @@
1
+ import { Location, LocationStrategy } from '@angular/common';
1
2
  import { HttpClient } from '@angular/common/http';
2
- import { APP_INITIALIZER, importProvidersFrom } from '@angular/core';
3
- import { createCustomElement } from '@angular/elements';
3
+ import { APP_INITIALIZER, ApplicationRef, createComponent, createEnvironmentInjector, importProvidersFrom, isDevMode, ɵINJECTOR_SCOPE } from '@angular/core';
4
4
  import { createApplication } from '@angular/platform-browser';
5
- import { RouteReuseStrategy, provideRouter, withComponentInputBinding, withHashLocation, withRouterConfig, withViewTransitions } from '@angular/router';
5
+ import { RouteReuseStrategy, Router, UrlSerializer, provideRouter, withComponentInputBinding, withRouterConfig } from '@angular/router';
6
+ import { ConfirmationService, MessageService, PrimeNGConfig } from 'primeng/api';
7
+ import { TranslocoService } from '@ngneat/transloco';
6
8
  import { KeycloakService } from 'keycloak-angular';
7
9
  import { MonacoEditorModule, NGX_MONACO_EDITOR_CONFIG } from 'ngx-monaco-editor-v2';
8
10
  import { createBaseAppConfig } from 'aril/boot/base';
9
- import { bridge } from 'aril/boot/bridge';
10
11
  import { setApiConfigOnMFEMode } from 'aril/boot/config/api';
11
- import { ArilReuseStrategy } from 'aril/boot/config/apps';
12
+ import { CustomRouteReuseStrategy, TabAwareUrlSerializer } from 'aril/boot/config/apps';
12
13
  import { getNgZone, loadPlugins } from 'aril/boot/config/plugins';
13
14
  import { i18nFolderName } from 'aril/i18n';
14
15
  import { provideHost } from 'aril/provider';
16
+ import { PubSubService } from 'aril/util/pub-sub';
15
17
  import { appComponentLoader } from './appComponentLoader';
18
+ import { IsolatedLocationStrategy } from './isolated-location-strategy';
16
19
  import { monacoConfig } from './monaco.config';
17
20
  export var appName;
18
21
  export var menuItems = [];
22
+ /**
23
+ * `boot` çağrılarının idempotent kalmasını sağlayan sync guard. Aynı remote için
24
+ * birden fazla paralel `boot('wdm', ...)` çağrısı geldiğinde, ilk `customElements.define`
25
+ * tamamlanmadan ikinci çağrı `customElements.get` guard'ını geçiyordu → her ikisi de
26
+ * define etmeye çalışıp `NotSupportedError: the name "app-wdm" has already been used`
27
+ * hatası fırlatılıyordu. Set ile sync mark ederek tek bir define cycle'ı garanti ediyoruz.
28
+ */
29
+ const bootedApps = new Set();
19
30
  export const boot = (_appName, _routes, _menuItems) => {
20
- if (customElements.get(`app-${_appName}`))
31
+ if (bootedApps.has(_appName) || customElements.get(`app-${_appName}`))
21
32
  return;
33
+ bootedApps.add(_appName);
22
34
  appName = _appName;
23
35
  menuItems = _menuItems;
24
- const appBootConfig = {
36
+ /**
37
+ * **Paylaşılan base config** — remote başına TEK `createApplication`. Ağır servisler
38
+ * (HttpClient + interceptor chain, Keycloak, i18n/Transloco, Monaco, animations) burada
39
+ * yaşar; `providedIn` taşımayan explicit provider oldukları için tüm tab'ların child
40
+ * injector'larından parent olarak paylaşılır → RAM lineer büyümez. Router/Location/
41
+ * ReuseStrategy/UrlSerializer burada YOK; onlar tab başına izole child injector'da verilir.
42
+ */
43
+ const sharedBaseConfig = {
25
44
  providers: [
26
45
  createBaseAppConfig({ i18nFolder: _appName }),
27
- provideHost(appName),
28
- provideRouter(_routes, withComponentInputBinding(), withHashLocation(), withViewTransitions(), withRouterConfig({ onSameUrlNavigation: 'reload' })),
29
- { provide: RouteReuseStrategy, useClass: ArilReuseStrategy },
46
+ provideHost(_appName),
30
47
  getNgZone(),
31
48
  {
32
49
  provide: APP_INITIALIZER,
33
50
  useFactory: (httpClient, keycloak, folderName) => {
34
- if (!bridge.isHostMode()) {
35
- return () => Promise.resolve();
36
- }
37
51
  const runApiInit = setApiConfigOnMFEMode(httpClient, keycloak, folderName);
38
52
  const runLoadPlugins = loadPlugins();
39
53
  return async () => {
@@ -48,11 +62,174 @@ export const boot = (_appName, _routes, _menuItems) => {
48
62
  { provide: NGX_MONACO_EDITOR_CONFIG, useValue: monacoConfig }
49
63
  ]
50
64
  };
51
- createApplication(appBootConfig).then((appRef) => {
52
- appComponentLoader().then((AppComponent) => {
53
- const app = createCustomElement(AppComponent, { injector: appRef.injector });
54
- customElements.define(`app-${appName}`, app);
55
- });
56
- });
65
+ /**
66
+ * Remote başına TEK paylaşılan `ApplicationRef` — closure-scope. İlk `<app-${appName}>`
67
+ * element'i `createApplication(sharedBaseConfig)` çağırır, sonraki tüm element'ler aynı
68
+ * promise'ı bekler (duplicate Application yaratımı imkânsız). Her element kendi child
69
+ * injector + `createComponent` ile kendi `AppComponent` view'ını yaratıp shared app'e
70
+ * `attachView` ile bağlar. Shared app uzun ömürlüdür (tab'lar kapansa da destroy edilmez).
71
+ *
72
+ * `childProviders`'taki `TranslocoService` factory'si bu referansı kullandığı için
73
+ * `childProviders`'tan ÖNCE tanımlanır (forward TDZ'yi önler).
74
+ */
75
+ let sharedAppRef = null;
76
+ let sharedAppPromise = null;
77
+ /**
78
+ * **Tab başına izole Router stack** — her `<app-${appName}>` kendi child
79
+ * `EnvironmentInjector`'ında bunları alır. `ɵINJECTOR_SCOPE: 'root'` child'ı 'root'
80
+ * scope yapar (Angular `R3Injector` ctor: `scopes.add('root')`); böylece `provideRouter`'ın
81
+ * inject ettiği `providedIn:'root'` Router servisleri — `Router`, `ChildrenOutletContexts`,
82
+ * `Location`, `NavigationTransitions` vb. — child-LOCAL üretilir. Sonuç: her tab kendi
83
+ * Router + kendi `RouterOutlet` context'ine sahip olur → **1 Router : 1 outlet**.
84
+ *
85
+ * Neden gerekli: paylaşılan tek Application'da N `<router-outlet>` aynı tek
86
+ * `ChildrenOutletContexts`'e "primary" diye kaydolup birbirini eziyordu (`contexts.set`
87
+ * overwrite) → tab geçişi sonrası aynı tab içi navigasyon (list→detail) yanlış outlet'e
88
+ * render oluyordu. Child-injector izolasyonu bunu kökten çözer.
89
+ *
90
+ * **TranslocoService istisnası**: `'root'` scope onu da child-local yapardı; ama global
91
+ * (scope'suz) çeviriler shared app'in init akışında yüklendiğinden — `createComponent`
92
+ * `APP_INITIALIZER` çalıştırmaz — child-local service'in global cache'i boş kalıp ham key
93
+ * gösteriyordu. Tab başına ayrı dil senaryosu yok; service'i shared app'ten paylaştırıyoruz
94
+ * (global çeviri tek yerde yüklenir, tek translation cache → ek RAM kazancı). Scope çevirileri
95
+ * (`providei18nScope`) component-level sağlandığı için paylaşılan service'le de çalışır.
96
+ *
97
+ * NOT: `ɵINJECTOR_SCOPE` Angular private API'sidir; minor sürüm yükseltmelerinde davranışı
98
+ * doğrulanmalı (aşağıdaki POC izolasyon log'u bunun için bırakıldı).
99
+ */
100
+ const childProviders = [
101
+ { provide: ɵINJECTOR_SCOPE, useValue: 'root' },
102
+ provideRouter(_routes, withComponentInputBinding(), withRouterConfig({ onSameUrlNavigation: 'reload' })),
103
+ { provide: LocationStrategy, useClass: IsolatedLocationStrategy },
104
+ { provide: Location, useClass: Location },
105
+ { provide: RouteReuseStrategy, useExisting: CustomRouteReuseStrategy },
106
+ { provide: UrlSerializer, useExisting: TabAwareUrlSerializer },
107
+ { provide: TranslocoService, useFactory: () => sharedAppRef.injector.get(TranslocoService) },
108
+ // `ɵINJECTOR_SCOPE:'root'` yan etkisi: `ApplicationRef` de `providedIn:'root'` olduğu için
109
+ // child injector'da child-LOKAL (sahte) bir instance üretilirdi — bu instance NgZone'un
110
+ // tick döngüsüne bağlı DEĞİLDİR. Sonuç: bu appRef'e `attachView` edilen view'lar hiç change
111
+ // detection almaz. AppComponent'i biz açıkça `sharedAppRef.attachView` ile bağladığımız için
112
+ // çalışır; ama `inject(ApplicationRef)` yapan üçüncü taraf kod (PrimeNG `DialogService` →
113
+ // `this.appRef.attachView`) child-local sahte appRef'i alıp dialog'u ona bağlıyordu → dialog
114
+ // yaratılıyor ama `*ngIf="visible"` hiç render edilmiyordu (boş açılıyordu). Gerçek (tek,
115
+ // tick alan) `sharedAppRef`'e sabitliyoruz.
116
+ { provide: ApplicationRef, useFactory: () => sharedAppRef },
117
+ // Tarama (log15) ile saptanan, child-local olunca bozulan ek `providedIn:'root'` servisleri:
118
+ // • PubSubService — MFE'nin `breadcrumbUpdated` event'i host `history.service`'e ulaşmalı;
119
+ // child-local olunca MFE↔host event köprüsü kopuyordu.
120
+ // • PrimeNGConfig — dinamik dialog'lar shared root context'inde yaratıldığı için PrimeNG
121
+ // çevirileri (calendar/paginator vb.) ve `setTranslation` shared instance'tan okunmalı.
122
+ // (BreadcrumbService bilinçli olarak child-local bırakıldı: her tab kendi breadcrumb'ı.)
123
+ { provide: PubSubService, useFactory: () => sharedAppRef.injector.get(PubSubService) },
124
+ { provide: PrimeNGConfig, useFactory: () => sharedAppRef.injector.get(PrimeNGConfig) },
125
+ // Toast/confirm GLOBAL: tek shared MessageService/ConfirmationService. Aksi halde her tab
126
+ // kendi instance'ına sahip olur → host'tan tetiklenen toast MFE tab'ında (ya da tersi)
127
+ // görünmez. Shared instance ile tüm `<p-toast key="toast-root">` container'ları aynı kuyruğu dinler.
128
+ { provide: MessageService, useFactory: () => sharedAppRef.injector.get(MessageService) },
129
+ { provide: ConfirmationService, useFactory: () => sharedAppRef.injector.get(ConfirmationService) }
130
+ ];
131
+ const appComponentPromise = appComponentLoader();
132
+ class MFEAppElement extends HTMLElement {
133
+ constructor() {
134
+ super(...arguments);
135
+ this.childInjector = null;
136
+ this.compRef = null;
137
+ this.isBootstrapping = false;
138
+ this.destroyTimer = null;
139
+ }
140
+ async connectedCallback() {
141
+ // Strategy hidden container ↔ view arası taşımalarda re-bootstrap'ı önle —
142
+ // view zaten yaratıldıysa skip. destroyTimer pending ise iptal et.
143
+ if (this.compRef || this.isBootstrapping) {
144
+ if (this.destroyTimer) {
145
+ clearTimeout(this.destroyTimer);
146
+ this.destroyTimer = null;
147
+ }
148
+ return;
149
+ }
150
+ this.isBootstrapping = true;
151
+ try {
152
+ // Paylaşılan Application — ilk çağıran yaratır, diğerleri aynı promise'ı bekler.
153
+ if (!sharedAppPromise) {
154
+ sharedAppPromise = createApplication(sharedBaseConfig);
155
+ }
156
+ const [appRef, AppComponent] = await Promise.all([sharedAppPromise, appComponentPromise]);
157
+ sharedAppRef = appRef;
158
+ // Bu tab için izole Router stack'i barındıran child injector.
159
+ const tabId = this.getAttribute('aril-tab-id') ?? '';
160
+ this.childInjector = createEnvironmentInjector(childProviders, appRef.injector, `mfe:${_appName}:${tabId || 'pending'}`);
161
+ // [Hibrit izolasyon guard — kalıcı] `ɵINJECTOR_SCOPE:'root'` ile child injector'ın
162
+ // KENDİ Router + ChildrenOutletContexts'i olması, tab izolasyonunun temelidir
163
+ // ("1 Router : 1 outlet"). Bu private API Angular upgrade'inde davranış değiştirirse
164
+ // burada erken yakalanır; aksi halde "1 Router : N outlet" bug'ı sessizce geri döner.
165
+ if (isDevMode() && this.childInjector.get(Router) === appRef.injector.get(Router)) {
166
+ console.error(`[boot:${_appName}] HİBRİT İZOLASYON BOZULDU: child Router shared root ile aynı instance! ` +
167
+ `ɵINJECTOR_SCOPE davranışı değişmiş olabilir (Angular upgrade?) — tab izolasyonu çalışmaz.`);
168
+ }
169
+ // AppComponent'i child injector context'inde yarat → inject(Router)/LocationStrategy
170
+ // child-local; inject(MfeBridge)/HttpClient/Keycloak/TranslocoService vb. parent'tan
171
+ // paylaşımlı. `attachView` shared app'in change detection döngüsüne bağlar. (`bootstrap`
172
+ // değil: APP_BOOTSTRAP_LISTENER çalışmaz, child Router'ın initial navigation'ını
173
+ // AppComponent host-Router sync'i `safeNavigate` ile yapıyor.)
174
+ this.compRef = createComponent(AppComponent, {
175
+ environmentInjector: this.childInjector,
176
+ hostElement: this
177
+ });
178
+ appRef.attachView(this.compRef.hostView);
179
+ // Başarılı boot: guard artık `compRef` üzerinden çalışır → `isBootstrapping`'i bırak.
180
+ // (await sırasında disconnect olup hata oluşmazsa flag takılı kalmasın; aksi halde
181
+ // reconnect'te guard erken return edip tab'ı kalıcı boş bırakır.)
182
+ this.isBootstrapping = false;
183
+ }
184
+ catch (err) {
185
+ console.error(`[boot:${_appName}] application bootstrap hatası:`, err);
186
+ this.isBootstrapping = false;
187
+ // sharedApp henüz set edilmediyse (createApplication başarısız) promise'ı sıfırla ki
188
+ // sonraki tab retry edebilsin — aksi halde rejected promise closure'da kalıcı kalır ve
189
+ // remote sayfa yenilemeden bir daha boot edilemez. (createComponent hatasında
190
+ // sharedAppRef zaten set'tir; o durumda promise korunur, app yeniden yaratılmaz.)
191
+ if (!sharedAppRef)
192
+ sharedAppPromise = null;
193
+ }
194
+ }
195
+ disconnectedCallback() {
196
+ // Strategy hidden container ↔ view arası taşımalarda `removeChild` + `appendChild`
197
+ // ardışık olduğu için disconnectedCallback parent değişimiyle tetiklenir — element
198
+ // gerçekten destroy edilmiyor. `preserveWebComponentElement` öncesinde Strategy
199
+ // `__arilPreserveDuringDetach` flag'i set ediyor; o flag varsa view korunur.
200
+ const preserveFlag = this.__arilPreserveDuringDetach;
201
+ if (preserveFlag) {
202
+ return;
203
+ }
204
+ // Flag yok → gerçek destroy. Async re-connect ihtimaline karşı microtask sınırlı
205
+ // defansif gecikme; bir sonraki tick'te hâlâ disconnected mı diye son kontrol.
206
+ if (this.destroyTimer)
207
+ clearTimeout(this.destroyTimer);
208
+ this.destroyTimer = setTimeout(() => {
209
+ if (!this.isConnected && this.compRef) {
210
+ console.log(`[boot:${_appName}] gerçek destroy → view + child injector destroy`);
211
+ // Shared app'e ASLA dokunma; sadece bu tab'ın view'ını ve child injector'ını yık.
212
+ if (sharedAppRef)
213
+ sharedAppRef.detachView(this.compRef.hostView);
214
+ this.compRef.destroy();
215
+ this.childInjector?.destroy();
216
+ this.compRef = null;
217
+ this.childInjector = null;
218
+ this.isBootstrapping = false;
219
+ }
220
+ this.destroyTimer = null;
221
+ }, 0);
222
+ }
223
+ }
224
+ try {
225
+ customElements.define(`app-${appName}`, MFEAppElement);
226
+ }
227
+ catch (e) {
228
+ if (e instanceof DOMException && e.name === 'NotSupportedError') {
229
+ console.warn(`[boot:${appName}] custom element zaten tanımlı, define atlandı`);
230
+ return;
231
+ }
232
+ throw e;
233
+ }
57
234
  };
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L21mZS9zcmMvYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFxQixtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQ04sa0JBQWtCLEVBRWxCLGFBQWEsRUFDYix5QkFBeUIsRUFDekIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBUSxpQkFBaUIsRUFBa0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsTUFBTSxDQUFDLElBQUksT0FBYSxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxJQUFJLFNBQVMsR0FBcUIsRUFBRSxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLFFBQWMsRUFBRSxPQUFlLEVBQUUsVUFBNEIsRUFBRSxFQUFFO0lBQ3JGLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLFFBQVEsRUFBRSxDQUFDO1FBQUUsT0FBTztJQUVsRCxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ25CLFNBQVMsR0FBRyxVQUFVLENBQUM7SUFFdkIsTUFBTSxhQUFhLEdBQXNCO1FBQ3hDLFNBQVMsRUFBRTtZQUNWLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQzdDLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDcEIsYUFBYSxDQUNaLE9BQU8sRUFDUCx5QkFBeUIsRUFBRSxFQUMzQixnQkFBZ0IsRUFBRSxFQUNsQixtQkFBbUIsRUFBRSxFQUNyQixnQkFBZ0IsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQ25EO1lBQ0QsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFO1lBQzVELFNBQVMsRUFBRTtZQUNYO2dCQUNDLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFzQixFQUFFLFFBQXlCLEVBQUUsVUFBaUMsRUFBRSxFQUFFO29CQUNwRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7d0JBQzFCLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNoQyxDQUFDO29CQUNELE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBNkIsQ0FBQyxDQUFDO29CQUM5RixNQUFNLGNBQWMsR0FBRyxXQUFXLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxLQUFLLElBQUksRUFBRTt3QkFDakIsTUFBTSxVQUFVLEVBQUUsQ0FBQzt3QkFDbkIsY0FBYyxFQUFFLENBQUM7b0JBQ2xCLENBQUMsQ0FBQztnQkFDSCxDQUFDO2dCQUNELEtBQUssRUFBRSxJQUFJO2dCQUNYLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO2FBQ25EO1lBQ0QsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakQsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtTQUM3RDtLQUNELENBQUM7SUFFRixpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNoRCxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQzFDLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM3RSxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFQUF9JTklUSUFMSVpFUiwgQXBwbGljYXRpb25Db25maWcsIGltcG9ydFByb3ZpZGVyc0Zyb20gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY3JlYXRlQ3VzdG9tRWxlbWVudCB9IGZyb20gJ0Bhbmd1bGFyL2VsZW1lbnRzJztcclxuaW1wb3J0IHsgY3JlYXRlQXBwbGljYXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHtcclxuXHRSb3V0ZVJldXNlU3RyYXRlZ3ksXHJcblx0Um91dGVzLFxyXG5cdHByb3ZpZGVSb3V0ZXIsXHJcblx0d2l0aENvbXBvbmVudElucHV0QmluZGluZyxcclxuXHR3aXRoSGFzaExvY2F0aW9uLFxyXG5cdHdpdGhSb3V0ZXJDb25maWcsXHJcblx0d2l0aFZpZXdUcmFuc2l0aW9uc1xyXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBLZXljbG9ha1NlcnZpY2UgfSBmcm9tICdrZXljbG9hay1hbmd1bGFyJztcclxuaW1wb3J0IHsgTW9uYWNvRWRpdG9yTW9kdWxlLCBOR1hfTU9OQUNPX0VESVRPUl9DT05GSUcgfSBmcm9tICduZ3gtbW9uYWNvLWVkaXRvci12Mic7XHJcblxyXG5pbXBvcnQgeyBjcmVhdGVCYXNlQXBwQ29uZmlnIH0gZnJvbSAnYXJpbC9ib290L2Jhc2UnO1xyXG5pbXBvcnQgeyBicmlkZ2UgfSBmcm9tICdhcmlsL2Jvb3QvYnJpZGdlJztcclxuaW1wb3J0IHsgc2V0QXBpQ29uZmlnT25NRkVNb2RlIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcGknO1xyXG5pbXBvcnQgeyBBcHBzLCBBcmlsUmV1c2VTdHJhdGVneSwgUGx1Z2luTWVudUl0ZW0gfSBmcm9tICdhcmlsL2Jvb3QvY29uZmlnL2FwcHMnO1xyXG5pbXBvcnQgeyBnZXROZ1pvbmUsIGxvYWRQbHVnaW5zIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9wbHVnaW5zJztcclxuaW1wb3J0IHsgaTE4bkZvbGRlck5hbWUgfSBmcm9tICdhcmlsL2kxOG4nO1xyXG5pbXBvcnQgeyBwcm92aWRlSG9zdCB9IGZyb20gJ2FyaWwvcHJvdmlkZXInO1xyXG5cclxuaW1wb3J0IHsgYXBwQ29tcG9uZW50TG9hZGVyIH0gZnJvbSAnLi9hcHBDb21wb25lbnRMb2FkZXInO1xyXG5pbXBvcnQgeyBtb25hY29Db25maWcgfSBmcm9tICcuL21vbmFjby5jb25maWcnO1xyXG5cclxuZXhwb3J0IHZhciBhcHBOYW1lOiBBcHBzO1xyXG5leHBvcnQgdmFyIG1lbnVJdGVtczogUGx1Z2luTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3QgPSAoX2FwcE5hbWU6IEFwcHMsIF9yb3V0ZXM6IFJvdXRlcywgX21lbnVJdGVtczogUGx1Z2luTWVudUl0ZW1bXSkgPT4ge1xyXG5cdGlmIChjdXN0b21FbGVtZW50cy5nZXQoYGFwcC0ke19hcHBOYW1lfWApKSByZXR1cm47XHJcblxyXG5cdGFwcE5hbWUgPSBfYXBwTmFtZTtcclxuXHRtZW51SXRlbXMgPSBfbWVudUl0ZW1zO1xyXG5cclxuXHRjb25zdCBhcHBCb290Q29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcclxuXHRcdHByb3ZpZGVyczogW1xyXG5cdFx0XHRjcmVhdGVCYXNlQXBwQ29uZmlnKHsgaTE4bkZvbGRlcjogX2FwcE5hbWUgfSksXHJcblx0XHRcdHByb3ZpZGVIb3N0KGFwcE5hbWUpLFxyXG5cdFx0XHRwcm92aWRlUm91dGVyKFxyXG5cdFx0XHRcdF9yb3V0ZXMsXHJcblx0XHRcdFx0d2l0aENvbXBvbmVudElucHV0QmluZGluZygpLFxyXG5cdFx0XHRcdHdpdGhIYXNoTG9jYXRpb24oKSxcclxuXHRcdFx0XHR3aXRoVmlld1RyYW5zaXRpb25zKCksXHJcblx0XHRcdFx0d2l0aFJvdXRlckNvbmZpZyh7IG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnIH0pXHJcblx0XHRcdCksXHJcblx0XHRcdHsgcHJvdmlkZTogUm91dGVSZXVzZVN0cmF0ZWd5LCB1c2VDbGFzczogQXJpbFJldXNlU3RyYXRlZ3kgfSxcclxuXHRcdFx0Z2V0Tmdab25lKCksXHJcblx0XHRcdHtcclxuXHRcdFx0XHRwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXHJcblx0XHRcdFx0dXNlRmFjdG9yeTogKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGtleWNsb2FrOiBLZXljbG9ha1NlcnZpY2UsIGZvbGRlck5hbWU6IHR5cGVvZiBpMThuRm9sZGVyTmFtZSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCFicmlkZ2UuaXNIb3N0TW9kZSgpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkFwaUluaXQgPSBzZXRBcGlDb25maWdPbk1GRU1vZGUoaHR0cENsaWVudCwga2V5Y2xvYWssIGZvbGRlck5hbWUgYXMgdW5rbm93biBhcyBBcHBzKTtcclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkxvYWRQbHVnaW5zID0gbG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdHJldHVybiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHJ1bkFwaUluaXQoKTtcclxuXHRcdFx0XHRcdFx0cnVuTG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRtdWx0aTogdHJ1ZSxcclxuXHRcdFx0XHRkZXBzOiBbSHR0cENsaWVudCwgS2V5Y2xvYWtTZXJ2aWNlLCBpMThuRm9sZGVyTmFtZV1cclxuXHRcdFx0fSxcclxuXHRcdFx0aW1wb3J0UHJvdmlkZXJzRnJvbShNb25hY29FZGl0b3JNb2R1bGUuZm9yUm9vdCgpKSxcclxuXHRcdFx0eyBwcm92aWRlOiBOR1hfTU9OQUNPX0VESVRPUl9DT05GSUcsIHVzZVZhbHVlOiBtb25hY29Db25maWcgfVxyXG5cdFx0XVxyXG5cdH07XHJcblxyXG5cdGNyZWF0ZUFwcGxpY2F0aW9uKGFwcEJvb3RDb25maWcpLnRoZW4oKGFwcFJlZikgPT4ge1xyXG5cdFx0YXBwQ29tcG9uZW50TG9hZGVyKCkudGhlbigoQXBwQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdGNvbnN0IGFwcCA9IGNyZWF0ZUN1c3RvbUVsZW1lbnQoQXBwQ29tcG9uZW50LCB7IGluamVjdG9yOiBhcHBSZWYuaW5qZWN0b3IgfSk7XHJcblx0XHRcdGN1c3RvbUVsZW1lbnRzLmRlZmluZShgYXBwLSR7YXBwTmFtZX1gLCBhcHApO1xyXG5cdFx0fSk7XHJcblx0fSk7XHJcbn07XHJcbiJdfQ==
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L21mZS9zcmMvYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNOLGVBQWUsRUFFZixjQUFjLEVBS2QsZUFBZSxFQUNmLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsU0FBUyxFQUNULGVBQWUsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBRU4sa0JBQWtCLEVBQ2xCLE1BQU0sRUFFTixhQUFhLEVBQ2IsYUFBYSxFQUNiLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFRLHdCQUF3QixFQUFrQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsTUFBTSxDQUFDLElBQUksT0FBYSxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxJQUFJLFNBQVMsR0FBcUIsRUFBRSxDQUFDO0FBRTVDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsUUFBYyxFQUFFLE9BQWUsRUFBRSxVQUE0QixFQUFFLEVBQUU7SUFDckYsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztRQUFFLE9BQU87SUFDOUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV6QixPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ25CLFNBQVMsR0FBRyxVQUFVLENBQUM7SUFFdkI7Ozs7OztPQU1HO0lBQ0gsTUFBTSxnQkFBZ0IsR0FBc0I7UUFDM0MsU0FBUyxFQUFFO1lBQ1YsbUJBQW1CLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDN0MsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNyQixTQUFTLEVBQUU7WUFDWDtnQkFDQyxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsVUFBVSxFQUFFLENBQUMsVUFBc0IsRUFBRSxRQUF5QixFQUFFLFVBQWlDLEVBQUUsRUFBRTtvQkFDcEcsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUE2QixDQUFDLENBQUM7b0JBQzlGLE1BQU0sY0FBYyxHQUFHLFdBQVcsRUFBRSxDQUFDO29CQUNyQyxPQUFPLEtBQUssSUFBSSxFQUFFO3dCQUNqQixNQUFNLFVBQVUsRUFBRSxDQUFDO3dCQUNuQixjQUFjLEVBQUUsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7YUFDbkQ7WUFDRCxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqRCxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO1NBQzdEO0tBQ0QsQ0FBQztJQUVGOzs7Ozs7Ozs7T0FTRztJQUNILElBQUksWUFBWSxHQUEwQixJQUFJLENBQUM7SUFDL0MsSUFBSSxnQkFBZ0IsR0FBbUMsSUFBSSxDQUFDO0lBRTVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0gsTUFBTSxjQUFjLEdBQTJDO1FBQzlELEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO1FBQzlDLGFBQWEsQ0FDWixPQUFPLEVBQ1AseUJBQXlCLEVBQUUsRUFDM0IsZ0JBQWdCLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUNuRDtRQUNELEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRTtRQUNqRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtRQUN6QyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7UUFDdEUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRTtRQUM5RCxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtRQUM3RiwyRkFBMkY7UUFDM0Ysd0ZBQXdGO1FBQ3hGLDRGQUE0RjtRQUM1Riw2RkFBNkY7UUFDN0YsMEZBQTBGO1FBQzFGLDZGQUE2RjtRQUM3RiwwRkFBMEY7UUFDMUYsNENBQTRDO1FBQzVDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBYSxFQUFFO1FBQzVELDZGQUE2RjtRQUM3RiwyRkFBMkY7UUFDM0YseURBQXlEO1FBQ3pELHlGQUF5RjtRQUN6RiwwRkFBMEY7UUFDMUYseUZBQXlGO1FBQ3pGLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDdkYsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUN2RiwwRkFBMEY7UUFDMUYsdUZBQXVGO1FBQ3ZGLHFHQUFxRztRQUNyRyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ3pGLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO0tBQ25HLENBQUM7SUFFRixNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFFakQsTUFBTSxhQUFjLFNBQVEsV0FBVztRQUF2Qzs7WUFDUyxrQkFBYSxHQUErQixJQUFJLENBQUM7WUFDakQsWUFBTyxHQUFpQyxJQUFJLENBQUM7WUFDN0Msb0JBQWUsR0FBRyxLQUFLLENBQUM7WUFDeEIsaUJBQVksR0FBeUMsSUFBSSxDQUFDO1FBMkZuRSxDQUFDO1FBekZBLEtBQUssQ0FBQyxpQkFBaUI7WUFDdEIsMkVBQTJFO1lBQzNFLG1FQUFtRTtZQUNuRSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdkIsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsT0FBTztZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUM7Z0JBQ0osaUZBQWlGO2dCQUNqRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDdkIsZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztnQkFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDMUYsWUFBWSxHQUFHLE1BQU0sQ0FBQztnQkFFdEIsOERBQThEO2dCQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxDQUFDLGFBQWEsR0FBRyx5QkFBeUIsQ0FDN0MsY0FBYyxFQUNkLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsT0FBTyxRQUFRLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUN2QyxDQUFDO2dCQUVGLG1GQUFtRjtnQkFDbkYsOEVBQThFO2dCQUM5RSxxRkFBcUY7Z0JBQ3JGLHNGQUFzRjtnQkFDdEYsSUFBSSxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUNuRixPQUFPLENBQUMsS0FBSyxDQUNaLFNBQVMsUUFBUSwwRUFBMEU7d0JBQzFGLDJGQUEyRixDQUM1RixDQUFDO2dCQUNILENBQUM7Z0JBRUQscUZBQXFGO2dCQUNyRixxRkFBcUY7Z0JBQ3JGLHlGQUF5RjtnQkFDekYsaUZBQWlGO2dCQUNqRiwrREFBK0Q7Z0JBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLFlBQXFCLEVBQUU7b0JBQ3JELG1CQUFtQixFQUFFLElBQUksQ0FBQyxhQUFhO29CQUN2QyxXQUFXLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekMsc0ZBQXNGO2dCQUN0RixtRkFBbUY7Z0JBQ25GLGtFQUFrRTtnQkFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDOUIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLFFBQVEsaUNBQWlDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixxRkFBcUY7Z0JBQ3JGLHVGQUF1RjtnQkFDdkYsOEVBQThFO2dCQUM5RSxrRkFBa0Y7Z0JBQ2xGLElBQUksQ0FBQyxZQUFZO29CQUFFLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM1QyxDQUFDO1FBQ0YsQ0FBQztRQUVELG9CQUFvQjtZQUNuQixtRkFBbUY7WUFDbkYsbUZBQW1GO1lBQ25GLGdGQUFnRjtZQUNoRiw2RUFBNkU7WUFDN0UsTUFBTSxZQUFZLEdBQUksSUFBK0QsQ0FBQywwQkFBMEIsQ0FBQztZQUNqSCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNsQixPQUFPO1lBQ1IsQ0FBQztZQUNELGlGQUFpRjtZQUNqRiwrRUFBK0U7WUFDL0UsSUFBSSxJQUFJLENBQUMsWUFBWTtnQkFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsUUFBUSxrREFBa0QsQ0FBQyxDQUFDO29CQUNqRixrRkFBa0Y7b0JBQ2xGLElBQUksWUFBWTt3QkFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUNEO0lBRUQsSUFBSSxDQUFDO1FBQ0osY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLFlBQVksWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztZQUNqRSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsT0FBTyxnREFBZ0QsQ0FBQyxDQUFDO1lBQy9FLE9BQU87UUFDUixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUM7SUFDVCxDQUFDO0FBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24sIExvY2F0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG5cdEFQUF9JTklUSUFMSVpFUixcclxuXHRBcHBsaWNhdGlvbkNvbmZpZyxcclxuXHRBcHBsaWNhdGlvblJlZixcclxuXHRDb21wb25lbnRSZWYsXHJcblx0RW52aXJvbm1lbnRJbmplY3RvcixcclxuXHRFbnZpcm9ubWVudFByb3ZpZGVycyxcclxuXHRQcm92aWRlcixcclxuXHRjcmVhdGVDb21wb25lbnQsXHJcblx0Y3JlYXRlRW52aXJvbm1lbnRJbmplY3RvcixcclxuXHRpbXBvcnRQcm92aWRlcnNGcm9tLFxyXG5cdGlzRGV2TW9kZSxcclxuXHTJtUlOSkVDVE9SX1NDT1BFXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7XHJcblx0Q2hpbGRyZW5PdXRsZXRDb250ZXh0cyxcclxuXHRSb3V0ZVJldXNlU3RyYXRlZ3ksXHJcblx0Um91dGVyLFxyXG5cdFJvdXRlcyxcclxuXHRVcmxTZXJpYWxpemVyLFxyXG5cdHByb3ZpZGVSb3V0ZXIsXHJcblx0d2l0aENvbXBvbmVudElucHV0QmluZGluZyxcclxuXHR3aXRoUm91dGVyQ29uZmlnXHJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBQcmltZU5HQ29uZmlnIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcclxuXHJcbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBNb25hY29FZGl0b3JNb2R1bGUsIE5HWF9NT05BQ09fRURJVE9SX0NPTkZJRyB9IGZyb20gJ25neC1tb25hY28tZWRpdG9yLXYyJztcclxuXHJcbmltcG9ydCB7IGNyZWF0ZUJhc2VBcHBDb25maWcgfSBmcm9tICdhcmlsL2Jvb3QvYmFzZSc7XHJcbmltcG9ydCB7IHNldEFwaUNvbmZpZ09uTUZFTW9kZSB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvYXBpJztcclxuaW1wb3J0IHsgQXBwcywgQ3VzdG9tUm91dGVSZXVzZVN0cmF0ZWd5LCBQbHVnaW5NZW51SXRlbSwgVGFiQXdhcmVVcmxTZXJpYWxpemVyIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuaW1wb3J0IHsgZ2V0Tmdab25lLCBsb2FkUGx1Z2lucyB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvcGx1Z2lucyc7XHJcbmltcG9ydCB7IGkxOG5Gb2xkZXJOYW1lIH0gZnJvbSAnYXJpbC9pMThuJztcclxuaW1wb3J0IHsgcHJvdmlkZUhvc3QgfSBmcm9tICdhcmlsL3Byb3ZpZGVyJztcclxuaW1wb3J0IHsgUHViU3ViU2VydmljZSB9IGZyb20gJ2FyaWwvdXRpbC9wdWItc3ViJztcclxuXHJcbmltcG9ydCB7IGFwcENvbXBvbmVudExvYWRlciB9IGZyb20gJy4vYXBwQ29tcG9uZW50TG9hZGVyJztcclxuaW1wb3J0IHsgSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9pc29sYXRlZC1sb2NhdGlvbi1zdHJhdGVneSc7XHJcbmltcG9ydCB7IG1vbmFjb0NvbmZpZyB9IGZyb20gJy4vbW9uYWNvLmNvbmZpZyc7XHJcblxyXG5leHBvcnQgdmFyIGFwcE5hbWU6IEFwcHM7XHJcbmV4cG9ydCB2YXIgbWVudUl0ZW1zOiBQbHVnaW5NZW51SXRlbVtdID0gW107XHJcblxyXG4vKipcclxuICogYGJvb3RgIMOnYcSfcsSxbGFyxLFuxLFuIGlkZW1wb3RlbnQga2FsbWFzxLFuxLEgc2HEn2xheWFuIHN5bmMgZ3VhcmQuIEF5bsSxIHJlbW90ZSBpw6dpblxyXG4gKiBiaXJkZW4gZmF6bGEgcGFyYWxlbCBgYm9vdCgnd2RtJywgLi4uKWAgw6dhxJ9yxLFzxLEgZ2VsZGnEn2luZGUsIGlsayBgY3VzdG9tRWxlbWVudHMuZGVmaW5lYFxyXG4gKiB0YW1hbWxhbm1hZGFuIGlraW5jaSDDp2HEn3LEsSBgY3VzdG9tRWxlbWVudHMuZ2V0YCBndWFyZCfEsW7EsSBnZcOnaXlvcmR1IOKGkiBoZXIgaWtpc2kgZGVcclxuICogZGVmaW5lIGV0bWV5ZSDDp2FsxLHFn8SxcCBgTm90U3VwcG9ydGVkRXJyb3I6IHRoZSBuYW1lIFwiYXBwLXdkbVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZGBcclxuICogaGF0YXPEsSBmxLFybGF0xLFsxLF5b3JkdS4gU2V0IGlsZSBzeW5jIG1hcmsgZWRlcmVrIHRlayBiaXIgZGVmaW5lIGN5Y2xlJ8SxIGdhcmFudGkgZWRpeW9ydXouXHJcbiAqL1xyXG5jb25zdCBib290ZWRBcHBzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG5leHBvcnQgY29uc3QgYm9vdCA9IChfYXBwTmFtZTogQXBwcywgX3JvdXRlczogUm91dGVzLCBfbWVudUl0ZW1zOiBQbHVnaW5NZW51SXRlbVtdKSA9PiB7XHJcblx0aWYgKGJvb3RlZEFwcHMuaGFzKF9hcHBOYW1lKSB8fCBjdXN0b21FbGVtZW50cy5nZXQoYGFwcC0ke19hcHBOYW1lfWApKSByZXR1cm47XHJcblx0Ym9vdGVkQXBwcy5hZGQoX2FwcE5hbWUpO1xyXG5cclxuXHRhcHBOYW1lID0gX2FwcE5hbWU7XHJcblx0bWVudUl0ZW1zID0gX21lbnVJdGVtcztcclxuXHJcblx0LyoqXHJcblx0ICogKipQYXlsYcWfxLFsYW4gYmFzZSBjb25maWcqKiDigJQgcmVtb3RlIGJhxZ/EsW5hIFRFSyBgY3JlYXRlQXBwbGljYXRpb25gLiBBxJ/EsXIgc2VydmlzbGVyXHJcblx0ICogKEh0dHBDbGllbnQgKyBpbnRlcmNlcHRvciBjaGFpbiwgS2V5Y2xvYWssIGkxOG4vVHJhbnNsb2NvLCBNb25hY28sIGFuaW1hdGlvbnMpIGJ1cmFkYVxyXG5cdCAqIHlhxZ9hcjsgYHByb3ZpZGVkSW5gIHRhxZ/EsW1heWFuIGV4cGxpY2l0IHByb3ZpZGVyIG9sZHVrbGFyxLEgacOnaW4gdMO8bSB0YWInbGFyxLFuIGNoaWxkXHJcblx0ICogaW5qZWN0b3InbGFyxLFuZGFuIHBhcmVudCBvbGFyYWsgcGF5bGHFn8SxbMSxciDihpIgUkFNIGxpbmVlciBiw7x5w7xtZXouIFJvdXRlci9Mb2NhdGlvbi9cclxuXHQgKiBSZXVzZVN0cmF0ZWd5L1VybFNlcmlhbGl6ZXIgYnVyYWRhIFlPSzsgb25sYXIgdGFiIGJhxZ/EsW5hIGl6b2xlIGNoaWxkIGluamVjdG9yJ2RhIHZlcmlsaXIuXHJcblx0ICovXHJcblx0Y29uc3Qgc2hhcmVkQmFzZUNvbmZpZzogQXBwbGljYXRpb25Db25maWcgPSB7XHJcblx0XHRwcm92aWRlcnM6IFtcclxuXHRcdFx0Y3JlYXRlQmFzZUFwcENvbmZpZyh7IGkxOG5Gb2xkZXI6IF9hcHBOYW1lIH0pLFxyXG5cdFx0XHRwcm92aWRlSG9zdChfYXBwTmFtZSksXHJcblx0XHRcdGdldE5nWm9uZSgpLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxyXG5cdFx0XHRcdHVzZUZhY3Rvcnk6IChodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBrZXljbG9hazogS2V5Y2xvYWtTZXJ2aWNlLCBmb2xkZXJOYW1lOiB0eXBlb2YgaTE4bkZvbGRlck5hbWUpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkFwaUluaXQgPSBzZXRBcGlDb25maWdPbk1GRU1vZGUoaHR0cENsaWVudCwga2V5Y2xvYWssIGZvbGRlck5hbWUgYXMgdW5rbm93biBhcyBBcHBzKTtcclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkxvYWRQbHVnaW5zID0gbG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdHJldHVybiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHJ1bkFwaUluaXQoKTtcclxuXHRcdFx0XHRcdFx0cnVuTG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRtdWx0aTogdHJ1ZSxcclxuXHRcdFx0XHRkZXBzOiBbSHR0cENsaWVudCwgS2V5Y2xvYWtTZXJ2aWNlLCBpMThuRm9sZGVyTmFtZV1cclxuXHRcdFx0fSxcclxuXHRcdFx0aW1wb3J0UHJvdmlkZXJzRnJvbShNb25hY29FZGl0b3JNb2R1bGUuZm9yUm9vdCgpKSxcclxuXHRcdFx0eyBwcm92aWRlOiBOR1hfTU9OQUNPX0VESVRPUl9DT05GSUcsIHVzZVZhbHVlOiBtb25hY29Db25maWcgfVxyXG5cdFx0XVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW90ZSBiYcWfxLFuYSBURUsgcGF5bGHFn8SxbGFuIGBBcHBsaWNhdGlvblJlZmAg4oCUIGNsb3N1cmUtc2NvcGUuIMSwbGsgYDxhcHAtJHthcHBOYW1lfT5gXHJcblx0ICogZWxlbWVudCdpIGBjcmVhdGVBcHBsaWNhdGlvbihzaGFyZWRCYXNlQ29uZmlnKWAgw6dhxJ/EsXLEsXIsIHNvbnJha2kgdMO8bSBlbGVtZW50J2xlciBheW7EsVxyXG5cdCAqIHByb21pc2UnxLEgYmVrbGVyIChkdXBsaWNhdGUgQXBwbGljYXRpb24geWFyYXTEsW3EsSBpbWvDom5zxLF6KS4gSGVyIGVsZW1lbnQga2VuZGkgY2hpbGRcclxuXHQgKiBpbmplY3RvciArIGBjcmVhdGVDb21wb25lbnRgIGlsZSBrZW5kaSBgQXBwQ29tcG9uZW50YCB2aWV3J8SxbsSxIHlhcmF0xLFwIHNoYXJlZCBhcHAnZVxyXG5cdCAqIGBhdHRhY2hWaWV3YCBpbGUgYmHEn2xhci4gU2hhcmVkIGFwcCB1enVuIMO2bcO8cmzDvGTDvHIgKHRhYidsYXIga2FwYW5zYSBkYSBkZXN0cm95IGVkaWxtZXopLlxyXG5cdCAqXHJcblx0ICogYGNoaWxkUHJvdmlkZXJzYCd0YWtpIGBUcmFuc2xvY29TZXJ2aWNlYCBmYWN0b3J5J3NpIGJ1IHJlZmVyYW5zxLEga3VsbGFuZMSxxJ/EsSBpw6dpblxyXG5cdCAqIGBjaGlsZFByb3ZpZGVyc2AndGFuIMOWTkNFIHRhbsSxbWxhbsSxciAoZm9yd2FyZCBURFoneWkgw7ZubGVyKS5cclxuXHQgKi9cclxuXHRsZXQgc2hhcmVkQXBwUmVmOiBBcHBsaWNhdGlvblJlZiB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBzaGFyZWRBcHBQcm9taXNlOiBQcm9taXNlPEFwcGxpY2F0aW9uUmVmPiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHQvKipcclxuXHQgKiAqKlRhYiBiYcWfxLFuYSBpem9sZSBSb3V0ZXIgc3RhY2sqKiDigJQgaGVyIGA8YXBwLSR7YXBwTmFtZX0+YCBrZW5kaSBjaGlsZFxyXG5cdCAqIGBFbnZpcm9ubWVudEluamVjdG9yYCfEsW5kYSBidW5sYXLEsSBhbMSxci4gYMm1SU5KRUNUT1JfU0NPUEU6ICdyb290J2AgY2hpbGQnxLEgJ3Jvb3QnXHJcblx0ICogc2NvcGUgeWFwYXIgKEFuZ3VsYXIgYFIzSW5qZWN0b3JgIGN0b3I6IGBzY29wZXMuYWRkKCdyb290JylgKTsgYsO2eWxlY2UgYHByb3ZpZGVSb3V0ZXJgJ8SxblxyXG5cdCAqIGluamVjdCBldHRpxJ9pIGBwcm92aWRlZEluOidyb290J2AgUm91dGVyIHNlcnZpc2xlcmkg4oCUIGBSb3V0ZXJgLCBgQ2hpbGRyZW5PdXRsZXRDb250ZXh0c2AsXHJcblx0ICogYExvY2F0aW9uYCwgYE5hdmlnYXRpb25UcmFuc2l0aW9uc2AgdmIuIOKAlCBjaGlsZC1MT0NBTCDDvHJldGlsaXIuIFNvbnXDpzogaGVyIHRhYiBrZW5kaVxyXG5cdCAqIFJvdXRlciArIGtlbmRpIGBSb3V0ZXJPdXRsZXRgIGNvbnRleHQnaW5lIHNhaGlwIG9sdXIg4oaSICoqMSBSb3V0ZXIgOiAxIG91dGxldCoqLlxyXG5cdCAqXHJcblx0ICogTmVkZW4gZ2VyZWtsaTogcGF5bGHFn8SxbGFuIHRlayBBcHBsaWNhdGlvbidkYSBOIGA8cm91dGVyLW91dGxldD5gIGF5bsSxIHRla1xyXG5cdCAqIGBDaGlsZHJlbk91dGxldENvbnRleHRzYCdlIFwicHJpbWFyeVwiIGRpeWUga2F5ZG9sdXAgYmlyYmlyaW5pIGV6aXlvcmR1IChgY29udGV4dHMuc2V0YFxyXG5cdCAqIG92ZXJ3cml0ZSkg4oaSIHRhYiBnZcOnacWfaSBzb25yYXPEsSBheW7EsSB0YWIgacOnaSBuYXZpZ2FzeW9uIChsaXN04oaSZGV0YWlsKSB5YW5sxLHFnyBvdXRsZXQnZVxyXG5cdCAqIHJlbmRlciBvbHV5b3JkdS4gQ2hpbGQtaW5qZWN0b3IgaXpvbGFzeW9udSBidW51IGvDtmt0ZW4gw6fDtnplci5cclxuXHQgKlxyXG5cdCAqICoqVHJhbnNsb2NvU2VydmljZSBpc3Rpc25hc8SxKio6IGAncm9vdCdgIHNjb3BlIG9udSBkYSBjaGlsZC1sb2NhbCB5YXBhcmTEsTsgYW1hIGdsb2JhbFxyXG5cdCAqIChzY29wZSdzdXopIMOnZXZpcmlsZXIgc2hhcmVkIGFwcCdpbiBpbml0IGFrxLHFn8SxbmRhIHnDvGtsZW5kacSfaW5kZW4g4oCUIGBjcmVhdGVDb21wb25lbnRgXHJcblx0ICogYEFQUF9JTklUSUFMSVpFUmAgw6dhbMSxxZ90xLFybWF6IOKAlCBjaGlsZC1sb2NhbCBzZXJ2aWNlJ2luIGdsb2JhbCBjYWNoZSdpIGJvxZ8ga2FsxLFwIGhhbSBrZXlcclxuXHQgKiBnw7ZzdGVyaXlvcmR1LiBUYWIgYmHFn8SxbmEgYXlyxLEgZGlsIHNlbmFyeW9zdSB5b2s7IHNlcnZpY2UnaSBzaGFyZWQgYXBwJ3RlbiBwYXlsYcWfdMSxcsSxeW9ydXpcclxuXHQgKiAoZ2xvYmFsIMOnZXZpcmkgdGVrIHllcmRlIHnDvGtsZW5pciwgdGVrIHRyYW5zbGF0aW9uIGNhY2hlIOKGkiBlayBSQU0ga2F6YW5jxLEpLiBTY29wZSDDp2V2aXJpbGVyaVxyXG5cdCAqIChgcHJvdmlkZWkxOG5TY29wZWApIGNvbXBvbmVudC1sZXZlbCBzYcSfbGFuZMSxxJ/EsSBpw6dpbiBwYXlsYcWfxLFsYW4gc2VydmljZSdsZSBkZSDDp2FsxLHFn8Sxci5cclxuXHQgKlxyXG5cdCAqIE5PVDogYMm1SU5KRUNUT1JfU0NPUEVgIEFuZ3VsYXIgcHJpdmF0ZSBBUEknc2lkaXI7IG1pbm9yIHPDvHLDvG0gecO8a3NlbHRtZWxlcmluZGUgZGF2cmFuxLHFn8SxXHJcblx0ICogZG/En3J1bGFubWFsxLEgKGHFn2HEn8SxZGFraSBQT0MgaXpvbGFzeW9uIGxvZyd1IGJ1bnVuIGnDp2luIGLEsXJha8SxbGTEsSkuXHJcblx0ICovXHJcblx0Y29uc3QgY2hpbGRQcm92aWRlcnM6IEFycmF5PFByb3ZpZGVyIHwgRW52aXJvbm1lbnRQcm92aWRlcnM+ID0gW1xyXG5cdFx0eyBwcm92aWRlOiDJtUlOSkVDVE9SX1NDT1BFLCB1c2VWYWx1ZTogJ3Jvb3QnIH0sXHJcblx0XHRwcm92aWRlUm91dGVyKFxyXG5cdFx0XHRfcm91dGVzLFxyXG5cdFx0XHR3aXRoQ29tcG9uZW50SW5wdXRCaW5kaW5nKCksXHJcblx0XHRcdHdpdGhSb3V0ZXJDb25maWcoeyBvblNhbWVVcmxOYXZpZ2F0aW9uOiAncmVsb2FkJyB9KVxyXG5cdFx0KSxcclxuXHRcdHsgcHJvdmlkZTogTG9jYXRpb25TdHJhdGVneSwgdXNlQ2xhc3M6IElzb2xhdGVkTG9jYXRpb25TdHJhdGVneSB9LFxyXG5cdFx0eyBwcm92aWRlOiBMb2NhdGlvbiwgdXNlQ2xhc3M6IExvY2F0aW9uIH0sXHJcblx0XHR7IHByb3ZpZGU6IFJvdXRlUmV1c2VTdHJhdGVneSwgdXNlRXhpc3Rpbmc6IEN1c3RvbVJvdXRlUmV1c2VTdHJhdGVneSB9LFxyXG5cdFx0eyBwcm92aWRlOiBVcmxTZXJpYWxpemVyLCB1c2VFeGlzdGluZzogVGFiQXdhcmVVcmxTZXJpYWxpemVyIH0sXHJcblx0XHR7IHByb3ZpZGU6IFRyYW5zbG9jb1NlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KFRyYW5zbG9jb1NlcnZpY2UpIH0sXHJcblx0XHQvLyBgybVJTkpFQ1RPUl9TQ09QRToncm9vdCdgIHlhbiBldGtpc2k6IGBBcHBsaWNhdGlvblJlZmAgZGUgYHByb3ZpZGVkSW46J3Jvb3QnYCBvbGR1xJ91IGnDp2luXHJcblx0XHQvLyBjaGlsZCBpbmplY3RvcidkYSBjaGlsZC1MT0tBTCAoc2FodGUpIGJpciBpbnN0YW5jZSDDvHJldGlsaXJkaSDigJQgYnUgaW5zdGFuY2UgTmdab25lJ3VuXHJcblx0XHQvLyB0aWNrIGTDtm5nw7xzw7xuZSBiYcSfbMSxIERFxJ7EsExExLBSLiBTb251w6c6IGJ1IGFwcFJlZidlIGBhdHRhY2hWaWV3YCBlZGlsZW4gdmlldydsYXIgaGnDpyBjaGFuZ2VcclxuXHRcdC8vIGRldGVjdGlvbiBhbG1hei4gQXBwQ29tcG9uZW50J2kgYml6IGHDp8Sxa8OnYSBgc2hhcmVkQXBwUmVmLmF0dGFjaFZpZXdgIGlsZSBiYcSfbGFkxLHEn8SxbcSxeiBpw6dpblxyXG5cdFx0Ly8gw6dhbMSxxZ/EsXI7IGFtYSBgaW5qZWN0KEFwcGxpY2F0aW9uUmVmKWAgeWFwYW4gw7zDp8O8bmPDvCB0YXJhZiBrb2QgKFByaW1lTkcgYERpYWxvZ1NlcnZpY2VgIOKGklxyXG5cdFx0Ly8gYHRoaXMuYXBwUmVmLmF0dGFjaFZpZXdgKSBjaGlsZC1sb2NhbCBzYWh0ZSBhcHBSZWYnaSBhbMSxcCBkaWFsb2cndSBvbmEgYmHEn2zEsXlvcmR1IOKGkiBkaWFsb2dcclxuXHRcdC8vIHlhcmF0xLFsxLF5b3IgYW1hIGAqbmdJZj1cInZpc2libGVcImAgaGnDpyByZW5kZXIgZWRpbG1peW9yZHUgKGJvxZ8gYcOnxLFsxLF5b3JkdSkuIEdlcsOnZWsgKHRlayxcclxuXHRcdC8vIHRpY2sgYWxhbikgYHNoYXJlZEFwcFJlZmAnZSBzYWJpdGxpeW9ydXouXHJcblx0XHR7IHByb3ZpZGU6IEFwcGxpY2F0aW9uUmVmLCB1c2VGYWN0b3J5OiAoKSA9PiBzaGFyZWRBcHBSZWYhIH0sXHJcblx0XHQvLyBUYXJhbWEgKGxvZzE1KSBpbGUgc2FwdGFuYW4sIGNoaWxkLWxvY2FsIG9sdW5jYSBib3p1bGFuIGVrIGBwcm92aWRlZEluOidyb290J2Agc2VydmlzbGVyaTpcclxuXHRcdC8vIOKAoiBQdWJTdWJTZXJ2aWNlIOKAlCBNRkUnbmluIGBicmVhZGNydW1iVXBkYXRlZGAgZXZlbnQnaSBob3N0IGBoaXN0b3J5LnNlcnZpY2VgJ2UgdWxhxZ9tYWzEsTtcclxuXHRcdC8vICAgY2hpbGQtbG9jYWwgb2x1bmNhIE1GReKGlGhvc3QgZXZlbnQga8O2cHLDvHPDvCBrb3B1eW9yZHUuXHJcblx0XHQvLyDigKIgUHJpbWVOR0NvbmZpZyDigJQgZGluYW1payBkaWFsb2cnbGFyIHNoYXJlZCByb290IGNvbnRleHQnaW5kZSB5YXJhdMSxbGTEscSfxLEgacOnaW4gUHJpbWVOR1xyXG5cdFx0Ly8gICDDp2V2aXJpbGVyaSAoY2FsZW5kYXIvcGFnaW5hdG9yIHZiLikgdmUgYHNldFRyYW5zbGF0aW9uYCBzaGFyZWQgaW5zdGFuY2UndGFuIG9rdW5tYWzEsS5cclxuXHRcdC8vIChCcmVhZGNydW1iU2VydmljZSBiaWxpbsOnbGkgb2xhcmFrIGNoaWxkLWxvY2FsIGLEsXJha8SxbGTEsTogaGVyIHRhYiBrZW5kaSBicmVhZGNydW1iJ8SxLilcclxuXHRcdHsgcHJvdmlkZTogUHViU3ViU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHViU3ViU2VydmljZSkgfSxcclxuXHRcdHsgcHJvdmlkZTogUHJpbWVOR0NvbmZpZywgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHJpbWVOR0NvbmZpZykgfSxcclxuXHRcdC8vIFRvYXN0L2NvbmZpcm0gR0xPQkFMOiB0ZWsgc2hhcmVkIE1lc3NhZ2VTZXJ2aWNlL0NvbmZpcm1hdGlvblNlcnZpY2UuIEFrc2kgaGFsZGUgaGVyIHRhYlxyXG5cdFx0Ly8ga2VuZGkgaW5zdGFuY2UnxLFuYSBzYWhpcCBvbHVyIOKGkiBob3N0J3RhbiB0ZXRpa2xlbmVuIHRvYXN0IE1GRSB0YWInxLFuZGEgKHlhIGRhIHRlcnNpKVxyXG5cdFx0Ly8gZ8O2csO8bm1lei4gU2hhcmVkIGluc3RhbmNlIGlsZSB0w7xtIGA8cC10b2FzdCBrZXk9XCJ0b2FzdC1yb290XCI+YCBjb250YWluZXInbGFyxLEgYXluxLEga3V5cnXEn3UgZGlubGVyLlxyXG5cdFx0eyBwcm92aWRlOiBNZXNzYWdlU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoTWVzc2FnZVNlcnZpY2UpIH0sXHJcblx0XHR7IHByb3ZpZGU6IENvbmZpcm1hdGlvblNlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KENvbmZpcm1hdGlvblNlcnZpY2UpIH1cclxuXHRdO1xyXG5cclxuXHRjb25zdCBhcHBDb21wb25lbnRQcm9taXNlID0gYXBwQ29tcG9uZW50TG9hZGVyKCk7XHJcblxyXG5cdGNsYXNzIE1GRUFwcEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XHJcblx0XHRwcml2YXRlIGNoaWxkSW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IgfCBudWxsID0gbnVsbDtcclxuXHRcdHByaXZhdGUgY29tcFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblx0XHRwcml2YXRlIGlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0cHJpdmF0ZSBkZXN0cm95VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0YXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRcdC8vIFN0cmF0ZWd5IGhpZGRlbiBjb250YWluZXIg4oaUIHZpZXcgYXJhc8SxIHRhxZ/EsW1hbGFyZGEgcmUtYm9vdHN0cmFwJ8SxIMO2bmxlIOKAlFxyXG5cdFx0XHQvLyB2aWV3IHphdGVuIHlhcmF0xLFsZMSxeXNhIHNraXAuIGRlc3Ryb3lUaW1lciBwZW5kaW5nIGlzZSBpcHRhbCBldC5cclxuXHRcdFx0aWYgKHRoaXMuY29tcFJlZiB8fCB0aGlzLmlzQm9vdHN0cmFwcGluZykge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3lUaW1lcikge1xyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZGVzdHJveVRpbWVyKTtcclxuXHRcdFx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gdHJ1ZTtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQYXlsYcWfxLFsYW4gQXBwbGljYXRpb24g4oCUIGlsayDDp2HEn8SxcmFuIHlhcmF0xLFyLCBkacSfZXJsZXJpIGF5bsSxIHByb21pc2UnxLEgYmVrbGVyLlxyXG5cdFx0XHRcdGlmICghc2hhcmVkQXBwUHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0c2hhcmVkQXBwUHJvbWlzZSA9IGNyZWF0ZUFwcGxpY2F0aW9uKHNoYXJlZEJhc2VDb25maWcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBbYXBwUmVmLCBBcHBDb21wb25lbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3NoYXJlZEFwcFByb21pc2UsIGFwcENvbXBvbmVudFByb21pc2VdKTtcclxuXHRcdFx0XHRzaGFyZWRBcHBSZWYgPSBhcHBSZWY7XHJcblxyXG5cdFx0XHRcdC8vIEJ1IHRhYiBpw6dpbiBpem9sZSBSb3V0ZXIgc3RhY2snaSBiYXLEsW5kxLFyYW4gY2hpbGQgaW5qZWN0b3IuXHJcblx0XHRcdFx0Y29uc3QgdGFiSWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpbC10YWItaWQnKSA/PyAnJztcclxuXHRcdFx0XHR0aGlzLmNoaWxkSW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFxyXG5cdFx0XHRcdFx0Y2hpbGRQcm92aWRlcnMsXHJcblx0XHRcdFx0XHRhcHBSZWYuaW5qZWN0b3IsXHJcblx0XHRcdFx0XHRgbWZlOiR7X2FwcE5hbWV9OiR7dGFiSWQgfHwgJ3BlbmRpbmcnfWBcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHQvLyBbSGlicml0IGl6b2xhc3lvbiBndWFyZCDigJQga2FsxLFjxLFdIGDJtUlOSkVDVE9SX1NDT1BFOidyb290J2AgaWxlIGNoaWxkIGluamVjdG9yJ8SxblxyXG5cdFx0XHRcdC8vIEtFTkTEsCBSb3V0ZXIgKyBDaGlsZHJlbk91dGxldENvbnRleHRzJ2kgb2xtYXPEsSwgdGFiIGl6b2xhc3lvbnVudW4gdGVtZWxpZGlyXHJcblx0XHRcdFx0Ly8gKFwiMSBSb3V0ZXIgOiAxIG91dGxldFwiKS4gQnUgcHJpdmF0ZSBBUEkgQW5ndWxhciB1cGdyYWRlJ2luZGUgZGF2cmFuxLHFnyBkZcSfacWfdGlyaXJzZVxyXG5cdFx0XHRcdC8vIGJ1cmFkYSBlcmtlbiB5YWthbGFuxLFyOyBha3NpIGhhbGRlIFwiMSBSb3V0ZXIgOiBOIG91dGxldFwiIGJ1ZyfEsSBzZXNzaXpjZSBnZXJpIGTDtm5lci5cclxuXHRcdFx0XHRpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy5jaGlsZEluamVjdG9yLmdldChSb3V0ZXIpID09PSBhcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdGBbYm9vdDoke19hcHBOYW1lfV0gSMSwQlLEsFQgxLBaT0xBU1lPTiBCT1pVTERVOiBjaGlsZCBSb3V0ZXIgc2hhcmVkIHJvb3QgaWxlIGF5bsSxIGluc3RhbmNlISBgICtcclxuXHRcdFx0XHRcdFx0XHRgybVJTkpFQ1RPUl9TQ09QRSBkYXZyYW7EscWfxLEgZGXEn2nFn21pxZ8gb2xhYmlsaXIgKEFuZ3VsYXIgdXBncmFkZT8pIOKAlCB0YWIgaXpvbGFzeW9udSDDp2FsxLHFn21hei5gXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gQXBwQ29tcG9uZW50J2kgY2hpbGQgaW5qZWN0b3IgY29udGV4dCdpbmRlIHlhcmF0IOKGkiBpbmplY3QoUm91dGVyKS9Mb2NhdGlvblN0cmF0ZWd5XHJcblx0XHRcdFx0Ly8gY2hpbGQtbG9jYWw7IGluamVjdChNZmVCcmlkZ2UpL0h0dHBDbGllbnQvS2V5Y2xvYWsvVHJhbnNsb2NvU2VydmljZSB2Yi4gcGFyZW50J3RhblxyXG5cdFx0XHRcdC8vIHBheWxhxZ/EsW1sxLEuIGBhdHRhY2hWaWV3YCBzaGFyZWQgYXBwJ2luIGNoYW5nZSBkZXRlY3Rpb24gZMO2bmfDvHPDvG5lIGJhxJ9sYXIuIChgYm9vdHN0cmFwYFxyXG5cdFx0XHRcdC8vIGRlxJ9pbDogQVBQX0JPT1RTVFJBUF9MSVNURU5FUiDDp2FsxLHFn21heiwgY2hpbGQgUm91dGVyJ8SxbiBpbml0aWFsIG5hdmlnYXRpb24nxLFuxLFcclxuXHRcdFx0XHQvLyBBcHBDb21wb25lbnQgaG9zdC1Sb3V0ZXIgc3luYydpIGBzYWZlTmF2aWdhdGVgIGlsZSB5YXDEsXlvci4pXHJcblx0XHRcdFx0dGhpcy5jb21wUmVmID0gY3JlYXRlQ29tcG9uZW50KEFwcENvbXBvbmVudCBhcyBuZXZlciwge1xyXG5cdFx0XHRcdFx0ZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5jaGlsZEluamVjdG9yLFxyXG5cdFx0XHRcdFx0aG9zdEVsZW1lbnQ6IHRoaXNcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRhcHBSZWYuYXR0YWNoVmlldyh0aGlzLmNvbXBSZWYuaG9zdFZpZXcpO1xyXG5cdFx0XHRcdC8vIEJhxZ9hcsSxbMSxIGJvb3Q6IGd1YXJkIGFydMSxayBgY29tcFJlZmAgw7x6ZXJpbmRlbiDDp2FsxLHFn8SxciDihpIgYGlzQm9vdHN0cmFwcGluZ2AnaSBixLFyYWsuXHJcblx0XHRcdFx0Ly8gKGF3YWl0IHPEsXJhc8SxbmRhIGRpc2Nvbm5lY3Qgb2x1cCBoYXRhIG9sdcWfbWF6c2EgZmxhZyB0YWvEsWzEsSBrYWxtYXPEsW47IGFrc2kgaGFsZGVcclxuXHRcdFx0XHQvLyByZWNvbm5lY3QndGUgZ3VhcmQgZXJrZW4gcmV0dXJuIGVkaXAgdGFiJ8SxIGthbMSxY8SxIGJvxZ8gYsSxcmFrxLFyLilcclxuXHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBbYm9vdDoke19hcHBOYW1lfV0gYXBwbGljYXRpb24gYm9vdHN0cmFwIGhhdGFzxLE6YCwgZXJyKTtcclxuXHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdC8vIHNoYXJlZEFwcCBoZW7DvHogc2V0IGVkaWxtZWRpeXNlIChjcmVhdGVBcHBsaWNhdGlvbiBiYcWfYXLEsXPEsXopIHByb21pc2UnxLEgc8SxZsSxcmxhIGtpXHJcblx0XHRcdFx0Ly8gc29ucmFraSB0YWIgcmV0cnkgZWRlYmlsc2luIOKAlCBha3NpIGhhbGRlIHJlamVjdGVkIHByb21pc2UgY2xvc3VyZSdkYSBrYWzEsWPEsSBrYWzEsXIgdmVcclxuXHRcdFx0XHQvLyByZW1vdGUgc2F5ZmEgeWVuaWxlbWVkZW4gYmlyIGRhaGEgYm9vdCBlZGlsZW1lei4gKGNyZWF0ZUNvbXBvbmVudCBoYXRhc8SxbmRhXHJcblx0XHRcdFx0Ly8gc2hhcmVkQXBwUmVmIHphdGVuIHNldCd0aXI7IG8gZHVydW1kYSBwcm9taXNlIGtvcnVudXIsIGFwcCB5ZW5pZGVuIHlhcmF0xLFsbWF6LilcclxuXHRcdFx0XHRpZiAoIXNoYXJlZEFwcFJlZikgc2hhcmVkQXBwUHJvbWlzZSA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcclxuXHRcdFx0Ly8gU3RyYXRlZ3kgaGlkZGVuIGNvbnRhaW5lciDihpQgdmlldyBhcmFzxLEgdGHFn8SxbWFsYXJkYSBgcmVtb3ZlQ2hpbGRgICsgYGFwcGVuZENoaWxkYFxyXG5cdFx0XHQvLyBhcmTEscWfxLFrIG9sZHXEn3UgacOnaW4gZGlzY29ubmVjdGVkQ2FsbGJhY2sgcGFyZW50IGRlxJ9pxZ9pbWl5bGUgdGV0aWtsZW5pciDigJQgZWxlbWVudFxyXG5cdFx0XHQvLyBnZXLDp2VrdGVuIGRlc3Ryb3kgZWRpbG1peW9yLiBgcHJlc2VydmVXZWJDb21wb25lbnRFbGVtZW50YCDDtm5jZXNpbmRlIFN0cmF0ZWd5XHJcblx0XHRcdC8vIGBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaGAgZmxhZydpIHNldCBlZGl5b3I7IG8gZmxhZyB2YXJzYSB2aWV3IGtvcnVudXIuXHJcblx0XHRcdGNvbnN0IHByZXNlcnZlRmxhZyA9ICh0aGlzIGFzIEhUTUxFbGVtZW50ICYgeyBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaD86IGJvb2xlYW4gfSkuX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2g7XHJcblx0XHRcdGlmIChwcmVzZXJ2ZUZsYWcpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gRmxhZyB5b2sg4oaSIGdlcsOnZWsgZGVzdHJveS4gQXN5bmMgcmUtY29ubmVjdCBpaHRpbWFsaW5lIGthcsWfxLEgbWljcm90YXNrIHPEsW7EsXJsxLFcclxuXHRcdFx0Ly8gZGVmYW5zaWYgZ2VjaWttZTsgYmlyIHNvbnJha2kgdGljayd0ZSBow6Jsw6IgZGlzY29ubmVjdGVkIG3EsSBkaXllIHNvbiBrb250cm9sLlxyXG5cdFx0XHRpZiAodGhpcy5kZXN0cm95VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmRlc3Ryb3lUaW1lcik7XHJcblx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLmlzQ29ubmVjdGVkICYmIHRoaXMuY29tcFJlZikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coYFtib290OiR7X2FwcE5hbWV9XSBnZXLDp2VrIGRlc3Ryb3kg4oaSIHZpZXcgKyBjaGlsZCBpbmplY3RvciBkZXN0cm95YCk7XHJcblx0XHRcdFx0XHQvLyBTaGFyZWQgYXBwJ2UgQVNMQSBkb2t1bm1hOyBzYWRlY2UgYnUgdGFiJ8SxbiB2aWV3J8SxbsSxIHZlIGNoaWxkIGluamVjdG9yJ8SxbsSxIHnEsWsuXHJcblx0XHRcdFx0XHRpZiAoc2hhcmVkQXBwUmVmKSBzaGFyZWRBcHBSZWYuZGV0YWNoVmlldyh0aGlzLmNvbXBSZWYuaG9zdFZpZXcpO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21wUmVmLmRlc3Ryb3koKTtcclxuXHRcdFx0XHRcdHRoaXMuY2hpbGRJbmplY3Rvcj8uZGVzdHJveSgpO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21wUmVmID0gbnVsbDtcclxuXHRcdFx0XHRcdHRoaXMuY2hpbGRJbmplY3RvciA9IG51bGw7XHJcblx0XHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmRlc3Ryb3lUaW1lciA9IG51bGw7XHJcblx0XHRcdH0sIDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dHJ5IHtcclxuXHRcdGN1c3RvbUVsZW1lbnRzLmRlZmluZShgYXBwLSR7YXBwTmFtZX1gLCBNRkVBcHBFbGVtZW50KTtcclxuXHR9IGNhdGNoIChlKSB7XHJcblx0XHRpZiAoZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlLm5hbWUgPT09ICdOb3RTdXBwb3J0ZWRFcnJvcicpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKGBbYm9vdDoke2FwcE5hbWV9XSBjdXN0b20gZWxlbWVudCB6YXRlbiB0YW7EsW1sxLEsIGRlZmluZSBhdGxhbmTEsWApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aHJvdyBlO1xyXG5cdH1cclxufTtcclxuIl19
@@ -0,0 +1,142 @@
1
+ import { LocationStrategy } from '@angular/common';
2
+ import { Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Host modda her MFE Application'ı için kullanılan custom `LocationStrategy`. Browser
6
+ * URL'ine (`window.location.hash`) HİÇ YAZMAZ; tüm path/state internal alanlarda tutulur.
7
+ *
8
+ * Neden? Host modda host Router yegane URL kontrolcüsüdür. Eğer MFE Router da
9
+ * `HashLocationStrategy` kullansaydı, MFE içindeki bir `routerLink` tıklaması browser hash'ını
10
+ * değiştirir → `HashLocationStrategy` host Router'ı OTOMATİK tetikler → host Router'a
11
+ * tabsız (state'siz) navigation gelir → Strategy yanlış componentRef yaratır, tab
12
+ * izolasyonu bozulur. Bu otomatik sync'i kırmak için MFE Router'ın LocationStrategy'sini
13
+ * isolate ediyoruz: MFE içi navigation MFE Router'ın internal state'inde kalır, browser'a
14
+ * sızmaz, host'a istemsiz event göndermez.
15
+ *
16
+ * ## Tab içi history stack
17
+ * Browser back/forward butonu yerine MFE içinde **tab-içi history stack** çalışır:
18
+ * `pushState` her yeni navigation'da `backStack`'e mevcut konumu iter, `forwardStack`'i
19
+ * temizler; `back()` ve `forward()` stack'ler arasında değiş tokuş yapıp `popstate` event'i
20
+ * emit eder — Angular `Location` service bunu Router'a iletir, Router popstate-driven
21
+ * navigation cycle başlatır. Sonuçta kullanıcı **detay → liste** gibi MFE içi geri dönüşleri
22
+ * browser back butonuyla yapabilir, ama bu navigation **host Router'a yansımaz** → tab
23
+ * izolasyonu korunur, "geri" başka tab'a atlatmaz.
24
+ */
25
+ export class IsolatedLocationStrategy extends LocationStrategy {
26
+ /**
27
+ * Stack boyutu üst limiti — browser default'una (50 entry) yakın. Aşırı uzun
28
+ * session'larda memory'i sınırlı tutar; sınır aşıldığında en eski entry düşürülür.
29
+ */
30
+ static { this.MAX_STACK_SIZE = 50; }
31
+ constructor() {
32
+ super();
33
+ this.internalPath = '/';
34
+ this.internalState = null;
35
+ /** Geri gidilebilecek path/state çiftleri (LIFO). */
36
+ this.backStack = [];
37
+ /** İleri gidilebilecek path/state çiftleri (`back()` ile pop edilen entry'ler). */
38
+ this.forwardStack = [];
39
+ this.popStateHandlers = [];
40
+ /**
41
+ * `back/forward` sonrası Router'ın navigation cycle'ı sırasında çağrılabilen
42
+ * `pushState`'i `backStack`'e tekrar itmemek için flag. `replaceState` zaten stack'i
43
+ * değiştirmiyor — bu flag yalnızca pushState yolunu koruyor.
44
+ */
45
+ this.isNavigatingViaHistory = false;
46
+ console.log('[IsolatedLocationStrategy] CONSTRUCTED — host modda MFE Router için aktif');
47
+ }
48
+ path(_includeHash) {
49
+ return this.internalPath;
50
+ }
51
+ prepareExternalUrl(internal) {
52
+ // Host `HashLocationStrategy` (withHashLocation) kullanıyor → MFE routerLink'lerinin
53
+ // ürettiği `<a href>` (hover/kopyalama/orta-tık/yeni sekme) host ile uyumlu `#/...`
54
+ // formatında olmalı. Sol-tık navigation'ı zaten host Router proxy üzerinden gider
55
+ // (href kullanılmaz); bu override yalnız görünen/kopyalanan URL'i düzeltir.
56
+ return internal.length > 0 ? '#' + internal : internal;
57
+ }
58
+ pushState(state, _title, url, queryParams) {
59
+ const fullPath = url + (queryParams ? `?${queryParams}` : '');
60
+ console.log(`[IsolatedLocationStrategy] pushState url="${url}" qs="${queryParams}" viaHistory=${this.isNavigatingViaHistory}`);
61
+ if (!this.isNavigatingViaHistory) {
62
+ // Yeni navigation → mevcut konumu backStack'e it, forwardStack'i temizle
63
+ // (browser semantiği: yeni sayfaya gidince forward history düşer).
64
+ if (this.internalPath !== fullPath) {
65
+ this.backStack.push({ path: this.internalPath, state: this.internalState });
66
+ if (this.backStack.length > IsolatedLocationStrategy.MAX_STACK_SIZE) {
67
+ this.backStack.shift();
68
+ }
69
+ this.forwardStack = [];
70
+ }
71
+ }
72
+ this.internalPath = fullPath;
73
+ this.internalState = state;
74
+ }
75
+ replaceState(state, _title, url, queryParams) {
76
+ console.log(`[IsolatedLocationStrategy] replaceState url="${url}" qs="${queryParams}"`);
77
+ this.internalPath = url + (queryParams ? `?${queryParams}` : '');
78
+ this.internalState = state;
79
+ }
80
+ back() {
81
+ const prev = this.backStack.pop();
82
+ if (!prev)
83
+ return;
84
+ this.forwardStack.push({ path: this.internalPath, state: this.internalState });
85
+ this.internalPath = prev.path;
86
+ this.internalState = prev.state;
87
+ this.emitPopState();
88
+ }
89
+ forward() {
90
+ const next = this.forwardStack.pop();
91
+ if (!next)
92
+ return;
93
+ this.backStack.push({ path: this.internalPath, state: this.internalState });
94
+ this.internalPath = next.path;
95
+ this.internalState = next.state;
96
+ this.emitPopState();
97
+ }
98
+ historyGo(relativePosition) {
99
+ if (relativePosition < 0) {
100
+ const steps = -relativePosition;
101
+ for (let i = 0; i < steps && this.backStack.length; i++)
102
+ this.back();
103
+ }
104
+ else if (relativePosition > 0) {
105
+ for (let i = 0; i < relativePosition && this.forwardStack.length; i++)
106
+ this.forward();
107
+ }
108
+ }
109
+ onPopState(fn) {
110
+ this.popStateHandlers.push(fn);
111
+ }
112
+ emitPopState() {
113
+ this.isNavigatingViaHistory = true;
114
+ try {
115
+ const event = new PopStateEvent('popstate', { state: this.internalState });
116
+ for (const fn of this.popStateHandlers)
117
+ fn(event);
118
+ }
119
+ finally {
120
+ // Router'ın navigation cycle'ı async — popstate handler'ı navigation tetikledikten
121
+ // sonra cycle bittiğinde pushState/replaceState çağrılabilir. Microtask sınırı
122
+ // sync cycle'ı kapsar; daha güvenli istersek `queueMicrotask` yerine `setTimeout(0)`
123
+ // tercih edilebilir ama bu durumda araya gerçek user navigation girebilir. Microtask
124
+ // pratikte yeterli: Router popstate cycle'ında pushState değil replaceState çağırır.
125
+ queueMicrotask(() => {
126
+ this.isNavigatingViaHistory = false;
127
+ });
128
+ }
129
+ }
130
+ getBaseHref() {
131
+ return '/';
132
+ }
133
+ getState() {
134
+ return this.internalState;
135
+ }
136
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: IsolatedLocationStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
137
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: IsolatedLocationStrategy }); }
138
+ }
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: IsolatedLocationStrategy, decorators: [{
140
+ type: Injectable
141
+ }], ctorParameters: () => [] });
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNvbGF0ZWQtbG9jYXRpb24tc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL2Jvb3QvbWZlL3NyYy9pc29sYXRlZC1sb2NhdGlvbi1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsZ0JBQWdCO0lBQzdEOzs7T0FHRzthQUNxQixtQkFBYyxHQUFHLEVBQUUsQUFBTCxDQUFNO0lBZ0I1QztRQUNDLEtBQUssRUFBRSxDQUFDO1FBZkQsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFDdEMscURBQXFEO1FBQzdDLGNBQVMsR0FBdUMsRUFBRSxDQUFDO1FBQzNELG1GQUFtRjtRQUMzRSxpQkFBWSxHQUF1QyxFQUFFLENBQUM7UUFDdEQscUJBQWdCLEdBQXVDLEVBQUUsQ0FBQztRQUNsRTs7OztXQUlHO1FBQ0ssMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBSXRDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRVEsSUFBSSxDQUFDLFlBQXNCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMxQixDQUFDO0lBRVEsa0JBQWtCLENBQUMsUUFBZ0I7UUFDM0MscUZBQXFGO1FBQ3JGLG9GQUFvRjtRQUNwRixrRkFBa0Y7UUFDbEYsNEVBQTRFO1FBQzVFLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUN4RCxDQUFDO0lB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SFcsd0JBQXdCO2tIQUF4Qix3QkFBd0I7OzJGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEhvc3QgbW9kZGEgaGVyIE1GRSBBcHBsaWNhdGlvbifEsSBpw6dpbiBrdWxsYW7EsWxhbiBjdXN0b20gYExvY2F0aW9uU3RyYXRlZ3lgLiBCcm93c2VyXHJcbiAqIFVSTCdpbmUgKGB3aW5kb3cubG9jYXRpb24uaGFzaGApIEjEsMOHIFlBWk1BWjsgdMO8bSBwYXRoL3N0YXRlIGludGVybmFsIGFsYW5sYXJkYSB0dXR1bHVyLlxyXG4gKlxyXG4gKiBOZWRlbj8gSG9zdCBtb2RkYSBob3N0IFJvdXRlciB5ZWdhbmUgVVJMIGtvbnRyb2xjw7xzw7xkw7xyLiBFxJ9lciBNRkUgUm91dGVyIGRhXHJcbiAqIGBIYXNoTG9jYXRpb25TdHJhdGVneWAga3VsbGFuc2F5ZMSxLCBNRkUgacOnaW5kZWtpIGJpciBgcm91dGVyTGlua2AgdMSxa2xhbWFzxLEgYnJvd3NlciBoYXNoJ8SxbsSxXHJcbiAqIGRlxJ9pxZ90aXJpciDihpIgYEhhc2hMb2NhdGlvblN0cmF0ZWd5YCBob3N0IFJvdXRlcifEsSBPVE9NQVTEsEsgdGV0aWtsZXIg4oaSIGhvc3QgUm91dGVyJ2FcclxuICogdGFic8SxeiAoc3RhdGUnc2l6KSBuYXZpZ2F0aW9uIGdlbGlyIOKGkiBTdHJhdGVneSB5YW5sxLHFnyBjb21wb25lbnRSZWYgeWFyYXTEsXIsIHRhYlxyXG4gKiBpem9sYXN5b251IGJvenVsdXIuIEJ1IG90b21hdGlrIHN5bmMnaSBrxLFybWFrIGnDp2luIE1GRSBSb3V0ZXInxLFuIExvY2F0aW9uU3RyYXRlZ3knc2luaVxyXG4gKiBpc29sYXRlIGVkaXlvcnV6OiBNRkUgacOnaSBuYXZpZ2F0aW9uIE1GRSBSb3V0ZXInxLFuIGludGVybmFsIHN0YXRlJ2luZGUga2FsxLFyLCBicm93c2VyJ2FcclxuICogc8Sxem1heiwgaG9zdCdhIGlzdGVtc2l6IGV2ZW50IGfDtm5kZXJtZXouXHJcbiAqXHJcbiAqICMjIFRhYiBpw6dpIGhpc3Rvcnkgc3RhY2tcclxuICogQnJvd3NlciBiYWNrL2ZvcndhcmQgYnV0b251IHllcmluZSBNRkUgacOnaW5kZSAqKnRhYi1pw6dpIGhpc3Rvcnkgc3RhY2sqKiDDp2FsxLHFn8SxcjpcclxuICogYHB1c2hTdGF0ZWAgaGVyIHllbmkgbmF2aWdhdGlvbidkYSBgYmFja1N0YWNrYCdlIG1ldmN1dCBrb251bXUgaXRlciwgYGZvcndhcmRTdGFja2AnaVxyXG4gKiB0ZW1pemxlcjsgYGJhY2soKWAgdmUgYGZvcndhcmQoKWAgc3RhY2snbGVyIGFyYXPEsW5kYSBkZcSfacWfIHRva3XFnyB5YXDEsXAgYHBvcHN0YXRlYCBldmVudCdpXHJcbiAqIGVtaXQgZWRlciDigJQgQW5ndWxhciBgTG9jYXRpb25gIHNlcnZpY2UgYnVudSBSb3V0ZXInYSBpbGV0aXIsIFJvdXRlciBwb3BzdGF0ZS1kcml2ZW5cclxuICogbmF2aWdhdGlvbiBjeWNsZSBiYcWfbGF0xLFyLiBTb251w6d0YSBrdWxsYW7EsWPEsSAqKmRldGF5IOKGkiBsaXN0ZSoqIGdpYmkgTUZFIGnDp2kgZ2VyaSBkw7Zuw7zFn2xlcmlcclxuICogYnJvd3NlciBiYWNrIGJ1dG9udXlsYSB5YXBhYmlsaXIsIGFtYSBidSBuYXZpZ2F0aW9uICoqaG9zdCBSb3V0ZXInYSB5YW5zxLFtYXoqKiDihpIgdGFiXHJcbiAqIGl6b2xhc3lvbnUga29ydW51ciwgXCJnZXJpXCIgYmHFn2thIHRhYidhIGF0bGF0bWF6LlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5IGV4dGVuZHMgTG9jYXRpb25TdHJhdGVneSB7XHJcblx0LyoqXHJcblx0ICogU3RhY2sgYm95dXR1IMO8c3QgbGltaXRpIOKAlCBicm93c2VyIGRlZmF1bHQndW5hICg1MCBlbnRyeSkgeWFrxLFuLiBBxZ/EsXLEsSB1enVuXHJcblx0ICogc2Vzc2lvbidsYXJkYSBtZW1vcnknaSBzxLFuxLFybMSxIHR1dGFyOyBzxLFuxLFyIGHFn8SxbGTEscSfxLFuZGEgZW4gZXNraSBlbnRyeSBkw7zFn8O8csO8bMO8ci5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfU1RBQ0tfU0laRSA9IDUwO1xyXG5cclxuXHRwcml2YXRlIGludGVybmFsUGF0aCA9ICcvJztcclxuXHRwcml2YXRlIGludGVybmFsU3RhdGU6IHVua25vd24gPSBudWxsO1xyXG5cdC8qKiBHZXJpIGdpZGlsZWJpbGVjZWsgcGF0aC9zdGF0ZSDDp2lmdGxlcmkgKExJRk8pLiAqL1xyXG5cdHByaXZhdGUgYmFja1N0YWNrOiB7IHBhdGg6IHN0cmluZzsgc3RhdGU6IHVua25vd24gfVtdID0gW107XHJcblx0LyoqIMSwbGVyaSBnaWRpbGViaWxlY2VrIHBhdGgvc3RhdGUgw6dpZnRsZXJpIChgYmFjaygpYCBpbGUgcG9wIGVkaWxlbiBlbnRyeSdsZXIpLiAqL1xyXG5cdHByaXZhdGUgZm9yd2FyZFN0YWNrOiB7IHBhdGg6IHN0cmluZzsgc3RhdGU6IHVua25vd24gfVtdID0gW107XHJcblx0cHJpdmF0ZSBwb3BTdGF0ZUhhbmRsZXJzOiAoKGV2ZW50OiBQb3BTdGF0ZUV2ZW50KSA9PiB2b2lkKVtdID0gW107XHJcblx0LyoqXHJcblx0ICogYGJhY2svZm9yd2FyZGAgc29ucmFzxLEgUm91dGVyJ8SxbiBuYXZpZ2F0aW9uIGN5Y2xlJ8SxIHPEsXJhc8SxbmRhIMOnYcSfcsSxbGFiaWxlblxyXG5cdCAqIGBwdXNoU3RhdGVgJ2kgYGJhY2tTdGFja2AnZSB0ZWtyYXIgaXRtZW1layBpw6dpbiBmbGFnLiBgcmVwbGFjZVN0YXRlYCB6YXRlbiBzdGFjaydpXHJcblx0ICogZGXEn2nFn3Rpcm1peW9yIOKAlCBidSBmbGFnIHlhbG7EsXpjYSBwdXNoU3RhdGUgeW9sdW51IGtvcnV5b3IuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpc05hdmlnYXRpbmdWaWFIaXN0b3J5ID0gZmFsc2U7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0c3VwZXIoKTtcclxuXHRcdGNvbnNvbGUubG9nKCdbSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5XSBDT05TVFJVQ1RFRCDigJQgaG9zdCBtb2RkYSBNRkUgUm91dGVyIGnDp2luIGFrdGlmJyk7XHJcblx0fVxyXG5cclxuXHRvdmVycmlkZSBwYXRoKF9pbmNsdWRlSGFzaD86IGJvb2xlYW4pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJuYWxQYXRoO1xyXG5cdH1cclxuXHJcblx0b3ZlcnJpZGUgcHJlcGFyZUV4dGVybmFsVXJsKGludGVybmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0Ly8gSG9zdCBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgICh3aXRoSGFzaExvY2F0aW9uKSBrdWxsYW7EsXlvciDihpIgTUZFIHJvdXRlckxpbmsnbGVyaW5pblxyXG5cdFx0Ly8gw7xyZXR0acSfaSBgPGEgaHJlZj5gIChob3Zlci9rb3B5YWxhbWEvb3J0YS10xLFrL3llbmkgc2VrbWUpIGhvc3QgaWxlIHV5dW1sdSBgIy8uLi5gXHJcblx0XHQvLyBmb3JtYXTEsW5kYSBvbG1hbMSxLiBTb2wtdMSxayBuYXZpZ2F0aW9uJ8SxIHphdGVuIGhvc3QgUm91dGVyIHByb3h5IMO8emVyaW5kZW4gZ2lkZXJcclxuXHRcdC8vIChocmVmIGt1bGxhbsSxbG1heik7IGJ1IG92ZXJyaWRlIHlhbG7EsXogZ8O2csO8bmVuL2tvcHlhbGFuYW4gVVJMJ2kgZMO8emVsdGlyLlxyXG5cdFx0cmV0dXJuIGludGVybmFsLmxlbmd0aCA+IDAgPyAnIycgKyBpbnRlcm5hbCA6IGludGVybmFsO1xyXG5cdH1cclxuXHJcblx0b3ZlcnJpZGUgcHVzaFN0YXRlKHN0YXRlOiB1bmtub3duLCBfdGl0bGU6IHN0cmluZywgdXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGZ1bGxQYXRoID0gdXJsICsgKHF1ZXJ5UGFyYW1zID8gYD8ke3F1ZXJ5UGFyYW1zfWAgOiAnJyk7XHJcblx0XHRjb25zb2xlLmxvZyhgW0lzb2xhdGVkTG9jYXRpb25TdHJhdGVneV0gcHVzaFN0YXRlIHVybD1cIiR7dXJsfVwiIHFzPVwiJHtxdWVyeVBhcmFtc31cIiB2aWFIaXN0b3J5PSR7dGhpcy5pc05hdmlnYXRpbmdWaWFIaXN0b3J5fWApO1xyXG5cdFx0aWYgKCF0aGlzLmlzTmF2aWdhdGluZ1ZpYUhpc3RvcnkpIHtcclxuXHRcdFx0Ly8gWWVuaSBuYXZpZ2F0aW9uIOKGkiBtZXZjdXQga29udW11IGJhY2tTdGFjaydlIGl0LCBmb3J3YXJkU3RhY2snaSB0ZW1pemxlXHJcblx0XHRcdC8vIChicm93c2VyIHNlbWFudGnEn2k6IHllbmkgc2F5ZmF5YSBnaWRpbmNlIGZvcndhcmQgaGlzdG9yeSBkw7zFn2VyKS5cclxuXHRcdFx0aWYgKHRoaXMuaW50ZXJuYWxQYXRoICE9PSBmdWxsUGF0aCkge1xyXG5cdFx0XHRcdHRoaXMuYmFja1N0YWNrLnB1c2goeyBwYXRoOiB0aGlzLmludGVybmFsUGF0aCwgc3RhdGU6IHRoaXMuaW50ZXJuYWxTdGF0ZSB9KTtcclxuXHRcdFx0XHRpZiAodGhpcy5iYWNrU3RhY2subGVuZ3RoID4gSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5Lk1BWF9TVEFDS19TSVpFKSB7XHJcblx0XHRcdFx0XHR0aGlzLmJhY2tTdGFjay5zaGlmdCgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmZvcndhcmRTdGFjayA9IFtdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0aGlzLmludGVybmFsUGF0aCA9IGZ1bGxQYXRoO1xyXG5cdFx0dGhpcy5pbnRlcm5hbFN0YXRlID0gc3RhdGU7XHJcblx0fVxyXG5cclxuXHRvdmVycmlkZSByZXBsYWNlU3RhdGUoc3RhdGU6IHVua25vd24sIF90aXRsZTogc3RyaW5nLCB1cmw6IHN0cmluZywgcXVlcnlQYXJhbXM6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0Y29uc29sZS5sb2coYFtJc29sYXRlZExvY2F0aW9uU3RyYXRlZ3ldIHJlcGxhY2VTdGF0ZSB1cmw9XCIke3VybH1cIiBxcz1cIiR7cXVlcnlQYXJhbXN9XCJgKTtcclxuXHRcdHRoaXMuaW50ZXJuYWxQYXRoID0gdXJsICsgKHF1ZXJ5UGFyYW1zID8gYD8ke3F1ZXJ5UGFyYW1zfWAgOiAnJyk7XHJcblx0XHR0aGlzLmludGVybmFsU3RhdGUgPSBzdGF0ZTtcclxuXHR9XHJcblxyXG5cdG92ZXJyaWRlIGJhY2soKTogdm9pZCB7XHJcblx0XHRjb25zdCBwcmV2ID0gdGhpcy5iYWNrU3RhY2sucG9wKCk7XHJcblx0XHRpZiAoIXByZXYpIHJldHVybjtcclxuXHRcdHRoaXMuZm9yd2FyZFN0YWNrLnB1c2goeyBwYXRoOiB0aGlzLmludGVybmFsUGF0aCwgc3RhdGU6IHRoaXMuaW50ZXJuYWxTdGF0ZSB9KTtcclxuXHRcdHRoaXMuaW50ZXJuYWxQYXRoID0gcHJldi5wYXRoO1xyXG5cdFx0dGhpcy5pbnRlcm5hbFN0YXRlID0gcHJldi5zdGF0ZTtcclxuXHRcdHRoaXMuZW1pdFBvcFN0YXRlKCk7XHJcblx0fVxyXG5cclxuXHRvdmVycmlkZSBmb3J3YXJkKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgbmV4dCA9IHRoaXMuZm9yd2FyZFN0YWNrLnBvcCgpO1xyXG5cdFx0aWYgKCFuZXh0KSByZXR1cm47XHJcblx0XHR0aGlzLmJhY2tTdGFjay5wdXNoKHsgcGF0aDogdGhpcy5pbnRlcm5hbFBhdGgsIHN0YXRlOiB0aGlzLmludGVybmFsU3RhdGUgfSk7XHJcblx0XHR0aGlzLmludGVybmFsUGF0aCA9IG5leHQucGF0aDtcclxuXHRcdHRoaXMuaW50ZXJuYWxTdGF0ZSA9IG5leHQuc3RhdGU7XHJcblx0XHR0aGlzLmVtaXRQb3BTdGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0b3ZlcnJpZGUgaGlzdG9yeUdvKHJlbGF0aXZlUG9zaXRpb246IG51bWJlcik6IHZvaWQge1xyXG5cdFx0aWYgKHJlbGF0aXZlUG9zaXRpb24gPCAwKSB7XHJcblx0XHRcdGNvbnN0IHN0ZXBzID0gLXJlbGF0aXZlUG9zaXRpb247XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMgJiYgdGhpcy5iYWNrU3RhY2subGVuZ3RoOyBpKyspIHRoaXMuYmFjaygpO1xyXG5cdFx0fSBlbHNlIGlmIChyZWxhdGl2ZVBvc2l0aW9uID4gMCkge1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlbGF0aXZlUG9zaXRpb24gJiYgdGhpcy5mb3J3YXJkU3RhY2subGVuZ3RoOyBpKyspIHRoaXMuZm9yd2FyZCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0b3ZlcnJpZGUgb25Qb3BTdGF0ZShmbjogKGV2ZW50OiBQb3BTdGF0ZUV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XHJcblx0XHR0aGlzLnBvcFN0YXRlSGFuZGxlcnMucHVzaChmbik7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGVtaXRQb3BTdGF0ZSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaXNOYXZpZ2F0aW5nVmlhSGlzdG9yeSA9IHRydWU7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCBldmVudCA9IG5ldyBQb3BTdGF0ZUV2ZW50KCdwb3BzdGF0ZScsIHsgc3RhdGU6IHRoaXMuaW50ZXJuYWxTdGF0ZSB9KTtcclxuXHRcdFx0Zm9yIChjb25zdCBmbiBvZiB0aGlzLnBvcFN0YXRlSGFuZGxlcnMpIGZuKGV2ZW50KTtcclxuXHRcdH0gZmluYWxseSB7XHJcblx0XHRcdC8vIFJvdXRlcifEsW4gbmF2aWdhdGlvbiBjeWNsZSfEsSBhc3luYyDigJQgcG9wc3RhdGUgaGFuZGxlcifEsSBuYXZpZ2F0aW9uIHRldGlrbGVkaWt0ZW5cclxuXHRcdFx0Ly8gc29ucmEgY3ljbGUgYml0dGnEn2luZGUgcHVzaFN0YXRlL3JlcGxhY2VTdGF0ZSDDp2HEn3LEsWxhYmlsaXIuIE1pY3JvdGFzayBzxLFuxLFyxLFcclxuXHRcdFx0Ly8gc3luYyBjeWNsZSfEsSBrYXBzYXI7IGRhaGEgZ8O8dmVubGkgaXN0ZXJzZWsgYHF1ZXVlTWljcm90YXNrYCB5ZXJpbmUgYHNldFRpbWVvdXQoMClgXHJcblx0XHRcdC8vIHRlcmNpaCBlZGlsZWJpbGlyIGFtYSBidSBkdXJ1bWRhIGFyYXlhIGdlcsOnZWsgdXNlciBuYXZpZ2F0aW9uIGdpcmViaWxpci4gTWljcm90YXNrXHJcblx0XHRcdC8vIHByYXRpa3RlIHlldGVybGk6IFJvdXRlciBwb3BzdGF0ZSBjeWNsZSfEsW5kYSBwdXNoU3RhdGUgZGXEn2lsIHJlcGxhY2VTdGF0ZSDDp2HEn8SxcsSxci5cclxuXHRcdFx0cXVldWVNaWNyb3Rhc2soKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuaXNOYXZpZ2F0aW5nVmlhSGlzdG9yeSA9IGZhbHNlO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG92ZXJyaWRlIGdldEJhc2VIcmVmKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gJy8nO1xyXG5cdH1cclxuXHJcblx0b3ZlcnJpZGUgZ2V0U3RhdGUoKTogdW5rbm93biB7XHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlcm5hbFN0YXRlO1xyXG5cdH1cclxufVxyXG4iXX0=
@@ -1,5 +1,7 @@
1
1
  import { inject } from '@angular/core';
2
2
  import { KeycloakBearerInterceptor } from 'keycloak-angular';
3
+ import { fromEvent } from 'rxjs';
4
+ import { filter, switchMap, take } from 'rxjs/operators';
3
5
  import { bridge } from 'aril/boot/bridge';
4
6
  import { Apps } from 'aril/boot/config/apps';
5
7
  const HOST_APP_HEADERS = {
@@ -24,5 +26,18 @@ export const authInterceptor = (req, next) => {
24
26
  });
25
27
  return next(authReq);
26
28
  };
27
- export const keycloakAuthInterceptor = (req, next) => inject(KeycloakBearerInterceptor).intercept(req, { handle: next });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwva2V5Y2xvYWsvc3JjL2F1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTdDLE1BQU0sZ0JBQWdCLEdBQXNEO0lBQzNFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRTtJQUM3RixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUU7SUFDN0YsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFO0NBQzdGLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWdDLEVBQW9CLEVBQUUsQ0FDeEUsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7QUFFbkUsTUFBTSxZQUFZLEdBQUcsR0FBdUIsRUFBRSxDQUM3QyxRQUFRLENBQUMsTUFBTTtLQUNiLEtBQUssQ0FBQyxJQUFJLENBQUM7S0FDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEIsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFzQixDQUFDLEdBQXlCLEVBQUUsSUFBbUIsRUFBRSxFQUFFO0lBQ3BHLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFFakMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUN6QixVQUFVLEVBQUU7WUFDWCxVQUFVLEVBQUUsU0FBUyxJQUFJLEVBQUU7WUFDM0IsR0FBRyxPQUFPO1NBQ1Y7S0FDRCxDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBc0IsQ0FBQyxHQUF5QixFQUFFLElBQW1CLEVBQUUsRUFBRSxDQUM1RyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwSGFuZGxlckZuLCBIdHRwSW50ZXJjZXB0b3JGbiwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgS2V5Y2xvYWtCZWFyZXJJbnRlcmNlcHRvciB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5cclxuaW1wb3J0IHsgYnJpZGdlIH0gZnJvbSAnYXJpbC9ib290L2JyaWRnZSc7XHJcbmltcG9ydCB7IEFwcHMgfSBmcm9tICdhcmlsL2Jvb3QvY29uZmlnL2FwcHMnO1xyXG5cclxudHlwZSBIb3N0QXBwID0gQXBwcy5USE9SIHwgQXBwcy5ZRUFQIHwgQXBwcy5MRU5BO1xyXG5cclxuY29uc3QgSE9TVF9BUFBfSEVBREVSUzogUmVjb3JkPEhvc3RBcHAsIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PiA9IHtcclxuXHRbQXBwcy5USE9SXTogeyAneC15ZWFwLWFwcGxpY2F0aW9uJzogJ3Rob3InLCAneC1hcHBsaWNhdGlvbic6ICd0aG9yJywgJ3gtbW9kdWxlJzogJ3Rob3ItZmUnIH0sXHJcblx0W0FwcHMuTEVOQV06IHsgJ3gteWVhcC1hcHBsaWNhdGlvbic6ICdsZW5hJywgJ3gtYXBwbGljYXRpb24nOiAnbGVuYScsICd4LW1vZHVsZSc6ICdsZW5hLWZlJyB9LFxyXG5cdFtBcHBzLllFQVBdOiB7ICd4LXllYXAtYXBwbGljYXRpb24nOiAneWVhcCcsICd4LWFwcGxpY2F0aW9uJzogJ3llYXAnLCAneC1tb2R1bGUnOiAneWVhcC1mZScgfVxyXG59O1xyXG5cclxuY29uc3QgaXNIb3N0QXBwID0gKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogdmFsdWUgaXMgSG9zdEFwcCA9PlxyXG5cdHZhbHVlID09PSBBcHBzLlRIT1IgfHwgdmFsdWUgPT09IEFwcHMuTEVOQSB8fCB2YWx1ZSA9PT0gQXBwcy5ZRUFQO1xyXG5cclxuY29uc3QgZ2V0Q3NyZlRva2VuID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxyXG5cdGRvY3VtZW50LmNvb2tpZVxyXG5cdFx0LnNwbGl0KCc7ICcpXHJcblx0XHQuZmluZCgocm93KSA9PiByb3cuc3RhcnRzV2l0aCgnY3NyZl90b2tlbj0nKSlcclxuXHRcdD8uc3BsaXQoJz0nKVsxXTtcclxuXHJcbmV4cG9ydCBjb25zdCBhdXRoSW50ZXJjZXB0b3I6IEh0dHBJbnRlcmNlcHRvckZuID0gKHJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyRm4pID0+IHtcclxuXHRjb25zdCBhY3RpdmVIb3N0ID0gYnJpZGdlLmFjdGl2ZUhvc3QoKTtcclxuXHRjb25zdCBoZWFkZXJzID0gaXNIb3N0QXBwKGFjdGl2ZUhvc3QpID8gSE9TVF9BUFBfSEVBREVSU1thY3RpdmVIb3N0XSA6IHt9O1xyXG5cdGNvbnN0IGNzcmZUb2tlbiA9IGdldENzcmZUb2tlbigpO1xyXG5cclxuXHRjb25zdCBhdXRoUmVxID0gcmVxLmNsb25lKHtcclxuXHRcdHNldEhlYWRlcnM6IHtcclxuXHRcdFx0Y3NyZl90b2tlbjogY3NyZlRva2VuID8/ICcnLFxyXG5cdFx0XHQuLi5oZWFkZXJzXHJcblx0XHR9XHJcblx0fSk7XHJcblxyXG5cdHJldHVybiBuZXh0KGF1dGhSZXEpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGtleWNsb2FrQXV0aEludGVyY2VwdG9yOiBIdHRwSW50ZXJjZXB0b3JGbiA9IChyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBuZXh0OiBIdHRwSGFuZGxlckZuKSA9PlxyXG5cdGluamVjdChLZXljbG9ha0JlYXJlckludGVyY2VwdG9yKS5pbnRlcmNlcHQocmVxLCB7IGhhbmRsZTogbmV4dCB9KTtcclxuIl19
29
+ /**
30
+ * Keycloak token refresh XHR'larının tab inactive iken abort olup `InvalidStateError`
31
+ * fırlatmasını önler. `KeycloakBearerInterceptor.intercept` lazy Observable döner —
32
+ * subscribe edilmediği sürece side-effect (token refresh) yok. Tab `visibilityState`
33
+ * `'hidden'` iken subscribe'ı `visibilitychange → 'visible'` event'ine kadar erteleriz;
34
+ * tab tekrar görünür olunca request fresh token ile atılır.
35
+ */
36
+ export const keycloakAuthInterceptor = (req, next) => {
37
+ const interceptor = inject(KeycloakBearerInterceptor);
38
+ if (typeof document === 'undefined' || document.visibilityState === 'visible') {
39
+ return interceptor.intercept(req, { handle: next });
40
+ }
41
+ return fromEvent(document, 'visibilitychange').pipe(filter(() => document.visibilityState === 'visible'), take(1), switchMap(() => interceptor.intercept(req, { handle: next })));
42
+ };
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwva2V5Y2xvYWsvc3JjL2F1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJN0MsTUFBTSxnQkFBZ0IsR0FBc0Q7SUFDM0UsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFO0lBQzdGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRTtJQUM3RixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUU7Q0FDN0YsQ0FBQztBQUVGLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBZ0MsRUFBb0IsRUFBRSxDQUN4RSxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztBQUVuRSxNQUFNLFlBQVksR0FBRyxHQUF1QixFQUFFLENBQzdDLFFBQVEsQ0FBQyxNQUFNO0tBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQztLQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVsQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQXNCLENBQUMsR0FBeUIsRUFBRSxJQUFtQixFQUFFLEVBQUU7SUFDcEcsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUVqQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3pCLFVBQVUsRUFBRTtZQUNYLFVBQVUsRUFBRSxTQUFTLElBQUksRUFBRTtZQUMzQixHQUFHLE9BQU87U0FDVjtLQUNELENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQixDQUFDLEdBQXlCLEVBQUUsSUFBbUIsRUFBRSxFQUFFO0lBQzVHLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRXRELElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLFFBQVEsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0UsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQ2xELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxFQUNwRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBIYW5kbGVyRm4sIEh0dHBJbnRlcmNlcHRvckZuLCBIdHRwUmVxdWVzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBLZXljbG9ha0JlYXJlckludGVyY2VwdG9yIH0gZnJvbSAna2V5Y2xvYWstYW5ndWxhcic7XHJcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IGJyaWRnZSB9IGZyb20gJ2FyaWwvYm9vdC9icmlkZ2UnO1xyXG5pbXBvcnQgeyBBcHBzIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuXHJcbnR5cGUgSG9zdEFwcCA9IEFwcHMuVEhPUiB8IEFwcHMuWUVBUCB8IEFwcHMuTEVOQTtcclxuXHJcbmNvbnN0IEhPU1RfQVBQX0hFQURFUlM6IFJlY29yZDxIb3N0QXBwLCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj4gPSB7XHJcblx0W0FwcHMuVEhPUl06IHsgJ3gteWVhcC1hcHBsaWNhdGlvbic6ICd0aG9yJywgJ3gtYXBwbGljYXRpb24nOiAndGhvcicsICd4LW1vZHVsZSc6ICd0aG9yLWZlJyB9LFxyXG5cdFtBcHBzLkxFTkFdOiB7ICd4LXllYXAtYXBwbGljYXRpb24nOiAnbGVuYScsICd4LWFwcGxpY2F0aW9uJzogJ2xlbmEnLCAneC1tb2R1bGUnOiAnbGVuYS1mZScgfSxcclxuXHRbQXBwcy5ZRUFQXTogeyAneC15ZWFwLWFwcGxpY2F0aW9uJzogJ3llYXAnLCAneC1hcHBsaWNhdGlvbic6ICd5ZWFwJywgJ3gtbW9kdWxlJzogJ3llYXAtZmUnIH1cclxufTtcclxuXHJcbmNvbnN0IGlzSG9zdEFwcCA9ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIEhvc3RBcHAgPT5cclxuXHR2YWx1ZSA9PT0gQXBwcy5USE9SIHx8IHZhbHVlID09PSBBcHBzLkxFTkEgfHwgdmFsdWUgPT09IEFwcHMuWUVBUDtcclxuXHJcbmNvbnN0IGdldENzcmZUb2tlbiA9ICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cclxuXHRkb2N1bWVudC5jb29raWVcclxuXHRcdC5zcGxpdCgnOyAnKVxyXG5cdFx0LmZpbmQoKHJvdykgPT4gcm93LnN0YXJ0c1dpdGgoJ2NzcmZfdG9rZW49JykpXHJcblx0XHQ/LnNwbGl0KCc9JylbMV07XHJcblxyXG5leHBvcnQgY29uc3QgYXV0aEludGVyY2VwdG9yOiBIdHRwSW50ZXJjZXB0b3JGbiA9IChyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBuZXh0OiBIdHRwSGFuZGxlckZuKSA9PiB7XHJcblx0Y29uc3QgYWN0aXZlSG9zdCA9IGJyaWRnZS5hY3RpdmVIb3N0KCk7XHJcblx0Y29uc3QgaGVhZGVycyA9IGlzSG9zdEFwcChhY3RpdmVIb3N0KSA/IEhPU1RfQVBQX0hFQURFUlNbYWN0aXZlSG9zdF0gOiB7fTtcclxuXHRjb25zdCBjc3JmVG9rZW4gPSBnZXRDc3JmVG9rZW4oKTtcclxuXHJcblx0Y29uc3QgYXV0aFJlcSA9IHJlcS5jbG9uZSh7XHJcblx0XHRzZXRIZWFkZXJzOiB7XHJcblx0XHRcdGNzcmZfdG9rZW46IGNzcmZUb2tlbiA/PyAnJyxcclxuXHRcdFx0Li4uaGVhZGVyc1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHRyZXR1cm4gbmV4dChhdXRoUmVxKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBLZXljbG9hayB0b2tlbiByZWZyZXNoIFhIUidsYXLEsW7EsW4gdGFiIGluYWN0aXZlIGlrZW4gYWJvcnQgb2x1cCBgSW52YWxpZFN0YXRlRXJyb3JgXHJcbiAqIGbEsXJsYXRtYXPEsW7EsSDDtm5sZXIuIGBLZXljbG9ha0JlYXJlckludGVyY2VwdG9yLmludGVyY2VwdGAgbGF6eSBPYnNlcnZhYmxlIGTDtm5lciDigJRcclxuICogc3Vic2NyaWJlIGVkaWxtZWRpxJ9pIHPDvHJlY2Ugc2lkZS1lZmZlY3QgKHRva2VuIHJlZnJlc2gpIHlvay4gVGFiIGB2aXNpYmlsaXR5U3RhdGVgXHJcbiAqIGAnaGlkZGVuJ2AgaWtlbiBzdWJzY3JpYmUnxLEgYHZpc2liaWxpdHljaGFuZ2Ug4oaSICd2aXNpYmxlJ2AgZXZlbnQnaW5lIGthZGFyIGVydGVsZXJpejtcclxuICogdGFiIHRla3JhciBnw7Zyw7xuw7xyIG9sdW5jYSByZXF1ZXN0IGZyZXNoIHRva2VuIGlsZSBhdMSxbMSxci5cclxuICovXHJcbmV4cG9ydCBjb25zdCBrZXljbG9ha0F1dGhJbnRlcmNlcHRvcjogSHR0cEludGVyY2VwdG9yRm4gPSAocmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXJGbikgPT4ge1xyXG5cdGNvbnN0IGludGVyY2VwdG9yID0gaW5qZWN0KEtleWNsb2FrQmVhcmVySW50ZXJjZXB0b3IpO1xyXG5cclxuXHRpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0cmV0dXJuIGludGVyY2VwdG9yLmludGVyY2VwdChyZXEsIHsgaGFuZGxlOiBuZXh0IH0pO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIGZyb21FdmVudChkb2N1bWVudCwgJ3Zpc2liaWxpdHljaGFuZ2UnKS5waXBlKFxyXG5cdFx0ZmlsdGVyKCgpID0+IGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSxcclxuXHRcdHRha2UoMSksXHJcblx0XHRzd2l0Y2hNYXAoKCkgPT4gaW50ZXJjZXB0b3IuaW50ZXJjZXB0KHJlcSwgeyBoYW5kbGU6IG5leHQgfSkpXHJcblx0KTtcclxufTtcclxuIl19
@@ -1,6 +1,4 @@
1
- import { bridge } from 'aril/boot/bridge';
2
1
  import { provideHostKeycloak } from './provideHostKeycloak';
3
- // Host altında çağrıldığında shared keycloak ekler; MFE standalone'da
4
- // (bridge.hostNgZone null) bu path zaten boot olmuyor, güvenli fallback.
5
- export const provideHost = (app) => bridge.hostNgZone ? [provideHostKeycloak(app)] : [];
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZGl2ZUhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3Byb3ZpZGVyL3NyYy9wcm9kaXZlSG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsc0VBQXNFO0FBQ3RFLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFTLEVBQTBDLEVBQUUsQ0FDaEYsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IGJyaWRnZSB9IGZyb20gJ2FyaWwvYm9vdC9icmlkZ2UnO1xyXG5pbXBvcnQgeyBBcHBzIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuXHJcbmltcG9ydCB7IHByb3ZpZGVIb3N0S2V5Y2xvYWsgfSBmcm9tICcuL3Byb3ZpZGVIb3N0S2V5Y2xvYWsnO1xyXG5cclxuLy8gSG9zdCBhbHTEsW5kYSDDp2HEn3LEsWxkxLHEn8SxbmRhIHNoYXJlZCBrZXljbG9hayBla2xlcjsgTUZFIHN0YW5kYWxvbmUnZGFcclxuLy8gKGJyaWRnZS5ob3N0Tmdab25lIG51bGwpIGJ1IHBhdGggemF0ZW4gYm9vdCBvbG11eW9yLCBnw7x2ZW5saSBmYWxsYmFjay5cclxuZXhwb3J0IGNvbnN0IHByb3ZpZGVIb3N0ID0gKGFwcDogQXBwcyk6IEFycmF5PFByb3ZpZGVyIHwgRW52aXJvbm1lbnRQcm92aWRlcnM+ID0+XHJcblx0YnJpZGdlLmhvc3ROZ1pvbmUgPyBbcHJvdmlkZUhvc3RLZXljbG9hayhhcHApXSA6IFtdO1xyXG4iXX0=
2
+ /** Host shared keycloak provider'ını döner. */
3
+ export const provideHost = (app) => [provideHostKeycloak(app)];
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZGl2ZUhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3Byb3ZpZGVyL3NyYy9wcm9kaXZlSG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU1RCwrQ0FBK0M7QUFDL0MsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBUyxFQUEwQyxFQUFFLENBQ2hGLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50UHJvdmlkZXJzLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgQXBwcyB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvYXBwcyc7XHJcblxyXG5pbXBvcnQgeyBwcm92aWRlSG9zdEtleWNsb2FrIH0gZnJvbSAnLi9wcm92aWRlSG9zdEtleWNsb2FrJztcclxuXHJcbi8qKiBIb3N0IHNoYXJlZCBrZXljbG9hayBwcm92aWRlcifEsW7EsSBkw7ZuZXIuICovXHJcbmV4cG9ydCBjb25zdCBwcm92aWRlSG9zdCA9IChhcHA6IEFwcHMpOiBBcnJheTxQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzPiA9PlxyXG5cdFtwcm92aWRlSG9zdEtleWNsb2FrKGFwcCldO1xyXG4iXX0=