client-core-services 1.0.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.
- package/README.md +24 -0
- package/esm2020/client-core-services.mjs +5 -0
- package/esm2020/lib/my-lib.module.mjs +98 -0
- package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
- package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
- package/esm2020/lib/services/api/api.service.mjs +611 -0
- package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
- package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
- package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
- package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
- package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
- package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
- package/esm2020/lib/services/chart/chart.service.mjs +166 -0
- package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
- package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
- package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
- package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
- package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
- package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
- package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
- package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
- package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
- package/esm2020/lib/services/download/download.service.mjs +151 -0
- package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
- package/esm2020/lib/services/env/env.service.mjs +232 -0
- package/esm2020/lib/services/env/serverHostList.mjs +56 -0
- package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
- package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
- package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
- package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
- package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
- package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
- package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
- package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
- package/esm2020/lib/services/loader/loader.service.mjs +17 -0
- package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
- package/esm2020/lib/services/model/model.service.mjs +30 -0
- package/esm2020/lib/services/notify/notification.service.mjs +84 -0
- package/esm2020/lib/services/operator/operator.service.mjs +58 -0
- package/esm2020/lib/services/permission/permission.service.mjs +88 -0
- package/esm2020/lib/services/router/router.service.mjs +78 -0
- package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
- package/esm2020/lib/services/storage/storage.service.mjs +749 -0
- package/esm2020/lib/services/tree-component/interface.mjs +6 -0
- package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
- package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
- package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
- package/esm2020/lib/shared/configuration/config.mjs +76 -0
- package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
- package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
- package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
- package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
- package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
- package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
- package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
- package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
- package/esm2020/lib/shared/platform.mjs +2 -0
- package/esm2020/public-api.mjs +53 -0
- package/fesm2015/client-core-services.mjs +15487 -0
- package/fesm2015/client-core-services.mjs.map +1 -0
- package/fesm2020/client-core-services.mjs +15482 -0
- package/fesm2020/client-core-services.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/my-lib.module.d.ts +18 -0
- package/lib/services/api/api-call/api-call.service.d.ts +60 -0
- package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
- package/lib/services/api/api.service.d.ts +88 -0
- package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
- package/lib/services/api/auth/auth.service.d.ts +50 -0
- package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
- package/lib/services/api/common-api/common-api.service.d.ts +22 -0
- package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
- package/lib/services/api/public-api/public-api.service.d.ts +14 -0
- package/lib/services/chart/chart.service.d.ts +21 -0
- package/lib/services/check-if/check-if.service.d.ts +50 -0
- package/lib/services/common-utils/common-function.service.d.ts +84 -0
- package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
- package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
- package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
- package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
- package/lib/services/data-share/data-share.service.d.ts +174 -0
- package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
- package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
- package/lib/services/download/download.service.d.ts +35 -0
- package/lib/services/encryption/encryption.service.d.ts +8 -0
- package/lib/services/env/env.service.d.ts +44 -0
- package/lib/services/env/serverHostList.d.ts +9 -0
- package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
- package/lib/services/form/form-control/form-control.service.d.ts +44 -0
- package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
- package/lib/services/form/form-value/form-value.service.d.ts +32 -0
- package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
- package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
- package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
- package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
- package/lib/services/loader/loader.service.d.ts +8 -0
- package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
- package/lib/services/model/model.service.d.ts +11 -0
- package/lib/services/notify/notification.service.d.ts +22 -0
- package/lib/services/operator/operator.service.d.ts +27 -0
- package/lib/services/permission/permission.service.d.ts +18 -0
- package/lib/services/router/router.service.d.ts +14 -0
- package/lib/services/storage/cookies.service.d.ts +11 -0
- package/lib/services/storage/storage.service.d.ts +132 -0
- package/lib/services/tree-component/interface.d.ts +13 -0
- package/lib/services/tree-component/tree-component.service.d.ts +38 -0
- package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
- package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
- package/lib/shared/configuration/config.d.ts +144 -0
- package/lib/shared/configuration/editor-config.d.ts +72 -0
- package/lib/shared/enums/common.enum.d.ts +16 -0
- package/lib/shared/enums/config.enum.d.ts +54 -0
- package/lib/shared/enums/end-point.enum.d.ts +66 -0
- package/lib/shared/enums/flags.enum.d.ts +18 -0
- package/lib/shared/enums/keycodes.enum.d.ts +120 -0
- package/lib/shared/enums/operator_type.enum.d.ts +9 -0
- package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
- package/lib/shared/platform.d.ts +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +49 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../storage/storage.service";
|
|
4
|
+
import * as i2 from "@angular/router";
|
|
5
|
+
import * as i3 from "./auth.service";
|
|
6
|
+
export class AuthGuard {
|
|
7
|
+
constructor(storageService, router, authService) {
|
|
8
|
+
this.storageService = storageService;
|
|
9
|
+
this.router = router;
|
|
10
|
+
this.authService = authService;
|
|
11
|
+
}
|
|
12
|
+
canActivate(route, state) {
|
|
13
|
+
// return this.dataShareService.getAuthentication().pipe(
|
|
14
|
+
// map((data:boolean) =>{
|
|
15
|
+
// return data;
|
|
16
|
+
// })
|
|
17
|
+
// );
|
|
18
|
+
const childWindowUrl = this.storageService.getChildWindowUrl();
|
|
19
|
+
if (state.url.startsWith("/browse") && (childWindowUrl == undefined || childWindowUrl == '/')) {
|
|
20
|
+
this.storageService.setRedirectUrl(state.url);
|
|
21
|
+
}
|
|
22
|
+
var isAuthenticated = this.authService.checkIdTokenStatus().status;
|
|
23
|
+
if (!isAuthenticated) {
|
|
24
|
+
this.authService.redirectToSignPage();
|
|
25
|
+
}
|
|
26
|
+
return isAuthenticated;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
AuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthGuard, deps: [{ token: i1.StorageService }, { token: i2.Router }, { token: i3.AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
30
|
+
AuthGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthGuard, providedIn: 'root' });
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthGuard, decorators: [{
|
|
32
|
+
type: Injectable,
|
|
33
|
+
args: [{
|
|
34
|
+
providedIn: 'root'
|
|
35
|
+
}]
|
|
36
|
+
}], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.Router }, { type: i3.AuthService }]; } });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1ndWFyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9hcGkvYXV0aC9hdXRoLWd1YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFTM0MsTUFBTSxPQUFPLFNBQVM7SUFFbEIsWUFDVSxjQUE2QixFQUM3QixNQUFjLEVBQ2QsV0FBdUI7UUFGdkIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFZO0lBR2pDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBNkIsRUFBRSxLQUEwQjtRQUNuRSx5REFBeUQ7UUFDekQsMkJBQTJCO1FBQzNCLG1CQUFtQjtRQUNuQixPQUFPO1FBQ1AsS0FBSztRQUNMLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvRCxJQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxjQUFjLElBQUksR0FBRyxDQUFDLEVBQUM7WUFDM0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNuRSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUN2QztRQUNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7O3VHQXpCUSxTQUFTOzJHQUFULFNBQVMsY0FGUixNQUFNOzRGQUVQLFNBQVM7a0JBSHJCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQ2FuQWN0aXZhdGUsIFJvdXRlciwgUm91dGVyU3RhdGVTbmFwc2hvdCwgVXJsVHJlZX0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IG1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tIFwiLi9hdXRoLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2VcIjtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoR3VhcmQgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZXtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6U3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6QXV0aFNlcnZpY2VcclxuICAgICAgKXtcclxuXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+e1xyXG4gICAgICAvLyByZXR1cm4gdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldEF1dGhlbnRpY2F0aW9uKCkucGlwZShcclxuICAgICAgLy8gICBtYXAoKGRhdGE6Ym9vbGVhbikgPT57XHJcbiAgICAgIC8vICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgLy8gICB9KVxyXG4gICAgICAvLyApO1xyXG4gICAgICBjb25zdCBjaGlsZFdpbmRvd1VybCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0Q2hpbGRXaW5kb3dVcmwoKTtcclxuICAgICAgaWYoc3RhdGUudXJsLnN0YXJ0c1dpdGgoXCIvYnJvd3NlXCIpICYmIChjaGlsZFdpbmRvd1VybCA9PSB1bmRlZmluZWQgfHwgY2hpbGRXaW5kb3dVcmwgPT0gJy8nKSl7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRSZWRpcmVjdFVybChzdGF0ZS51cmwpO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBpc0F1dGhlbnRpY2F0ZWQgPSB0aGlzLmF1dGhTZXJ2aWNlLmNoZWNrSWRUb2tlblN0YXR1cygpLnN0YXR1cztcclxuICAgICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHsgICAgICAgIFxyXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UucmVkaXJlY3RUb1NpZ25QYWdlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGlzQXV0aGVudGljYXRlZDtcclxuICAgIH1cclxufSJdfQ==
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { StorageTokenStatus } from '../../../shared/enums/storage-token-status.enum';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common/http";
|
|
5
|
+
import * as i2 from "../../env/env.service";
|
|
6
|
+
import * as i3 from "../api.service";
|
|
7
|
+
import * as i4 from "../../storage/storage.service";
|
|
8
|
+
import * as i5 from "@angular/router";
|
|
9
|
+
import * as i6 from "../../encryption/encryption.service";
|
|
10
|
+
import * as i7 from "../../common-utils/common-function.service";
|
|
11
|
+
import * as i8 from "../../common-utils/core-function/core-function.service";
|
|
12
|
+
import * as i9 from "../../data-share/auth-data-share/auth-data-share.service";
|
|
13
|
+
import * as i10 from "./../../api/api-call/api-call.service";
|
|
14
|
+
export class AuthService {
|
|
15
|
+
constructor(http, envService, apiService, storageService, router, encryptionService, commonFunctionService, coreFunctionService, authDataShareService, apiCallService) {
|
|
16
|
+
this.http = http;
|
|
17
|
+
this.envService = envService;
|
|
18
|
+
this.apiService = apiService;
|
|
19
|
+
this.storageService = storageService;
|
|
20
|
+
this.router = router;
|
|
21
|
+
this.encryptionService = encryptionService;
|
|
22
|
+
this.commonFunctionService = commonFunctionService;
|
|
23
|
+
this.coreFunctionService = coreFunctionService;
|
|
24
|
+
this.authDataShareService = authDataShareService;
|
|
25
|
+
this.apiCallService = apiCallService;
|
|
26
|
+
}
|
|
27
|
+
ngOnInit() {
|
|
28
|
+
}
|
|
29
|
+
Logout(payload) {
|
|
30
|
+
this.resetData();
|
|
31
|
+
this.logOutRedirection();
|
|
32
|
+
this.authDataShareService.restSettingModule('logged_out');
|
|
33
|
+
}
|
|
34
|
+
SessionExpired(payload) {
|
|
35
|
+
let response = {
|
|
36
|
+
status: '',
|
|
37
|
+
class: '',
|
|
38
|
+
msg: ''
|
|
39
|
+
};
|
|
40
|
+
this.resetData();
|
|
41
|
+
this.logOutRedirection();
|
|
42
|
+
response.class = "bg-info";
|
|
43
|
+
response.status = "success";
|
|
44
|
+
response.msg = "Session Expired, Kindly Login Again.";
|
|
45
|
+
this.authDataShareService.setSessionExpired(response);
|
|
46
|
+
if (this.storageService.checkPlatForm() != 'mobile') {
|
|
47
|
+
this.authDataShareService.restSettingModule('logged_out');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
resetData() {
|
|
51
|
+
this.storageService.removeDataFormStorage();
|
|
52
|
+
this.apiService.resetMenuData();
|
|
53
|
+
this.apiService.resetTempData();
|
|
54
|
+
this.apiService.resetGridData();
|
|
55
|
+
this.envService.setRequestType('PUBLIC');
|
|
56
|
+
this.apiCallService.getApplicationAllSettings();
|
|
57
|
+
}
|
|
58
|
+
logOutRedirection() {
|
|
59
|
+
if (this.envService.checkRedirectionUrl()) {
|
|
60
|
+
window.location.href = this.envService.checkRedirectionUrl();
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.redirectToSignPage();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
gotToSigninPage() {
|
|
67
|
+
this.resetData();
|
|
68
|
+
this.redirectToSignPage();
|
|
69
|
+
}
|
|
70
|
+
GetUserInfoFromToken(payload, loginRedirect) {
|
|
71
|
+
let response = {
|
|
72
|
+
status: '',
|
|
73
|
+
class: '',
|
|
74
|
+
msg: ''
|
|
75
|
+
};
|
|
76
|
+
let api = "";
|
|
77
|
+
let reqBody = {};
|
|
78
|
+
if (payload && payload.roleName && payload.roleName != '') {
|
|
79
|
+
api = this.envService.getAuthApi('GET_USER_PERMISSION') + "/" + payload.roleName;
|
|
80
|
+
reqBody = { key: payload.token };
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
api = this.envService.getAuthApi('GET_USER_PERMISSION') + "/" + null;
|
|
84
|
+
reqBody = { key: payload };
|
|
85
|
+
}
|
|
86
|
+
this.http.post(api, reqBody).subscribe((respData) => {
|
|
87
|
+
if (respData && respData.user) {
|
|
88
|
+
let modifyData = this.coreFunctionService.getModulesFromMapObject(respData);
|
|
89
|
+
this.storageService.SetUserInfo(modifyData);
|
|
90
|
+
this.storageService.GetUserInfo();
|
|
91
|
+
this.envService.setRequestType('PRIVATE');
|
|
92
|
+
this.apiCallService.getApplicationAllSettings();
|
|
93
|
+
this.authDataShareService.restSettingModule('logged_in');
|
|
94
|
+
this.apiService.gitVersion('');
|
|
95
|
+
this.apiCallService.getUserPrefrerence(respData.user);
|
|
96
|
+
// this.apiCallService.getUserNotification(1);
|
|
97
|
+
this.redirectionWithMenuType(loginRedirect);
|
|
98
|
+
response.status = "success";
|
|
99
|
+
this.authDataShareService.setUserInfo(response);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.envService.setRequestType('PUBLIC');
|
|
103
|
+
this.redirectToSignPage();
|
|
104
|
+
}
|
|
105
|
+
}, (error) => {
|
|
106
|
+
if (error.status == 403) {
|
|
107
|
+
this.envService.setRequestType('PUBLIC');
|
|
108
|
+
this.redirectToSignPage();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
if (error && error.status == 403) {
|
|
112
|
+
response.msg = 'Username password does not match.';
|
|
113
|
+
}
|
|
114
|
+
else if (error && error.error && error.error.message) {
|
|
115
|
+
response.msg = error.error.message;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
response.msg = error.message;
|
|
119
|
+
}
|
|
120
|
+
response.status = 'error';
|
|
121
|
+
response.class = 'bg-danger';
|
|
122
|
+
this.authDataShareService.setUserInfo(response);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
redirectionWithMenuType(loginRedirectUrl) {
|
|
127
|
+
const menuType = this.storageService.GetMenuType();
|
|
128
|
+
const redirectUrl = this.storageService.getRedirectUrl();
|
|
129
|
+
const childWindowUrl = this.storageService.getChildWindowUrl();
|
|
130
|
+
let route = '/dashboard';
|
|
131
|
+
if (menuType == 'Horizontal') {
|
|
132
|
+
route = '/home';
|
|
133
|
+
}
|
|
134
|
+
if (redirectUrl && redirectUrl != '' && redirectUrl != '/') {
|
|
135
|
+
route = redirectUrl;
|
|
136
|
+
}
|
|
137
|
+
else if (childWindowUrl && childWindowUrl != '' && childWindowUrl != '/') {
|
|
138
|
+
route = childWindowUrl;
|
|
139
|
+
}
|
|
140
|
+
else if (loginRedirectUrl && loginRedirectUrl != '' && loginRedirectUrl != '/') {
|
|
141
|
+
route = loginRedirectUrl;
|
|
142
|
+
}
|
|
143
|
+
this.router.navigate([route]);
|
|
144
|
+
}
|
|
145
|
+
redirectToSignPage() {
|
|
146
|
+
this.router.navigate(['/signin']);
|
|
147
|
+
}
|
|
148
|
+
Signin(payload) {
|
|
149
|
+
let response = {
|
|
150
|
+
status: '',
|
|
151
|
+
class: '',
|
|
152
|
+
msg: '',
|
|
153
|
+
message: '',
|
|
154
|
+
wrongLoginAttempt: 0
|
|
155
|
+
};
|
|
156
|
+
let api = this.envService.getAuthApi('AU_SIGNIN');
|
|
157
|
+
this.http.post(api, this.encryptionService.encryptRequest(payload)).subscribe((respData) => {
|
|
158
|
+
if (respData && respData['token']) {
|
|
159
|
+
const cognitoIdToken = respData['token'];
|
|
160
|
+
const cognitoExpiresIn = 86400;
|
|
161
|
+
// const cognitoExpiresIn = 420;
|
|
162
|
+
this.storageService.setExpiresIn(cognitoExpiresIn);
|
|
163
|
+
this.storageService.SetIdToken(cognitoIdToken);
|
|
164
|
+
response.status = 'success';
|
|
165
|
+
response.class = 'bg-success';
|
|
166
|
+
response.msg = 'Login Successful.';
|
|
167
|
+
if (respData['message']) {
|
|
168
|
+
response.message = respData['message'];
|
|
169
|
+
}
|
|
170
|
+
this.authDataShareService.setAuthentication(true);
|
|
171
|
+
}
|
|
172
|
+
else if (respData && respData['message']) {
|
|
173
|
+
response.status = 'error';
|
|
174
|
+
response.class = 'bg-danger';
|
|
175
|
+
response.msg = respData['message'];
|
|
176
|
+
response.wrongLoginAttempt = respData?.wrongLoginAttempt;
|
|
177
|
+
}
|
|
178
|
+
else if (respData.hasOwnProperty('error')) {
|
|
179
|
+
if (respData["error"] == "not_confirmed") {
|
|
180
|
+
response.msg = 'User Not Confirmed ';
|
|
181
|
+
}
|
|
182
|
+
else if (respData["error"] == "user_name_password_does_not_match") {
|
|
183
|
+
response.msg = 'Username password does not match ';
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
response.msg = 'Username password does not match ';
|
|
187
|
+
}
|
|
188
|
+
response.status = 'error';
|
|
189
|
+
response.class = 'bg-danger';
|
|
190
|
+
response.wrongLoginAttempt = respData?.wrongLoginAttempt;
|
|
191
|
+
}
|
|
192
|
+
this.authDataShareService.setSigninResponse(response);
|
|
193
|
+
}, (error) => {
|
|
194
|
+
if (error && error.status == 403) {
|
|
195
|
+
console.log("Sign In first error handling." + JSON.stringify(error));
|
|
196
|
+
response.msg = 'Username password does not match.';
|
|
197
|
+
}
|
|
198
|
+
else if (error && error.error && error.error.message) {
|
|
199
|
+
console.log("Sign In Secong error handling." + JSON.stringify(error));
|
|
200
|
+
response.msg = error.error.message;
|
|
201
|
+
response.wrongLoginAttempt = error.error?.wrongLoginAttempt;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.log("Sign In Third error handling." + JSON.stringify(error));
|
|
205
|
+
response.msg = error.message;
|
|
206
|
+
response.wrongLoginAttempt = error?.wrongLoginAttempt;
|
|
207
|
+
}
|
|
208
|
+
response.status = 'error';
|
|
209
|
+
response.class = 'bg-danger';
|
|
210
|
+
this.authDataShareService.setSigninResponse(response);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
Signup(payload) {
|
|
214
|
+
let response = {
|
|
215
|
+
status: '',
|
|
216
|
+
class: '',
|
|
217
|
+
msg: '',
|
|
218
|
+
appPresentAlert: false,
|
|
219
|
+
autoLogin: false,
|
|
220
|
+
payload: {}
|
|
221
|
+
};
|
|
222
|
+
let newPayload = '';
|
|
223
|
+
let isHybridPlatform = false;
|
|
224
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
225
|
+
isHybridPlatform = true;
|
|
226
|
+
newPayload = payload.data;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
newPayload = payload;
|
|
230
|
+
}
|
|
231
|
+
let api = this.envService.getAuthApi('AU_SIGNUP');
|
|
232
|
+
this.http.post(api, this.encryptionService.encryptRequest(newPayload)).subscribe((respData) => {
|
|
233
|
+
if (respData && respData['message'] == 'User registered successfully') {
|
|
234
|
+
if (payload.autologin && isHybridPlatform) {
|
|
235
|
+
response.msg = 'Successfully Registered.';
|
|
236
|
+
response.autoLogin = payload.autologin;
|
|
237
|
+
response.payload = { userId: newPayload.userId, password: newPayload.password };
|
|
238
|
+
// this.Signin(appPayload);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
if (this.envService.getVerifyType() == 'mobile') {
|
|
242
|
+
response.msg = 'OTP has been sent to your registered Mobile no.';
|
|
243
|
+
response.payload = { userId: newPayload.userId, password: newPayload.password };
|
|
244
|
+
if (isHybridPlatform) {
|
|
245
|
+
response.appPresentAlert = true;
|
|
246
|
+
// this.router.navigate([payload.redirection +'/'+payload.data.userId]);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// this.router.navigate(['otp_varify'+'/'+payload.userId]);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
if (newPayload.admin) {
|
|
254
|
+
response.msg = 'A verification link has been sent to your email account. If not received, please connect to admin to verify your email.';
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
response.msg = 'A verification link has been sent to your email account. please click on the link to verify your email and continue the registration process.';
|
|
258
|
+
}
|
|
259
|
+
response.appPresentAlert = true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else if (respData && respData['message']) {
|
|
264
|
+
response.msg = respData['message'];
|
|
265
|
+
}
|
|
266
|
+
response.status = 'success';
|
|
267
|
+
response.class = 'bg-success';
|
|
268
|
+
this.authDataShareService.setSignUpResponse(response);
|
|
269
|
+
}, (error) => {
|
|
270
|
+
if (error && error.error && error.error.message) {
|
|
271
|
+
console.log("Sign In Secong error handling." + JSON.stringify(error));
|
|
272
|
+
response.msg = error.error.message;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.log("Sign In Third error handling." + JSON.stringify(error));
|
|
276
|
+
response.msg = error.message;
|
|
277
|
+
}
|
|
278
|
+
response.status = 'error';
|
|
279
|
+
response.class = 'bg-danger';
|
|
280
|
+
this.authDataShareService.setSignUpResponse(response);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
TryForgotPassword(payload) {
|
|
284
|
+
let response = {
|
|
285
|
+
status: '',
|
|
286
|
+
class: '',
|
|
287
|
+
msg: ''
|
|
288
|
+
};
|
|
289
|
+
let api = this.envService.getAuthApi('AUTH_FORGET_PASSWORD');
|
|
290
|
+
this.http.post(api, this.encryptionService.encryptRequest(payload)).subscribe((respData) => {
|
|
291
|
+
if (respData && respData['message']) {
|
|
292
|
+
response.status = 'success';
|
|
293
|
+
response.class = 'bg-success';
|
|
294
|
+
response.msg = respData['message'];
|
|
295
|
+
}
|
|
296
|
+
this.authDataShareService.setForgot(response);
|
|
297
|
+
}, (error) => {
|
|
298
|
+
if (error && error.error && error.error.message) {
|
|
299
|
+
response.msg = error.error.message;
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
response.msg = error.message;
|
|
303
|
+
}
|
|
304
|
+
response.status = 'error';
|
|
305
|
+
response.class = 'bg-danger';
|
|
306
|
+
this.authDataShareService.setForgot(response);
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
SaveNewPassword(payload) {
|
|
310
|
+
let response = {
|
|
311
|
+
status: '',
|
|
312
|
+
class: '',
|
|
313
|
+
msg: ''
|
|
314
|
+
};
|
|
315
|
+
let api = this.envService.getAuthApi('AUTH_RESET_PASSWORD');
|
|
316
|
+
this.http.post(api, this.encryptionService.encryptRequest(payload)).subscribe((respData) => {
|
|
317
|
+
if (respData && respData['message']) {
|
|
318
|
+
response.status = 'success';
|
|
319
|
+
response.class = 'bg-success';
|
|
320
|
+
response.msg = respData['message'];
|
|
321
|
+
}
|
|
322
|
+
this.authDataShareService.resetPassword(response);
|
|
323
|
+
}, (error) => {
|
|
324
|
+
if (error && error.error && error.error.message) {
|
|
325
|
+
response.msg = error.error.message;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
response.msg = error.message;
|
|
329
|
+
}
|
|
330
|
+
response.status = 'error';
|
|
331
|
+
response.class = 'bg-danger';
|
|
332
|
+
this.authDataShareService.resetPassword(response);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
ResetPass(payload) {
|
|
336
|
+
let api = this.envService.getAuthApi('RESET_PASSWORD');
|
|
337
|
+
this.http.post(api, this.encryptionService.encryptRequest(payload)).subscribe((respData) => {
|
|
338
|
+
if (respData && respData.hasOwnProperty('success')) {
|
|
339
|
+
// this.notificationService.notify("bg-success", " New Password Set Successfully.");
|
|
340
|
+
this.router.navigate(['/admin']);
|
|
341
|
+
}
|
|
342
|
+
else if (respData.hasOwnProperty('error')) {
|
|
343
|
+
if (respData["error"] == "not_confirmed") {
|
|
344
|
+
// this.notificationService.notify("bg-danger", "User Not Confirmed ");
|
|
345
|
+
}
|
|
346
|
+
else if (respData["error"] == "user_name_password_does_not_match") {
|
|
347
|
+
// this.notificationService.notify("bg-danger", "Username password does not match ");
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}, (error) => {
|
|
351
|
+
// this.notificationService.notify("bg-danger", error.message);
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
TryVerify(payload) {
|
|
355
|
+
console.log(payload);
|
|
356
|
+
}
|
|
357
|
+
changePassword(payload) {
|
|
358
|
+
let response = {
|
|
359
|
+
status: '',
|
|
360
|
+
class: '',
|
|
361
|
+
msg: ''
|
|
362
|
+
};
|
|
363
|
+
let api = this.envService.getAuthApi('AUTH_CHANGE_PASSWORD');
|
|
364
|
+
this.http.post(api, this.encryptionService.encryptRequest(payload)).subscribe((respData) => {
|
|
365
|
+
if (respData && respData['message']) {
|
|
366
|
+
response.status = 'success';
|
|
367
|
+
response.class = 'bg-success';
|
|
368
|
+
response.msg = respData['message'];
|
|
369
|
+
}
|
|
370
|
+
this.authDataShareService.setChangePwd(response);
|
|
371
|
+
}, (error) => {
|
|
372
|
+
if (error && error.status == 403) {
|
|
373
|
+
response.msg = "Invalid current password.";
|
|
374
|
+
}
|
|
375
|
+
else if (error && error.error && error.error.message) {
|
|
376
|
+
response.msg = error.error.message;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
response.msg = error.message;
|
|
380
|
+
}
|
|
381
|
+
response.status = 'error';
|
|
382
|
+
response.class = 'bg-danger';
|
|
383
|
+
this.authDataShareService.setChangePwd(response);
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
userVarify(payload) {
|
|
387
|
+
let response = {
|
|
388
|
+
status: '',
|
|
389
|
+
class: '',
|
|
390
|
+
msg: '',
|
|
391
|
+
autoLogin: false,
|
|
392
|
+
};
|
|
393
|
+
let newPayload = '';
|
|
394
|
+
let isHybridPlatform = false;
|
|
395
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
396
|
+
isHybridPlatform = true;
|
|
397
|
+
newPayload = payload.data;
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
newPayload = payload;
|
|
401
|
+
}
|
|
402
|
+
let api = this.envService.getAuthApi('USER_VARIFY');
|
|
403
|
+
this.http.post(api, this.encryptionService.encryptRequest(newPayload)).subscribe((respData) => {
|
|
404
|
+
if (respData && respData['message'] == "User has been verified successfully") {
|
|
405
|
+
response.msg = respData['message'];
|
|
406
|
+
if (payload.autologin) {
|
|
407
|
+
response.autoLogin = payload.autologin;
|
|
408
|
+
}
|
|
409
|
+
// if(this.storageService.getVerifyType() == 'mobile'){
|
|
410
|
+
// }
|
|
411
|
+
}
|
|
412
|
+
else if (respData && respData['message']) {
|
|
413
|
+
response.msg = respData['message'];
|
|
414
|
+
}
|
|
415
|
+
response.status = 'success';
|
|
416
|
+
response.class = 'bg-success';
|
|
417
|
+
this.authDataShareService.setOtpResponse(response);
|
|
418
|
+
}, (error) => {
|
|
419
|
+
if (error && error.error && error.error.message) {
|
|
420
|
+
response.msg = error.error.message;
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
response.msg = error.message;
|
|
424
|
+
}
|
|
425
|
+
response.status = 'error';
|
|
426
|
+
response.class = 'bg-danger';
|
|
427
|
+
this.authDataShareService.setOtpResponse(response);
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
checkIdTokenStatus() {
|
|
431
|
+
let statusWithMsg = {
|
|
432
|
+
"status": false,
|
|
433
|
+
"msg": ""
|
|
434
|
+
};
|
|
435
|
+
if (this.storageService != null && this.storageService.GetIdToken() != null) {
|
|
436
|
+
if (this.storageService.GetIdTokenStatus() == StorageTokenStatus.ID_TOKEN_ACTIVE) {
|
|
437
|
+
statusWithMsg.status = true;
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
statusWithMsg.status = false;
|
|
441
|
+
this.SessionExpired();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
statusWithMsg.status = false;
|
|
446
|
+
statusWithMsg.msg = "Your are already logout !!!";
|
|
447
|
+
}
|
|
448
|
+
return statusWithMsg;
|
|
449
|
+
}
|
|
450
|
+
checkApplicationSetting() {
|
|
451
|
+
let exists = false;
|
|
452
|
+
let applicationSetting = this.storageService.getApplicationSetting();
|
|
453
|
+
if (applicationSetting) {
|
|
454
|
+
exists = true;
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
exists = false;
|
|
458
|
+
}
|
|
459
|
+
return exists;
|
|
460
|
+
}
|
|
461
|
+
authenticateUser(payload) {
|
|
462
|
+
let response = {
|
|
463
|
+
status: '',
|
|
464
|
+
class: '',
|
|
465
|
+
msg: '',
|
|
466
|
+
message: ''
|
|
467
|
+
};
|
|
468
|
+
let api = this.envService.getAuthApi('TWO_FACTOR_AUTHENTICATION');
|
|
469
|
+
this.http.post(api, this.encryptionService.encryptRequest(payload)).subscribe((respData) => {
|
|
470
|
+
if (respData && respData['token']) {
|
|
471
|
+
const cognitoIdToken = respData['token'];
|
|
472
|
+
const cognitoExpiresIn = 86400;
|
|
473
|
+
this.storageService.setExpiresIn(cognitoExpiresIn);
|
|
474
|
+
this.storageService.SetIdToken(cognitoIdToken);
|
|
475
|
+
response.status = 'success';
|
|
476
|
+
response.class = 'bg-success';
|
|
477
|
+
response.msg = 'Login Successful.';
|
|
478
|
+
if (respData['message']) {
|
|
479
|
+
response.message = respData['message'];
|
|
480
|
+
}
|
|
481
|
+
this.authDataShareService.setAuthentication(true);
|
|
482
|
+
this.authDataShareService.setAuthenticationResponce(response);
|
|
483
|
+
}
|
|
484
|
+
}, (error) => {
|
|
485
|
+
response.msg = error.message;
|
|
486
|
+
response.status = 'error';
|
|
487
|
+
response.class = 'bg-danger';
|
|
488
|
+
this.authDataShareService.setAuthenticationResponce(response);
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
AuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthService, deps: [{ token: i1.HttpClient }, { token: i2.EnvService }, { token: i3.ApiService }, { token: i4.StorageService }, { token: i5.Router }, { token: i6.EncryptionService }, { token: i7.CommonFunctionService }, { token: i8.CoreFunctionService }, { token: i9.AuthDataShareService }, { token: i10.ApiCallService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
493
|
+
AuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthService, providedIn: 'root' });
|
|
494
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthService, decorators: [{
|
|
495
|
+
type: Injectable,
|
|
496
|
+
args: [{
|
|
497
|
+
providedIn: 'root'
|
|
498
|
+
}]
|
|
499
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.EnvService }, { type: i3.ApiService }, { type: i4.StorageService }, { type: i5.Router }, { type: i6.EncryptionService }, { type: i7.CommonFunctionService }, { type: i8.CoreFunctionService }, { type: i9.AuthDataShareService }, { type: i10.ApiCallService }]; } });
|
|
500
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9hcGkvYXV0aC9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUlqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7Ozs7Ozs7Ozs7O0FBWXJGLE1BQU0sT0FBTyxXQUFXO0lBR3RCLFlBQ1UsSUFBZSxFQUNmLFVBQXFCLEVBQ3JCLFVBQXFCLEVBQ3JCLGNBQTZCLEVBQzdCLE1BQWEsRUFDYixpQkFBbUMsRUFDbkMscUJBQTJDLEVBQzNDLG1CQUF1QyxFQUN2QyxvQkFBMEMsRUFDMUMsY0FBNkI7UUFUN0IsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQ2Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNuQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXNCO1FBQzNDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFDdkMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtJQUNqQyxDQUFDO0lBR1AsUUFBUTtJQUVSLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxjQUFjLENBQUMsT0FB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QVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDL0MsUUFBUSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7Z0JBQzVCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO2dCQUM5QixRQUFRLENBQUMsR0FBRyxHQUFHLG9CQUFvQixDQUFDO2dCQUNwQyxJQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBQztvQkFDckIsUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3hDO2dCQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFDLEVBQUU7WUFDUCxRQUFRLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDN0IsUUFBUSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7WUFDMUIsUUFBUSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7WUFDN0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQzs7eUdBaGVVLFdBQVc7NkdBQVgsV0FBVyxjQUZWLE1BQU07NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlDYWxsU2VydmljZSB9IGZyb20gJy4vLi4vLi4vYXBpL2FwaS1jYWxsL2FwaS1jYWxsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEVudlNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbnYvZW52LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3N0b3JhZ2Uvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVRva2VuU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2VudW1zL3N0b3JhZ2UtdG9rZW4tc3RhdHVzLmVudW0nO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBFbmNyeXB0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2VuY3J5cHRpb24vZW5jcnlwdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uLXV0aWxzL2NvbW1vbi1mdW5jdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZUZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi11dGlscy9jb3JlLWZ1bmN0aW9uL2NvcmUtZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhEYXRhU2hhcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGF0YS1zaGFyZS9hdXRoLWRhdGEtc2hhcmUvYXV0aC1kYXRhLXNoYXJlLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIGltcGxlbWVudHMgT25Jbml0e1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6SHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgZW52U2VydmljZTpFbnZTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOlN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6Um91dGVyLFxyXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTpFbmNyeXB0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOkNvbW1vbkZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY29yZUZ1bmN0aW9uU2VydmljZTpDb3JlRnVuY3Rpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoRGF0YVNoYXJlU2VydmljZTogQXV0aERhdGFTaGFyZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaUNhbGxTZXJ2aWNlOkFwaUNhbGxTZXJ2aWNlXHJcbiAgICApIHsgfVxyXG5cclxuXHJcbiAgbmdPbkluaXQoKXtcclxuXHJcbiAgfVxyXG5cclxuICBMb2dvdXQocGF5bG9hZDphbnkpe1xyXG4gICAgdGhpcy5yZXNldERhdGEoKTtcclxuICAgIHRoaXMubG9nT3V0UmVkaXJlY3Rpb24oKTtcclxuICAgIHRoaXMuYXV0aERhdGFTaGFyZVNlcnZpY2UucmVzdFNldHRpbmdNb2R1bGUoJ2xvZ2dlZF9vdXQnKTtcclxuICB9XHJcbiAgU2Vzc2lvbkV4cGlyZWQocGF5bG9hZD86YW55KXtcclxuICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgc3RhdHVzOiAnJyxcclxuICAgICAgY2xhc3M6ICcnLFxyXG4gICAgICBtc2c6ICcnXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZXNldERhdGEoKTtcclxuICAgIHRoaXMubG9nT3V0UmVkaXJlY3Rpb24oKTtcclxuICAgIHJlc3BvbnNlLmNsYXNzID0gXCJiZy1pbmZvXCI7XHJcbiAgICByZXNwb25zZS5zdGF0dXMgPSBcInN1Y2Nlc3NcIjtcclxuICAgIHJlc3BvbnNlLm1zZyA9IFwiU2Vzc2lvbiBFeHBpcmVkLCBLaW5kbHkgTG9naW4gQWdhaW4uXCI7XHJcbiAgICB0aGlzLmF1dGhEYXRhU2hhcmVTZXJ2aWNlLnNldFNlc3Npb25FeHBpcmVkKHJlc3BvbnNlKTtcclxuICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpICE9ICdtb2JpbGUnKXtcclxuICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5yZXN0U2V0dGluZ01vZHVsZSgnbG9nZ2VkX291dCcpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXNldERhdGEoKXtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlRGF0YUZvcm1TdG9yYWdlKCk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UucmVzZXRNZW51RGF0YSgpO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnJlc2V0VGVtcERhdGEoKTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5yZXNldEdyaWREYXRhKCk7XHJcbiAgICB0aGlzLmVudlNlcnZpY2Uuc2V0UmVxdWVzdFR5cGUoJ1BVQkxJQycpO1xyXG4gICAgdGhpcy5hcGlDYWxsU2VydmljZS5nZXRBcHBsaWNhdGlvbkFsbFNldHRpbmdzKCk7XHJcbiAgfVxyXG4gIGxvZ091dFJlZGlyZWN0aW9uKCl7XHJcbiAgICBpZiAodGhpcy5lbnZTZXJ2aWNlLmNoZWNrUmVkaXJlY3Rpb25VcmwoKSkge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuZW52U2VydmljZS5jaGVja1JlZGlyZWN0aW9uVXJsKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5yZWRpcmVjdFRvU2lnblBhZ2UoKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ290VG9TaWduaW5QYWdlKCl7XHJcbiAgICB0aGlzLnJlc2V0RGF0YSgpXHJcbiAgICB0aGlzLnJlZGlyZWN0VG9TaWduUGFnZSgpO1xyXG4gIH1cclxuXHJcbiAgR2V0VXNlckluZm9Gcm9tVG9rZW4ocGF5bG9hZDphbnksIGxvZ2luUmVkaXJlY3Q/OnN0cmluZyl7XHJcbiAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgIHN0YXR1czogJycsXHJcbiAgICAgIGNsYXNzOiAnJyxcclxuICAgICAgbXNnOiAnJ1xyXG4gICAgfTtcclxuICAgIGxldCBhcGkgPSBcIlwiO1xyXG4gICAgbGV0IHJlcUJvZHkgPSB7fTtcclxuICAgIGlmKHBheWxvYWQgJiYgcGF5bG9hZC5yb2xlTmFtZSAmJiBwYXlsb2FkLnJvbGVOYW1lICE9ICcnKXtcclxuICAgICAgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEF1dGhBcGkoJ0dFVF9VU0VSX1BFUk1JU1NJT04nKStcIi9cIitwYXlsb2FkLnJvbGVOYW1lO1xyXG4gICAgICByZXFCb2R5ID0geyBrZXk6IHBheWxvYWQudG9rZW4gfTtcclxuICAgIH1lbHNle1xyXG4gICAgICBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXV0aEFwaSgnR0VUX1VTRVJfUEVSTUlTU0lPTicpK1wiL1wiK251bGw7XHJcbiAgICAgIHJlcUJvZHkgPSB7IGtleTogcGF5bG9hZCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgcmVxQm9keSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PntcclxuICAgICAgICBpZiAocmVzcERhdGEgJiYgcmVzcERhdGEudXNlcikge1xyXG4gICAgICAgICAgbGV0IG1vZGlmeURhdGEgPSB0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuZ2V0TW9kdWxlc0Zyb21NYXBPYmplY3QocmVzcERhdGEpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5TZXRVc2VySW5mbyhtb2RpZnlEYXRhKTtcclxuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0VXNlckluZm8oKTtcclxuICAgICAgICAgIHRoaXMuZW52U2VydmljZS5zZXRSZXF1ZXN0VHlwZSgnUFJJVkFURScpO1xyXG4gICAgICAgICAgdGhpcy5hcGlDYWxsU2VydmljZS5nZXRBcHBsaWNhdGlvbkFsbFNldHRpbmdzKCk7XHJcbiAgICAgICAgICB0aGlzLmF1dGhEYXRhU2hhcmVTZXJ2aWNlLnJlc3RTZXR0aW5nTW9kdWxlKCdsb2dnZWRfaW4nKTtcclxuICAgICAgICAgIHRoaXMuYXBpU2VydmljZS5naXRWZXJzaW9uKCcnKTtcclxuICAgICAgICAgIHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0VXNlclByZWZyZXJlbmNlKHJlc3BEYXRhLnVzZXIpO1xyXG4gICAgICAgICAgLy8gdGhpcy5hcGlDYWxsU2VydmljZS5nZXRVc2VyTm90aWZpY2F0aW9uKDEpO1xyXG4gICAgICAgICAgdGhpcy5yZWRpcmVjdGlvbldpdGhNZW51VHlwZShsb2dpblJlZGlyZWN0KTtcclxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IFwic3VjY2Vzc1wiO1xyXG4gICAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5zZXRVc2VySW5mbyhyZXNwb25zZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbnZTZXJ2aWNlLnNldFJlcXVlc3RUeXBlKCdQVUJMSUMnKTtcclxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRvU2lnblBhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICBpZihlcnJvci5zdGF0dXMgPT0gNDAzKXtcclxuICAgICAgICAgIHRoaXMuZW52U2VydmljZS5zZXRSZXF1ZXN0VHlwZSgnUFVCTElDJyk7XHJcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0VG9TaWduUGFnZSgpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09IDQwMyl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLm1zZyA9ICdVc2VybmFtZSBwYXNzd29yZCBkb2VzIG5vdCBtYXRjaC4nO1xyXG4gICAgICAgICAgfWVsc2UgaWYoZXJyb3IgJiYgZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3IubWVzc2FnZSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLm1zZyA9IGVycm9yLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmVzcG9uc2UubXNnID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdlcnJvcic7XHJcbiAgICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1kYW5nZXInO1xyXG4gICAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5zZXRVc2VySW5mbyhyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG4gIHJlZGlyZWN0aW9uV2l0aE1lbnVUeXBlKGxvZ2luUmVkaXJlY3RVcmw/OnN0cmluZyl7XHJcbiAgICBjb25zdCBtZW51VHlwZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0TWVudVR5cGUoKTtcclxuICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRSZWRpcmVjdFVybCgpO1xyXG4gICAgY29uc3QgY2hpbGRXaW5kb3dVcmwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldENoaWxkV2luZG93VXJsKCk7XHJcbiAgICBsZXQgcm91dGUgPSAnL2Rhc2hib2FyZCc7XHJcbiAgICBpZihtZW51VHlwZSA9PSAnSG9yaXpvbnRhbCcpe1xyXG4gICAgICByb3V0ZSA9ICcvaG9tZSc7XHJcbiAgICB9XHJcbiAgICBpZihyZWRpcmVjdFVybCAmJiByZWRpcmVjdFVybCAhPSAnJyAmJiByZWRpcmVjdFVybCAhPSAnLycpe1xyXG4gICAgICByb3V0ZSA9IHJlZGlyZWN0VXJsO1xyXG4gICAgfWVsc2UgaWYoY2hpbGRXaW5kb3dVcmwgJiYgY2hpbGRXaW5kb3dVcmwgIT0gJycgJiYgY2hpbGRXaW5kb3dVcmwgIT0gJy8nKXtcclxuICAgICAgcm91dGUgPSBjaGlsZFdpbmRvd1VybDtcclxuICAgIH1lbHNlIGlmKGxvZ2luUmVkaXJlY3RVcmwgJiYgbG9naW5SZWRpcmVjdFVybCAhPSAnJyAmJiBsb2dpblJlZGlyZWN0VXJsICE9ICcvJyl7XHJcbiAgICAgIHJvdXRlID0gbG9naW5SZWRpcmVjdFVybDtcclxuICAgIH1cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtyb3V0ZV0pO1xyXG4gIH1cclxuICByZWRpcmVjdFRvU2lnblBhZ2UoKXtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3NpZ25pbiddKTtcclxuICB9XHJcbiAgU2lnbmluKHBheWxvYWQ6YW55KXtcclxuICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgc3RhdHVzOiAnJyxcclxuICAgICAgY2xhc3M6ICcnLFxyXG4gICAgICBtc2c6ICcnLFxyXG4gICAgICBtZXNzYWdlOicnLFxyXG4gICAgICB3cm9uZ0xvZ2luQXR0ZW1wdDowXHJcbiAgICB9O1xyXG4gICAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBdXRoQXBpKCdBVV9TSUdOSU4nKTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0UmVxdWVzdChwYXlsb2FkKSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PntcclxuICAgICAgICBpZihyZXNwRGF0YSAmJiByZXNwRGF0YVsndG9rZW4nXSl7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvZ25pdG9JZFRva2VuID0gcmVzcERhdGFbJ3Rva2VuJ107XHJcbiAgICAgICAgICAgIGNvbnN0IGNvZ25pdG9FeHBpcmVzSW4gPSA4NjQwMDtcclxuICAgICAgICAgICAgLy8gY29uc3QgY29nbml0b0V4cGlyZXNJbiA9IDQyMDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRFeHBpcmVzSW4oY29nbml0b0V4cGlyZXNJbik7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuU2V0SWRUb2tlbihjb2duaXRvSWRUb2tlbik7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdzdWNjZXNzJztcclxuICAgICAgICAgICAgcmVzcG9uc2UuY2xhc3MgPSAnYmctc3VjY2Vzcyc7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLm1zZyA9ICdMb2dpbiAgU3VjY2Vzc2Z1bC4nO1xyXG4gICAgICAgICAgICBpZihyZXNwRGF0YVsnbWVzc2FnZSddKXtcclxuICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcERhdGFbJ21lc3NhZ2UnXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmF1dGhEYXRhU2hhcmVTZXJ2aWNlLnNldEF1dGhlbnRpY2F0aW9uKHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZihyZXNwRGF0YSAmJiByZXNwRGF0YVsnbWVzc2FnZSddKXtcclxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdlcnJvcic7XHJcbiAgICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1kYW5nZXInO1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gcmVzcERhdGFbJ21lc3NhZ2UnXTtcclxuICAgICAgICAgIHJlc3BvbnNlLndyb25nTG9naW5BdHRlbXB0ID0gcmVzcERhdGE/Lndyb25nTG9naW5BdHRlbXB0O1xyXG4gICAgICAgIH1lbHNlIGlmIChyZXNwRGF0YS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcERhdGFbXCJlcnJvclwiXSA9PSBcIm5vdF9jb25maXJtZWRcIikge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UubXNnID0gJ1VzZXIgTm90IENvbmZpcm1lZCAnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BEYXRhW1wiZXJyb3JcIl0gPT0gXCJ1c2VyX25hbWVfcGFzc3dvcmRfZG9lc19ub3RfbWF0Y2hcIikge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UubXNnID0gJ1VzZXJuYW1lIHBhc3N3b3JkIGRvZXMgbm90IG1hdGNoICc7XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICByZXNwb25zZS5tc2cgPSAnVXNlcm5hbWUgcGFzc3dvcmQgZG9lcyBub3QgbWF0Y2ggJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1kYW5nZXInO1xyXG4gICAgICAgICAgICByZXNwb25zZS53cm9uZ0xvZ2luQXR0ZW1wdCA9IHJlc3BEYXRhPy53cm9uZ0xvZ2luQXR0ZW1wdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5zZXRTaWduaW5SZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICBpZihlcnJvciAmJiBlcnJvci5zdGF0dXMgPT0gNDAzKXtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiU2lnbiBJbiBmaXJzdCBlcnJvciBoYW5kbGluZy5cIiArIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XHJcbiAgICAgICAgICByZXNwb25zZS5tc2cgPSAnVXNlcm5hbWUgcGFzc3dvcmQgZG9lcyBub3QgbWF0Y2guJztcclxuICAgICAgICB9ZWxzZSBpZihlcnJvciAmJiBlcnJvci5lcnJvciAmJiBlcnJvci5lcnJvci5tZXNzYWdlKXtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiU2lnbiBJbiBTZWNvbmcgZXJyb3IgaGFuZGxpbmcuXCIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpO1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gZXJyb3IuZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgIHJlc3BvbnNlLndyb25nTG9naW5BdHRlbXB0ID0gZXJyb3IuZXJyb3I/Lndyb25nTG9naW5BdHRlbXB0O1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJTaWduIEluIFRoaXJkIGVycm9yIGhhbmRsaW5nLlwiICsgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICAgIHJlc3BvbnNlLm1zZyA9IGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICByZXNwb25zZS53cm9uZ0xvZ2luQXR0ZW1wdCA9IGVycm9yPy53cm9uZ0xvZ2luQXR0ZW1wdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gJ2Vycm9yJztcclxuICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1kYW5nZXInO1xyXG5cclxuICAgICAgICB0aGlzLmF1dGhEYXRhU2hhcmVTZXJ2aWNlLnNldFNpZ25pblJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuICBTaWdudXAocGF5bG9hZDphbnkpe1xyXG4gICAgbGV0IHJlc3BvbnNlID0ge1xyXG4gICAgICBzdGF0dXM6ICcnLFxyXG4gICAgICBjbGFzczogJycsXHJcbiAgICAgIG1zZzogJycsXHJcbiAgICAgIGFwcFByZXNlbnRBbGVydDogZmFsc2UsXHJcbiAgICAgIGF1dG9Mb2dpbjpmYWxzZSxcclxuICAgICAgcGF5bG9hZDoge31cclxuICAgIH07XHJcbiAgICBsZXQgbmV3UGF5bG9hZCA6YW55ID0gJyc7XHJcbiAgICBsZXQgaXNIeWJyaWRQbGF0Zm9ybSA9IGZhbHNlO1xyXG4gICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICBpc0h5YnJpZFBsYXRmb3JtID0gdHJ1ZTtcclxuICAgICAgbmV3UGF5bG9hZCA9IHBheWxvYWQuZGF0YTtcclxuICAgIH1lbHNle1xyXG4gICAgICBuZXdQYXlsb2FkID0gcGF5bG9hZDtcclxuICAgIH1cclxuICAgIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXV0aEFwaSgnQVVfU0lHTlVQJyk7XHJcbiAgICB0aGlzLmh0dHAucG9zdChhcGksIHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFJlcXVlc3QobmV3UGF5bG9hZCkpLnN1YnNjcmliZShcclxuICAgICAgKHJlc3BEYXRhOmFueSkgPT57XHJcbiAgICAgICAgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ21lc3NhZ2UnXSA9PSAnVXNlciByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseScpe1xyXG4gICAgICAgICAgaWYocGF5bG9hZC5hdXRvbG9naW4gJiYgaXNIeWJyaWRQbGF0Zm9ybSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLm1zZyA9ICdTdWNjZXNzZnVsbHkgUmVnaXN0ZXJlZC4nO1xyXG4gICAgICAgICAgICByZXNwb25zZS5hdXRvTG9naW4gPSBwYXlsb2FkLmF1dG9sb2dpbjtcclxuICAgICAgICAgICAgcmVzcG9uc2UucGF5bG9hZCA9IHsgdXNlcklkOiBuZXdQYXlsb2FkLnVzZXJJZCwgcGFzc3dvcmQ6IG5ld1BheWxvYWQucGFzc3dvcmQgfTtcclxuICAgICAgICAgICAgLy8gdGhpcy5TaWduaW4oYXBwUGF5bG9hZCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgaWYodGhpcy5lbnZTZXJ2aWNlLmdldFZlcmlmeVR5cGUoKSA9PSAnbW9iaWxlJyl7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5tc2cgPSAnT1RQIGhhcyBiZWVuIHNlbnQgdG8geW91ciByZWdpc3RlcmVkIE1vYmlsZSBuby4nO1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucGF5bG9hZCA9IHsgdXNlcklkOiBuZXdQYXlsb2FkLnVzZXJJZCwgcGFzc3dvcmQ6IG5ld1BheWxvYWQucGFzc3dvcmQgfTtcclxuICAgICAgICAgICAgICAgIGlmKGlzSHlicmlkUGxhdGZvcm0pe1xyXG4gICAgICAgICAgICAgICAgICByZXNwb25zZS5hcHBQcmVzZW50QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGF5bG9hZC5yZWRpcmVjdGlvbiArJy8nK3BheWxvYWQuZGF0YS51c2VySWRdKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ290cF92YXJpZnknKycvJytwYXlsb2FkLnVzZXJJZF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBpZihuZXdQYXlsb2FkLmFkbWluKXtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1zZyA9ICdBIHZlcmlmaWNhdGlvbiBsaW5rIGhhcyBiZWVuIHNlbnQgdG8geW91ciBlbWFpbCBhY2NvdW50LiBJZiBub3QgcmVjZWl2ZWQsIHBsZWFzZSBjb25uZWN0IHRvIGFkbWluIHRvIHZlcmlmeSB5b3VyIGVtYWlsLic7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5tc2cgPSAnQSB2ZXJpZmljYXRpb24gbGluayBoYXMgYmVlbiBzZW50IHRvIHlvdXIgZW1haWwgYWNjb3VudC4gcGxlYXNlIGNsaWNrIG9uIHRoZSBsaW5rIHRvIHZlcmlmeSB5b3VyIGVtYWlsIGFuZCBjb250aW51ZSB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MuJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2UuYXBwUHJlc2VudEFsZXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZihyZXNwRGF0YSAmJiByZXNwRGF0YVsnbWVzc2FnZSddKXtcclxuICAgICAgICAgIHJlc3BvbnNlLm1zZyA9IHJlc3BEYXRhWydtZXNzYWdlJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdzdWNjZXNzJztcclxuICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1zdWNjZXNzJztcclxuICAgICAgICB0aGlzLmF1dGhEYXRhU2hhcmVTZXJ2aWNlLnNldFNpZ25VcFJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKT0+e1xyXG4gICAgICAgIGlmKGVycm9yICYmIGVycm9yLmVycm9yICYmIGVycm9yLmVycm9yLm1lc3NhZ2Upe1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJTaWduIEluIFNlY29uZyBlcnJvciBoYW5kbGluZy5cIiArIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XHJcbiAgICAgICAgICByZXNwb25zZS5tc2cgPSBlcnJvci5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJTaWduIEluIFRoaXJkIGVycm9yIGhhbmRsaW5nLlwiICsgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICAgIHJlc3BvbnNlLm1zZyA9IGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdlcnJvcic7XHJcbiAgICAgICAgcmVzcG9uc2UuY2xhc3MgPSAnYmctZGFuZ2VyJztcclxuICAgICAgICB0aGlzLmF1dGhEYXRhU2hhcmVTZXJ2aWNlLnNldFNpZ25VcFJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuICBUcnlGb3Jnb3RQYXNzd29yZChwYXlsb2FkOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgIHN0YXR1czogJycsXHJcbiAgICAgIGNsYXNzOiAnJyxcclxuICAgICAgbXNnOiAnJ1xyXG4gICAgfTtcclxuICAgIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXV0aEFwaSgnQVVUSF9GT1JHRVRfUEFTU1dPUkQnKTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0UmVxdWVzdChwYXlsb2FkKSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PntcclxuICAgICAgICBpZihyZXNwRGF0YSAmJiByZXNwRGF0YVsnbWVzc2FnZSddKXtcclxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdzdWNjZXNzJztcclxuICAgICAgICAgIHJlc3BvbnNlLmNsYXNzID0gJ2JnLXN1Y2Nlc3MnO1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gcmVzcERhdGFbJ21lc3NhZ2UnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5zZXRGb3Jnb3QocmVzcG9uc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpPT57XHJcbiAgICAgICAgaWYoZXJyb3IgJiYgZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3IubWVzc2FnZSl7XHJcbiAgICAgICAgICByZXNwb25zZS5tc2cgPSBlcnJvci5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gJ2Vycm9yJztcclxuICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1kYW5nZXInO1xyXG4gICAgICAgIHRoaXMuYXV0aERhdGFTaGFyZVNlcnZpY2Uuc2V0Rm9yZ290KHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuICBTYXZlTmV3UGFzc3dvcmQocGF5bG9hZDphbnkpe1xyXG4gICAgbGV0IHJlc3BvbnNlID0ge1xyXG4gICAgICBzdGF0dXM6ICcnLFxyXG4gICAgICBjbGFzczogJycsXHJcbiAgICAgIG1zZzogJydcclxuICAgIH07XHJcbiAgICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEF1dGhBcGkoJ0FVVEhfUkVTRVRfUEFTU1dPUkQnKTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0UmVxdWVzdChwYXlsb2FkKSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PntcclxuICAgICAgICBpZihyZXNwRGF0YSAmJiByZXNwRGF0YVsnbWVzc2FnZSddKXtcclxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdzdWNjZXNzJztcclxuICAgICAgICAgIHJlc3BvbnNlLmNsYXNzID0gJ2JnLXN1Y2Nlc3MnO1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gcmVzcERhdGFbJ21lc3NhZ2UnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5yZXNldFBhc3N3b3JkKHJlc3BvbnNlKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKT0+e1xyXG4gICAgICAgIGlmKGVycm9yICYmIGVycm9yLmVycm9yICYmIGVycm9yLmVycm9yLm1lc3NhZ2Upe1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gZXJyb3IuZXJyb3IubWVzc2FnZTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJlc3BvbnNlLm1zZyA9IGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9ICdlcnJvcic7XHJcbiAgICAgICAgcmVzcG9uc2UuY2xhc3MgPSAnYmctZGFuZ2VyJztcclxuICAgICAgICB0aGlzLmF1dGhEYXRhU2hhcmVTZXJ2aWNlLnJlc2V0UGFzc3dvcmQocmVzcG9uc2UpO1xyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG4gIFJlc2V0UGFzcyhwYXlsb2FkOmFueSl7XHJcbiAgICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEF1dGhBcGkoJ1JFU0VUX1BBU1NXT1JEJyk7XHJcbiAgICB0aGlzLmh0dHAucG9zdChhcGksdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0UmVxdWVzdChwYXlsb2FkKSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PntcclxuICAgICAgICBpZiAocmVzcERhdGEgJiYgcmVzcERhdGEuaGFzT3duUHJvcGVydHkoJ3N1Y2Nlc3MnKSkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctc3VjY2Vzc1wiLCBcIiBOZXcgUGFzc3dvcmQgU2V0ICBTdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZG1pbiddKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BEYXRhLmhhc093blByb3BlcnR5KCdlcnJvcicpKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwRGF0YVtcImVycm9yXCJdID09IFwibm90X2NvbmZpcm1lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctZGFuZ2VyXCIsIFwiVXNlciBOb3QgQ29uZmlybWVkIFwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwRGF0YVtcImVycm9yXCJdID09IFwidXNlcl9uYW1lX3Bhc3N3b3JkX2RvZXNfbm90X21hdGNoXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5ub3RpZnkoXCJiZy1kYW5nZXJcIiwgXCJVc2VybmFtZSBwYXNzd29yZCBkb2VzIG5vdCBtYXRjaCBcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICAvLyB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctZGFuZ2VyXCIsIGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG4gIFRyeVZlcmlmeShwYXlsb2FkOm9iamVjdCl7XHJcbiAgICBjb25zb2xlLmxvZyhwYXlsb2FkKTtcclxuICB9XHJcbiAgY2hhbmdlUGFzc3dvcmQocGF5bG9hZDphbnkpe1xyXG4gICAgbGV0IHJlc3BvbnNlID0ge1xyXG4gICAgICBzdGF0dXM6ICcnLFxyXG4gICAgICBjbGFzczogJycsXHJcbiAgICAgIG1zZzogJydcclxuICAgIH07XHJcbiAgICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEF1dGhBcGkoJ0FVVEhfQ0hBTkdFX1BBU1NXT1JEJylcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0UmVxdWVzdChwYXlsb2FkKSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ21lc3NhZ2UnXSl7XHJcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAnc3VjY2Vzcyc7XHJcbiAgICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1zdWNjZXNzJztcclxuICAgICAgICAgIHJlc3BvbnNlLm1zZyA9IHJlc3BEYXRhWydtZXNzYWdlJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXV0aERhdGFTaGFyZVNlcnZpY2Uuc2V0Q2hhbmdlUHdkKHJlc3BvbnNlKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgaWYoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09IDQwMyl7XHJcbiAgICAgICAgICByZXNwb25zZS5tc2cgPSBcIkludmFsaWQgY3VycmVudCBwYXNzd29yZC5cIjtcclxuICAgICAgICB9ZWxzZSBpZihlcnJvciAmJiBlcnJvci5lcnJvciAmJiBlcnJvci5lcnJvci5tZXNzYWdlKXtcclxuICAgICAgICAgIHJlc3BvbnNlLm1zZyA9ICBlcnJvci5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gJ2Vycm9yJztcclxuICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1kYW5nZXInO1xyXG4gICAgICAgIHRoaXMuYXV0aERhdGFTaGFyZVNlcnZpY2Uuc2V0Q2hhbmdlUHdkKHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuICB1c2VyVmFyaWZ5KHBheWxvYWQ6YW55KXtcclxuICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgc3RhdHVzOiAnJyxcclxuICAgICAgY2xhc3M6ICcnLFxyXG4gICAgICBtc2c6ICcnLFxyXG4gICAgICBhdXRvTG9naW46ZmFsc2UsXHJcbiAgICB9O1xyXG4gICAgbGV0IG5ld1BheWxvYWQgOmFueSA9ICcnO1xyXG4gICAgbGV0IGlzSHlicmlkUGxhdGZvcm0gPSBmYWxzZTtcclxuICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgaXNIeWJyaWRQbGF0Zm9ybSA9IHRydWU7XHJcbiAgICAgIG5ld1BheWxvYWQgPSBwYXlsb2FkLmRhdGE7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgbmV3UGF5bG9hZCA9IHBheWxvYWQ7XHJcbiAgICB9XHJcbiAgICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEF1dGhBcGkoJ1VTRVJfVkFSSUZZJyk7XHJcbiAgICB0aGlzLmh0dHAucG9zdChhcGksIHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFJlcXVlc3QobmV3UGF5bG9hZCkpLnN1YnNjcmliZShcclxuICAgICAgKHJlc3BEYXRhOmFueSkgPT57XHJcbiAgICAgICAgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ21lc3NhZ2UnXSA9PSBcIlVzZXIgaGFzIGJlZW4gdmVyaWZpZWQgc3VjY2Vzc2Z1bGx5XCIpe1xyXG4gICAgICAgICAgcmVzcG9uc2UubXNnID0gcmVzcERhdGFbJ21lc3NhZ2UnXTtcclxuICAgICAgICAgIGlmKHBheWxvYWQuYXV0b2xvZ2luKXtcclxuICAgICAgICAgICAgcmVzcG9uc2UuYXV0b0xvZ2luID0gcGF5bG9hZC5hdXRvbG9naW47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBpZih0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFZlcmlmeVR5cGUoKSA9PSAnbW9iaWxlJyl7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfWVsc2UgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ21lc3NhZ2UnXSl7XHJcbiAgICAgICAgICByZXNwb25zZS5tc2cgPSByZXNwRGF0YVsnbWVzc2FnZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAnc3VjY2Vzcyc7XHJcbiAgICAgICAgcmVzcG9uc2UuY2xhc3MgPSAnYmctc3VjY2Vzcyc7XHJcbiAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5zZXRPdHBSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICBpZihlcnJvciAmJiBlcnJvci5lcnJvciAmJiBlcnJvci5lcnJvci5tZXNzYWdlKXtcclxuICAgICAgICAgIHJlc3BvbnNlLm1zZyA9IGVycm9yLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZXNwb25zZS5tc2cgPSBlcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAnZXJyb3InO1xyXG4gICAgICAgIHJlc3BvbnNlLmNsYXNzID0gJ2JnLWRhbmdlcic7XHJcbiAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5zZXRPdHBSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcbiAgY2hlY2tJZFRva2VuU3RhdHVzKCl7XHJcbiAgICBsZXQgc3RhdHVzV2l0aE1zZz17XHJcbiAgICAgIFwic3RhdHVzXCI6ZmFsc2UsXHJcbiAgICAgIFwibXNnXCIgOiBcIlwiXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UgIT0gbnVsbCAmJiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldElkVG9rZW4oKSAhPSBudWxsKSB7XHJcbiAgICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0SWRUb2tlblN0YXR1cygpID09IFN0b3JhZ2VUb2tlblN0YXR1cy5JRF9UT0tFTl9BQ1RJVkUpe1xyXG4gICAgICAgIHN0YXR1c1dpdGhNc2cuc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgc3RhdHVzV2l0aE1zZy5zdGF0dXMgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuU2Vzc2lvbkV4cGlyZWQoKTtcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHN0YXR1c1dpdGhNc2cuc3RhdHVzPWZhbHNlO1xyXG4gICAgICBzdGF0dXNXaXRoTXNnLm1zZz1cIllvdXIgYXJlIGFscmVhZHkgbG9nb3V0ICEhIVwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0YXR1c1dpdGhNc2c7XHJcbiAgfVxyXG4gIGNoZWNrQXBwbGljYXRpb25TZXR0aW5nKCl7XHJcbiAgICBsZXQgZXhpc3RzID0gZmFsc2U7XHJcbiAgICBsZXQgYXBwbGljYXRpb25TZXR0aW5nID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBcHBsaWNhdGlvblNldHRpbmcoKTtcclxuICAgIGlmKGFwcGxpY2F0aW9uU2V0dGluZyl7XHJcbiAgICAgIGV4aXN0cyA9IHRydWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgZXhpc3RzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhpc3RzO1xyXG4gIH1cclxuXHJcbiAgYXV0aGVudGljYXRlVXNlcihwYXlsb2FkOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgIHN0YXR1czogJycsXHJcbiAgICAgIGNsYXNzOiAnJyxcclxuICAgICAgbXNnOiAnJyxcclxuICAgICAgbWVzc2FnZTonJ1xyXG4gICAgfTtcclxuICAgIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXV0aEFwaSgnVFdPX0ZBQ1RPUl9BVVRIRU5USUNBVElPTicpO1xyXG4gICAgdGhpcy5odHRwLnBvc3QoYXBpLCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRSZXF1ZXN0KHBheWxvYWQpKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXNwRGF0YTphbnkpID0+e1xyXG4gICAgICAgIGlmKHJlc3BEYXRhICYmIHJlc3BEYXRhWyd0b2tlbiddKXtcclxuICAgICAgICAgICAgY29uc3QgY29nbml0b0lkVG9rZW4gPSByZXNwRGF0YVsndG9rZW4nXTtcclxuICAgICAgICAgICAgY29uc3QgY29nbml0b0V4cGlyZXNJbiA9IDg2NDAwO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldEV4cGlyZXNJbihjb2duaXRvRXhwaXJlc0luKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5TZXRJZFRva2VuKGNvZ25pdG9JZFRva2VuKTtcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xyXG4gICAgICAgICAgICByZXNwb25zZS5jbGFzcyA9ICdiZy1zdWNjZXNzJztcclxuICAgICAgICAgICAgcmVzcG9uc2UubXNnID0gJ0xvZ2luICBTdWNjZXNzZnVsLic7XHJcbiAgICAgICAgICAgIGlmKHJlc3BEYXRhWydtZXNzYWdlJ10pe1xyXG4gICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwRGF0YVsnbWVzc2FnZSddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aERhdGFTaGFyZVNlcnZpY2Uuc2V0QXV0aGVudGljYXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aERhdGFTaGFyZVNlcnZpY2Uuc2V0QXV0aGVudGljYXRpb25SZXNwb25jZShyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpPT57XHJcbiAgICAgICAgcmVzcG9uc2UubXNnID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAnZXJyb3InO1xyXG4gICAgICAgIHJlc3BvbnNlLmNsYXNzID0gJ2JnLWRhbmdlcic7XHJcbiAgICAgICAgdGhpcy5hdXRoRGF0YVNoYXJlU2VydmljZS5zZXRBdXRoZW50aWNhdGlvblJlc3BvbmNlKHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxufVxyXG4iXX0=
|