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.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,558 @@
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 "../permission/permission.service";
5
+ import * as i3 from "../common-utils/common-function.service";
6
+ import * as i4 from "../data-share/data-share.service";
7
+ import * as i5 from "../api/api.service";
8
+ import * as i6 from "@angular/router";
9
+ import * as i7 from "../data-share/common-app-data-share/common-app-data-share.service";
10
+ import * as i8 from "../userPrefrence/user-prefrence.service";
11
+ import * as i9 from "../common-utils/core-function/core-function.service";
12
+ export class MenuOrModuleCommonService {
13
+ constructor(storageService, permissionService, commonFunctionService, dataShareService, apiService, router, commonAppDataShareService, userPrefrenceService, coreFunctionService) {
14
+ this.storageService = storageService;
15
+ this.permissionService = permissionService;
16
+ this.commonFunctionService = commonFunctionService;
17
+ this.dataShareService = dataShareService;
18
+ this.apiService = apiService;
19
+ this.router = router;
20
+ this.commonAppDataShareService = commonAppDataShareService;
21
+ this.userPrefrenceService = userPrefrenceService;
22
+ this.coreFunctionService = coreFunctionService;
23
+ this.getMenuList = (menus) => {
24
+ let menuList = [];
25
+ if (menus) {
26
+ Object.entries(menus).forEach(([menuKey, menu]) => {
27
+ let menuObj = { keyName: menuKey };
28
+ if (menu.reference) {
29
+ menuObj = { ...menuObj, ...menu.reference };
30
+ }
31
+ menuObj.submenu = this.getMenuList(menu.submenus);
32
+ if (!menuObj?.submenu) {
33
+ menuObj.templateTabs = this.getTabList(menu.templateTabs);
34
+ }
35
+ menuList.push(menuObj);
36
+ });
37
+ }
38
+ return menuList.length > 0 ? this.coreFunctionService.sortMenu(menuList) : null;
39
+ };
40
+ this.getTabList = (tabs) => {
41
+ let tabList = [];
42
+ if (tabs) {
43
+ Object.entries(tabs).forEach(([tabKey, tab]) => {
44
+ let tabObj = { keyName: tabKey };
45
+ if (tab.reference) {
46
+ tabObj = { ...tabObj, ...tab.reference };
47
+ }
48
+ tabObj.email = tab.activeAlerts?.includes("EMAIL") || false;
49
+ tabObj.whatsapp = tab.activeAlerts?.includes("WHATSAPP") || false;
50
+ tabObj.sms = tab.activeAlerts?.includes("SMS") || false;
51
+ tabList.push(tabObj);
52
+ });
53
+ }
54
+ return tabList;
55
+ };
56
+ }
57
+ // modifyModuleListWithPermission(moduleList:any){
58
+ // let modifyModuleList:any = [];
59
+ // if(moduleList && moduleList.length > 0){
60
+ // moduleList.forEach((module:any) => {
61
+ // if(module && module.menu_list && module.menu_list.length > 0){
62
+ // let menuList = module.menu_list;
63
+ // module.menu_list = this.setDisplayInMenuWithPermission(menuList);
64
+ // if(this.setDisplayInModuleWithPermission(module.menu_list)){
65
+ // module['display'] = true;
66
+ // }else{
67
+ // module['display'] = false;
68
+ // }
69
+ // modifyModuleList.push(module);
70
+ // }else{
71
+ // modifyModuleList.push(module);
72
+ // }
73
+ // });
74
+ // }
75
+ // return modifyModuleList;
76
+ // }
77
+ getDefaultMenuIndex(menuList) {
78
+ let defaultmenuIndex = 0;
79
+ let defaultSubmenuIndex = -1;
80
+ let defaultIndexs = {
81
+ 'defaultmenuIndex': defaultmenuIndex,
82
+ 'defaultSubmenuIndex': defaultSubmenuIndex
83
+ };
84
+ if (menuList && menuList.length > 0) {
85
+ defaultmenuIndex = this.getDefaultIndex(menuList);
86
+ const defaultMenu = menuList[defaultmenuIndex];
87
+ if (defaultMenu.submenu && defaultMenu.submenu.length > 0) {
88
+ defaultSubmenuIndex = this.getDefaultIndex(defaultMenu.submenu);
89
+ if (defaultSubmenuIndex == -1) {
90
+ defaultSubmenuIndex = 0;
91
+ }
92
+ }
93
+ }
94
+ defaultIndexs.defaultmenuIndex = defaultmenuIndex;
95
+ defaultIndexs.defaultSubmenuIndex = defaultSubmenuIndex;
96
+ return defaultIndexs;
97
+ }
98
+ getDefaultIndex(menuList) {
99
+ let defaultmenuIndex = 0;
100
+ if (menuList && menuList.length > 0) {
101
+ for (let index = 0; index < menuList.length; index++) {
102
+ if (menuList[index].defaultMenu) {
103
+ defaultmenuIndex = index;
104
+ break;
105
+ }
106
+ }
107
+ }
108
+ return defaultmenuIndex;
109
+ }
110
+ // setDisplayInMenuWithPermission(menuList:any){
111
+ // let modifyMenuList = [];
112
+ // if(menuList && menuList.length > 0){
113
+ // for (let index = 0; index < menuList.length; index++) {
114
+ // const menu = menuList[index];
115
+ // if(menu.submenu && menu.submenu != null){
116
+ // let modifySubMenuList = [];
117
+ // let check = 0;
118
+ // for (let j = 0; j < menu.submenu.length; j++) {
119
+ // const submenu = menu.submenu[j];
120
+ // if(!this.checkPermission(submenu)){
121
+ // submenu['display'] = true;
122
+ // modifySubMenuList.push(submenu);
123
+ // check = 1;
124
+ // }else{
125
+ // submenu['display'] = false;
126
+ // modifySubMenuList.push(submenu);
127
+ // }
128
+ // }
129
+ // if(check == 1){
130
+ // menu['display'] = true;
131
+ // }else{
132
+ // menu['display'] = false;
133
+ // }
134
+ // menu.submenu = modifySubMenuList;
135
+ // modifyMenuList.push(menu);
136
+ // }else{
137
+ // if(!this.checkPermission(menu)){
138
+ // menu['display'] = true;
139
+ // modifyMenuList.push(menu);
140
+ // }else{
141
+ // menu['display'] = false;
142
+ // modifyMenuList.push(menu);
143
+ // }
144
+ // }
145
+ // }
146
+ // }
147
+ // return modifyMenuList;
148
+ // }
149
+ // setDisplayInModuleWithPermission(menuList:any){
150
+ // let check = false;
151
+ // if(menuList && menuList.length > 0){
152
+ // for (let index = 0; index < menuList.length; index++) {
153
+ // const menu = menuList[index];
154
+ // if(menu.submenu && menu.submenu != null){
155
+ // for (let j = 0; j < menu.submenu.length; j++) {
156
+ // const submenu = menu.submenu[j];
157
+ // if(submenu.display){
158
+ // check = true;
159
+ // break;
160
+ // }
161
+ // }
162
+ // }else{
163
+ // if(menu.display){
164
+ // check = true;
165
+ // break;
166
+ // }
167
+ // }
168
+ // }
169
+ // }
170
+ // return check;
171
+ // }
172
+ getDefaultMenu(menuList) {
173
+ let menu = {};
174
+ let defaultMenu = {};
175
+ let defaultMenuIndexs = this.getDefaultMenuIndex(menuList);
176
+ menu['indexs'] = defaultMenuIndexs;
177
+ if (defaultMenuIndexs.defaultSubmenuIndex > -1) {
178
+ defaultMenu = menuList[defaultMenuIndexs.defaultmenuIndex].submenu[defaultMenuIndexs.defaultSubmenuIndex];
179
+ defaultMenu['child'] = true;
180
+ }
181
+ else {
182
+ defaultMenu = menuList[defaultMenuIndexs.defaultmenuIndex];
183
+ defaultMenu['child'] = false;
184
+ }
185
+ defaultMenu['menuIndex'] = defaultMenuIndexs.defaultmenuIndex;
186
+ menu['menu'] = defaultMenu;
187
+ // if(defaultMenu.display){
188
+ // }else{
189
+ // menu['menu'] = this.findMenuWithPermission(menuList);
190
+ // }
191
+ return menu;
192
+ }
193
+ // findMenuWithPermission(menuList:any){
194
+ // let modifyMenu = {};
195
+ // if(menuList && menuList.length > 0){
196
+ // for (let index = 0; index < menuList.length; index++) {
197
+ // const menu = menuList[index];
198
+ // if(menu.display && menu.submenu && menu.submenu != null){
199
+ // for (let j = 0; j < menu.submenu.length; j++) {
200
+ // const submenu = menu.submenu[j];
201
+ // if(submenu.display){
202
+ // modifyMenu = submenu;
203
+ // break;
204
+ // }
205
+ // }
206
+ // }else{
207
+ // if(menu.display){
208
+ // modifyMenu = menu;
209
+ // break;
210
+ // }
211
+ // }
212
+ // }
213
+ // }
214
+ // return modifyMenu;
215
+ // }
216
+ setModuleName(moduleName) {
217
+ this.storageService.setModule(moduleName);
218
+ }
219
+ getModuleIndexById(moduleId) {
220
+ let moduleList = this.storageService.GetModules();
221
+ return this.commonFunctionService.getIndexInArrayById(moduleList, moduleId);
222
+ }
223
+ shareMenuIndex(menuIndex, subMenuIndex, moduleIndex) {
224
+ let indexs = {};
225
+ indexs['menuIndex'] = menuIndex;
226
+ indexs['submenuIndex'] = subMenuIndex;
227
+ indexs['moduleIndex'] = moduleIndex;
228
+ this.dataShareService.setMenuIndexs(indexs);
229
+ }
230
+ getIndexsByMenuName(menuList, menuName) {
231
+ let indexs = {
232
+ 'menuindex': -1,
233
+ 'submenuindex': -1
234
+ };
235
+ for (let index = 0; index < menuList.length; index++) {
236
+ const menu = menuList[index];
237
+ if (!menu.submenu && menu.name == menuName) {
238
+ indexs.menuindex = index;
239
+ indexs.submenuindex = -1;
240
+ }
241
+ else {
242
+ if (menu.submenu && menu.submenu.length > 0) {
243
+ for (let j = 0; j < menu.submenu.length; j++) {
244
+ const subMenu = menu.submenu[j];
245
+ if (subMenu.name == menuName) {
246
+ indexs.menuindex = index;
247
+ indexs.submenuindex = j;
248
+ }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ return indexs;
254
+ }
255
+ getMenuNameById(module, menuId, submenuId, key) {
256
+ let menuName = {};
257
+ let menuList = module.menu_list;
258
+ let menuIndex = this.commonFunctionService.getIndexInArrayById(menuList, menuId, key);
259
+ menuName['menuIndex'] = menuIndex;
260
+ let menu = menuList[menuIndex];
261
+ if (submenuId != "") {
262
+ if (menu.submenu) {
263
+ let subMenuList = menu.submenu;
264
+ if (subMenuList && subMenuList.length > 0) {
265
+ let subMenuIndex = this.commonFunctionService.getIndexInArrayById(subMenuList, submenuId, key);
266
+ menuName['subMenuIndex'] = subMenuIndex;
267
+ let submenu = subMenuList[subMenuIndex];
268
+ menuName['name'] = submenu.name;
269
+ }
270
+ }
271
+ }
272
+ else {
273
+ menuName['name'] = menu.name;
274
+ }
275
+ return menuName;
276
+ }
277
+ // checkPermission(menu:any){
278
+ // return !this.permissionService.checkPermission(menu.name, 'view')
279
+ // }
280
+ getTemplateData(module, submenu) {
281
+ if (submenu && submenu.name) {
282
+ this.storageService.SetActiveMenu(submenu);
283
+ if (submenu.label == "Navigation") {
284
+ this.router.navigate(['Navigation']);
285
+ }
286
+ else if (submenu.label == "Permissions") {
287
+ this.router.navigate(['permissions']);
288
+ }
289
+ else {
290
+ const menu = submenu;
291
+ if (menu.name == "document_library") {
292
+ this.router.navigate(['vdr']);
293
+ }
294
+ else if (menu.name == "report") {
295
+ this.router.navigate(['report']);
296
+ }
297
+ else {
298
+ this.apiService.resetTempData();
299
+ this.apiService.resetGridData();
300
+ this.GoToSelectedModule(module);
301
+ const route = 'browse/' + module.name + "/" + submenu.name;
302
+ //console.log(route);
303
+ this.router.navigate([route]);
304
+ //this.router.navigate(['template']);
305
+ }
306
+ }
307
+ }
308
+ else {
309
+ this.permissionService.checkTokenStatusForPermission();
310
+ }
311
+ }
312
+ GoToSelectedModule(item) {
313
+ if (item && item.name) {
314
+ this.setModuleName(item.name);
315
+ }
316
+ this.dataShareService.sendCurrentPage('DASHBOARD');
317
+ }
318
+ goToMOdule() {
319
+ this.dataShareService.sendCurrentPage('MODULE');
320
+ this.dataShareService.resetHeaderMenu([]);
321
+ this.dataShareService.setModuleIndex(-1);
322
+ this.dataShareService.setMenuIndexs({ menuIndex: -1, submenuIndex: -1 });
323
+ const menuType = this.storageService.GetMenuType();
324
+ if (menuType == 'Horizontal') {
325
+ this.router.navigate(['/home']);
326
+ }
327
+ else {
328
+ this.router.navigate(['/dashboard']);
329
+ }
330
+ }
331
+ viewPermissionInTabs(tabs) {
332
+ tabs.forEach((tab) => {
333
+ let tab_name = tab.tab_name;
334
+ let check = this.permissionService.checkPermission(tab_name, 'view');
335
+ tab['display'] = check;
336
+ tab['febMenu'] = this.checkFebMenuAddOrNot(tab, '');
337
+ });
338
+ return tabs;
339
+ }
340
+ addPermissionInTab(tab) {
341
+ if (tab && tab.tab_name) {
342
+ let name = tab.tab_name;
343
+ let check = this.permissionService.checkPermission(name, 'add');
344
+ tab['addForm'] = check;
345
+ }
346
+ return tab;
347
+ }
348
+ checkFebMenuAddOrNot(tab, parent) {
349
+ let tabId = tab._id;
350
+ if (parent != '') {
351
+ tabId = parent._id;
352
+ }
353
+ let userFebTab = this.userPrefrenceService.getUserPreferenceByFieldName('favoriteTabs');
354
+ if (userFebTab && userFebTab != null && userFebTab.length > 0) {
355
+ let match = -1;
356
+ for (let index = 0; index < userFebTab.length; index++) {
357
+ const element = userFebTab[index];
358
+ if (element._id == tabId) {
359
+ match = index;
360
+ break;
361
+ }
362
+ }
363
+ if (match > -1) {
364
+ if (parent != '') {
365
+ const submenu = userFebTab[match]['tab'];
366
+ let subMatchIndex = -1;
367
+ if (submenu && submenu.length > 0) {
368
+ for (let j = 0; j < submenu.length; j++) {
369
+ const subMenu = submenu[j];
370
+ if (subMenu._id == tab._id) {
371
+ subMatchIndex = j;
372
+ break;
373
+ }
374
+ }
375
+ }
376
+ if (subMatchIndex > -1) {
377
+ return true;
378
+ }
379
+ else {
380
+ return false;
381
+ }
382
+ }
383
+ else {
384
+ return true;
385
+ }
386
+ }
387
+ else {
388
+ return false;
389
+ }
390
+ }
391
+ else {
392
+ return false;
393
+ }
394
+ }
395
+ // for App
396
+ getModuleBySelectedIndex() {
397
+ const moduleList = this.commonAppDataShareService.getModuleList();
398
+ const clickedModuleIndex = this.commonAppDataShareService.getModuleIndex();
399
+ let module = {};
400
+ if (clickedModuleIndex >= 0) {
401
+ module = moduleList[clickedModuleIndex];
402
+ }
403
+ return module;
404
+ }
405
+ getCard(index) {
406
+ const moduleList = this.commonAppDataShareService.getModuleList();
407
+ const clickedModuleIndex = this.commonAppDataShareService.getModuleIndex();
408
+ let card = {};
409
+ let tabs = [];
410
+ let selectedTabIndex = -1;
411
+ let popoverTabbing = false;
412
+ if (clickedModuleIndex >= 0) {
413
+ card = moduleList[clickedModuleIndex];
414
+ }
415
+ if (card && card.tab_menu && card.tab_menu.length > 0 && card.popoverTabbing) {
416
+ popoverTabbing = true;
417
+ }
418
+ if (card && card.tab_menu && card.tab_menu.length > 0) {
419
+ const clickedtabIndex = this.commonAppDataShareService.getSelectdTabIndex();
420
+ tabs = card.tab_menu;
421
+ let tab = {};
422
+ if (index == -1) {
423
+ tab = tabs[0];
424
+ selectedTabIndex = 0;
425
+ }
426
+ else {
427
+ tab = tabs[clickedtabIndex];
428
+ selectedTabIndex = clickedtabIndex;
429
+ }
430
+ const tabIndex = this.commonFunctionService.getIndexInArrayById(moduleList, tab._id, "_id");
431
+ card = moduleList[tabIndex];
432
+ }
433
+ let object = {
434
+ 'tabs': tabs,
435
+ "card": card,
436
+ "selectedTabIndex": selectedTabIndex,
437
+ "popoverTabbing": popoverTabbing
438
+ };
439
+ return object;
440
+ }
441
+ getUserAutherisedCards(cardMasterList) {
442
+ const userAuthModules = this.storageService.GetModules();
443
+ const cardList = [];
444
+ if (userAuthModules && userAuthModules != null) {
445
+ userAuthModules.forEach((module, i) => {
446
+ if (module && module['_id']) {
447
+ cardMasterList.forEach((card, j) => {
448
+ if (card && card.userAutherisedModule && card['userAutherisedModule']['_id']) {
449
+ if (module['_id'] == card['userAutherisedModule']['_id']) {
450
+ cardList.push(card);
451
+ }
452
+ }
453
+ });
454
+ }
455
+ });
456
+ return cardList;
457
+ }
458
+ return null;
459
+ }
460
+ getNestedCard(cardGrid, cardGridName) {
461
+ if (cardGrid[cardGridName] && cardGrid[cardGridName] != undefined && cardGrid[cardGridName] != null && cardGrid[cardGridName] != '') {
462
+ return JSON.parse(JSON.stringify(cardGrid[cardGridName]));
463
+ }
464
+ else {
465
+ return {};
466
+ }
467
+ }
468
+ getModulesFromObject(obj) {
469
+ let modules = [];
470
+ const processModule = (moduleKey, module) => {
471
+ let moduleObj = { keyName: moduleKey };
472
+ if (module.reference) {
473
+ moduleObj = { ...moduleObj, ...module.reference };
474
+ }
475
+ moduleObj.notification = module.notification || false;
476
+ moduleObj.menu_list = this.getMenuList(module.menus);
477
+ modules.push(moduleObj);
478
+ };
479
+ if (obj.notifications) {
480
+ obj = obj.notifications;
481
+ if (obj && Object.keys(obj).length > 0) {
482
+ Object.entries(obj).forEach(([moduleKey, module]) => {
483
+ processModule(moduleKey, module);
484
+ });
485
+ }
486
+ }
487
+ return modules;
488
+ }
489
+ getMenuDetails(module) {
490
+ let obj = {};
491
+ if (module) {
492
+ module.forEach((menu) => {
493
+ let menuName = menu?.keyName;
494
+ let menuDetails = {};
495
+ let reference = {
496
+ name: menu?.name,
497
+ _id: menu?._id
498
+ };
499
+ if (menu) {
500
+ if (menu?.templateTabs) {
501
+ menuDetails = {
502
+ reference,
503
+ templateTabs: this.getTempDetails(menu.templateTabs)
504
+ };
505
+ obj[menuName] = menuDetails;
506
+ }
507
+ else if (menu?.submenu) {
508
+ menuDetails = {
509
+ reference,
510
+ submenus: this.getMenuDetails(menu.submenu)
511
+ };
512
+ obj[menuName] = menuDetails;
513
+ }
514
+ }
515
+ });
516
+ return obj;
517
+ }
518
+ }
519
+ getTempDetails(tabs) {
520
+ let obj = {};
521
+ tabs.forEach((tab) => {
522
+ if (tab) {
523
+ let tabName = tab?.keyName;
524
+ let tabDetails = {
525
+ reference: {
526
+ name: tab?.name,
527
+ _id: tab?._id
528
+ },
529
+ activeAlerts: this.getActiveAlerts(tab)
530
+ };
531
+ obj[tabName] = tabDetails;
532
+ }
533
+ });
534
+ return obj;
535
+ }
536
+ getActiveAlerts(tab) {
537
+ let arr = [];
538
+ if (tab?.email) {
539
+ arr.push('EMAIL');
540
+ }
541
+ if (tab?.whatsapp) {
542
+ arr.push('WHATSAPP');
543
+ }
544
+ if (tab?.sms) {
545
+ arr.push('SMS');
546
+ }
547
+ return arr;
548
+ }
549
+ }
550
+ MenuOrModuleCommonService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuOrModuleCommonService, deps: [{ token: i1.StorageService }, { token: i2.PermissionService }, { token: i3.CommonFunctionService }, { token: i4.DataShareService }, { token: i5.ApiService }, { token: i6.Router }, { token: i7.CommonAppDataShareService }, { token: i8.UserPrefrenceService }, { token: i9.CoreFunctionService }], target: i0.ɵɵFactoryTarget.Injectable });
551
+ MenuOrModuleCommonService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuOrModuleCommonService, providedIn: 'root' });
552
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuOrModuleCommonService, decorators: [{
553
+ type: Injectable,
554
+ args: [{
555
+ providedIn: 'root'
556
+ }]
557
+ }], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.PermissionService }, { type: i3.CommonFunctionService }, { type: i4.DataShareService }, { type: i5.ApiService }, { type: i6.Router }, { type: i7.CommonAppDataShareService }, { type: i8.UserPrefrenceService }, { type: i9.CoreFunctionService }]; } });
558
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1vci1tb2R1bGUtY29tbW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL21lbnUtb3ItbW9kdWxlLWNvbW1vbi9tZW51LW9yLW1vZHVsZS1jb21tb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7OztBQWEzQyxNQUFNLE9BQU8seUJBQXlCO0lBRXRDLFlBQ1UsY0FBOEIsRUFDOUIsaUJBQW1DLEVBQ25DLHFCQUEyQyxFQUMzQyxnQkFBaUMsRUFDakMsVUFBcUIsRUFDckIsTUFBYSxFQUNiLHlCQUFvRCxFQUNwRCxvQkFBMEMsRUFDMUMsbUJBQXdDO1FBUnhDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDM0MscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQU87UUFDYiw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQWliaEQsZ0JBQVcsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQzNCLElBQUksUUFBUSxHQUFVLEVBQUUsQ0FBQztZQUN6QixJQUFJLEtBQUssRUFBRTtnQkFDVCxNQUFNLENBQUMsT0FBTyxDQUFNLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7b0JBQ3JELElBQUksT0FBTyxHQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO29CQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQ2xCLE9BQU8sR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3FCQUM3QztvQkFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNsRCxJQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQzt3QkFBQyxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUFDO29CQUNqRixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xGLENBQUMsQ0FBQztRQUVGLGVBQVUsR0FBRyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3pCLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQztZQUN4QixJQUFJLElBQUksRUFBRTtnQkFDUixNQUFNLENBQUMsT0FBTyxDQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUU7b0JBQ2xELElBQUksTUFBTSxHQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUN0QyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUU7d0JBQ2pCLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO3FCQUMxQztvQkFDRCxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQztvQkFDNUQsTUFBTSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUM7b0JBQ2xFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO29CQUN4RCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDO0lBL2NBLENBQUM7SUFFSCxrREFBa0Q7SUFDbEQsbUNBQW1DO0lBQ25DLDZDQUE2QztJQUM3QywyQ0FBMkM7SUFDM0MsdUVBQXVFO0lBQ3ZFLDJDQUEyQztJQUMzQyw0RUFBNEU7SUFDNUUsdUVBQXVFO0lBQ3ZFLHNDQUFzQztJQUN0QyxpQkFBaUI7SUFDakIsdUNBQXVDO0lBQ3ZDLFlBQVk7SUFDWix5Q0FBeUM7SUFDekMsZUFBZTtJQUNmLHlDQUF5QztJQUN6QyxVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTiw2QkFBNkI7SUFDN0IsSUFBSTtJQUNKLG1CQUFtQixDQUFDLFFBQVk7UUFDOUIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLGFBQWEsR0FBRztZQUNsQixrQkFBa0IsRUFBQyxnQkFBZ0I7WUFDbkMscUJBQXFCLEVBQUUsbUJBQW1CO1NBQzNDLENBQUM7UUFDRixJQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztZQUNqQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2pELE1BQU0sV0FBVyxHQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlDLElBQUcsV0FBVyxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQ3ZELG1CQUFtQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNoRSxJQUFHLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxFQUFDO29CQUMzQixtQkFBbUIsR0FBRyxDQUFDLENBQUM7aUJBQ3pCO2FBQ0Y7U0FDRjtRQUNELGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUNsRCxhQUFhLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDeEQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUNELGVBQWUsQ0FBQyxRQUFZO1FBQzFCLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ2pDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBSSxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNyRCxJQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUM7b0JBQzdCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztvQkFDekIsTUFBTTtpQkFDUDthQUNGO1NBQ0Y7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFDRCxnREFBZ0Q7SUFDaEQsNkJBQTZCO0lBQzdCLHlDQUF5QztJQUN6QyxnRUFBZ0U7SUFDaEUsMENBQTBDO0lBQzFDLHNEQUFzRDtJQUN0RCw0Q0FBNEM7SUFDNUMsK0JBQStCO0lBQy9CLGdFQUFnRTtJQUNoRSxxREFBcUQ7SUFDckQsd0RBQXdEO0lBQ3hELG1EQUFtRDtJQUNuRCx5REFBeUQ7SUFDekQsbUNBQW1DO0lBQ25DLDJCQUEyQjtJQUMzQixvREFBb0Q7SUFDcEQseURBQXlEO0lBQ3pELHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsZ0NBQWdDO0lBQ2hDLDRDQUE0QztJQUM1Qyx1QkFBdUI7SUFDdkIsNkNBQTZDO0lBQzdDLGtCQUFrQjtJQUNsQixrREFBa0Q7SUFDbEQsMkNBQTJDO0lBQzNDLG1CQUFtQjtJQUNuQixpREFBaUQ7SUFDakQsNENBQTRDO0lBQzVDLCtDQUErQztJQUMvQyx1QkFBdUI7SUFDdkIsNkNBQTZDO0lBQzdDLCtDQUErQztJQUMvQyxrQkFBa0I7SUFDbEIsY0FBYztJQUNkLFVBQVU7SUFDVixNQUFNO0lBQ04sMkJBQTJCO0lBQzNCLElBQUk7SUFDSixrREFBa0Q7SUFDbEQsdUJBQXVCO0lBQ3ZCLHlDQUF5QztJQUN6Qyw4REFBOEQ7SUFDOUQsc0NBQXNDO0lBQ3RDLGtEQUFrRDtJQUNsRCwwREFBMEQ7SUFDMUQsNkNBQTZDO0lBQzdDLGlDQUFpQztJQUNqQyw0QkFBNEI7SUFDNUIscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCxZQUFZO0lBQ1osZUFBZTtJQUNmLDRCQUE0QjtJQUM1QiwwQkFBMEI7SUFDMUIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixrQkFBa0I7SUFDbEIsSUFBSTtJQUNKLGNBQWMsQ0FBQyxRQUFZO1FBQ3ZCLElBQUksSUFBSSxHQUFPLEVBQUUsQ0FBQztRQUNsQixJQUFJLFdBQVcsR0FBTyxFQUFFLENBQUM7UUFDekIsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLGlCQUFpQixDQUFDO1FBQ25DLElBQUcsaUJBQWlCLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEVBQUM7WUFDMUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDL0I7YUFBSTtZQUNELFdBQVcsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMzRCxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQ2hDO1FBQ0QsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDM0IsMkJBQTJCO1FBRTNCLFNBQVM7UUFDVCw0REFBNEQ7UUFDNUQsSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCx3Q0FBd0M7SUFDeEMsMkJBQTJCO0lBQzNCLDJDQUEyQztJQUMzQyxrRUFBa0U7SUFDbEUsNENBQTRDO0lBQzVDLHdFQUF3RTtJQUN4RSxrRUFBa0U7SUFDbEUsdURBQXVEO0lBQ3ZELDJDQUEyQztJQUMzQyxnREFBZ0Q7SUFDaEQsaUNBQWlDO0lBQ2pDLHdCQUF3QjtJQUN4QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9DQUFvQztJQUNwQyx5Q0FBeUM7SUFDekMsNkJBQTZCO0lBQzdCLG9CQUFvQjtJQUNwQixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFFBQVE7SUFDUix5QkFBeUI7SUFDekIsSUFBSTtJQUNKLGFBQWEsQ0FBQyxVQUFpQjtRQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsUUFBWTtRQUM3QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsY0FBYyxDQUFDLFNBQWdCLEVBQUMsWUFBbUIsRUFBQyxXQUFtQjtRQUNyRSxJQUFJLE1BQU0sR0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0MsbUJBQW1CLENBQUMsUUFBWSxFQUFDLFFBQVk7UUFDM0MsSUFBSSxNQUFNLEdBQUU7WUFDVixXQUFXLEVBQUMsQ0FBQyxDQUFDO1lBQ2QsY0FBYyxFQUFDLENBQUMsQ0FBQztTQUNsQixDQUFBO1FBQ0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFDO2dCQUN4QyxNQUFNLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDekIsTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxQjtpQkFBSTtnQkFDSCxJQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO29CQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hDLElBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxRQUFRLEVBQUM7NEJBQzFCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOzRCQUN6QixNQUFNLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQzt5QkFDekI7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELGVBQWUsQ0FBQyxNQUFVLEVBQUMsTUFBVSxFQUFDLFNBQWEsRUFBQyxHQUFRO1FBQzFELElBQUksUUFBUSxHQUFPLEVBQUUsQ0FBQztRQUN0QixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUMsTUFBTSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BGLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLElBQUcsU0FBUyxJQUFJLEVBQUUsRUFBQztZQUNqQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7Z0JBQ2QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDL0IsSUFBRyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7b0JBQ3JDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUMsU0FBUyxFQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM3RixRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsWUFBWSxDQUFDO29CQUN4QyxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3hDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2lCQUNuQzthQUNGO1NBQ0Y7YUFBSTtZQUNILFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELDZCQUE2QjtJQUM3Qix3RUFBd0U7SUFDeEUsSUFBSTtJQUNKLGVBQWUsQ0FBQyxNQUFVLEVBQUMsT0FBVztRQUNwQyxJQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzthQUN4QztpQkFDSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksYUFBYSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDekM7aUJBQ0k7Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDO2dCQUNyQixJQUFHLElBQUksQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUM7b0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDL0I7cUJBQUssSUFBRyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsRUFBQztvQkFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNsQztxQkFDRztvQkFDRixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sS0FBSyxHQUFHLFNBQVMsR0FBQyxNQUFNLENBQUMsSUFBSSxHQUFDLEdBQUcsR0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNyRCxxQkFBcUI7b0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDOUIscUNBQXFDO2lCQUN0QzthQUNGO1NBQ0o7YUFBSTtZQUNILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQVE7UUFDekIsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBQztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELFVBQVU7UUFDUixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2xELElBQUksUUFBUSxJQUFJLFlBQVksRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFRO1FBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRTtZQUN2QixJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQzVCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDdkIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxHQUFPO1FBQ3hCLElBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUN4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksRUFBQyxLQUFLLENBQUMsQ0FBQztZQUMvRCxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0Qsb0JBQW9CLENBQUMsR0FBTyxFQUFDLE1BQVU7UUFDckMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNwQixJQUFHLE1BQU0sSUFBSSxFQUFFLEVBQUM7WUFDZCxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUNwQjtRQUNELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4RixJQUFHLFVBQVUsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQzNELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2YsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3RELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEMsSUFBRyxPQUFPLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRTtvQkFDdkIsS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFDZCxNQUFNO2lCQUNQO2FBQ0Y7WUFDRCxJQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBQztnQkFDWixJQUFHLE1BQU0sSUFBSSxFQUFFLEVBQUM7b0JBQ2QsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdkIsSUFBRyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7d0JBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQzNCLElBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFDO2dDQUN4QixhQUFhLEdBQUcsQ0FBQyxDQUFDO2dDQUNsQixNQUFNOzZCQUNQO3lCQUVGO3FCQUNGO29CQUNELElBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFDO3dCQUNwQixPQUFPLElBQUksQ0FBQTtxQkFDWjt5QkFBSTt3QkFDSCxPQUFPLEtBQUssQ0FBQztxQkFDZDtpQkFDRjtxQkFBSTtvQkFDSCxPQUFPLElBQUksQ0FBQztpQkFDYjthQUNGO2lCQUFJO2dCQUNILE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjthQUFJO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxVQUFVO0lBQ1Ysd0JBQXdCO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNsRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMzRSxJQUFJLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDckIsSUFBRyxrQkFBa0IsSUFBSSxDQUFDLEVBQUM7WUFDekIsTUFBTSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sQ0FBQyxLQUFTO1FBQ2YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2xFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNFLElBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQztRQUNuQixJQUFJLElBQUksR0FBTSxFQUFFLENBQUM7UUFDakIsSUFBSSxnQkFBZ0IsR0FBVSxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBRyxrQkFBa0IsSUFBSSxDQUFDLEVBQUM7WUFDekIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBQztZQUMxRSxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO1FBQ0QsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDckQsTUFBTSxlQUFlLEdBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDekUsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDckIsSUFBSSxHQUFHLEdBQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFDO2dCQUNiLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2FBQ3RCO2lCQUFJO2dCQUNILEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzVCLGdCQUFnQixHQUFHLGVBQWUsQ0FBQzthQUNwQztZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUMxRixJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxNQUFNLEdBQUc7WUFDWCxNQUFNLEVBQUcsSUFBSTtZQUNiLE1BQU0sRUFBRyxJQUFJO1lBQ2Isa0JBQWtCLEVBQUcsZ0JBQWdCO1lBQ3JDLGdCQUFnQixFQUFHLGNBQWM7U0FDbEMsQ0FBQTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxzQkFBc0IsQ0FBQyxjQUFrQjtRQUN2QyxNQUFNLGVBQWUsR0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFHLGVBQWUsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFDO1lBQzVDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFVLEVBQUUsQ0FBUSxFQUFFLEVBQUU7Z0JBQy9DLElBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBQztvQkFDekIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVEsRUFBRSxDQUFRLEVBQUUsRUFBRTt3QkFDNUMsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFDOzRCQUMxRSxJQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBQztnQ0FDdEQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs2QkFDckI7eUJBQ0Y7b0JBQ0gsQ0FBQyxDQUFDLENBQUE7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsYUFBYSxDQUFDLFFBQVksRUFBRSxZQUFnQjtRQUMxQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksU0FBUyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNEO2FBQU07WUFDTCxPQUFPLEVBQUUsQ0FBQztTQUNYO0lBQ0gsQ0FBQztJQUNELG9CQUFvQixDQUFDLEdBQVE7UUFDM0IsSUFBSSxPQUFPLEdBQVUsRUFBRSxDQUFDO1FBRXhCLE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBaUIsRUFBRSxNQUFXLEVBQUUsRUFBRTtZQUN2RCxJQUFJLFNBQVMsR0FBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUM1QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLFNBQVMsR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ25EO1lBQ0QsU0FBUyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQztZQUN0RCxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDO1FBRUYsSUFBSSxHQUFHLENBQUMsYUFBYSxFQUFFO1lBQ3JCLEdBQUcsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQ3hCLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFO29CQUN2RCxhQUFhLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNuQyxDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBbUNELGNBQWMsQ0FBQyxNQUFXO1FBQ3hCLElBQUksR0FBRyxHQUFRLEVBQUUsQ0FBQztRQUNsQixJQUFJLE1BQU0sRUFBRTtZQUNSLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxRQUFRLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQztnQkFDN0IsSUFBSSxXQUFXLEdBQVEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLFNBQVMsR0FBUTtvQkFDakIsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO29CQUNoQixHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUc7aUJBQ2pCLENBQUE7Z0JBQ0QsSUFBSSxJQUFJLEVBQUU7b0JBQ04sSUFBSSxJQUFJLEVBQUUsWUFBWSxFQUFFO3dCQUNwQixXQUFXLEdBQUc7NEJBQ1YsU0FBUzs0QkFDVCxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO3lCQUN2RCxDQUFBO3dCQUNELEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUM7cUJBQy9CO3lCQUFNLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRTt3QkFDdEIsV0FBVyxHQUFHOzRCQUNWLFNBQVM7NEJBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzt5QkFDOUMsQ0FBQTt3QkFDSCxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxDQUFDO3FCQUM3QjtpQkFDSjtZQUNMLENBQUMsQ0FBQyxDQUFBO1lBRUYsT0FBTyxHQUFHLENBQUM7U0FDZDtJQUNMLENBQUM7SUFHRCxjQUFjLENBQUMsSUFBUTtRQUNyQixJQUFJLEdBQUcsR0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBTyxFQUFDLEVBQUU7WUFDdEIsSUFBRyxHQUFHLEVBQUM7Z0JBQ0wsSUFBSSxPQUFPLEdBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztnQkFDekIsSUFBSSxVQUFVLEdBQUM7b0JBQ2IsU0FBUyxFQUFDO3dCQUNSLElBQUksRUFBQyxHQUFHLEVBQUUsSUFBSTt3QkFDZCxHQUFHLEVBQUMsR0FBRyxFQUFFLEdBQUc7cUJBQ2I7b0JBQ0QsWUFBWSxFQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO2lCQUN2QyxDQUFBO2dCQUNELEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBQyxVQUFVLENBQUM7YUFDekI7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGVBQWUsQ0FBQyxHQUFPO1FBQ3JCLElBQUksR0FBRyxHQUFDLEVBQUUsQ0FBQztRQUNYLElBQUcsR0FBRyxFQUFFLEtBQUssRUFBQztZQUNaLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkI7UUFDRCxJQUFHLEdBQUcsRUFBRSxRQUFRLEVBQUM7WUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsSUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFDO1lBQ1YsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNqQjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7dUhBM2hCWSx5QkFBeUI7MkhBQXpCLHlCQUF5QixjQUZ4QixNQUFNOzRGQUVQLHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi9hcGkvYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhU2hhcmVTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0YS1zaGFyZS9kYXRhLXNoYXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4uL3Blcm1pc3Npb24vcGVybWlzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbW1vbkFwcERhdGFTaGFyZVNlcnZpY2UgfSBmcm9tICcuLi9kYXRhLXNoYXJlL2NvbW1vbi1hcHAtZGF0YS1zaGFyZS9jb21tb24tYXBwLWRhdGEtc2hhcmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJQcmVmcmVuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlclByZWZyZW5jZS91c2VyLXByZWZyZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZUZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi11dGlscy9jb3JlLWZ1bmN0aW9uL2NvcmUtZnVuY3Rpb24uc2VydmljZSc7XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1lbnVPck1vZHVsZUNvbW1vblNlcnZpY2Uge1xyXG5cclxuY29uc3RydWN0b3IoXHJcbiAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uU2VydmljZTpQZXJtaXNzaW9uU2VydmljZSxcclxuICBwcml2YXRlIGNvbW1vbkZ1bmN0aW9uU2VydmljZTpDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBkYXRhU2hhcmVTZXJ2aWNlOkRhdGFTaGFyZVNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2UsXHJcbiAgcHJpdmF0ZSByb3V0ZXI6Um91dGVyLFxyXG4gIHByaXZhdGUgY29tbW9uQXBwRGF0YVNoYXJlU2VydmljZTogQ29tbW9uQXBwRGF0YVNoYXJlU2VydmljZSxcclxuICBwcml2YXRlIHVzZXJQcmVmcmVuY2VTZXJ2aWNlOiBVc2VyUHJlZnJlbmNlU2VydmljZSxcclxuICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6IENvcmVGdW5jdGlvblNlcnZpY2UsXHJcbikgeyB9XHJcblxyXG4gIC8vIG1vZGlmeU1vZHVsZUxpc3RXaXRoUGVybWlzc2lvbihtb2R1bGVMaXN0OmFueSl7XHJcbiAgLy8gICBsZXQgbW9kaWZ5TW9kdWxlTGlzdDphbnkgPSBbXTtcclxuICAvLyAgIGlmKG1vZHVsZUxpc3QgJiYgbW9kdWxlTGlzdC5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgbW9kdWxlTGlzdC5mb3JFYWNoKChtb2R1bGU6YW55KSA9PiB7XHJcbiAgLy8gICAgICAgaWYobW9kdWxlICYmIG1vZHVsZS5tZW51X2xpc3QgJiYgbW9kdWxlLm1lbnVfbGlzdC5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgICAgIGxldCBtZW51TGlzdCA9IG1vZHVsZS5tZW51X2xpc3Q7XHJcbiAgLy8gICAgICAgICBtb2R1bGUubWVudV9saXN0ID0gdGhpcy5zZXREaXNwbGF5SW5NZW51V2l0aFBlcm1pc3Npb24obWVudUxpc3QpO1xyXG4gIC8vICAgICAgICAgaWYodGhpcy5zZXREaXNwbGF5SW5Nb2R1bGVXaXRoUGVybWlzc2lvbihtb2R1bGUubWVudV9saXN0KSl7XHJcbiAgLy8gICAgICAgICAgIG1vZHVsZVsnZGlzcGxheSddID0gdHJ1ZTtcclxuICAvLyAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICBtb2R1bGVbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgbW9kaWZ5TW9kdWxlTGlzdC5wdXNoKG1vZHVsZSk7XHJcbiAgLy8gICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICBtb2RpZnlNb2R1bGVMaXN0LnB1c2gobW9kdWxlKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIG1vZGlmeU1vZHVsZUxpc3Q7XHJcbiAgLy8gfVxyXG4gIGdldERlZmF1bHRNZW51SW5kZXgobWVudUxpc3Q6YW55KXtcclxuICAgIGxldCBkZWZhdWx0bWVudUluZGV4ID0gMDtcclxuICAgIGxldCBkZWZhdWx0U3VibWVudUluZGV4ID0gLTE7XHJcbiAgICBsZXQgZGVmYXVsdEluZGV4cyA9IHtcclxuICAgICAgJ2RlZmF1bHRtZW51SW5kZXgnOmRlZmF1bHRtZW51SW5kZXgsXHJcbiAgICAgICdkZWZhdWx0U3VibWVudUluZGV4JyA6ZGVmYXVsdFN1Ym1lbnVJbmRleFxyXG4gICAgfTtcclxuICAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICBkZWZhdWx0bWVudUluZGV4ID0gdGhpcy5nZXREZWZhdWx0SW5kZXgobWVudUxpc3QpXHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNZW51ID1tZW51TGlzdFtkZWZhdWx0bWVudUluZGV4XTtcclxuICAgICAgaWYoZGVmYXVsdE1lbnUuc3VibWVudSAmJiBkZWZhdWx0TWVudS5zdWJtZW51Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgIGRlZmF1bHRTdWJtZW51SW5kZXggPSB0aGlzLmdldERlZmF1bHRJbmRleChkZWZhdWx0TWVudS5zdWJtZW51KTtcclxuICAgICAgICBpZihkZWZhdWx0U3VibWVudUluZGV4ID09IC0xKXtcclxuICAgICAgICAgIGRlZmF1bHRTdWJtZW51SW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVmYXVsdEluZGV4cy5kZWZhdWx0bWVudUluZGV4ID0gZGVmYXVsdG1lbnVJbmRleDtcclxuICAgIGRlZmF1bHRJbmRleHMuZGVmYXVsdFN1Ym1lbnVJbmRleCA9IGRlZmF1bHRTdWJtZW51SW5kZXg7XHJcbiAgICByZXR1cm4gZGVmYXVsdEluZGV4cztcclxuICB9XHJcbiAgZ2V0RGVmYXVsdEluZGV4KG1lbnVMaXN0OmFueSl7XHJcbiAgICBsZXQgZGVmYXVsdG1lbnVJbmRleCA9IDA7XHJcbiAgICBpZihtZW51TGlzdCAmJiBtZW51TGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8ICBtZW51TGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBpZihtZW51TGlzdFtpbmRleF0uZGVmYXVsdE1lbnUpe1xyXG4gICAgICAgICAgZGVmYXVsdG1lbnVJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVmYXVsdG1lbnVJbmRleDtcclxuICB9XHJcbiAgLy8gc2V0RGlzcGxheUluTWVudVdpdGhQZXJtaXNzaW9uKG1lbnVMaXN0OmFueSl7XHJcbiAgLy8gICBsZXQgbW9kaWZ5TWVudUxpc3QgPSBbXTtcclxuICAvLyAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtZW51TGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAvLyAgICAgICAgICAgY29uc3QgbWVudSA9IG1lbnVMaXN0W2luZGV4XTtcclxuICAvLyAgICAgICAgICAgaWYobWVudS5zdWJtZW51ICYmIG1lbnUuc3VibWVudSAhPSBudWxsKXtcclxuICAvLyAgICAgICAgICAgICAgIGxldCBtb2RpZnlTdWJNZW51TGlzdCA9IFtdO1xyXG4gIC8vICAgICAgICAgICAgICAgbGV0IGNoZWNrID0gMDtcclxuICAvLyAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWVudS5zdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgY29uc3Qgc3VibWVudSA9IG1lbnUuc3VibWVudVtqXTtcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZighdGhpcy5jaGVja1Blcm1pc3Npb24oc3VibWVudSkpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBzdWJtZW51WydkaXNwbGF5J10gPSB0cnVlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTdWJNZW51TGlzdC5wdXNoKHN1Ym1lbnUpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IDE7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHN1Ym1lbnVbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTdWJNZW51TGlzdC5wdXNoKHN1Ym1lbnUpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIGlmKGNoZWNrID09IDEpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1lbnVbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgLy8gICAgICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICAgICAgICBtZW51WydkaXNwbGF5J10gPSBmYWxzZTtcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIG1lbnUuc3VibWVudSA9IG1vZGlmeVN1Yk1lbnVMaXN0O1xyXG4gIC8vICAgICAgICAgICAgICAgbW9kaWZ5TWVudUxpc3QucHVzaChtZW51KTtcclxuICAvLyAgICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgICAgICBpZighdGhpcy5jaGVja1Blcm1pc3Npb24obWVudSkpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1lbnVbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgbW9kaWZ5TWVudUxpc3QucHVzaChtZW51KTtcclxuICAvLyAgICAgICAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1lbnVbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1vZGlmeU1lbnVMaXN0LnB1c2gobWVudSk7XHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gbW9kaWZ5TWVudUxpc3Q7XHJcbiAgLy8gfVxyXG4gIC8vIHNldERpc3BsYXlJbk1vZHVsZVdpdGhQZXJtaXNzaW9uKG1lbnVMaXN0OmFueSl7XHJcbiAgLy8gICBsZXQgY2hlY2sgPSBmYWxzZTtcclxuICAvLyAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWVudUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgLy8gICAgICAgY29uc3QgbWVudSA9IG1lbnVMaXN0W2luZGV4XTtcclxuICAvLyAgICAgICBpZihtZW51LnN1Ym1lbnUgJiYgbWVudS5zdWJtZW51ICE9IG51bGwpe1xyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtZW51LnN1Ym1lbnUubGVuZ3RoOyBqKyspIHtcclxuICAvLyAgICAgICAgICAgY29uc3Qgc3VibWVudSA9IG1lbnUuc3VibWVudVtqXTtcclxuICAvLyAgICAgICAgICAgaWYoc3VibWVudS5kaXNwbGF5KXtcclxuICAvLyAgICAgICAgICAgICBjaGVjayA9IHRydWU7XHJcbiAgLy8gICAgICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgIGlmKG1lbnUuZGlzcGxheSl7XHJcbiAgLy8gICAgICAgICAgIGNoZWNrID0gdHJ1ZTtcclxuICAvLyAgICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gY2hlY2s7XHJcbiAgLy8gfVxyXG4gIGdldERlZmF1bHRNZW51KG1lbnVMaXN0OmFueSl7XHJcbiAgICAgIGxldCBtZW51OmFueSA9IHt9O1xyXG4gICAgICBsZXQgZGVmYXVsdE1lbnU6YW55ID0ge307XHJcbiAgICAgIGxldCBkZWZhdWx0TWVudUluZGV4cyA9IHRoaXMuZ2V0RGVmYXVsdE1lbnVJbmRleChtZW51TGlzdCk7XHJcbiAgICAgIG1lbnVbJ2luZGV4cyddID0gZGVmYXVsdE1lbnVJbmRleHM7XHJcbiAgICAgIGlmKGRlZmF1bHRNZW51SW5kZXhzLmRlZmF1bHRTdWJtZW51SW5kZXggPiAtMSl7XHJcbiAgICAgICAgICBkZWZhdWx0TWVudSA9IG1lbnVMaXN0W2RlZmF1bHRNZW51SW5kZXhzLmRlZmF1bHRtZW51SW5kZXhdLnN1Ym1lbnVbZGVmYXVsdE1lbnVJbmRleHMuZGVmYXVsdFN1Ym1lbnVJbmRleF07XHJcbiAgICAgICAgICBkZWZhdWx0TWVudVsnY2hpbGQnXSA9IHRydWU7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgICAgZGVmYXVsdE1lbnUgPSBtZW51TGlzdFtkZWZhdWx0TWVudUluZGV4cy5kZWZhdWx0bWVudUluZGV4XTtcclxuICAgICAgICAgIGRlZmF1bHRNZW51WydjaGlsZCddID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZGVmYXVsdE1lbnVbJ21lbnVJbmRleCddID0gZGVmYXVsdE1lbnVJbmRleHMuZGVmYXVsdG1lbnVJbmRleDtcclxuICAgICAgbWVudVsnbWVudSddID0gZGVmYXVsdE1lbnU7XHJcbiAgICAgIC8vIGlmKGRlZmF1bHRNZW51LmRpc3BsYXkpe1xyXG5cclxuICAgICAgLy8gfWVsc2V7XHJcbiAgICAgIC8vICAgICBtZW51WydtZW51J10gPSB0aGlzLmZpbmRNZW51V2l0aFBlcm1pc3Npb24obWVudUxpc3QpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIHJldHVybiBtZW51O1xyXG4gIH1cclxuICAvLyBmaW5kTWVudVdpdGhQZXJtaXNzaW9uKG1lbnVMaXN0OmFueSl7XHJcbiAgLy8gICAgIGxldCBtb2RpZnlNZW51ID0ge307XHJcbiAgLy8gICAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1lbnVMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IG1lbnUgPSBtZW51TGlzdFtpbmRleF07XHJcbiAgLy8gICAgICAgICAgICAgaWYobWVudS5kaXNwbGF5ICYmIG1lbnUuc3VibWVudSAmJiBtZW51LnN1Ym1lbnUgIT0gbnVsbCl7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWVudS5zdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtZW51ID0gbWVudS5zdWJtZW51W2pdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgaWYoc3VibWVudS5kaXNwbGF5KXtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlNZW51ID0gc3VibWVudTtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICAgICAgICBpZihtZW51LmRpc3BsYXkpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5TWVudSA9IG1lbnU7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICByZXR1cm4gbW9kaWZ5TWVudTtcclxuICAvLyB9XHJcbiAgc2V0TW9kdWxlTmFtZShtb2R1bGVOYW1lOnN0cmluZyl7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldE1vZHVsZShtb2R1bGVOYW1lKTtcclxuICB9XHJcbiAgZ2V0TW9kdWxlSW5kZXhCeUlkKG1vZHVsZUlkOmFueSl7XHJcbiAgICBsZXQgbW9kdWxlTGlzdCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0TW9kdWxlcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEluZGV4SW5BcnJheUJ5SWQobW9kdWxlTGlzdCxtb2R1bGVJZCk7XHJcbiAgfVxyXG4gIHNoYXJlTWVudUluZGV4KG1lbnVJbmRleDpudW1iZXIsc3ViTWVudUluZGV4Om51bWJlcixtb2R1bGVJbmRleD86bnVtYmVyKXtcclxuICAgIGxldCBpbmRleHM6YW55ID0ge307XHJcbiAgICBpbmRleHNbJ21lbnVJbmRleCddID0gbWVudUluZGV4O1xyXG4gICAgaW5kZXhzWydzdWJtZW51SW5kZXgnXSA9IHN1Yk1lbnVJbmRleDtcclxuICAgIGluZGV4c1snbW9kdWxlSW5kZXgnXSA9IG1vZHVsZUluZGV4O1xyXG4gICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE1lbnVJbmRleHMoaW5kZXhzKTtcclxufVxyXG4gIGdldEluZGV4c0J5TWVudU5hbWUobWVudUxpc3Q6YW55LG1lbnVOYW1lOmFueSl7XHJcbiAgICBsZXQgaW5kZXhzPSB7XHJcbiAgICAgICdtZW51aW5kZXgnOi0xLFxyXG4gICAgICAnc3VibWVudWluZGV4JzotMVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1lbnVMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBtZW51ID0gbWVudUxpc3RbaW5kZXhdO1xyXG4gICAgICBpZighbWVudS5zdWJtZW51ICYmIG1lbnUubmFtZSA9PSBtZW51TmFtZSl7XHJcbiAgICAgICAgaW5kZXhzLm1lbnVpbmRleCA9IGluZGV4O1xyXG4gICAgICAgIGluZGV4cy5zdWJtZW51aW5kZXggPSAtMTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgaWYobWVudS5zdWJtZW51ICYmIG1lbnUuc3VibWVudS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWVudS5zdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Yk1lbnUgPSBtZW51LnN1Ym1lbnVbal07XHJcbiAgICAgICAgICAgIGlmKHN1Yk1lbnUubmFtZSA9PSBtZW51TmFtZSl7XHJcbiAgICAgICAgICAgICAgaW5kZXhzLm1lbnVpbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgIGluZGV4cy5zdWJtZW51aW5kZXggPSBqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXhzO1xyXG4gIH1cclxuICBnZXRNZW51TmFtZUJ5SWQobW9kdWxlOmFueSxtZW51SWQ6YW55LHN1Ym1lbnVJZDphbnksa2V5Pzphbnkpe1xyXG4gICAgbGV0IG1lbnVOYW1lOmFueSA9IHt9O1xyXG4gICAgbGV0IG1lbnVMaXN0ID0gbW9kdWxlLm1lbnVfbGlzdDtcclxuICAgIGxldCBtZW51SW5kZXggPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRJbmRleEluQXJyYXlCeUlkKG1lbnVMaXN0LG1lbnVJZCxrZXkpO1xyXG4gICAgbWVudU5hbWVbJ21lbnVJbmRleCddID0gbWVudUluZGV4O1xyXG4gICAgbGV0IG1lbnUgPSBtZW51TGlzdFttZW51SW5kZXhdO1xyXG4gICAgaWYoc3VibWVudUlkICE9IFwiXCIpe1xyXG4gICAgICBpZihtZW51LnN1Ym1lbnUpe1xyXG4gICAgICAgIGxldCBzdWJNZW51TGlzdCA9IG1lbnUuc3VibWVudTtcclxuICAgICAgICBpZihzdWJNZW51TGlzdCAmJiBzdWJNZW51TGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgbGV0IHN1Yk1lbnVJbmRleCA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEluZGV4SW5BcnJheUJ5SWQoc3ViTWVudUxpc3Qsc3VibWVudUlkLGtleSk7XHJcbiAgICAgICAgICAgIG1lbnVOYW1lWydzdWJNZW51SW5kZXgnXSA9IHN1Yk1lbnVJbmRleDtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnUgPSBzdWJNZW51TGlzdFtzdWJNZW51SW5kZXhdO1xyXG4gICAgICAgICAgICBtZW51TmFtZVsnbmFtZSddID0gc3VibWVudS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIG1lbnVOYW1lWyduYW1lJ10gPSBtZW51Lm5hbWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVudU5hbWU7XHJcbiAgfVxyXG4gIC8vIGNoZWNrUGVybWlzc2lvbihtZW51OmFueSl7XHJcbiAgLy8gICAgIHJldHVybiAhdGhpcy5wZXJtaXNzaW9uU2VydmljZS5jaGVja1Blcm1pc3Npb24obWVudS5uYW1lLCAndmlldycpXHJcbiAgLy8gfVxyXG4gIGdldFRlbXBsYXRlRGF0YShtb2R1bGU6YW55LHN1Ym1lbnU6YW55KSB7XHJcbiAgICBpZihzdWJtZW51ICYmIHN1Ym1lbnUubmFtZSl7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5TZXRBY3RpdmVNZW51KHN1Ym1lbnUpO1xyXG4gICAgICAgIGlmIChzdWJtZW51LmxhYmVsID09IFwiTmF2aWdhdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnTmF2aWdhdGlvbiddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3VibWVudS5sYWJlbCA9PSBcIlBlcm1pc3Npb25zXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydwZXJtaXNzaW9ucyddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBtZW51ID0gc3VibWVudTtcclxuICAgICAgICAgIGlmKG1lbnUubmFtZSA9PSBcImRvY3VtZW50X2xpYnJhcnlcIil7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsndmRyJ10pO1xyXG4gICAgICAgICAgfWVsc2UgaWYobWVudS5uYW1lID09IFwicmVwb3J0XCIpe1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ3JlcG9ydCddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuYXBpU2VydmljZS5yZXNldFRlbXBEYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBpU2VydmljZS5yZXNldEdyaWREYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR29Ub1NlbGVjdGVkTW9kdWxlKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gJ2Jyb3dzZS8nK21vZHVsZS5uYW1lK1wiL1wiK3N1Ym1lbnUubmFtZTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhyb3V0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtyb3V0ZV0pO1xyXG4gICAgICAgICAgICAvL3RoaXMucm91dGVyLm5hdmlnYXRlKFsndGVtcGxhdGUnXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuY2hlY2tUb2tlblN0YXR1c0ZvclBlcm1pc3Npb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEdvVG9TZWxlY3RlZE1vZHVsZShpdGVtOmFueSl7XHJcbiAgICBpZihpdGVtICYmIGl0ZW0ubmFtZSl7XHJcbiAgICAgICAgdGhpcy5zZXRNb2R1bGVOYW1lKGl0ZW0ubmFtZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2VuZEN1cnJlbnRQYWdlKCdEQVNIQk9BUkQnKTtcclxuICB9XHJcbiAgZ29Ub01PZHVsZSgpIHtcclxuICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZW5kQ3VycmVudFBhZ2UoJ01PRFVMRScpO1xyXG4gICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnJlc2V0SGVhZGVyTWVudShbXSk7XHJcbiAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0TW9kdWxlSW5kZXgoLTEpO1xyXG4gICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE1lbnVJbmRleHMoe21lbnVJbmRleDotMSxzdWJtZW51SW5kZXg6LTF9KTtcclxuICAgIGNvbnN0IG1lbnVUeXBlID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRNZW51VHlwZSgpXHJcbiAgICBpZiAobWVudVR5cGUgPT0gJ0hvcml6b250YWwnKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvaG9tZSddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvZGFzaGJvYXJkJ10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlld1Blcm1pc3Npb25JblRhYnModGFiczphbnkpe1xyXG4gICAgdGFicy5mb3JFYWNoKCh0YWI6YW55KSA9PiB7XHJcbiAgICAgIGxldCB0YWJfbmFtZSA9IHRhYi50YWJfbmFtZTtcclxuICAgICAgbGV0IGNoZWNrID0gdGhpcy5wZXJtaXNzaW9uU2VydmljZS5jaGVja1Blcm1pc3Npb24odGFiX25hbWUsJ3ZpZXcnKTtcclxuICAgICAgdGFiWydkaXNwbGF5J10gPSBjaGVjaztcclxuICAgICAgdGFiWydmZWJNZW51J10gPSB0aGlzLmNoZWNrRmViTWVudUFkZE9yTm90KHRhYiwnJyk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0YWJzO1xyXG4gIH1cclxuXHJcbiAgYWRkUGVybWlzc2lvbkluVGFiKHRhYjphbnkpe1xyXG4gICAgaWYodGFiICYmIHRhYi50YWJfbmFtZSl7XHJcbiAgICAgIGxldCBuYW1lID0gdGFiLnRhYl9uYW1lO1xyXG4gICAgICBsZXQgY2hlY2sgPSB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmNoZWNrUGVybWlzc2lvbihuYW1lLCdhZGQnKTtcclxuICAgICAgdGFiWydhZGRGb3JtJ10gPSBjaGVjaztcclxuICAgIH1cclxuICAgIHJldHVybiB0YWI7XHJcbiAgfVxyXG4gIGNoZWNrRmViTWVudUFkZE9yTm90KHRhYjphbnkscGFyZW50OmFueSl7XHJcbiAgICBsZXQgdGFiSWQgPSB0YWIuX2lkO1xyXG4gICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgdGFiSWQgPSBwYXJlbnQuX2lkO1xyXG4gICAgfVxyXG4gICAgbGV0IHVzZXJGZWJUYWIgPSB0aGlzLnVzZXJQcmVmcmVuY2VTZXJ2aWNlLmdldFVzZXJQcmVmZXJlbmNlQnlGaWVsZE5hbWUoJ2Zhdm9yaXRlVGFicycpO1xyXG4gICAgaWYodXNlckZlYlRhYiAmJiB1c2VyRmViVGFiICE9IG51bGwgJiYgdXNlckZlYlRhYi5sZW5ndGggPiAwKXtcclxuICAgICAgbGV0IG1hdGNoID0gLTE7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB1c2VyRmViVGFiLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB1c2VyRmViVGFiW2luZGV4XTtcclxuICAgICAgICBpZihlbGVtZW50Ll9pZCA9PSB0YWJJZCApe1xyXG4gICAgICAgICAgbWF0Y2ggPSBpbmRleDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZihtYXRjaCA+IC0xKXtcclxuICAgICAgICBpZihwYXJlbnQgIT0gJycpe1xyXG4gICAgICAgICAgY29uc3Qgc3VibWVudSA9IHVzZXJGZWJUYWJbbWF0Y2hdWyd0YWInXTtcclxuICAgICAgICAgIGxldCBzdWJNYXRjaEluZGV4ID0gLTE7XHJcbiAgICAgICAgICBpZihzdWJtZW51ICYmIHN1Ym1lbnUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3VibWVudS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN1Yk1lbnUgPSBzdWJtZW51W2pdO1xyXG4gICAgICAgICAgICAgIGlmKHN1Yk1lbnUuX2lkID09IHRhYi5faWQpe1xyXG4gICAgICAgICAgICAgICAgc3ViTWF0Y2hJbmRleCA9IGo7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihzdWJNYXRjaEluZGV4ID4gLTEpe1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZm9yIEFwcFxyXG4gIGdldE1vZHVsZUJ5U2VsZWN0ZWRJbmRleCgpe1xyXG4gICAgY29uc3QgbW9kdWxlTGlzdCA9IHRoaXMuY29tbW9uQXBwRGF0YVNoYXJlU2VydmljZS5nZXRNb2R1bGVMaXN0KCk7XHJcbiAgICBjb25zdCBjbGlja2VkTW9kdWxlSW5kZXggPSB0aGlzLmNvbW1vbkFwcERhdGFTaGFyZVNlcnZpY2UuZ2V0TW9kdWxlSW5kZXgoKTtcclxuICAgIGxldCBtb2R1bGU6YW55ICA9IHt9O1xyXG4gICAgaWYoY2xpY2tlZE1vZHVsZUluZGV4ID49IDApe1xyXG4gICAgICBtb2R1bGUgPSBtb2R1bGVMaXN0W2NsaWNrZWRNb2R1bGVJbmRleF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG4gIH1cclxuICBnZXRDYXJkKGluZGV4OmFueSl7XHJcbiAgICBjb25zdCBtb2R1bGVMaXN0ID0gdGhpcy5jb21tb25BcHBEYXRhU2hhcmVTZXJ2aWNlLmdldE1vZHVsZUxpc3QoKTtcclxuICAgIGNvbnN0IGNsaWNrZWRNb2R1bGVJbmRleCA9IHRoaXMuY29tbW9uQXBwRGF0YVNoYXJlU2VydmljZS5nZXRNb2R1bGVJbmRleCgpO1xyXG4gICAgbGV0IGNhcmQ6YW55ICA9IHt9O1xyXG4gICAgbGV0IHRhYnM6YW55ID1bXTtcclxuICAgIGxldCBzZWxlY3RlZFRhYkluZGV4Om51bWJlciA9IC0xO1xyXG4gICAgbGV0IHBvcG92ZXJUYWJiaW5nID0gZmFsc2U7XHJcbiAgICBpZihjbGlja2VkTW9kdWxlSW5kZXggPj0gMCl7XHJcbiAgICAgIGNhcmQgPSBtb2R1bGVMaXN0W2NsaWNrZWRNb2R1bGVJbmRleF07XHJcbiAgICB9XHJcbiAgICBpZihjYXJkICYmIGNhcmQudGFiX21lbnUgJiYgY2FyZC50YWJfbWVudS5sZW5ndGggPiAwICYmIGNhcmQucG9wb3ZlclRhYmJpbmcpe1xyXG4gICAgICBwb3BvdmVyVGFiYmluZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZihjYXJkICYmIGNhcmQudGFiX21lbnUgJiYgY2FyZC50YWJfbWVudS5sZW5ndGggPiAwKXtcclxuICAgIGNvbnN0IGNsaWNrZWR0YWJJbmRleD0gdGhpcy5jb21tb25BcHBEYXRhU2hhcmVTZXJ2aWNlLmdldFNlbGVjdGRUYWJJbmRleCgpO1xyXG4gICAgICB0YWJzID0gY2FyZC50YWJfbWVudTtcclxuICAgICAgbGV0IHRhYjphbnkgPSB7fTtcclxuICAgICAgaWYoaW5kZXggPT0gLTEpe1xyXG4gICAgICAgIHRhYiA9IHRhYnNbMF07XHJcbiAgICAgICAgc2VsZWN0ZWRUYWJJbmRleCA9IDA7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRhYiA9IHRhYnNbY2xpY2tlZHRhYkluZGV4XTtcclxuICAgICAgICBzZWxlY3RlZFRhYkluZGV4ID0gY2xpY2tlZHRhYkluZGV4O1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0SW5kZXhJbkFycmF5QnlJZChtb2R1bGVMaXN0LHRhYi5faWQsXCJfaWRcIik7XHJcbiAgICAgIGNhcmQgPSBtb2R1bGVMaXN0W3RhYkluZGV4XTtcclxuICAgIH1cclxuICAgIGxldCBvYmplY3QgPSB7XHJcbiAgICAgICd0YWJzJyA6IHRhYnMsXHJcbiAgICAgIFwiY2FyZFwiIDogY2FyZCxcclxuICAgICAgXCJzZWxlY3RlZFRhYkluZGV4XCIgOiBzZWxlY3RlZFRhYkluZGV4LFxyXG4gICAgICBcInBvcG92ZXJUYWJiaW5nXCIgOiBwb3BvdmVyVGFiYmluZ1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iamVjdDtcclxuICB9XHJcbiAgZ2V0VXNlckF1dGhlcmlzZWRDYXJkcyhjYXJkTWFzdGVyTGlzdDphbnkpe1xyXG4gICAgY29uc3QgdXNlckF1dGhNb2R1bGVzOmFueSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0TW9kdWxlcygpO1xyXG4gICAgY29uc3QgY2FyZExpc3Q6YW55ID0gW107XHJcbiAgICBpZih1c2VyQXV0aE1vZHVsZXMgJiYgdXNlckF1dGhNb2R1bGVzICE9IG51bGwpe1xyXG4gICAgICB1c2VyQXV0aE1vZHVsZXMuZm9yRWFjaCgobW9kdWxlOmFueSwgaTpudW1iZXIpID0+IHtcclxuICAgICAgICBpZihtb2R1bGUgJiYgbW9kdWxlWydfaWQnXSl7XHJcbiAgICAgICAgICBjYXJkTWFzdGVyTGlzdC5mb3JFYWNoKChjYXJkOmFueSwgajpudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgaWYoY2FyZCAmJiBjYXJkLnVzZXJBdXRoZXJpc2VkTW9kdWxlICYmIGNhcmRbJ3VzZXJBdXRoZXJpc2VkTW9kdWxlJ11bJ19pZCddKXtcclxuICAgICAgICAgICAgICBpZihtb2R1bGVbJ19pZCddID09IGNhcmRbJ3VzZXJBdXRoZXJpc2VkTW9kdWxlJ11bJ19pZCddKXtcclxuICAgICAgICAgICAgICAgIGNhcmRMaXN0LnB1c2goY2FyZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBjYXJkTGlzdDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBnZXROZXN0ZWRDYXJkKGNhcmRHcmlkOmFueSwgY2FyZEdyaWROYW1lOmFueSkge1xyXG4gICAgaWYgKGNhcmRHcmlkW2NhcmRHcmlkTmFtZV0gJiYgY2FyZEdyaWRbY2FyZEdyaWROYW1lXSAhPSB1bmRlZmluZWQgJiYgY2FyZEdyaWRbY2FyZEdyaWROYW1lXSAhPSBudWxsICYmIGNhcmRHcmlkW2NhcmRHcmlkTmFtZV0gIT0gJycpIHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY2FyZEdyaWRbY2FyZEdyaWROYW1lXSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRNb2R1bGVzRnJvbU9iamVjdChvYmo6IGFueSkge1xyXG4gICAgbGV0IG1vZHVsZXM6IGFueVtdID0gW107XHJcblxyXG4gICAgY29uc3QgcHJvY2Vzc01vZHVsZSA9IChtb2R1bGVLZXk6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcclxuICAgICAgbGV0IG1vZHVsZU9iajogYW55ID0geyBrZXlOYW1lOiBtb2R1bGVLZXkgfTtcclxuICAgICAgaWYgKG1vZHVsZS5yZWZlcmVuY2UpIHtcclxuICAgICAgICBtb2R1bGVPYmogPSB7IC4uLm1vZHVsZU9iaiwgLi4ubW9kdWxlLnJlZmVyZW5jZSB9O1xyXG4gICAgICB9XHJcbiAgICAgIG1vZHVsZU9iai5ub3RpZmljYXRpb24gPSBtb2R1bGUubm90aWZpY2F0aW9uIHx8IGZhbHNlO1xyXG4gICAgICBtb2R1bGVPYmoubWVudV9saXN0ID0gdGhpcy5nZXRNZW51TGlzdChtb2R1bGUubWVudXMpO1xyXG4gICAgICBtb2R1bGVzLnB1c2gobW9kdWxlT2JqKTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKG9iai5ub3RpZmljYXRpb25zKSB7XHJcbiAgICAgIG9iaiA9IG9iai5ub3RpZmljYXRpb25zO1xyXG4gICAgICBpZiAob2JqICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzPGFueT4ob2JqKS5mb3JFYWNoKChbbW9kdWxlS2V5LCBtb2R1bGVdKSA9PiB7XHJcbiAgICAgICAgICBwcm9jZXNzTW9kdWxlKG1vZHVsZUtleSwgbW9kdWxlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWVudUxpc3QgPSAobWVudXM6IGFueSkgPT4ge1xyXG4gICAgbGV0IG1lbnVMaXN0OiBhbnlbXSA9IFtdO1xyXG4gICAgaWYgKG1lbnVzKSB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzPGFueT4obWVudXMpLmZvckVhY2goKFttZW51S2V5LCBtZW51XSkgPT4ge1xyXG4gICAgICAgIGxldCBtZW51T2JqOiBhbnkgPSB7IGtleU5hbWU6IG1lbnVLZXkgfTtcclxuICAgICAgICBpZiAobWVudS5yZWZlcmVuY2UpIHtcclxuICAgICAgICAgIG1lbnVPYmogPSB7IC4uLm1lbnVPYmosIC4uLm1lbnUucmVmZXJlbmNlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1lbnVPYmouc3VibWVudSA9IHRoaXMuZ2V0TWVudUxpc3QobWVudS5zdWJtZW51cyk7XHJcbiAgICAgICAgaWYoIW1lbnVPYmo/LnN1Ym1lbnUpe21lbnVPYmoudGVtcGxhdGVUYWJzID0gdGhpcy5nZXRUYWJMaXN0KG1lbnUudGVtcGxhdGVUYWJzKTt9XHJcbiAgICAgICAgbWVudUxpc3QucHVzaChtZW51T2JqKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVudUxpc3QubGVuZ3RoID4gMCA/IHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5zb3J0TWVudShtZW51TGlzdCkgOiBudWxsO1xyXG4gIH07XHJcblxyXG4gIGdldFRhYkxpc3QgPSAodGFiczogYW55KSA9PiB7XHJcbiAgICBsZXQgdGFiTGlzdDogYW55W10gPSBbXTtcclxuICAgIGlmICh0YWJzKSB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzPGFueT4odGFicykuZm9yRWFjaCgoW3RhYktleSwgdGFiXSkgPT4ge1xyXG4gICAgICAgIGxldCB0YWJPYmo6IGFueSA9IHsga2V5TmFtZTogdGFiS2V5IH07XHJcbiAgICAgICAgaWYgKHRhYi5yZWZlcmVuY2UpIHtcclxuICAgICAgICAgIHRhYk9iaiA9IHsgLi4udGFiT2JqLCAuLi50YWIucmVmZXJlbmNlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhYk9iai5lbWFpbCA9IHRhYi5hY3RpdmVBbGVydHM/LmluY2x1ZGVzKFwiRU1BSUxcIikgfHwgZmFsc2U7XHJcbiAgICAgICAgdGFiT2JqLndoYXRzYXBwID0gdGFiLmFjdGl2ZUFsZXJ0cz8uaW5jbHVkZXMoXCJXSEFUU0FQUFwiKSB8fCBmYWxzZTtcclxuICAgICAgICB0YWJPYmouc21zID0gdGFiLmFjdGl2ZUFsZXJ0cz8uaW5jbHVkZXMoXCJTTVNcIikgfHwgZmFsc2U7XHJcbiAgICAgICAgdGFiTGlzdC5wdXNoKHRhYk9iaik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhYkxpc3Q7XHJcbiAgfTtcclxuXHJcbiAgZ2V0TWVudURldGFpbHMobW9kdWxlOiBhbnkpIHtcclxuICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgaWYgKG1vZHVsZSkge1xyXG4gICAgICAgIG1vZHVsZS5mb3JFYWNoKChtZW51OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IG1lbnVOYW1lID0gbWVudT8ua2V5TmFtZTtcclxuICAgICAgICAgICAgbGV0IG1lbnVEZXRhaWxzOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZTogYW55ID0ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogbWVudT8ubmFtZSxcclxuICAgICAgICAgICAgICAgIF9pZDogbWVudT8uX2lkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1lbnUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZW51Py50ZW1wbGF0ZVRhYnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51RGV0YWlscyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVRhYnM6IHRoaXMuZ2V0VGVtcERldGFpbHMobWVudS50ZW1wbGF0ZVRhYnMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9ialttZW51TmFtZV0gPSBtZW51RGV0YWlscztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVudT8uc3VibWVudSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1lbnVzOiB0aGlzLmdldE1lbnVEZXRhaWxzKG1lbnUuc3VibWVudSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIG9ialttZW51TmFtZV0gPSBtZW51RGV0YWlscztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5nZXRUZW1wRGV0YWlscyh0YWJzOmFueSl7XHJcbiAgbGV0IG9iajphbnk9e307XHJcbiAgdGFicy5mb3JFYWNoKCh0YWI6YW55KT0+e1xyXG4gICAgaWYodGFiKXtcclxuICAgICAgbGV0IHRhYk5hbWU9dGFiPy5rZXlOYW1lO1xyXG4gICAgICBsZXQgdGFiRGV0YWlscz17XHJcbiAgICAgICAgcmVmZXJlbmNlOntcclxuICAgICAgICAgIG5hbWU6dGFiPy5uYW1lLFxyXG4gICAgICAgICAgX2lkOnRhYj8uX2lkXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhY3RpdmVBbGVydHM6dGhpcy5nZXRBY3RpdmVBbGVydHModGFiKVxyXG4gICAgICB9XHJcbiAgICAgIG9ialt0YWJOYW1lXT10YWJEZXRhaWxzO1xyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuZ2V0QWN0aXZlQWxlcnRzKHRhYjphbnkpe1xyXG4gIGxldCBhcnI9W107XHJcbiAgaWYodGFiPy5lbWFpbCl7XHJcbiAgICBhcnIucHVzaCgnRU1BSUwnKTtcclxuICB9XHJcbiAgaWYodGFiPy53aGF0c2FwcCl7XHJcbiAgICBhcnIucHVzaCgnV0hBVFNBUFAnKTtcclxuICB9XHJcbiAgaWYodGFiPy5zbXMpe1xyXG4gICAgYXJyLnB1c2goJ1NNUycpO1xyXG4gIH1cclxuICByZXR1cm4gYXJyO1xyXG59XHJcbiAgLy8gRW5kIEZvciBBUFBcclxuXHJcbn1cclxuIl19