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,766 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Common } from '../../../shared/enums/common.enum';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../common-utils/common-function.service";
5
+ import * as i2 from "../../storage/storage.service";
6
+ import * as i3 from "../../common-utils/core-function/core-function.service";
7
+ import * as i4 from "../../api/api.service";
8
+ import * as i5 from "./../../check-if/check-if.service";
9
+ import * as i6 from "../../model/model.service";
10
+ export class ApiCallService {
11
+ constructor(commonFunctionService, storageService, coreFunctionService, apiService, checkIfService, modalService) {
12
+ this.commonFunctionService = commonFunctionService;
13
+ this.storageService = storageService;
14
+ this.coreFunctionService = coreFunctionService;
15
+ this.apiService = apiService;
16
+ this.checkIfService = checkIfService;
17
+ this.modalService = modalService;
18
+ this.pageNumber = Common.PAGE_NO;
19
+ this.itemNumOfGrid = Common.ITEM_NUM_OF_GRID;
20
+ }
21
+ getOnchangePayload(tableFields, formValue, formValueWithCustomData) {
22
+ let staticModal = [];
23
+ if (tableFields && tableFields.length > 0) {
24
+ tableFields.forEach((element) => {
25
+ if (element.field_name && element.field_name != '') {
26
+ if (element.onchange_api_params && element.onchange_call_back_field && !element.do_not_auto_trigger_on_edit) {
27
+ const checkFormGroup = element.onchange_call_back_field.indexOf("FORM_GROUP");
28
+ const checkCLTFN = element.onchange_api_params.indexOf('CLTFN');
29
+ if (checkFormGroup == -1 && checkCLTFN == -1) {
30
+ const payload = this.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData);
31
+ if (element.onchange_api_params.indexOf('QTMP') >= 0) {
32
+ if (element && element.formValueAsObjectForQtmp) {
33
+ payload["data"] = formValue;
34
+ }
35
+ else {
36
+ payload["data"] = formValueWithCustomData;
37
+ }
38
+ }
39
+ staticModal.push(payload);
40
+ }
41
+ }
42
+ switch (element.type) {
43
+ case "stepper":
44
+ if (element.list_of_fields.length > 0) {
45
+ element.list_of_fields.forEach((step) => {
46
+ if (step.list_of_fields.length > 0) {
47
+ step.list_of_fields.forEach((data) => {
48
+ if (data.onchange_api_params && data.onchange_call_back_field && !data.do_not_auto_trigger_on_edit) {
49
+ const checkFormGroup = data.onchange_call_back_field.indexOf("FORM_GROUP");
50
+ if (checkFormGroup == -1) {
51
+ const payload = this.getPaylodWithCriteria(data.onchange_api_params, data.onchange_call_back_field, data.onchange_api_params_criteria, formValueWithCustomData);
52
+ if (data.onchange_api_params.indexOf('QTMP') >= 0) {
53
+ if (element && element.formValueAsObjectForQtmp) {
54
+ payload["data"] = formValue;
55
+ }
56
+ else {
57
+ payload["data"] = formValueWithCustomData;
58
+ }
59
+ }
60
+ staticModal.push(payload);
61
+ }
62
+ }
63
+ if (data.tree_view_object && data.tree_view_object.field_name != "") {
64
+ let editeTreeModifyData = JSON.parse(JSON.stringify(data.tree_view_object));
65
+ if (editeTreeModifyData.onchange_api_params && editeTreeModifyData.onchange_call_back_field) {
66
+ staticModal.push(this.getPaylodWithCriteria(editeTreeModifyData.onchange_api_params, editeTreeModifyData.onchange_call_back_field, editeTreeModifyData.onchange_api_params_criteria, formValueWithCustomData));
67
+ }
68
+ }
69
+ });
70
+ }
71
+ });
72
+ }
73
+ break;
74
+ }
75
+ if (element.tree_view_object && element.tree_view_object.field_name != "") {
76
+ let editeTreeModifyData = JSON.parse(JSON.stringify(element.tree_view_object));
77
+ if (editeTreeModifyData.onchange_api_params && editeTreeModifyData.onchange_call_back_field) {
78
+ staticModal.push(this.getPaylodWithCriteria(editeTreeModifyData.onchange_api_params, editeTreeModifyData.onchange_call_back_field, editeTreeModifyData.onchange_api_params_criteria, formValueWithCustomData));
79
+ }
80
+ }
81
+ }
82
+ if (element.type && element.type == 'pdf_view') {
83
+ staticModal.push(this.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData));
84
+ }
85
+ });
86
+ }
87
+ return staticModal;
88
+ }
89
+ getStaticDataPayload(staticModal, object, formDataObject, multipleFormCollection, tableFields, formFieldButtons, tab, form, saveResponceData, editedRowIndex) {
90
+ let formValue = object;
91
+ if (multipleFormCollection && multipleFormCollection.length > 0) {
92
+ let multiCollection = JSON.parse(JSON.stringify(multipleFormCollection));
93
+ formValue = this.commonFunctionService.getFormDataInMultiformCollection(multiCollection, object);
94
+ }
95
+ let staticModalG = this.commanApiPayload([], tableFields, formFieldButtons, formValue);
96
+ if (staticModalG && staticModalG.length > 0) {
97
+ staticModalG.forEach((element) => {
98
+ staticModal.push(element);
99
+ });
100
+ }
101
+ if (tab && tab.api_params && tab.api_params != null && tab.api_params != "" && tab.api_params != undefined) {
102
+ let criteria = [];
103
+ if (tab.api_params_criteria && tab.api_params_criteria != null) {
104
+ criteria = tab.api_params_criteria;
105
+ }
106
+ staticModal.push(this.getPaylodWithCriteria(tab.api_params, tab.call_back_field, criteria, {}));
107
+ }
108
+ if (form && form.api_params && form.api_params != null && form.api_params != "" && form.api_params != undefined) {
109
+ if (form.api_params == 'QTMP:EMAIL_WITH_TEMP:QUOTATION_LETTER') {
110
+ object = saveResponceData;
111
+ }
112
+ let criteria = [];
113
+ if (form.api_params_criteria && form.api_params_criteria != null) {
114
+ criteria = form.api_params_criteria;
115
+ }
116
+ if (editedRowIndex > -1) {
117
+ formDataObject = formValue;
118
+ }
119
+ staticModal.push(this.getPaylodWithCriteria(form.api_params, form.call_back_field, criteria, formDataObject));
120
+ }
121
+ return staticModal;
122
+ }
123
+ getOnClickLoadDataPayloads(field, multipleFormCollection, formValue, formValueWithCustomData) {
124
+ let api_params = field.onClickApiParams;
125
+ let callBackfield = field.onClickCallBackField;
126
+ let criteria = field.onClickApiParamsCriteria;
127
+ const payload = this.getPaylodWithCriteria(api_params, callBackfield, criteria, formValue);
128
+ let payloads = [];
129
+ payloads.push(this.checkQtmpApi(api_params, field, payload, multipleFormCollection, formValue, formValueWithCustomData));
130
+ return payloads;
131
+ }
132
+ getPaylodWithCriteria(params, callback, criteria, object, data_template) {
133
+ const tabName = this.storageService.GetActiveMenu();
134
+ let activeRole = this.storageService.getActiveRole();
135
+ let tab = '';
136
+ let roleName = "";
137
+ if (tabName && tabName.name && tabName.name != '') {
138
+ tab = tabName.name;
139
+ }
140
+ if (activeRole && activeRole.name != '') {
141
+ roleName = activeRole.name;
142
+ }
143
+ let staticModal = {
144
+ "key": this.commonFunctionService.getRefcode(),
145
+ "key2": this.storageService.getAppId(),
146
+ "value": params,
147
+ "log": this.storageService.getUserLog(),
148
+ "crList": [],
149
+ "module": this.storageService.getModule(),
150
+ "tab": tab
151
+ };
152
+ if (roleName != '') {
153
+ staticModal['role'] = roleName;
154
+ }
155
+ if (data_template) {
156
+ staticModal['data_template'] = data_template;
157
+ }
158
+ if (callback && callback != '') {
159
+ staticModal['key3'] = callback;
160
+ }
161
+ if (params.indexOf("FORM_GROUP") >= 0 || params.indexOf("QTMP") >= 0) {
162
+ staticModal["data"] = object;
163
+ }
164
+ if (criteria && criteria.length > 0) {
165
+ const crList = this.getCriteriaList(criteria, object);
166
+ if (crList && crList.length > 0) {
167
+ crList.forEach((element) => {
168
+ staticModal.crList.push(element);
169
+ });
170
+ }
171
+ }
172
+ return staticModal;
173
+ }
174
+ getCriteriaList(criteria, object) {
175
+ const crList = [];
176
+ criteria.forEach((element) => {
177
+ const criteria = element.split(";");
178
+ const fValue = criteria[2];
179
+ let fvalue = '';
180
+ if (criteria[3] && criteria[3] == 'STATIC') {
181
+ fvalue = fValue;
182
+ }
183
+ else {
184
+ fvalue = this.commonFunctionService.getObjectValue(fValue, object);
185
+ }
186
+ const list = {
187
+ "fName": criteria[0],
188
+ "fValue": fvalue,
189
+ "operator": criteria[1]
190
+ };
191
+ if (this.coreFunctionService.isNotBlank(fvalue)) {
192
+ crList.push(list);
193
+ }
194
+ });
195
+ return crList;
196
+ }
197
+ getTabsPayloadForCountList(tabs) {
198
+ let payloads = [];
199
+ if (tabs && tabs.length >= 1) {
200
+ tabs.forEach((tab) => {
201
+ if (tab.grid) {
202
+ let grid_api_params_criteria = [];
203
+ if (this.checkIfService.isGridFieldExist(tab, "api_params_criteria")) {
204
+ grid_api_params_criteria = tab.grid.api_params_criteria;
205
+ }
206
+ const payload = this.getPaylodWithCriteria(tab.tab_name, tab.tab_name + "_" + tab.name, grid_api_params_criteria, {});
207
+ payload['countOnly'] = true;
208
+ payloads.push(payload);
209
+ }
210
+ });
211
+ }
212
+ return payloads;
213
+ }
214
+ getTabsCountPyload(tabs) {
215
+ let payloads = this.getTabsPayloadForCountList(tabs);
216
+ if (payloads && payloads.length > 0) {
217
+ this.apiService.getGridCountData(payloads);
218
+ }
219
+ }
220
+ commanApiPayload(headElement, tableField, actionButton, object) {
221
+ const staticModalGroup = [];
222
+ let staticModal = {};
223
+ if (headElement.length > 0) {
224
+ headElement.forEach((element) => {
225
+ if (element.api_params && element.api_params != '') {
226
+ let call_back_field = '';
227
+ let criteria = [];
228
+ if (element.call_back_field && element.call_back_field != '') {
229
+ call_back_field = element.call_back_field;
230
+ }
231
+ if (element.api_params_criteria && element.api_params_criteria != '') {
232
+ criteria = element.api_params_criteria;
233
+ }
234
+ staticModal = this.getPaylodWithCriteria(element.api_params, call_back_field, criteria, object ? object : {});
235
+ if (element.adkey && element.adkey != '' && element.adkey != null) {
236
+ staticModal['adkeys'] = element.adkey;
237
+ staticModalGroup.push(staticModal);
238
+ }
239
+ else {
240
+ staticModalGroup.push(staticModal);
241
+ }
242
+ }
243
+ });
244
+ }
245
+ if (actionButton.length > 0) {
246
+ actionButton.forEach((element) => {
247
+ if (element.api_params && element.api_params != '') {
248
+ let call_back_field = '';
249
+ let criteria = [];
250
+ if (element.call_back_field && element.call_back_field != '') {
251
+ call_back_field = element.call_back_field;
252
+ }
253
+ if (element.api_params_criteria && element.api_params_criteria != '') {
254
+ criteria = element.api_params_criteria;
255
+ }
256
+ const staticModal = this.getPaylodWithCriteria(element.api_params, call_back_field, criteria, object ? object : {});
257
+ staticModalGroup.push(staticModal);
258
+ }
259
+ });
260
+ }
261
+ if (tableField.length > 0) {
262
+ tableField.forEach((element) => {
263
+ let call_back_field = '';
264
+ let criteria = [];
265
+ if (element.api_params && element.api_params != '' && element.type != "typeahead") {
266
+ if (element.call_back_field && element.call_back_field != '') {
267
+ call_back_field = element.call_back_field;
268
+ }
269
+ if (element.api_params_criteria && element.api_params_criteria != '') {
270
+ criteria = element.api_params_criteria;
271
+ }
272
+ const staticModal = this.getPaylodWithCriteria(element.api_params, call_back_field, criteria, object ? object : {}, element.data_template);
273
+ if (element.api_params.indexOf("html_view") >= 0) {
274
+ staticModal["data"] = object;
275
+ }
276
+ staticModalGroup.push(staticModal);
277
+ }
278
+ switch (element.type) {
279
+ case "list_of_fields":
280
+ case "group_of_fields":
281
+ if (element.list_of_fields && element.list_of_fields.length > 0) {
282
+ element.list_of_fields.forEach((data) => {
283
+ if (data && data != null) {
284
+ let call_back_field = '';
285
+ let criteria = [];
286
+ if (data.api_params && data.api_params != '' && data.type != "typeahead") {
287
+ if (data.call_back_field && data.call_back_field != '') {
288
+ call_back_field = data.call_back_field;
289
+ }
290
+ if (data.api_params_criteria && data.api_params_criteria != '') {
291
+ criteria = data.api_params_criteria;
292
+ }
293
+ const staticModalListOfFields = this.getPaylodWithCriteria(data.api_params, call_back_field, criteria, object ? object : {}, element.data_template);
294
+ if (data.api_params.indexOf("html_view") >= 0) {
295
+ staticModalListOfFields["data"] = object;
296
+ }
297
+ staticModalGroup.push(staticModalListOfFields);
298
+ }
299
+ }
300
+ });
301
+ }
302
+ break;
303
+ case "stepper":
304
+ if (element.list_of_fields && element.list_of_fields.length > 0) {
305
+ element.list_of_fields.forEach((step) => {
306
+ step.list_of_fields.forEach((data) => {
307
+ let call_back_field = '';
308
+ let criteria = [];
309
+ if (data.api_params && data.api_params != '' && data.type != "typeahead") {
310
+ if (data.call_back_field && data.call_back_field != '') {
311
+ call_back_field = data.call_back_field;
312
+ }
313
+ if (data.api_params_criteria && data.api_params_criteria != '') {
314
+ criteria = data.api_params_criteria;
315
+ }
316
+ const staticModalListOfFields = this.getPaylodWithCriteria(data.api_params, call_back_field, criteria, object ? object : {}, element.data_template);
317
+ if (data.api_params.indexOf("html_view") >= 0) {
318
+ staticModalListOfFields["data"] = object;
319
+ }
320
+ staticModalGroup.push(staticModalListOfFields);
321
+ }
322
+ });
323
+ });
324
+ }
325
+ break;
326
+ default:
327
+ break;
328
+ }
329
+ });
330
+ }
331
+ return staticModalGroup;
332
+ }
333
+ getfilterCrlist(headElements, formValue) {
334
+ const filterList = [];
335
+ if (formValue != undefined && headElements && headElements.length > 0) {
336
+ const criteria = [];
337
+ headElements.forEach((element) => {
338
+ if (element != null && element.type != null) {
339
+ let fieldName = element.field_name;
340
+ let value = formValue[element.field_name];
341
+ switch (element.type.toLowerCase()) {
342
+ case "button":
343
+ case "text":
344
+ case "tree_view_selection":
345
+ case "dropdown":
346
+ if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
347
+ if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0 && element.type != 'dropdown') {
348
+ element.api_params_criteria.forEach((cri) => {
349
+ criteria.push(cri);
350
+ });
351
+ }
352
+ else if (element.multi_select && element.datatype == "object") {
353
+ let fvalue = '';
354
+ if (value && value.length > 0) {
355
+ value.forEach((vl, i) => {
356
+ if ((value.length - 1) == i) {
357
+ fvalue = fvalue + vl;
358
+ }
359
+ else {
360
+ fvalue = fvalue + vl + ":";
361
+ }
362
+ });
363
+ }
364
+ filterList.push({
365
+ "fName": fieldName,
366
+ "fValue": fvalue,
367
+ "operator": "in"
368
+ });
369
+ }
370
+ else {
371
+ filterList.push({
372
+ "fName": fieldName,
373
+ "fValue": this.getValueForDotFieldName(value, fieldName),
374
+ "operator": this.storageService.getDefaultSearchOperator()
375
+ });
376
+ }
377
+ }
378
+ break;
379
+ case "number":
380
+ if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
381
+ if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
382
+ element.api_params_criteria.forEach((cri) => {
383
+ criteria.push(cri);
384
+ });
385
+ }
386
+ else {
387
+ filterList.push({
388
+ "fName": fieldName,
389
+ "fValue": this.commonFunctionService.getddnDisplayVal(value),
390
+ "operator": "eq"
391
+ });
392
+ }
393
+ }
394
+ break;
395
+ case "typeahead":
396
+ if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
397
+ if (this.commonFunctionService.isArray(element.dataFilterCriteria) && element.dataFilterCriteria.length > 0) {
398
+ element.dataFilterCriteria.forEach((cri) => {
399
+ criteria.push(cri);
400
+ });
401
+ }
402
+ else {
403
+ filterList.push({
404
+ "fName": fieldName,
405
+ "fValue": this.getValueForDotFieldName(value, fieldName),
406
+ "operator": this.storageService.getDefaultSearchOperator()
407
+ });
408
+ }
409
+ }
410
+ break;
411
+ case "info":
412
+ if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
413
+ if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
414
+ element.api_params_criteria.forEach((cri) => {
415
+ criteria.push(cri);
416
+ });
417
+ }
418
+ else {
419
+ filterList.push({
420
+ "fName": fieldName,
421
+ "fValue": this.commonFunctionService.getddnDisplayVal(value),
422
+ "operator": this.storageService.getDefaultSearchOperator()
423
+ });
424
+ }
425
+ }
426
+ break;
427
+ case "reference_names":
428
+ case "chips":
429
+ if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
430
+ if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
431
+ element.api_params_criteria.forEach((cri) => {
432
+ criteria.push(cri);
433
+ });
434
+ }
435
+ else {
436
+ filterList.push({
437
+ "fName": fieldName + ".name",
438
+ "fValue": this.commonFunctionService.getddnDisplayVal(value),
439
+ "operator": this.storageService.getDefaultSearchOperator()
440
+ });
441
+ }
442
+ }
443
+ break;
444
+ case "date":
445
+ case "datetime":
446
+ if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
447
+ if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
448
+ element.api_params_criteria.forEach((cri) => {
449
+ criteria.push(cri);
450
+ });
451
+ }
452
+ else {
453
+ filterList.push({
454
+ "fName": fieldName,
455
+ "fValue": this.commonFunctionService.dateFormat(value),
456
+ "operator": "eq"
457
+ });
458
+ }
459
+ }
460
+ break;
461
+ case "daterange":
462
+ if (formValue && formValue[fieldName] && formValue[fieldName].start != '' && formValue[fieldName].end != null) {
463
+ if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
464
+ element.api_params_criteria.forEach((cri) => {
465
+ criteria.push(cri);
466
+ });
467
+ }
468
+ else {
469
+ filterList.push({
470
+ "fName": fieldName,
471
+ "fValue": this.commonFunctionService.dateFormat(value.start),
472
+ "operator": "gte"
473
+ });
474
+ }
475
+ }
476
+ if (formValue && formValue[fieldName] && formValue[fieldName].end != '' && formValue[fieldName].end != null) {
477
+ if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
478
+ element.api_params_criteria.forEach((cri) => {
479
+ criteria.push(cri);
480
+ });
481
+ }
482
+ else {
483
+ filterList.push({
484
+ "fName": fieldName,
485
+ "fValue": this.commonFunctionService.dateFormat(value.end),
486
+ "operator": "lte"
487
+ });
488
+ }
489
+ }
490
+ break;
491
+ default:
492
+ break;
493
+ }
494
+ }
495
+ });
496
+ if (criteria && criteria.length > 0) {
497
+ const crList = this.getCriteriaList(criteria, formValue);
498
+ if (crList && crList.length > 0) {
499
+ crList.forEach((element) => {
500
+ filterList.push(element);
501
+ });
502
+ }
503
+ }
504
+ }
505
+ return filterList;
506
+ }
507
+ getValueForDotFieldName(value, fieldName) {
508
+ let crValue = "";
509
+ if (typeof value == "string") {
510
+ crValue = value;
511
+ }
512
+ else if (typeof value == "object") {
513
+ let fName = fieldName.indexOf('.') != -1 ? (fieldName).split('.')[0] : fieldName;
514
+ let objectValue = {};
515
+ objectValue[fName] = value;
516
+ crValue = fieldName.indexOf('.') != -1 ? this.commonFunctionService.getObjectValue(fieldName, objectValue) : this.commonFunctionService.getddnDisplayVal(value);
517
+ }
518
+ return crValue;
519
+ }
520
+ getUserPrefrerence(user) {
521
+ let criteria = "userId._id;eq;" + user._id + ";STATIC";
522
+ let myData = this.setPageNoAndSize(this.getPaylodWithCriteria("user_preference", "", [criteria], {}), 1);
523
+ const payloadData = {
524
+ path: null,
525
+ data: myData
526
+ };
527
+ this.apiService.getFavouriteData(payloadData);
528
+ }
529
+ getUserNotification(pageNo) {
530
+ let user = this.storageService.GetUserInfo();
531
+ const userId = user._id;
532
+ if (userId && userId != null && userId != '') {
533
+ let criteraiList = [];
534
+ criteraiList.push("userId._id;eq;" + userId + ";STATIC");
535
+ criteraiList.push("notificationStatus;eq;UNREAD;STATIC");
536
+ const payload = this.setPageNoAndSize(this.getPaylodWithCriteria('user_notification_master', '', criteraiList, {}), pageNo);
537
+ const callPayload = {
538
+ "path": null,
539
+ "data": payload
540
+ };
541
+ this.apiService.getUserNotification(callPayload);
542
+ }
543
+ }
544
+ getUserNotificationSetting() {
545
+ this.apiService.getUserNotificationSetting();
546
+ }
547
+ getApplicationAllSettings() {
548
+ const payload1 = this.setPageNoAndSize(this.getPaylodWithCriteria("application_setting", "", [], {}), 1);
549
+ this.apiService.getAplicationsSetting(payload1);
550
+ const payload = this.setPageNoAndSize(this.getPaylodWithCriteria("application_theme_setting", "", [], {}), 1);
551
+ this.apiService.getAplicationsThemeSetting(payload);
552
+ }
553
+ getDataForGrid(page, tab, currentMenu, headElements, filterForm, selectContact) {
554
+ // let grid_api_params_criteria = [];
555
+ // if(tab.grid && tab.grid.grid_page_size && tab.grid.grid_page_size != null && tab.grid.grid_page_size != ''){
556
+ // this.itemNumOfGrid = tab.grid.grid_page_size;
557
+ // }
558
+ // if(this.checkIfService.isGridFieldExist(tab,"api_params_criteria")){
559
+ // grid_api_params_criteria = tab.grid.api_params_criteria;
560
+ // }
561
+ //const data = this.setPageNoAndSize(this.getPaylodWithCriteria(currentMenu.name,'',grid_api_params_criteria,''),page);
562
+ //let crList=[];
563
+ // this.getfilterCrlist(headElements,filterForm).forEach((element: any) => {
564
+ // crList.push(element);
565
+ // });
566
+ let payload = this.getDataForGridFilter(page, tab, currentMenu, headElements, filterForm);
567
+ if (selectContact != '') {
568
+ const tabFilterCrlist = {
569
+ "fName": 'account._id',
570
+ "fValue": selectContact,
571
+ "operator": 'eq'
572
+ };
573
+ if (payload?.data?.crList.length > 0)
574
+ payload.data.crList.push(tabFilterCrlist);
575
+ }
576
+ return payload;
577
+ // const getFilterData = {
578
+ // data: data,
579
+ // path: null
580
+ // }
581
+ // return getFilterData;
582
+ }
583
+ preparePayloadWithCrlist(tab, currentMenu, headElements, filterForm) {
584
+ let grid_api_params_criteria = [];
585
+ if (this.checkIfService.isGridFieldExist(tab, "api_params_criteria")) {
586
+ grid_api_params_criteria = tab.grid.api_params_criteria;
587
+ }
588
+ const payload = this.getPaylodWithCriteria(currentMenu.name, '', grid_api_params_criteria, '');
589
+ let crList = [];
590
+ this.getfilterCrlist(headElements, filterForm).forEach((element) => {
591
+ crList.push(element);
592
+ });
593
+ //advanced filter crlist get or add in crlist
594
+ let advancedCrlist = JSON.parse(sessionStorage.getItem("ADVANCE_CRITERIA_LIST"));
595
+ if (advancedCrlist) {
596
+ if (advancedCrlist[currentMenu.name]) {
597
+ let list = advancedCrlist[currentMenu.name];
598
+ if (list && list.length > 0) {
599
+ list.forEach((adCriteria) => {
600
+ crList.push(adCriteria);
601
+ });
602
+ }
603
+ }
604
+ }
605
+ if (crList && crList.length > 0) {
606
+ if (payload && payload?.crList && payload.crList.length > 0) {
607
+ crList.forEach((cr) => {
608
+ payload.crList.push(cr);
609
+ });
610
+ }
611
+ else {
612
+ payload.crList = crList;
613
+ }
614
+ }
615
+ return payload;
616
+ }
617
+ getDataForGridFilter(page, tab, currentMenu, headElements, filterForm) {
618
+ const data = this.preparePayloadWithCrlist(tab, currentMenu, headElements, filterForm);
619
+ if (tab && tab?.grid && tab?.grid?.grid_page_size) {
620
+ this.itemNumOfGrid = tab.grid.grid_page_size;
621
+ }
622
+ this.setPageNoAndSize(data, page);
623
+ const getFilterData = {
624
+ data: data,
625
+ path: null
626
+ };
627
+ return getFilterData;
628
+ }
629
+ getPage(page, tab, currentMenu, headElements, filterForm, selectContact) {
630
+ return this.getDataForGrid(page, tab, currentMenu, headElements, filterForm, selectContact);
631
+ }
632
+ getRealTimeGridData(currentMenu, object) {
633
+ let grid_api_params_criteria = [];
634
+ let page = 1;
635
+ let criteria = "_id;eq;" + object._id + ";STATIC";
636
+ grid_api_params_criteria.push(criteria);
637
+ const data = this.setPageNoAndSize(this.getPaylodWithCriteria(currentMenu.name, '', grid_api_params_criteria, ''), page);
638
+ const getFilterData = {
639
+ data: data,
640
+ path: null
641
+ };
642
+ this.apiService.getGridRunningData(getFilterData);
643
+ }
644
+ getFormForTds(data, currentMenu, object) {
645
+ let payloadData = {};
646
+ if (currentMenu != '') {
647
+ payloadData = this.getPaylodWithCriteria(currentMenu, '', [], '');
648
+ payloadData['data'] = object;
649
+ }
650
+ const getFormData = {
651
+ _id: data._id,
652
+ data: payloadData
653
+ };
654
+ return getFormData;
655
+ }
656
+ getPdf(data, currentMenu) {
657
+ let payloadData = {};
658
+ if (currentMenu != '') {
659
+ payloadData = this.getPaylodWithCriteria(currentMenu, '', [], '');
660
+ }
661
+ const getFileData = {
662
+ _id: data._id,
663
+ data: payloadData,
664
+ responce: { responseType: "arraybuffer" }
665
+ };
666
+ let fileName = currentMenu;
667
+ fileName = fileName.charAt(0).toUpperCase() + fileName.slice(1);
668
+ const downloadPdfCheck = fileName + '-' + new Date().toLocaleDateString();
669
+ if (getFileData._id && getFileData._id != undefined && getFileData._id != null && getFileData._id != '') {
670
+ getFileData.data['data'] = data;
671
+ this.apiService.GetFileData(getFileData);
672
+ }
673
+ return downloadPdfCheck;
674
+ }
675
+ downloadPdf(data, currentMenu) {
676
+ let payloadData = {};
677
+ if (currentMenu != '') {
678
+ payloadData = this.getPaylodWithCriteria(currentMenu, '', [], '');
679
+ }
680
+ const getPdfData = {
681
+ _id: data._id,
682
+ data: payloadData,
683
+ responce: { responseType: "arraybuffer" }
684
+ };
685
+ let fileName = currentMenu;
686
+ fileName = fileName.charAt(0).toUpperCase() + fileName.slice(1);
687
+ const downloadPdfCheck = fileName + '-' + new Date().toLocaleDateString();
688
+ if (getPdfData._id && getPdfData._id != undefined && getPdfData._id != null && getPdfData._id != '') {
689
+ getPdfData.data['data'] = data;
690
+ this.apiService.GetPdfData(getPdfData);
691
+ }
692
+ return downloadPdfCheck;
693
+ }
694
+ getTemData(tempName) {
695
+ //const params = "form_template";
696
+ //const criteria = ["name;eq;"+tempName+";STATIC"];
697
+ //const payload = this.getPaylodWithCriteria(params,'',criteria,{});
698
+ // const getTemplates = {
699
+ // crList: [{
700
+ // "fName": "name",
701
+ // "fValue": tempName,
702
+ // "operator": "eq"
703
+ // }],
704
+ // key2: this.storageService.getAppId(),
705
+ // refCode: this.getRefcode(),
706
+ // log: this.storageService.getUserLog(),
707
+ // value: "form_template"
708
+ // }
709
+ const payload = this.getTempPayload(tempName, 'eq');
710
+ return payload;
711
+ }
712
+ getTempPayload(value, operator) {
713
+ const params = "form_template";
714
+ const criteria = ["name;" + operator + ";" + value + ";STATIC"];
715
+ const payload = this.getPaylodWithCriteria(params, '', criteria, {});
716
+ return payload;
717
+ }
718
+ setPageNoAndSize(payload, page) {
719
+ payload['pageNo'] = page - 1;
720
+ payload['pageSize'] = this.itemNumOfGrid;
721
+ return payload;
722
+ }
723
+ checkQtmpApi(params, field, payload, multipleFormCollection, object, objectWithCustom) {
724
+ if (params.indexOf("FORM_GROUP") >= 0 || params.indexOf("QTMP") >= 0) {
725
+ let multiCollection = JSON.parse(JSON.stringify(multipleFormCollection));
726
+ if (field && field.formValueAsObjectForQtmp) {
727
+ let formValue = this.commonFunctionService.getFormDataInMultiformCollection(multiCollection, object);
728
+ payload["data"] = formValue;
729
+ }
730
+ else {
731
+ let formValue = this.commonFunctionService.getFormDataInMultiformCollection(multiCollection, objectWithCustom);
732
+ payload["data"] = formValue;
733
+ }
734
+ }
735
+ return payload;
736
+ }
737
+ previewModal(gridData, currentMenu, modalId) {
738
+ const getpreviewHtml = {
739
+ _id: gridData._id,
740
+ data: this.getPaylodWithCriteria(currentMenu.name, '', [], '')
741
+ };
742
+ this.apiService.GetPreviewHtml(getpreviewHtml);
743
+ const alertData = {
744
+ gridData: gridData,
745
+ currentPage: currentMenu.name
746
+ };
747
+ this.modalService.open(modalId, alertData);
748
+ }
749
+ preview(gridData, currentMenu, modalId) {
750
+ const getpreviewHtml = {
751
+ _id: gridData._id,
752
+ data: this.getPaylodWithCriteria(currentMenu.name, '', [], '')
753
+ };
754
+ getpreviewHtml.data['data'] = gridData;
755
+ this.apiService.GetPreviewHtml(getpreviewHtml);
756
+ }
757
+ }
758
+ ApiCallService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiCallService, deps: [{ token: i1.CommonFunctionService }, { token: i2.StorageService }, { token: i3.CoreFunctionService }, { token: i4.ApiService }, { token: i5.CheckIfService }, { token: i6.ModelService }], target: i0.ɵɵFactoryTarget.Injectable });
759
+ ApiCallService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiCallService, providedIn: 'root' });
760
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiCallService, decorators: [{
761
+ type: Injectable,
762
+ args: [{
763
+ providedIn: 'root'
764
+ }]
765
+ }], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.StorageService }, { type: i3.CoreFunctionService }, { type: i4.ApiService }, { type: i5.CheckIfService }, { type: i6.ModelService }]; } });
766
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNhbGwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvYXBpL2FwaS1jYWxsL2FwaS1jYWxsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUszQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0FBTTNELE1BQU0sT0FBTyxjQUFjO0lBSXpCLFlBQ1UscUJBQTJDLEVBQzNDLGNBQTZCLEVBQzdCLG1CQUF1QyxFQUN2QyxVQUFxQixFQUNyQixjQUE2QixFQUM3QixZQUEwQjtRQUwxQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXNCO1FBQzNDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFDdkMsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVRwQyxlQUFVLEdBQVcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxrQkFBYSxHQUFRLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztJQVN6QyxDQUFDO0lBRUwsa0JBQWtCLENBQUMsV0FBZSxFQUFDLFNBQWEsRUFBQyx1QkFBMkI7UUFDMUUsSUFBSSxXQUFXLEdBQU8sRUFBRSxDQUFBO1FBQ3hCLElBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ3ZDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtnQkFDbEMsSUFBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFDO29CQUNoRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsSUFB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QUFjLEdBQUc7WUFDckIsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUMvRCxDQUFBO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxJQUFJO1NBQzlCLENBQUE7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxRQUFZLEVBQUUsV0FBZSxFQUFFLE9BQVc7UUFDaEQsTUFBTSxjQUFjLEdBQUc7WUFDckIsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUMvRCxDQUFBO1FBQ0QsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakQsQ0FBQzs7NEdBN3ZCVSxjQUFjO2dIQUFkLGNBQWMsY0FGYixNQUFNOzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hlY2tJZlNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL2NoZWNrLWlmL2NoZWNrLWlmLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbkZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi11dGlscy9jb21tb24tZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JlRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uLXV0aWxzL2NvcmUtZnVuY3Rpb24vY29yZS1mdW5jdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbW1vbiB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9lbnVtcy9jb21tb24uZW51bSc7XHJcbmltcG9ydCB7IE1vZGVsU2VydmljZSB9IGZyb20gJy4uLy4uL21vZGVsL21vZGVsLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBpQ2FsbFNlcnZpY2Uge1xyXG4gIHBhZ2VOdW1iZXI6IG51bWJlciA9IENvbW1vbi5QQUdFX05PO1xyXG4gIGl0ZW1OdW1PZkdyaWQ6IGFueSA9IENvbW1vbi5JVEVNX05VTV9PRl9HUklEO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOkNvbW1vbkZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6U3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6Q29yZUZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTpBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGVja0lmU2VydmljZTpDaGVja0lmU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RlbFNlcnZpY2UsXHJcbiAgKSB7IH1cclxuXHJcbiAgZ2V0T25jaGFuZ2VQYXlsb2FkKHRhYmxlRmllbGRzOmFueSxmb3JtVmFsdWU6YW55LGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhOmFueSl7XHJcbiAgICBsZXQgc3RhdGljTW9kYWw6YW55ID0gW11cclxuICAgIGlmKHRhYmxlRmllbGRzICYmIHRhYmxlRmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICB0YWJsZUZpZWxkcy5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcyAmJiBlbGVtZW50Lm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCAmJiAhZWxlbWVudC5kb19ub3RfYXV0b190cmlnZ2VyX29uX2VkaXQpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tGb3JtR3JvdXAgPSBlbGVtZW50Lm9uY2hhbmdlX2NhbGxfYmFja19maWVsZC5pbmRleE9mKFwiRk9STV9HUk9VUFwiKTtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tDTFRGTiA9IGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKCdDTFRGTicpXHJcbiAgICAgICAgICAgIGlmKGNoZWNrRm9ybUdyb3VwID09IC0xICYmIGNoZWNrQ0xURk4gPT0gLTEpe1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLCBlbGVtZW50Lm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCwgZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSlcclxuICAgICAgICAgICAgICBpZihlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMuaW5kZXhPZignUVRNUCcpID49IDApe1xyXG4gICAgICAgICAgICAgICAgaWYoZWxlbWVudCAmJiBlbGVtZW50LmZvcm1WYWx1ZUFzT2JqZWN0Rm9yUXRtcCl7XHJcbiAgICAgICAgICAgICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkW1wiZGF0YVwiXT1mb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgc3RhdGljTW9kYWwucHVzaChwYXlsb2FkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInN0ZXBwZXJcIjpcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKHN0ZXA6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zICYmIGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkICYmICFkYXRhLmRvX25vdF9hdXRvX3RyaWdnZXJfb25fZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0Zvcm1Hcm91cCA9IGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLmluZGV4T2YoXCJGT1JNX0dST1VQXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjaGVja0Zvcm1Hcm91cCA9PSAtMSl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMsIGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLCBkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXNfY3JpdGVyaWEsIGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKCdRVE1QJykgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuZm9ybVZhbHVlQXNPYmplY3RGb3JRdG1wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNNb2RhbC5wdXNoKHBheWxvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnRyZWVfdmlld19vYmplY3QgJiYgZGF0YS50cmVlX3ZpZXdfb2JqZWN0LmZpZWxkX25hbWUgIT0gXCJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZGl0ZVRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRlVHJlZU1vZGlmeURhdGEub25jaGFuZ2VfYXBpX3BhcmFtcyAmJiBlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2godGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWRpdGVUcmVlTW9kaWZ5RGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zLCBlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCwgZWRpdGVUcmVlTW9kaWZ5RGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQudHJlZV92aWV3X29iamVjdCAmJiBlbGVtZW50LnRyZWVfdmlld19vYmplY3QuZmllbGRfbmFtZSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgbGV0IGVkaXRlVHJlZU1vZGlmeURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVsZW1lbnQudHJlZV92aWV3X29iamVjdCkpO1xyXG4gICAgICAgICAgICBpZiAoZWRpdGVUcmVlTW9kaWZ5RGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zICYmIGVkaXRlVHJlZU1vZGlmeURhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgc3RhdGljTW9kYWwucHVzaCh0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMsIGVkaXRlVHJlZU1vZGlmeURhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLCBlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXNfY3JpdGVyaWEsIGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZSA9PSAncGRmX3ZpZXcnKXtcclxuICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2godGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLGVsZW1lbnQub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSxmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSkpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0aWNNb2RhbDtcclxuICB9XHJcbiAgZ2V0U3RhdGljRGF0YVBheWxvYWQoc3RhdGljTW9kYWw6YW55LG9iamVjdDphbnksZm9ybURhdGFPYmplY3Q6YW55LG11bHRpcGxlRm9ybUNvbGxlY3Rpb246YW55LHRhYmxlRmllbGRzOmFueSxmb3JtRmllbGRCdXR0b25zOmFueSx0YWI6YW55LGZvcm06YW55LHNhdmVSZXNwb25jZURhdGE6YW55LGVkaXRlZFJvd0luZGV4OmFueSl7XHJcbiAgICBsZXQgZm9ybVZhbHVlID0gb2JqZWN0O1xyXG4gICAgaWYobXVsdGlwbGVGb3JtQ29sbGVjdGlvbiAmJiBtdWx0aXBsZUZvcm1Db2xsZWN0aW9uLmxlbmd0aCA+IDApe1xyXG4gICAgICBsZXQgbXVsdGlDb2xsZWN0aW9uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtdWx0aXBsZUZvcm1Db2xsZWN0aW9uKSk7XHJcbiAgICAgIGZvcm1WYWx1ZSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEZvcm1EYXRhSW5NdWx0aWZvcm1Db2xsZWN0aW9uKG11bHRpQ29sbGVjdGlvbixvYmplY3QpO1xyXG4gICAgfVxyXG4gICAgbGV0IHN0YXRpY01vZGFsRyA9IHRoaXMuY29tbWFuQXBpUGF5bG9hZChbXSx0YWJsZUZpZWxkcyxmb3JtRmllbGRCdXR0b25zLGZvcm1WYWx1ZSk7XHJcbiAgICBpZihzdGF0aWNNb2RhbEcgJiYgc3RhdGljTW9kYWxHLmxlbmd0aCA+IDApe1xyXG4gICAgICBzdGF0aWNNb2RhbEcuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBzdGF0aWNNb2RhbC5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmKHRhYiAmJiB0YWIuYXBpX3BhcmFtcyAmJiB0YWIuYXBpX3BhcmFtcyAhPSBudWxsICYmIHRhYi5hcGlfcGFyYW1zICE9IFwiXCIgJiYgdGFiLmFwaV9wYXJhbXMgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgbGV0IGNyaXRlcmlhID0gW107XHJcbiAgICAgIGlmKHRhYi5hcGlfcGFyYW1zX2NyaXRlcmlhICYmIHRhYi5hcGlfcGFyYW1zX2NyaXRlcmlhICE9IG51bGwpe1xyXG4gICAgICAgIGNyaXRlcmlhPXRhYi5hcGlfcGFyYW1zX2NyaXRlcmlhXHJcbiAgICAgIH1cclxuICAgICAgc3RhdGljTW9kYWwucHVzaCh0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYSh0YWIuYXBpX3BhcmFtcyx0YWIuY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLHt9KSlcclxuXHJcbiAgICB9XHJcbiAgICBpZihmb3JtICYmIGZvcm0uYXBpX3BhcmFtcyAmJiBmb3JtLmFwaV9wYXJhbXMgIT0gbnVsbCAmJiBmb3JtLmFwaV9wYXJhbXMgIT0gXCJcIiAmJiBmb3JtLmFwaV9wYXJhbXMgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgaWYoZm9ybS5hcGlfcGFyYW1zID09ICdRVE1QOkVNQUlMX1dJVEhfVEVNUDpRVU9UQVRJT05fTEVUVEVSJyl7XHJcbiAgICAgICAgb2JqZWN0ID0gc2F2ZVJlc3BvbmNlRGF0YTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY3JpdGVyaWEgPSBbXTtcclxuICAgICAgaWYoZm9ybS5hcGlfcGFyYW1zX2NyaXRlcmlhICYmIGZvcm0uYXBpX3BhcmFtc19jcml0ZXJpYSAhPSBudWxsKXtcclxuICAgICAgICBjcml0ZXJpYT1mb3JtLmFwaV9wYXJhbXNfY3JpdGVyaWFcclxuICAgICAgfVxyXG4gICAgICBpZihlZGl0ZWRSb3dJbmRleCA+IC0xKXtcclxuICAgICAgICBmb3JtRGF0YU9iamVjdCA9IGZvcm1WYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBzdGF0aWNNb2RhbC5wdXNoKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGZvcm0uYXBpX3BhcmFtcyxmb3JtLmNhbGxfYmFja19maWVsZCxjcml0ZXJpYSxmb3JtRGF0YU9iamVjdCkpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RhdGljTW9kYWw7XHJcbiAgfVxyXG4gIGdldE9uQ2xpY2tMb2FkRGF0YVBheWxvYWRzKGZpZWxkOmFueSxtdWx0aXBsZUZvcm1Db2xsZWN0aW9uOmFueSxmb3JtVmFsdWU6YW55LGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhOmFueSl7XHJcbiAgICBsZXQgYXBpX3BhcmFtcyA9IGZpZWxkLm9uQ2xpY2tBcGlQYXJhbXM7XHJcbiAgICBsZXQgY2FsbEJhY2tmaWVsZCA9IGZpZWxkLm9uQ2xpY2tDYWxsQmFja0ZpZWxkO1xyXG4gICAgbGV0IGNyaXRlcmlhID0gZmllbGQub25DbGlja0FwaVBhcmFtc0NyaXRlcmlhXHJcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoYXBpX3BhcmFtcyxjYWxsQmFja2ZpZWxkLGNyaXRlcmlhLGZvcm1WYWx1ZSk7XHJcbiAgICBsZXQgcGF5bG9hZHMgPSBbXTtcclxuICAgIHBheWxvYWRzLnB1c2godGhpcy5jaGVja1F0bXBBcGkoYXBpX3BhcmFtcyxmaWVsZCxwYXlsb2FkLG11bHRpcGxlRm9ybUNvbGxlY3Rpb24sZm9ybVZhbHVlLGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhKSk7XHJcbiAgICByZXR1cm4gcGF5bG9hZHM7XHJcbiAgfVxyXG4gIGdldFBheWxvZFdpdGhDcml0ZXJpYShwYXJhbXM6YW55LCBjYWxsYmFjazphbnksIGNyaXRlcmlhOmFueSwgb2JqZWN0OmFueSxkYXRhX3RlbXBsYXRlPzphbnkpIHtcclxuICAgIGNvbnN0IHRhYk5hbWUgPSAgdGhpcy5zdG9yYWdlU2VydmljZS5HZXRBY3RpdmVNZW51KCk7XHJcbiAgICBsZXQgYWN0aXZlUm9sZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0QWN0aXZlUm9sZSgpO1xyXG4gICAgbGV0IHRhYiA9ICcnO1xyXG4gICAgbGV0IHJvbGVOYW1lID0gXCJcIjtcclxuICAgIGlmKHRhYk5hbWUgJiYgdGFiTmFtZS5uYW1lICYmIHRhYk5hbWUubmFtZSAhPSAnJyl7XHJcbiAgICAgIHRhYiA9IHRhYk5hbWUubmFtZTtcclxuICAgIH1cclxuICAgIGlmKGFjdGl2ZVJvbGUgJiYgYWN0aXZlUm9sZS5uYW1lICE9ICcnKXtcclxuICAgICAgcm9sZU5hbWUgPSBhY3RpdmVSb2xlLm5hbWU7XHJcbiAgICB9XHJcbiAgICBsZXQgc3RhdGljTW9kYWw6YW55ID0ge1xyXG4gICAgICBcImtleVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZjb2RlKCksXHJcbiAgICAgIFwia2V5MlwiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFwcElkKCksXHJcbiAgICAgIFwidmFsdWVcIjogcGFyYW1zLFxyXG4gICAgICBcImxvZ1wiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJMb2coKSxcclxuICAgICAgXCJjckxpc3RcIjogW10sXHJcbiAgICAgIFwibW9kdWxlXCI6IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0TW9kdWxlKCksXHJcbiAgICAgIFwidGFiXCI6IHRhYlxyXG4gICAgfVxyXG4gICAgaWYocm9sZU5hbWUgIT0gJycpe1xyXG4gICAgICBzdGF0aWNNb2RhbFsncm9sZSddID0gcm9sZU5hbWU7XHJcbiAgICB9XHJcbiAgICBpZihkYXRhX3RlbXBsYXRlKXtcclxuICAgICAgc3RhdGljTW9kYWxbJ2RhdGFfdGVtcGxhdGUnXSA9IGRhdGFfdGVtcGxhdGU7XHJcbiAgICB9XHJcbiAgICBpZihjYWxsYmFjayAmJiBjYWxsYmFjayAhPSAnJyl7XHJcbiAgICAgIHN0YXRpY01vZGFsWydrZXkzJ10gPSBjYWxsYmFjaztcclxuICAgIH1cclxuICAgIGlmKHBhcmFtcy5pbmRleE9mKFwiRk9STV9HUk9VUFwiKSA+PSAwIHx8IHBhcmFtcy5pbmRleE9mKFwiUVRNUFwiKSA+PSAwKXtcclxuICAgICAgc3RhdGljTW9kYWxbXCJkYXRhXCJdPW9iamVjdDtcclxuICAgIH1cclxuICAgIGlmIChjcml0ZXJpYSAmJiBjcml0ZXJpYS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGNyTGlzdCA9IHRoaXMuZ2V0Q3JpdGVyaWFMaXN0KGNyaXRlcmlhLG9iamVjdCk7XHJcbiAgICAgIGlmKGNyTGlzdCAmJiBjckxpc3QubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgY3JMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgc3RhdGljTW9kYWwuY3JMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0aWNNb2RhbDtcclxuICB9XHJcbiAgZ2V0Q3JpdGVyaWFMaXN0KGNyaXRlcmlhOmFueSxvYmplY3Q6YW55KXtcclxuICAgIGNvbnN0IGNyTGlzdDphbnkgPSBbXTtcclxuICAgIGNyaXRlcmlhLmZvckVhY2goKGVsZW1lbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCBjcml0ZXJpYSA9IGVsZW1lbnQuc3BsaXQoXCI7XCIpO1xyXG4gICAgICBjb25zdCBmVmFsdWUgPSBjcml0ZXJpYVsyXVxyXG4gICAgICBsZXQgZnZhbHVlID0nJztcclxuICAgICAgaWYoY3JpdGVyaWFbM10gJiYgY3JpdGVyaWFbM10gPT0gJ1NUQVRJQycpe1xyXG4gICAgICAgIGZ2YWx1ZSA9IGZWYWx1ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgZnZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0T2JqZWN0VmFsdWUoZlZhbHVlLCBvYmplY3QpXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbGlzdCA9IHtcclxuICAgICAgICBcImZOYW1lXCI6IGNyaXRlcmlhWzBdLFxyXG4gICAgICAgIFwiZlZhbHVlXCI6IGZ2YWx1ZSxcclxuICAgICAgICBcIm9wZXJhdG9yXCI6IGNyaXRlcmlhWzFdXHJcbiAgICAgIH1cclxuICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZnZhbHVlKSl7XHJcbiAgICAgICAgY3JMaXN0LnB1c2gobGlzdCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNyTGlzdDtcclxuICB9XHJcbiAgZ2V0VGFic1BheWxvYWRGb3JDb3VudExpc3QodGFiczphbnkpe1xyXG4gICAgbGV0IHBheWxvYWRzOmFueSA9IFtdO1xyXG4gICAgaWYodGFicyAmJiB0YWJzLmxlbmd0aCA+PSAxKXtcclxuICAgICAgdGFicy5mb3JFYWNoKCh0YWI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmKHRhYi5ncmlkKXtcclxuICAgICAgICAgIGxldCBncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEgPSBbXTtcclxuICAgICAgICAgIGlmKHRoaXMuY2hlY2tJZlNlcnZpY2UuaXNHcmlkRmllbGRFeGlzdCh0YWIsXCJhcGlfcGFyYW1zX2NyaXRlcmlhXCIpKXtcclxuICAgICAgICAgICAgZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhID0gdGFiLmdyaWQuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYSh0YWIudGFiX25hbWUsdGFiLnRhYl9uYW1lK1wiX1wiK3RhYi5uYW1lLGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSx7fSk7XHJcbiAgICAgICAgICBwYXlsb2FkWydjb3VudE9ubHknXSA9IHRydWU7XHJcbiAgICAgICAgICBwYXlsb2Fkcy5wdXNoKHBheWxvYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF5bG9hZHM7XHJcbiAgfVxyXG4gIGdldFRhYnNDb3VudFB5bG9hZCh0YWJzOmFueSl7XHJcbiAgICBsZXQgcGF5bG9hZHMgPSB0aGlzLmdldFRhYnNQYXlsb2FkRm9yQ291bnRMaXN0KHRhYnMpO1xyXG4gICAgaWYocGF5bG9hZHMgJiYgcGF5bG9hZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRHcmlkQ291bnREYXRhKHBheWxvYWRzKTtcclxuICAgIH1cclxuICB9XHJcbiAgY29tbWFuQXBpUGF5bG9hZChoZWFkRWxlbWVudDphbnksdGFibGVGaWVsZDphbnksYWN0aW9uQnV0dG9uOmFueSxvYmplY3Q/OmFueSl7XHJcbiAgICBjb25zdCBzdGF0aWNNb2RhbEdyb3VwOmFueSA9IFtdO1xyXG4gICAgbGV0IHN0YXRpY01vZGFsOmFueSA9IHt9O1xyXG4gICAgaWYoaGVhZEVsZW1lbnQubGVuZ3RoID4gMCl7XHJcbiAgICAgIGhlYWRFbGVtZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50LmFwaV9wYXJhbXMgJiYgZWxlbWVudC5hcGlfcGFyYW1zICE9ICcnKSB7XHJcbiAgICAgICAgICBsZXQgY2FsbF9iYWNrX2ZpZWxkID0gICcnO1xyXG4gICAgICAgICAgbGV0IGNyaXRlcmlhID0gW107XHJcbiAgICAgICAgICBpZihlbGVtZW50LmNhbGxfYmFja19maWVsZCAmJiBlbGVtZW50LmNhbGxfYmFja19maWVsZCAhPSAnJyl7XHJcbiAgICAgICAgICAgIGNhbGxfYmFja19maWVsZCA9ICBlbGVtZW50LmNhbGxfYmFja19maWVsZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEgIT0gJycpe1xyXG4gICAgICAgICAgICBjcml0ZXJpYSA9ICBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzdGF0aWNNb2RhbCA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGVsZW1lbnQuYXBpX3BhcmFtcyxjYWxsX2JhY2tfZmllbGQsY3JpdGVyaWEsb2JqZWN0P29iamVjdDp7fSk7XHJcbiAgICAgICAgICBpZihlbGVtZW50LmFka2V5ICYmIGVsZW1lbnQuYWRrZXkgIT0gJycgJiYgZWxlbWVudC5hZGtleSAhPSBudWxsKXtcclxuICAgICAgICAgICAgc3RhdGljTW9kYWxbJ2Fka2V5cyddID0gZWxlbWVudC5hZGtleTtcclxuICAgICAgICAgICAgc3RhdGljTW9kYWxHcm91cC5wdXNoKHN0YXRpY01vZGFsKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBzdGF0aWNNb2RhbEdyb3VwLnB1c2goc3RhdGljTW9kYWwpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZihhY3Rpb25CdXR0b24ubGVuZ3RoID4gMCl7XHJcbiAgICAgIGFjdGlvbkJ1dHRvbi5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudC5hcGlfcGFyYW1zICYmIGVsZW1lbnQuYXBpX3BhcmFtcyAhPSAnJykge1xyXG4gICAgICAgICAgbGV0IGNhbGxfYmFja19maWVsZCA9ICAnJztcclxuICAgICAgICAgIGxldCBjcml0ZXJpYSA9IFtdO1xyXG4gICAgICAgICAgaWYoZWxlbWVudC5jYWxsX2JhY2tfZmllbGQgJiYgZWxlbWVudC5jYWxsX2JhY2tfZmllbGQgIT0gJycpe1xyXG4gICAgICAgICAgICBjYWxsX2JhY2tfZmllbGQgPSAgZWxlbWVudC5jYWxsX2JhY2tfZmllbGQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEgJiYgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhICE9ICcnKXtcclxuICAgICAgICAgICAgY3JpdGVyaWEgPSAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3Qgc3RhdGljTW9kYWwgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShlbGVtZW50LmFwaV9wYXJhbXMsY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLG9iamVjdD9vYmplY3Q6e30pO1xyXG5cclxuICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0YWJsZUZpZWxkLmxlbmd0aCA+IDApe1xyXG5cclxuICAgICAgdGFibGVGaWVsZC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjYWxsX2JhY2tfZmllbGQgPSAgJyc7XHJcbiAgICAgICAgbGV0IGNyaXRlcmlhID0gW107XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuYXBpX3BhcmFtcyAmJiBlbGVtZW50LmFwaV9wYXJhbXMgIT0gJycgJiYgZWxlbWVudC50eXBlICE9IFwidHlwZWFoZWFkXCIpIHtcclxuICAgICAgICAgIGlmKGVsZW1lbnQuY2FsbF9iYWNrX2ZpZWxkICYmIGVsZW1lbnQuY2FsbF9iYWNrX2ZpZWxkICE9ICcnKXtcclxuICAgICAgICAgICAgY2FsbF9iYWNrX2ZpZWxkID0gIGVsZW1lbnQuY2FsbF9iYWNrX2ZpZWxkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYSAhPSAnJyl7XHJcbiAgICAgICAgICAgIGNyaXRlcmlhID0gIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHN0YXRpY01vZGFsID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWxlbWVudC5hcGlfcGFyYW1zLGNhbGxfYmFja19maWVsZCxjcml0ZXJpYSxvYmplY3Q/b2JqZWN0Ont9LGVsZW1lbnQuZGF0YV90ZW1wbGF0ZSk7XHJcbiAgICAgICAgICBpZihlbGVtZW50LmFwaV9wYXJhbXMuaW5kZXhPZihcImh0bWxfdmlld1wiKSA+PSAwKXtcclxuICAgICAgICAgICAgc3RhdGljTW9kYWxbXCJkYXRhXCJdPW9iamVjdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZGF0YSAmJiBkYXRhICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2FsbF9iYWNrX2ZpZWxkID0gICcnO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3JpdGVyaWEgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXBpX3BhcmFtcyAmJiBkYXRhLmFwaV9wYXJhbXMgIT0gJycgJiYgZGF0YS50eXBlICE9IFwidHlwZWFoZWFkXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jYWxsX2JhY2tfZmllbGQgJiYgZGF0YS5jYWxsX2JhY2tfZmllbGQgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbF9iYWNrX2ZpZWxkID0gIGRhdGEuY2FsbF9iYWNrX2ZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXNfY3JpdGVyaWEgJiYgZGF0YS5hcGlfcGFyYW1zX2NyaXRlcmlhICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhID0gIGRhdGEuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljTW9kYWxMaXN0T2ZGaWVsZHMgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShkYXRhLmFwaV9wYXJhbXMsY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLG9iamVjdD9vYmplY3Q6e30sZWxlbWVudC5kYXRhX3RlbXBsYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXMuaW5kZXhPZihcImh0bWxfdmlld1wiKSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsTGlzdE9mRmllbGRzW1wiZGF0YVwiXT1vYmplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbExpc3RPZkZpZWxkcyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInN0ZXBwZXJcIjpcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChzdGVwOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2FsbF9iYWNrX2ZpZWxkID0gICcnO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3JpdGVyaWEgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXBpX3BhcmFtcyAmJiBkYXRhLmFwaV9wYXJhbXMgIT0gJycgJiYgZGF0YS50eXBlICE9IFwidHlwZWFoZWFkXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jYWxsX2JhY2tfZmllbGQgJiYgZGF0YS5jYWxsX2JhY2tfZmllbGQgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbF9iYWNrX2ZpZWxkID0gIGRhdGEuY2FsbF9iYWNrX2ZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXNfY3JpdGVyaWEgJiYgZGF0YS5hcGlfcGFyYW1zX2NyaXRlcmlhICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhID0gIGRhdGEuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljTW9kYWxMaXN0T2ZGaWVsZHMgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShkYXRhLmFwaV9wYXJhbXMsY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLG9iamVjdD9vYmplY3Q6e30sZWxlbWVudC5kYXRhX3RlbXBsYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXMuaW5kZXhPZihcImh0bWxfdmlld1wiKSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsTGlzdE9mRmllbGRzW1wiZGF0YVwiXT1vYmplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbExpc3RPZkZpZWxkcyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0aWNNb2RhbEdyb3VwO1xyXG4gIH1cclxuICBnZXRmaWx0ZXJDcmxpc3QoaGVhZEVsZW1lbnRzOmFueSxmb3JtVmFsdWU6YW55KSB7XHJcbiAgICBjb25zdCBmaWx0ZXJMaXN0OmFueSA9IFtdXHJcbiAgICBpZihmb3JtVmFsdWUgIT0gdW5kZWZpbmVkICYmIGhlYWRFbGVtZW50cyAmJiBoZWFkRWxlbWVudHMubGVuZ3RoID4gMCl7XHJcbiAgICAgIGNvbnN0IGNyaXRlcmlhOmFueSA9IFtdO1xyXG4gICAgICBoZWFkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQudHlwZSAhPSBudWxsKXtcclxuICAgICAgICAgIGxldCBmaWVsZE5hbWUgPSBlbGVtZW50LmZpZWxkX25hbWU7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImJ1dHRvblwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidHJlZV92aWV3X3NlbGVjdGlvblwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiZHJvcGRvd25cIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEpICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5sZW5ndGggPiAwICYmIGVsZW1lbnQudHlwZSAhPSAnZHJvcGRvd24nKXtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKGVsZW1lbnQubXVsdGlfc2VsZWN0ICYmIGVsZW1lbnQuZGF0YXR5cGUgPT0gXCJvYmplY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBmdmFsdWUgPSAnJztcclxuICAgICAgICAgICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodmw6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZigodmFsdWUubGVuZ3RoIC0gMSkgPT0gaSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZnZhbHVlID0gZnZhbHVlICsgdmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmdmFsdWUgPSBmdmFsdWUgKyB2bCArIFwiOlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZk5hbWVcIjogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiBmdmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogXCJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgZmlsdGVyTGlzdC5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZk5hbWVcIjogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmVmFsdWVcIjogdGhpcy5nZXRWYWx1ZUZvckRvdEZpZWxkTmFtZSh2YWx1ZSxmaWVsZE5hbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJvcGVyYXRvclwiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldERlZmF1bHRTZWFyY2hPcGVyYXRvcigpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICBpZih0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5pc0FycmF5KGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYSkgJiYgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZlZhbHVlXCI6IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldGRkbkRpc3BsYXlWYWwodmFsdWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm9wZXJhdG9yXCI6IFwiZXFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0eXBlYWhlYWRcIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmRhdGFGaWx0ZXJDcml0ZXJpYSkgJiYgZWxlbWVudC5kYXRhRmlsdGVyQ3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YUZpbHRlckNyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZOYW1lXCI6IGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZlZhbHVlXCI6IHRoaXMuZ2V0VmFsdWVGb3JEb3RGaWVsZE5hbWUodmFsdWUsZmllbGROYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogdGhpcy5zdG9yYWdlU2VydmljZS5nZXREZWZhdWx0U2VhcmNoT3BlcmF0b3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImluZm9cIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEpICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZOYW1lXCI6IGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZlZhbHVlXCI6IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldGRkbkRpc3BsYXlWYWwodmFsdWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJvcGVyYXRvclwiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldERlZmF1bHRTZWFyY2hPcGVyYXRvcigpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgXCJyZWZlcmVuY2VfbmFtZXNcIjpcclxuICAgICAgICAgICAgICBjYXNlIFwiY2hpcHNcIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEpICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZOYW1lXCI6IGZpZWxkTmFtZStcIi5uYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRkZG5EaXNwbGF5VmFsKHZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogdGhpcy5zdG9yYWdlU2VydmljZS5nZXREZWZhdWx0U2VhcmNoT3BlcmF0b3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XHJcbiAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhKSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhLnB1c2goY3JpKVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5kYXRlRm9ybWF0KHZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogXCJlcVwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGF0ZXJhbmdlXCI6XHJcbiAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdLnN0YXJ0ICE9ICcnICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdLmVuZCAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhKSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhLnB1c2goY3JpKVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5kYXRlRm9ybWF0KHZhbHVlLnN0YXJ0KSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogXCJndGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0uZW5kICE9ICcnICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdLmVuZCAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhKSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhLnB1c2goY3JpKVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5kYXRlRm9ybWF0KHZhbHVlLmVuZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIm9wZXJhdG9yXCI6IFwibHRlXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYoY3JpdGVyaWEgJiYgY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgY29uc3QgY3JMaXN0ID0gdGhpcy5nZXRDcml0ZXJpYUxpc3QoY3JpdGVyaWEsZm9ybVZhbHVlKTtcclxuICAgICAgICBpZihjckxpc3QgJiYgY3JMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgY3JMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmaWx0ZXJMaXN0O1xyXG4gIH1cclxuICBnZXRWYWx1ZUZvckRvdEZpZWxkTmFtZSh2YWx1ZTphbnksZmllbGROYW1lOmFueSl7XHJcbiAgICBsZXQgY3JWYWx1ZSA9IFwiXCI7XHJcbiAgICBpZih0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgIGNyVmFsdWUgPSB2YWx1ZTtcclxuICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKXtcclxuICAgICAgbGV0IGZOYW1lID0gZmllbGROYW1lLmluZGV4T2YoJy4nKSAhPSAtMSA/IChmaWVsZE5hbWUpLnNwbGl0KCcuJylbMF06ZmllbGROYW1lO1xyXG4gICAgICBsZXQgb2JqZWN0VmFsdWU6YW55ID0ge307XHJcbiAgICAgIG9iamVjdFZhbHVlW2ZOYW1lXSA9ICB2YWx1ZVxyXG4gICAgICBjclZhbHVlID0gZmllbGROYW1lLmluZGV4T2YoJy4nKSAhPSAtMSA/dGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0T2JqZWN0VmFsdWUoZmllbGROYW1lLG9iamVjdFZhbHVlKTogdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0ZGRuRGlzcGxheVZhbCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3JWYWx1ZTtcclxuICB9XHJcblxyXG4gZ2V0VXNlclByZWZyZXJlbmNlKHVzZXI6YW55KSB7XHJcbiAgICBsZXQgY3JpdGVyaWEgPSBcInVzZXJJZC5faWQ7ZXE7XCIrdXNlci5faWQrXCI7U1RBVElDXCI7XHJcbiAgICBsZXQgbXlEYXRhID0gdGhpcy5zZXRQYWdlTm9BbmRTaXplKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKFwidXNlcl9wcmVmZXJlbmNlXCIsIFwiXCIsIFtjcml0ZXJpYV0sIHt9KSwxKTtcclxuICAgIGNvbnN0IHBheWxvYWREYXRhID0ge1xyXG4gICAgICBwYXRoOiBudWxsLFxyXG4gICAgICBkYXRhIDogbXlEYXRhXHJcbiAgICB9XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuZ2V0RmF2b3VyaXRlRGF0YShwYXlsb2FkRGF0YSk7XHJcbiAgfVxyXG4gIGdldFVzZXJOb3RpZmljYXRpb24ocGFnZU5vOmFueSl7XHJcbiAgICBsZXQgdXNlciA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0VXNlckluZm8oKTtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXIuX2lkO1xyXG4gICAgaWYodXNlcklkICYmIHVzZXJJZCAhPSBudWxsICYmIHVzZXJJZCAhPSAnJyl7XHJcbiAgICAgIGxldCBjcml0ZXJhaUxpc3Q6YW55PVtdO1xyXG4gICAgICBjcml0ZXJhaUxpc3QucHVzaChcInVzZXJJZC5faWQ7ZXE7XCIrdXNlcklkK1wiO1NUQVRJQ1wiKTtcclxuICAgICAgY3JpdGVyYWlMaXN0LnB1c2goXCJub3RpZmljYXRpb25TdGF0dXM7ZXE7VU5SRUFEO1NUQVRJQ1wiKTtcclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuc2V0UGFnZU5vQW5kU2l6ZSh0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYSgndXNlcl9ub3RpZmljYXRpb25fbWFzdGVyJywnJyxjcml0ZXJhaUxpc3Qse30pLHBhZ2VObyk7XHJcbiAgICAgIGNvbnN0IGNhbGxQYXlsb2FkID0ge1xyXG4gICAgICAgIFwicGF0aFwiIDogbnVsbCxcclxuICAgICAgICBcImRhdGFcIjogcGF5bG9hZFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRVc2VyTm90aWZpY2F0aW9uKGNhbGxQYXlsb2FkKTtcclxuICAgIH1cclxuICB9XHJcbiAgICBnZXRVc2VyTm90aWZpY2F0aW9uU2V0dGluZygpe1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldFVzZXJOb3RpZmljYXRpb25TZXR0aW5nKCk7XHJcbiAgfVxyXG5cclxuICBnZXRBcHBsaWNhdGlvbkFsbFNldHRpbmdzKCkge1xyXG4gICAgY29uc3QgcGF5bG9hZDEgPSB0aGlzLnNldFBhZ2VOb0FuZFNpemUodGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoXCJhcHBsaWNhdGlvbl9zZXR0aW5nXCIsIFwiXCIsIFtdLCB7fSksIDEpO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFwbGljYXRpb25zU2V0dGluZyhwYXlsb2FkMSk7XHJcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5zZXRQYWdlTm9BbmRTaXplKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKFwiYXBwbGljYXRpb25fdGhlbWVfc2V0dGluZ1wiLCBcIlwiLCBbXSwge30pLCAxKTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXRBcGxpY2F0aW9uc1RoZW1lU2V0dGluZyhwYXlsb2FkKTtcclxuICB9XHJcbiAgZ2V0RGF0YUZvckdyaWQocGFnZTphbnksdGFiOmFueSxjdXJyZW50TWVudTphbnksaGVhZEVsZW1lbnRzOmFueSxmaWx0ZXJGb3JtOmFueSxzZWxlY3RDb250YWN0OmFueSl7XHJcbiAgICAvLyBsZXQgZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhID0gW107XHJcbiAgICAvLyBpZih0YWIuZ3JpZCAmJiB0YWIuZ3JpZC5ncmlkX3BhZ2Vfc2l6ZSAmJiB0YWIuZ3JpZC5ncmlkX3BhZ2Vfc2l6ZSAhPSBudWxsICYmIHRhYi5ncmlkLmdyaWRfcGFnZV9zaXplICE9ICcnKXtcclxuICAgIC8vICAgdGhpcy5pdGVtTnVtT2ZHcmlkID0gdGFiLmdyaWQuZ3JpZF9wYWdlX3NpemU7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZih0aGlzLmNoZWNrSWZTZXJ2aWNlLmlzR3JpZEZpZWxkRXhpc3QodGFiLFwiYXBpX3BhcmFtc19jcml0ZXJpYVwiKSl7XHJcbiAgICAvLyAgIGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSA9IHRhYi5ncmlkLmFwaV9wYXJhbXNfY3JpdGVyaWE7XHJcbiAgICAvLyB9XHJcbiAgICAvL2NvbnN0IGRhdGEgPSB0aGlzLnNldFBhZ2VOb0FuZFNpemUodGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUubmFtZSwnJyxncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEsJycpLHBhZ2UpO1xyXG4gICAgLy9sZXQgIGNyTGlzdD1bXTtcclxuICAgIC8vIHRoaXMuZ2V0ZmlsdGVyQ3JsaXN0KGhlYWRFbGVtZW50cyxmaWx0ZXJGb3JtKS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgIC8vICAgY3JMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAvLyB9KTtcclxuICAgIGxldCBwYXlsb2FkID0gdGhpcy5nZXREYXRhRm9yR3JpZEZpbHRlcihwYWdlLHRhYixjdXJyZW50TWVudSxoZWFkRWxlbWVudHMsZmlsdGVyRm9ybSk7XHJcbiAgICBpZihzZWxlY3RDb250YWN0ICE9ICcnKXtcclxuICAgICAgY29uc3QgdGFiRmlsdGVyQ3JsaXN0ID0ge1xyXG4gICAgICAgIFwiZk5hbWVcIjogJ2FjY291bnQuX2lkJyxcclxuICAgICAgICBcImZWYWx1ZVwiOiBzZWxlY3RDb250YWN0LFxyXG4gICAgICAgIFwib3BlcmF0b3JcIjogJ2VxJ1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHBheWxvYWQ/LmRhdGE/LmNyTGlzdC5sZW5ndGggPiAwKSBwYXlsb2FkLmRhdGEuY3JMaXN0LnB1c2godGFiRmlsdGVyQ3JsaXN0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gICAgLy8gY29uc3QgZ2V0RmlsdGVyRGF0YSA9IHtcclxuICAgIC8vICAgZGF0YTogZGF0YSxcclxuICAgIC8vICAgcGF0aDogbnVsbFxyXG4gICAgLy8gfVxyXG4gICAgLy8gcmV0dXJuIGdldEZpbHRlckRhdGE7XHJcbiAgfVxyXG4gIHByZXBhcmVQYXlsb2FkV2l0aENybGlzdCh0YWI6YW55LGN1cnJlbnRNZW51OmFueSxoZWFkRWxlbWVudHM6YW55LGZpbHRlckZvcm06YW55KXtcclxuICAgIGxldCBncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEgPSBbXTtcclxuICAgIGlmKHRoaXMuY2hlY2tJZlNlcnZpY2UuaXNHcmlkRmllbGRFeGlzdCh0YWIsXCJhcGlfcGFyYW1zX2NyaXRlcmlhXCIpKXtcclxuICAgICAgZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhID0gdGFiLmdyaWQuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShjdXJyZW50TWVudS5uYW1lLCcnLGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSwnJyk7XHJcbiAgICBsZXQgY3JMaXN0OmFueSA9IFtdO1xyXG4gICAgdGhpcy5nZXRmaWx0ZXJDcmxpc3QoaGVhZEVsZW1lbnRzLGZpbHRlckZvcm0pLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjckxpc3QucHVzaChlbGVtZW50KTtcclxuICAgIH0pO1xyXG4gICAgLy9hZHZhbmNlZCBmaWx0ZXIgY3JsaXN0IGdldCBvciBhZGQgaW4gY3JsaXN0XHJcbiAgICBsZXQgYWR2YW5jZWRDcmxpc3QgPSBKU09OLnBhcnNlKDxhbnk+c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkFEVkFOQ0VfQ1JJVEVSSUFfTElTVFwiKSk7XHJcbiAgICBpZihhZHZhbmNlZENybGlzdCl7XHJcbiAgICAgIGlmKGFkdmFuY2VkQ3JsaXN0W2N1cnJlbnRNZW51Lm5hbWVdKXtcclxuICAgICAgICBsZXQgbGlzdCA9IGFkdmFuY2VkQ3JsaXN0W2N1cnJlbnRNZW51Lm5hbWVdO1xyXG4gICAgICAgIGlmKGxpc3QgJiYgbGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGxpc3QuZm9yRWFjaCgoYWRDcml0ZXJpYTphbnkpID0+IHtcclxuICAgICAgICAgICAgY3JMaXN0LnB1c2goYWRDcml0ZXJpYSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKGNyTGlzdCAmJiBjckxpc3QubGVuZ3RoPjApe1xyXG4gICAgICBpZihwYXlsb2FkICYmIHBheWxvYWQ/LmNyTGlzdCAmJiBwYXlsb2FkLmNyTGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICBjckxpc3QuZm9yRWFjaCgoY3I6YW55KSA9PiB7XHJcbiAgICAgICAgICBwYXlsb2FkLmNyTGlzdC5wdXNoKGNyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcGF5bG9hZC5jckxpc3QgPSBjckxpc3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldERhdGFGb3JHcmlkRmlsdGVyKHBhZ2U6YW55LHRhYjphbnksY3VycmVudE1lbnU6YW55LGhlYWRFbGVtZW50czphbnksZmlsdGVyRm9ybTphbnkpe1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMucHJlcGFyZVBheWxvYWRXaXRoQ3JsaXN0KHRhYixjdXJyZW50TWVudSxoZWFkRWxlbWVudHMsZmlsdGVyRm9ybSk7XHJcbiAgICBpZih0YWIgJiYgdGFiPy5ncmlkICYmIHRhYj8uZ3JpZD8uZ3JpZF9wYWdlX3NpemUpe1xyXG4gICAgICB0aGlzLml0ZW1OdW1PZkdyaWQgPSB0YWIuZ3JpZC5ncmlkX3BhZ2Vfc2l6ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0UGFnZU5vQW5kU2l6ZShkYXRhLHBhZ2UpO1xyXG4gICAgY29uc3QgZ2V0RmlsdGVyRGF0YSA9IHtcclxuICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgcGF0aDogbnVsbFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdldEZpbHRlckRhdGE7XHJcbiAgfVxyXG4gIGdldFBhZ2UocGFnZTogbnVtYmVyLHRhYjphbnksY3VycmVudE1lbnU6c3RyaW5nLGhlYWRFbGVtZW50czpvYmplY3QsZmlsdGVyRm9ybTpvYmplY3Qsc2VsZWN0Q29udGFjdDphbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmdldERhdGFGb3JHcmlkKHBhZ2UsdGFiLGN1cnJlbnRNZW51LGhlYWRFbGVtZW50cyxmaWx0ZXJGb3JtLHNlbGVjdENvbnRhY3QpO1xyXG4gIH1cclxuICBnZXRSZWFsVGltZUdyaWREYXRhKGN1cnJlbnRNZW51OmFueSwgb2JqZWN0OmFueSkge1xyXG4gICAgbGV0IGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSA9IFtdO1xyXG4gICAgbGV0IHBhZ2UgPSAxO1xyXG4gICAgbGV0IGNyaXRlcmlhID0gXCJfaWQ7ZXE7XCIgKyBvYmplY3QuX2lkICsgXCI7U1RBVElDXCI7XHJcbiAgICBncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEucHVzaChjcml0ZXJpYSk7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zZXRQYWdlTm9BbmRTaXplKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGN1cnJlbnRNZW51Lm5hbWUsJycsZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhLCcnKSxwYWdlKTtcclxuICAgIGNvbnN0IGdldEZpbHRlckRhdGEgPSB7XHJcbiAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgIHBhdGg6IG51bGxcclxuICAgIH1cclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXRHcmlkUnVubmluZ0RhdGEoZ2V0RmlsdGVyRGF0YSk7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtRm9yVGRzKGRhdGE6YW55LGN1cnJlbnRNZW51OmFueSwgb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgcGF5bG9hZERhdGE6YW55ID0ge307XHJcbiAgICBpZihjdXJyZW50TWVudSAhPSAnJyl7XHJcbiAgICAgIHBheWxvYWREYXRhID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUsICcnLCBbXSwgJycpXHJcbiAgICAgIHBheWxvYWREYXRhWydkYXRhJ109b2JqZWN0XHJcbiAgICB9XHJcbiAgICBjb25zdCBnZXRGb3JtRGF0YSA9IHtcclxuICAgICAgX2lkIDogZGF0YS5faWQsXHJcbiAgICAgIGRhdGE6IHBheWxvYWREYXRhXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ2V0Rm9ybURhdGE7XHJcbiAgfVxyXG4gIGdldFBkZihkYXRhOmFueSxjdXJyZW50TWVudTphbnkpIHtcclxuICAgIGxldCBwYXlsb2FkRGF0YSA9IHt9O1xyXG4gICAgaWYoY3VycmVudE1lbnUgIT0gJycpe1xyXG4gICAgICBwYXlsb2FkRGF0YSA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGN1cnJlbnRNZW51LCAnJywgW10sICcnKVxyXG4gICAgfVxyXG4gICAgY29uc3QgZ2V0RmlsZURhdGE6YW55ID0ge1xyXG4gICAgICBfaWQ6IGRhdGEuX2lkLFxyXG4gICAgICBkYXRhOiBwYXlsb2FkRGF0YSxcclxuICAgICAgcmVzcG9uY2U6IHsgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVOYW1lID0gY3VycmVudE1lbnU7XHJcbiAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSlcclxuICAgIGNvbnN0IGRvd25sb2FkUGRmQ2hlY2sgPSBmaWxlTmFtZSArICctJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcbiAgICBpZihnZXRGaWxlRGF0YS5faWQgJiYgZ2V0RmlsZURhdGEuX2lkICE9IHVuZGVmaW5lZCAmJiBnZXRGaWxlRGF0YS5faWQgIT0gbnVsbCAmJiBnZXRGaWxlRGF0YS5faWQgIT0gJycpe1xyXG4gICAgICBnZXRGaWxlRGF0YS5kYXRhWydkYXRhJ109ZGF0YTtcclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLkdldEZpbGVEYXRhKGdldEZpbGVEYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiAgZG93bmxvYWRQZGZDaGVjaztcclxuICB9XHJcbiAgZG93bmxvYWRQZGYoZGF0YTphbnksIGN1cnJlbnRNZW51OmFueSkge1xyXG4gICAgbGV0IHBheWxvYWREYXRhID0ge307XHJcbiAgICBpZiAoY3VycmVudE1lbnUgIT0gJycpIHtcclxuICAgICAgcGF5bG9hZERhdGEgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShjdXJyZW50TWVudSwgJycsIFtdLCAnJylcclxuICAgIH1cclxuICAgIGNvbnN0IGdldFBkZkRhdGE6YW55ID0ge1xyXG4gICAgICBfaWQ6IGRhdGEuX2lkLFxyXG4gICAgICBkYXRhOiBwYXlsb2FkRGF0YSxcclxuICAgICAgcmVzcG9uY2U6IHsgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVOYW1lID0gY3VycmVudE1lbnU7XHJcbiAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSlcclxuICAgIGNvbnN0IGRvd25sb2FkUGRmQ2hlY2sgPSBmaWxlTmFtZSArICctJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcbiAgICBpZiAoZ2V0UGRmRGF0YS5faWQgJiYgZ2V0UGRmRGF0YS5faWQgIT0gdW5kZWZpbmVkICYmIGdldFBkZkRhdGEuX2lkICE9IG51bGwgJiYgZ2V0UGRmRGF0YS5faWQgIT0gJycpIHtcclxuICAgICAgZ2V0UGRmRGF0YS5kYXRhWydkYXRhJ10gPSBkYXRhO1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuR2V0UGRmRGF0YShnZXRQZGZEYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkb3dubG9hZFBkZkNoZWNrO1xyXG4gIH1cclxuICBnZXRUZW1EYXRhKHRlbXBOYW1lOmFueSkge1xyXG4gICAgLy9jb25zdCBwYXJhbXMgPSBcImZvcm1fdGVtcGxhdGVcIjtcclxuICAgIC8vY29uc3QgY3JpdGVyaWEgPSBbXCJuYW1lO2VxO1wiK3RlbXBOYW1lK1wiO1NUQVRJQ1wiXTtcclxuICAgIC8vY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKHBhcmFtcywnJyxjcml0ZXJpYSx7fSk7XHJcbiAgICAvLyBjb25zdCBnZXRUZW1wbGF0ZXMgPSB7XHJcbiAgICAvLyAgIGNyTGlzdDogW3tcclxuICAgIC8vICAgICBcImZOYW1lXCI6IFwibmFtZVwiLFxyXG4gICAgLy8gICAgIFwiZlZhbHVlXCI6IHRlbXBOYW1lLFxyXG4gICAgLy8gICAgIFwib3BlcmF0b3JcIjogXCJlcVwiXHJcbiAgICAvLyAgIH1dLFxyXG4gICAgLy8gICBrZXkyOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFwcElkKCksXHJcbiAgICAvLyAgIHJlZkNvZGU6IHRoaXMuZ2V0UmVmY29kZSgpLFxyXG4gICAgLy8gICBsb2c6IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckxvZygpLFxyXG4gICAgLy8gICB2YWx1ZTogXCJmb3JtX3RlbXBsYXRlXCJcclxuICAgIC8vIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFRlbXBQYXlsb2FkKHRlbXBOYW1lLCdlcScpO1xyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG4gIGdldFRlbXBQYXlsb2FkKHZhbHVlOmFueSxvcGVyYXRvcjpzdHJpbmcpe1xyXG4gICAgY29uc3QgcGFyYW1zID0gXCJmb3JtX3RlbXBsYXRlXCI7XHJcbiAgICBjb25zdCBjcml0ZXJpYSA9IFtcIm5hbWU7XCIrb3BlcmF0b3IrXCI7XCIrdmFsdWUrXCI7U1RBVElDXCJdO1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKHBhcmFtcywnJyxjcml0ZXJpYSx7fSk7XHJcbiAgICByZXR1cm4gcGF5bG9hZDtcclxuICB9XHJcbiAgc2V0UGFnZU5vQW5kU2l6ZShwYXlsb2FkOmFueSxwYWdlOm51bWJlcil7XHJcbiAgICBwYXlsb2FkWydwYWdlTm8nXSA9IHBhZ2UgLSAxO1xyXG4gICAgcGF5bG9hZFsncGFnZVNpemUnXSA9IHRoaXMuaXRlbU51bU9mR3JpZDtcclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuICBjaGVja1F0bXBBcGkocGFyYW1zOmFueSxmaWVsZDphbnkscGF5bG9hZDphbnksbXVsdGlwbGVGb3JtQ29sbGVjdGlvbjphbnksb2JqZWN0OmFueSxvYmplY3RXaXRoQ3VzdG9tOmFueSl7XHJcbiAgICBpZihwYXJhbXMuaW5kZXhPZihcIkZPUk1fR1JPVVBcIikgPj0gMCB8fCBwYXJhbXMuaW5kZXhPZihcIlFUTVBcIikgPj0gMCl7XHJcbiAgICAgIGxldCBtdWx0aUNvbGxlY3Rpb24gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG11bHRpcGxlRm9ybUNvbGxlY3Rpb24pKTtcclxuICAgICAgaWYoZmllbGQgJiYgZmllbGQuZm9ybVZhbHVlQXNPYmplY3RGb3JRdG1wKXtcclxuICAgICAgICBsZXQgZm9ybVZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0Rm9ybURhdGFJbk11bHRpZm9ybUNvbGxlY3Rpb24obXVsdGlDb2xsZWN0aW9uLG9iamVjdCk7XHJcbiAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBsZXQgZm9ybVZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0Rm9ybURhdGFJbk11bHRpZm9ybUNvbGxlY3Rpb24obXVsdGlDb2xsZWN0aW9uLG9iamVjdFdpdGhDdXN0b20pO1xyXG4gICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG4gIHByZXZpZXdNb2RhbChncmlkRGF0YTphbnksIGN1cnJlbnRNZW51OmFueSwgbW9kYWxJZDphbnkpIHtcclxuICAgIGNvbnN0IGdldHByZXZpZXdIdG1sID0ge1xyXG4gICAgICBfaWQ6IGdyaWREYXRhLl9pZCxcclxuICAgICAgZGF0YTogdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUubmFtZSwgJycsIFtdLCAnJylcclxuICAgIH1cclxuICAgIHRoaXMuYXBpU2VydmljZS5HZXRQcmV2aWV3SHRtbChnZXRwcmV2aWV3SHRtbCk7XHJcbiAgICBjb25zdCBhbGVydERhdGEgPSB7XHJcbiAgICAgIGdyaWREYXRhOiBncmlkRGF0YSxcclxuICAgICAgY3VycmVudFBhZ2U6IGN1cnJlbnRNZW51Lm5hbWVcclxuICAgIH1cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWxJZCwgYWxlcnREYXRhKTtcclxuICB9XHJcbiAgcHJldmlldyhncmlkRGF0YTphbnksIGN1cnJlbnRNZW51OmFueSwgbW9kYWxJZDphbnkpIHtcclxuICAgIGNvbnN0IGdldHByZXZpZXdIdG1sID0ge1xyXG4gICAgICBfaWQ6IGdyaWREYXRhLl9pZCxcclxuICAgICAgZGF0YTogdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUubmFtZSwgJycsIFtdLCAnJylcclxuICAgIH1cclxuICAgIGdldHByZXZpZXdIdG1sLmRhdGFbJ2RhdGEnXSA9IGdyaWREYXRhO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLkdldFByZXZpZXdIdG1sKGdldHByZXZpZXdIdG1sKTtcclxuICB9XHJcbn1cclxuIl19