client-core-services 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/client-core-services.mjs +5 -0
- package/esm2020/lib/my-lib.module.mjs +98 -0
- package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
- package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
- package/esm2020/lib/services/api/api.service.mjs +611 -0
- package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
- package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
- package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
- package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
- package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
- package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
- package/esm2020/lib/services/chart/chart.service.mjs +166 -0
- package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
- package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
- package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
- package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
- package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
- package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
- package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
- package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
- package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
- package/esm2020/lib/services/download/download.service.mjs +151 -0
- package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
- package/esm2020/lib/services/env/env.service.mjs +232 -0
- package/esm2020/lib/services/env/serverHostList.mjs +56 -0
- package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
- package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
- package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
- package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
- package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
- package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
- package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
- package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
- package/esm2020/lib/services/loader/loader.service.mjs +17 -0
- package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
- package/esm2020/lib/services/model/model.service.mjs +30 -0
- package/esm2020/lib/services/notify/notification.service.mjs +84 -0
- package/esm2020/lib/services/operator/operator.service.mjs +58 -0
- package/esm2020/lib/services/permission/permission.service.mjs +88 -0
- package/esm2020/lib/services/router/router.service.mjs +78 -0
- package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
- package/esm2020/lib/services/storage/storage.service.mjs +749 -0
- package/esm2020/lib/services/tree-component/interface.mjs +6 -0
- package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
- package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
- package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
- package/esm2020/lib/shared/configuration/config.mjs +76 -0
- package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
- package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
- package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
- package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
- package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
- package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
- package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
- package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
- package/esm2020/lib/shared/platform.mjs +2 -0
- package/esm2020/public-api.mjs +53 -0
- package/fesm2015/client-core-services.mjs +15487 -0
- package/fesm2015/client-core-services.mjs.map +1 -0
- package/fesm2020/client-core-services.mjs +15482 -0
- package/fesm2020/client-core-services.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/my-lib.module.d.ts +18 -0
- package/lib/services/api/api-call/api-call.service.d.ts +60 -0
- package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
- package/lib/services/api/api.service.d.ts +88 -0
- package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
- package/lib/services/api/auth/auth.service.d.ts +50 -0
- package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
- package/lib/services/api/common-api/common-api.service.d.ts +22 -0
- package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
- package/lib/services/api/public-api/public-api.service.d.ts +14 -0
- package/lib/services/chart/chart.service.d.ts +21 -0
- package/lib/services/check-if/check-if.service.d.ts +50 -0
- package/lib/services/common-utils/common-function.service.d.ts +84 -0
- package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
- package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
- package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
- package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
- package/lib/services/data-share/data-share.service.d.ts +174 -0
- package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
- package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
- package/lib/services/download/download.service.d.ts +35 -0
- package/lib/services/encryption/encryption.service.d.ts +8 -0
- package/lib/services/env/env.service.d.ts +44 -0
- package/lib/services/env/serverHostList.d.ts +9 -0
- package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
- package/lib/services/form/form-control/form-control.service.d.ts +44 -0
- package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
- package/lib/services/form/form-value/form-value.service.d.ts +32 -0
- package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
- package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
- package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
- package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
- package/lib/services/loader/loader.service.d.ts +8 -0
- package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
- package/lib/services/model/model.service.d.ts +11 -0
- package/lib/services/notify/notification.service.d.ts +22 -0
- package/lib/services/operator/operator.service.d.ts +27 -0
- package/lib/services/permission/permission.service.d.ts +18 -0
- package/lib/services/router/router.service.d.ts +14 -0
- package/lib/services/storage/cookies.service.d.ts +11 -0
- package/lib/services/storage/storage.service.d.ts +132 -0
- package/lib/services/tree-component/interface.d.ts +13 -0
- package/lib/services/tree-component/tree-component.service.d.ts +38 -0
- package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
- package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
- package/lib/shared/configuration/config.d.ts +144 -0
- package/lib/shared/configuration/editor-config.d.ts +72 -0
- package/lib/shared/enums/common.enum.d.ts +16 -0
- package/lib/shared/enums/config.enum.d.ts +54 -0
- package/lib/shared/enums/end-point.enum.d.ts +66 -0
- package/lib/shared/enums/flags.enum.d.ts +18 -0
- package/lib/shared/enums/keycodes.enum.d.ts +120 -0
- package/lib/shared/enums/operator_type.enum.d.ts +9 -0
- package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
- package/lib/shared/platform.d.ts +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +49 -0
|
@@ -0,0 +1,767 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../storage/storage.service";
|
|
4
|
+
import * as i2 from "../api/api.service";
|
|
5
|
+
import * as i3 from "../data-share/data-share.service";
|
|
6
|
+
import * as i4 from "../common-utils/common-function.service";
|
|
7
|
+
export class UserPrefrenceService {
|
|
8
|
+
constructor(storageService, apiService, dataShareService, commonFunctionService) {
|
|
9
|
+
this.storageService = storageService;
|
|
10
|
+
this.apiService = apiService;
|
|
11
|
+
this.dataShareService = dataShareService;
|
|
12
|
+
this.commonFunctionService = commonFunctionService;
|
|
13
|
+
}
|
|
14
|
+
updateUserPreference(data, fieldName, parent) {
|
|
15
|
+
return new Promise(async (resolve) => {
|
|
16
|
+
try {
|
|
17
|
+
let payloadData;
|
|
18
|
+
switch (fieldName) {
|
|
19
|
+
case 'preferenceMap':
|
|
20
|
+
payloadData = this.modifiedMenuObj(data, fieldName, parent);
|
|
21
|
+
break;
|
|
22
|
+
case 'tab':
|
|
23
|
+
payloadData = this.addOrRemoveTabs(data);
|
|
24
|
+
break;
|
|
25
|
+
case 'preference':
|
|
26
|
+
payloadData = this.saveColumn(data);
|
|
27
|
+
break;
|
|
28
|
+
default:
|
|
29
|
+
payloadData = this.storageService.getUserPreference();
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
const payload = {
|
|
33
|
+
curTemp: 'user_preference',
|
|
34
|
+
data: payloadData,
|
|
35
|
+
};
|
|
36
|
+
this.apiService.SaveFormData(payload);
|
|
37
|
+
resolve({ success: true });
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
resolve({ success: false });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
addOrRemoveTabs(tab) {
|
|
45
|
+
let menuIndexs = this.dataShareService.getMenuOrSubmenuIndexs();
|
|
46
|
+
let modules = this.storageService.GetModules();
|
|
47
|
+
let extractedMenu = this.extractMenuDetails(tab, modules, menuIndexs);
|
|
48
|
+
// let userPreference = this.updateFavTabs(extractedMenu, tab);
|
|
49
|
+
let userPreference = this.createUserPreference('preferenceMap');
|
|
50
|
+
userPreference['preferenceMap'] = extractedMenu;
|
|
51
|
+
return userPreference;
|
|
52
|
+
}
|
|
53
|
+
// Modifies the user preference object with the provided data
|
|
54
|
+
modifiedMenuObj(data, fieldName, parent) {
|
|
55
|
+
let modifiedMenuObj = this.prepareMenuJson(data, fieldName, parent);
|
|
56
|
+
// let userPreference = this.storageService.getUserPreference();
|
|
57
|
+
// userPreference[fieldName] = this.mergeMenus(userPreference[fieldName],modifiedMenuObj,parent);
|
|
58
|
+
let userPreference = this.createUserPreference(fieldName);
|
|
59
|
+
userPreference[fieldName] = modifiedMenuObj;
|
|
60
|
+
return userPreference;
|
|
61
|
+
}
|
|
62
|
+
// Prepares a menu object from menu items
|
|
63
|
+
prepareMenuJson(menuItems, fieldName, parent) {
|
|
64
|
+
const menu = {};
|
|
65
|
+
const itemsArray = Array.isArray(menuItems) ? menuItems : [menuItems];
|
|
66
|
+
itemsArray.forEach((item) => {
|
|
67
|
+
const moduleName = this.storageService.getModule();
|
|
68
|
+
const menuReference = {
|
|
69
|
+
...this.commonFunctionService.getReferenceObject(item),
|
|
70
|
+
allSelected: true,
|
|
71
|
+
};
|
|
72
|
+
let menuData;
|
|
73
|
+
// let menus = userPreference[fieldName];
|
|
74
|
+
if (parent) {
|
|
75
|
+
// If parent exists and has a submenu, add the current menu to the existing submenu
|
|
76
|
+
let refObj = {
|
|
77
|
+
favourite: item.favourite,
|
|
78
|
+
reference: {
|
|
79
|
+
...this.commonFunctionService.getReferenceObject(menuItems),
|
|
80
|
+
allSelected: true,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
let parObjRef = this.commonFunctionService.getReferenceObject(parent);
|
|
84
|
+
menuData = {
|
|
85
|
+
reference: parObjRef,
|
|
86
|
+
favourite: item.favourite,
|
|
87
|
+
submenus: {
|
|
88
|
+
[menuItems.name]: refObj,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
if (moduleName != null) {
|
|
92
|
+
menu[moduleName] = {
|
|
93
|
+
favourite: item.favourite,
|
|
94
|
+
reference: this.getModuleRef(moduleName),
|
|
95
|
+
menus: {
|
|
96
|
+
[parent.name]: menuData
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
return menu;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
menuData = {
|
|
104
|
+
reference: menuReference,
|
|
105
|
+
favourite: item.favourite,
|
|
106
|
+
};
|
|
107
|
+
if (moduleName !== null) {
|
|
108
|
+
menu[moduleName] = {
|
|
109
|
+
reference: this.getModuleRef(moduleName),
|
|
110
|
+
favourite: item.favourite,
|
|
111
|
+
menus: {
|
|
112
|
+
[item.name]: menuData
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
return menu;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return menu;
|
|
120
|
+
}
|
|
121
|
+
//Create UserPreference when not exist
|
|
122
|
+
createUserPreference(fieldName) {
|
|
123
|
+
let uref = {};
|
|
124
|
+
let userRef = this.commonFunctionService.getReferenceObject(this.storageService.GetUserInfo());
|
|
125
|
+
uref['userId'] = userRef;
|
|
126
|
+
//set empty obj for required key
|
|
127
|
+
uref[fieldName] = {};
|
|
128
|
+
return uref;
|
|
129
|
+
}
|
|
130
|
+
//Get Module Reference by Module Name
|
|
131
|
+
getModuleRef(moduleName) {
|
|
132
|
+
let Allmodules = this.storageService.GetModules();
|
|
133
|
+
let module = Allmodules.filter((module) => {
|
|
134
|
+
return module.name == moduleName;
|
|
135
|
+
});
|
|
136
|
+
return this.commonFunctionService.getReferenceObject(module[0]);
|
|
137
|
+
}
|
|
138
|
+
// GetTemplateTabs in current Menu
|
|
139
|
+
getTemplateTabs() {
|
|
140
|
+
const tabsData = this.dataShareService.getTempData();
|
|
141
|
+
const templateTabs = tabsData?.[0]?.templateTabs ?? null;
|
|
142
|
+
return templateTabs;
|
|
143
|
+
}
|
|
144
|
+
// Gets all tab's reference Obj from the provided array of tabs
|
|
145
|
+
getAllTabs(tabs) {
|
|
146
|
+
if (!tabs) {
|
|
147
|
+
return {};
|
|
148
|
+
}
|
|
149
|
+
const allTabs = tabs.reduce((acc, tab) => {
|
|
150
|
+
const tabRef = this.getTabRef(tab);
|
|
151
|
+
if (tabRef && Object.keys(tabRef).length > 0) {
|
|
152
|
+
Object.assign(acc, tabRef);
|
|
153
|
+
}
|
|
154
|
+
return acc;
|
|
155
|
+
}, {});
|
|
156
|
+
return allTabs;
|
|
157
|
+
}
|
|
158
|
+
// Gets only the tab's reference Obj with favourite set to true from the provided array of tabs
|
|
159
|
+
getFebTabs(tabs) {
|
|
160
|
+
if (!tabs) {
|
|
161
|
+
return {};
|
|
162
|
+
}
|
|
163
|
+
return tabs
|
|
164
|
+
.filter((tab) => tab.favourite === true)
|
|
165
|
+
.reduce((acc, tab) => {
|
|
166
|
+
const tabRef = this.getTabRef(tab);
|
|
167
|
+
if (tabRef && Object.keys(tabRef).length > 0) {
|
|
168
|
+
Object.assign(acc, tabRef);
|
|
169
|
+
}
|
|
170
|
+
return acc;
|
|
171
|
+
}, {});
|
|
172
|
+
}
|
|
173
|
+
// Creates a reference object for a tab
|
|
174
|
+
getTabRef(tab, optKey) {
|
|
175
|
+
let res = {};
|
|
176
|
+
if (tab && tab.tab_name != '' && tab.tab_name != null) {
|
|
177
|
+
const tabReference = {
|
|
178
|
+
reference: this.commonFunctionService.getReferenceObject(tab),
|
|
179
|
+
};
|
|
180
|
+
if (optKey != '' && optKey != undefined) {
|
|
181
|
+
tabReference[optKey] = tab.favourite;
|
|
182
|
+
}
|
|
183
|
+
res[tab.tab_name] = tabReference;
|
|
184
|
+
}
|
|
185
|
+
return res;
|
|
186
|
+
}
|
|
187
|
+
// Merges existingMenus with newMenus
|
|
188
|
+
mergeMenus(existingMenus, newMenus, parent) {
|
|
189
|
+
const mergedMenus = { ...existingMenus };
|
|
190
|
+
const checkFeb = this.checkFebMenuAddOrNot(newMenus, parent);
|
|
191
|
+
const newMenukeys = Object.keys(newMenus);
|
|
192
|
+
if (!checkFeb) {
|
|
193
|
+
for (const key in newMenus) {
|
|
194
|
+
if (newMenus.hasOwnProperty(key)) {
|
|
195
|
+
if (mergedMenus.hasOwnProperty(key) &&
|
|
196
|
+
mergedMenus[key].hasOwnProperty('submenus')) {
|
|
197
|
+
// If the key exists and has submenus, merge the submenus
|
|
198
|
+
mergedMenus[key].submenus = {
|
|
199
|
+
...mergedMenus[key].submenus,
|
|
200
|
+
...newMenus[key].submenus,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// If the key doesn't exist or doesn't have submenus, set submenus to newMenus
|
|
205
|
+
mergedMenus[key] = newMenus[key];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
for (const key in mergedMenus) {
|
|
212
|
+
if (mergedMenus.hasOwnProperty(key) &&
|
|
213
|
+
mergedMenus[key].hasOwnProperty('submenus')) {
|
|
214
|
+
const existingSubmenus = mergedMenus[key].submenus;
|
|
215
|
+
const newSubmenus = newMenus[key] && newMenus[key].submenus;
|
|
216
|
+
if (existingSubmenus && newSubmenus) {
|
|
217
|
+
for (const submenuKey in newSubmenus) {
|
|
218
|
+
if (newSubmenus.hasOwnProperty(submenuKey)) {
|
|
219
|
+
if (existingSubmenus.hasOwnProperty(submenuKey)) {
|
|
220
|
+
// Remove existing submenus
|
|
221
|
+
delete existingSubmenus[submenuKey];
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Add new submenus
|
|
225
|
+
existingSubmenus[submenuKey] = newSubmenus[submenuKey];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// If either existing or new submenus are missing, delete the menu
|
|
232
|
+
if (key === newMenukeys[0]) {
|
|
233
|
+
delete mergedMenus[key];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
if (key === newMenukeys[0] && parent == '') {
|
|
239
|
+
delete mergedMenus[key];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return this.deleteEmptyMenus(mergedMenus);
|
|
245
|
+
}
|
|
246
|
+
// Deletes empty menus from the provided menus object
|
|
247
|
+
deleteEmptyMenus(menus) {
|
|
248
|
+
const updatedMenus = { ...menus };
|
|
249
|
+
for (const key in updatedMenus) {
|
|
250
|
+
if (updatedMenus.hasOwnProperty(key) &&
|
|
251
|
+
updatedMenus[key].submenus != null) {
|
|
252
|
+
if (Object.keys(updatedMenus[key].submenus).length === 0) {
|
|
253
|
+
// Delete the menu if submenus is empty
|
|
254
|
+
delete updatedMenus[key];
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
let subMenus = updatedMenus[key].submenus;
|
|
258
|
+
for (const subMenuKey in subMenus) {
|
|
259
|
+
// Check templateTabs condition
|
|
260
|
+
const templateTabs = updatedMenus[key]?.submenus[subMenuKey]?.templateTabs;
|
|
261
|
+
if (templateTabs != null &&
|
|
262
|
+
Object.keys(templateTabs).length === 0) {
|
|
263
|
+
// Delete the menu if templateTabs is empty
|
|
264
|
+
delete updatedMenus[key].submenus[subMenuKey];
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
const templateTabs = updatedMenus[key].templateTabs;
|
|
271
|
+
if (templateTabs != null && Object.keys(templateTabs).length === 0) {
|
|
272
|
+
// Delete the menu if templateTabs is empty
|
|
273
|
+
delete updatedMenus[key];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return updatedMenus;
|
|
278
|
+
}
|
|
279
|
+
// Checks if a menu should be added based on the febMenu condition
|
|
280
|
+
checkFebMenuAddOrNot(menu, parent) {
|
|
281
|
+
let userFebMenu = this.getUserPreferenceByFieldName('preferenceMap');
|
|
282
|
+
if (!menu || typeof menu !== 'object' || Object.keys(menu).length === 0) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
if (parent &&
|
|
286
|
+
(typeof parent !== 'object' || Object.keys(parent).length === 0)) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
let menuId = Object.keys(menu).length > 0
|
|
290
|
+
? menu[Object.keys(menu)[0]].reference?._id
|
|
291
|
+
: null;
|
|
292
|
+
// Check if parent and parent.reference are defined before accessing _id
|
|
293
|
+
if (parent && parent !== '' && typeof parent === 'object' && userFebMenu) {
|
|
294
|
+
for (const key in menu) {
|
|
295
|
+
if (menu.hasOwnProperty(key)) {
|
|
296
|
+
if (userFebMenu.hasOwnProperty(key) &&
|
|
297
|
+
userFebMenu[key].hasOwnProperty('submenus')) {
|
|
298
|
+
const menuSubmenus = menu[key].submenus;
|
|
299
|
+
for (const submenuKey in menuSubmenus) {
|
|
300
|
+
const submenuId = menuSubmenus[submenuKey].reference?._id;
|
|
301
|
+
if (!this.isIdExist(userFebMenu[key].submenus, submenuId)) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
else
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
return false; // Return false if the key is missing or doesn't have submenus in userFebMenu
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (userFebMenu &&
|
|
315
|
+
userFebMenu !== null &&
|
|
316
|
+
typeof userFebMenu === 'object' &&
|
|
317
|
+
Object.keys(userFebMenu).length > 0) {
|
|
318
|
+
return this.isIdExist(userFebMenu, menuId);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Checks if a given ID exists in the provided object
|
|
325
|
+
isIdExist(obj, targetId) {
|
|
326
|
+
for (const key in obj) {
|
|
327
|
+
if (obj.hasOwnProperty(key) &&
|
|
328
|
+
obj[key].reference &&
|
|
329
|
+
obj[key].reference._id === targetId) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
// Checks is Menu already present or not - For fabMenu icon
|
|
336
|
+
isMenuAlreadyPresentOrNot(targetMenu, userFebMenu) {
|
|
337
|
+
for (const key in userFebMenu) {
|
|
338
|
+
if (userFebMenu.hasOwnProperty(key)) {
|
|
339
|
+
const menu = userFebMenu[key];
|
|
340
|
+
if (menu.reference && menu.reference._id === targetMenu._id) {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
if (menu.submenus) {
|
|
344
|
+
for (const submenuKey in menu.submenus) {
|
|
345
|
+
if (menu.submenus.hasOwnProperty(submenuKey)) {
|
|
346
|
+
const submenu = menu.submenus[submenuKey];
|
|
347
|
+
if (submenu.reference &&
|
|
348
|
+
submenu.reference._id === targetMenu._id) {
|
|
349
|
+
return true;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
getUserPreferenceByFieldName(fieldName) {
|
|
359
|
+
let data = [];
|
|
360
|
+
let userPreference = this.storageService.getUserPreference();
|
|
361
|
+
if (userPreference && userPreference[fieldName]) {
|
|
362
|
+
data = userPreference[fieldName];
|
|
363
|
+
}
|
|
364
|
+
return data;
|
|
365
|
+
}
|
|
366
|
+
// Extract the menu and submenu data for tab
|
|
367
|
+
extractMenuDetails(tab, data, indices) {
|
|
368
|
+
const { menuIndex, submenuIndex, moduleIndex } = indices;
|
|
369
|
+
let newMenu = {};
|
|
370
|
+
let tabRef = this.getTabRef(tab, 'favourite');
|
|
371
|
+
let moduleRef = this.commonFunctionService.getReferenceObject(data[moduleIndex]);
|
|
372
|
+
let isFavExist = tab.favourite;
|
|
373
|
+
if (submenuIndex != -1) {
|
|
374
|
+
let submenu = data[moduleIndex]?.['menu_list'][menuIndex]?.['submenu']?.[submenuIndex];
|
|
375
|
+
let parent = data[moduleIndex]?.['menu_list'][menuIndex];
|
|
376
|
+
newMenu[moduleRef.name] = {
|
|
377
|
+
favourite: isFavExist,
|
|
378
|
+
reference: moduleRef,
|
|
379
|
+
menus: {
|
|
380
|
+
[parent.name]: {
|
|
381
|
+
reference: this.commonFunctionService.getReferenceObject(parent),
|
|
382
|
+
favourite: isFavExist,
|
|
383
|
+
submenus: {
|
|
384
|
+
[submenu.name]: {
|
|
385
|
+
favourite: isFavExist,
|
|
386
|
+
reference: {
|
|
387
|
+
...this.commonFunctionService.getReferenceObject(submenu),
|
|
388
|
+
},
|
|
389
|
+
templateTabs: tabRef,
|
|
390
|
+
},
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
let menu = data[moduleIndex]?.['menu_list'][menuIndex];
|
|
398
|
+
newMenu[moduleRef.name] = {
|
|
399
|
+
favourite: isFavExist,
|
|
400
|
+
reference: moduleRef,
|
|
401
|
+
menus: {
|
|
402
|
+
[menu.name]: {
|
|
403
|
+
favourite: isFavExist,
|
|
404
|
+
reference: { ...this.commonFunctionService.getReferenceObject(menu) },
|
|
405
|
+
templateTabs: tabRef,
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
return newMenu;
|
|
411
|
+
}
|
|
412
|
+
//update tabs
|
|
413
|
+
updateFavTabs(newMenus, tab) {
|
|
414
|
+
let existingUserPreferences = this.storageService.getUserPreference();
|
|
415
|
+
if (!existingUserPreferences) {
|
|
416
|
+
existingUserPreferences = this.createUserPreference('preferenceMap');
|
|
417
|
+
}
|
|
418
|
+
let existingMenus = existingUserPreferences['preferenceMap'];
|
|
419
|
+
let updatedMenus = { ...existingMenus };
|
|
420
|
+
let favExist = !tab.favourite;
|
|
421
|
+
if (!favExist) {
|
|
422
|
+
for (let menuName in newMenus) {
|
|
423
|
+
if (newMenus.hasOwnProperty(menuName)) {
|
|
424
|
+
let newMenu = newMenus[menuName];
|
|
425
|
+
if (existingMenus.hasOwnProperty(menuName)) {
|
|
426
|
+
let existingMenu = existingMenus[menuName];
|
|
427
|
+
existingMenu.reference = newMenu.reference;
|
|
428
|
+
if (!existingMenu.submenus) {
|
|
429
|
+
if (existingMenu.templateTabs && newMenu.templateTabs) {
|
|
430
|
+
delete existingMenu.templateTabs[tab.tab_name];
|
|
431
|
+
if (existingMenu.submenus && newMenu.submenus) {
|
|
432
|
+
existingMenu.templateTabs = {
|
|
433
|
+
...existingMenu.templateTabs,
|
|
434
|
+
...newMenu.templateTabs,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
existingMenu.templateTabs = {
|
|
439
|
+
...existingMenu.templateTabs,
|
|
440
|
+
...newMenu.templateTabs,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
for (let subMenuKey in newMenu.submenus) {
|
|
447
|
+
if (newMenu.submenus.hasOwnProperty(subMenuKey)) {
|
|
448
|
+
let newSubMenu = newMenu.submenus[subMenuKey];
|
|
449
|
+
if (existingMenu.submenus.hasOwnProperty(subMenuKey)) {
|
|
450
|
+
let existingSubMenu = existingMenu.submenus[subMenuKey];
|
|
451
|
+
existingSubMenu.reference = newSubMenu.reference;
|
|
452
|
+
if (existingSubMenu.templateTabs &&
|
|
453
|
+
newSubMenu.templateTabs) {
|
|
454
|
+
existingSubMenu.templateTabs = {
|
|
455
|
+
...existingSubMenu.templateTabs,
|
|
456
|
+
...newSubMenu.templateTabs,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
existingSubMenu.templateTabs = newSubMenu.templateTabs;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
existingMenu.submenus[subMenuKey] = { ...newSubMenu };
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
updatedMenus[menuName] = { ...newMenu };
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
for (let menuName in existingMenus) {
|
|
478
|
+
if (newMenus.hasOwnProperty(menuName)) {
|
|
479
|
+
let newMenu = newMenus[menuName];
|
|
480
|
+
let existingMenu = existingMenus[menuName];
|
|
481
|
+
if (!existingMenu.submenus) {
|
|
482
|
+
existingMenu.reference = newMenu?.reference;
|
|
483
|
+
const favTabs = this.getFebTabs(this.getTemplateTabs());
|
|
484
|
+
existingMenu["templateTabs"] = favTabs;
|
|
485
|
+
if (existingMenu.templateTabs &&
|
|
486
|
+
existingMenu.templateTabs[tab.tab_name]) {
|
|
487
|
+
delete existingMenu.templateTabs[tab.tab_name];
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
for (let subMenuKey in existingMenu.submenus) {
|
|
492
|
+
if (newMenu.submenus.hasOwnProperty(subMenuKey)) {
|
|
493
|
+
let existingSubMenu = existingMenu.submenus[subMenuKey];
|
|
494
|
+
const favTabs = this.getFebTabs(this.getTemplateTabs());
|
|
495
|
+
existingSubMenu["templateTabs"] = favTabs;
|
|
496
|
+
existingSubMenu.reference = newMenu?.submenus[subMenuKey]?.reference;
|
|
497
|
+
if (existingSubMenu.templateTabs &&
|
|
498
|
+
existingSubMenu.templateTabs[tab.tab_name]) {
|
|
499
|
+
delete existingSubMenu.templateTabs[tab.tab_name];
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
updatedMenus = this.deleteEmptyMenus(updatedMenus);
|
|
508
|
+
existingUserPreferences['preferenceMap'] = updatedMenus;
|
|
509
|
+
return existingUserPreferences;
|
|
510
|
+
}
|
|
511
|
+
// Check the tab id in local USER_PREF
|
|
512
|
+
checkFebTabAddOrNot(tab) {
|
|
513
|
+
const menus = this.storageService.getUserPreference()?.['preferenceMap'] || {};
|
|
514
|
+
return this.isIdExistInTemplateTabs(menus, tab._id);
|
|
515
|
+
}
|
|
516
|
+
isIdExistInTemplateTabs(obj, targetId) {
|
|
517
|
+
for (const key in obj) {
|
|
518
|
+
if (obj.hasOwnProperty(key)) {
|
|
519
|
+
const value = obj[key];
|
|
520
|
+
if (value && typeof value === 'object') {
|
|
521
|
+
// Recursively search in nested objects
|
|
522
|
+
if (this.isIdExistInTemplateTabs(value, targetId)) {
|
|
523
|
+
return true;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
else if (key === '_id' && value === targetId) {
|
|
527
|
+
return true;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return false;
|
|
532
|
+
}
|
|
533
|
+
getUserPreferenceObj(data, fieldName, parent) {
|
|
534
|
+
let refObj = this.commonFunctionService.getReferenceObject(data);
|
|
535
|
+
if (parent != '') {
|
|
536
|
+
refObj = parent;
|
|
537
|
+
}
|
|
538
|
+
if (fieldName == "favoriteMenus") {
|
|
539
|
+
refObj = data;
|
|
540
|
+
}
|
|
541
|
+
let uRef = {};
|
|
542
|
+
let userPreference = this.storageService.getUserPreference();
|
|
543
|
+
if (userPreference && userPreference._id && userPreference._id != null && userPreference._id != '') {
|
|
544
|
+
let fieldData = userPreference[fieldName];
|
|
545
|
+
if (fieldData && fieldData.length > 0) {
|
|
546
|
+
let matchIndex = -1;
|
|
547
|
+
for (let index = 0; index < fieldData.length; index++) {
|
|
548
|
+
const element = fieldData[index];
|
|
549
|
+
if (element._id == refObj._id) {
|
|
550
|
+
matchIndex = index;
|
|
551
|
+
break;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (matchIndex > -1) {
|
|
555
|
+
if (parent != '') {
|
|
556
|
+
let submenu = fieldData[matchIndex].submenu;
|
|
557
|
+
let submenuMatchIndex = -1;
|
|
558
|
+
if (submenu && submenu.length > 0) {
|
|
559
|
+
for (let j = 0; j < submenu.length; j++) {
|
|
560
|
+
const subMenu = submenu[j];
|
|
561
|
+
if (subMenu._id == data._id) {
|
|
562
|
+
submenuMatchIndex = j;
|
|
563
|
+
break;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (submenuMatchIndex > -1) {
|
|
568
|
+
submenu.splice(submenuMatchIndex);
|
|
569
|
+
if (fieldData[matchIndex].submenu.length == 0) {
|
|
570
|
+
fieldData.splice(matchIndex);
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
fieldData[matchIndex].submenu = submenu;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
if (submenu.length > 0) {
|
|
578
|
+
fieldData[matchIndex].submenu.push(data);
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
fieldData[matchIndex].submenu = [];
|
|
582
|
+
fieldData[matchIndex].submenu.push(data);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
fieldData.splice(matchIndex, 1);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
591
|
+
if (parent != '') {
|
|
592
|
+
refObj['submenu'] = [];
|
|
593
|
+
refObj['submenu'].push(data);
|
|
594
|
+
fieldData.push(refObj);
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
fieldData.push(refObj);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
fieldData = [];
|
|
603
|
+
fieldData.push(refObj);
|
|
604
|
+
}
|
|
605
|
+
userPreference[fieldName] = fieldData;
|
|
606
|
+
uRef = userPreference;
|
|
607
|
+
}
|
|
608
|
+
else {
|
|
609
|
+
let user = this.storageService.GetUserInfo();
|
|
610
|
+
let userRef = this.commonFunctionService.getReferenceObject(user);
|
|
611
|
+
let dataList = [];
|
|
612
|
+
dataList.push(refObj);
|
|
613
|
+
uRef['userId'] = userRef;
|
|
614
|
+
uRef[fieldName] = dataList;
|
|
615
|
+
}
|
|
616
|
+
return uRef;
|
|
617
|
+
}
|
|
618
|
+
saveColumn(data) {
|
|
619
|
+
let { columns, form, formTable } = data;
|
|
620
|
+
const checkedFields = columns.filter((col) => col.display == true);
|
|
621
|
+
let { menuIndex, submenuIndex, moduleIndex } = this.dataShareService.getMenuOrSubmenuIndexs();
|
|
622
|
+
const allModuleData = this.storageService.GetModules();
|
|
623
|
+
let selectedModule = allModuleData[moduleIndex];
|
|
624
|
+
let selectedMenu = allModuleData[moduleIndex]?.["menu_list"][menuIndex];
|
|
625
|
+
let selectedSubMenu = null;
|
|
626
|
+
let allTempleteTabs = this.dataShareService.getTempData()[0]?.["templateTabs"];
|
|
627
|
+
let activeMenu = this.storageService.GetActiveMenu(); ///get active tab
|
|
628
|
+
let selectedTab = allTempleteTabs?.find((tab) => tab.tab_name == activeMenu?.name);
|
|
629
|
+
let selectedGrid = selectedTab.grid;
|
|
630
|
+
if (submenuIndex != -1) {
|
|
631
|
+
selectedSubMenu = allModuleData[moduleIndex]?.["menu_list"][menuIndex]?.["submenu"][submenuIndex];
|
|
632
|
+
}
|
|
633
|
+
let forms;
|
|
634
|
+
let grids;
|
|
635
|
+
if (form && formTable) {
|
|
636
|
+
selectedGrid = formTable.grid;
|
|
637
|
+
forms = {
|
|
638
|
+
[form["name"]]: {
|
|
639
|
+
reference: this.commonFunctionService.getReferenceObject(form),
|
|
640
|
+
grids: {
|
|
641
|
+
[selectedGrid["name"]]: {
|
|
642
|
+
reference: this.commonFunctionService.getReferenceObject(selectedGrid),
|
|
643
|
+
"fields": checkedFields.map((col) => {
|
|
644
|
+
return { field_name: col.field_name,
|
|
645
|
+
};
|
|
646
|
+
})
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
else {
|
|
653
|
+
grids = {
|
|
654
|
+
[selectedGrid["name"]]: {
|
|
655
|
+
reference: this.commonFunctionService.getReferenceObject(selectedGrid),
|
|
656
|
+
"fields": checkedFields.map((col) => {
|
|
657
|
+
return { field_name: col.field_name,
|
|
658
|
+
};
|
|
659
|
+
})
|
|
660
|
+
}
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
let preference;
|
|
664
|
+
let templateTabs = {
|
|
665
|
+
[selectedTab["tab_name"]]: {
|
|
666
|
+
reference: {
|
|
667
|
+
_id: selectedTab["_id"],
|
|
668
|
+
name: selectedTab["tab_name"]
|
|
669
|
+
},
|
|
670
|
+
...(form && { forms }),
|
|
671
|
+
...(form == undefined && { grids })
|
|
672
|
+
}
|
|
673
|
+
};
|
|
674
|
+
if (submenuIndex != -1) {
|
|
675
|
+
preference = {
|
|
676
|
+
[selectedModule["name"]]: {
|
|
677
|
+
reference: this.commonFunctionService.getReferenceObject(selectedModule),
|
|
678
|
+
menus: {
|
|
679
|
+
[selectedMenu["name"]]: {
|
|
680
|
+
reference: this.commonFunctionService.getReferenceObject(selectedMenu),
|
|
681
|
+
submenus: {
|
|
682
|
+
[selectedSubMenu["name"]]: {
|
|
683
|
+
reference: this.commonFunctionService.getReferenceObject(selectedSubMenu),
|
|
684
|
+
templateTabs,
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
preference = {
|
|
694
|
+
[selectedModule["name"]]: {
|
|
695
|
+
reference: this.commonFunctionService.getReferenceObject(selectedModule),
|
|
696
|
+
menus: {
|
|
697
|
+
[selectedMenu["name"]]: {
|
|
698
|
+
reference: this.commonFunctionService.getReferenceObject(selectedMenu),
|
|
699
|
+
templateTabs: {
|
|
700
|
+
[selectedTab["tab_name"]]: {
|
|
701
|
+
reference: {
|
|
702
|
+
_id: selectedTab["_id"],
|
|
703
|
+
name: selectedTab["tab_name"]
|
|
704
|
+
},
|
|
705
|
+
...(form && { forms }),
|
|
706
|
+
...(form == undefined && { grids })
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
let userRef = this.commonFunctionService.getReferenceObject(this.storageService.GetUserInfo());
|
|
715
|
+
let payload = {
|
|
716
|
+
preferenceMap: preference,
|
|
717
|
+
userId: userRef
|
|
718
|
+
};
|
|
719
|
+
return payload;
|
|
720
|
+
}
|
|
721
|
+
addHideKeyInExistingTab(columns, fId, fieldName) {
|
|
722
|
+
let tabName = this.storageService.GetActiveMenu().name;
|
|
723
|
+
let template = this.dataShareService.getTempData();
|
|
724
|
+
let tabs = template[0].templateTabs;
|
|
725
|
+
let selectTabIndex = this.commonFunctionService.getIndexInArrayById(tabs, tabName, 'tab_name');
|
|
726
|
+
let tab = tabs[selectTabIndex];
|
|
727
|
+
let grid = tab.grid;
|
|
728
|
+
let gridColumns = grid.gridColumns;
|
|
729
|
+
if (fId && fieldName) {
|
|
730
|
+
let forms = tab.forms;
|
|
731
|
+
if (typeof forms == 'object' && Object.keys(forms).length > 0) {
|
|
732
|
+
Object.keys(forms).forEach((key) => {
|
|
733
|
+
let form = forms[key];
|
|
734
|
+
if (form._id == fId) {
|
|
735
|
+
let formFields = form.tableFields;
|
|
736
|
+
formFields.forEach((field) => {
|
|
737
|
+
if (field.field_name == fieldName) {
|
|
738
|
+
if (field.gridColumns && field.gridColumns.length > 0) {
|
|
739
|
+
gridColumns = field.gridColumns;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
if (gridColumns && gridColumns.length > 0 && columns.length > 0) {
|
|
748
|
+
columns.forEach((col, index) => {
|
|
749
|
+
if (col.display) {
|
|
750
|
+
gridColumns[index]['hide'] = false;
|
|
751
|
+
}
|
|
752
|
+
else {
|
|
753
|
+
gridColumns[index]['hide'] = true;
|
|
754
|
+
}
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
UserPrefrenceService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserPrefrenceService, deps: [{ token: i1.StorageService }, { token: i2.ApiService }, { token: i3.DataShareService }, { token: i4.CommonFunctionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
760
|
+
UserPrefrenceService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserPrefrenceService, providedIn: 'root' });
|
|
761
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserPrefrenceService, decorators: [{
|
|
762
|
+
type: Injectable,
|
|
763
|
+
args: [{
|
|
764
|
+
providedIn: 'root',
|
|
765
|
+
}]
|
|
766
|
+
}], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.ApiService }, { type: i3.DataShareService }, { type: i4.CommonFunctionService }]; } });
|
|
767
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wcmVmcmVuY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvdXNlclByZWZyZW5jZS91c2VyLXByZWZyZW5jZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVMzQyxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQ1UsY0FBOEIsRUFDOUIsVUFBc0IsRUFDdEIsZ0JBQWtDLEVBQ2xDLHFCQUE0QztRQUg1QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7SUFDbkQsQ0FBQztJQUVKLG9CQUFvQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLE1BQWU7UUFDbkUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDbkMsSUFBSTtnQkFDRixJQUFJLFdBQVcsQ0FBQztnQkFFaEIsUUFBUSxTQUFTLEVBQUU7b0JBQ2pCLEtBQUssZUFBZTt3QkFDbEIsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDNUQsTUFBTTtvQkFDUixLQUFLLEtBQUs7d0JBQ1IsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3pDLE1BQU07b0JBQ1IsS0FBSyxZQUFZO3dCQUNmLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNwQyxNQUFNO29CQUNSO3dCQUNFLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGlC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QUMsQ0FBQTthQUNIO1NBQ0Y7UUFDRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQztZQUMxRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBTyxFQUFDLEtBQVMsRUFBQyxFQUFFO2dCQUNuQyxJQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUM7b0JBQ2IsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFDLEtBQUssQ0FBQztpQkFFbEM7cUJBQ0c7b0JBQ0YsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFDLElBQUksQ0FBQztpQkFFakM7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQzs7a0hBaHhCUSxvQkFBb0I7c0hBQXBCLG9CQUFvQixjQUZuQixNQUFNOzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YVNoYXJlU2VydmljZSB9IGZyb20gJy4uL2RhdGEtc2hhcmUvZGF0YS1zaGFyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uLXV0aWxzL2NvbW1vbi1mdW5jdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyUHJlZnJlbmNlU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0YVNoYXJlU2VydmljZTogRGF0YVNoYXJlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOiBDb21tb25GdW5jdGlvblNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIHVwZGF0ZVVzZXJQcmVmZXJlbmNlKGRhdGE6IG9iamVjdCwgZmllbGROYW1lOiBzdHJpbmcsIHBhcmVudD86IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBwYXlsb2FkRGF0YTtcclxuICBcclxuICAgICAgICBzd2l0Y2ggKGZpZWxkTmFtZSkge1xyXG4gICAgICAgICAgY2FzZSAncHJlZmVyZW5jZU1hcCc6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5tb2RpZmllZE1lbnVPYmooZGF0YSwgZmllbGROYW1lLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ3RhYic6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5hZGRPclJlbW92ZVRhYnMoZGF0YSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAncHJlZmVyZW5jZSc6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5zYXZlQ29sdW1uKGRhdGEpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICAgIGN1clRlbXA6ICd1c2VyX3ByZWZlcmVuY2UnLFxyXG4gICAgICAgICAgZGF0YTogcGF5bG9hZERhdGEsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UuU2F2ZUZvcm1EYXRhKHBheWxvYWQpO1xyXG5cclxuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0gXHJcblxyXG4gIGFkZE9yUmVtb3ZlVGFicyh0YWI6IGFueSkge1xyXG4gICAgbGV0IG1lbnVJbmRleHMgPSB0aGlzLmRhdGFTaGFyZVNlcnZpY2UuZ2V0TWVudU9yU3VibWVudUluZGV4cygpO1xyXG4gICAgbGV0IG1vZHVsZXMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldE1vZHVsZXMoKTtcclxuICAgIGxldCBleHRyYWN0ZWRNZW51ID0gdGhpcy5leHRyYWN0TWVudURldGFpbHModGFiLCBtb2R1bGVzLCBtZW51SW5kZXhzKTtcclxuICAgIC8vIGxldCB1c2VyUHJlZmVyZW5jZSA9IHRoaXMudXBkYXRlRmF2VGFicyhleHRyYWN0ZWRNZW51LCB0YWIpO1xyXG4gICAgbGV0IHVzZXJQcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVVc2VyUHJlZmVyZW5jZSgncHJlZmVyZW5jZU1hcCcpXHJcbiAgICB1c2VyUHJlZmVyZW5jZVsncHJlZmVyZW5jZU1hcCddID0gZXh0cmFjdGVkTWVudTtcclxuICAgIHJldHVybiB1c2VyUHJlZmVyZW5jZTtcclxuICB9XHJcbiAgLy8gTW9kaWZpZXMgdGhlIHVzZXIgcHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YVxyXG4gIG1vZGlmaWVkTWVudU9iaihkYXRhOiBhbnksIGZpZWxkTmFtZTogc3RyaW5nLCBwYXJlbnQ/OiBzdHJpbmcpIHtcclxuICAgIGxldCBtb2RpZmllZE1lbnVPYmogPSB0aGlzLnByZXBhcmVNZW51SnNvbihkYXRhLCBmaWVsZE5hbWUsIHBhcmVudCk7XHJcbiAgICAvLyBsZXQgdXNlclByZWZlcmVuY2UgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJQcmVmZXJlbmNlKCk7XHJcbiAgICAvLyB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdID0gdGhpcy5tZXJnZU1lbnVzKHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV0sbW9kaWZpZWRNZW51T2JqLHBhcmVudCk7XHJcbiAgICBsZXQgdXNlclByZWZlcmVuY2UgPSAgdGhpcy5jcmVhdGVVc2VyUHJlZmVyZW5jZShmaWVsZE5hbWUpO1xyXG4gICAgdXNlclByZWZlcmVuY2VbZmllbGROYW1lXSA9IG1vZGlmaWVkTWVudU9iajtcclxuICAgIHJldHVybiB1c2VyUHJlZmVyZW5jZTtcclxuICB9XHJcbiAgLy8gUHJlcGFyZXMgYSBtZW51IG9iamVjdCBmcm9tIG1lbnUgaXRlbXNcclxuICBwcmVwYXJlTWVudUpzb24obWVudUl0ZW1zOiBhbnksIGZpZWxkTmFtZTogc3RyaW5nLCBwYXJlbnQ/OiBhbnkpIHtcclxuICAgIGNvbnN0IG1lbnU6IGFueSA9IHt9O1xyXG4gICAgY29uc3QgaXRlbXNBcnJheSA9IEFycmF5LmlzQXJyYXkobWVudUl0ZW1zKSA/IG1lbnVJdGVtcyA6IFttZW51SXRlbXNdO1xyXG4gICAgaXRlbXNBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWU6c3RyaW5nIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0TW9kdWxlKCk7XHJcbiAgICAgIGNvbnN0IG1lbnVSZWZlcmVuY2UgPSB7XHJcbiAgICAgICAgLi4udGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KGl0ZW0pLFxyXG4gICAgICAgIGFsbFNlbGVjdGVkOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbGV0IG1lbnVEYXRhOiBhbnk7XHJcbiAgICAgIC8vIGxldCBtZW51cyA9IHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV07XHJcbiAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAvLyBJZiBwYXJlbnQgZXhpc3RzIGFuZCBoYXMgYSBzdWJtZW51LCBhZGQgdGhlIGN1cnJlbnQgbWVudSB0byB0aGUgZXhpc3Rpbmcgc3VibWVudVxyXG4gICAgICAgIGxldCByZWZPYmo6IGFueSA9IHtcclxuICAgICAgICAgIGZhdm91cml0ZTogaXRlbS5mYXZvdXJpdGUsXHJcbiAgICAgICAgICByZWZlcmVuY2U6IHtcclxuICAgICAgICAgICAgLi4udGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KG1lbnVJdGVtcyksXHJcbiAgICAgICAgICAgIGFsbFNlbGVjdGVkOiB0cnVlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCBwYXJPYmpSZWY6IGFueSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldFJlZmVyZW5jZU9iamVjdChwYXJlbnQpO1xyXG4gICAgICAgIG1lbnVEYXRhID0ge1xyXG4gICAgICAgICAgcmVmZXJlbmNlOiBwYXJPYmpSZWYsXHJcbiAgICAgICAgICBmYXZvdXJpdGU6IGl0ZW0uZmF2b3VyaXRlLFxyXG4gICAgICAgICAgc3VibWVudXM6IHtcclxuICAgICAgICAgICAgW21lbnVJdGVtcy5uYW1lXTogcmVmT2JqLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmKG1vZHVsZU5hbWUhPW51bGwpe1xyXG4gICAgICAgICAgbWVudVttb2R1bGVOYW1lXT17XHJcbiAgICAgICAgICAgIGZhdm91cml0ZTogaXRlbS5mYXZvdXJpdGUsXHJcbiAgICAgICAgICAgIHJlZmVyZW5jZSA6IHRoaXMuZ2V0TW9kdWxlUmVmKG1vZHVsZU5hbWUpLFxyXG4gICAgICAgICAgICBtZW51czp7XHJcbiAgICAgICAgICAgICAgW3BhcmVudC5uYW1lXSA6IG1lbnVEYXRhXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBtZW51O1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtZW51RGF0YSA9IHtcclxuICAgICAgICAgIHJlZmVyZW5jZTogbWVudVJlZmVyZW5jZSxcclxuICAgICAgICAgIGZhdm91cml0ZTogaXRlbS5mYXZvdXJpdGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZihtb2R1bGVOYW1lIT09IG51bGwpe1xyXG4gICAgICAgICAgbWVudVttb2R1bGVOYW1lXT17XHJcbiAgICAgICAgICAgIHJlZmVyZW5jZSA6IHRoaXMuZ2V0TW9kdWxlUmVmKG1vZHVsZU5hbWUpLFxyXG4gICAgICAgICAgICBmYXZvdXJpdGU6IGl0ZW0uZmF2b3VyaXRlLFxyXG4gICAgICAgICAgICBtZW51czp7XHJcbiAgICAgICAgICAgICAgW2l0ZW0ubmFtZV0gOiBtZW51RGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbWVudTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1lbnU7XHJcbiAgfVxyXG4gIC8vQ3JlYXRlIFVzZXJQcmVmZXJlbmNlIHdoZW4gbm90IGV4aXN0XHJcbiAgY3JlYXRlVXNlclByZWZlcmVuY2UoZmllbGROYW1lOnN0cmluZyl7XHJcbiAgICBsZXQgdXJlZjogYW55ID0ge307XHJcbiAgICBsZXQgdXNlclJlZiA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldFJlZmVyZW5jZU9iamVjdChcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5HZXRVc2VySW5mbygpXHJcbiAgICApO1xyXG4gICAgdXJlZlsndXNlcklkJ10gPSB1c2VyUmVmO1xyXG4gICAgLy9zZXQgZW1wdHkgb2JqIGZvciByZXF1aXJlZCBrZXlcclxuICAgIHVyZWZbZmllbGROYW1lXSA9IHt9XHJcbiAgICByZXR1cm4gdXJlZjtcclxuICB9XHJcbiAgLy9HZXQgTW9kdWxlIFJlZmVyZW5jZSBieSBNb2R1bGUgTmFtZVxyXG4gIGdldE1vZHVsZVJlZihtb2R1bGVOYW1lOmFueSl7XHJcbiAgICBsZXQgQWxsbW9kdWxlcyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0TW9kdWxlcygpO1xyXG4gICAgbGV0IG1vZHVsZSA9IEFsbG1vZHVsZXMuZmlsdGVyKChtb2R1bGU6YW55KT0+e1xyXG4gICAgICByZXR1cm4gbW9kdWxlLm5hbWUgPT0gbW9kdWxlTmFtZTtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KG1vZHVsZVswXSk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXRUZW1wbGF0ZVRhYnMgaW4gY3VycmVudCBNZW51XHJcbiAgZ2V0VGVtcGxhdGVUYWJzKCl7XHJcbiAgICBjb25zdCB0YWJzRGF0YSA9IHRoaXMuZGF0YVNoYXJlU2VydmljZS5nZXRUZW1wRGF0YSgpO1xyXG4gICAgY29uc3QgdGVtcGxhdGVUYWJzID0gdGFic0RhdGE/LlswXT8udGVtcGxhdGVUYWJzID8/IG51bGw7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVUYWJzO1xyXG4gIH1cclxuICAvLyBHZXRzIGFsbCB0YWIncyByZWZlcmVuY2UgT2JqIGZyb20gdGhlIHByb3ZpZGVkIGFycmF5IG9mIHRhYnNcclxuICBnZXRBbGxUYWJzKHRhYnM6IGFueSkge1xyXG4gICAgaWYgKCF0YWJzKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFsbFRhYnMgPSB0YWJzLnJlZHVjZSgoYWNjOiBhbnksIHRhYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYlJlZiA9IHRoaXMuZ2V0VGFiUmVmKHRhYik7XHJcbiAgICAgIGlmICh0YWJSZWYgJiYgT2JqZWN0LmtleXModGFiUmVmKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2MsIHRhYlJlZik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxuXHJcbiAgICByZXR1cm4gYWxsVGFicztcclxuICB9XHJcbiAgIC8vIEdldHMgb25seSB0aGUgdGFiJ3MgcmVmZXJlbmNlIE9iaiB3aXRoIGZhdm91cml0ZSBzZXQgdG8gdHJ1ZSBmcm9tIHRoZSBwcm92aWRlZCBhcnJheSBvZiB0YWJzXHJcbiAgIGdldEZlYlRhYnModGFiczogYW55KSB7XHJcbiAgICBpZiAoIXRhYnMpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhYnNcclxuICAgIC5maWx0ZXIoKHRhYjogYW55KSA9PiB0YWIuZmF2b3VyaXRlID09PSB0cnVlKVxyXG4gICAgLnJlZHVjZSgoYWNjOiBhbnksIHRhYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYlJlZiA9IHRoaXMuZ2V0VGFiUmVmKHRhYik7XHJcbiAgICAgIGlmICh0YWJSZWYgJiYgT2JqZWN0LmtleXModGFiUmVmKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2MsIHRhYlJlZik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxuICB9XHJcbiAgLy8gQ3JlYXRlcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIGEgdGFiXHJcbiAgZ2V0VGFiUmVmKHRhYjogYW55LG9wdEtleT86c3RyaW5nKSB7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSB7fTtcclxuICAgIGlmICh0YWIgJiYgdGFiLnRhYl9uYW1lICE9ICcnICYmIHRhYi50YWJfbmFtZSAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHRhYlJlZmVyZW5jZTphbnkgPSB7XHJcbiAgICAgICAgcmVmZXJlbmNlOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3QodGFiKSxcclxuICAgICAgfTtcclxuICAgICAgaWYob3B0S2V5IT0gJycgJiYgb3B0S2V5IT0gdW5kZWZpbmVkKXtcclxuICAgICAgICB0YWJSZWZlcmVuY2Vbb3B0S2V5XSA9IHRhYi5mYXZvdXJpdGU7XHJcbiAgICAgIH1cclxuICAgICAgcmVzW3RhYi50YWJfbmFtZV0gPSB0YWJSZWZlcmVuY2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuICAvLyBNZXJnZXMgZXhpc3RpbmdNZW51cyB3aXRoIG5ld01lbnVzXHJcbiAgbWVyZ2VNZW51cyhleGlzdGluZ01lbnVzOiBhbnksIG5ld01lbnVzOiBhbnksIHBhcmVudDogYW55KSB7XHJcbiAgICBjb25zdCBtZXJnZWRNZW51czogYW55ID0geyAuLi5leGlzdGluZ01lbnVzIH07XHJcbiAgICBjb25zdCBjaGVja0ZlYiA9IHRoaXMuY2hlY2tGZWJNZW51QWRkT3JOb3QobmV3TWVudXMsIHBhcmVudCk7XHJcbiAgICBjb25zdCBuZXdNZW51a2V5cyA9IE9iamVjdC5rZXlzKG5ld01lbnVzKTtcclxuICAgIGlmICghY2hlY2tGZWIpIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3TWVudXMpIHtcclxuICAgICAgICBpZiAobmV3TWVudXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBtZXJnZWRNZW51cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmXHJcbiAgICAgICAgICAgIG1lcmdlZE1lbnVzW2tleV0uaGFzT3duUHJvcGVydHkoJ3N1Ym1lbnVzJylcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUga2V5IGV4aXN0cyBhbmQgaGFzIHN1Ym1lbnVzLCBtZXJnZSB0aGUgc3VibWVudXNcclxuICAgICAgICAgICAgbWVyZ2VkTWVudXNba2V5XS5zdWJtZW51cyA9IHtcclxuICAgICAgICAgICAgICAuLi5tZXJnZWRNZW51c1trZXldLnN1Ym1lbnVzLFxyXG4gICAgICAgICAgICAgIC4uLm5ld01lbnVzW2tleV0uc3VibWVudXMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgZG9lc24ndCBoYXZlIHN1Ym1lbnVzLCBzZXQgc3VibWVudXMgdG8gbmV3TWVudXNcclxuICAgICAgICAgICAgbWVyZ2VkTWVudXNba2V5XSA9IG5ld01lbnVzW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBtZXJnZWRNZW51cykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIG1lcmdlZE1lbnVzLmhhc093blByb3BlcnR5KGtleSkgJiZcclxuICAgICAgICAgIG1lcmdlZE1lbnVzW2tleV0uaGFzT3duUHJvcGVydHkoJ3N1Ym1lbnVzJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU3VibWVudXMgPSBtZXJnZWRNZW51c1trZXldLnN1Ym1lbnVzO1xyXG4gICAgICAgICAgY29uc3QgbmV3U3VibWVudXMgPSBuZXdNZW51c1trZXldICYmIG5ld01lbnVzW2tleV0uc3VibWVudXM7XHJcblxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nU3VibWVudXMgJiYgbmV3U3VibWVudXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJtZW51S2V5IGluIG5ld1N1Ym1lbnVzKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5ld1N1Ym1lbnVzLmhhc093blByb3BlcnR5KHN1Ym1lbnVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdTdWJtZW51cy5oYXNPd25Qcm9wZXJ0eShzdWJtZW51S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgc3VibWVudXNcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nU3VibWVudXNbc3VibWVudUtleV07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBBZGQgbmV3IHN1Ym1lbnVzXHJcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3VibWVudXNbc3VibWVudUtleV0gPSBuZXdTdWJtZW51c1tzdWJtZW51S2V5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIGVpdGhlciBleGlzdGluZyBvciBuZXcgc3VibWVudXMgYXJlIG1pc3NpbmcsIGRlbGV0ZSB0aGUgbWVudVxyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBuZXdNZW51a2V5c1swXSkge1xyXG4gICAgICAgICAgICAgIGRlbGV0ZSBtZXJnZWRNZW51c1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IG5ld01lbnVrZXlzWzBdICYmIHBhcmVudCA9PSAnJykge1xyXG4gICAgICAgICAgICBkZWxldGUgbWVyZ2VkTWVudXNba2V5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRlbGV0ZUVtcHR5TWVudXMobWVyZ2VkTWVudXMpO1xyXG4gIH1cclxuICAvLyBEZWxldGVzIGVtcHR5IG1lbnVzIGZyb20gdGhlIHByb3ZpZGVkIG1lbnVzIG9iamVjdFxyXG4gIGRlbGV0ZUVtcHR5TWVudXMobWVudXM6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCB1cGRhdGVkTWVudXM6IGFueSA9IHsgLi4ubWVudXMgfTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZWRNZW51cykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdXBkYXRlZE1lbnVzLmhhc093blByb3BlcnR5KGtleSkgJiZcclxuICAgICAgICB1cGRhdGVkTWVudXNba2V5XS5zdWJtZW51cyAhPSBudWxsXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1cGRhdGVkTWVudXNba2V5XS5zdWJtZW51cykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAvLyBEZWxldGUgdGhlIG1lbnUgaWYgc3VibWVudXMgaXMgZW1wdHlcclxuICAgICAgICAgIGRlbGV0ZSB1cGRhdGVkTWVudXNba2V5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHN1Yk1lbnVzID0gdXBkYXRlZE1lbnVzW2tleV0uc3VibWVudXM7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1Yk1lbnVLZXkgaW4gc3ViTWVudXMpIHtcclxuICAgICAgICAgICAgLy8gQ2hlY2sgdGVtcGxhdGVUYWJzIGNvbmRpdGlvblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVRhYnMgPVxyXG4gICAgICAgICAgICAgIHVwZGF0ZWRNZW51c1trZXldPy5zdWJtZW51c1tzdWJNZW51S2V5XT8udGVtcGxhdGVUYWJzO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgdGVtcGxhdGVUYWJzICE9IG51bGwgJiZcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0ZW1wbGF0ZVRhYnMpLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIG1lbnUgaWYgdGVtcGxhdGVUYWJzIGlzIGVtcHR5XHJcbiAgICAgICAgICAgICAgZGVsZXRlIHVwZGF0ZWRNZW51c1trZXldLnN1Ym1lbnVzW3N1Yk1lbnVLZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlVGFicyA9IHVwZGF0ZWRNZW51c1trZXldLnRlbXBsYXRlVGFicztcclxuICAgICAgICBpZiAodGVtcGxhdGVUYWJzICE9IG51bGwgJiYgT2JqZWN0LmtleXModGVtcGxhdGVUYWJzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgbWVudSBpZiB0ZW1wbGF0ZVRhYnMgaXMgZW1wdHlcclxuICAgICAgICAgIGRlbGV0ZSB1cGRhdGVkTWVudXNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1cGRhdGVkTWVudXM7XHJcbiAgfVxyXG4gIC8vIENoZWNrcyBpZiBhIG1lbnUgc2hvdWxkIGJlIGFkZGVkIGJhc2VkIG9uIHRoZSBmZWJNZW51IGNvbmRpdGlvblxyXG4gIGNoZWNrRmViTWVudUFkZE9yTm90KG1lbnU6IGFueSwgcGFyZW50OiBhbnkpIHtcclxuICAgIGxldCB1c2VyRmViTWVudSA9IHRoaXMuZ2V0VXNlclByZWZlcmVuY2VCeUZpZWxkTmFtZSgncHJlZmVyZW5jZU1hcCcpO1xyXG4gICAgaWYgKCFtZW51IHx8IHR5cGVvZiBtZW51ICE9PSAnb2JqZWN0JyB8fCBPYmplY3Qua2V5cyhtZW51KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgcGFyZW50ICYmXHJcbiAgICAgICh0eXBlb2YgcGFyZW50ICE9PSAnb2JqZWN0JyB8fCBPYmplY3Qua2V5cyhwYXJlbnQpLmxlbmd0aCA9PT0gMClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1lbnVJZCA9XHJcbiAgICAgIE9iamVjdC5rZXlzKG1lbnUpLmxlbmd0aCA+IDBcclxuICAgICAgICA/IG1lbnVbT2JqZWN0LmtleXMobWVudSlbMF1dLnJlZmVyZW5jZT8uX2lkXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgLy8gQ2hlY2sgaWYgcGFyZW50IGFuZCBwYXJlbnQucmVmZXJlbmNlIGFyZSBkZWZpbmVkIGJlZm9yZSBhY2Nlc3NpbmcgX2lkXHJcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudCAhPT0gJycgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCcgJiYgdXNlckZlYk1lbnUpIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWVudSkge1xyXG4gICAgICAgIGlmIChtZW51Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdXNlckZlYk1lbnUuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxyXG4gICAgICAgICAgICB1c2VyRmViTWVudVtrZXldLmhhc093blByb3BlcnR5KCdzdWJtZW51cycpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgbWVudVN1Ym1lbnVzID0gbWVudVtrZXldLnN1Ym1lbnVzO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1Ym1lbnVLZXkgaW4gbWVudVN1Ym1lbnVzKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3VibWVudUlkID0gbWVudVN1Ym1lbnVzW3N1Ym1lbnVLZXldLnJlZmVyZW5jZT8uX2lkO1xyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5pc0lkRXhpc3QodXNlckZlYk1lbnVba2V5XS5zdWJtZW51cywgc3VibWVudUlkKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIGtleSBpcyBtaXNzaW5nIG9yIGRvZXNuJ3QgaGF2ZSBzdWJtZW51cyBpbiB1c2VyRmViTWVudVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdXNlckZlYk1lbnUgJiZcclxuICAgICAgdXNlckZlYk1lbnUgIT09IG51bGwgJiZcclxuICAgICAgdHlwZW9mIHVzZXJGZWJNZW51ID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICBPYmplY3Qua2V5cyh1c2VyRmViTWVudSkubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzSWRFeGlzdCh1c2VyRmViTWVudSwgbWVudUlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gQ2hlY2tzIGlmIGEgZ2l2ZW4gSUQgZXhpc3RzIGluIHRoZSBwcm92aWRlZCBvYmplY3RcclxuICBpc0lkRXhpc3Qob2JqOiBhbnksIHRhcmdldElkOiBhbnkpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGtleSkgJiZcclxuICAgICAgICBvYmpba2V5XS5yZWZlcmVuY2UgJiZcclxuICAgICAgICBvYmpba2V5XS5yZWZlcmVuY2UuX2lkID09PSB0YXJnZXRJZFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvLyBDaGVja3MgaXMgTWVudSBhbHJlYWR5IHByZXNlbnQgb3Igbm90IC0gRm9yIGZhYk1lbnUgaWNvblxyXG4gIGlzTWVudUFscmVhZHlQcmVzZW50T3JOb3QodGFyZ2V0TWVudTogYW55LCB1c2VyRmViTWVudTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB1c2VyRmViTWVudSkge1xyXG4gICAgICBpZiAodXNlckZlYk1lbnUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSB1c2VyRmViTWVudVtrZXldO1xyXG4gICAgICAgIGlmIChtZW51LnJlZmVyZW5jZSAmJiBtZW51LnJlZmVyZW5jZS5faWQgPT09IHRhcmdldE1lbnUuX2lkKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1lbnUuc3VibWVudXMpIHtcclxuICAgICAgICAgIGZvciAoY29uc3Qgc3VibWVudUtleSBpbiBtZW51LnN1Ym1lbnVzKSB7XHJcbiAgICAgICAgICAgIGlmIChtZW51LnN1Ym1lbnVzLmhhc093blByb3BlcnR5KHN1Ym1lbnVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3VibWVudSA9IG1lbnUuc3VibWVudXNbc3VibWVudUtleV07XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VibWVudS5yZWZlcmVuY2UgJiZcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnUucmVmZXJlbmNlLl9pZCA9PT0gdGFyZ2V0TWVudS5faWRcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXRVc2VyUHJlZmVyZW5jZUJ5RmllbGROYW1lKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZGF0YSA9IFtdO1xyXG4gICAgbGV0IHVzZXJQcmVmZXJlbmNlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpO1xyXG4gICAgaWYgKHVzZXJQcmVmZXJlbmNlICYmIHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV0pIHtcclxuICAgICAgZGF0YSA9IHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcbiAgLy8gRXh0cmFjdCB0aGUgbWVudSBhbmQgc3VibWVudSBkYXRhIGZvciB0YWJcclxuICBleHRyYWN0TWVudURldGFpbHMoXHJcbiAgICB0YWI6IGFueSxcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgaW5kaWNlczogeyBtZW51SW5kZXg6IG51bWJlcjsgc3VibWVudUluZGV4OiBudW1iZXI7IG1vZHVsZUluZGV4OiBudW1iZXIgfVxyXG4gICkge1xyXG4gICAgY29uc3QgeyBtZW51SW5kZXgsIHN1Ym1lbnVJbmRleCwgbW9kdWxlSW5kZXggfSA9IGluZGljZXM7XHJcbiAgICBsZXQgbmV3TWVudTogYW55ID0ge307XHJcbiAgICBsZXQgdGFiUmVmID0gdGhpcy5nZXRUYWJSZWYodGFiLCdmYXZvdXJpdGUnKTtcclxuICAgIGxldCBtb2R1bGVSZWYgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3QoZGF0YVttb2R1bGVJbmRleF0pO1xyXG4gICAgbGV0IGlzRmF2RXhpc3QgPSB0YWIuZmF2b3VyaXRlO1xyXG4gICAgaWYgKHN1Ym1lbnVJbmRleCAhPSAtMSkge1xyXG4gICAgICBsZXQgc3VibWVudSA9XHJcbiAgICAgICAgZGF0YVttb2R1bGVJbmRleF0/LlsnbWVudV9saXN0J11bbWVudUluZGV4XT8uWydzdWJtZW51J10/LltcclxuICAgICAgICAgIHN1Ym1lbnVJbmRleFxyXG4gICAgICAgIF07XHJcbiAgICAgIGxldCBwYXJlbnQgPSBkYXRhW21vZHVsZUluZGV4XT8uWydtZW51X2xpc3QnXVttZW51SW5kZXhdO1xyXG4gICAgICBuZXdNZW51W21vZHVsZVJlZi5uYW1lXSA9IHtcclxuICAgICAgICBmYXZvdXJpdGU6IGlzRmF2RXhpc3QsXHJcbiAgICAgICAgcmVmZXJlbmNlIDogbW9kdWxlUmVmLFxyXG4gICAgICAgIG1lbnVzOntcclxuICAgICAgICAgICAgW3BhcmVudC5uYW1lXSA6IHtcclxuICAgICAgICAgICAgICByZWZlcmVuY2U6IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldFJlZmVyZW5jZU9iamVjdChwYXJlbnQpLFxyXG4gICAgICAgICAgICAgIGZhdm91cml0ZTogaXNGYXZFeGlzdCxcclxuICAgICAgICAgICAgICBzdWJtZW51czoge1xyXG4gICAgICAgICAgICAgICAgW3N1Ym1lbnUubmFtZV06IHtcclxuICAgICAgICAgICAgICAgICAgZmF2b3VyaXRlOiBpc0ZhdkV4aXN0LFxyXG4gICAgICAgICAgICAgICAgICByZWZlcmVuY2U6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc3VibWVudSksXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVGFiczogdGFiUmVmLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG1lbnUgPSBkYXRhW21vZHVsZUluZGV4XT8uWydtZW51X2xpc3QnXVttZW51SW5kZXhdO1xyXG4gICAgICBuZXdNZW51W21vZHVsZVJlZi5uYW1lXT17XHJcbiAgICAgICAgZmF2b3VyaXRlOiBpc0ZhdkV4aXN0LFxyXG4gICAgICAgIHJlZmVyZW5jZSA6IG1vZHVsZVJlZixcclxuICAgICAgICBtZW51czoge1xyXG4gICAgICAgIFttZW51Lm5hbWVdIDoge1xyXG4gICAgICAgIGZhdm91cml0ZTogaXNGYXZFeGlzdCxcclxuICAgICAgICByZWZlcmVuY2U6IHsgLi4udGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KG1lbnUpfSxcclxuICAgICAgICB0ZW1wbGF0ZVRhYnM6IHRhYlJlZixcclxuICAgICAgfX1cclxuICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3TWVudTtcclxuICB9XHJcbiAgLy91cGRhdGUgdGFic1xyXG4gIHVwZGF0ZUZhdlRhYnMobmV3TWVudXM6IGFueSwgdGFiOiBhbnkpIHtcclxuICAgIGxldCBleGlzdGluZ1VzZXJQcmVmZXJlbmNlcyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlclByZWZlcmVuY2UoKTtcclxuICAgIGlmKCFleGlzdGluZ1VzZXJQcmVmZXJlbmNlcyl7XHJcbiAgICAgIGV4aXN0aW5nVXNlclByZWZlcmVuY2VzID0gdGhpcy5jcmVhdGVVc2VyUHJlZmVyZW5jZSgncHJlZmVyZW5jZU1hcCcpO1xyXG4gICAgfVxyXG4gICAgbGV0IGV4aXN0aW5nTWVudXMgPSBleGlzdGluZ1VzZXJQcmVmZXJlbmNlc1sncHJlZmVyZW5jZU1hcCddO1xyXG4gICAgbGV0IHVwZGF0ZWRNZW51cyA9IHsgLi4uZXhpc3RpbmdNZW51cyB9O1xyXG4gICAgbGV0IGZhdkV4aXN0ID0gIXRhYi5mYXZvdXJpdGVcclxuXHJcbiAgICBpZiAoIWZhdkV4aXN0KSB7XHJcbiAgICAgIGZvciAobGV0IG1lbnVOYW1lIGluIG5ld01lbnVzKSB7XHJcbiAgICAgICAgaWYgKG5ld01lbnVzLmhhc093blByb3BlcnR5KG1lbnVOYW1lKSkge1xyXG4gICAgICAgICAgbGV0IG5ld01lbnUgPSBuZXdNZW51c1ttZW51TmFtZV07XHJcblxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nTWVudXMuaGFzT3duUHJvcGVydHkobWVudU5hbWUpKSB7XHJcbiAgICAgICAgICAgIGxldCBleGlzdGluZ01lbnUgPSBleGlzdGluZ01lbnVzW21lbnVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgIGV4aXN0aW5nTWVudS5yZWZlcmVuY2UgPSBuZXdNZW51LnJlZmVyZW5jZTtcclxuICAgICAgICAgICAgaWYgKCFleGlzdGluZ01lbnUuc3VibWVudXMpIHtcclxuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdNZW51LnRlbXBsYXRlVGFicyAmJiBuZXdNZW51LnRlbXBsYXRlVGFicykge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnNbdGFiLnRhYl9uYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ01lbnUuc3VibWVudXMgJiYgbmV3TWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgICAgICBleGlzdGluZ01lbnUudGVtcGxhdGVUYWJzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ubmV3TWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBleGlzdGluZ01lbnUudGVtcGxhdGVUYWJzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ubmV3TWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHN1Yk1lbnVLZXkgaW4gbmV3TWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld01lbnUuc3VibWVudXMuaGFzT3duUHJvcGVydHkoc3ViTWVudUtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IG5ld1N1Yk1lbnUgPSBuZXdNZW51LnN1Ym1lbnVzW3N1Yk1lbnVLZXldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTWVudS5zdWJtZW51cy5oYXNPd25Qcm9wZXJ0eShzdWJNZW51S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ1N1Yk1lbnUgPSBleGlzdGluZ01lbnUuc3VibWVudXNbc3ViTWVudUtleV07XHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdTdWJNZW51LnJlZmVyZW5jZSA9IG5ld1N1Yk1lbnUucmVmZXJlbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudS50ZW1wbGF0ZVRhYnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIG5ld1N1Yk1lbnUudGVtcGxhdGVUYWJzXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5uZXdTdWJNZW51LnRlbXBsYXRlVGFicyxcclxuICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudS50ZW1wbGF0ZVRhYnMgPSBuZXdTdWJNZW51LnRlbXBsYXRlVGFicztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdNZW51LnN1Ym1lbnVzW3N1Yk1lbnVLZXldID0geyAuLi5uZXdTdWJNZW51IH07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRNZW51c1ttZW51TmFtZV0gPSB7IC4uLm5ld01lbnUgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IG1lbnVOYW1lIGluIGV4aXN0aW5nTWVudXMpIHtcclxuICAgICAgICBpZiAobmV3TWVudXMuaGFzT3duUHJvcGVydHkobWVudU5hbWUpKSB7XHJcbiAgICAgICAgICBsZXQgbmV3TWVudSA9IG5ld01lbnVzW21lbnVOYW1lXTtcclxuICAgICAgICAgIGxldCBleGlzdGluZ01lbnUgPSBleGlzdGluZ01lbnVzW21lbnVOYW1lXTsgICAgICAgICAgXHJcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nTWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgIGV4aXN0aW5nTWVudS5yZWZlcmVuY2UgPSBuZXdNZW51Py5yZWZlcmVuY2U7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmF2VGFicyA9IHRoaXMuZ2V0RmViVGFicyh0aGlzLmdldFRlbXBsYXRlVGFicygpKTtcclxuICAgICAgICAgICAgICBleGlzdGluZ01lbnVbXCJ0ZW1wbGF0ZVRhYnNcIl0gPSBmYXZUYWJzO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZXhpc3RpbmdNZW51LnRlbXBsYXRlVGFicyAmJlxyXG4gICAgICAgICAgICAgIGV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnNbdGFiLnRhYl9uYW1lXVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBkZWxldGUgZXhpc3RpbmdNZW51LnRlbXBsYXRlVGFic1t0YWIudGFiX25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBzdWJNZW51S2V5IGluIGV4aXN0aW5nTWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgIGlmIChuZXdNZW51LnN1Ym1lbnVzLmhhc093blByb3BlcnR5KHN1Yk1lbnVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmdTdWJNZW51ID0gZXhpc3RpbmdNZW51LnN1Ym1lbnVzW3N1Yk1lbnVLZXldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmF2VGFicyA9IHRoaXMuZ2V0RmViVGFicyh0aGlzLmdldFRlbXBsYXRlVGFicygpKTtcclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudVtcInRlbXBsYXRlVGFic1wiXSA9IGZhdlRhYnM7XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ1N1Yk1lbnUucmVmZXJlbmNlID0gbmV3TWVudT8uc3VibWVudXNbc3ViTWVudUtleV0/LnJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICBleGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzICYmXHJcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudS50ZW1wbGF0ZVRhYnNbdGFiLnRhYl9uYW1lXVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBleGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzW3RhYi50YWJfbmFtZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB1cGRhdGVkTWVudXMgPSB0aGlzLmRlbGV0ZUVtcHR5TWVudXModXBkYXRlZE1lbnVzKTtcclxuICAgIGV4aXN0aW5nVXNlclByZWZlcmVuY2VzWydwcmVmZXJlbmNlTWFwJ10gPSB1cGRhdGVkTWVudXM7XHJcblxyXG4gICAgcmV0dXJuIGV4aXN0aW5nVXNlclByZWZlcmVuY2VzO1xyXG4gIH1cclxuICAvLyBDaGVjayB0aGUgdGFiIGlkIGluIGxvY2FsIFVTRVJfUFJFRlxyXG4gIGNoZWNrRmViVGFiQWRkT3JOb3QodGFiOiBhbnkpIHtcclxuICAgIGNvbnN0IG1lbnVzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpPy5bJ3ByZWZlcmVuY2VNYXAnXSB8fCB7fTtcclxuICAgIHJldHVybiB0aGlzLmlzSWRFeGlzdEluVGVtcGxhdGVUYWJzKG1lbnVzLCB0YWIuX2lkKTtcclxuICB9XHJcbiAgaXNJZEV4aXN0SW5UZW1wbGF0ZVRhYnMob2JqOiBhbnksIHRhcmdldElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGluIG5lc3RlZCBvYmplY3RzXHJcbiAgICAgICAgICBpZiAodGhpcy5pc0lkRXhpc3RJblRlbXBsYXRlVGFicyh2YWx1ZSwgdGFyZ2V0SWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2lkJyAmJiB2YWx1ZSA9PT0gdGFyZ2V0SWQpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXRVc2VyUHJlZmVyZW5jZU9iaihkYXRhOmFueSxmaWVsZE5hbWU6c3RyaW5nLHBhcmVudD86c3RyaW5nKXtcclxuICAgIGxldCByZWZPYmo6YW55ID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KGRhdGEpO1xyXG4gICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgcmVmT2JqID0gcGFyZW50O1xyXG4gICAgfVxyXG4gICAgaWYoZmllbGROYW1lID09IFwiZmF2b3JpdGVNZW51c1wiKXtcclxuICAgICAgcmVmT2JqID0gZGF0YTtcclxuICAgIH1cclxuICAgIGxldCB1UmVmOmFueSA9IHt9O1xyXG4gICAgbGV0IHVzZXJQcmVmZXJlbmNlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpO1xyXG4gICAgaWYodXNlclByZWZlcmVuY2UgJiYgdXNlclByZWZlcmVuY2UuX2lkICYmIHVzZXJQcmVmZXJlbmNlLl9pZCAhPSBudWxsICYmIHVzZXJQcmVmZXJlbmNlLl9pZCAhPSAnJyl7XHJcbiAgICAgIGxldCBmaWVsZERhdGEgPSB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdO1xyXG4gICAgICBpZihmaWVsZERhdGEgJiYgZmllbGREYXRhLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIGxldCBtYXRjaEluZGV4ID0gLTE7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkRGF0YS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZERhdGFbaW5kZXhdO1xyXG4gICAgICAgICAgaWYoZWxlbWVudC5faWQgPT0gcmVmT2JqLl9pZCl7XHJcbiAgICAgICAgICAgIG1hdGNoSW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG1hdGNoSW5kZXggID4gLTEpe1xyXG4gICAgICAgICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnUgPSBmaWVsZERhdGFbbWF0Y2hJbmRleF0uc3VibWVudTtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnVNYXRjaEluZGV4ID0gLTE7XHJcbiAgICAgICAgICAgIGlmKHN1Ym1lbnUgJiYgc3VibWVudS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN1Ym1lbnUubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Yk1lbnUgPSBzdWJtZW51W2pdO1xyXG4gICAgICAgICAgICAgICAgaWYoc3ViTWVudS5faWQgPT0gZGF0YS5faWQpe1xyXG4gICAgICAgICAgICAgICAgICBzdWJtZW51TWF0Y2hJbmRleCA9IGo7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihzdWJtZW51TWF0Y2hJbmRleCA+IC0xKXtcclxuICAgICAgICAgICAgICBzdWJtZW51LnNwbGljZShzdWJtZW51TWF0Y2hJbmRleCk7XHJcbiAgICAgICAgICAgICAgaWYoZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICAgICAgZmllbGREYXRhLnNwbGljZShtYXRjaEluZGV4KTtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51ID0gc3VibWVudTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGlmKHN1Ym1lbnUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBmaWVsZERhdGFbbWF0Y2hJbmRleF0uc3VibWVudS5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUgPSBbXVxyXG4gICAgICAgICAgICAgICAgZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmaWVsZERhdGEuc3BsaWNlKG1hdGNoSW5kZXgsIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgICAgICAgcmVmT2JqWydzdWJtZW51J10gPSBbXTtcclxuICAgICAgICAgICAgcmVmT2JqWydzdWJtZW51J10ucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgZmllbGREYXRhLnB1c2gocmVmT2JqKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmaWVsZERhdGEucHVzaChyZWZPYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgZmllbGREYXRhID0gW107XHJcbiAgICAgICAgZmllbGREYXRhLnB1c2gocmVmT2JqKTtcclxuICAgICAgfVxyXG4gICAgICB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdID0gZmllbGREYXRhO1xyXG4gICAgICB1UmVmID0gdXNlclByZWZlcmVuY2U7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgbGV0IHVzZXIgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldFVzZXJJbmZvKCk7XHJcbiAgICAgIGxldCB1c2VyUmVmID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KHVzZXIpO1xyXG4gICAgICBsZXQgZGF0YUxpc3QgPSBbXTtcclxuICAgICAgZGF0YUxpc3QucHVzaChyZWZPYmopO1xyXG4gICAgICB1UmVmWyd1c2VySWQnXSA9IHVzZXJSZWY7XHJcbiAgICAgIHVSZWZbZmllbGROYW1lXSA9IGRhdGFMaXN0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVSZWZcclxuICB9XHJcblxyXG4gIHNhdmVDb2x1bW4oZGF0YTphbnkpe1xyXG4gICAgbGV0IHtjb2x1bW5zLGZvcm0sZm9ybVRhYmxlfT1kYXRhO1xyXG4gICAgY29uc3QgY2hlY2tlZEZpZWxkcz1jb2x1bW5zLmZpbHRlcigoY29sOmFueSk9PmNvbC5kaXNwbGF5PT10cnVlKTtcclxuICAgIGxldCB7bWVudUluZGV4LCBzdWJtZW51SW5kZXgsIG1vZHVsZUluZGV4fT0gdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldE1lbnVPclN1Ym1lbnVJbmRleHMoKTtcclxuICAgIGNvbnN0IGFsbE1vZHVsZURhdGE9dGhpcy5zdG9yYWdlU2VydmljZS5HZXRNb2R1bGVzKCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRNb2R1bGU9IGFsbE1vZHVsZURhdGFbbW9kdWxlSW5kZXhdO1xyXG4gICAgbGV0IHNlbGVjdGVkTWVudT0gYWxsTW9kdWxlRGF0YVttb2R1bGVJbmRleF0/LltcIm1lbnVfbGlzdFwiXVttZW51SW5kZXhdO1xyXG4gICAgbGV0IHNlbGVjdGVkU3ViTWVudT0gbnVsbDtcclxuICAgIGxldCBhbGxUZW1wbGV0ZVRhYnM9IHRoaXMuZGF0YVNoYXJlU2VydmljZS5nZXRUZW1wRGF0YSgpWzBdPy5bXCJ0ZW1wbGF0ZVRhYnNcIl07XHJcbiAgICBsZXQgYWN0aXZlTWVudT10aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldEFjdGl2ZU1lbnUoKSAvLy9nZXQgYWN0aXZlIHRhYiBcclxuICAgIGxldCBzZWxlY3RlZFRhYj0gYWxsVGVtcGxldGVUYWJzPy5maW5kKCh0YWI6YW55KT0+dGFiLnRhYl9uYW1lPT0gYWN0aXZlTWVudT8ubmFtZSk7XHJcbiAgICBsZXQgc2VsZWN0ZWRHcmlkPSBzZWxlY3RlZFRhYi5ncmlkXHJcblxyXG4gICAgaWYoc3VibWVudUluZGV4IT0gLTEpe1xyXG4gICAgICAgc2VsZWN0ZWRTdWJNZW51PSBhbGxNb2R1bGVEYXRhW21vZHVsZUluZGV4XT8uW1wibWVudV9saXN0XCJdW21lbnVJbmRleF0/LltcInN1Ym1lbnVcIl1bc3VibWVudUluZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZm9ybXM7XHJcbiAgICBsZXQgZ3JpZHM7XHJcbiAgICBpZihmb3JtICYmIGZvcm1UYWJsZSl7XHJcbiAgICAgIHNlbGVjdGVkR3JpZD1mb3JtVGFibGUuZ3JpZDtcclxuICAgICAgIGZvcm1zPSB7XHJcbiAgICAgICAgW2Zvcm1bXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3QoZm9ybSksXHJcbiAgICAgICAgICBncmlkczp7XHJcbiAgICAgICAgICAgIFtzZWxlY3RlZEdyaWRbXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICAgICAgcmVmZXJlbmNlIDogdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KHNlbGVjdGVkR3JpZCksXHJcbiAgICAgICAgICAgICAgXCJmaWVsZHNcIjpjaGVja2VkRmllbGRzLm1hcCgoY29sOmFueSkgPT57XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmaWVsZF9uYW1lOiBjb2wuZmllbGRfbmFtZSwgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBncmlkcz17XHJcbiAgICAgICAgICBbc2VsZWN0ZWRHcmlkW1wibmFtZVwiXV06e1xyXG4gICAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRHcmlkKSxcclxuICAgICAgICAgICAgXCJmaWVsZHNcIjpjaGVja2VkRmllbGRzLm1hcCgoY29sOmFueSkgPT57XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZmllbGRfbmFtZTogY29sLmZpZWxkX25hbWUsIFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHByZWZlcmVuY2U7XHJcbiAgICBsZXQgdGVtcGxhdGVUYWJzPXtcclxuICAgICAgW3NlbGVjdGVkVGFiW1widGFiX25hbWVcIl1dOntcclxuICAgICAgICByZWZlcmVuY2UgOiB7XHJcbiAgICAgICAgICBfaWQ6c2VsZWN0ZWRUYWJbXCJfaWRcIl0sXHJcbiAgICAgICAgICBuYW1lOiBzZWxlY3RlZFRhYltcInRhYl9uYW1lXCJdXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi4oZm9ybSAmJiB7Zm9ybXN9KSxcclxuICAgICAgICAuLi4oZm9ybSA9PSB1bmRlZmluZWQgJiYge2dyaWRzfSlcclxuICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihzdWJtZW51SW5kZXggIT0gLTEpe1xyXG4gICAgICBwcmVmZXJlbmNlPXtcclxuICAgICAgICBbc2VsZWN0ZWRNb2R1bGVbXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNb2R1bGUpLFxyXG4gICAgICAgICAgbWVudXM6e1xyXG4gICAgICAgICAgICAgICBbc2VsZWN0ZWRNZW51W1wibmFtZVwiXV06e1xyXG4gICAgICAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNZW51KSxcclxuICAgICAgICAgICAgICAgc3VibWVudXM6IHtcclxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkU3ViTWVudVtcIm5hbWVcIl1dOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRTdWJNZW51KSxcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICBwcmVmZXJlbmNlPXtcclxuICAgICAgICBbc2VsZWN0ZWRNb2R1bGVbXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNb2R1bGUpLFxyXG4gICAgICAgICAgbWVudXM6e1xyXG4gICAgICAgICAgICAgICBbc2VsZWN0ZWRNZW51W1wibmFtZVwiXV06e1xyXG4gICAgICAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNZW51KSxcclxuICAgICAgICAgICAgICAgdGVtcGxhdGVUYWJzOntcclxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZFRhYltcInRhYl9uYW1lXCJdXTp7XHJcbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA6IHtcclxuICAgICAgICAgICAgICAgICAgICBfaWQ6c2VsZWN0ZWRUYWJbXCJfaWRcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWRUYWJbXCJ0YWJfbmFtZVwiXVxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAuLi4oZm9ybSAmJiB7Zm9ybXN9KSxcclxuICAgICAgICAgICAgICAgICAgLi4uKGZvcm0gPT0gdW5kZWZpbmVkICYmIHtncmlkc30pXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCB1c2VyUmVmID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KFxyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldFVzZXJJbmZvKClcclxuICAgICk7XHJcbiAgXHJcbiAgICBsZXQgcGF5bG9hZD17XHJcbiAgICAgIHByZWZlcmVuY2VNYXAgOiBwcmVmZXJlbmNlLFxyXG4gICAgICB1c2VySWQ6IHVzZXJSZWZcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG5cclxuICBhZGRIaWRlS2V5SW5FeGlzdGluZ1RhYihjb2x1bW5zOmFueSxmSWQ6U3RyaW5nLGZpZWxkTmFtZTpTdHJpbmcpe1xyXG4gICAgICBsZXQgdGFiTmFtZT10aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldEFjdGl2ZU1lbnUoKS5uYW1lO1xyXG4gICAgICBsZXQgdGVtcGxhdGU9dGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldFRlbXBEYXRhKCk7XHJcbiAgICAgIGxldCB0YWJzID0gdGVtcGxhdGVbMF0udGVtcGxhdGVUYWJzO1xyXG4gICAgICBsZXQgc2VsZWN0VGFiSW5kZXg9dGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0SW5kZXhJbkFycmF5QnlJZCh0YWJzLHRhYk5hbWUsJ3RhYl9uYW1lJylcclxuICAgICAgbGV0IHRhYiA9IHRhYnNbc2VsZWN0VGFiSW5kZXhdO1xyXG4gICAgICBsZXQgZ3JpZD10YWIuZ3JpZDtcclxuICAgICAgbGV0IGdyaWRDb2x1bW5zPWdyaWQuZ3JpZENvbHVtbnM7XHJcbiAgICAgIGlmKGZJZCAmJiBmaWVsZE5hbWUpe1xyXG4gICAgICAgIGxldCBmb3Jtcz10YWIuZm9ybXM7XHJcbiAgICAgICAgaWYodHlwZW9mIGZvcm1zPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoZm9ybXMpLmxlbmd0aD4wKXtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKGZvcm1zKS5mb3JFYWNoKChrZXk6YW55KT0+e1xyXG4gICAgICAgICAgICBsZXQgZm9ybT1mb3Jtc1trZXldO1xyXG4gICAgICAgICAgICBpZihmb3JtLl9pZD09IGZJZCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgZm9ybUZpZWxkcz1mb3JtLnRhYmxlRmllbGRzO1xyXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnkpPT57XHJcbiAgICAgICAgICAgICAgICAgIGlmKGZpZWxkLmZpZWxkX25hbWUgPT0gZmllbGROYW1lKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKGZpZWxkLmdyaWRDb2x1bW5zICYmIGZpZWxkLmdyaWRDb2x1bW5zLmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHVtbnM9ZmllbGQuZ3JpZENvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmKCBncmlkQ29sdW1ucyAmJiBncmlkQ29sdW1ucy5sZW5ndGg+MCAmJiBjb2x1bW5zLmxlbmd0aD4wKXtcclxuICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbDphbnksaW5kZXg6YW55KT0+e1xyXG4gICAgICAgICAgaWYoY29sLmRpc3BsYXkpe1xyXG4gICAgICAgICAgICBncmlkQ29sdW1uc1tpbmRleF1bJ2hpZGUnXT1mYWxzZTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBncmlkQ29sdW1uc1tpbmRleF1bJ2hpZGUnXT10cnVlO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
|