@ieeesa-npm/tenants 0.4.6 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/ieeesa-npm-tenants.mjs +5 -0
- package/esm2022/lib/assets/constants.json +457 -0
- package/esm2022/lib/assets/tenant-validations.mjs +17 -0
- package/esm2022/lib/components/create-modify-group-type/create-modify-group-type.component.mjs +476 -0
- package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +279 -0
- package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +512 -0
- package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +391 -0
- package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +94 -0
- package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +804 -0
- package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +194 -0
- package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +335 -0
- package/esm2022/lib/models/app-type-config.model.mjs +2 -0
- package/esm2022/lib/models/app-type.model.mjs +7 -0
- package/esm2022/lib/models/create-group-type-config.model.mjs +22 -0
- package/esm2022/lib/models/create-group-type.model.mjs +2 -0
- package/esm2022/lib/models/feature-permission-id.model.mjs +8 -0
- package/esm2022/lib/models/features.model.mjs +2 -0
- package/esm2022/lib/models/permission-type.model.mjs +12 -0
- package/esm2022/lib/models/role-menu-action.model.mjs +7 -0
- package/esm2022/lib/models/role-type.model.mjs +2 -0
- package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +7 -0
- package/esm2022/lib/models/roles-and-permissions.model.mjs +2 -0
- package/esm2022/lib/models/route-config.model.mjs +2 -0
- package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +16 -0
- package/esm2022/lib/models/tenant-function-type.model.mjs +12 -0
- package/esm2022/lib/models/tenant.model.mjs +2 -0
- package/esm2022/lib/models/tenants-permission.model.mjs +2 -0
- package/esm2022/lib/models/update-tenant-status.model.mjs +2 -0
- package/esm2022/lib/models/view-tenant-group-types.model.mjs +11 -0
- package/esm2022/lib/services/tenant-applications.service.mjs +618 -0
- package/esm2022/lib/services/tenant-permissions-map.service.mjs +36 -0
- package/esm2022/lib/services/tenant-permissions.service.mjs +38 -0
- package/esm2022/lib/tenant-applications.component.mjs +14 -0
- package/esm2022/lib/tenant-applications.module.mjs +16 -0
- package/esm2022/public-api.mjs +36 -0
- package/fesm2022/ieeesa-npm-tenants.mjs +4307 -0
- package/fesm2022/ieeesa-npm-tenants.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/assets/tenant-validations.d.ts +15 -0
- package/lib/components/create-modify-group-type/create-modify-group-type.component.d.ts +129 -0
- package/lib/components/create-modify-role/create-modify-role.component.d.ts +103 -0
- package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +128 -0
- package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +106 -0
- package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +474 -0
- package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +250 -0
- package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +63 -0
- package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +134 -0
- package/lib/models/app-type-config.model.d.ts +14 -0
- package/lib/models/app-type.model.d.ts +4 -0
- package/lib/models/create-group-type-config.model.d.ts +16 -0
- package/lib/models/create-group-type.model.d.ts +49 -0
- package/lib/models/feature-permission-id.model.d.ts +4 -0
- package/lib/models/features.model.d.ts +15 -0
- package/lib/models/permission-type.model.d.ts +8 -0
- package/lib/models/role-menu-action.model.d.ts +4 -0
- package/lib/models/role-type.model.d.ts +27 -0
- package/lib/models/roles-and-permissions-table-type.model.d.ts +4 -0
- package/lib/models/roles-and-permissions.model.d.ts +119 -0
- package/lib/models/route-config.model.d.ts +4 -0
- package/lib/models/table-column-schema-view-tenant-list.model.d.ts +20 -0
- package/lib/models/tenant-function-type.model.d.ts +9 -0
- package/lib/models/tenant.model.d.ts +51 -0
- package/lib/models/tenants-permission.model.d.ts +9 -0
- package/lib/models/update-tenant-status.model.d.ts +14 -0
- package/lib/models/view-tenant-group-types.model.d.ts +29 -0
- package/lib/services/tenant-applications.service.d.ts +399 -0
- package/lib/services/tenant-permissions-map.service.d.ts +13 -0
- package/lib/services/tenant-permissions.service.d.ts +22 -0
- package/lib/tenant-applications.component.d.ts +5 -0
- package/lib/tenant-applications.module.d.ts +6 -0
- package/package.json +25 -12
- package/{src/public-api.ts → public-api.d.ts} +32 -40
- package/.eslintrc.json +0 -31
- package/ng-package.json +0 -8
- package/src/lib/assets/constants.json +0 -454
- package/src/lib/assets/tenant-validations.ts +0 -18
- package/src/lib/assets/tenants-mock.ts +0 -1240
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +0 -15
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +0 -44
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +0 -574
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +0 -602
- package/src/lib/components/create-modify-role/create-modify-role.component.html +0 -15
- package/src/lib/components/create-modify-role/create-modify-role.component.scss +0 -83
- package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +0 -346
- package/src/lib/components/create-modify-role/create-modify-role.component.ts +0 -321
- package/src/lib/components/create-tenant-application/create-tenant-application.component.html +0 -18
- package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +0 -73
- package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +0 -775
- package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +0 -638
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +0 -22
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +0 -79
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +0 -716
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +0 -504
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +0 -37
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +0 -16
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +0 -115
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +0 -109
- package/src/lib/components/view-tenant-details/view-tenant-details.component.html +0 -195
- package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +0 -163
- package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +0 -1221
- package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +0 -876
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +0 -10
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +0 -44
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +0 -410
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +0 -219
- package/src/lib/components/view-tenants-list/view-tenants-list.component.html +0 -32
- package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +0 -35
- package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +0 -464
- package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +0 -388
- package/src/lib/models/app-type-config.model.ts +0 -14
- package/src/lib/models/app-type.model.ts +0 -5
- package/src/lib/models/create-group-type-config.model.ts +0 -18
- package/src/lib/models/create-group-type.model.ts +0 -46
- package/src/lib/models/feature-permission-id.model.ts +0 -6
- package/src/lib/models/features.model.ts +0 -15
- package/src/lib/models/form-status.model.ts +0 -5
- package/src/lib/models/permission-type.model.ts +0 -9
- package/src/lib/models/role-menu-action.model.ts +0 -5
- package/src/lib/models/role-type.model.ts +0 -34
- package/src/lib/models/roles-and-permissions-table-type.model.ts +0 -5
- package/src/lib/models/roles-and-permissions.model.ts +0 -113
- package/src/lib/models/route-config.model.ts +0 -4
- package/src/lib/models/table-column-schema-view-tenant-list.model.ts +0 -21
- package/src/lib/models/tenant-function-type.model.ts +0 -10
- package/src/lib/models/tenant.model.ts +0 -47
- package/src/lib/models/tenants-permission.model.ts +0 -9
- package/src/lib/models/update-tenant-status.model.ts +0 -12
- package/src/lib/models/view-tenant-group-types.model.ts +0 -34
- package/src/lib/services/tenant-applications.service.spec.ts +0 -1245
- package/src/lib/services/tenant-applications.service.ts +0 -798
- package/src/lib/services/tenant-permissions-map.service.spec.ts +0 -25
- package/src/lib/services/tenant-permissions-map.service.ts +0 -28
- package/src/lib/services/tenant-permissions.service.spec.ts +0 -62
- package/src/lib/services/tenant-permissions.service.ts +0 -49
- package/src/lib/tenant-applications.component.html +0 -0
- package/src/lib/tenant-applications.component.scss +0 -0
- package/src/lib/tenant-applications.component.spec.ts +0 -28
- package/src/lib/tenant-applications.component.ts +0 -12
- package/src/lib/tenant-applications.module.ts +0 -8
- package/tsconfig.lib.json +0 -14
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -14
|
@@ -0,0 +1,804 @@
|
|
|
1
|
+
import { Component, Input, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { AlertType, ModalType } from '@ieeesa-npm/models';
|
|
4
|
+
import { ModalComponent, SlideToggleComponent, AlignType, ModalConfirmationComponent, IconButtonComponent, TableColumnType, AccordionComponent, AccordionDetails, DataTableComponent } from '@ieeesa-npm/presentation';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
7
|
+
import * as screenText from '../../assets/constants.json';
|
|
8
|
+
import { RouterModule } from '@angular/router';
|
|
9
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
10
|
+
import { TenantFunctionType } from '../../models/tenant-function-type.model';
|
|
11
|
+
import { CreateTenantApplicationComponent } from '../create-tenant-application/create-tenant-application.component';
|
|
12
|
+
import { FeaturePermissionId } from '../../models/feature-permission-id.model';
|
|
13
|
+
import { TenantBasicDetailsComponent } from '../tenant-basic-details/tenant-basic-details.component';
|
|
14
|
+
import { PermissionType } from '../../models/permission-type.model';
|
|
15
|
+
import { CreateModifyRoleComponent } from '../create-modify-role/create-modify-role.component';
|
|
16
|
+
import { RoleMenuAction } from '../../models/role-menu-action.model';
|
|
17
|
+
import { RolesAndPermissionsMappingComponent } from '../roles-and-permissions-mapping/roles-and-permissions-mapping.component';
|
|
18
|
+
import { ViewTenantGroupTypesComponent } from '../view-tenant-group-types/view-tenant-group-types.component';
|
|
19
|
+
import { CreateModifyGroupTypeComponent } from '../create-modify-group-type/create-modify-group-type.component';
|
|
20
|
+
import * as i0 from "@angular/core";
|
|
21
|
+
import * as i1 from "@angular/material/dialog";
|
|
22
|
+
import * as i2 from "@ieeesa-npm/presentation";
|
|
23
|
+
import * as i3 from "../../services/tenant-applications.service";
|
|
24
|
+
import * as i4 from "@ieeesa-npm/utility";
|
|
25
|
+
import * as i5 from "@ieeesa-npm/shared";
|
|
26
|
+
import * as i6 from "@angular/router";
|
|
27
|
+
import * as i7 from "@angular/common";
|
|
28
|
+
import * as i8 from "@angular/material/divider";
|
|
29
|
+
import * as i9 from "@angular/material/button";
|
|
30
|
+
export class ViewTenantDetailsComponent {
|
|
31
|
+
constructor(
|
|
32
|
+
// eslint-disable-next-line no-unused-vars
|
|
33
|
+
dialog,
|
|
34
|
+
// eslint-disable-next-line no-unused-vars
|
|
35
|
+
breakpointObserverService,
|
|
36
|
+
// eslint-disable-next-line no-unused-vars
|
|
37
|
+
tenantAppService,
|
|
38
|
+
// eslint-disable-next-line no-unused-vars
|
|
39
|
+
globalErrorHandlerService,
|
|
40
|
+
// eslint-disable-next-line no-unused-vars
|
|
41
|
+
sharedService,
|
|
42
|
+
// eslint-disable-next-line no-unused-vars
|
|
43
|
+
activatedRoute,
|
|
44
|
+
// eslint-disable-next-line no-unused-vars
|
|
45
|
+
authService,
|
|
46
|
+
// eslint-disable-next-line no-unused-vars
|
|
47
|
+
storageService) {
|
|
48
|
+
this.dialog = dialog;
|
|
49
|
+
this.breakpointObserverService = breakpointObserverService;
|
|
50
|
+
this.tenantAppService = tenantAppService;
|
|
51
|
+
this.globalErrorHandlerService = globalErrorHandlerService;
|
|
52
|
+
this.sharedService = sharedService;
|
|
53
|
+
this.activatedRoute = activatedRoute;
|
|
54
|
+
this.authService = authService;
|
|
55
|
+
this.storageService = storageService;
|
|
56
|
+
this.destroy$ = new Subject();
|
|
57
|
+
this.isMobileView = false;
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
+
this.constants = screenText;
|
|
60
|
+
this.tenantLabels = this.constants?.viewTenants?.label;
|
|
61
|
+
this.slideToggleOption = {
|
|
62
|
+
id: 1,
|
|
63
|
+
label: this.constants?.viewTenants?.label?.active,
|
|
64
|
+
checked: true,
|
|
65
|
+
disabled: false,
|
|
66
|
+
};
|
|
67
|
+
this.editButton = this.constants?.viewTenants?.buttons;
|
|
68
|
+
this.accordionInfoList = JSON.parse(JSON.stringify(this.constants?.viewTenants?.tenantAccordionInfo));
|
|
69
|
+
this.appId = '';
|
|
70
|
+
this.iconSize = this.constants?.viewRolesAndPermissions?.columnActionIconSize;
|
|
71
|
+
this.rolesAndPermissionsTableCaption = this.constants?.viewRolesAndPermissions?.tableCaption;
|
|
72
|
+
this.rolesAndPermissionsTableHeaderName = this.constants?.viewRolesAndPermissions?.tableColumnsHeaderText;
|
|
73
|
+
this.rolesAndPermissionsTableSupportMessage = this.constants?.viewRolesAndPermissions?.scrollbarSupportMessage;
|
|
74
|
+
this.permissionsColumnClassNumber = 1;
|
|
75
|
+
this.menuItems = this.constants?.viewRolesAndPermissions?.columnActionMenuItems;
|
|
76
|
+
this.columnSchema = [];
|
|
77
|
+
this.tableData = [];
|
|
78
|
+
this.isRolesAndPermissionsExpanded = false;
|
|
79
|
+
this.paginatorConfig = {
|
|
80
|
+
recordsPerPage: this.constants?.viewRolesAndPermissions?.pageSizeOptions[0],
|
|
81
|
+
pageSizeOptions: this.constants?.viewRolesAndPermissions?.pageSizeOptions,
|
|
82
|
+
totalRecords: 0,
|
|
83
|
+
};
|
|
84
|
+
this.rolesAndPermissionsClassName = '.ieeesa-view-tenant-info__roles-and-permissions';
|
|
85
|
+
this.headerElementClassName = '.ieeesa-header';
|
|
86
|
+
this.tableActions = {
|
|
87
|
+
isPaginationNeeded: true,
|
|
88
|
+
};
|
|
89
|
+
this.accordionDetails = AccordionDetails;
|
|
90
|
+
this.isBasicDetailsExpanded = false;
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
this.createGroupTypeScreenTexts = this.constants?.createGroupType;
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
94
|
+
this.editTenantScreenTexts = this.constants?.editTenant;
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
|
+
this.deleteRoleScreenTexts = this.constants?.deleteRole;
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
this.mapRolesAndPermissionsScreenTexts = this.constants?.mapRolesAndPermissions;
|
|
99
|
+
this.alignmentType = AlignType;
|
|
100
|
+
this.permissionType = PermissionType;
|
|
101
|
+
this.createRoleScreenTexts = this.constants?.createRole;
|
|
102
|
+
this.selectedRoleInfo = {
|
|
103
|
+
roleId: '',
|
|
104
|
+
roleName: '',
|
|
105
|
+
};
|
|
106
|
+
this.isGroupTypesExpanded = false;
|
|
107
|
+
this.roleTypeOptions = [];
|
|
108
|
+
/** Feature ids captured before the edit dialog opens, used to detect a feature list change on save. */
|
|
109
|
+
this.featureIdsBeforeEdit = [];
|
|
110
|
+
this.breakpointObserverService
|
|
111
|
+
.getBreakpoint()
|
|
112
|
+
.pipe(takeUntil(this.destroy$))
|
|
113
|
+
.subscribe((result) => {
|
|
114
|
+
this.isMobileView = result?.matches;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Initializes view tenant details component.
|
|
119
|
+
* @return -returns nothing
|
|
120
|
+
* @memberof ViewTenantDetailsComponent
|
|
121
|
+
*/
|
|
122
|
+
ngOnInit() {
|
|
123
|
+
this.tenantDetails =
|
|
124
|
+
this.tenantAppService?.getSelectedTenantInformation();
|
|
125
|
+
this.slideToggleOption.checked = this.tenantDetails?.status;
|
|
126
|
+
this.slideToggleOption.label = this.tenantDetails?.status
|
|
127
|
+
? this.tenantLabels?.active
|
|
128
|
+
: this.tenantLabels?.inactive;
|
|
129
|
+
this.routePaths = this.routePaths ?? this.constants?.routeConfigPath;
|
|
130
|
+
this.viewTenantsRouteUrl = `/${this.routePaths?.viewTenants}`;
|
|
131
|
+
this.tenantAppService?.setAppConfig(this.apiBaseURL, this.userPermissions);
|
|
132
|
+
this.userTenantsPermissions = this.tenantAppService?.filterPermission(this.userPermissions);
|
|
133
|
+
this.appId = this.tenantAppService.getSelectedTenantInformation()
|
|
134
|
+
?.appId;
|
|
135
|
+
this.tablePagination = {
|
|
136
|
+
offset: 0,
|
|
137
|
+
pageSize: this.paginatorConfig.pageSizeOptions[0],
|
|
138
|
+
};
|
|
139
|
+
this.getApplicationTypes();
|
|
140
|
+
this.activatedRoute?.queryParams
|
|
141
|
+
?.pipe(takeUntil(this.destroy$))
|
|
142
|
+
?.subscribe((params) => {
|
|
143
|
+
this.appId = params['id'];
|
|
144
|
+
this.getTenantDetails(this.appId);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Gets the selected tenant details from server.
|
|
149
|
+
* @memberof ViewTenantDetailsComponent
|
|
150
|
+
*/
|
|
151
|
+
getTenantDetails(appId) {
|
|
152
|
+
this.tenantAppService
|
|
153
|
+
.getTenantDetails(appId)
|
|
154
|
+
.pipe(takeUntil(this.destroy$))
|
|
155
|
+
.subscribe({
|
|
156
|
+
next: (response) => {
|
|
157
|
+
if (response?.status) {
|
|
158
|
+
this.tenantDetails = response?.body;
|
|
159
|
+
this.tenantAppService.setSelectedTenantInformation(this.tenantDetails);
|
|
160
|
+
this.slideToggleOption.checked = this.tenantDetails
|
|
161
|
+
.status;
|
|
162
|
+
this.slideToggleOption.label = this.tenantDetails.status
|
|
163
|
+
? this.tenantLabels?.active
|
|
164
|
+
: this.tenantLabels?.inactive;
|
|
165
|
+
const features = this.tenantDetails.features;
|
|
166
|
+
features.map((feature) => {
|
|
167
|
+
if (feature?.featureId ===
|
|
168
|
+
FeaturePermissionId.MEETINGS_AND_EVENTS ||
|
|
169
|
+
feature?.featureId === FeaturePermissionId.BALLOTS)
|
|
170
|
+
this.accordionInfoList.push({
|
|
171
|
+
id: this.accordionInfoList.length + 1,
|
|
172
|
+
isDisabled: false,
|
|
173
|
+
title: feature?.featureName,
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
error: (error) => {
|
|
179
|
+
this.sharedService.handleErrors(error, this.constants?.viewTenants.errors);
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Display the corresponding tenant basic or feature details based on selected accordion.
|
|
185
|
+
* @param {AccordionInfo} accordionInfo
|
|
186
|
+
* @param {boolean} expanded
|
|
187
|
+
* @memberof ViewTenantDetailsComponent
|
|
188
|
+
*/
|
|
189
|
+
showTenantDetails(accordionInfo, expanded) {
|
|
190
|
+
const accordionId = accordionInfo.id;
|
|
191
|
+
switch (accordionId) {
|
|
192
|
+
case 1: {
|
|
193
|
+
this.isBasicDetailsExpanded = expanded;
|
|
194
|
+
if (expanded) {
|
|
195
|
+
this.getApplicationTypes();
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case 2: {
|
|
200
|
+
this.isRolesAndPermissionsExpanded = expanded;
|
|
201
|
+
if (expanded) {
|
|
202
|
+
this.columnSchema = [];
|
|
203
|
+
this.paginatorConfig.recordsPerPage =
|
|
204
|
+
this.constants?.viewRolesAndPermissions?.pageSizeOptions[0];
|
|
205
|
+
this.tablePagination.offset = 0;
|
|
206
|
+
this.tablePagination.pageSize = this.paginatorConfig.recordsPerPage;
|
|
207
|
+
this.getRolesAndInitializeTableSchema();
|
|
208
|
+
}
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case 3: {
|
|
212
|
+
this.isGroupTypesExpanded = expanded;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Fetches the configured roles of the selected tenant and creates the column schema.
|
|
219
|
+
* @memberof ViewTenantDetailsComponent
|
|
220
|
+
*/
|
|
221
|
+
getRolesAndInitializeTableSchema() {
|
|
222
|
+
this.tenantAppService
|
|
223
|
+
.getRoles(this.appId)
|
|
224
|
+
.pipe(takeUntil(this.destroy$))
|
|
225
|
+
.subscribe({
|
|
226
|
+
next: (response) => {
|
|
227
|
+
if (response?.status) {
|
|
228
|
+
this.getRolesAndPermissionsAndInitializeTableView({
|
|
229
|
+
payload: {
|
|
230
|
+
offset: this.tablePagination.offset,
|
|
231
|
+
pageSize: this.tablePagination.pageSize,
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
const rolesList = this.tenantAppService.sortRolesByRoleType(response?.body);
|
|
235
|
+
this.tenantAppService.setRolesInfo(rolesList);
|
|
236
|
+
const cellValue = this.constants.viewRolesAndPermissions.tableCellValue;
|
|
237
|
+
this.columnSchema = [
|
|
238
|
+
{
|
|
239
|
+
id: 0,
|
|
240
|
+
columnDef: 'permissions',
|
|
241
|
+
heading: this.constants.viewRolesAndPermissions.tableColumn
|
|
242
|
+
.permissions,
|
|
243
|
+
columnType: TableColumnType.TEXT,
|
|
244
|
+
cellData: (rolesAndPermissions) => rolesAndPermissions.permission,
|
|
245
|
+
isStickyColumn: true,
|
|
246
|
+
},
|
|
247
|
+
];
|
|
248
|
+
rolesList.map((role, index) => {
|
|
249
|
+
this.columnSchema.push({
|
|
250
|
+
id: index + 1,
|
|
251
|
+
columnDef: role.roleId,
|
|
252
|
+
heading: role.roleName,
|
|
253
|
+
columnType: TableColumnType.TEXT,
|
|
254
|
+
hasColumnActions: true,
|
|
255
|
+
cellData: (rolesAndPermissions) => {
|
|
256
|
+
return rolesAndPermissions.roleIdsList.find((roleId) => role.roleId === roleId)
|
|
257
|
+
? cellValue.yes
|
|
258
|
+
: cellValue.no;
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
error: (error) => {
|
|
265
|
+
this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Fetches the roles and permissions mappings for the selected tenant and and initialize table view.
|
|
271
|
+
* @param {GetRolesAndPermissionsPayload} payload
|
|
272
|
+
* @memberof ViewTenantDetailsComponent
|
|
273
|
+
*/
|
|
274
|
+
getRolesAndPermissionsAndInitializeTableView(payload) {
|
|
275
|
+
this.tenantAppService
|
|
276
|
+
.getRolesAndPermissionsMappings(this.appId, payload)
|
|
277
|
+
.pipe(takeUntil(this.destroy$))
|
|
278
|
+
.subscribe({
|
|
279
|
+
next: (response) => {
|
|
280
|
+
if (response?.status) {
|
|
281
|
+
this.tableData = [];
|
|
282
|
+
this.paginatorConfig.totalRecords = response?.body
|
|
283
|
+
?.totalRecords;
|
|
284
|
+
const rolesAndPermissionsList = response?.body
|
|
285
|
+
?.rolePermissionDetails;
|
|
286
|
+
rolesAndPermissionsList.map((permission) => {
|
|
287
|
+
let roleIdsList = [];
|
|
288
|
+
roleIdsList = permission.roleList.map((role) => role.roleId);
|
|
289
|
+
this.tableData.push({
|
|
290
|
+
permission: permission.permissionName,
|
|
291
|
+
roleIdsList: roleIdsList,
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
error: (error) => {
|
|
297
|
+
this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Fetch the roles and permissions records based on offset and page size while the pagination changes.
|
|
303
|
+
* @param {PageEvent} pageEvent
|
|
304
|
+
* @memberof ViewTenantDetailsComponent
|
|
305
|
+
*/
|
|
306
|
+
onTablePaginationChange(pageEvent) {
|
|
307
|
+
this.tablePagination = {
|
|
308
|
+
offset: pageEvent.pageIndex,
|
|
309
|
+
pageSize: pageEvent.pageSize,
|
|
310
|
+
};
|
|
311
|
+
this.getRolesAndPermissionsAndInitializeTableView({
|
|
312
|
+
payload: {
|
|
313
|
+
offset: pageEvent.pageIndex,
|
|
314
|
+
pageSize: pageEvent.pageSize,
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Captures the selected role's information and performs edit or delete action basis on the selected menu item.
|
|
320
|
+
* @param {TableColumnMenuInfo} roleMenuInfo
|
|
321
|
+
* @memberof ViewTenantDetailsComponent
|
|
322
|
+
*/
|
|
323
|
+
onRoleMenuClick(roleMenuInfo) {
|
|
324
|
+
this.selectedRoleInfo.roleId = roleMenuInfo?.tableColumnInfo?.columnDef;
|
|
325
|
+
this.selectedRoleInfo.roleName = roleMenuInfo?.tableColumnInfo?.heading;
|
|
326
|
+
this.tenantAppService?.setSelectedRoleInformation(this.selectedRoleInfo);
|
|
327
|
+
if (roleMenuInfo?.menuActionInfo?.id === RoleMenuAction.DELETE_ROLE) {
|
|
328
|
+
this.openDeleteRoleModal();
|
|
329
|
+
}
|
|
330
|
+
else if (roleMenuInfo?.menuActionInfo?.id === RoleMenuAction.EDIT_ROLE) {
|
|
331
|
+
this.openEditRoleForm();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Keeps track of the accordion based on the element's ID in DOM tree.
|
|
336
|
+
* @memberof ViewTenantDetailsComponent
|
|
337
|
+
*/
|
|
338
|
+
trackByAccordionFn(index, item) {
|
|
339
|
+
return item?.id;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Gets the role types and updates the form control.
|
|
343
|
+
* @memberof ViewTenantDetailsComponent
|
|
344
|
+
*/
|
|
345
|
+
getRoleTypes() {
|
|
346
|
+
const payload = {
|
|
347
|
+
payload: {
|
|
348
|
+
appId: this.tenantDetails?.appId,
|
|
349
|
+
configFieldName: 'role_type',
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
this.tenantAppService
|
|
353
|
+
.getRoleTypes(payload)
|
|
354
|
+
.pipe(takeUntil(this.destroy$))
|
|
355
|
+
.subscribe({
|
|
356
|
+
next: (response) => {
|
|
357
|
+
if (response?.status) {
|
|
358
|
+
this.roleTypeOptions = this.tenantAppService.getRoleTypeOptions(response?.body);
|
|
359
|
+
this.tenantAppService?.setRoleTypeOption(this.roleTypeOptions);
|
|
360
|
+
if (this.functionType === TenantFunctionType.CREATE_ROLE) {
|
|
361
|
+
this.openCreateRoleForm();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
},
|
|
365
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
366
|
+
error: (error) => {
|
|
367
|
+
this.sharedService.handleErrors(error, this.createRoleScreenTexts?.errors);
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Sets the dialog options for create role modal and calls openModal method.
|
|
373
|
+
* @return -returns nothing
|
|
374
|
+
* @memberof ViewTenantDetailsComponent
|
|
375
|
+
*/
|
|
376
|
+
openCreateRoleForm() {
|
|
377
|
+
this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.CREATE_ROLE);
|
|
378
|
+
this.functionType = TenantFunctionType.CREATE_ROLE;
|
|
379
|
+
if (this.roleTypeOptions.length > 0) {
|
|
380
|
+
const dialogOptions = {
|
|
381
|
+
heading: this.constants?.createRole?.heading,
|
|
382
|
+
isCloseNeeded: true,
|
|
383
|
+
componentReference: CreateModifyRoleComponent,
|
|
384
|
+
modalType: ModalType.FORM,
|
|
385
|
+
};
|
|
386
|
+
this.openModal(dialogOptions, 'ieeesa-create-modify-role');
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
this.getRoleTypes();
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Sets the dialog options for create group type modal and calls openModal method.
|
|
394
|
+
* @return -returns nothing
|
|
395
|
+
* @memberof ViewTenantDetailsComponent
|
|
396
|
+
*/
|
|
397
|
+
openCreateGroupTypeForm() {
|
|
398
|
+
this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.CREATE_GROUP_TYPE);
|
|
399
|
+
this.functionType = TenantFunctionType.CREATE_GROUP_TYPE;
|
|
400
|
+
const dialogOptions = {
|
|
401
|
+
heading: this.constants?.createGroupType?.heading,
|
|
402
|
+
isCloseNeeded: true,
|
|
403
|
+
componentReference: CreateModifyGroupTypeComponent,
|
|
404
|
+
modalType: ModalType.FORM,
|
|
405
|
+
};
|
|
406
|
+
this.openModal(dialogOptions, 'ieeesa-create-modify-group-type');
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Sets the dialog options for edit role modal and calls openModal method.
|
|
410
|
+
* @return -returns nothing
|
|
411
|
+
* @memberof ViewTenantDetailsComponent
|
|
412
|
+
*/
|
|
413
|
+
openEditRoleForm() {
|
|
414
|
+
this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.EDIT_ROLE);
|
|
415
|
+
this.functionType = TenantFunctionType.EDIT_ROLE;
|
|
416
|
+
const dialogOptions = {
|
|
417
|
+
heading: this.selectedRoleInfo?.roleName,
|
|
418
|
+
isCloseNeeded: true,
|
|
419
|
+
componentReference: CreateModifyRoleComponent,
|
|
420
|
+
modalType: ModalType.FORM,
|
|
421
|
+
};
|
|
422
|
+
this.openModal(dialogOptions, 'ieeesa-create-modify-role');
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Sets the dialog options for edit tenant modal and calls openModal method.
|
|
426
|
+
* @return -returns nothing
|
|
427
|
+
* @memberof ViewTenantDetailsComponent
|
|
428
|
+
*/
|
|
429
|
+
openEditTenantForm() {
|
|
430
|
+
this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.EDIT);
|
|
431
|
+
this.functionType = TenantFunctionType.EDIT;
|
|
432
|
+
this.featureIdsBeforeEdit = this.getFeatureIds(this.tenantDetails);
|
|
433
|
+
const dialogOptions = {
|
|
434
|
+
heading: this.tenantDetails?.appTitle,
|
|
435
|
+
isCloseNeeded: true,
|
|
436
|
+
componentReference: CreateTenantApplicationComponent,
|
|
437
|
+
modalType: ModalType.FORM,
|
|
438
|
+
};
|
|
439
|
+
this.openModal(dialogOptions, 'ieeesa-edit-tenant');
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Opens modal component with received params and handles form submission success and errors.
|
|
443
|
+
* @param {*} dialogOptions
|
|
444
|
+
* @param {string} [className]
|
|
445
|
+
* @return -returns nothing
|
|
446
|
+
* @memberof ViewTenantsDetailsComponent
|
|
447
|
+
*/
|
|
448
|
+
openModal(
|
|
449
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
450
|
+
dialogOptions, className) {
|
|
451
|
+
className = className ?? '';
|
|
452
|
+
this.dialogRef = this.dialog?.open(ModalComponent, {
|
|
453
|
+
data: dialogOptions,
|
|
454
|
+
width: '',
|
|
455
|
+
panelClass: ['ieeesa-modal-dialog', className],
|
|
456
|
+
ariaModal: true,
|
|
457
|
+
});
|
|
458
|
+
this.dialogRef?.componentInstance?.submitFormResponse
|
|
459
|
+
.pipe(takeUntil(this.destroy$))
|
|
460
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, no-unused-vars
|
|
461
|
+
.subscribe((result) => {
|
|
462
|
+
this.dialogRef?.close();
|
|
463
|
+
switch (this.functionType) {
|
|
464
|
+
case TenantFunctionType?.EDIT: {
|
|
465
|
+
this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${this.tenantDetails?.appTitle} ${this.editTenantScreenTexts?.message?.success?.submission}`);
|
|
466
|
+
this.tenantDetails = {
|
|
467
|
+
...this.tenantAppService.getSelectedTenantInformation(),
|
|
468
|
+
};
|
|
469
|
+
this.promptReSignInIfFeaturesChanged();
|
|
470
|
+
break;
|
|
471
|
+
}
|
|
472
|
+
case TenantFunctionType?.CREATE_ROLE: {
|
|
473
|
+
const promptMessage = this.createRoleScreenTexts?.message?.success;
|
|
474
|
+
const roleInfo = this.tenantAppService?.getNewlyCreatedRoleInfo();
|
|
475
|
+
this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${promptMessage?.submission1} ${roleInfo?.roleName} ${promptMessage?.submission2} ${this.tenantDetails?.appTitle}. ${promptMessage?.submission3}`);
|
|
476
|
+
this.getRolesAndInitializeTableSchema();
|
|
477
|
+
break;
|
|
478
|
+
}
|
|
479
|
+
case TenantFunctionType?.EDIT_ROLE: {
|
|
480
|
+
const promptMessage = this.createRoleScreenTexts?.message?.success;
|
|
481
|
+
const roleInfo = this.tenantAppService?.getNewlyCreatedRoleInfo();
|
|
482
|
+
this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${roleInfo?.roleName} ${promptMessage?.modify} ${this.tenantDetails?.appTitle}.`);
|
|
483
|
+
this.getRolesAndInitializeTableSchema();
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
case TenantFunctionType?.CREATE_GROUP_TYPE: {
|
|
487
|
+
this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${this.createGroupTypeScreenTexts?.message?.success?.submissionPart1} ${this.tenantAppService.newlyCreatedGroupType.configFieldValue.name} ${this.createGroupTypeScreenTexts?.message?.success?.submissionPart2} ${this.tenantDetails?.appTitle}. `);
|
|
488
|
+
this.tenantAppService.isGroupTypeAddedOrModified.next(true);
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
this.dialogRef?.componentInstance?.formCancel
|
|
494
|
+
.pipe(takeUntil(this.destroy$))
|
|
495
|
+
.subscribe(() => {
|
|
496
|
+
this.dialogRef?.close();
|
|
497
|
+
if (this.tenantAppService.getTenantFunctionType() ===
|
|
498
|
+
TenantFunctionType.MAP_PERMISSION_AND_ROLE)
|
|
499
|
+
this.getRolesAndInitializeTableSchema();
|
|
500
|
+
});
|
|
501
|
+
this.dialogRef?.componentInstance?.modalConfirm
|
|
502
|
+
.pipe(takeUntil(this.destroy$))
|
|
503
|
+
.subscribe(() => {
|
|
504
|
+
if (this.tenantAppService.getTenantFunctionType() ===
|
|
505
|
+
TenantFunctionType.MAP_PERMISSION_AND_ROLE)
|
|
506
|
+
this.getRolesAndInitializeTableSchema();
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Calls openTenantStatusConfirmationModal to change the status of tenant on slide toggle change.
|
|
511
|
+
* @param {SlideToggleOption} slideToggleOption
|
|
512
|
+
* @memberof ViewTenantDetailsComponent
|
|
513
|
+
*/
|
|
514
|
+
onSlideToggleChange(slideToggleOption) {
|
|
515
|
+
this.openTenantStatusConfirmationModal(slideToggleOption?.checked);
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Opens the confirmation modal to inactivate/reactivate the tenant.
|
|
519
|
+
* @param {boolean} isActivate
|
|
520
|
+
* @memberof ViewTenantDetailsComponent
|
|
521
|
+
*/
|
|
522
|
+
openTenantStatusConfirmationModal(isActivate) {
|
|
523
|
+
const confirmationInfo = this.constants?.viewTenants?.confirmationInfo;
|
|
524
|
+
const statusText = isActivate
|
|
525
|
+
? confirmationInfo?.promptMessageActivate
|
|
526
|
+
: confirmationInfo?.promptMessageInactivate;
|
|
527
|
+
const updateTenantStatusModalOptions = {
|
|
528
|
+
leftButtonLabel: confirmationInfo?.leftButtonLabel,
|
|
529
|
+
rightButtonLabel: confirmationInfo?.rightButtonLabel,
|
|
530
|
+
promptMessage: `${confirmationInfo?.promptMessage} ${statusText} ${this.tenantDetails?.appTitle}?`,
|
|
531
|
+
actionButtonAlign: this.alignmentType?.MIDDLE,
|
|
532
|
+
};
|
|
533
|
+
this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {
|
|
534
|
+
data: updateTenantStatusModalOptions,
|
|
535
|
+
width: 'auto',
|
|
536
|
+
autoFocus: 'dialog',
|
|
537
|
+
ariaLabel: confirmationInfo?.ariaLabel?.alert,
|
|
538
|
+
});
|
|
539
|
+
this.dialogRef
|
|
540
|
+
.afterClosed()
|
|
541
|
+
.pipe(takeUntil(this.destroy$))
|
|
542
|
+
.subscribe((result) => {
|
|
543
|
+
if (result) {
|
|
544
|
+
this.updateTenantStatus(isActivate);
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
this.setSlideToggleStatus(isActivate);
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Opens the map permissions and roles modal.
|
|
553
|
+
* @memberof ViewTenantDetailsComponent
|
|
554
|
+
* @returns {void}
|
|
555
|
+
*/
|
|
556
|
+
openMapRolesAndPermissionsForm() {
|
|
557
|
+
this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.MAP_PERMISSION_AND_ROLE);
|
|
558
|
+
const dialogOptions = {
|
|
559
|
+
heading: this.mapRolesAndPermissionsScreenTexts.heading,
|
|
560
|
+
isCloseNeeded: true,
|
|
561
|
+
modalType: ModalType.FORM,
|
|
562
|
+
componentReference: RolesAndPermissionsMappingComponent,
|
|
563
|
+
};
|
|
564
|
+
this.openModal(dialogOptions, 'ieeesa-map-permissions-and-roles');
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Updates the tenant status to the server using http request and display success/error message based on request response (success or failure).
|
|
568
|
+
* @param {boolean} isActivate
|
|
569
|
+
* @memberof ViewTenantDetailsComponent
|
|
570
|
+
*/
|
|
571
|
+
updateTenantStatus(isActivate) {
|
|
572
|
+
const updateTenantStatusRequestPayload = {
|
|
573
|
+
payload: {
|
|
574
|
+
appId: this.tenantDetails?.appId,
|
|
575
|
+
status: isActivate,
|
|
576
|
+
},
|
|
577
|
+
};
|
|
578
|
+
this.tenantAppService
|
|
579
|
+
.updateTenantStatus(updateTenantStatusRequestPayload)
|
|
580
|
+
.pipe(takeUntil(this.destroy$))
|
|
581
|
+
.subscribe({
|
|
582
|
+
next: (res) => {
|
|
583
|
+
this.dialogRef?.close();
|
|
584
|
+
if (res?.status) {
|
|
585
|
+
this.slideToggleOption.label = isActivate
|
|
586
|
+
? this.tenantLabels?.active
|
|
587
|
+
: this.tenantLabels?.inactive;
|
|
588
|
+
this.tenantDetails.status = isActivate;
|
|
589
|
+
this.tenantDetails = Object.assign({}, this.tenantDetails);
|
|
590
|
+
}
|
|
591
|
+
},
|
|
592
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
593
|
+
error: (error) => {
|
|
594
|
+
this.setSlideToggleStatus(isActivate);
|
|
595
|
+
this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
|
|
596
|
+
},
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Sets slide toggle checked status and label.
|
|
601
|
+
* @param {boolean} isActivate
|
|
602
|
+
* @memberof ViewTenantDetailsComponent
|
|
603
|
+
*/
|
|
604
|
+
setSlideToggleStatus(isActivate) {
|
|
605
|
+
this.slideToggleOption.checked = !isActivate;
|
|
606
|
+
this.slideToggleOption.label = !isActivate
|
|
607
|
+
? this.tenantLabels?.active
|
|
608
|
+
: this.tenantLabels?.inactive;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Gets the application/tenant types.
|
|
612
|
+
* @memberof ViewTenantDetailsComponent
|
|
613
|
+
*/
|
|
614
|
+
getApplicationTypes() {
|
|
615
|
+
this.tenantAppService
|
|
616
|
+
.getApplicationTypes()
|
|
617
|
+
.pipe(takeUntil(this.destroy$))
|
|
618
|
+
.subscribe({
|
|
619
|
+
next: (response) => {
|
|
620
|
+
if (response?.status) {
|
|
621
|
+
this.appTypeOptions =
|
|
622
|
+
this.tenantAppService.getApplicationTypeOptions(response?.body);
|
|
623
|
+
this.tenantAppService.setApplicationType(this.appTypeOptions);
|
|
624
|
+
}
|
|
625
|
+
},
|
|
626
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
627
|
+
error: (error) => {
|
|
628
|
+
this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
|
|
629
|
+
},
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
/**
|
|
633
|
+
* Validates permission based access for provided feature.
|
|
634
|
+
* @param {PermissionType} permissionType
|
|
635
|
+
* @return {boolean}
|
|
636
|
+
* @memberof ViewTenantDetailsComponent
|
|
637
|
+
*/
|
|
638
|
+
validateAccess(permissionType) {
|
|
639
|
+
return this.tenantAppService.validateAccess(permissionType, this.userTenantsPermissions);
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Posts the details of the role to be deleted to the server using http request and display success/error message based on request response (success or failure).
|
|
643
|
+
* @memberof ViewTenantDetailsComponent
|
|
644
|
+
*/
|
|
645
|
+
deleteRole() {
|
|
646
|
+
const deleteRoleRequestPayload = {
|
|
647
|
+
payload: {
|
|
648
|
+
appId: this.tenantDetails?.appId,
|
|
649
|
+
roleId: this.selectedRoleInfo?.roleId,
|
|
650
|
+
},
|
|
651
|
+
};
|
|
652
|
+
this.tenantAppService
|
|
653
|
+
.deleteRole(deleteRoleRequestPayload)
|
|
654
|
+
.pipe(takeUntil(this.destroy$))
|
|
655
|
+
.subscribe({
|
|
656
|
+
next: (res) => {
|
|
657
|
+
if (res?.status) {
|
|
658
|
+
this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${this.selectedRoleInfo?.roleName} ${this.deleteRoleScreenTexts?.message?.success?.submission} ${this.tenantDetails?.appTitle}.`);
|
|
659
|
+
this.getRolesAndInitializeTableSchema();
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
663
|
+
error: (error) => {
|
|
664
|
+
this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
|
|
665
|
+
},
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Sets the role menu HTMLElement.
|
|
670
|
+
* @param {HTMLElement} menuButton
|
|
671
|
+
* @memberof ViewTenantDetailsComponent
|
|
672
|
+
*/
|
|
673
|
+
selectedRoleMenuElement(menuButton) {
|
|
674
|
+
this.roleMenuElement = menuButton;
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Opens the confirmation modal to get user confirmation to delete the role.
|
|
678
|
+
* @memberof ViewTenantDetailsComponent
|
|
679
|
+
*/
|
|
680
|
+
openDeleteRoleModal() {
|
|
681
|
+
const confirmationInfo = this.constants?.viewTenants?.confirmationInfo;
|
|
682
|
+
const deleteRoleModalOptions = {
|
|
683
|
+
leftButtonLabel: confirmationInfo?.leftButtonLabel,
|
|
684
|
+
rightButtonLabel: confirmationInfo?.rightButtonLabel,
|
|
685
|
+
promptMessage: `${confirmationInfo?.deleteRoleConfirmationMessage} ${this.selectedRoleInfo?.roleName}? ${confirmationInfo?.deleteRolePromptMessage} ${this.tenantDetails?.appTitle}.`,
|
|
686
|
+
actionButtonAlign: this.alignmentType?.MIDDLE,
|
|
687
|
+
};
|
|
688
|
+
this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {
|
|
689
|
+
data: deleteRoleModalOptions,
|
|
690
|
+
width: '25%',
|
|
691
|
+
panelClass: [
|
|
692
|
+
'ieeesa-modal-confirm-dialog',
|
|
693
|
+
'ieeesa-delete-role-confirm-dialog',
|
|
694
|
+
],
|
|
695
|
+
autoFocus: 'dialog',
|
|
696
|
+
ariaLabel: confirmationInfo?.ariaLabel?.alert,
|
|
697
|
+
});
|
|
698
|
+
this.dialogRef
|
|
699
|
+
.afterClosed()
|
|
700
|
+
.pipe(takeUntil(this.destroy$))
|
|
701
|
+
.subscribe((result) => {
|
|
702
|
+
if (result) {
|
|
703
|
+
this.deleteRole();
|
|
704
|
+
}
|
|
705
|
+
else
|
|
706
|
+
this.roleMenuElement?.focus();
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* Returns the feature ids of the given tenant.
|
|
711
|
+
* @param {TenantBasicInfo} [tenant]
|
|
712
|
+
* @return {string[]}
|
|
713
|
+
* @memberof ViewTenantDetailsComponent
|
|
714
|
+
*/
|
|
715
|
+
getFeatureIds(tenant) {
|
|
716
|
+
return (tenant?.features ?? [])
|
|
717
|
+
.map((feature) => feature?.featureId)
|
|
718
|
+
.filter(Boolean)
|
|
719
|
+
.sort();
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Opens the re-sign-in confirmation modal when the tenant feature list changed on save, since
|
|
723
|
+
* feature flags are only refreshed at login. Emits signOutRequested when the user confirms.
|
|
724
|
+
* @memberof ViewTenantDetailsComponent
|
|
725
|
+
*/
|
|
726
|
+
promptReSignInIfFeaturesChanged() {
|
|
727
|
+
const featureIdsAfterEdit = this.getFeatureIds(this.tenantDetails);
|
|
728
|
+
if (featureIdsAfterEdit.join(',') === this.featureIdsBeforeEdit.join(',')) {
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
const confirmationInfo = this.constants?.viewTenants?.confirmationInfo;
|
|
732
|
+
this.dialog
|
|
733
|
+
?.open(ModalConfirmationComponent, {
|
|
734
|
+
data: {
|
|
735
|
+
leftButtonLabel: confirmationInfo?.featureChangeSignOutLeftButtonLabel,
|
|
736
|
+
rightButtonLabel: confirmationInfo?.featureChangeSignOutRightButtonLabel,
|
|
737
|
+
promptMessage: confirmationInfo?.featureChangeSignOutMessage,
|
|
738
|
+
actionButtonAlign: this.alignmentType?.MIDDLE,
|
|
739
|
+
},
|
|
740
|
+
width: '25%',
|
|
741
|
+
panelClass: [
|
|
742
|
+
'ieeesa-modal-confirm-dialog',
|
|
743
|
+
'ieeesa-feature-change-sign-out-dialog',
|
|
744
|
+
],
|
|
745
|
+
autoFocus: 'dialog',
|
|
746
|
+
ariaLabel: confirmationInfo?.ariaLabel?.alert,
|
|
747
|
+
})
|
|
748
|
+
.afterClosed()
|
|
749
|
+
.pipe(takeUntil(this.destroy$))
|
|
750
|
+
.subscribe((isSignOutConfirmed) => {
|
|
751
|
+
if (isSignOutConfirmed) {
|
|
752
|
+
this.signOut();
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
/**
|
|
757
|
+
* Clears the session and redirects to the SSO sign-out URL, mirroring the header sign-out.
|
|
758
|
+
* @memberof ViewTenantDetailsComponent
|
|
759
|
+
*/
|
|
760
|
+
signOut() {
|
|
761
|
+
if (!this.signOutConfig?.ssoSignOutUrl) {
|
|
762
|
+
return;
|
|
763
|
+
}
|
|
764
|
+
this.authService?.deleteCookie(this.signOutConfig?.cookieName);
|
|
765
|
+
this.storageService?.clearStorage();
|
|
766
|
+
window.location.href = this.signOutConfig.ssoSignOutUrl;
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.
|
|
770
|
+
* @memberof ViewTenantDetailsComponent
|
|
771
|
+
*/
|
|
772
|
+
ngOnDestroy() {
|
|
773
|
+
this.roleTypeOptions = [];
|
|
774
|
+
this.tenantAppService?.setRoleTypeOption(this.roleTypeOptions);
|
|
775
|
+
this.destroy$?.next(true);
|
|
776
|
+
this.destroy$?.unsubscribe();
|
|
777
|
+
}
|
|
778
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewTenantDetailsComponent, deps: [{ token: i1.MatDialog }, { token: i2.BreakpointObserverService }, { token: i3.TenantApplicationsService }, { token: i4.GlobalErrorHandlerService }, { token: i5.SharedService }, { token: i6.ActivatedRoute }, { token: i4.AuthService }, { token: i4.StorageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
779
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ViewTenantDetailsComponent, isStandalone: true, selector: "ieeesa-view-tenant-details", inputs: { apiBaseURL: "apiBaseURL", userPermissions: "userPermissions", routePaths: "routePaths", signOutConfig: "signOutConfig" }, ngImport: i0, template: "<div\r\n class=\"ieeesa-view-tenant-info px-4 pb-4\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--bg-white'\r\n : 'ieeesa-view-tenant-info--bg-blue'\r\n \"\r\n>\r\n <div\r\n class=\"d-flex justify-content-between gap-lg-4 gap-md-3 gap-sm-2 gap-3\"\r\n [ngClass]=\"isMobileView ? 'flex-column gap-2 pb-3' : 'align-item-center'\"\r\n >\r\n <div\r\n class=\"d-flex gap-lg-4 gap-md-3 gap-sm-3 gap-3 ps-0 align-items-md-center align-items-xl-center\"\r\n [ngClass]=\"isMobileView ? 'flex-column' : ''\"\r\n >\r\n <p\r\n class=\"mb-0 ieeesa-headline-lg-32 py-3\"\r\n [ngClass]=\"isMobileView ? '' : 'ieeesa-view-tenant-info--title'\"\r\n >\r\n {{ tenantDetails?.appTitle }}\r\n </p>\r\n <div class=\"d-flex gap-lg-2 gap-md-2 gap-sm-2 gap-2\">\r\n <span\r\n class=\"mb-0 ieeesa-title-sm-14 mt-1\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'ieeesa-view-tenant-info--app-id'\"\r\n >\r\n {{ tenantLabels?.appId }}:\r\n </span>\r\n {{ tenantDetails?.appId }}\r\n <ng-container *ngIf=\"tenantDetails?.appId !== tenantLabels?.saAppId\">\r\n <mat-divider [vertical]=\"true\"></mat-divider>\r\n <span\r\n class=\"mb-0 mt-1 ieeesa-title-sm-14 ieeesa-view-tenant-info--app-status\"\r\n [ngClass]=\"isMobileView ? 'p-0' : ''\"\r\n >\r\n {{ tenantLabels?.status }}:\r\n </span>\r\n <ieeesa-slide-toggle\r\n [slideToggle]=\"slideToggleOption\"\r\n (slideToggleChange)=\"onSlideToggleChange($event)\"\r\n ></ieeesa-slide-toggle>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <a\r\n class=\"ieeesa-btn-label-lg-bold-16 text-decoration-none mt-lg-3 mt-xl-6 p-sm-0 p-md-0\"\r\n href=\"javascript:void(0)\"\r\n rel=\"noopener noreferrer\"\r\n [routerLink]=\"viewTenantsRouteUrl\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--link-mobile'\r\n : 'ieeesa-view-tenant-info--link'\r\n \"\r\n >{{ tenantLabels?.viewAllApps }}</a\r\n >\r\n </div>\r\n <div\r\n class=\"ieeesa-view-tenant-info__accordion ieeesa-view-tenant-info__accordion--blue-bg\"\r\n [ngClass]=\"isMobileView ? 'ieeesa-view-tenant-info__accordion--info' : ''\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let accordionInfo of accordionInfoList;\r\n trackBy: trackByAccordionFn\r\n \"\r\n >\r\n <ng-container [ngSwitch]=\"accordionInfo.id\">\r\n <ng-container *ngSwitchCase=\"accordionDetails.BASIC_DETAILS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__accordion-info\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <ieeesa-icon-button\r\n *ngIf=\"\r\n isBasicDetailsExpanded &&\r\n validateAccess(permissionType.MANAGE_TENANT)\r\n \"\r\n actions\r\n class=\"ieeesa-button\"\r\n [iconButton]=\"editButton\"\r\n (iconButtonClick)=\"openEditTenantForm()\"\r\n ></ieeesa-icon-button>\r\n <ng-container component *ngIf=\"isBasicDetailsExpanded\">\r\n <ieeesa-tenant-basic-details\r\n [tenantDetails]=\"tenantDetails\"\r\n ></ieeesa-tenant-basic-details>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.ROLES_AND_PERMISSIONS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isRolesAndPermissionsExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n (click)=\"openCreateRoleForm()\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels.addRole\r\n }}\r\n </button>\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n (click)=\"openMapRolesAndPermissionsForm()\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels\r\n .mapPermissionsRoles\r\n }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isRolesAndPermissionsExpanded\">\r\n <mat-divider\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions__divider\"\r\n ></mat-divider>\r\n <ieeesa-data-table\r\n *ngIf=\"columnSchema.length\"\r\n [tableDataInfo]=\"tableData\"\r\n [headerElementClassName]=\"headerElementClassName\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [caption]=\"rolesAndPermissionsTableCaption\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [tableActions]=\"tableActions\"\r\n [isScrollSupportMessageNeeded]=\"true\"\r\n [tableColumnActionMenuSize]=\"iconSize\"\r\n [tableColumnActions]=\"menuItems\"\r\n [customStickyHeaderNeeded]=\"true\"\r\n [tableColumnsHeaderText]=\"rolesAndPermissionsTableHeaderName\"\r\n [scrollbarSupportMessage]=\"\r\n rolesAndPermissionsTableSupportMessage\r\n \"\r\n [verticalColumnHeaderNumber]=\"permissionsColumnClassNumber\"\r\n (paginationChange)=\"onTablePaginationChange($event)\"\r\n (tableColumnMenuActionClick)=\"onRoleMenuClick($event)\"\r\n (tableColumnMenuToggleButton)=\"selectedRoleMenuElement($event)\"\r\n ></ieeesa-data-table>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.GROUP_TYPES\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__group-types\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isGroupTypesExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button p-2\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n (click)=\"openCreateGroupTypeForm()\"\r\n >\r\n {{ constants.viewGroupTypes.actionButtonLabels.addGroupType }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isGroupTypesExpanded\">\r\n <ieeesa-view-tenant-group-types></ieeesa-view-tenant-group-types>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n ></ieeesa-accordion>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-view-tenant-info{background-color:#f2f2f2}.ieeesa-view-tenant-info--bg-white{background-color:#fff;padding:1em 1.5em 0}.ieeesa-view-tenant-info__actions{top:15px;margin-right:20px;position:absolute;right:0}.ieeesa-view-tenant-info--title,.ieeesa-view-tenant-info--action{padding:.75em 0}.ieeesa-view-tenant-info--link{padding:1em .75em 1.3em 0!important}.ieeesa-view-tenant-info--link-mobile{max-width:-moz-fit-content;max-width:fit-content}.ieeesa-view-tenant-info--app-id,.ieeesa-view-tenant-info--app-status{color:#49454f}.ieeesa-view-tenant-info__accordion{background-color:#fff;box-shadow:0 1px 4px #00000040,0 4px #00b5e2 inset;padding:1.5em .75em}.ieeesa-view-tenant-info__accordion--bg-white{background-color:#fff;box-shadow:none}.ieeesa-view-tenant-info__accordion--info{padding:1em 1em 1.5em}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-body{padding:1.5em 1.5em 1.5em 2.25em}.ieeesa-view-tenant-info__accordion-info .ieeesa-button{position:absolute;top:1.25em;right:0}.ieeesa-view-tenant-info__accordion-info .ieeesa-button svg{width:1.3em!important;height:1.3em!important}.ieeesa-view-tenant-info .mat-divider-vertical{margin:0;height:1.4em;color:#cac4d0;width:.063em;border-right-color:#cac4d0}.ieeesa-view-tenant-info .ieeesa-slide-toggle-field .mat-mdc-slide-toggle .mdc-label{color:#000!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__roles-and-permissions__divider{margin-top:12px!important;margin-bottom:16px!important;border-top:1px solid #ccd2da!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mat-expansion-panel-body,.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table .mat-column-permissions{min-width:12.5em;padding:16px!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__content{margin-top:0!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__column-menu .mat-mdc-icon-button.mat-mdc-button-base{padding:6px;width:24px;height:24px}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__columns-header-text{padding:8px 16px;background:#dae9f1;box-shadow:0 1px #dce3e9 inset}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-container{padding:0;flex-wrap:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__trailing,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__notch,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__leading{border:none!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-select,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{margin:0}.ieeesa-view-tenant-info__roles-and-permissions .at-mdc-select-min-line,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{color:#1c1d1e}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label{position:relative;color:#63666a;left:2em}.ieeesa-view-tenant-info__group-types .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__group-types .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__group-types .mat-expansion-panel-body,.ieeesa-view-tenant-info__group-types .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-menu__item:not(:last-of-type){margin-bottom:0!important}.ieeesa-menu .mat-mdc-menu-item{min-height:35px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i6.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: SlideToggleComponent, selector: "ieeesa-slide-toggle", inputs: ["formControlName", "slideToggle", "isDisabled", "canShowIcon"], outputs: ["slideToggleChange"] }, { kind: "component", type: AccordionComponent, selector: "ieeesa-accordion", inputs: ["accordionInfo"], outputs: ["accordionOpened"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: TenantBasicDetailsComponent, selector: "ieeesa-tenant-basic-details", inputs: ["tenantDetails"] }, { kind: "component", type: IconButtonComponent, selector: "ieeesa-icon-button", inputs: ["iconButton", "isLabelNeeded"], outputs: ["iconButtonClick"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: DataTableComponent, selector: "ieeesa-data-table", inputs: ["tableDataInfo", "nestedTableDataInfo", "columnSchemaInfo", "nestedTableColumnSchemaInfo", "tableActions", "hasNestedTable", "tableColumnActions", "tableColumnActionMenuSize", "tableRowActions", "nestedTableRowActions", "caption", "viewAll", "paginatorConfig", "nestedPaginatorConfig", "legends", "pageIndex", "pageSize", "searchPlaceHolderText", "rowEditButton", "rowDeleteButton", "tableEditButton", "tableDeleteButton", "rowExpandButton", "rowCollapseButton", "isNestedTableHeaderNeeded", "addButton", "defaultColumnSortDirection", "defaultSortedColumn", "isClearSortNeeded", "filters", "selectedFilterOptions", "appliedFilterOptions", "searchType", "className", "searchSupportMessage", "inbuiltSortingNeeded", "isCellTextOverflowEllipsis", "isTableHeaderNeeded", "tableColumnsHeaderText", "verticalColumnHeaderNumber", "scrollbarSupportMessage", "isScrollSupportMessageNeeded", "isStickyHeaderNeeded", "customStickyHeaderNeeded", "headerElementClassName", "minCharToSearch", "searchResultMessage", "rowMenuActionIcon", "canDisableCheckbox", "isEllipsisRequiredForLink"], outputs: ["rowSelected", "selectedRowToEdit", "selectedRowToDelete", "selectedRowsToDelete", "rowLink", "addRow", "columnDataOnRowLinkClick", "menuActionClick", "selectActionMenu", "paginationChange", "selectedFilter", "removeFilteredOption", "filteredOptions", "searchedValue", "sortChange", "selectedRowsInfo", "rowExpansionClick", "tableColumnMenuActionClick", "tableColumnMenuToggleButton", "rowSlideToggle"] }, { kind: "component", type: ViewTenantGroupTypesComponent, selector: "ieeesa-view-tenant-group-types" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
780
|
+
}
|
|
781
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewTenantDetailsComponent, decorators: [{
|
|
782
|
+
type: Component,
|
|
783
|
+
args: [{ selector: 'ieeesa-view-tenant-details', standalone: true, imports: [
|
|
784
|
+
CommonModule,
|
|
785
|
+
RouterModule,
|
|
786
|
+
SlideToggleComponent,
|
|
787
|
+
AccordionComponent,
|
|
788
|
+
MatDividerModule,
|
|
789
|
+
TenantBasicDetailsComponent,
|
|
790
|
+
IconButtonComponent,
|
|
791
|
+
MatButtonModule,
|
|
792
|
+
DataTableComponent,
|
|
793
|
+
ViewTenantGroupTypesComponent,
|
|
794
|
+
], encapsulation: ViewEncapsulation.None, template: "<div\r\n class=\"ieeesa-view-tenant-info px-4 pb-4\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--bg-white'\r\n : 'ieeesa-view-tenant-info--bg-blue'\r\n \"\r\n>\r\n <div\r\n class=\"d-flex justify-content-between gap-lg-4 gap-md-3 gap-sm-2 gap-3\"\r\n [ngClass]=\"isMobileView ? 'flex-column gap-2 pb-3' : 'align-item-center'\"\r\n >\r\n <div\r\n class=\"d-flex gap-lg-4 gap-md-3 gap-sm-3 gap-3 ps-0 align-items-md-center align-items-xl-center\"\r\n [ngClass]=\"isMobileView ? 'flex-column' : ''\"\r\n >\r\n <p\r\n class=\"mb-0 ieeesa-headline-lg-32 py-3\"\r\n [ngClass]=\"isMobileView ? '' : 'ieeesa-view-tenant-info--title'\"\r\n >\r\n {{ tenantDetails?.appTitle }}\r\n </p>\r\n <div class=\"d-flex gap-lg-2 gap-md-2 gap-sm-2 gap-2\">\r\n <span\r\n class=\"mb-0 ieeesa-title-sm-14 mt-1\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'ieeesa-view-tenant-info--app-id'\"\r\n >\r\n {{ tenantLabels?.appId }}:\r\n </span>\r\n {{ tenantDetails?.appId }}\r\n <ng-container *ngIf=\"tenantDetails?.appId !== tenantLabels?.saAppId\">\r\n <mat-divider [vertical]=\"true\"></mat-divider>\r\n <span\r\n class=\"mb-0 mt-1 ieeesa-title-sm-14 ieeesa-view-tenant-info--app-status\"\r\n [ngClass]=\"isMobileView ? 'p-0' : ''\"\r\n >\r\n {{ tenantLabels?.status }}:\r\n </span>\r\n <ieeesa-slide-toggle\r\n [slideToggle]=\"slideToggleOption\"\r\n (slideToggleChange)=\"onSlideToggleChange($event)\"\r\n ></ieeesa-slide-toggle>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <a\r\n class=\"ieeesa-btn-label-lg-bold-16 text-decoration-none mt-lg-3 mt-xl-6 p-sm-0 p-md-0\"\r\n href=\"javascript:void(0)\"\r\n rel=\"noopener noreferrer\"\r\n [routerLink]=\"viewTenantsRouteUrl\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--link-mobile'\r\n : 'ieeesa-view-tenant-info--link'\r\n \"\r\n >{{ tenantLabels?.viewAllApps }}</a\r\n >\r\n </div>\r\n <div\r\n class=\"ieeesa-view-tenant-info__accordion ieeesa-view-tenant-info__accordion--blue-bg\"\r\n [ngClass]=\"isMobileView ? 'ieeesa-view-tenant-info__accordion--info' : ''\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let accordionInfo of accordionInfoList;\r\n trackBy: trackByAccordionFn\r\n \"\r\n >\r\n <ng-container [ngSwitch]=\"accordionInfo.id\">\r\n <ng-container *ngSwitchCase=\"accordionDetails.BASIC_DETAILS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__accordion-info\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <ieeesa-icon-button\r\n *ngIf=\"\r\n isBasicDetailsExpanded &&\r\n validateAccess(permissionType.MANAGE_TENANT)\r\n \"\r\n actions\r\n class=\"ieeesa-button\"\r\n [iconButton]=\"editButton\"\r\n (iconButtonClick)=\"openEditTenantForm()\"\r\n ></ieeesa-icon-button>\r\n <ng-container component *ngIf=\"isBasicDetailsExpanded\">\r\n <ieeesa-tenant-basic-details\r\n [tenantDetails]=\"tenantDetails\"\r\n ></ieeesa-tenant-basic-details>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.ROLES_AND_PERMISSIONS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isRolesAndPermissionsExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n (click)=\"openCreateRoleForm()\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels.addRole\r\n }}\r\n </button>\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n (click)=\"openMapRolesAndPermissionsForm()\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels\r\n .mapPermissionsRoles\r\n }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isRolesAndPermissionsExpanded\">\r\n <mat-divider\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions__divider\"\r\n ></mat-divider>\r\n <ieeesa-data-table\r\n *ngIf=\"columnSchema.length\"\r\n [tableDataInfo]=\"tableData\"\r\n [headerElementClassName]=\"headerElementClassName\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [caption]=\"rolesAndPermissionsTableCaption\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [tableActions]=\"tableActions\"\r\n [isScrollSupportMessageNeeded]=\"true\"\r\n [tableColumnActionMenuSize]=\"iconSize\"\r\n [tableColumnActions]=\"menuItems\"\r\n [customStickyHeaderNeeded]=\"true\"\r\n [tableColumnsHeaderText]=\"rolesAndPermissionsTableHeaderName\"\r\n [scrollbarSupportMessage]=\"\r\n rolesAndPermissionsTableSupportMessage\r\n \"\r\n [verticalColumnHeaderNumber]=\"permissionsColumnClassNumber\"\r\n (paginationChange)=\"onTablePaginationChange($event)\"\r\n (tableColumnMenuActionClick)=\"onRoleMenuClick($event)\"\r\n (tableColumnMenuToggleButton)=\"selectedRoleMenuElement($event)\"\r\n ></ieeesa-data-table>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.GROUP_TYPES\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__group-types\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isGroupTypesExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button p-2\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n (click)=\"openCreateGroupTypeForm()\"\r\n >\r\n {{ constants.viewGroupTypes.actionButtonLabels.addGroupType }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isGroupTypesExpanded\">\r\n <ieeesa-view-tenant-group-types></ieeesa-view-tenant-group-types>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n ></ieeesa-accordion>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-view-tenant-info{background-color:#f2f2f2}.ieeesa-view-tenant-info--bg-white{background-color:#fff;padding:1em 1.5em 0}.ieeesa-view-tenant-info__actions{top:15px;margin-right:20px;position:absolute;right:0}.ieeesa-view-tenant-info--title,.ieeesa-view-tenant-info--action{padding:.75em 0}.ieeesa-view-tenant-info--link{padding:1em .75em 1.3em 0!important}.ieeesa-view-tenant-info--link-mobile{max-width:-moz-fit-content;max-width:fit-content}.ieeesa-view-tenant-info--app-id,.ieeesa-view-tenant-info--app-status{color:#49454f}.ieeesa-view-tenant-info__accordion{background-color:#fff;box-shadow:0 1px 4px #00000040,0 4px #00b5e2 inset;padding:1.5em .75em}.ieeesa-view-tenant-info__accordion--bg-white{background-color:#fff;box-shadow:none}.ieeesa-view-tenant-info__accordion--info{padding:1em 1em 1.5em}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-body{padding:1.5em 1.5em 1.5em 2.25em}.ieeesa-view-tenant-info__accordion-info .ieeesa-button{position:absolute;top:1.25em;right:0}.ieeesa-view-tenant-info__accordion-info .ieeesa-button svg{width:1.3em!important;height:1.3em!important}.ieeesa-view-tenant-info .mat-divider-vertical{margin:0;height:1.4em;color:#cac4d0;width:.063em;border-right-color:#cac4d0}.ieeesa-view-tenant-info .ieeesa-slide-toggle-field .mat-mdc-slide-toggle .mdc-label{color:#000!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__roles-and-permissions__divider{margin-top:12px!important;margin-bottom:16px!important;border-top:1px solid #ccd2da!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mat-expansion-panel-body,.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table .mat-column-permissions{min-width:12.5em;padding:16px!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__content{margin-top:0!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__column-menu .mat-mdc-icon-button.mat-mdc-button-base{padding:6px;width:24px;height:24px}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__columns-header-text{padding:8px 16px;background:#dae9f1;box-shadow:0 1px #dce3e9 inset}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-container{padding:0;flex-wrap:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__trailing,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__notch,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__leading{border:none!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-select,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{margin:0}.ieeesa-view-tenant-info__roles-and-permissions .at-mdc-select-min-line,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{color:#1c1d1e}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label{position:relative;color:#63666a;left:2em}.ieeesa-view-tenant-info__group-types .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__group-types .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__group-types .mat-expansion-panel-body,.ieeesa-view-tenant-info__group-types .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-menu__item:not(:last-of-type){margin-bottom:0!important}.ieeesa-menu .mat-mdc-menu-item{min-height:35px!important}\n"] }]
|
|
795
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.BreakpointObserverService }, { type: i3.TenantApplicationsService }, { type: i4.GlobalErrorHandlerService }, { type: i5.SharedService }, { type: i6.ActivatedRoute }, { type: i4.AuthService }, { type: i4.StorageService }]; }, propDecorators: { apiBaseURL: [{
|
|
796
|
+
type: Input
|
|
797
|
+
}], userPermissions: [{
|
|
798
|
+
type: Input
|
|
799
|
+
}], routePaths: [{
|
|
800
|
+
type: Input
|
|
801
|
+
}], signOutConfig: [{
|
|
802
|
+
type: Input
|
|
803
|
+
}] } });
|
|
804
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy10ZW5hbnQtZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZW5hbnRzL3NyYy9saWIvY29tcG9uZW50cy92aWV3LXRlbmFudC1kZXRhaWxzL3ZpZXctdGVuYW50LWRldGFpbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVuYW50cy9zcmMvbGliL2NvbXBvbmVudHMvdmlldy10ZW5hbnQtZGV0YWlscy92aWV3LXRlbmFudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUdMLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBRUwsY0FBYyxFQUdkLG9CQUFvQixFQUVwQixTQUFTLEVBQ1QsMEJBQTBCLEVBQzFCLG1CQUFtQixFQUtuQixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFHbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQTBCLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBYTdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9B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QUk7d1VBSTVCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEF1dGhTZXJ2aWNlLFxyXG4gIEdsb2JhbEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgU3RvcmFnZVNlcnZpY2UsXHJcbn0gZnJvbSAnQGllZWVzYS1ucG0vdXRpbGl0eSc7XHJcbmltcG9ydCB7IEFsZXJ0VHlwZSwgTW9kYWxUeXBlIH0gZnJvbSAnQGllZWVzYS1ucG0vbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICBBY2NvcmRpb25JbmZvLFxyXG4gIE1vZGFsQ29tcG9uZW50LFxyXG4gIE1lbnUsXHJcbiAgUGFnaW5hdG9yQ29uZmlnLFxyXG4gIFNsaWRlVG9nZ2xlQ29tcG9uZW50LFxyXG4gIFRhYmxlQWN0aW9ucyxcclxuICBBbGlnblR5cGUsXHJcbiAgTW9kYWxDb25maXJtYXRpb25Db21wb25lbnQsXHJcbiAgSWNvbkJ1dHRvbkNvbXBvbmVudCxcclxuICBSYWRpb09wdGlvbixcclxuICBJY29uQnV0dG9uLFxyXG4gIFNsaWRlVG9nZ2xlT3B0aW9uLFxyXG4gIFRhYmxlQ29sdW1uU2NoZW1hLFxyXG4gIFRhYmxlQ29sdW1uVHlwZSxcclxuICBBY2NvcmRpb25Db21wb25lbnQsXHJcbiAgQWNjb3JkaW9uRGV0YWlscyxcclxuICBEYXRhVGFibGVDb21wb25lbnQsXHJcbiAgVGFibGVDb2x1bW5NZW51SW5mbyxcclxuICBCcmVha3BvaW50T2JzZXJ2ZXJTZXJ2aWNlXHJcbn0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHQgZnJvbSAnLi4vLi4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xyXG5pbXBvcnQgeyBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVuYW50LWFwcGxpY2F0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBUZW5hbnRzUGVybWlzc2lvbnMsXHJcbiAgVXNlclBlcm1pc3Npb24sXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3RlbmFudHMtcGVybWlzc2lvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICdAaWVlZXNhLW5wbS9zaGFyZWQnO1xyXG5pbXBvcnQgeyBUZW5hbnRzUm91dGVzQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JvdXRlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IEZlYXR1cmVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZlYXR1cmVzLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBUZW5hbnRCYXNpY0luZm8sXHJcbiAgVGVuYW50RGV0YWlsc1Jlc3BvbnNlLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy90ZW5hbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBUZW5hbnRGdW5jdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGVuYW50LWZ1bmN0aW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDcmVhdGVUZW5hbnRBcHBsaWNhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NyZWF0ZS10ZW5hbnQtYXBwbGljYXRpb24vY3JlYXRlLXRlbmFudC1hcHBsaWNhdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQge1xyXG4gIFVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkLFxyXG4gIFVwZGF0ZVRlbmFudFN0YXR1c1Jlc3BvbnNlLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy91cGRhdGUtdGVuYW50LXN0YXR1cy5tb2RlbCc7XHJcbmltcG9ydCB7IEZlYXR1cmVQZXJtaXNzaW9uSWQgfSBmcm9tICcuLi8uLi9tb2RlbHMvZmVhdHVyZS1wZXJtaXNzaW9uLWlkLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBBcHBUeXBlQ29uZmlnLFxyXG4gIEdldEFwcFR5cGVzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcC10eXBlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFRlbmFudEJhc2ljRGV0YWlsc0NvbXBvbmVudCB9IGZyb20gJy4uL3RlbmFudC1iYXNpYy1kZXRhaWxzL3RlbmFudC1iYXNpYy1kZXRhaWxzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgR2V0Um9sZXNBbmRQZXJtaXNzaW9uc1BheWxvYWQsXHJcbiAgR2V0Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxyXG4gIEdldFJvbGVzUmVzcG9uc2UsXHJcbiAgUm9sZSxcclxuICBSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZyxcclxuICBSb2xlc0FuZFBlcm1pc3Npb25zLFxyXG4gIERlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZCxcclxuICBEZWxldGVSb2xlUmVzcG9uc2UsXHJcbiAgUGFnaW5hdGlvbkluZm8sXHJcbiAgUm9sZURldGFpbHMsXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3JvbGVzLWFuZC1wZXJtaXNzaW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IFBlcm1pc3Npb25UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Blcm1pc3Npb24tdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IENyZWF0ZU1vZGlmeVJvbGVDb21wb25lbnQgfSBmcm9tICcuLi9jcmVhdGUtbW9kaWZ5LXJvbGUvY3JlYXRlLW1vZGlmeS1yb2xlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJvbGVNZW51QWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JvbGUtbWVudS1hY3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZ0NvbXBvbmVudCB9IGZyb20gJy4uL3JvbGVzLWFuZC1wZXJtaXNzaW9ucy1tYXBwaW5nL3JvbGVzLWFuZC1wZXJtaXNzaW9ucy1tYXBwaW5nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZpZXdUZW5hbnRHcm91cFR5cGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy10ZW5hbnQtZ3JvdXAtdHlwZXMvdmlldy10ZW5hbnQtZ3JvdXAtdHlwZXMuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBHZXRSb2xlVHlwZXNQYXlsb2FkLFxyXG4gIFJvbGVUeXBlQ29uZmlndXJhdGlvbixcclxuICBSb2xlVHlwZU9wdGlvbixcclxuICBSb2xlVHlwZVJlc3BvbnNlLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy9yb2xlLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDcmVhdGVNb2RpZnlHcm91cFR5cGVDb21wb25lbnQgfSBmcm9tICcuLi9jcmVhdGUtbW9kaWZ5LWdyb3VwLXR5cGUvY3JlYXRlLW1vZGlmeS1ncm91cC10eXBlLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnaWVlZXNhLXZpZXctdGVuYW50LWRldGFpbHMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUm91dGVyTW9kdWxlLFxyXG4gICAgU2xpZGVUb2dnbGVDb21wb25lbnQsXHJcbiAgICBBY2NvcmRpb25Db21wb25lbnQsXHJcbiAgICBNYXREaXZpZGVyTW9kdWxlLFxyXG4gICAgVGVuYW50QmFzaWNEZXRhaWxzQ29tcG9uZW50LFxyXG4gICAgSWNvbkJ1dHRvbkNvbXBvbmVudCxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIERhdGFUYWJsZUNvbXBvbmVudCxcclxuICAgIFZpZXdUZW5hbnRHcm91cFR5cGVzQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXctdGVuYW50LWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3ZpZXctdGVuYW50LWRldGFpbHMuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmlld1RlbmFudERldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpIGFwaUJhc2VVUkwhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdXNlclBlcm1pc3Npb25zITogVXNlclBlcm1pc3Npb25bXTtcclxuICBASW5wdXQoKSByb3V0ZVBhdGhzITogVGVuYW50c1JvdXRlc0NvbmZpZztcclxuICAvKiogQXV0aCBjb29raWUgbmFtZSBhbmQgU1NPIHNpZ24tb3V0IFVSTCwgdXNlZCB0byBzaWduIG91dCBhZnRlciBhIHRlbmFudCBmZWF0dXJlIGNoYW5nZS4gKi9cclxuICBASW5wdXQoKSBzaWduT3V0Q29uZmlnPzogeyBjb29raWVOYW1lOiBzdHJpbmc7IHNzb1NpZ25PdXRVcmw6IHN0cmluZyB9O1xyXG4gIGlzTW9iaWxlVmlldyA9IGZhbHNlO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgY29uc3RhbnRzOiBhbnkgPSBzY3JlZW5UZXh0O1xyXG4gIHRlbmFudExhYmVscyA9IHRoaXMuY29uc3RhbnRzPy52aWV3VGVuYW50cz8ubGFiZWw7XHJcbiAgc2xpZGVUb2dnbGVPcHRpb24gPSB7XHJcbiAgICBpZDogMSxcclxuICAgIGxhYmVsOiB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmxhYmVsPy5hY3RpdmUsXHJcbiAgICBjaGVja2VkOiB0cnVlLFxyXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gIH07XHJcbiAgZWRpdEJ1dHRvbjogSWNvbkJ1dHRvbiA9IHRoaXMuY29uc3RhbnRzPy52aWV3VGVuYW50cz8uYnV0dG9ucztcclxuICB0ZW5hbnREZXRhaWxzITogVGVuYW50QmFzaWNJbmZvO1xyXG4gIGFjY29yZGlvbkluZm9MaXN0OiBBY2NvcmRpb25JbmZvW10gPSBKU09OLnBhcnNlKFxyXG4gICAgSlNPTi5zdHJpbmdpZnkodGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy50ZW5hbnRBY2NvcmRpb25JbmZvKVxyXG4gICk7XHJcbiAgYXBwSWQgPSAnJztcclxuICBpY29uU2l6ZSA9IHRoaXMuY29uc3RhbnRzPy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucz8uY29sdW1uQWN0aW9uSWNvblNpemU7XHJcbiAgcm9sZXNBbmRQZXJtaXNzaW9uc1RhYmxlQ2FwdGlvbiA9XHJcbiAgICB0aGlzLmNvbnN0YW50cz8udmlld1JvbGVzQW5kUGVybWlzc2lvbnM/LnRhYmxlQ2FwdGlvbjtcclxuICByb2xlc0FuZFBlcm1pc3Npb25zVGFibGVIZWFkZXJOYW1lID1cclxuICAgIHRoaXMuY29uc3RhbnRzPy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucz8udGFibGVDb2x1bW5zSGVhZGVyVGV4dDtcclxuICByb2xlc0FuZFBlcm1pc3Npb25zVGFibGVTdXBwb3J0TWVzc2FnZSA9XHJcbiAgICB0aGlzLmNvbnN0YW50cz8udmlld1JvbGVzQW5kUGVybWlzc2lvbnM/LnNjcm9sbGJhclN1cHBvcnRNZXNzYWdlO1xyXG4gIHBlcm1pc3Npb25zQ29sdW1uQ2xhc3NOdW1iZXIgPSAxO1xyXG4gIG1lbnVJdGVtczogTWVudVtdID1cclxuICAgIHRoaXMuY29uc3RhbnRzPy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucz8uY29sdW1uQWN0aW9uTWVudUl0ZW1zO1xyXG4gIGNvbHVtblNjaGVtYTogVGFibGVDb2x1bW5TY2hlbWFbXSA9IFtdO1xyXG4gIHRhYmxlRGF0YTogUm9sZXNBbmRQZXJtaXNzaW9uc1tdID0gW107XHJcbiAgaXNSb2xlc0FuZFBlcm1pc3Npb25zRXhwYW5kZWQgPSBmYWxzZTtcclxuICBwYWdpbmF0b3JDb25maWc6IFBhZ2luYXRvckNvbmZpZyA9IHtcclxuICAgIHJlY29yZHNQZXJQYWdlOiB0aGlzLmNvbnN0YW50cz8udmlld1JvbGVzQW5kUGVybWlzc2lvbnM/LnBhZ2VTaXplT3B0aW9uc1swXSxcclxuICAgIHBhZ2VTaXplT3B0aW9uczogdGhpcy5jb25zdGFudHM/LnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zPy5wYWdlU2l6ZU9wdGlvbnMsXHJcbiAgICB0b3RhbFJlY29yZHM6IDAsXHJcbiAgfTtcclxuICB0YWJsZVBhZ2luYXRpb24hOiBQYWdpbmF0aW9uSW5mbztcclxuICByb2xlc0FuZFBlcm1pc3Npb25zQ2xhc3NOYW1lID1cclxuICAgICcuaWVlZXNhLXZpZXctdGVuYW50LWluZm9fX3JvbGVzLWFuZC1wZXJtaXNzaW9ucyc7XHJcbiAgaGVhZGVyRWxlbWVudENsYXNzTmFtZSA9ICcuaWVlZXNhLWhlYWRlcic7XHJcbiAgdGFibGVBY3Rpb25zOiBUYWJsZUFjdGlvbnMgPSB7XHJcbiAgICBpc1BhZ2luYXRpb25OZWVkZWQ6IHRydWUsXHJcbiAgfTtcclxuICB2aWV3VGVuYW50c1JvdXRlVXJsITogc3RyaW5nO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgZGlhbG9nUmVmOiBhbnk7XHJcbiAgYWNjb3JkaW9uRGV0YWlscyA9IEFjY29yZGlvbkRldGFpbHM7XHJcbiAgYXBwVHlwZU9wdGlvbnMhOiBSYWRpb09wdGlvbltdO1xyXG4gIGlzQmFzaWNEZXRhaWxzRXhwYW5kZWQgPSBmYWxzZTtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNyZWF0ZUdyb3VwVHlwZVNjcmVlblRleHRzOiBhbnkgPSB0aGlzLmNvbnN0YW50cz8uY3JlYXRlR3JvdXBUeXBlO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgZWRpdFRlbmFudFNjcmVlblRleHRzOiBhbnkgPSB0aGlzLmNvbnN0YW50cz8uZWRpdFRlbmFudDtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGRlbGV0ZVJvbGVTY3JlZW5UZXh0czogYW55ID0gdGhpcy5jb25zdGFudHM/LmRlbGV0ZVJvbGU7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBtYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHM6IGFueSA9XHJcbiAgICB0aGlzLmNvbnN0YW50cz8ubWFwUm9sZXNBbmRQZXJtaXNzaW9ucztcclxuICBhbGlnbm1lbnRUeXBlID0gQWxpZ25UeXBlO1xyXG4gIHVzZXJUZW5hbnRzUGVybWlzc2lvbnMhOiBUZW5hbnRzUGVybWlzc2lvbnNbXTtcclxuICBwZXJtaXNzaW9uVHlwZSA9IFBlcm1pc3Npb25UeXBlO1xyXG4gIGZ1bmN0aW9uVHlwZSE6IFRlbmFudEZ1bmN0aW9uVHlwZTtcclxuICBjcmVhdGVSb2xlU2NyZWVuVGV4dHMgPSB0aGlzLmNvbnN0YW50cz8uY3JlYXRlUm9sZTtcclxuICByb2xlTWVudUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcclxuICBzZWxlY3RlZFJvbGVJbmZvOiBSb2xlRGV0YWlscyA9IHtcclxuICAgIHJvbGVJZDogJycsXHJcbiAgICByb2xlTmFtZTogJycsXHJcbiAgfTtcclxuICBpc0dyb3VwVHlwZXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIHJvbGVUeXBlT3B0aW9uczogUm9sZVR5cGVPcHRpb25bXSA9IFtdO1xyXG4gIC8qKiBGZWF0dXJlIGlkcyBjYXB0dXJlZCBiZWZvcmUgdGhlIGVkaXQgZGlhbG9nIG9wZW5zLCB1c2VkIHRvIGRldGVjdCBhIGZlYXR1cmUgbGlzdCBjaGFuZ2Ugb24gc2F2ZS4gKi9cclxuICBwcml2YXRlIGZlYXR1cmVJZHNCZWZvcmVFZGl0OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyU2VydmljZTogQnJlYWtwb2ludE9ic2VydmVyU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSB0ZW5hbnRBcHBTZXJ2aWNlOiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwdWJsaWMgZ2xvYmFsRXJyb3JIYW5kbGVyU2VydmljZTogR2xvYmFsRXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlclNlcnZpY2VcclxuICAgICAgLmdldEJyZWFrcG9pbnQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogeyBtYXRjaGVzOiBib29sZWFuIH0pID0+IHtcclxuICAgICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IHJlc3VsdD8ubWF0Y2hlcztcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyB2aWV3IHRlbmFudCBkZXRhaWxzIGNvbXBvbmVudC5cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50RGV0YWlscyA9XHJcbiAgICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uZ2V0U2VsZWN0ZWRUZW5hbnRJbmZvcm1hdGlvbigpIGFzIFRlbmFudEJhc2ljSW5mbztcclxuICAgIHRoaXMuc2xpZGVUb2dnbGVPcHRpb24uY2hlY2tlZCA9IHRoaXMudGVuYW50RGV0YWlscz8uc3RhdHVzIGFzIGJvb2xlYW47XHJcbiAgICB0aGlzLnNsaWRlVG9nZ2xlT3B0aW9uLmxhYmVsID0gdGhpcy50ZW5hbnREZXRhaWxzPy5zdGF0dXNcclxuICAgICAgPyB0aGlzLnRlbmFudExhYmVscz8uYWN0aXZlXHJcbiAgICAgIDogdGhpcy50ZW5hbnRMYWJlbHM/LmluYWN0aXZlO1xyXG4gICAgdGhpcy5yb3V0ZVBhdGhzID0gdGhpcy5yb3V0ZVBhdGhzID8/IHRoaXMuY29uc3RhbnRzPy5yb3V0ZUNvbmZpZ1BhdGg7XHJcbiAgICB0aGlzLnZpZXdUZW5hbnRzUm91dGVVcmwgPSBgLyR7dGhpcy5yb3V0ZVBhdGhzPy52aWV3VGVuYW50c31gO1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlPy5zZXRBcHBDb25maWcodGhpcy5hcGlCYXNlVVJMLCB0aGlzLnVzZXJQZXJtaXNzaW9ucyk7XHJcbiAgICB0aGlzLnVzZXJUZW5hbnRzUGVybWlzc2lvbnMgPSB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LmZpbHRlclBlcm1pc3Npb24oXHJcbiAgICAgIHRoaXMudXNlclBlcm1pc3Npb25zXHJcbiAgICApO1xyXG4gICAgdGhpcy5hcHBJZCA9IHRoaXMudGVuYW50QXBwU2VydmljZS5nZXRTZWxlY3RlZFRlbmFudEluZm9ybWF0aW9uKClcclxuICAgICAgPy5hcHBJZCBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLnRhYmxlUGFnaW5hdGlvbiA9IHtcclxuICAgICAgb2Zmc2V0OiAwLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0b3JDb25maWcucGFnZVNpemVPcHRpb25zWzBdLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZ2V0QXBwbGljYXRpb25UeXBlcygpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZT8ucXVlcnlQYXJhbXNcclxuICAgICAgPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgPy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBJZCA9IHBhcmFtc1snaWQnXTtcclxuICAgICAgICB0aGlzLmdldFRlbmFudERldGFpbHModGhpcy5hcHBJZCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBzZWxlY3RlZCB0ZW5hbnQgZGV0YWlscyBmcm9tIHNlcnZlci5cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBnZXRUZW5hbnREZXRhaWxzKGFwcElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZVxyXG4gICAgICAuZ2V0VGVuYW50RGV0YWlscyhhcHBJZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IFRlbmFudERldGFpbHNSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnREZXRhaWxzID0gcmVzcG9uc2U/LmJvZHkgYXMgVGVuYW50QmFzaWNJbmZvO1xyXG4gICAgICAgICAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2Uuc2V0U2VsZWN0ZWRUZW5hbnRJbmZvcm1hdGlvbihcclxuICAgICAgICAgICAgICB0aGlzLnRlbmFudERldGFpbHNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zbGlkZVRvZ2dsZU9wdGlvbi5jaGVja2VkID0gdGhpcy50ZW5hbnREZXRhaWxzXHJcbiAgICAgICAgICAgICAgLnN0YXR1cyBhcyBib29sZWFuO1xyXG4gICAgICAgICAgICB0aGlzLnNsaWRlVG9nZ2xlT3B0aW9uLmxhYmVsID0gdGhpcy50ZW5hbnREZXRhaWxzLnN0YXR1c1xyXG4gICAgICAgICAgICAgID8gdGhpcy50ZW5hbnRMYWJlbHM/LmFjdGl2ZVxyXG4gICAgICAgICAgICAgIDogdGhpcy50ZW5hbnRMYWJlbHM/LmluYWN0aXZlO1xyXG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMudGVuYW50RGV0YWlscy5mZWF0dXJlcyBhcyBGZWF0dXJlc1tdO1xyXG4gICAgICAgICAgICBmZWF0dXJlcy5tYXAoKGZlYXR1cmU6IEZlYXR1cmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgZmVhdHVyZT8uZmVhdHVyZUlkID09PVxyXG4gICAgICAgICAgICAgICAgICBGZWF0dXJlUGVybWlzc2lvbklkLk1FRVRJTkdTX0FORF9FVkVOVFMgfHxcclxuICAgICAgICAgICAgICAgIGZlYXR1cmU/LmZlYXR1cmVJZCA9PT0gRmVhdHVyZVBlcm1pc3Npb25JZC5CQUxMT1RTXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvcmRpb25JbmZvTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuYWNjb3JkaW9uSW5mb0xpc3QubGVuZ3RoICsgMSxcclxuICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiBmZWF0dXJlPy5mZWF0dXJlTmFtZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oYW5kbGVFcnJvcnMoXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHMuZXJyb3JzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheSB0aGUgY29ycmVzcG9uZGluZyB0ZW5hbnQgYmFzaWMgb3IgZmVhdHVyZSBkZXRhaWxzIGJhc2VkIG9uIHNlbGVjdGVkIGFjY29yZGlvbi5cclxuICAgKiBAcGFyYW0ge0FjY29yZGlvbkluZm99IGFjY29yZGlvbkluZm9cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV4cGFuZGVkXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgc2hvd1RlbmFudERldGFpbHMoYWNjb3JkaW9uSW5mbzogQWNjb3JkaW9uSW5mbywgZXhwYW5kZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGFjY29yZGlvbklkID0gYWNjb3JkaW9uSW5mby5pZCBhcyBudW1iZXI7XHJcbiAgICBzd2l0Y2ggKGFjY29yZGlvbklkKSB7XHJcbiAgICAgIGNhc2UgMToge1xyXG4gICAgICAgIHRoaXMuaXNCYXNpY0RldGFpbHNFeHBhbmRlZCA9IGV4cGFuZGVkO1xyXG4gICAgICAgIGlmIChleHBhbmRlZCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRBcHBsaWNhdGlvblR5cGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgMjoge1xyXG4gICAgICAgIHRoaXMuaXNSb2xlc0FuZFBlcm1pc3Npb25zRXhwYW5kZWQgPSBleHBhbmRlZDtcclxuICAgICAgICBpZiAoZXhwYW5kZWQpIHtcclxuICAgICAgICAgIHRoaXMuY29sdW1uU2NoZW1hID0gW107XHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvckNvbmZpZy5yZWNvcmRzUGVyUGFnZSA9XHJcbiAgICAgICAgICAgIHRoaXMuY29uc3RhbnRzPy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucz8ucGFnZVNpemVPcHRpb25zWzBdO1xyXG4gICAgICAgICAgdGhpcy50YWJsZVBhZ2luYXRpb24ub2Zmc2V0ID0gMDtcclxuICAgICAgICAgIHRoaXMudGFibGVQYWdpbmF0aW9uLnBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3JDb25maWcucmVjb3Jkc1BlclBhZ2U7XHJcbiAgICAgICAgICB0aGlzLmdldFJvbGVzQW5kSW5pdGlhbGl6ZVRhYmxlU2NoZW1hKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgMzoge1xyXG4gICAgICAgIHRoaXMuaXNHcm91cFR5cGVzRXhwYW5kZWQgPSBleHBhbmRlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBjb25maWd1cmVkIHJvbGVzIG9mIHRoZSBzZWxlY3RlZCB0ZW5hbnQgYW5kIGNyZWF0ZXMgdGhlIGNvbHVtbiBzY2hlbWEuXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0Um9sZXNBbmRJbml0aWFsaXplVGFibGVTY2hlbWEoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLmdldFJvbGVzKHRoaXMuYXBwSWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBHZXRSb2xlc1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLmdldFJvbGVzQW5kUGVybWlzc2lvbnNBbmRJbml0aWFsaXplVGFibGVWaWV3KHtcclxuICAgICAgICAgICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMudGFibGVQYWdpbmF0aW9uLm9mZnNldCxcclxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnRhYmxlUGFnaW5hdGlvbi5wYWdlU2l6ZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgcm9sZXNMaXN0ID0gdGhpcy50ZW5hbnRBcHBTZXJ2aWNlLnNvcnRSb2xlc0J5Um9sZVR5cGUoXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2U/LmJvZHkgYXMgUm9sZVtdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMudGVuYW50QXBwU2VydmljZS5zZXRSb2xlc0luZm8ocm9sZXNMaXN0KTtcclxuICAgICAgICAgICAgY29uc3QgY2VsbFZhbHVlID1cclxuICAgICAgICAgICAgICB0aGlzLmNvbnN0YW50cy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucy50YWJsZUNlbGxWYWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5TY2hlbWEgPSBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWQ6IDAsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5EZWY6ICdwZXJtaXNzaW9ucycsXHJcbiAgICAgICAgICAgICAgICBoZWFkaW5nOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0YW50cy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucy50YWJsZUNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyxcclxuICAgICAgICAgICAgICAgIGNvbHVtblR5cGU6IFRhYmxlQ29sdW1uVHlwZS5URVhULFxyXG4gICAgICAgICAgICAgICAgY2VsbERhdGE6IChyb2xlc0FuZFBlcm1pc3Npb25zOiBSb2xlc0FuZFBlcm1pc3Npb25zKSA9PlxyXG4gICAgICAgICAgICAgICAgICByb2xlc0FuZFBlcm1pc3Npb25zLnBlcm1pc3Npb24sXHJcbiAgICAgICAgICAgICAgICBpc1N0aWNreUNvbHVtbjogdHJ1ZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICByb2xlc0xpc3QubWFwKChyb2xlOiBSb2xlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuY29sdW1uU2NoZW1hLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaWQ6IGluZGV4ICsgMSxcclxuICAgICAgICAgICAgICAgIGNvbHVtbkRlZjogcm9sZS5yb2xlSWQsXHJcbiAgICAgICAgICAgICAgICBoZWFkaW5nOiByb2xlLnJvbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLlRFWFQsXHJcbiAgICAgICAgICAgICAgICBoYXNDb2x1bW5BY3Rpb25zOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY2VsbERhdGE6IChyb2xlc0FuZFBlcm1pc3Npb25zOiBSb2xlc0FuZFBlcm1pc3Npb25zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlc0FuZFBlcm1pc3Npb25zLnJvbGVJZHNMaXN0LmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgKHJvbGVJZDogc3RyaW5nKSA9PiByb2xlLnJvbGVJZCA9PT0gcm9sZUlkXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICA/IGNlbGxWYWx1ZS55ZXNcclxuICAgICAgICAgICAgICAgICAgICA6IGNlbGxWYWx1ZS5ubztcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhhbmRsZUVycm9ycyhcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgIHRoaXMuY29uc3RhbnRzPy52aWV3VGVuYW50cz8uZXJyb3JzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSByb2xlcyBhbmQgcGVybWlzc2lvbnMgbWFwcGluZ3MgZm9yIHRoZSBzZWxlY3RlZCB0ZW5hbnQgYW5kIGFuZCBpbml0aWFsaXplIHRhYmxlIHZpZXcuXHJcbiAgICogQHBhcmFtIHtHZXRSb2xlc0FuZFBlcm1pc3Npb25zUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldFJvbGVzQW5kUGVybWlzc2lvbnNBbmRJbml0aWFsaXplVGFibGVWaWV3KFxyXG4gICAgcGF5bG9hZDogR2V0Um9sZXNBbmRQZXJtaXNzaW9uc1BheWxvYWRcclxuICApOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZVxyXG4gICAgICAuZ2V0Um9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmdzKHRoaXMuYXBwSWQsIHBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBHZXRSb2xlc0FuZFBlcm1pc3Npb25zUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZT8uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yQ29uZmlnLnRvdGFsUmVjb3JkcyA9IHJlc3BvbnNlPy5ib2R5XHJcbiAgICAgICAgICAgICAgPy50b3RhbFJlY29yZHMgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgICBjb25zdCByb2xlc0FuZFBlcm1pc3Npb25zTGlzdCA9IHJlc3BvbnNlPy5ib2R5XHJcbiAgICAgICAgICAgICAgPy5yb2xlUGVybWlzc2lvbkRldGFpbHMgYXMgUm9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmdbXTtcclxuICAgICAgICAgICAgcm9sZXNBbmRQZXJtaXNzaW9uc0xpc3QubWFwKChwZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IHJvbGVJZHNMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgICAgIHJvbGVJZHNMaXN0ID0gcGVybWlzc2lvbi5yb2xlTGlzdC5tYXAoKHJvbGUpID0+IHJvbGUucm9sZUlkKTtcclxuICAgICAgICAgICAgICB0aGlzLnRhYmxlRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb24ucGVybWlzc2lvbk5hbWUsXHJcbiAgICAgICAgICAgICAgICByb2xlSWRzTGlzdDogcm9sZUlkc0xpc3QsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhhbmRsZUVycm9ycyhcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgIHRoaXMuY29uc3RhbnRzPy52aWV3VGVuYW50cz8uZXJyb3JzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGZXRjaCB0aGUgcm9sZXMgYW5kIHBlcm1pc3Npb25zIHJlY29yZHMgYmFzZWQgb24gb2Zmc2V0IGFuZCBwYWdlIHNpemUgd2hpbGUgdGhlIHBhZ2luYXRpb24gY2hhbmdlcy5cclxuICAgKiBAcGFyYW0ge1BhZ2VFdmVudH0gcGFnZUV2ZW50XHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25UYWJsZVBhZ2luYXRpb25DaGFuZ2UocGFnZUV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMudGFibGVQYWdpbmF0aW9uID0ge1xyXG4gICAgICBvZmZzZXQ6IHBhZ2VFdmVudC5wYWdlSW5kZXgsXHJcbiAgICAgIHBhZ2VTaXplOiBwYWdlRXZlbnQucGFnZVNpemUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5nZXRSb2xlc0FuZFBlcm1pc3Npb25zQW5kSW5pdGlhbGl6ZVRhYmxlVmlldyh7XHJcbiAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICBvZmZzZXQ6IHBhZ2VFdmVudC5wYWdlSW5kZXgsXHJcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VFdmVudC5wYWdlU2l6ZSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDYXB0dXJlcyB0aGUgc2VsZWN0ZWQgcm9sZSdzIGluZm9ybWF0aW9uIGFuZCBwZXJmb3JtcyBlZGl0IG9yIGRlbGV0ZSBhY3Rpb24gYmFzaXMgb24gdGhlIHNlbGVjdGVkIG1lbnUgaXRlbS5cclxuICAgKiBAcGFyYW0ge1RhYmxlQ29sdW1uTWVudUluZm99IHJvbGVNZW51SW5mb1xyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uUm9sZU1lbnVDbGljayhyb2xlTWVudUluZm86IFRhYmxlQ29sdW1uTWVudUluZm8pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRSb2xlSW5mby5yb2xlSWQgPSByb2xlTWVudUluZm8/LnRhYmxlQ29sdW1uSW5mbz8uY29sdW1uRGVmO1xyXG4gICAgdGhpcy5zZWxlY3RlZFJvbGVJbmZvLnJvbGVOYW1lID0gcm9sZU1lbnVJbmZvPy50YWJsZUNvbHVtbkluZm8/LmhlYWRpbmc7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LnNldFNlbGVjdGVkUm9sZUluZm9ybWF0aW9uKHRoaXMuc2VsZWN0ZWRSb2xlSW5mbyk7XHJcbiAgICBpZiAocm9sZU1lbnVJbmZvPy5tZW51QWN0aW9uSW5mbz8uaWQgPT09IFJvbGVNZW51QWN0aW9uLkRFTEVURV9ST0xFKSB7XHJcbiAgICAgIHRoaXMub3BlbkRlbGV0ZVJvbGVNb2RhbCgpO1xyXG4gICAgfSBlbHNlIGlmIChyb2xlTWVudUluZm8/Lm1lbnVBY3Rpb25JbmZvPy5pZCA9PT0gUm9sZU1lbnVBY3Rpb24uRURJVF9ST0xFKSB7XHJcbiAgICAgIHRoaXMub3BlbkVkaXRSb2xlRm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgYWNjb3JkaW9uIGJhc2VkIG9uIHRoZSBlbGVtZW50J3MgSUQgaW4gRE9NIHRyZWUuXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgdHJhY2tCeUFjY29yZGlvbkZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEFjY29yZGlvbkluZm8pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGl0ZW0/LmlkIGFzIG51bWJlcjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgcm9sZSB0eXBlcyBhbmQgdXBkYXRlcyB0aGUgZm9ybSBjb250cm9sLlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldFJvbGVUeXBlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IEdldFJvbGVUeXBlc1BheWxvYWQgPSB7XHJcbiAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICBhcHBJZDogdGhpcy50ZW5hbnREZXRhaWxzPy5hcHBJZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgY29uZmlnRmllbGROYW1lOiAncm9sZV90eXBlJyxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLmdldFJvbGVUeXBlcyhwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogUm9sZVR5cGVSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yb2xlVHlwZU9wdGlvbnMgPSB0aGlzLnRlbmFudEFwcFNlcnZpY2UuZ2V0Um9sZVR5cGVPcHRpb25zKFxyXG4gICAgICAgICAgICAgIHJlc3BvbnNlPy5ib2R5IGFzIFJvbGVUeXBlQ29uZmlndXJhdGlvbltdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uc2V0Um9sZVR5cGVPcHRpb24odGhpcy5yb2xlVHlwZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mdW5jdGlvblR5cGUgPT09IFRlbmFudEZ1bmN0aW9uVHlwZS5DUkVBVEVfUk9MRSkge1xyXG4gICAgICAgICAgICAgIHRoaXMub3BlbkNyZWF0ZVJvbGVGb3JtKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFuZGxlRXJyb3JzKFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVSb2xlU2NyZWVuVGV4dHM/LmVycm9yc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZGlhbG9nIG9wdGlvbnMgZm9yIGNyZWF0ZSByb2xlIG1vZGFsIGFuZCBjYWxscyBvcGVuTW9kYWwgbWV0aG9kLlxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5DcmVhdGVSb2xlRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uc2V0VGVuYW50RnVuY3Rpb25UeXBlKFxyXG4gICAgICBUZW5hbnRGdW5jdGlvblR5cGU/LkNSRUFURV9ST0xFXHJcbiAgICApO1xyXG4gICAgdGhpcy5mdW5jdGlvblR5cGUgPSBUZW5hbnRGdW5jdGlvblR5cGUuQ1JFQVRFX1JPTEU7XHJcbiAgICBpZiAodGhpcy5yb2xlVHlwZU9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBkaWFsb2dPcHRpb25zID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IHRoaXMuY29uc3RhbnRzPy5jcmVhdGVSb2xlPy5oZWFkaW5nLFxyXG4gICAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgICAgY29tcG9uZW50UmVmZXJlbmNlOiBDcmVhdGVNb2RpZnlSb2xlQ29tcG9uZW50LFxyXG4gICAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMub3Blbk1vZGFsKGRpYWxvZ09wdGlvbnMsICdpZWVlc2EtY3JlYXRlLW1vZGlmeS1yb2xlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdldFJvbGVUeXBlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaWFsb2cgb3B0aW9ucyBmb3IgY3JlYXRlIGdyb3VwIHR5cGUgbW9kYWwgYW5kIGNhbGxzIG9wZW5Nb2RhbCBtZXRob2QuXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb3BlbkNyZWF0ZUdyb3VwVHlwZUZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LnNldFRlbmFudEZ1bmN0aW9uVHlwZShcclxuICAgICAgVGVuYW50RnVuY3Rpb25UeXBlPy5DUkVBVEVfR1JPVVBfVFlQRVxyXG4gICAgKTtcclxuICAgIHRoaXMuZnVuY3Rpb25UeXBlID0gVGVuYW50RnVuY3Rpb25UeXBlLkNSRUFURV9HUk9VUF9UWVBFO1xyXG4gICAgY29uc3QgZGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGluZzogdGhpcy5jb25zdGFudHM/LmNyZWF0ZUdyb3VwVHlwZT8uaGVhZGluZyxcclxuICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgICAgY29tcG9uZW50UmVmZXJlbmNlOiBDcmVhdGVNb2RpZnlHcm91cFR5cGVDb21wb25lbnQsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1jcmVhdGUtbW9kaWZ5LWdyb3VwLXR5cGUnKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZGlhbG9nIG9wdGlvbnMgZm9yIGVkaXQgcm9sZSBtb2RhbCBhbmQgY2FsbHMgb3Blbk1vZGFsIG1ldGhvZC5cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBvcGVuRWRpdFJvbGVGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlPy5zZXRUZW5hbnRGdW5jdGlvblR5cGUoVGVuYW50RnVuY3Rpb25UeXBlPy5FRElUX1JPTEUpO1xyXG4gICAgdGhpcy5mdW5jdGlvblR5cGUgPSBUZW5hbnRGdW5jdGlvblR5cGUuRURJVF9ST0xFO1xyXG4gICAgY29uc3QgZGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGluZzogdGhpcy5zZWxlY3RlZFJvbGVJbmZvPy5yb2xlTmFtZSxcclxuICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgICAgY29tcG9uZW50UmVmZXJlbmNlOiBDcmVhdGVNb2RpZnlSb2xlQ29tcG9uZW50LFxyXG4gICAgICBtb2RhbFR5cGU6IE1vZGFsVHlwZS5GT1JNLFxyXG4gICAgfTtcclxuICAgIHRoaXMub3Blbk1vZGFsKGRpYWxvZ09wdGlvbnMsICdpZWVlc2EtY3JlYXRlLW1vZGlmeS1yb2xlJyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRpYWxvZyBvcHRpb25zIGZvciBlZGl0IHRlbmFudCBtb2RhbCBhbmQgY2FsbHMgb3Blbk1vZGFsIG1ldGhvZC5cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBvcGVuRWRpdFRlbmFudEZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LnNldFRlbmFudEZ1bmN0aW9uVHlwZShUZW5hbnRGdW5jdGlvblR5cGU/LkVESVQpO1xyXG4gICAgdGhpcy5mdW5jdGlvblR5cGUgPSBUZW5hbnRGdW5jdGlvblR5cGUuRURJVDtcclxuICAgIHRoaXMuZmVhdHVyZUlkc0JlZm9yZUVkaXQgPSB0aGlzLmdldEZlYXR1cmVJZHModGhpcy50ZW5hbnREZXRhaWxzKTtcclxuICAgIGNvbnN0IGRpYWxvZ09wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRpbmc6IHRoaXMudGVuYW50RGV0YWlscz8uYXBwVGl0bGUsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgIGNvbXBvbmVudFJlZmVyZW5jZTogQ3JlYXRlVGVuYW50QXBwbGljYXRpb25Db21wb25lbnQsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1lZGl0LXRlbmFudCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbnMgbW9kYWwgY29tcG9uZW50IHdpdGggcmVjZWl2ZWQgcGFyYW1zIGFuZCBoYW5kbGVzIGZvcm0gc3VibWlzc2lvbiBzdWNjZXNzIGFuZCBlcnJvcnMuXHJcbiAgICogQHBhcmFtIHsqfSBkaWFsb2dPcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGFzc05hbWVdXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnRzRGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5Nb2RhbChcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBkaWFsb2dPcHRpb25zOiBhbnksXHJcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcclxuICApOiB2b2lkIHtcclxuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSA/PyAnJztcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c/Lm9wZW4oTW9kYWxDb21wb25lbnQsIHtcclxuICAgICAgZGF0YTogZGlhbG9nT3B0aW9ucyxcclxuICAgICAgd2lkdGg6ICcnLFxyXG4gICAgICBwYW5lbENsYXNzOiBbJ2llZWVzYS1tb2RhbC1kaWFsb2cnLCBjbGFzc05hbWVdLFxyXG4gICAgICBhcmlhTW9kYWw6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmPy5jb21wb25lbnRJbnN0YW5jZT8uc3VibWl0Rm9ybVJlc3BvbnNlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgbm8tdW51c2VkLXZhcnNcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuZnVuY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFRlbmFudEZ1bmN0aW9uVHlwZT8uRURJVDoge1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2hvd0FsZXJ0TWVzc2FnZShcclxuICAgICAgICAgICAgICBBbGVydFR5cGU/LlNVQ0NFU1MsXHJcbiAgICAgICAgICAgICAgYCR7dGhpcy50ZW5hbnREZXRhaWxzPy5hcHBUaXRsZX0gJHt0aGlzLmVkaXRUZW5hbnRTY3JlZW5UZXh0cz8ubWVzc2FnZT8uc3VjY2Vzcz8uc3VibWlzc2lvbn1gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMudGVuYW50RGV0YWlscyA9IHtcclxuICAgICAgICAgICAgICAuLi4odGhpcy50ZW5hbnRBcHBTZXJ2aWNlLmdldFNlbGVjdGVkVGVuYW50SW5mb3JtYXRpb24oKSBhcyBUZW5hbnRCYXNpY0luZm8pLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnByb21wdFJlU2lnbkluSWZGZWF0dXJlc0NoYW5nZWQoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIFRlbmFudEZ1bmN0aW9uVHlwZT8uQ1JFQVRFX1JPTEU6IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvbXB0TWVzc2FnZSA9IHRoaXMuY3JlYXRlUm9sZVNjcmVlblRleHRzPy5tZXNzYWdlPy5zdWNjZXNzO1xyXG4gICAgICAgICAgICBjb25zdCByb2xlSW5mbyA9IHRoaXMudGVuYW50QXBwU2VydmljZT8uZ2V0TmV3bHlDcmVhdGVkUm9sZUluZm8oKTtcclxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNob3dBbGVydE1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgQWxlcnRUeXBlPy5TVUNDRVNTLFxyXG4gICAgICAgICAgICAgIGAke3Byb21wdE1lc3NhZ2U/LnN1Ym1pc3Npb24xfSAke3JvbGVJbmZvPy5yb2xlTmFtZX0gJHtwcm9tcHRNZXNzYWdlPy5zdWJtaXNzaW9uMn0gJHt0aGlzLnRlbmFudERldGFpbHM/LmFwcFRpdGxlfS4gJHtwcm9tcHRNZXNzYWdlPy5zdWJtaXNzaW9uM31gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Um9sZXNBbmRJbml0aWFsaXplVGFibGVTY2hlbWEoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIFRlbmFudEZ1bmN0aW9uVHlwZT8uRURJVF9ST0xFOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb21wdE1lc3NhZ2UgPSB0aGlzLmNyZWF0ZVJvbGVTY3JlZW5UZXh0cz8ubWVzc2FnZT8uc3VjY2VzcztcclxuICAgICAgICAgICAgY29uc3Qgcm9sZUluZm8gPSB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LmdldE5ld2x5Q3JlYXRlZFJvbGVJbmZvKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5zaG93QWxlcnRNZXNzYWdlKFxyXG4gICAgICAgICAgICAgIEFsZXJ0VHlwZT8uU1VDQ0VTUyxcclxuICAgICAgICAgICAgICBgJHtyb2xlSW5mbz8ucm9sZU5hbWV9ICR7cHJvbXB0TWVzc2FnZT8ubW9kaWZ5fSAke3RoaXMudGVuYW50RGV0YWlscz8uYXBwVGl0bGV9LmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRSb2xlc0FuZEluaXRpYWxpemVUYWJsZVNjaGVtYSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgVGVuYW50RnVuY3Rpb25UeXBlPy5DUkVBVEVfR1JPVVBfVFlQRToge1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2hvd0FsZXJ0TWVzc2FnZShcclxuICAgICAgICAgICAgICBBbGVydFR5cGU/LlNVQ0NFU1MsXHJcbiAgICAgICAgICAgICAgYCR7dGhpcy5jcmVhdGVHcm91cFR5cGVTY3JlZW5UZXh0cz8ubWVzc2FnZT8uc3VjY2Vzcz8uc3VibWlzc2lvblBhcnQxfSAke3RoaXMudGVuYW50QXBwU2VydmljZS5uZXdseUNyZWF0ZWRHcm91cFR5cGUuY29uZmlnRmllbGRWYWx1ZS5uYW1lfSAke3RoaXMuY3JlYXRlR3JvdXBUeXBlU2NyZWVuVGV4dHM/Lm1lc3NhZ2U/LnN1Y2Nlc3M/LnN1Ym1pc3Npb25QYXJ0Mn0gJHt0aGlzLnRlbmFudERldGFpbHM/LmFwcFRpdGxlfS4gYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2UuaXNHcm91cFR5cGVBZGRlZE9yTW9kaWZpZWQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmPy5jb21wb25lbnRJbnN0YW5jZT8uZm9ybUNhbmNlbFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMudGVuYW50QXBwU2VydmljZS5nZXRUZW5hbnRGdW5jdGlvblR5cGUoKSA9PT1cclxuICAgICAgICAgIFRlbmFudEZ1bmN0aW9uVHlwZS5NQVBfUEVSTUlTU0lPTl9BTkRfUk9MRVxyXG4gICAgICAgIClcclxuICAgICAgICAgIHRoaXMuZ2V0Um9sZXNBbmRJbml0aWFsaXplVGFibGVTY2hlbWEoKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZj8uY29tcG9uZW50SW5zdGFuY2U/Lm1vZGFsQ29uZmlybVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMudGVuYW50QXBwU2VydmljZS5nZXRUZW5hbnRGdW5jdGlvblR5cGUoKSA9PT1cclxuICAgICAgICAgIFRlbmFudEZ1bmN0aW9uVHlwZS5NQVBfUEVSTUlTU0lPTl9BTkRfUk9MRVxyXG4gICAgICAgIClcclxuICAgICAgICAgIHRoaXMuZ2V0Um9sZXNBbmRJbml0aWFsaXplVGFibGVTY2hlbWEoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENhbGxzIG9wZW5UZW5hbnRTdGF0dXNDb25maXJtYXRpb25Nb2RhbCB0byBjaGFuZ2UgdGhlIHN0YXR1cyBvZiB0ZW5hbnQgb24gc2xpZGUgdG9nZ2xlIGNoYW5nZS5cclxuICAgKiBAcGFyYW0ge1NsaWRlVG9nZ2xlT3B0aW9ufSBzbGlkZVRvZ2dsZU9wdGlvblxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uU2xpZGVUb2dnbGVDaGFuZ2Uoc2xpZGVUb2dnbGVPcHRpb246IFNsaWRlVG9nZ2xlT3B0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZW5UZW5hbnRTdGF0dXNDb25maXJtYXRpb25Nb2RhbChzbGlkZVRvZ2dsZU9wdGlvbj8uY2hlY2tlZCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE9wZW5zIHRoZSBjb25maXJtYXRpb24gbW9kYWwgdG8gaW5hY3RpdmF0ZS9yZWFjdGl2YXRlIHRoZSB0ZW5hbnQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0FjdGl2YXRlXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb3BlblRlbmFudFN0YXR1c0NvbmZpcm1hdGlvbk1vZGFsKGlzQWN0aXZhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbmZpcm1hdGlvbkluZm8gPSB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmNvbmZpcm1hdGlvbkluZm87XHJcbiAgICBjb25zdCBzdGF0dXNUZXh0ID0gaXNBY3RpdmF0ZVxyXG4gICAgICA/IGNvbmZpcm1hdGlvbkluZm8/LnByb21wdE1lc3NhZ2VBY3RpdmF0ZVxyXG4gICAgICA6IGNvbmZpcm1hdGlvbkluZm8/LnByb21wdE1lc3NhZ2VJbmFjdGl2YXRlO1xyXG4gICAgY29uc3QgdXBkYXRlVGVuYW50U3RhdHVzTW9kYWxPcHRpb25zID0ge1xyXG4gICAgICBsZWZ0QnV0dG9uTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LmxlZnRCdXR0b25MYWJlbCxcclxuICAgICAgcmlnaHRCdXR0b25MYWJlbDogY29uZmlybWF0aW9uSW5mbz8ucmlnaHRCdXR0b25MYWJlbCxcclxuICAgICAgcHJvbXB0TWVzc2FnZTogYCR7Y29uZmlybWF0aW9uSW5mbz8ucHJvbXB0TWVzc2FnZX0gJHtzdGF0dXNUZXh0fSAke3RoaXMudGVuYW50RGV0YWlscz8uYXBwVGl0bGV9P2AsXHJcbiAgICAgIGFjdGlvbkJ1dHRvbkFsaWduOiB0aGlzLmFsaWdubWVudFR5cGU/Lk1JRERMRSxcclxuICAgIH07XHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nPy5vcGVuKE1vZGFsQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHVwZGF0ZVRlbmFudFN0YXR1c01vZGFsT3B0aW9ucyxcclxuICAgICAgd2lkdGg6ICdhdXRvJyxcclxuICAgICAgYXV0b0ZvY3VzOiAnZGlhbG9nJyxcclxuICAgICAgYXJpYUxhYmVsOiBjb25maXJtYXRpb25JbmZvPy5hcmlhTGFiZWw/LmFsZXJ0LFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZlxyXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlVGVuYW50U3RhdHVzKGlzQWN0aXZhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNldFNsaWRlVG9nZ2xlU3RhdHVzKGlzQWN0aXZhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE9wZW5zIHRoZSBtYXAgcGVybWlzc2lvbnMgYW5kIHJvbGVzIG1vZGFsLlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIG9wZW5NYXBSb2xlc0FuZFBlcm1pc3Npb25zRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uc2V0VGVuYW50RnVuY3Rpb25UeXBlKFxyXG4gICAgICBUZW5hbnRGdW5jdGlvblR5cGU/Lk1BUF9QRVJNSVNTSU9OX0FORF9ST0xFXHJcbiAgICApO1xyXG4gICAgY29uc3QgZGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGluZzogdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHMuaGVhZGluZyxcclxuICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgICAgbW9kYWxUeXBlOiBNb2RhbFR5cGUuRk9STSxcclxuICAgICAgY29tcG9uZW50UmVmZXJlbmNlOiBSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZ0NvbXBvbmVudCxcclxuICAgIH07XHJcbiAgICB0aGlzLm9wZW5Nb2RhbChkaWFsb2dPcHRpb25zLCAnaWVlZXNhLW1hcC1wZXJtaXNzaW9ucy1hbmQtcm9sZXMnKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgdGVuYW50IHN0YXR1cyB0byB0aGUgc2VydmVyIHVzaW5nIGh0dHAgcmVxdWVzdCBhbmQgZGlzcGxheSBzdWNjZXNzL2Vycm9yIG1lc3NhZ2UgYmFzZWQgb24gcmVxdWVzdCByZXNwb25zZSAoc3VjY2VzcyBvciBmYWlsdXJlKS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQWN0aXZhdGVcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICB1cGRhdGVUZW5hbnRTdGF0dXMoaXNBY3RpdmF0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3QgdXBkYXRlVGVuYW50U3RhdHVzUmVxdWVzdFBheWxvYWQ6IFVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkID0ge1xyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgYXBwSWQ6IHRoaXMudGVuYW50RGV0YWlscz8uYXBwSWQsXHJcbiAgICAgICAgc3RhdHVzOiBpc0FjdGl2YXRlLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZVxyXG4gICAgICAudXBkYXRlVGVuYW50U3RhdHVzKHVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IFVwZGF0ZVRlbmFudFN0YXR1c1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLnNsaWRlVG9nZ2xlT3B0aW9uLmxhYmVsID0gaXNBY3RpdmF0ZVxyXG4gICAgICAgICAgICAgID8gdGhpcy50ZW5hbnRMYWJlbHM/LmFjdGl2ZVxyXG4gICAgICAgICAgICAgIDogdGhpcy50ZW5hbnRMYWJlbHM/LmluYWN0aXZlO1xyXG4gICAgICAgICAgICB0aGlzLnRlbmFudERldGFpbHMuc3RhdHVzID0gaXNBY3RpdmF0ZTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnREZXRhaWxzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy50ZW5hbnREZXRhaWxzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNldFNsaWRlVG9nZ2xlU3RhdHVzKGlzQWN0aXZhdGUpO1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhhbmRsZUVycm9ycyhcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgIHRoaXMuY29uc3RhbnRzPy52aWV3VGVuYW50cz8uZXJyb3JzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHNsaWRlIHRvZ2dsZSBjaGVja2VkIHN0YXR1cyBhbmQgbGFiZWwuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0FjdGl2YXRlXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgc2V0U2xpZGVUb2dnbGVTdGF0dXMoaXNBY3RpdmF0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zbGlkZVRvZ2dsZU9wdGlvbi5jaGVja2VkID0gIWlzQWN0aXZhdGU7XHJcbiAgICB0aGlzLnNsaWRlVG9nZ2xlT3B0aW9uLmxhYmVsID0gIWlzQWN0aXZhdGVcclxuICAgICAgPyB0aGlzLnRlbmFudExhYmVscz8uYWN0aXZlXHJcbiAgICAgIDogdGhpcy50ZW5hbnRMYWJlbHM/LmluYWN0aXZlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgYXBwbGljYXRpb24vdGVuYW50IHR5cGVzLlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldEFwcGxpY2F0aW9uVHlwZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLmdldEFwcGxpY2F0aW9uVHlwZXMoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogR2V0QXBwVHlwZXNSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy5hcHBUeXBlT3B0aW9ucyA9XHJcbiAgICAgICAgICAgICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlLmdldEFwcGxpY2F0aW9uVHlwZU9wdGlvbnMoXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZT8uYm9keSBhcyBBcHBUeXBlQ29uZmlnW11cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2Uuc2V0QXBwbGljYXRpb25UeXBlKFxyXG4gICAgICAgICAgICAgIHRoaXMuYXBwVHlwZU9wdGlvbnMgYXMgUmFkaW9PcHRpb25bXVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oYW5kbGVFcnJvcnMoXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmVycm9yc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHBlcm1pc3Npb24gYmFzZWQgYWNjZXNzIGZvciBwcm92aWRlZCBmZWF0dXJlLlxyXG4gICAqIEBwYXJhbSB7UGVybWlzc2lvblR5cGV9IHBlcm1pc3Npb25UeXBlXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICB2YWxpZGF0ZUFjY2VzcyhwZXJtaXNzaW9uVHlwZTogUGVybWlzc2lvblR5cGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbmFudEFwcFNlcnZpY2UudmFsaWRhdGVBY2Nlc3MoXHJcbiAgICAgIHBlcm1pc3Npb25UeXBlLFxyXG4gICAgICB0aGlzLnVzZXJUZW5hbnRzUGVybWlzc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBvc3RzIHRoZSBkZXRhaWxzIG9mIHRoZSByb2xlIHRvIGJlIGRlbGV0ZWQgdG8gdGhlIHNlcnZlciB1c2luZyBodHRwIHJlcXVlc3QgYW5kIGRpc3BsYXkgc3VjY2Vzcy9lcnJvciBtZXNzYWdlIGJhc2VkIG9uIHJlcXVlc3QgcmVzcG9uc2UgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkuXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZGVsZXRlUm9sZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZDogRGVsZXRlUm9sZVJlcXVlc3RQYXlsb2FkID0ge1xyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgYXBwSWQ6IHRoaXMudGVuYW50RGV0YWlscz8uYXBwSWQsXHJcbiAgICAgICAgcm9sZUlkOiB0aGlzLnNlbGVjdGVkUm9sZUluZm8/LnJvbGVJZCxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLmRlbGV0ZVJvbGUoZGVsZXRlUm9sZVJlcXVlc3RQYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IERlbGV0ZVJvbGVSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcz8uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5zaG93QWxlcnRNZXNzYWdlKFxyXG4gICAgICAgICAgICAgIEFsZXJ0VHlwZT8uU1VDQ0VTUyxcclxuICAgICAgICAgICAgICBgJHt0aGlzLnNlbGVjdGVkUm9sZUluZm8/LnJvbGVOYW1lfSAke3RoaXMuZGVsZXRlUm9sZVNjcmVlblRleHRzPy5tZXNzYWdlPy5zdWNjZXNzPy5zdWJtaXNzaW9ufSAke3RoaXMudGVuYW50RGV0YWlscz8uYXBwVGl0bGV9LmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRSb2xlc0FuZEluaXRpYWxpemVUYWJsZVNjaGVtYSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oYW5kbGVFcnJvcnMoXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmVycm9yc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgcm9sZSBtZW51IEhUTUxFbGVtZW50LlxyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1lbnVCdXR0b25cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBzZWxlY3RlZFJvbGVNZW51RWxlbWVudChtZW51QnV0dG9uOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb2xlTWVudUVsZW1lbnQgPSBtZW51QnV0dG9uO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgY29uZmlybWF0aW9uIG1vZGFsIHRvIGdldCB1c2VyIGNvbmZpcm1hdGlvbiB0byBkZWxldGUgdGhlIHJvbGUuXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb3BlbkRlbGV0ZVJvbGVNb2RhbCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbmZpcm1hdGlvbkluZm8gPSB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmNvbmZpcm1hdGlvbkluZm87XHJcbiAgICBjb25zdCBkZWxldGVSb2xlTW9kYWxPcHRpb25zID0ge1xyXG4gICAgICBsZWZ0QnV0dG9uTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LmxlZnRCdXR0b25MYWJlbCxcclxuICAgICAgcmlnaHRCdXR0b25MYWJlbDogY29uZmlybWF0aW9uSW5mbz8ucmlnaHRCdXR0b25MYWJlbCxcclxuICAgICAgcHJvbXB0TWVzc2FnZTogYCR7Y29uZmlybWF0aW9uSW5mbz8uZGVsZXRlUm9sZUNvbmZpcm1hdGlvbk1lc3NhZ2V9ICR7dGhpcy5zZWxlY3RlZFJvbGVJbmZvPy5yb2xlTmFtZX0/ICR7Y29uZmlybWF0aW9uSW5mbz8uZGVsZXRlUm9sZVByb21wdE1lc3NhZ2V9ICR7dGhpcy50ZW5hbnREZXRhaWxzPy5hcHBUaXRsZX0uYCxcclxuICAgICAgYWN0aW9uQnV0dG9uQWxpZ246IHRoaXMuYWxpZ25tZW50VHlwZT8uTUlERExFLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c/Lm9wZW4oTW9kYWxDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgZGF0YTogZGVsZXRlUm9sZU1vZGFsT3B0aW9ucyxcclxuICAgICAgd2lkdGg6ICcyNSUnLFxyXG4gICAgICBwYW5lbENsYXNzOiBbXHJcbiAgICAgICAgJ2llZWVzYS1tb2RhbC1jb25maXJtLWRpYWxvZycsXHJcbiAgICAgICAgJ2llZWVzYS1kZWxldGUtcm9sZS1jb25maXJtLWRpYWxvZycsXHJcbiAgICAgIF0sXHJcbiAgICAgIGF1dG9Gb2N1czogJ2RpYWxvZycsXHJcbiAgICAgIGFyaWFMYWJlbDogY29uZmlybWF0aW9uSW5mbz8uYXJpYUxhYmVsPy5hbGVydCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2dSZWZcclxuICAgICAgLmFmdGVyQ2xvc2VkKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZVJvbGUoKTtcclxuICAgICAgICB9IGVsc2UgdGhpcy5yb2xlTWVudUVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGlkcyBvZiB0aGUgZ2l2ZW4gdGVuYW50LlxyXG4gICAqIEBwYXJhbSB7VGVuYW50QmFzaWNJbmZvfSBbdGVuYW50XVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfVxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmVhdHVyZUlkcyh0ZW5hbnQ/OiBUZW5hbnRCYXNpY0luZm8pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gKHRlbmFudD8uZmVhdHVyZXMgPz8gW10pXHJcbiAgICAgIC5tYXAoKGZlYXR1cmUpID0+IGZlYXR1cmU/LmZlYXR1cmVJZClcclxuICAgICAgLmZpbHRlcihCb29sZWFuKVxyXG4gICAgICAuc29ydCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgcmUtc2lnbi1pbiBjb25maXJtYXRpb24gbW9kYWwgd2hlbiB0aGUgdGVuYW50IGZlYXR1cmUgbGlzdCBjaGFuZ2VkIG9uIHNhdmUsIHNpbmNlXHJcbiAgICogZmVhdHVyZSBmbGFncyBhcmUgb25seSByZWZyZXNoZWQgYXQgbG9naW4uIEVtaXRzIHNpZ25PdXRSZXF1ZXN0ZWQgd2hlbiB0aGUgdXNlciBjb25maXJtcy5cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHByb21wdFJlU2lnbkluSWZGZWF0dXJlc0NoYW5nZWQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmZWF0dXJlSWRzQWZ0ZXJFZGl0ID0gdGhpcy5nZXRGZWF0dXJlSWRzKHRoaXMudGVuYW50RGV0YWlscyk7XHJcbiAgICBpZiAoXHJcbiAgICAgIGZlYXR1cmVJZHNBZnRlckVkaXQuam9pbignLCcpID09PSB0aGlzLmZlYXR1cmVJZHNCZWZvcmVFZGl0LmpvaW4oJywnKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbmZpcm1hdGlvbkluZm8gPSB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmNvbmZpcm1hdGlvbkluZm87XHJcbiAgICB0aGlzLmRpYWxvZ1xyXG4gICAgICA/Lm9wZW4oTW9kYWxDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBsZWZ0QnV0dG9uTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LmZlYXR1cmVDaGFuZ2VTaWduT3V0TGVmdEJ1dHRvbkxhYmVsLFxyXG4gICAgICAgICAgcmlnaHRCdXR0b25MYWJlbDpcclxuICAgICAgICAgICAgY29uZmlybWF0aW9uSW5mbz8uZmVhdHVyZUNoYW5nZVNpZ25PdXRSaWdodEJ1dHRvbkxhYmVsLFxyXG4gICAgICAgICAgcHJvbXB0TWVzc2FnZTogY29uZmlybWF0aW9uSW5mbz8uZmVhdHVyZUNoYW5nZVNpZ25PdXRNZXNzYWdlLFxyXG4gICAgICAgICAgYWN0aW9uQnV0dG9uQWxpZ246IHRoaXMuYWxpZ25tZW50VHlwZT8uTUlERExFLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6ICcyNSUnLFxyXG4gICAgICAgIHBhbmVsQ2xhc3M6IFtcclxuICAgICAgICAgICdpZWVlc2EtbW9kYWwtY29uZmlybS1kaWFsb2cnLFxyXG4gICAgICAgICAgJ2llZWVzYS1mZWF0dXJlLWNoYW5nZS1zaWduLW91dC1kaWFsb2cnLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgYXV0b0ZvY3VzOiAnZGlhbG9nJyxcclxuICAgICAgICBhcmlhTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LmFyaWFMYWJlbD8uYWxlcnQsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5hZnRlckNsb3NlZCgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoaXNTaWduT3V0Q29uZmlybWVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzU2lnbk91dENvbmZpcm1lZCkge1xyXG4gICAgICAgICAgdGhpcy5zaWduT3V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ2xlYXJzIHRoZSBzZXNzaW9uIGFuZCByZWRpcmVjdHMgdG8gdGhlIFNTTyBzaWduLW91dCBVUkwsIG1pcnJvcmluZyB0aGUgaGVhZGVyIHNpZ24tb3V0LlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2lnbk91dCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zaWduT3V0Q29uZmlnPy5zc29TaWduT3V0VXJsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYXV0aFNlcnZpY2U/LmRlbGV0ZUNvb2tpZSh0aGlzLnNpZ25PdXRDb25maWc/LmNvb2tpZU5hbWUpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZT8uY2xlYXJTdG9yYWdlKCk7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuc2lnbk91dENvbmZpZy5zc29TaWduT3V0VXJsO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQZXJmb3JtcyBuZWNlc3NhcnkgY2xlYW51cCB0YXNrcywgc3VjaCBhcyB1bnN1YnNjcmliaW5nIGZyb20gc3Vic2NyaXB0aW9uIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvbGVUeXBlT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlPy5zZXRSb2xlVHlwZU9wdGlvbih0aGlzLnJvbGVUeXBlT3B0aW9ucyk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkPy5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JD8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gIGNsYXNzPVwiaWVlZXNhLXZpZXctdGVuYW50LWluZm8gcHgtNCBwYi00XCJcclxuICBbbmdDbGFzc109XCJcclxuICAgIGlzTW9iaWxlVmlld1xyXG4gICAgICA/ICdpZWVlc2Etdmlldy10ZW5hbnQtaW5mby0tYmctd2hpdGUnXHJcbiAgICAgIDogJ2llZWVzYS12aWV3LXRlbmFudC1pbmZvLS1iZy1ibHVlJ1xyXG4gIFwiXHJcbj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtbGctNCBnYXAtbWQtMyBnYXAtc20tMiBnYXAtM1wiXHJcbiAgICBbbmdDbGFzc109XCJpc01vYmlsZVZpZXcgPyAnZmxleC1jb2x1bW4gZ2FwLTIgcGItMycgOiAnYWxpZ24taXRlbS1jZW50ZXInXCJcclxuICA+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZC1mbGV4IGdhcC1sZy00IGdhcC1tZC0zIGdhcC1zbS0zIGdhcC0zIHBzLTAgYWxpZ24taXRlbXMtbWQtY2VudGVyIGFsaWduLWl0ZW1zLXhsLWNlbnRlclwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cImlzTW9iaWxlVmlldyA/ICdmbGV4LWNvbHVtbicgOiAnJ1wiXHJcbiAgICA+XHJcbiAgICAgIDxwXHJcbiAgICAgICAgY2xhc3M9XCJtYi0wIGllZWVzYS1oZWFkbGluZS1sZy0zMiBweS0zXCJcclxuICAgICAgICBbbmdDbGFzc109XCJpc01vYmlsZVZpZXcgPyAnJyA6ICdpZWVlc2Etdmlldy10ZW5hbnQtaW5mby0tdGl0bGUnXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHRlbmFudERldGFpbHM/LmFwcFRpdGxlIH19XHJcbiAgICAgIDwvcD5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtbGctMiBnYXAtbWQtMiBnYXAtc20tMiBnYXAtMlwiPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cIm1iLTAgaWVlZXNhLXRpdGxlLXNtLTE0IG10LTFcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiaXNNb2JpbGVWaWV3ID8gJ3AtMCcgOiAnaWVlZXNhLXZpZXctdGVuYW50LWluZm8tLWFwcC1pZCdcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IHRlbmFudExhYmVscz8uYXBwSWQgfX06XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIHt7IHRlbmFudERldGFpbHM/LmFwcElkIH19XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlbmFudERldGFpbHM/LmFwcElkICE9PSB0ZW5hbnRMYWJlbHM/LnNhQXBwSWRcIj5cclxuICAgICAgICAgIDxtYXQtZGl2aWRlciBbdmVydGljYWxdPVwidHJ1ZVwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cIm1iLTAgbXQtMSBpZWVlc2EtdGl0bGUtc20tMTQgaWVlZXNhLXZpZXctdGVuYW50LWluZm8tLWFwcC1zdGF0dXNcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJpc01vYmlsZVZpZXcgPyAncC0wJyA6ICcnXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgdGVuYW50TGFiZWxzPy5zdGF0dXMgfX06XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8aWVlZXNhLXNsaWRlLXRvZ2dsZVxyXG4gICAgICAgICAgICBbc2xpZGVUb2dnbGVdPVwic2xpZGVUb2dnbGVPcHRpb25cIlxyXG4gICAgICAgICAgICAoc2xpZGVUb2dnbGVDaGFuZ2UpPVwib25TbGlkZVRvZ2dsZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgID48L2llZWVzYS1zbGlkZS10b2dnbGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YVxyXG4gICAgICBjbGFzcz1cImllZWVzYS1idG4tbGFiZWwtbGctYm9sZC0xNiB0ZXh0LWRlY29yYXRpb24tbm9uZSBtdC1sZy0zIG10LXhsLTYgcC1zbS0wIHAtbWQtMFwiXHJcbiAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIlxyXG4gICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgW3JvdXRlckxpbmtdPVwidmlld1RlbmFudHNSb3V0ZVVybFwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cIlxyXG4gICAgICAgIGlzTW9iaWxlVmlld1xyXG4gICAgICAgICAgPyAnaWVlZXNhLXZpZXctdGVuYW50LWluZm8tLWxpbmstbW9iaWxlJ1xyXG4gICAgICAgICAgOiAnaWVlZXNhLXZpZXctdGVuYW50LWluZm8tLWxpbmsnXHJcbiAgICAgIFwiXHJcbiAgICAgID57eyB0ZW5hbnRMYWJlbHM/LnZpZXdBbGxBcHBzIH19PC9hXHJcbiAgICA+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fYWNjb3JkaW9uIGllZWVzYS12aWV3LXRlbmFudC1pbmZvX19hY2NvcmRpb24tLWJsdWUtYmdcIlxyXG4gICAgW25nQ2xhc3NdPVwiaXNNb2JpbGVWaWV3ID8gJ2llZWVzYS12aWV3LXRlbmFudC1pbmZvX19hY2NvcmRpb24tLWluZm8nIDogJydcIlxyXG4gID5cclxuICAgIDxuZy1jb250YWluZXJcclxuICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgbGV0IGFjY29yZGlvbkluZm8gb2YgYWNjb3JkaW9uSW5mb0xpc3Q7XHJcbiAgICAgICAgdHJhY2tCeTogdHJhY2tCeUFjY29yZGlvbkZuXHJcbiAgICAgIFwiXHJcbiAgICA+XHJcbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImFjY29yZGlvbkluZm8uaWRcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJhY2NvcmRpb25EZXRhaWxzLkJBU0lDX0RFVEFJTFNcIj5cclxuICAgICAgICAgIDxpZWVlc2EtYWNjb3JkaW9uXHJcbiAgICAgICAgICAgIFthY2NvcmRpb25JbmZvXT1cImFjY29yZGlvbkluZm9cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImllZWVzYS12aWV3LXRlbmFudC1pbmZvX19hY2NvcmRpb24taW5mb1wiXHJcbiAgICAgICAgICAgIChhY2NvcmRpb25PcGVuZWQpPVwic2hvd1RlbmFudERldGFpbHMoYWNjb3JkaW9uSW5mbywgJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpZWVlc2EtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgaXNCYXNpY0RldGFpbHNFeHBhbmRlZCAmJlxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVBY2Nlc3MocGVybWlzc2lvblR5cGUuTUFOQUdFX1RFTkFOVClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIGFjdGlvbnNcclxuICAgICAgICAgICAgICBjbGFzcz1cImllZWVzYS1idXR0b25cIlxyXG4gICAgICAgICAgICAgIFtpY29uQnV0dG9uXT1cImVkaXRCdXR0b25cIlxyXG4gICAgICAgICAgICAgIChpY29uQnV0dG9uQ2xpY2spPVwib3BlbkVkaXRUZW5hbnRGb3JtKClcIlxyXG4gICAgICAgICAgICA+PC9pZWVlc2EtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgY29tcG9uZW50ICpuZ0lmPVwiaXNCYXNpY0RldGFpbHNFeHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgIDxpZWVlc2EtdGVuYW50LWJhc2ljLWRldGFpbHNcclxuICAgICAgICAgICAgICAgIFt0ZW5hbnREZXRhaWxzXT1cInRlbmFudERldGFpbHNcIlxyXG4gICAgICAgICAgICAgID48L2llZWVzYS10ZW5hbnQtYmFzaWMtZGV0YWlscz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2llZWVzYS1hY2NvcmRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiYWNjb3JkaW9uRGV0YWlscy5ST0xFU19BTkRfUEVSTUlTU0lPTlNcIj5cclxuICAgICAgICAgIDxpZWVlc2EtYWNjb3JkaW9uXHJcbiAgICAgICAgICAgIFthY2NvcmRpb25JbmZvXT1cImFjY29yZGlvbkluZm9cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImllZWVzYS12aWV3LXRlbmFudC1pbmZvX19yb2xlcy1hbmQtcGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICAoYWNjb3JkaW9uT3BlbmVkKT1cInNob3dUZW5hbnREZXRhaWxzKGFjY29yZGlvbkluZm8sICRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgYWN0aW9uc1xyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNSb2xlc0FuZFBlcm1pc3Npb25zRXhwYW5kZWRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGdhcC0zXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJcclxuICAgICAgICAgICAgICAgIGlzTW9iaWxlVmlldyA/ICdtYi0zIHB4LTQnIDogJ2llZWVzYS12aWV3LXRlbmFudC1pbmZvX19hY3Rpb25zJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC10ZXJ0aWFyeS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNNb2JpbGVWaWV3ID8gJ3AtMCcgOiAncHgtMiBweS0yJ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNyZWF0ZVJvbGVGb3JtKClcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ2YWxpZGF0ZUFjY2VzcyhwZXJtaXNzaW9uVHlwZS5NQU5BR0VfVEVOQU5UKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgY29uc3RhbnRzLnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zLmFjdGlvbkJ1dHRvbkxhYmVscy5hZGRSb2xlXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXRlcnRpYXJ5LWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbk1hcFJvbGVzQW5kUGVybWlzc2lvbnNGb3JtKClcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNNb2JpbGVWaWV3ID8gJ3AtMCcgOiAncHgtMiBweS0yJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgY29uc3RhbnRzLnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zLmFjdGlvbkJ1dHRvbkxhYmVsc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXBQZXJtaXNzaW9uc1JvbGVzXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBjb21wb25lbnQgKm5nSWY9XCJpc1JvbGVzQW5kUGVybWlzc2lvbnNFeHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtZGl2aWRlclxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fcm9sZXMtYW5kLXBlcm1pc3Npb25zX19kaXZpZGVyXCJcclxuICAgICAgICAgICAgICA+PC9tYXQtZGl2aWRlcj5cclxuICAgICAgICAgICAgICA8aWVlZXNhLWRhdGEtdGFibGVcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uU2NoZW1hLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICBbdGFibGVEYXRhSW5mb109XCJ0YWJsZURhdGFcIlxyXG4gICAgICAgICAgICAgICAgW2hlYWRlckVsZW1lbnRDbGFzc05hbWVdPVwiaGVhZGVyRWxlbWVudENsYXNzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbY29sdW1uU2NoZW1hSW5mb109XCJjb2x1bW5TY2hlbWFcIlxyXG4gICAgICAgICAgICAgICAgW2NhcHRpb25dPVwicm9sZXNBbmRQZXJtaXNzaW9uc1RhYmxlQ2FwdGlvblwiXHJcbiAgICAgICAgICAgICAgICBbcGFnaW5hdG9yQ29uZmlnXT1cInBhZ2luYXRvckNvbmZpZ1wiXHJcbiAgICAgICAgICAgICAgICBbdGFibGVBY3Rpb25zXT1cInRhYmxlQWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICBbaXNTY3JvbGxTdXBwb3J0TWVzc2FnZU5lZWRlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFt0YWJsZUNvbHVtbkFjdGlvbk1lbnVTaXplXT1cImljb25TaXplXCJcclxuICAgICAgICAgICAgICAgIFt0YWJsZUNvbHVtbkFjdGlvbnNdPVwibWVudUl0ZW1zXCJcclxuICAgICAgICAgICAgICAgIFtjdXN0b21TdGlja3lIZWFkZXJOZWVkZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbdGFibGVDb2x1bW5zSGVhZGVyVGV4dF09XCJyb2xlc0FuZFBlcm1pc3Npb25zVGFibGVIZWFkZXJOYW1lXCJcclxuICAgICAgICAgICAgICAgIFtzY3JvbGxiYXJTdXBwb3J0TWVzc2FnZV09XCJcclxuICAgICAgICAgICAgICAgICAgcm9sZXNBbmRQZXJtaXNzaW9uc1RhYmxlU3VwcG9ydE1lc3NhZ2VcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbdmVydGljYWxDb2x1bW5IZWFkZXJOdW1iZXJdPVwicGVybWlzc2lvbnNDb2x1bW5DbGFzc051bWJlclwiXHJcbiAgICAgICAgICAgICAgICAocGFnaW5hdGlvbkNoYW5nZSk9XCJvblRhYmxlUGFnaW5hdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICh0YWJsZUNvbHVtbk1lbnVBY3Rpb25DbGljayk9XCJvblJvbGVNZW51Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAodGFibGVDb2x1bW5NZW51VG9nZ2xlQnV0dG9uKT1cInNlbGVjdGVkUm9sZU1lbnVFbGVtZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgID48L2llZWVzYS1kYXRhLXRhYmxlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvaWVlZXNhLWFjY29yZGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJhY2NvcmRpb25EZXRhaWxzLkdST1VQX1RZUEVTXCI+XHJcbiAgICAgICAgICA8aWVlZXNhLWFjY29yZGlvblxyXG4gICAgICAgICAgICBbYWNjb3JkaW9uSW5mb109XCJhY2NvcmRpb25JbmZvXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fZ3JvdXAtdHlwZXNcIlxyXG4gICAgICAgICAgICAoYWNjb3JkaW9uT3BlbmVkKT1cInNob3dUZW5hbnREZXRhaWxzKGFjY29yZGlvbkluZm8sICRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgYWN0aW9uc1xyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNHcm91cFR5cGVzRXhwYW5kZWRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGdhcC0zXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJcclxuICAgICAgICAgICAgICAgIGlzTW9iaWxlVmlldyA/ICdtYi0zIHB4LTQnIDogJ2llZWVzYS12aWV3LXRlbmFudC1pbmZvX19hY3Rpb25zJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC10ZXJ0aWFyeS1idXR0b24gcC0yXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwidmFsaWRhdGVBY2Nlc3MocGVybWlzc2lvblR5cGUuTUFOQUdFX1RFTkFOVClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DcmVhdGVHcm91cFR5cGVGb3JtKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IGNvbnN0YW50cy52aWV3R3JvdXBUeXBlcy5hY3Rpb25CdXR0b25MYWJlbHMuYWRkR3JvdXBUeXBlIH19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIGNvbXBvbmVudCAqbmdJZj1cImlzR3JvdXBUeXBlc0V4cGFuZGVkXCI+XHJcbiAgICAgICAgICAgICAgPGllZWVzYS12aWV3LXRlbmFudC1ncm91cC10eXBlcz48L2llZWVzYS12aWV3LXRlbmFudC1ncm91cC10eXBlcz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2llZWVzYS1hY2NvcmRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgPGllZWVzYS1hY2NvcmRpb25cclxuICAgICAgICAgICAgW2FjY29yZGlvbkluZm9dPVwiYWNjb3JkaW9uSW5mb1wiXHJcbiAgICAgICAgICAgIChhY2NvcmRpb25PcGVuZWQpPVwic2hvd1RlbmFudERldGFpbHMoYWNjb3JkaW9uSW5mbywgJGV2ZW50KVwiXHJcbiAgICAgICAgICA+PC9pZWVlc2EtYWNjb3JkaW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|