@eui/core 13.0.0-beta.14 → 13.0.0-beta.18
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.
- package/docs/classes/ActivatedRouteAction.html +43 -43
- package/docs/classes/AddApiQueueItemAction.html +43 -43
- package/docs/classes/AddAppLoadedConfigModulesAction.html +43 -43
- package/docs/classes/ApiQueueServiceMock.html +26 -526
- package/docs/classes/AsyncStorageService.html +43 -469
- package/docs/classes/AsyncStorageServiceMock.html +40 -1225
- package/docs/classes/EmptyApiQueueAction.html +43 -43
- package/docs/classes/EuiCoreRootGuardClass.html +8 -6
- package/docs/classes/EuiError.html +8 -6
- package/docs/classes/I18nResourceImpl.html +25 -26
- package/docs/classes/InitStoreAction.html +43 -43
- package/docs/classes/LogServiceMock.html +10 -10
- package/docs/classes/OpenIdConnectServiceMock.html +10 -46
- package/docs/classes/RemoveApiQueueItemAction.html +43 -43
- package/docs/classes/RouterMock.html +77 -84
- package/docs/classes/StorageService.html +31 -36
- package/docs/classes/StorageServiceMock.html +16 -479
- package/docs/classes/StoreMock.html +41 -47
- package/docs/classes/TranslateServiceMock.html +251 -270
- package/docs/classes/UpdateAppConnectionAction.html +43 -43
- package/docs/classes/UpdateAppStatusAction.html +43 -43
- package/docs/classes/UpdateAppVersionAction.html +43 -43
- package/docs/classes/UpdateCurrentModuleAction.html +43 -43
- package/docs/classes/UpdateI18nStateAction.html +43 -43
- package/docs/classes/UpdateLocaleStateAction.html +43 -43
- package/docs/classes/UpdateNotificationsListAction.html +43 -43
- package/docs/classes/UpdateUserDashboardAction.html +43 -43
- package/docs/classes/UpdateUserDetailsAction.html +43 -43
- package/docs/classes/UpdateUserPreferencesAction.html +43 -43
- package/docs/classes/UpdateUserRightsAction.html +43 -43
- package/docs/classes/UpdateUserStateAction.html +43 -43
- package/docs/classes/UxErrorManager.html +39 -43
- package/docs/dependencies.html +44 -41
- package/docs/directives/TranslateMockDirective.html +9 -7
- package/docs/index.html +7 -6
- package/docs/injectables/ApiQueueService.html +33 -40
- package/docs/injectables/CoreAppEffects.html +98 -99
- package/docs/injectables/EuiPermissionService.html +26 -31
- package/docs/injectables/GlobalErrorHandler.html +12 -11
- package/docs/injectables/I18nLoader.html +28 -30
- package/docs/injectables/I18nService.html +42 -48
- package/docs/injectables/I18nServiceMock.html +32 -569
- package/docs/injectables/LocalForageService.html +75 -1549
- package/docs/injectables/LocalStorageService.html +38 -499
- package/docs/injectables/LocaleService.html +23 -28
- package/docs/injectables/LocaleServiceMock.html +21 -198
- package/docs/injectables/LogService.html +11 -10
- package/docs/injectables/OpenIdConnectService.html +10 -10
- package/docs/injectables/SessionStorageService.html +38 -499
- package/docs/injectables/StoreService.html +24 -28
- package/docs/injectables/StoreServiceMock.html +18 -360
- package/docs/injectables/UserService.html +24 -27
- package/docs/injectables/UserServiceMock.html +31 -196
- package/docs/injectables/UxAppShellService.html +299 -355
- package/docs/injectables/UxDynamicComponentService.html +16 -16
- package/docs/injectables/UxDynamicMenuService.html +38 -40
- package/docs/injectables/UxErrorFeedbackService.html +42 -48
- package/docs/injectables/UxTimezoneService.html +18 -22
- package/docs/interceptors/AddLangParamInterceptor.html +11 -10
- package/docs/interceptors/CachePreventionInterceptor.html +11 -10
- package/docs/interceptors/CorsSecurityInterceptor.html +11 -10
- package/docs/interceptors/CsrfPreventionInterceptor.html +11 -10
- package/docs/interceptors/EuLoginSessionTimeoutHandlingInterceptor.html +11 -10
- package/docs/interceptors/HttpErrorHandlerInterceptor.html +11 -10
- package/docs/interceptors/OpenIdConnectInterceptor.html +35 -35
- package/docs/interceptors/UxRequestErrorModelInterceptor.html +11 -10
- package/docs/interfaces/LoadedResources.html +37 -12
- package/docs/interfaces/LoadedResourcesError.html +28 -10
- package/docs/interfaces/ModuleLoadEvent.html +37 -12
- package/docs/interfaces/OpenIdConnectUserDetails.html +64 -18
- package/docs/interfaces/ResourceError.html +37 -12
- package/docs/interfaces/TimeZone.html +28 -10
- package/docs/interfaces/UIState.html +325 -76
- package/docs/js/libs/prism.js +46 -14
- package/docs/js/menu-wc.js +76 -79
- package/docs/js/menu-wc_es5.js +60 -0
- package/docs/js/menu.js +15 -11
- package/docs/js/search/lunr.min.js +3 -3
- package/docs/js/search/search_index.js +2 -2
- package/docs/license.html +6 -5
- package/docs/miscellaneous/enumerations.html +18 -17
- package/docs/miscellaneous/functions.html +261 -140
- package/docs/miscellaneous/typealiases.html +18 -17
- package/docs/miscellaneous/variables.html +1719 -1811
- package/docs/modules/CoreModule.html +13 -14
- package/docs/modules/I18nModule.html +11 -11
- package/docs/modules/LogModule.html +16 -16
- package/docs/modules/TranslateMockModule.html +8 -6
- package/docs/modules.html +6 -5
- package/docs/pipes/TranslateMockPipe.html +10 -9
- package/docs/styles/bootstrap.min.css +4 -3
- package/docs/styles/compodoc.css +41 -33
- package/docs/styles/dark.css +113 -0
- package/docs/styles/laravel.css +52 -6
- package/docs/styles/material.css +31 -7
- package/docs/styles/original.css +12 -6
- package/docs/styles/postmark.css +23 -7
- package/docs/styles/prism.css +169 -135
- package/docs/styles/readthedocs.css +22 -11
- package/docs/styles/stripe.css +48 -5
- package/docs/styles/vagrant.css +42 -6
- package/{esm2015/eui-core.js → esm2020/eui-core.mjs} +0 -0
- package/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/{esm2015/lib/eui-core.module.js → esm2020/lib/eui-core.module.mjs} +5 -5
- package/{esm2015/lib/helpers/date-helpers.js → esm2020/lib/helpers/date-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/dom-helpers.js → esm2020/lib/helpers/dom-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/event-helpers.js → esm2020/lib/helpers/event-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/form-helpers.js → esm2020/lib/helpers/form-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/format-helpers.js → esm2020/lib/helpers/format-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/http-helpers.js → esm2020/lib/helpers/http-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/index.js → esm2020/lib/helpers/index.mjs} +0 -0
- package/{esm2015/lib/helpers/utils.js → esm2020/lib/helpers/utils.mjs} +0 -0
- package/{esm2015/lib/interceptors/add-lang-param.interceptor.js → esm2020/lib/interceptors/add-lang-param.interceptor.mjs} +4 -4
- package/{esm2015/lib/interceptors/cache-prevention.interceptor.js → esm2020/lib/interceptors/cache-prevention.interceptor.mjs} +4 -4
- package/{esm2015/lib/interceptors/cors-security.interceptor.js → esm2020/lib/interceptors/cors-security.interceptor.mjs} +4 -4
- package/{esm2015/lib/interceptors/csrf-prevention.interceptor.js → esm2020/lib/interceptors/csrf-prevention.interceptor.mjs} +4 -4
- package/esm2020/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +61 -0
- package/{esm2015/lib/interceptors/index.js → esm2020/lib/interceptors/index.mjs} +0 -0
- package/{esm2015/lib/interceptors/openid/index.js → esm2020/lib/interceptors/openid/index.mjs} +0 -0
- package/esm2020/lib/interceptors/openid/openid-connect.interceptor.mjs +146 -0
- package/{esm2015/lib/interceptors/openid/openid-connect.service.js → esm2020/lib/interceptors/openid/openid-connect.service.mjs} +4 -4
- package/{esm2015/lib/interceptors/openid/openid-connect.service.mock.js → esm2020/lib/interceptors/openid/openid-connect.service.mock.mjs} +0 -0
- package/{esm2015/lib/interceptors/ux-request-error-model.interceptor.js → esm2020/lib/interceptors/ux-request-error-model.interceptor.mjs} +4 -4
- package/{esm2015/lib/services/app/eui-init-app.js → esm2020/lib/services/app/eui-init-app.mjs} +0 -0
- package/esm2020/lib/services/app/eui-pre-init-app.mjs +42 -0
- package/{esm2015/lib/services/app/eui-startup.js → esm2020/lib/services/app/eui-startup.mjs} +0 -0
- package/{esm2015/lib/services/app/factories/log.js → esm2020/lib/services/app/factories/log.mjs} +0 -0
- package/{esm2015/lib/services/app/index.js → esm2020/lib/services/app/index.mjs} +0 -0
- package/esm2020/lib/services/config/defaults.mjs +63 -0
- package/{esm2015/lib/services/config/tokens.js → esm2020/lib/services/config/tokens.mjs} +5 -2
- package/{esm2015/lib/services/errors/eui.error.js → esm2020/lib/services/errors/eui.error.mjs} +0 -0
- package/{esm2015/lib/services/errors/global-error-handler.js → esm2020/lib/services/errors/global-error-handler.mjs} +4 -4
- package/{esm2015/lib/services/errors/http-error-handler-callback-functions.js → esm2020/lib/services/errors/http-error-handler-callback-functions.mjs} +0 -0
- package/{esm2015/lib/services/errors/http-error-handler.interceptor.js → esm2020/lib/services/errors/http-error-handler.interceptor.mjs} +4 -4
- package/{esm2015/lib/services/errors/index.js → esm2020/lib/services/errors/index.mjs} +0 -0
- package/{esm2015/lib/services/i18n/i18n.loader.js → esm2020/lib/services/i18n/i18n.loader.mjs} +4 -4
- package/{esm2015/lib/services/i18n/i18n.resource.js → esm2020/lib/services/i18n/i18n.resource.mjs} +0 -0
- package/esm2020/lib/services/i18n/i18n.service.mjs +222 -0
- package/{esm2015/lib/services/i18n/i18n.service.mock.js → esm2020/lib/services/i18n/i18n.service.mock.mjs} +4 -4
- package/{esm2015/lib/services/i18n/index.js → esm2020/lib/services/i18n/index.mjs} +0 -0
- package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
- package/{esm2015/lib/services/locale/index.js → esm2020/lib/services/locale/index.mjs} +0 -0
- package/esm2020/lib/services/locale/locale.service.mjs +250 -0
- package/{esm2015/lib/services/log/index.js → esm2020/lib/services/log/index.mjs} +0 -0
- package/{esm2015/lib/services/log/log.module.js → esm2020/lib/services/log/log.module.mjs} +5 -5
- package/{esm2015/lib/services/log/log.service.js → esm2020/lib/services/log/log.service.mjs} +4 -4
- package/{esm2015/lib/services/log/log.service.mock.js → esm2020/lib/services/log/log.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/permission/permission.service.js → esm2020/lib/services/permission/permission.service.mjs} +5 -5
- package/{esm2015/lib/services/queue/api-queue.service.js → esm2020/lib/services/queue/api-queue.service.mjs} +4 -4
- package/{esm2015/lib/services/queue/api-queue.service.mock.js → esm2020/lib/services/queue/api-queue.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/queue/index.js → esm2020/lib/services/queue/index.mjs} +0 -0
- package/{esm2015/lib/services/storage/async-storage.service.js → esm2020/lib/services/storage/async-storage.service.mjs} +0 -0
- package/{esm2015/lib/services/storage/async-storage.service.mock.js → esm2020/lib/services/storage/async-storage.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/storage/index.js → esm2020/lib/services/storage/index.mjs} +0 -0
- package/{esm2015/lib/services/storage/local-forage.service.js → esm2020/lib/services/storage/local-forage.service.mjs} +4 -4
- package/{esm2015/lib/services/storage/local-storage.service.js → esm2020/lib/services/storage/local-storage.service.mjs} +4 -4
- package/{esm2015/lib/services/storage/session-storage.service.js → esm2020/lib/services/storage/session-storage.service.mjs} +4 -4
- package/{esm2015/lib/services/storage/storage.service.js → esm2020/lib/services/storage/storage.service.mjs} +0 -0
- package/{esm2015/lib/services/storage/storage.service.mock.js → esm2020/lib/services/storage/storage.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/app.actions.js → esm2020/lib/services/store/actions/app.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/i18n.actions.js → esm2020/lib/services/store/actions/i18n.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/index.js → esm2020/lib/services/store/actions/index.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/locale.actions.js → esm2020/lib/services/store/actions/locale.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/notifications.actions.js → esm2020/lib/services/store/actions/notifications.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/user.actions.js → esm2020/lib/services/store/actions/user.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/effects/app.effects.js → esm2020/lib/services/store/effects/app.effects.mjs} +5 -5
- package/{esm2015/lib/services/store/effects/index.js → esm2020/lib/services/store/effects/index.mjs} +0 -0
- package/{esm2015/lib/services/store/index.js → esm2020/lib/services/store/index.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/app.reducers.mjs +57 -0
- package/{esm2015/lib/services/store/reducers/core.reducers.js → esm2020/lib/services/store/reducers/core.reducers.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/i18n.reducers.mjs +18 -0
- package/{esm2015/lib/services/store/reducers/index.js → esm2020/lib/services/store/reducers/index.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/locale.reducers.mjs +18 -0
- package/esm2020/lib/services/store/reducers/meta.reducers.mjs +91 -0
- package/{esm2015/lib/services/store/reducers/notifications.reducers.js → esm2020/lib/services/store/reducers/notifications.reducers.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/user.reducers.mjs +43 -0
- package/{esm2015/lib/services/store/store.service.js → esm2020/lib/services/store/store.service.mjs} +4 -4
- package/{esm2015/lib/services/store/store.service.mock.js → esm2020/lib/services/store/store.service.mock.mjs} +4 -4
- package/{esm2015/lib/services/user/index.js → esm2020/lib/services/user/index.mjs} +0 -0
- package/{esm2015/lib/services/user/user.service.js → esm2020/lib/services/user/user.service.mjs} +4 -4
- package/{esm2015/lib/services/user/user.service.mock.js → esm2020/lib/services/user/user.service.mock.mjs} +4 -4
- package/esm2020/lib/services/ux-app-shell.service.mjs +633 -0
- package/{esm2015/lib/services/ux-dynamic-component/ux-dynamic-component.service.js → esm2020/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs} +4 -4
- package/{esm2015/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.js → esm2020/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.mjs} +4 -4
- package/{esm2015/lib/services/ux-error-feedback/ux-error-feedback.service.js → esm2020/lib/services/ux-error-feedback/ux-error-feedback.service.mjs} +4 -4
- package/{esm2015/lib/services/ux-error-feedback/ux-error-handler.operator.js → esm2020/lib/services/ux-error-feedback/ux-error-handler.operator.mjs} +0 -0
- package/{esm2015/lib/services/ux-timezone.service.js → esm2020/lib/services/ux-timezone.service.mjs} +4 -4
- package/fesm2015/{eui-core.js → eui-core.mjs} +270 -247
- package/fesm2015/eui-core.mjs.map +1 -0
- package/fesm2020/eui-core.mjs +4592 -0
- package/fesm2020/eui-core.mjs.map +1 -0
- package/lib/services/locale/locale.service.d.ts.map +1 -1
- package/lib/services/permission/permission.service.d.ts +1 -1
- package/lib/services/permission/permission.service.d.ts.map +1 -1
- package/package.json +19 -6
- package/bundles/eui-core.umd.js +0 -5323
- package/bundles/eui-core.umd.js.map +0 -1
- package/esm2015/lib/interceptors/eu-login-session-timeout-handling.interceptor.js +0 -61
- package/esm2015/lib/interceptors/openid/openid-connect.interceptor.js +0 -146
- package/esm2015/lib/services/app/eui-pre-init-app.js +0 -47
- package/esm2015/lib/services/config/defaults.js +0 -49
- package/esm2015/lib/services/i18n/i18n.service.js +0 -219
- package/esm2015/lib/services/locale/locale.service.js +0 -255
- package/esm2015/lib/services/store/reducers/app.reducers.js +0 -49
- package/esm2015/lib/services/store/reducers/i18n.reducers.js +0 -15
- package/esm2015/lib/services/store/reducers/locale.reducers.js +0 -15
- package/esm2015/lib/services/store/reducers/meta.reducers.js +0 -92
- package/esm2015/lib/services/store/reducers/user.reducers.js +0 -43
- package/esm2015/lib/services/ux-app-shell.service.js +0 -584
- package/fesm2015/eui-core.js.map +0 -1
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpResponse } from '@angular/common/http';
|
|
3
|
-
import { tap } from 'rxjs/operators';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
// The EuLoginSessionTimeoutHandlingInterceptor assumes that the EU login client is configured with:
|
|
6
|
-
// <redirectionInterceptor>eu.cec.digit.ecas.client.http.ajax.JsonAjaxRedirectionInterceptor</redirectionInterceptor>
|
|
7
|
-
// WARNING: The default EU login client behaviour that provides the JSON-un-parsable login HTML page, is no longer supported!
|
|
8
|
-
export class EuLoginSessionTimeoutHandlingInterceptor {
|
|
9
|
-
intercept(request, next) {
|
|
10
|
-
return next.handle(request)
|
|
11
|
-
.pipe(tap((event) => {
|
|
12
|
-
this.checkRequestSuccessForEULoginSessionTimeout(request, event);
|
|
13
|
-
return event;
|
|
14
|
-
}, error => {
|
|
15
|
-
this.checkRequestErrorForEULoginSessionTimeout(request, error);
|
|
16
|
-
}));
|
|
17
|
-
}
|
|
18
|
-
checkRequestSuccessForEULoginSessionTimeout(request, event) {
|
|
19
|
-
if (event instanceof HttpResponse) {
|
|
20
|
-
if (this.isSsoResponse(event.body)) {
|
|
21
|
-
this.reauthenticate(request, event);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
checkRequestErrorForEULoginSessionTimeout(request, response) {
|
|
26
|
-
// intentionally blank; meant for overriding
|
|
27
|
-
}
|
|
28
|
-
isSsoResponse(body) {
|
|
29
|
-
if (body) {
|
|
30
|
-
if (typeof body !== 'string') {
|
|
31
|
-
return (body.success === false &&
|
|
32
|
-
body.status === 'ECAS_AUTHENTICATION_REQUIRED' &&
|
|
33
|
-
body.code === 303 &&
|
|
34
|
-
body.message === 'session expired');
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
const html = body;
|
|
38
|
-
return ((html.indexOf('<meta name="Keywords" content="EU Login, ECAS, Authentication, Security" />') >= 0 &&
|
|
39
|
-
html.indexOf('<meta name="Description" content="EU Login" />') >= 0) ||
|
|
40
|
-
html.indexOf('<meta name="Description" content="European Commission Authentication Service" />') >= 0 ||
|
|
41
|
-
html.indexOf('<title>Mock Login Form</title>') >= 0 ||
|
|
42
|
-
html.indexOf('<title>Redirecting To ECAS</title>') >= 0 ||
|
|
43
|
-
html === '{ success : false, status : "ECAS_AUTHENTICATION_REQUIRED", code : 303, message : "session expired" }' ||
|
|
44
|
-
html === '{ "success" : false, "status" : "ECAS_AUTHENTICATION_REQUIRED", "code" : 303, "message": "session expired" }');
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
reauthenticate(request, response) {
|
|
52
|
-
// tslint:disable-next-line:deprecation
|
|
53
|
-
document.location.reload(true);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
57
|
-
/** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor });
|
|
58
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, decorators: [{
|
|
59
|
-
type: Injectable
|
|
60
|
-
}] });
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnRlcmNlcHRvcnMvZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUtILFlBQVksRUFFZixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFckMsb0dBQW9HO0FBQ3BHLHFIQUFxSDtBQUNySCw2SEFBNkg7QUFFN0gsTUFBTSxPQUFPLHdDQUF3QztJQUNqRCxTQUFTLENBQUMsT0FBeUIsRUFBRSxJQUFpQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ3RCLElBQUksQ0FDRCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakUsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ1YsQ0FBQztJQUVTLDJDQUEyQyxDQUFDLE9BQXlCLEVBQUUsS0FBcUI7UUFDbEcsSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBcUIsS0FBTSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBcUIsS0FBSyxDQUFDLENBQUM7YUFDMUQ7U0FDSjtJQUVMLENBQUM7SUFFUyx5Q0FBeUMsQ0FBQyxPQUF5QixFQUFFLFFBQTBCO1FBQ3JHLDRDQUE0QztJQUNoRCxDQUFDO0lBRVMsYUFBYSxDQUFDLElBQVM7UUFDN0IsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDMUIsT0FBTyxDQUNILElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSztvQkFDdEIsSUFBSSxDQUFDLE1BQU0sS0FBSyw4QkFBOEI7b0JBQzlDLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRztvQkFDakIsSUFBSSxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsQ0FDckMsQ0FBQzthQUNMO2lCQUFNO2dCQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDbEIsT0FBTyxDQUNILENBQ0ksSUFBSSxDQUFDLE9BQU8sQ0FBQyw2RUFBNkUsQ0FBQyxJQUFJLENBQUM7b0JBQ2hHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0RBQWdELENBQUMsSUFBSSxDQUFDLENBQ3RFO29CQUNELElBQUksQ0FBQyxPQUFPLENBQUMsa0ZBQWtGLENBQUMsSUFBSSxDQUFDO29CQUNyRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQztvQkFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUM7b0JBQ3ZELElBQUksS0FBSyx1R0FBdUc7b0JBQ2hILElBQUksS0FBSyw4R0FBOEcsQ0FDMUgsQ0FBQzthQUNMO1NBQ0o7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVTLGNBQWMsQ0FBQyxPQUF5QixFQUFFLFFBQTBCO1FBQzFFLHVDQUF1QztRQUN2QyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDOzsrSkF6RFEsd0NBQXdDO21LQUF4Qyx3Q0FBd0M7a0dBQXhDLHdDQUF3QztrQkFEcEQsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgSHR0cEV2ZW50LFxuICAgIEh0dHBIYW5kbGVyLFxuICAgIEh0dHBJbnRlcmNlcHRvcixcbiAgICBIdHRwUmVxdWVzdCxcbiAgICBIdHRwUmVzcG9uc2UsXG4gICAgSHR0cFJlc3BvbnNlQmFzZVxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8vIFRoZSBFdUxvZ2luU2Vzc2lvblRpbWVvdXRIYW5kbGluZ0ludGVyY2VwdG9yIGFzc3VtZXMgdGhhdCB0aGUgRVUgbG9naW4gY2xpZW50IGlzIGNvbmZpZ3VyZWQgd2l0aDpcbi8vIDxyZWRpcmVjdGlvbkludGVyY2VwdG9yPmV1LmNlYy5kaWdpdC5lY2FzLmNsaWVudC5odHRwLmFqYXguSnNvbkFqYXhSZWRpcmVjdGlvbkludGVyY2VwdG9yPC9yZWRpcmVjdGlvbkludGVyY2VwdG9yPlxuLy8gV0FSTklORzogVGhlIGRlZmF1bHQgRVUgbG9naW4gY2xpZW50IGJlaGF2aW91ciB0aGF0IHByb3ZpZGVzIHRoZSBKU09OLXVuLXBhcnNhYmxlIGxvZ2luIEhUTUwgcGFnZSwgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCFcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFdUxvZ2luU2Vzc2lvblRpbWVvdXRIYW5kbGluZ0ludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdFN1Y2Nlc3NGb3JFVUxvZ2luU2Vzc2lvblRpbWVvdXQocmVxdWVzdCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdEVycm9yRm9yRVVMb2dpblNlc3Npb25UaW1lb3V0KHJlcXVlc3QsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrUmVxdWVzdFN1Y2Nlc3NGb3JFVUxvZ2luU2Vzc2lvblRpbWVvdXQocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgZXZlbnQ6IEh0dHBFdmVudDxhbnk+KSB7XG4gICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTc29SZXNwb25zZSgoPEh0dHBSZXNwb25zZTxhbnk+PmV2ZW50KS5ib2R5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhdXRoZW50aWNhdGUocmVxdWVzdCwgPEh0dHBSZXNwb25zZTxhbnk+PmV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrUmVxdWVzdEVycm9yRm9yRVVMb2dpblNlc3Npb25UaW1lb3V0KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgYmxhbms7IG1lYW50IGZvciBvdmVycmlkaW5nXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzU3NvUmVzcG9uc2UoYm9keTogYW55KSB7XG4gICAgICAgIGlmIChib2R5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYm9keS5zdWNjZXNzID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgICBib2R5LnN0YXR1cyA9PT0gJ0VDQVNfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQnICYmXG4gICAgICAgICAgICAgICAgICAgIGJvZHkuY29kZSA9PT0gMzAzICYmXG4gICAgICAgICAgICAgICAgICAgIGJvZHkubWVzc2FnZSA9PT0gJ3Nlc3Npb24gZXhwaXJlZCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzxtZXRhIG5hbWU9XCJLZXl3b3Jkc1wiIGNvbnRlbnQ9XCJFVSBMb2dpbiwgRUNBUywgQXV0aGVudGljYXRpb24sIFNlY3VyaXR5XCIgLz4nKSA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzxtZXRhIG5hbWU9XCJEZXNjcmlwdGlvblwiIGNvbnRlbnQ9XCJFVSBMb2dpblwiIC8+JykgPj0gMFxuICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgIGh0bWwuaW5kZXhPZignPG1ldGEgbmFtZT1cIkRlc2NyaXB0aW9uXCIgY29udGVudD1cIkV1cm9wZWFuIENvbW1pc3Npb24gQXV0aGVudGljYXRpb24gU2VydmljZVwiIC8+JykgPj0gMCB8fFxuICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzx0aXRsZT5Nb2NrIExvZ2luIEZvcm08L3RpdGxlPicpID49IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgaHRtbC5pbmRleE9mKCc8dGl0bGU+UmVkaXJlY3RpbmcgVG8gRUNBUzwvdGl0bGU+JykgPj0gMCB8fFxuICAgICAgICAgICAgICAgICAgICBodG1sID09PSAneyBzdWNjZXNzIDogZmFsc2UsIHN0YXR1cyA6IFwiRUNBU19BVVRIRU5USUNBVElPTl9SRVFVSVJFRFwiLCBjb2RlIDogMzAzLCBtZXNzYWdlIDogXCJzZXNzaW9uIGV4cGlyZWRcIiB9JyB8fFxuICAgICAgICAgICAgICAgICAgICBodG1sID09PSAneyBcInN1Y2Nlc3NcIiA6IGZhbHNlLCBcInN0YXR1c1wiIDogXCJFQ0FTX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEXCIsIFwiY29kZVwiIDogMzAzLCBcIm1lc3NhZ2VcIjogXCJzZXNzaW9uIGV4cGlyZWRcIiB9J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhdXRoZW50aWNhdGUocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRlcHJlY2F0aW9uXG4gICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCh0cnVlKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpErrorResponse, HttpEventType, HttpHeaders, } from '@angular/common/http';
|
|
3
|
-
import { of, Subject, throwError } from 'rxjs';
|
|
4
|
-
import { catchError } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class OpenIdConnectInterceptor {
|
|
7
|
-
constructor() {
|
|
8
|
-
// By default, the original request should at least be retries once in case the cached API Gateway token expires:
|
|
9
|
-
this.defaultMaximumRequestRetries = 1;
|
|
10
|
-
// check if the OpenIdConnect is defined
|
|
11
|
-
if (typeof OpenIdConnect === 'undefined') {
|
|
12
|
-
console.error('Please include the script openid-login.js in your index.html file.', 'For more details, please consult the documentation regarding the Http Interceptors and OpenID Connect configuration.');
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
intercept(request, next, retryCount = 0, retryCallback) {
|
|
16
|
-
if (typeof OpenIdConnect !== 'undefined') {
|
|
17
|
-
let authorizedRequest = retryCallback;
|
|
18
|
-
if (!authorizedRequest) {
|
|
19
|
-
authorizedRequest = new Subject();
|
|
20
|
-
}
|
|
21
|
-
OpenIdConnect.getAuthorizationHeaders(request.urlWithParams, (headers) => {
|
|
22
|
-
let newRequest = request;
|
|
23
|
-
if (headers) {
|
|
24
|
-
let newHeaders = request.headers;
|
|
25
|
-
if (newHeaders) {
|
|
26
|
-
for (const headerName in headers) {
|
|
27
|
-
if (headers.hasOwnProperty(headerName)) {
|
|
28
|
-
newHeaders = newHeaders.set(headerName, headers[headerName]);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
newHeaders = new HttpHeaders(headers);
|
|
34
|
-
}
|
|
35
|
-
newRequest = request.clone({
|
|
36
|
-
withCredentials: false,
|
|
37
|
-
headers: newHeaders,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
const subscription = next.handle(newRequest)
|
|
41
|
-
.pipe(catchError((response) => {
|
|
42
|
-
return this.handleErrorResponse(response, request, next, retryCount, authorizedRequest, subscription);
|
|
43
|
-
}))
|
|
44
|
-
.subscribe((httpEvent) => {
|
|
45
|
-
if (httpEvent) {
|
|
46
|
-
authorizedRequest.next(httpEvent);
|
|
47
|
-
if (httpEvent.type === HttpEventType.Response) {
|
|
48
|
-
if (subscription) {
|
|
49
|
-
subscription.unsubscribe();
|
|
50
|
-
}
|
|
51
|
-
authorizedRequest.complete();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}, (errorResponse) => {
|
|
56
|
-
const errorProperties = {
|
|
57
|
-
error: errorResponse,
|
|
58
|
-
};
|
|
59
|
-
if (errorResponse) {
|
|
60
|
-
errorProperties.status = errorResponse.status;
|
|
61
|
-
errorProperties.statusText = errorResponse.statusText;
|
|
62
|
-
}
|
|
63
|
-
return this.handleErrorResponse(new HttpErrorResponse(errorProperties), request, next, retryCount, authorizedRequest, null);
|
|
64
|
-
});
|
|
65
|
-
return authorizedRequest;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
return next.handle(request);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
handleErrorResponse(response, originalRequest, next, retryCount = 0, retryCallback, subscription) {
|
|
72
|
-
if (response) {
|
|
73
|
-
if (response.error && response.error.error === 'invalid_request') {
|
|
74
|
-
// The ID token is invalid or incorrect; retrieve another one:
|
|
75
|
-
OpenIdConnect.renewIdToken();
|
|
76
|
-
}
|
|
77
|
-
else if (this.apiGatewayTokenExpired(response)) {
|
|
78
|
-
OpenIdConnect.clearCachedApiGatewayAccessToken();
|
|
79
|
-
return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
|
|
80
|
-
}
|
|
81
|
-
else if (response.status === 401 || response.status === 403) {
|
|
82
|
-
// The EU Login access token is invalid. (403)
|
|
83
|
-
// The target service is unable to read the access token, for example because the EU Login session ended. (401)
|
|
84
|
-
// Retry in case the access token became invalid too quickly:
|
|
85
|
-
return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
|
|
86
|
-
}
|
|
87
|
-
else if (response.status === 0) {
|
|
88
|
-
// One of the access token requests or the original request was not sent.
|
|
89
|
-
// Most likely one of the CORS pre-flight requests failed, or the browser is offline.
|
|
90
|
-
console.warn('The OpenID Connect call may have issues:\n' +
|
|
91
|
-
'* the CORS pre-flight requests for the OpenID Connect access tokens or for the REST call could be failing\n' +
|
|
92
|
-
'* the browser could be currently offline.');
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (subscription) {
|
|
96
|
-
subscription.unsubscribe();
|
|
97
|
-
}
|
|
98
|
-
if (retryCallback) {
|
|
99
|
-
retryCallback.error(response);
|
|
100
|
-
retryCallback.complete();
|
|
101
|
-
}
|
|
102
|
-
return throwError(response);
|
|
103
|
-
}
|
|
104
|
-
retryRequest(originalRequest, response, next, retryCount = 0, retryCallback, subscription) {
|
|
105
|
-
if (retryCount < this.maximumRequestRetries()) {
|
|
106
|
-
this.intercept(originalRequest, next, retryCount + 1, retryCallback);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
console.error('The OpenID Connect call may have issues:\n' +
|
|
110
|
-
'* the client ID could be invalid\n' +
|
|
111
|
-
'* the API Gateway access token could be invalid\n' +
|
|
112
|
-
'* the EU Login access token for the target service could be invalid.');
|
|
113
|
-
if (subscription) {
|
|
114
|
-
subscription.unsubscribe();
|
|
115
|
-
}
|
|
116
|
-
if (retryCallback) {
|
|
117
|
-
retryCallback.error(response);
|
|
118
|
-
retryCallback.complete();
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return of(null);
|
|
122
|
-
}
|
|
123
|
-
apiGatewayTokenExpired(response) {
|
|
124
|
-
if (response && response.status === 401) {
|
|
125
|
-
const message = '' + response.error;
|
|
126
|
-
return message.indexOf('<ams:code>900901</ams:code>') >= 0;
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
maximumRequestRetries() {
|
|
133
|
-
if (OpenIdConnect.config && OpenIdConnect.config.maximumRequestRetries >= 0) {
|
|
134
|
-
return OpenIdConnect.config.maximumRequestRetries;
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
return this.defaultMaximumRequestRetries;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/** @nocollapse */ OpenIdConnectInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: OpenIdConnectInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
142
|
-
/** @nocollapse */ OpenIdConnectInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: OpenIdConnectInterceptor });
|
|
143
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: OpenIdConnectInterceptor, decorators: [{
|
|
144
|
-
type: Injectable
|
|
145
|
-
}], ctorParameters: function () { return []; } });
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9vcGVuaWQvb3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsaUJBQWlCLEVBRWpCLGFBQWEsRUFFYixXQUFXLEdBSWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFPNUMsTUFBTSxPQUFPLHdCQUF3QjtJQUlqQztRQUhBLGlIQUFpSDtRQUNqSCxpQ0FBNEIsR0FBRyxDQUFDLENBQUM7UUFHN0Isd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQ1Qsb0VBQW9FLEVBQ3BFLHNIQUFzSCxDQUN6SCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUNMLE9BQXlCLEVBQ3pCLElBQWlCLEVBQ2pCLFVBQVUsR0FBRyxDQUFDLEVBQ2QsYUFBdUM7UUFFdkMsSUFBSSxPQUFPLGFBQWEsS0FBSyxXQUFXLEVBQUU7WUFDdEMsSUFBSSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7WUFDdEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUNwQixpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQzthQUNyRDtZQUVELGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQzFFLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQztnQkFDekIsSUFBSSxP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V0FBVyxFQUFFLENBQUM7YUFDOUI7WUFDRCxJQUFJLGFBQWEsRUFBRTtnQkFDZixhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDNUI7U0FDSjtRQUVELE9BQU8sRUFBRSxDQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxRQUEyQjtRQUN4RCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUQ7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVTLHFCQUFxQjtRQUMzQixJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEVBQUU7WUFDekUsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1NBQ3JEO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztTQUM1QztJQUNMLENBQUM7OytJQXRLUSx3QkFBd0I7bUpBQXhCLHdCQUF3QjtrR0FBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICBIdHRwRXZlbnQsXG4gICAgSHR0cEV2ZW50VHlwZSxcbiAgICBIdHRwSGFuZGxlcixcbiAgICBIdHRwSGVhZGVycyxcbiAgICBIdHRwSW50ZXJjZXB0b3IsXG4gICAgSHR0cFJlcXVlc3QsXG4gICAgSHR0cFJlc3BvbnNlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGluIHRoZSBqYXZhc2NyaXB0IGZpbGUgb3BlbmlkLWxvZ2luLmpzXG4vLyBhbmQgd2lsbCBiZSBpbXBvcnRlZCBpbiB0aGUgZVVJIGFwcGxpY2F0aW9ucycgaW5kZXguaHRtbCBmaWxlLCB3aGVuIG5lY2Vzc2FyeS5cbmRlY2xhcmUgdmFyIE9wZW5JZENvbm5lY3Q6IGFueTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9wZW5JZENvbm5lY3RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgLy8gQnkgZGVmYXVsdCwgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgc2hvdWxkIGF0IGxlYXN0IGJlIHJldHJpZXMgb25jZSBpbiBjYXNlIHRoZSBjYWNoZWQgQVBJIEdhdGV3YXkgdG9rZW4gZXhwaXJlczpcbiAgICBkZWZhdWx0TWF4aW11bVJlcXVlc3RSZXRyaWVzID0gMTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGUgT3BlbklkQ29ubmVjdCBpcyBkZWZpbmVkXG4gICAgICAgIGlmICh0eXBlb2YgT3BlbklkQ29ubmVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1BsZWFzZSBpbmNsdWRlIHRoZSBzY3JpcHQgb3BlbmlkLWxvZ2luLmpzIGluIHlvdXIgaW5kZXguaHRtbCBmaWxlLicsXG4gICAgICAgICAgICAgICAgJ0ZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyB0aGUgSHR0cCBJbnRlcmNlcHRvcnMgYW5kIE9wZW5JRCBDb25uZWN0IGNvbmZpZ3VyYXRpb24uJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnRlcmNlcHQoXG4gICAgICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgICAgIG5leHQ6IEh0dHBIYW5kbGVyLFxuICAgICAgICByZXRyeUNvdW50ID0gMCxcbiAgICAgICAgcmV0cnlDYWxsYmFjaz86IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+LFxuICAgICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBPcGVuSWRDb25uZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGF1dGhvcml6ZWRSZXF1ZXN0ID0gcmV0cnlDYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghYXV0aG9yaXplZFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBhdXRob3JpemVkUmVxdWVzdCA9IG5ldyBTdWJqZWN0PEh0dHBFdmVudDxhbnk+PigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPcGVuSWRDb25uZWN0LmdldEF1dGhvcml6YXRpb25IZWFkZXJzKHJlcXVlc3QudXJsV2l0aFBhcmFtcywgKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuZXdSZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IG5ld0hlYWRlcnMuc2V0KGhlYWRlck5hbWUsIGhlYWRlcnMgW2hlYWRlck5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5ld1JlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXdIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXh0LmhhbmRsZShuZXdSZXF1ZXN0KVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2UsIHJlcXVlc3QsIG5leHQsIHJldHJ5Q291bnQsIGF1dGhvcml6ZWRSZXF1ZXN0LCBzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoaHR0cEV2ZW50OiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWRSZXF1ZXN0Lm5leHQoaHR0cEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cEV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZFJlcXVlc3QuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgKGVycm9yUmVzcG9uc2U6IFhNTEh0dHBSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQcm9wZXJ0aWVzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JQcm9wZXJ0aWVzLnN0YXR1cyA9IGVycm9yUmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICBlcnJvclByb3BlcnRpZXMuc3RhdHVzVGV4dCA9IGVycm9yUmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvclJlc3BvbnNlKG5ldyBIdHRwRXJyb3JSZXNwb25zZShlcnJvclByb3BlcnRpZXMpLCByZXF1ZXN0LCBuZXh0LCByZXRyeUNvdW50LCBhdXRob3JpemVkUmVxdWVzdCwgbnVsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWRSZXF1ZXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUVycm9yUmVzcG9uc2UoXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICAgICAgb3JpZ2luYWxSZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxuICAgICAgICBuZXh0OiBIdHRwSGFuZGxlcixcbiAgICAgICAgcmV0cnlDb3VudDogbnVtYmVyID0gMCxcbiAgICAgICAgcmV0cnlDYWxsYmFjazogU3ViamVjdDxIdHRwRXZlbnQ8YW55Pj4sXG4gICAgICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uLFxuICAgICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgJiYgcmVzcG9uc2UuZXJyb3IuZXJyb3IgPT09ICdpbnZhbGlkX3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIElEIHRva2VuIGlzIGludmFsaWQgb3IgaW5jb3JyZWN0OyByZXRyaWV2ZSBhbm90aGVyIG9uZTpcbiAgICAgICAgICAgICAgICBPcGVuSWRDb25uZWN0LnJlbmV3SWRUb2tlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFwaUdhdGV3YXlUb2tlbkV4cGlyZWQocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgT3BlbklkQ29ubmVjdC5jbGVhckNhY2hlZEFwaUdhdGV3YXlBY2Nlc3NUb2tlbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJldHJ5UmVxdWVzdChvcmlnaW5hbFJlcXVlc3QsIHJlc3BvbnNlLCBuZXh0LCByZXRyeUNvdW50LCByZXRyeUNhbGxiYWNrLCBzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBFVSBMb2dpbiBhY2Nlc3MgdG9rZW4gaXMgaW52YWxpZC4gKDQwMylcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IHNlcnZpY2UgaXMgdW5hYmxlIHRvIHJlYWQgdGhlIGFjY2VzcyB0b2tlbiwgZm9yIGV4YW1wbGUgYmVjYXVzZSB0aGUgRVUgTG9naW4gc2Vzc2lvbiBlbmRlZC4gKDQwMSlcbiAgICAgICAgICAgICAgICAvLyBSZXRyeSBpbiBjYXNlIHRoZSBhY2Nlc3MgdG9rZW4gYmVjYW1lIGludmFsaWQgdG9vIHF1aWNrbHk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9yaWdpbmFsUmVxdWVzdCwgcmVzcG9uc2UsIG5leHQsIHJldHJ5Q291bnQsIHJldHJ5Q2FsbGJhY2ssIHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIE9uZSBvZiB0aGUgYWNjZXNzIHRva2VuIHJlcXVlc3RzIG9yIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHdhcyBub3Qgc2VudC5cbiAgICAgICAgICAgICAgICAvLyBNb3N0IGxpa2VseSBvbmUgb2YgdGhlIENPUlMgcHJlLWZsaWdodCByZXF1ZXN0cyBmYWlsZWQsIG9yIHRoZSBicm93c2VyIGlzIG9mZmxpbmUuXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAnVGhlIE9wZW5JRCBDb25uZWN0IGNhbGwgbWF5IGhhdmUgaXNzdWVzOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnKiB0aGUgQ09SUyBwcmUtZmxpZ2h0IHJlcXVlc3RzIGZvciB0aGUgT3BlbklEIENvbm5lY3QgYWNjZXNzIHRva2VucyBvciBmb3IgdGhlIFJFU1QgY2FsbCBjb3VsZCBiZSBmYWlsaW5nXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICcqIHRoZSBicm93c2VyIGNvdWxkIGJlIGN1cnJlbnRseSBvZmZsaW5lLicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRyeUNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXRyeUNhbGxiYWNrLmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmV0cnlSZXF1ZXN0KFxuICAgICAgICBvcmlnaW5hbFJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICAgICAgbmV4dDogSHR0cEhhbmRsZXIsXG4gICAgICAgIHJldHJ5Q291bnQ6IG51bWJlciA9IDAsXG4gICAgICAgIHJldHJ5Q2FsbGJhY2s6IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+LFxuICAgICAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbixcbiAgICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIGlmIChyZXRyeUNvdW50IDwgdGhpcy5tYXhpbXVtUmVxdWVzdFJldHJpZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHQob3JpZ2luYWxSZXF1ZXN0LCBuZXh0LCByZXRyeUNvdW50ICsgMSwgcmV0cnlDYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdUaGUgT3BlbklEIENvbm5lY3QgY2FsbCBtYXkgaGF2ZSBpc3N1ZXM6XFxuJyArXG4gICAgICAgICAgICAgICAgJyogdGhlIGNsaWVudCBJRCBjb3VsZCBiZSBpbnZhbGlkXFxuJyArXG4gICAgICAgICAgICAgICAgJyogdGhlIEFQSSBHYXRld2F5IGFjY2VzcyB0b2tlbiBjb3VsZCBiZSBpbnZhbGlkXFxuJyArXG4gICAgICAgICAgICAgICAgJyogdGhlIEVVIExvZ2luIGFjY2VzcyB0b2tlbiBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGNvdWxkIGJlIGludmFsaWQuJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmV0cnlDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suZXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZjxhbnk+KG51bGwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcGlHYXRld2F5VG9rZW5FeHBpcmVkKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnJyArIHJlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuaW5kZXhPZignPGFtczpjb2RlPjkwMDkwMTwvYW1zOmNvZGU+JykgPj0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBtYXhpbXVtUmVxdWVzdFJldHJpZXMoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKE9wZW5JZENvbm5lY3QuY29uZmlnICYmIE9wZW5JZENvbm5lY3QuY29uZmlnLm1heGltdW1SZXF1ZXN0UmV0cmllcyA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gT3BlbklkQ29ubmVjdC5jb25maWcubWF4aW11bVJlcXVlc3RSZXRyaWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1heGltdW1SZXF1ZXN0UmV0cmllcztcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { xhr } from '@eui/base';
|
|
3
|
-
/**
|
|
4
|
-
* Function to be used before the AppModule is bootstrapped. It is currently used to load dynamic configurations.
|
|
5
|
-
* It needs to be added in your application main.ts file.
|
|
6
|
-
* @param envConfig the current environment configuration
|
|
7
|
-
* @returns the updated environment configuration, as a promise
|
|
8
|
-
*/
|
|
9
|
-
export function preInitApp(envConfig) {
|
|
10
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
11
|
-
const envDynamicConfig = envConfig && envConfig.envDynamicConfig;
|
|
12
|
-
if (envDynamicConfig) {
|
|
13
|
-
// load the local configuration file, if defined
|
|
14
|
-
const euiAppJsonConfig = yield loadEuiDynamicEnvironmentConfig(envDynamicConfig.uri, envDynamicConfig.configTimeout || 2000);
|
|
15
|
-
envConfig.loadedEnvDynamicConfig = euiAppJsonConfig;
|
|
16
|
-
return envConfig;
|
|
17
|
-
}
|
|
18
|
-
return envConfig;
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Function to load asynchronously a dynamic configuration (from a local path or a web service)
|
|
23
|
-
* @param url the path to the configuration
|
|
24
|
-
* @param timeout possible timeout
|
|
25
|
-
* @returns EuiAppJsonConfig promise
|
|
26
|
-
*/
|
|
27
|
-
export function loadEuiDynamicEnvironmentConfig(url, timeout) {
|
|
28
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
-
// if the url is specified
|
|
30
|
-
if (url) {
|
|
31
|
-
// fetch the config
|
|
32
|
-
try {
|
|
33
|
-
return yield xhr({
|
|
34
|
-
url: url,
|
|
35
|
-
timeout: timeout,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
// send a warning to the console
|
|
40
|
-
console.warn('Dynamic configuration cannot be loaded from url', url, error);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// the dynamic config is not loaded
|
|
44
|
-
return null;
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpLXByZS1pbml0LWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYXBwL2V1aS1wcmUtaW5pdC1hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBb0QsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxGOzs7OztHQUtHO0FBRUgsTUFBTSxVQUFnQixVQUFVLENBQUMsU0FBdUI7O1FBRXBELE1BQU0sZ0JBQWdCLEdBQXFCLFNBQVMsSUFBSSxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDbkYsSUFBSSxnQkFBZ0IsRUFBRTtZQUNsQixnREFBZ0Q7WUFDaEQsTUFBTSxnQkFBZ0IsR0FBcUIsTUFBTSwrQkFBK0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQ2pHLGdCQUFnQixDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM1QyxTQUFTLENBQUMsc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7WUFDcEQsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0NBQUE7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBZ0IsK0JBQStCLENBQUMsR0FBVyxFQUFFLE9BQWdCOztRQUMvRSwwQkFBMEI7UUFDMUIsSUFBSSxHQUFHLEVBQUU7WUFDTCxtQkFBbUI7WUFDbkIsSUFBSTtnQkFDQSxPQUFPLE1BQU0sR0FBRyxDQUFtQjtvQkFDL0IsR0FBRyxFQUFFLEdBQUc7b0JBQ1IsT0FBTyxFQUFFLE9BQU87aUJBQ25CLENBQUMsQ0FBQzthQUNOO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ1osZ0NBQWdDO2dCQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMvRTtTQUNKO1FBQ0QsbUNBQW1DO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudkR5bmFtaWNDb25maWcsIEV1aUFwcEpzb25Db25maWcsIEV1aUVudkNvbmZpZywgeGhyIH0gZnJvbSAnQGV1aS9iYXNlJztcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBiZSB1c2VkIGJlZm9yZSB0aGUgQXBwTW9kdWxlIGlzIGJvb3RzdHJhcHBlZC4gSXQgaXMgY3VycmVudGx5IHVzZWQgdG8gbG9hZCBkeW5hbWljIGNvbmZpZ3VyYXRpb25zLlxuICogSXQgbmVlZHMgdG8gYmUgYWRkZWQgaW4geW91ciBhcHBsaWNhdGlvbiBtYWluLnRzIGZpbGUuXG4gKiBAcGFyYW0gZW52Q29uZmlnIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIHRoZSB1cGRhdGVkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24sIGFzIGEgcHJvbWlzZVxuICovXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVJbml0QXBwKGVudkNvbmZpZzogRXVpRW52Q29uZmlnKTogUHJvbWlzZTxFdWlFbnZDb25maWc+IHtcblxuICAgIGNvbnN0IGVudkR5bmFtaWNDb25maWc6IEVudkR5bmFtaWNDb25maWcgPSBlbnZDb25maWcgJiYgZW52Q29uZmlnLmVudkR5bmFtaWNDb25maWc7XG4gICAgaWYgKGVudkR5bmFtaWNDb25maWcpIHtcbiAgICAgICAgLy8gbG9hZCB0aGUgbG9jYWwgY29uZmlndXJhdGlvbiBmaWxlLCBpZiBkZWZpbmVkXG4gICAgICAgIGNvbnN0IGV1aUFwcEpzb25Db25maWc6IEV1aUFwcEpzb25Db25maWcgPSBhd2FpdCBsb2FkRXVpRHluYW1pY0Vudmlyb25tZW50Q29uZmlnKGVudkR5bmFtaWNDb25maWcudXJpLFxuICAgICAgICAgICAgZW52RHluYW1pY0NvbmZpZy5jb25maWdUaW1lb3V0IHx8IDIwMDApO1xuICAgICAgICBlbnZDb25maWcubG9hZGVkRW52RHluYW1pY0NvbmZpZyA9IGV1aUFwcEpzb25Db25maWc7XG4gICAgICAgIHJldHVybiBlbnZDb25maWc7XG4gICAgfVxuICAgIHJldHVybiBlbnZDb25maWc7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gbG9hZCBhc3luY2hyb25vdXNseSBhIGR5bmFtaWMgY29uZmlndXJhdGlvbiAoZnJvbSBhIGxvY2FsIHBhdGggb3IgYSB3ZWIgc2VydmljZSlcbiAqIEBwYXJhbSB1cmwgdGhlIHBhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB0aW1lb3V0IHBvc3NpYmxlIHRpbWVvdXRcbiAqIEByZXR1cm5zIEV1aUFwcEpzb25Db25maWcgcHJvbWlzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEV1aUR5bmFtaWNFbnZpcm9ubWVudENvbmZpZyh1cmw6IHN0cmluZywgdGltZW91dD86IG51bWJlcik6IFByb21pc2U8RXVpQXBwSnNvbkNvbmZpZz4ge1xuICAgIC8vIGlmIHRoZSB1cmwgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHVybCkge1xuICAgICAgICAvLyBmZXRjaCB0aGUgY29uZmlnXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgeGhyPEV1aUFwcEpzb25Db25maWc+KHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBzZW5kIGEgd2FybmluZyB0byB0aGUgY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEeW5hbWljIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGxvYWRlZCBmcm9tIHVybCcsIHVybCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBkeW5hbWljIGNvbmZpZyBpcyBub3QgbG9hZGVkXG4gICAgcmV0dXJuIG51bGw7XG59XG4iXX0=
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { LogLevel, ConsoleAppender, } from '@eui/base';
|
|
2
|
-
/** default log configuration */
|
|
3
|
-
export const DEFAULT_LOG_CONFIG = {
|
|
4
|
-
baseLoggerName: 'root',
|
|
5
|
-
logLevel: LogLevel.ERROR,
|
|
6
|
-
logAppenders: {
|
|
7
|
-
type: ConsoleAppender,
|
|
8
|
-
prefixFormat: '[{level}]',
|
|
9
|
-
},
|
|
10
|
-
};
|
|
11
|
-
export const DEFAULT_I18N_SERVICE_CONFIG = {
|
|
12
|
-
languages: ['en'],
|
|
13
|
-
defaultLanguage: 'en',
|
|
14
|
-
};
|
|
15
|
-
export const DEFAULT_I18N_LOADER_CONFIG = {};
|
|
16
|
-
export const DEFAULT_LOCALE_SERVICE_CONFIG = {
|
|
17
|
-
id: 'en',
|
|
18
|
-
available: ['en'],
|
|
19
|
-
registered: ['en'],
|
|
20
|
-
bindWithTranslate: false,
|
|
21
|
-
affectGlobalLocale: false
|
|
22
|
-
};
|
|
23
|
-
export const DEFAULT_HTTP_ERROR_HANDLER_CONFIG = {
|
|
24
|
-
routes: [],
|
|
25
|
-
};
|
|
26
|
-
export const DEFAULT_GLOBAL_CONFIG = {
|
|
27
|
-
showConnectionStatus: true,
|
|
28
|
-
i18n: {
|
|
29
|
-
i18nService: Object.assign({}, DEFAULT_I18N_SERVICE_CONFIG),
|
|
30
|
-
i18nLoader: Object.assign({}, DEFAULT_I18N_LOADER_CONFIG),
|
|
31
|
-
},
|
|
32
|
-
locale: Object.assign({}, DEFAULT_LOCALE_SERVICE_CONFIG),
|
|
33
|
-
user: {
|
|
34
|
-
defaultUserPreferences: {
|
|
35
|
-
locale: Object.assign({}, DEFAULT_LOCALE_SERVICE_CONFIG)
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
export const DEFAULT_EUI_APP_CONFIG = {
|
|
40
|
-
global: Object.assign({}, DEFAULT_GLOBAL_CONFIG),
|
|
41
|
-
};
|
|
42
|
-
export const DEFAULT_EUI_ENV_CONFIG = {
|
|
43
|
-
envAppHandlersConfig: {},
|
|
44
|
-
};
|
|
45
|
-
export const DEFAULT_EUI_CONFIG = {
|
|
46
|
-
appConfig: Object.assign({}, DEFAULT_EUI_APP_CONFIG),
|
|
47
|
-
environment: Object.assign({}, DEFAULT_EUI_ENV_CONFIG),
|
|
48
|
-
};
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2NvbmZpZy9kZWZhdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBS0gsUUFBUSxFQUVSLGVBQWUsR0FLbEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsZ0NBQWdDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFjO0lBQ3pDLGNBQWMsRUFBRSxNQUFNO0lBQ3RCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztJQUN4QixZQUFZLEVBQUU7UUFDVixJQUFJLEVBQUUsZUFBZTtRQUNyQixZQUFZLEVBQUUsV0FBVztLQUM1QjtDQUNKLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBc0I7SUFDMUQsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2pCLGVBQWUsRUFBRSxJQUFJO0NBQ3hCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBcUIsRUFBRSxDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUF3QjtJQUM5RCxFQUFFLEVBQUUsSUFBSTtJQUNSLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNqQixVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDbEIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixrQkFBa0IsRUFBRSxLQUFLO0NBQzVCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBMkI7SUFDckUsTUFBTSxFQUFFLEVBQUU7Q0FDYixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWlCO0lBQy9DLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsSUFBSSxFQUFFO1FBQ0YsV0FBVyxvQkFDSiwyQkFBMkIsQ0FDakM7UUFDRCxVQUFVLG9CQUNILDBCQUEwQixDQUNoQztLQUNKO0lBQ0QsTUFBTSxvQkFDQyw2QkFBNkIsQ0FDbkM7SUFDRCxJQUFJLEVBQUU7UUFDRixzQkFBc0IsRUFBRTtZQUNwQixNQUFNLG9CQUNDLDZCQUE2QixDQUNuQztTQUNKO0tBQ0o7Q0FDSixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWlCO0lBQ2hELE1BQU0sb0JBQ0MscUJBQXFCLENBQzNCO0NBQ0osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFpQjtJQUNoRCxvQkFBb0IsRUFBRSxFQUFFO0NBQzNCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBYztJQUN6QyxTQUFTLG9CQUNGLHNCQUFzQixDQUM1QjtJQUNELFdBQVcsb0JBQ0osc0JBQXNCLENBQzVCO0NBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRXVpQ29uZmlnLFxuICAgIEV1aUFwcENvbmZpZyxcbiAgICBFdWlFbnZDb25maWcsXG4gICAgR2xvYmFsQ29uZmlnLFxuICAgIExvZ0xldmVsLFxuICAgIExvZ0NvbmZpZyxcbiAgICBDb25zb2xlQXBwZW5kZXIsXG4gICAgSHR0cEVycm9ySGFuZGxlckNvbmZpZyxcbiAgICBJMThuTG9hZGVyQ29uZmlnLFxuICAgIEkxOG5TZXJ2aWNlQ29uZmlnLFxuICAgIExvY2FsZVNlcnZpY2VDb25maWcsXG59IGZyb20gJ0BldWkvYmFzZSc7XG5cbi8qKiBkZWZhdWx0IGxvZyBjb25maWd1cmF0aW9uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0dfQ09ORklHOiBMb2dDb25maWcgPSB7XG4gICAgYmFzZUxvZ2dlck5hbWU6ICdyb290JyxcbiAgICBsb2dMZXZlbDogTG9nTGV2ZWwuRVJST1IsXG4gICAgbG9nQXBwZW5kZXJzOiB7XG4gICAgICAgIHR5cGU6IENvbnNvbGVBcHBlbmRlcixcbiAgICAgICAgcHJlZml4Rm9ybWF0OiAnW3tsZXZlbH1dJyxcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSTE4Tl9TRVJWSUNFX0NPTkZJRzogSTE4blNlcnZpY2VDb25maWcgPSB7XG4gICAgbGFuZ3VhZ2VzOiBbJ2VuJ10sXG4gICAgZGVmYXVsdExhbmd1YWdlOiAnZW4nLFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSTE4Tl9MT0FERVJfQ09ORklHOiBJMThuTG9hZGVyQ29uZmlnID0ge307XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPQ0FMRV9TRVJWSUNFX0NPTkZJRzogTG9jYWxlU2VydmljZUNvbmZpZyA9IHtcbiAgICBpZDogJ2VuJyxcbiAgICBhdmFpbGFibGU6IFsnZW4nXSxcbiAgICByZWdpc3RlcmVkOiBbJ2VuJ10sXG4gICAgYmluZFdpdGhUcmFuc2xhdGU6IGZhbHNlLFxuICAgIGFmZmVjdEdsb2JhbExvY2FsZTogZmFsc2Vcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0hUVFBfRVJST1JfSEFORExFUl9DT05GSUc6IEh0dHBFcnJvckhhbmRsZXJDb25maWcgPSB7XG4gICAgcm91dGVzOiBbXSxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0dMT0JBTF9DT05GSUc6IEdsb2JhbENvbmZpZyA9IHtcbiAgICBzaG93Q29ubmVjdGlvblN0YXR1czogdHJ1ZSxcbiAgICBpMThuOiB7XG4gICAgICAgIGkxOG5TZXJ2aWNlOiB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX0kxOE5fU0VSVklDRV9DT05GSUcsXG4gICAgICAgIH0sXG4gICAgICAgIGkxOG5Mb2FkZXI6IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSTE4Tl9MT0FERVJfQ09ORklHLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbG9jYWxlOiB7XG4gICAgICAgIC4uLkRFRkFVTFRfTE9DQUxFX1NFUlZJQ0VfQ09ORklHXG4gICAgfSxcbiAgICB1c2VyOiB7XG4gICAgICAgIGRlZmF1bHRVc2VyUHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICAgIGxvY2FsZToge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfTE9DQUxFX1NFUlZJQ0VfQ09ORklHXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVVJX0FQUF9DT05GSUc6IEV1aUFwcENvbmZpZyA9IHtcbiAgICBnbG9iYWw6IHtcbiAgICAgICAgLi4uREVGQVVMVF9HTE9CQUxfQ09ORklHLFxuICAgIH0sXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9FVUlfRU5WX0NPTkZJRzogRXVpRW52Q29uZmlnID0ge1xuICAgIGVudkFwcEhhbmRsZXJzQ29uZmlnOiB7fSxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VVSV9DT05GSUc6IEV1aUNvbmZpZyA9IHtcbiAgICBhcHBDb25maWc6IHtcbiAgICAgICAgLi4uREVGQVVMVF9FVUlfQVBQX0NPTkZJRyxcbiAgICB9LFxuICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLkRFRkFVTFRfRVVJX0VOVl9DT05GSUcsXG4gICAgfSxcbn07XG4iXX0=
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
3
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
4
|
-
import { BehaviorSubject, forkJoin, of } from 'rxjs';
|
|
5
|
-
import { catchError, filter, map, take, tap, switchMap } from 'rxjs/operators';
|
|
6
|
-
import { EuiLazyService, getI18nServiceConfigFromBase, getI18nState, getActiveLang, getLastAddedModule, getBrowserDefaultLanguage, UxEuLanguages, } from '@eui/base';
|
|
7
|
-
import { I18nLoader } from './i18n.loader';
|
|
8
|
-
import { GLOBAL_CONFIG_TOKEN } from '../config/tokens';
|
|
9
|
-
import { LogService } from '../log/log.service';
|
|
10
|
-
import { StoreService } from '../store/store.service';
|
|
11
|
-
import { UpdateI18nStateAction } from '../store/actions/i18n.actions';
|
|
12
|
-
import { DEFAULT_I18N_SERVICE_CONFIG } from '../config/defaults';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@ngx-translate/core";
|
|
15
|
-
import * as i2 from "../log/log.service";
|
|
16
|
-
import * as i3 from "../store/store.service";
|
|
17
|
-
export class I18nService extends EuiLazyService {
|
|
18
|
-
constructor(baseGlobalConfig, translateService, logService, store, document) {
|
|
19
|
-
super({ activeLang: 'en' });
|
|
20
|
-
this.baseGlobalConfig = baseGlobalConfig;
|
|
21
|
-
this.translateService = translateService;
|
|
22
|
-
this.logService = logService;
|
|
23
|
-
this.store = store;
|
|
24
|
-
this.document = document;
|
|
25
|
-
this.config = getI18nServiceConfigFromBase(this.baseGlobalConfig);
|
|
26
|
-
this.onModuleLoad = new BehaviorSubject({ ready: false, name: null });
|
|
27
|
-
}
|
|
28
|
-
getState(keyOrMapFn) {
|
|
29
|
-
return this.store.select(getI18nState);
|
|
30
|
-
}
|
|
31
|
-
updateState(langState) {
|
|
32
|
-
this.updateHTMLDOMLang(langState.activeLang);
|
|
33
|
-
this.store.dispatch(new UpdateI18nStateAction(langState));
|
|
34
|
-
}
|
|
35
|
-
init(langState) {
|
|
36
|
-
const initLang = langState && langState.activeLang ? langState.activeLang : this.preparedDefaultLanguage();
|
|
37
|
-
const initState = Object.assign(Object.assign({}, langState), { activeLang: initLang });
|
|
38
|
-
if (typeof initLang === 'string') {
|
|
39
|
-
super.initEuiService(this.store);
|
|
40
|
-
this.updateState(initState);
|
|
41
|
-
return this.setup(initLang);
|
|
42
|
-
}
|
|
43
|
-
return of({ success: false, error: 'Initial active lang should be string' });
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* A pipe function that could serve as a wrapper of another observable
|
|
47
|
-
* e.g. ngx-translate i18n.onReady('my_module').pipe(switchMap(()=>translate.get('eui.KEY')));
|
|
48
|
-
* WARNING: onReady will emit only once for a loaded Module, going to another and then going back will not result
|
|
49
|
-
* into another emission.
|
|
50
|
-
* @param moduleName the name of the module that has been given through the eUI globalConfig. In case non provided
|
|
51
|
-
* fetch module name from the state.
|
|
52
|
-
*/
|
|
53
|
-
onReady(moduleName) {
|
|
54
|
-
return this.onModuleLoad.pipe(switchMap((evt) => moduleName ? of(evt) :
|
|
55
|
-
this.store.select(getLastAddedModule).pipe(tap(m => moduleName = m), map(() => evt))),
|
|
56
|
-
// emit only if event emitted matches the module name and is ready
|
|
57
|
-
filter((evt) => evt.ready === true && evt.name === moduleName),
|
|
58
|
-
// make sure that observable completes
|
|
59
|
-
take(1));
|
|
60
|
-
}
|
|
61
|
-
lazyLoad(config) {
|
|
62
|
-
const moduleId = Math.floor((Math.random() * 100000) + 1).toLocaleString();
|
|
63
|
-
return this.addResources(config, moduleId);
|
|
64
|
-
}
|
|
65
|
-
lazyLoadInit(moduleConfig, moduleName) {
|
|
66
|
-
const i18nLoaderConfig = moduleConfig;
|
|
67
|
-
// add resources
|
|
68
|
-
return this.addResources(i18nLoaderConfig, moduleName);
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Add resources based of a config loader
|
|
72
|
-
* @param config I18nLoaderConfig
|
|
73
|
-
* @return Promise<EuiServiceStatus> an EuiServiceStatus when translation has fully loaded
|
|
74
|
-
*/
|
|
75
|
-
addResources(config, moduleName) {
|
|
76
|
-
// emit that module is loading
|
|
77
|
-
this.onModuleLoad.next({ ready: false, name: moduleName });
|
|
78
|
-
const loader = this.translateService.currentLoader;
|
|
79
|
-
if (loader instanceof I18nLoader) {
|
|
80
|
-
const langSubscription = [];
|
|
81
|
-
const i18nLoader = loader;
|
|
82
|
-
// add the resources to the loader
|
|
83
|
-
const resources = i18nLoader.addResources(config);
|
|
84
|
-
// manually load the resources for the CURRENT language and add them to the translate service
|
|
85
|
-
langSubscription.push(i18nLoader.loadResources(resources, this.translateService.currentLang)
|
|
86
|
-
.pipe(take(1), tap((loadedResources) => {
|
|
87
|
-
// add the new set of translations to the current language
|
|
88
|
-
this.translateService.setTranslation(this.translateService.currentLang, loadedResources.translations, true);
|
|
89
|
-
if (loadedResources.hasError) {
|
|
90
|
-
i18nLoader.removeResources(loadedResources.errors.map(err => err.resource));
|
|
91
|
-
}
|
|
92
|
-
})));
|
|
93
|
-
// if the current language is different than the DEFAULT language
|
|
94
|
-
if (this.translateService.currentLang !== this.translateService.defaultLang) {
|
|
95
|
-
// manually load the resources for the default language and add them to the translate service
|
|
96
|
-
langSubscription.push(i18nLoader.loadResources(resources, this.translateService.defaultLang)
|
|
97
|
-
.pipe(take(1), tap((loadedResources) => {
|
|
98
|
-
this.translateService.setTranslation(this.translateService.defaultLang, loadedResources.translations, true);
|
|
99
|
-
if (loadedResources.hasError) {
|
|
100
|
-
i18nLoader.removeResources(loadedResources.errors.map(err => err.resource));
|
|
101
|
-
}
|
|
102
|
-
})));
|
|
103
|
-
}
|
|
104
|
-
return forkJoin(langSubscription).pipe(map((loadedResourcesArr) => {
|
|
105
|
-
return !loadedResourcesArr[0].hasError ?
|
|
106
|
-
{ success: true } :
|
|
107
|
-
{ success: false, error: loadedResourcesArr[0].errors };
|
|
108
|
-
}), tap(() => {
|
|
109
|
-
// emit status of module loading progress
|
|
110
|
-
this.onModuleLoad.next({ ready: true, name: moduleName });
|
|
111
|
-
}), catchError(error => {
|
|
112
|
-
// emit status of module loading progress
|
|
113
|
-
this.onModuleLoad.next({ ready: true, name: moduleName, error: error });
|
|
114
|
-
return of({ success: false, error: error });
|
|
115
|
-
}));
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
return of({ success: false, error: 'currentLoader is not an I18nLoader.' });
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Prepares the default language
|
|
123
|
-
*/
|
|
124
|
-
preparedDefaultLanguage() {
|
|
125
|
-
const browserPref = getBrowserDefaultLanguage();
|
|
126
|
-
// If user has browser preferred lang, and that language is part of the languages array
|
|
127
|
-
if (browserPref && this.config.languages && UxEuLanguages.getLanguageCodes(this.config.languages).includes(browserPref)) {
|
|
128
|
-
return browserPref;
|
|
129
|
-
}
|
|
130
|
-
return this.config.defaultLanguage;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* @param default_language if given default language to override default language coming from the
|
|
134
|
-
* configuration token.
|
|
135
|
-
*/
|
|
136
|
-
setup(initLanguage) {
|
|
137
|
-
// use the default config as a reference base
|
|
138
|
-
this.config = Object.assign({}, DEFAULT_I18N_SERVICE_CONFIG, this.config);
|
|
139
|
-
// configure the translate config service
|
|
140
|
-
if (this.config.languages) {
|
|
141
|
-
this.translateService.addLangs(UxEuLanguages.getLanguageCodes(this.config.languages));
|
|
142
|
-
if (this.logService) {
|
|
143
|
-
this.logService.info(`I18n accepted languages set to ${UxEuLanguages.getLanguageCodes(this.config.languages)}`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
// set the current language, causing to load translations
|
|
147
|
-
return this.translateService
|
|
148
|
-
.use(initLanguage)
|
|
149
|
-
.pipe(tap(() => {
|
|
150
|
-
this.bindActiveLangStateToTranslateService();
|
|
151
|
-
this.bindTranslateServiceLangChangeToState();
|
|
152
|
-
if (this.config.defaultLanguage) {
|
|
153
|
-
this.setDefaultLanguage(this.config.defaultLanguage);
|
|
154
|
-
}
|
|
155
|
-
}), map(() => {
|
|
156
|
-
return { success: true };
|
|
157
|
-
}), catchError((error) => {
|
|
158
|
-
return of({ success: false, error: error });
|
|
159
|
-
}));
|
|
160
|
-
}
|
|
161
|
-
bindActiveLangStateToTranslateService() {
|
|
162
|
-
this.store.select(getActiveLang).subscribe((lang) => {
|
|
163
|
-
if (lang !== null && (this.translateService.currentLang !== lang)) {
|
|
164
|
-
this.use(lang);
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
bindTranslateServiceLangChangeToState() {
|
|
169
|
-
this.translateService.onLangChange.subscribe((event) => {
|
|
170
|
-
if (this.stateInstance.activeLang !== event.lang) {
|
|
171
|
-
this.updateState({ activeLang: event.lang });
|
|
172
|
-
}
|
|
173
|
-
if (this.logService) {
|
|
174
|
-
this.logService.info(`I18n current language set to ${event.lang}`);
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
setDefaultLanguage(defaultLanguage) {
|
|
179
|
-
// removed, current language is already calculated in init, setup function fill use it directly, not default
|
|
180
|
-
// this.translateService.currentLang = default_language || this.config.defaultLanguage;
|
|
181
|
-
this.translateService.setDefaultLang(defaultLanguage);
|
|
182
|
-
if (this.logService) {
|
|
183
|
-
this.logService.info(`I18n default language set to ${defaultLanguage}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* change the currently used language
|
|
188
|
-
* @param lang is the language code based on the convention you used e.g. (en or en-EN)
|
|
189
|
-
* @returns Observable that returns an object contain the object translation for given language after language
|
|
190
|
-
* fully loaded.
|
|
191
|
-
*/
|
|
192
|
-
use(lang) {
|
|
193
|
-
return this.translateService.use(lang);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* updates the HTML element lang attribute
|
|
197
|
-
* @private
|
|
198
|
-
*/
|
|
199
|
-
updateHTMLDOMLang(lang) {
|
|
200
|
-
this.document.documentElement.lang = lang;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
/** @nocollapse */ I18nService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: I18nService, deps: [{ token: GLOBAL_CONFIG_TOKEN }, { token: i1.TranslateService }, { token: i2.LogService, optional: true }, { token: i3.StoreService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
204
|
-
/** @nocollapse */ I18nService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: I18nService, providedIn: 'root' });
|
|
205
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: I18nService, decorators: [{
|
|
206
|
-
type: Injectable,
|
|
207
|
-
args: [{
|
|
208
|
-
providedIn: 'root',
|
|
209
|
-
}]
|
|
210
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
211
|
-
type: Inject,
|
|
212
|
-
args: [GLOBAL_CONFIG_TOKEN]
|
|
213
|
-
}] }, { type: i1.TranslateService }, { type: i2.LogService, decorators: [{
|
|
214
|
-
type: Optional
|
|
215
|
-
}] }, { type: i3.StoreService }, { type: Document, decorators: [{
|
|
216
|
-
type: Inject,
|
|
217
|
-
args: [DOCUMENT]
|
|
218
|
-
}] }]; } });
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9pMThuL2kxOG4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUVILGNBQWMsRUFFZCw0QkFBNEIsRUFDNUIsWUFBWSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsRUFLbEIseUJBQXlCLEVBQ3pCLGFBQWEsR0FDaEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7QUFXakUsTUFBTSxPQUFPLFdBQTZDLFNBQVEsY0FBNkI7SUFLM0YsWUFDMkMsZ0JBQThCLEVBQzNELGdCQUFrQyxFQUN0QixVQUFz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SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFDLElBQVk7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUM5QyxDQUFDOztrSUFwT1EsV0FBVyxrQkFNUixtQkFBbUIsbUhBSW5CLFFBQVE7c0lBVlgsV0FBVyxjQUZSLE1BQU07a0dBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQU9RLE1BQU07MkJBQUMsbUJBQW1COzswQkFFMUIsUUFBUTt5REFFMkIsUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGFuZ0NoYW5nZUV2ZW50LCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIHRha2UsIHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBHbG9iYWxDb25maWcsXG4gICAgRXVpTGF6eVNlcnZpY2UsXG4gICAgRXVpU2VydmljZVN0YXR1cyxcbiAgICBnZXRJMThuU2VydmljZUNvbmZpZ0Zyb21CYXNlLFxuICAgIGdldEkxOG5TdGF0ZSxcbiAgICBnZXRBY3RpdmVMYW5nLFxuICAgIGdldExhc3RBZGRlZE1vZHVsZSxcbiAgICBJMThuTG9hZGVyQ29uZmlnLFxuICAgIEkxOG5TZXJ2aWNlQ29uZmlnLFxuICAgIEkxOG5TdGF0ZSxcbiAgICBNb2R1bGVDb25maWcsXG4gICAgZ2V0QnJvd3NlckRlZmF1bHRMYW5ndWFnZSxcbiAgICBVeEV1TGFuZ3VhZ2VzLFxufSBmcm9tICdAZXVpL2Jhc2UnO1xuXG5pbXBvcnQgeyBJMThuTG9hZGVyLCBMb2FkZWRSZXNvdXJjZXMgfSBmcm9tICcuL2kxOG4ubG9hZGVyJztcbmltcG9ydCB7IEdMT0JBTF9DT05GSUdfVE9LRU4gfSBmcm9tICcuLi9jb25maWcvdG9rZW5zJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi9sb2cvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vc3RvcmUvc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBVcGRhdGVJMThuU3RhdGVBY3Rpb24gfSBmcm9tICcuLi9zdG9yZS9hY3Rpb25zL2kxOG4uYWN0aW9ucyc7XG5pbXBvcnQgeyBERUZBVUxUX0kxOE5fU0VSVklDRV9DT05GSUcgfSBmcm9tICcuLi9jb25maWcvZGVmYXVsdHMnO1xuXG5pbnRlcmZhY2UgTW9kdWxlTG9hZEV2ZW50IHtcbiAgICByZWFkeTogYm9vbGVhbjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZXJyb3I/OiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEkxOG5TZXJ2aWNlPFQgZXh0ZW5kcyBJMThuU3RhdGUgPSBJMThuU3RhdGU+IGV4dGVuZHMgRXVpTGF6eVNlcnZpY2U8VCB8IEkxOG5TdGF0ZT4ge1xuXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogSTE4blNlcnZpY2VDb25maWc7XG4gICAgcHJvdGVjdGVkIG9uTW9kdWxlTG9hZDogQmVoYXZpb3JTdWJqZWN0PE1vZHVsZUxvYWRFdmVudD47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChHTE9CQUxfQ09ORklHX1RPS0VOKSBwcm90ZWN0ZWQgYmFzZUdsb2JhbENvbmZpZzogR2xvYmFsQ29uZmlnLFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBzdG9yZTogU3RvcmVTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoeyBhY3RpdmVMYW5nOiAnZW4nIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGdldEkxOG5TZXJ2aWNlQ29uZmlnRnJvbUJhc2UodGhpcy5iYXNlR2xvYmFsQ29uZmlnKTtcbiAgICAgICAgdGhpcy5vbk1vZHVsZUxvYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1vZHVsZUxvYWRFdmVudD4oeyByZWFkeTogZmFsc2UsIG5hbWU6IG51bGwgfSk7XG4gICAgfVxuXG4gICAgZ2V0U3RhdGU8SyA9IFQ+KG1hcEZuPzogKHN0YXRlOiBUKSA9PiBLKTogT2JzZXJ2YWJsZTxLPjtcbiAgICBnZXRTdGF0ZTxhIGV4dGVuZHMga2V5b2YgVD4oa2V5PzogYSk6IE9ic2VydmFibGU8VFthXT47XG4gICAgZ2V0U3RhdGU8Sz4oa2V5T3JNYXBGbj86ICgoc3RhdGU6IFQpID0+IEspIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxLPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRJMThuU3RhdGUpO1xuICAgIH1cblxuICAgIHVwZGF0ZVN0YXRlKGxhbmdTdGF0ZTogVCB8IEkxOG5TdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUhUTUxET01MYW5nKGxhbmdTdGF0ZS5hY3RpdmVMYW5nKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVXBkYXRlSTE4blN0YXRlQWN0aW9uKGxhbmdTdGF0ZSkpO1xuICAgIH1cblxuICAgIGluaXQobGFuZ1N0YXRlPzogVCk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICBjb25zdCBpbml0TGFuZyA9IGxhbmdTdGF0ZSAmJiBsYW5nU3RhdGUuYWN0aXZlTGFuZyA/IGxhbmdTdGF0ZS5hY3RpdmVMYW5nIDogdGhpcy5wcmVwYXJlZERlZmF1bHRMYW5ndWFnZSgpO1xuICAgICAgICBjb25zdCBpbml0U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5sYW5nU3RhdGUsXG4gICAgICAgICAgICBhY3RpdmVMYW5nOiBpbml0TGFuZyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbml0TGFuZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmluaXRFdWlTZXJ2aWNlKHRoaXMuc3RvcmUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZShpbml0U3RhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dXAoaW5pdExhbmcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0luaXRpYWwgYWN0aXZlIGxhbmcgc2hvdWxkIGJlIHN0cmluZycgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBwaXBlIGZ1bmN0aW9uIHRoYXQgY291bGQgc2VydmUgYXMgYSB3cmFwcGVyIG9mIGFub3RoZXIgb2JzZXJ2YWJsZVxuICAgICAqIGUuZy4gbmd4LXRyYW5zbGF0ZSBpMThuLm9uUmVhZHkoJ215X21vZHVsZScpLnBpcGUoc3dpdGNoTWFwKCgpPT50cmFuc2xhdGUuZ2V0KCdldWkuS0VZJykpKTtcbiAgICAgKiBXQVJOSU5HOiBvblJlYWR5IHdpbGwgZW1pdCBvbmx5IG9uY2UgZm9yIGEgbG9hZGVkIE1vZHVsZSwgZ29pbmcgdG8gYW5vdGhlciBhbmQgdGhlbiBnb2luZyBiYWNrIHdpbGwgbm90IHJlc3VsdFxuICAgICAqIGludG8gYW5vdGhlciBlbWlzc2lvbi5cbiAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgaGFzIGJlZW4gZ2l2ZW4gdGhyb3VnaCB0aGUgZVVJIGdsb2JhbENvbmZpZy4gSW4gY2FzZSBub24gcHJvdmlkZWRcbiAgICAgKiBmZXRjaCBtb2R1bGUgbmFtZSBmcm9tIHRoZSBzdGF0ZS5cbiAgICAgKi9cbiAgICBvblJlYWR5KG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbk1vZHVsZUxvYWQucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoZXZ0OiBNb2R1bGVMb2FkRXZlbnQpID0+IG1vZHVsZU5hbWUgPyBvZihldnQpIDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRMYXN0QWRkZWRNb2R1bGUpLnBpcGUodGFwKG0gPT4gbW9kdWxlTmFtZSA9IG0pLCBtYXAoKCkgPT4gZXZ0KSkpLFxuICAgICAgICAgICAgLy8gZW1pdCBvbmx5IGlmIGV2ZW50IGVtaXR0ZWQgbWF0Y2hlcyB0aGUgbW9kdWxlIG5hbWUgYW5kIGlzIHJlYWR5XG4gICAgICAgICAgICBmaWx0ZXIoKGV2dDogTW9kdWxlTG9hZEV2ZW50KSA9PiBldnQucmVhZHkgPT09IHRydWUgJiYgZXZ0Lm5hbWUgPT09IG1vZHVsZU5hbWUpLFxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgb2JzZXJ2YWJsZSBjb21wbGV0ZXNcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGxhenlMb2FkKGNvbmZpZzogSTE4bkxvYWRlckNvbmZpZyk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiAxMDAwMDApICsgMSkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmVzb3VyY2VzKGNvbmZpZywgbW9kdWxlSWQpO1xuICAgIH1cblxuICAgIGxhenlMb2FkSW5pdChtb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZywgbW9kdWxlTmFtZT86IHN0cmluZyk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICBjb25zdCBpMThuTG9hZGVyQ29uZmlnID0gbW9kdWxlQ29uZmlnIGFzIEkxOG5Mb2FkZXJDb25maWc7XG4gICAgICAgIC8vIGFkZCByZXNvdXJjZXNcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmVzb3VyY2VzKGkxOG5Mb2FkZXJDb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCByZXNvdXJjZXMgYmFzZWQgb2YgYSBjb25maWcgbG9hZGVyXG4gICAgICogQHBhcmFtIGNvbmZpZyBJMThuTG9hZGVyQ29uZmlnXG4gICAgICogQHJldHVybiBQcm9taXNlPEV1aVNlcnZpY2VTdGF0dXM+IGFuIEV1aVNlcnZpY2VTdGF0dXMgd2hlbiB0cmFuc2xhdGlvbiBoYXMgZnVsbHkgbG9hZGVkXG4gICAgICovXG4gICAgcHVibGljIGFkZFJlc291cmNlcyhjb25maWc6IEkxOG5Mb2FkZXJDb25maWcsIG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV1aVNlcnZpY2VTdGF0dXM+IHtcblxuICAgICAgICAvLyBlbWl0IHRoYXQgbW9kdWxlIGlzIGxvYWRpbmdcbiAgICAgICAgdGhpcy5vbk1vZHVsZUxvYWQubmV4dCh7IHJlYWR5OiBmYWxzZSwgbmFtZTogbW9kdWxlTmFtZSB9KTtcblxuICAgICAgICBjb25zdCBsb2FkZXIgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExvYWRlcjtcbiAgICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIEkxOG5Mb2FkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmdTdWJzY3JpcHRpb246IE9ic2VydmFibGU8YW55PltdID0gW107XG4gICAgICAgICAgICBjb25zdCBpMThuTG9hZGVyID0gPEkxOG5Mb2FkZXI+bG9hZGVyO1xuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIHJlc291cmNlcyB0byB0aGUgbG9hZGVyXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBpMThuTG9hZGVyLmFkZFJlc291cmNlcyhjb25maWcpO1xuXG4gICAgICAgICAgICAvLyBtYW51YWxseSBsb2FkIHRoZSByZXNvdXJjZXMgZm9yIHRoZSBDVVJSRU5UIGxhbmd1YWdlIGFuZCBhZGQgdGhlbSB0byB0aGUgdHJhbnNsYXRlIHNlcnZpY2VcbiAgICAgICAgICAgIGxhbmdTdWJzY3JpcHRpb24ucHVzaChpMThuTG9hZGVyLmxvYWRSZXNvdXJjZXMocmVzb3VyY2VzLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgIHRhcCgobG9hZGVkUmVzb3VyY2VzOiBMb2FkZWRSZXNvdXJjZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbmV3IHNldCBvZiB0cmFuc2xhdGlvbnMgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXRUcmFuc2xhdGlvbih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcsIGxvYWRlZFJlc291cmNlcy50cmFuc2xhdGlvbnMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZFJlc291cmNlcy5oYXNFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5Mb2FkZXIucmVtb3ZlUmVzb3VyY2VzKGxvYWRlZFJlc291cmNlcy5lcnJvcnMubWFwKGVyciA9PiBlcnIucmVzb3VyY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGxhbmd1YWdlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBERUZBVUxUIGxhbmd1YWdlXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nICE9PSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZGVmYXVsdExhbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSBsb2FkIHRoZSByZXNvdXJjZXMgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGFuZCBhZGQgdGhlbSB0byB0aGUgdHJhbnNsYXRlIHNlcnZpY2VcbiAgICAgICAgICAgICAgICBsYW5nU3Vic2NyaXB0aW9uLnB1c2goaTE4bkxvYWRlci5sb2FkUmVzb3VyY2VzKHJlc291cmNlcywgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmRlZmF1bHRMYW5nKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXAoKGxvYWRlZFJlc291cmNlczogTG9hZGVkUmVzb3VyY2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKHRoaXMudHJhbnNsYXRlU2VydmljZS5kZWZhdWx0TGFuZywgbG9hZGVkUmVzb3VyY2VzLnRyYW5zbGF0aW9ucywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZFJlc291cmNlcy5oYXNFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuTG9hZGVyLnJlbW92ZVJlc291cmNlcyhsb2FkZWRSZXNvdXJjZXMuZXJyb3JzLm1hcChlcnIgPT4gZXJyLnJlc291cmNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4obGFuZ1N1YnNjcmlwdGlvbikucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxvYWRlZFJlc291cmNlc0FycjogTG9hZGVkUmVzb3VyY2VzW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFsb2FkZWRSZXNvdXJjZXNBcnJbMF0uaGFzRXJyb3IgP1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBzdWNjZXNzOiB0cnVlIH0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGxvYWRlZFJlc291cmNlc0FyclswXS5lcnJvcnMgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IHN0YXR1cyBvZiBtb2R1bGUgbG9hZGluZyBwcm9ncmVzc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTW9kdWxlTG9hZC5uZXh0KHsgcmVhZHk6IHRydWUsIG5hbWU6IG1vZHVsZU5hbWUgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgc3RhdHVzIG9mIG1vZHVsZSBsb2FkaW5nIHByb2dyZXNzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Nb2R1bGVMb2FkLm5leHQoeyByZWFkeTogdHJ1ZSwgbmFtZTogbW9kdWxlTmFtZSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ2N1cnJlbnRMb2FkZXIgaXMgbm90IGFuIEkxOG5Mb2FkZXIuJyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIHRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlZERlZmF1bHRMYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBicm93c2VyUHJlZiA9IGdldEJyb3dzZXJEZWZhdWx0TGFuZ3VhZ2UoKTtcbiAgICAgICAgLy8gSWYgdXNlciBoYXMgYnJvd3NlciBwcmVmZXJyZWQgbGFuZywgYW5kIHRoYXQgbGFuZ3VhZ2UgaXMgcGFydCBvZiB0aGUgbGFuZ3VhZ2VzIGFycmF5XG4gICAgICAgIGlmIChicm93c2VyUHJlZiAmJiB0aGlzLmNvbmZpZy5sYW5ndWFnZXMgJiYgVXhFdUxhbmd1YWdlcy5nZXRMYW5ndWFnZUNvZGVzKHRoaXMuY29uZmlnLmxhbmd1YWdlcykuaW5jbHVkZXMoYnJvd3NlclByZWYpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlclByZWY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRlZmF1bHRMYW5ndWFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZGVmYXVsdF9sYW5ndWFnZSBpZiBnaXZlbiBkZWZhdWx0IGxhbmd1YWdlIHRvIG92ZXJyaWRlIGRlZmF1bHQgbGFuZ3VhZ2UgY29taW5nIGZyb20gdGhlXG4gICAgICogY29uZmlndXJhdGlvbiB0b2tlbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldHVwKGluaXRMYW5ndWFnZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxFdWlTZXJ2aWNlU3RhdHVzPiB7XG4gICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBjb25maWcgYXMgYSByZWZlcmVuY2UgYmFzZVxuICAgICAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfSTE4Tl9TRVJWSUNFX0NPTkZJRywgdGhpcy5jb25maWcpO1xuICAgICAgICAvLyBjb25maWd1cmUgdGhlIHRyYW5zbGF0ZSBjb25maWcgc2VydmljZVxuICAgICAgICBpZiAodGhpcy5jb25maWcubGFuZ3VhZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuYWRkTGFuZ3MoVXhFdUxhbmd1YWdlcy5nZXRMYW5ndWFnZUNvZGVzKHRoaXMuY29uZmlnLmxhbmd1YWdlcykpO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9nU2VydmljZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5pbmZvKGBJMThuIGFjY2VwdGVkIGxhbmd1YWdlcyBzZXQgdG8gJHtVeEV1TGFuZ3VhZ2VzLmdldExhbmd1YWdlQ29kZXModGhpcy5jb25maWcubGFuZ3VhZ2VzKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UsIGNhdXNpbmcgdG8gbG9hZCB0cmFuc2xhdGlvbnNcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgICAgICAgICAgLnVzZShpbml0TGFuZ3VhZ2UpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRBY3RpdmVMYW5nU3RhdGVUb1RyYW5zbGF0ZVNlcnZpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kVHJhbnNsYXRlU2VydmljZUxhbmdDaGFuZ2VUb1N0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0TGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdExhbmd1YWdlKHRoaXMuY29uZmlnLmRlZmF1bHRMYW5ndWFnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kQWN0aXZlTGFuZ1N0YXRlVG9UcmFuc2xhdGVTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVMYW5nKS5zdWJzY3JpYmUoKGxhbmc6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGxhbmcgIT09IG51bGwgJiYgKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyAhPT0gbGFuZykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZShsYW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kVHJhbnNsYXRlU2VydmljZUxhbmdDaGFuZ2VUb1N0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoZXZlbnQ6IExhbmdDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVJbnN0YW5jZS5hY3RpdmVMYW5nICE9PSBldmVudC5sYW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh7IGFjdGl2ZUxhbmc6IGV2ZW50LmxhbmcgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmluZm8oYEkxOG4gY3VycmVudCBsYW5ndWFnZSBzZXQgdG8gJHtldmVudC5sYW5nfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERlZmF1bHRMYW5ndWFnZShkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZykge1xuICAgICAgICAvLyByZW1vdmVkLCBjdXJyZW50IGxhbmd1YWdlIGlzIGFscmVhZHkgY2FsY3VsYXRlZCBpbiBpbml0LCBzZXR1cCBmdW5jdGlvbiBmaWxsIHVzZSBpdCBkaXJlY3RseSwgbm90IGRlZmF1bHRcbiAgICAgICAgLy8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nID0gZGVmYXVsdF9sYW5ndWFnZSB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXREZWZhdWx0TGFuZyhkZWZhdWx0TGFuZ3VhZ2UpO1xuICAgICAgICBpZiAodGhpcy5sb2dTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuaW5mbyhgSTE4biBkZWZhdWx0IGxhbmd1YWdlIHNldCB0byAke2RlZmF1bHRMYW5ndWFnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNoYW5nZSB0aGUgY3VycmVudGx5IHVzZWQgbGFuZ3VhZ2VcbiAgICAgKiBAcGFyYW0gbGFuZyBpcyB0aGUgbGFuZ3VhZ2UgY29kZSBiYXNlZCBvbiB0aGUgY29udmVudGlvbiB5b3UgdXNlZCBlLmcuIChlbiBvciBlbi1FTilcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbiB0aGUgb2JqZWN0IHRyYW5zbGF0aW9uIGZvciBnaXZlbiBsYW5ndWFnZSBhZnRlciBsYW5ndWFnZVxuICAgICAqIGZ1bGx5IGxvYWRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVzZShsYW5nOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnVzZShsYW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGVzIHRoZSBIVE1MIGVsZW1lbnQgbGFuZyBhdHRyaWJ1dGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlSFRNTERPTUxhbmcobGFuZzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmxhbmcgPSBsYW5nO1xuICAgIH1cbn1cbiJdfQ==
|