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,654 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { UntypedFormControl } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../common-utils/common-function.service";
5
+ import * as i2 from "../../fileHandler/file-handler.service";
6
+ import * as i3 from "../../grid/grid-common-function/grid-common-function.service";
7
+ import * as i4 from "../../tree-component/tree-component.service";
8
+ export class FormControlService {
9
+ constructor(commonFunctionService, fileHandlerService, gridCommonFunctionService, TreeComponentService) {
10
+ this.commonFunctionService = commonFunctionService;
11
+ this.fileHandlerService = fileHandlerService;
12
+ this.gridCommonFunctionService = gridCommonFunctionService;
13
+ this.TreeComponentService = TreeComponentService;
14
+ }
15
+ editeListFieldData(templateForm, custmizedFormValue, tableFields, field, index, listOfFieldsUpdateIndex, staticData, dataListForUpload) {
16
+ let responce = {
17
+ "listOfFieldUpdateMode": true,
18
+ "listOfFieldsUpdateIndex": listOfFieldsUpdateIndex,
19
+ "custmizedFormValue": custmizedFormValue,
20
+ "dataListForUpload": dataListForUpload,
21
+ "templateForm": templateForm
22
+ };
23
+ let parentList = responce.custmizedFormValue[field.field_name];
24
+ let object = parentList[index];
25
+ responce.listOfFieldsUpdateIndex = index;
26
+ if (tableFields && tableFields.length > 0) {
27
+ tableFields.forEach((element) => {
28
+ switch (element.type) {
29
+ case "list_of_fields":
30
+ if (element.field_name == field.field_name && templateForm != null) {
31
+ responce.templateForm.controls[element.field_name].reset();
32
+ if (element.list_of_fields.length > 0) {
33
+ element.list_of_fields.forEach((data) => {
34
+ switch (data.type) {
35
+ case "list_of_string":
36
+ const custmisedKey = this.commonFunctionService.custmizedKey(element);
37
+ if (!responce.custmizedFormValue[custmisedKey])
38
+ responce.custmizedFormValue[custmisedKey] = {};
39
+ responce.custmizedFormValue[custmisedKey][data.field_name] = object[data.field_name];
40
+ break;
41
+ case "typeahead":
42
+ if (data.datatype == 'list_of_object') {
43
+ const custmisedKey = this.commonFunctionService.custmizedKey(element);
44
+ if (!responce.custmizedFormValue[custmisedKey])
45
+ responce.custmizedFormValue[custmisedKey] = {};
46
+ responce.custmizedFormValue[custmisedKey][data.field_name] = object[data.field_name];
47
+ }
48
+ else {
49
+ responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(object[data.field_name]);
50
+ }
51
+ break;
52
+ case "list_of_checkbox":
53
+ let checkboxListValue = [];
54
+ if (staticData && staticData[data.ddn_field] && staticData[data.ddn_field].length > 0) {
55
+ staticData[data.ddn_field].forEach((value) => {
56
+ let arrayData = object[data.field_name];
57
+ let selected = false;
58
+ if (arrayData != undefined && arrayData != null) {
59
+ for (let index = 0; index < arrayData.length; index++) {
60
+ if (this.commonFunctionService.checkObjecOrString(value) == this.commonFunctionService.checkObjecOrString(arrayData[index])) {
61
+ selected = true;
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ if (selected) {
67
+ checkboxListValue.push(true);
68
+ }
69
+ else {
70
+ checkboxListValue.push(false);
71
+ }
72
+ });
73
+ }
74
+ //this.templateForm.get(element.field_name).get(data.field_name).setValue(checkboxListValue);
75
+ responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(checkboxListValue);
76
+ break;
77
+ case "file":
78
+ case "input_with_uploadfile":
79
+ if (object[data.field_name] != null && object[data.field_name] != undefined) {
80
+ let custmizedKey = this.commonFunctionService.custmizedKey(element);
81
+ if (!responce.dataListForUpload[custmizedKey])
82
+ responce.dataListForUpload[custmizedKey] = {};
83
+ if (!responce.dataListForUpload[custmizedKey][data.field_name])
84
+ responce.dataListForUpload[custmizedKey][data.field_name] = [];
85
+ responce.dataListForUpload[custmizedKey][data.field_name] = this.fileHandlerService.modifyUploadFiles(JSON.parse(JSON.stringify(object[data.field_name])));
86
+ //responce.dataListForUpload[custmizedKey][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
87
+ const value = this.fileHandlerService.modifyFileSetValue(object[data.field_name]);
88
+ //this.templateForm.get(element.field_name).get(data.field_name).setValue(value);
89
+ responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(value);
90
+ }
91
+ break;
92
+ default:
93
+ //this.templateForm.get(element.field_name).get(data.field_name).setValue(object[data.field_name]);
94
+ responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(object[data.field_name]);
95
+ break;
96
+ }
97
+ });
98
+ }
99
+ }
100
+ break;
101
+ default:
102
+ break;
103
+ }
104
+ });
105
+ }
106
+ return responce;
107
+ }
108
+ updateDataOnForm(templateForm, tableFields, formValue, formFieldButtons, custmizedFormValue, modifyCustmizedFormValue, selectedRow, dataListForUpload, treeViewData, staticData, longitude, latitude, zoom) {
109
+ let responce = {
110
+ templateForm: templateForm,
111
+ custmizedFormValue: custmizedFormValue,
112
+ modifyCustmizedFormValue: modifyCustmizedFormValue,
113
+ tableFields: tableFields,
114
+ dataListForUpload: dataListForUpload,
115
+ selectedRow: selectedRow,
116
+ treeViewData: treeViewData,
117
+ staticData: staticData,
118
+ longitude: longitude,
119
+ latitude: latitude,
120
+ zoom: zoom,
121
+ getAddress: false
122
+ };
123
+ tableFields.forEach((element) => {
124
+ if (element && element.field_name && element.field_name != '') {
125
+ let fieldName = element.field_name;
126
+ let object = formValue[fieldName];
127
+ if (object != null && object != undefined) {
128
+ this.updateFormValue(element, formValue, responce);
129
+ }
130
+ }
131
+ });
132
+ if (formFieldButtons.length > 0) {
133
+ formFieldButtons.forEach((element) => {
134
+ let fieldName = element.field_name;
135
+ let object = selectedRow[fieldName];
136
+ if (formValue[fieldName] != null && formValue[fieldName] != undefined) {
137
+ if (element.field_name && element.field_name != '') {
138
+ switch (element.type) {
139
+ case "dropdown":
140
+ let dropdownValue = object == null ? null : object;
141
+ responce.templateForm.controls[element.field_name].setValue(dropdownValue);
142
+ break;
143
+ default:
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ });
149
+ }
150
+ return responce;
151
+ }
152
+ updateFormValue(element, formValue, responce) {
153
+ let type = element.type;
154
+ let datatype = element.datatype;
155
+ let tree_view_object = element.tree_view_object;
156
+ let date_format = element.date_format;
157
+ let fieldName = element.field_name;
158
+ let ddn_field = element.ddn_field;
159
+ let parent = element.parent;
160
+ let list_of_fields = element.list_of_fields;
161
+ let object = formValue[fieldName];
162
+ switch (type) {
163
+ case "grid_selection":
164
+ case 'grid_selection_vertical':
165
+ case "list_of_string":
166
+ case "drag_drop":
167
+ if (object != null && object != undefined) {
168
+ if (Array.isArray(object)) {
169
+ responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
170
+ if (type.startsWith("grid_selection")) {
171
+ const modifyData = this.gridCommonFunctionService.gridDataModify(responce.modifyCustmizedFormValue, responce.custmizedFormValue, responce.tableFields, fieldName, "grid_selection", formValue);
172
+ responce.modifyCustmizedFormValue = modifyData.modifyData;
173
+ if (modifyData.field_index != -1) {
174
+ const index = modifyData.field_index;
175
+ responce.tableFields[index] = modifyData.fields[index];
176
+ }
177
+ }
178
+ }
179
+ responce.templateForm.controls[fieldName].setValue('');
180
+ }
181
+ break;
182
+ case "file":
183
+ case "input_with_uploadfile":
184
+ case "file_for_s3":
185
+ if (object != null && object != undefined) {
186
+ responce.dataListForUpload[fieldName] = JSON.parse(JSON.stringify(object));
187
+ const value = this.fileHandlerService.modifyFileSetValue(object);
188
+ if (type == 'input_with_uploadfile') {
189
+ let tooltipMsg = this.fileHandlerService.getFileTooltipMsg(object);
190
+ element['tooltipMsg'] = tooltipMsg;
191
+ }
192
+ responce.templateForm.controls[fieldName].setValue(value);
193
+ }
194
+ break;
195
+ case "list_of_fields":
196
+ if (object != null && object != undefined) {
197
+ if (Array.isArray(object)) {
198
+ responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
199
+ let modifyObject = this.gridCommonFunctionService.modifyListofFieldsData(element, responce.custmizedFormValue[fieldName], element.list_of_fields);
200
+ responce.modifyCustmizedFormValue[fieldName] = modifyObject['data'];
201
+ }
202
+ else if (typeof object == "object" && datatype == 'key_value') {
203
+ responce.custmizedFormValue[fieldName] = object;
204
+ }
205
+ else {
206
+ if (list_of_fields && list_of_fields != null && list_of_fields.length > 0) {
207
+ list_of_fields.forEach((data, j) => {
208
+ switch (data.type) {
209
+ case "list_of_string":
210
+ case "grid_selection":
211
+ case 'grid_selection_vertical':
212
+ case "drag_drop":
213
+ if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
214
+ if (Array.isArray(object[data.field_name])) {
215
+ if (!responce.custmizedFormValue[fieldName])
216
+ responce.custmizedFormValue[fieldName] = {};
217
+ responce.custmizedFormValue[fieldName][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
218
+ }
219
+ responce.templateForm.controls[fieldName].controls[data.field_name].setValue('');
220
+ //(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue('');
221
+ }
222
+ break;
223
+ case "typeahead":
224
+ if (data.datatype == "list_of_object" || datatype == 'chips') {
225
+ if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
226
+ if (Array.isArray(object[data.field_name])) {
227
+ if (!responce.custmizedFormValue[fieldName])
228
+ responce.custmizedFormValue[fieldName] = {};
229
+ responce.custmizedFormValue[fieldName][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
230
+ }
231
+ responce.templateForm.controls[fieldName].controls[data.field_name].setValue('');
232
+ //(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue('');
233
+ }
234
+ }
235
+ else {
236
+ if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
237
+ const value = object[data.field_name];
238
+ responce.templateForm.controls[fieldName].controls[data.field_name].setValue(value);
239
+ //(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue(value);
240
+ }
241
+ }
242
+ break;
243
+ case "input_with_uploadfile":
244
+ if (object != null && object != undefined && object[data.field_name] != null && object[data.field_name] != undefined) {
245
+ let custmisedKey = this.commonFunctionService.custmizedKey(element);
246
+ responce.dataListForUpload[custmisedKey][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
247
+ const value = this.fileHandlerService.modifyFileSetValue(object[data.field_name]);
248
+ let tooltipMsg = this.fileHandlerService.getFileTooltipMsg(object[data.field_name]);
249
+ element.list_of_fields[j]['tooltipMsg'] = tooltipMsg;
250
+ responce.templateForm.controls[fieldName].controls[data.field_name].setValue(value);
251
+ }
252
+ break;
253
+ default:
254
+ if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
255
+ const value = object[data.field_name];
256
+ responce.templateForm.controls[fieldName].controls[data.field_name].setValue(value);
257
+ //(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue(value);
258
+ }
259
+ break;
260
+ }
261
+ });
262
+ }
263
+ }
264
+ }
265
+ break;
266
+ case "typeahead":
267
+ if (datatype == "list_of_object" || datatype == 'chips') {
268
+ if (object != null && object != undefined) {
269
+ responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
270
+ responce.templateForm.controls[fieldName].setValue('');
271
+ }
272
+ }
273
+ else {
274
+ if (object != null && object != undefined) {
275
+ const value = object;
276
+ responce.templateForm.controls[fieldName].setValue(value);
277
+ }
278
+ }
279
+ break;
280
+ case "group_of_fields":
281
+ if (list_of_fields && list_of_fields.length > 0) {
282
+ list_of_fields.forEach((data, j) => {
283
+ let ChildFieldData = object;
284
+ let childFieldName = data.field_name;
285
+ if (data && childFieldName && childFieldName != '' && ChildFieldData && ChildFieldData != null) {
286
+ switch (data.type) {
287
+ case "list_of_string":
288
+ case "grid_selection":
289
+ case 'grid_selection_vertical':
290
+ case "drag_drop":
291
+ if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
292
+ if (!responce.custmizedFormValue[fieldName])
293
+ responce.custmizedFormValue[fieldName] = {};
294
+ const value = JSON.parse(JSON.stringify(ChildFieldData[childFieldName]));
295
+ responce.custmizedFormValue[fieldName][childFieldName] = value;
296
+ //this.templateForm.get(fieldName).get(childFieldName).setValue('')
297
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue('');
298
+ //(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue('');
299
+ }
300
+ break;
301
+ case "typeahead":
302
+ if (data.datatype == "list_of_object" || data.datatype == 'chips') {
303
+ if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
304
+ if (!responce.custmizedFormValue[fieldName])
305
+ responce.custmizedFormValue[fieldName] = {};
306
+ const value = JSON.parse(JSON.stringify(ChildFieldData[childFieldName]));
307
+ responce.custmizedFormValue[fieldName][childFieldName] = value;
308
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
309
+ //(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue('');
310
+ }
311
+ }
312
+ else {
313
+ if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
314
+ const value = ChildFieldData[childFieldName];
315
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
316
+ //(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue(value);
317
+ }
318
+ }
319
+ break;
320
+ case "number":
321
+ if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
322
+ let gvalue;
323
+ const value = ChildFieldData[childFieldName];
324
+ if (value != null && value != '') {
325
+ gvalue = value;
326
+ }
327
+ else {
328
+ gvalue = 0;
329
+ }
330
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(gvalue);
331
+ //(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue(gvalue);
332
+ }
333
+ else if (ChildFieldData && ChildFieldData.hasOwnProperty(childFieldName)) {
334
+ let gvalue = 0;
335
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(gvalue);
336
+ }
337
+ break;
338
+ case "list_of_checkbox":
339
+ responce.templateForm.controls[fieldName].controls[childFieldName].patchValue([]);
340
+ if (parent) {
341
+ responce.selectedRow[parent] = {};
342
+ responce.selectedRow[parent][fieldName] = ChildFieldData;
343
+ }
344
+ else {
345
+ responce.selectedRow[fieldName] = ChildFieldData;
346
+ }
347
+ //(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue([]);
348
+ break;
349
+ case "date":
350
+ if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
351
+ if (data.date_format && data.date_format != "" && typeof ChildFieldData[childFieldName] === 'string') {
352
+ const date = ChildFieldData[childFieldName];
353
+ const dateMonthYear = date.split('/');
354
+ const formatedDate = dateMonthYear[2] + "-" + dateMonthYear[1] + "-" + dateMonthYear[0];
355
+ const value = new Date(formatedDate);
356
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
357
+ }
358
+ else {
359
+ const value = formValue[fieldName][childFieldName] == null ? null : formValue[fieldName][childFieldName];
360
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
361
+ }
362
+ }
363
+ break;
364
+ case "input_with_uploadfile":
365
+ if (object != null && object != undefined && object[data.field_name] != null && object[data.field_name] != undefined) {
366
+ let custmisedKey = this.commonFunctionService.custmizedKey(element);
367
+ responce.dataListForUpload[custmisedKey][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
368
+ const value = this.fileHandlerService.modifyFileSetValue(object[data.field_name]);
369
+ let tooltipMsg = this.fileHandlerService.getFileTooltipMsg(object[data.field_name]);
370
+ element.list_of_fields[j]['tooltipMsg'] = tooltipMsg;
371
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
372
+ }
373
+ break;
374
+ default:
375
+ if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
376
+ const value = ChildFieldData[childFieldName];
377
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
378
+ //(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue(value);
379
+ }
380
+ break;
381
+ }
382
+ }
383
+ });
384
+ }
385
+ break;
386
+ case "tree_view_selection":
387
+ if (formValue[fieldName] != null && formValue[fieldName] != undefined) {
388
+ responce.treeViewData[fieldName] = [];
389
+ let treeDropdownValue = object == null ? null : object;
390
+ if (treeDropdownValue != "") {
391
+ responce.treeViewData[fieldName].push(JSON.parse(JSON.stringify(treeDropdownValue)));
392
+ }
393
+ responce.templateForm.controls[fieldName].setValue(treeDropdownValue);
394
+ }
395
+ break;
396
+ case "tree_view":
397
+ if (formValue[fieldName] != null && formValue[fieldName] != undefined) {
398
+ let treeValue = object == null ? null : object;
399
+ responce.templateForm.controls[fieldName].setValue(treeValue);
400
+ if (treeValue) {
401
+ let result = this.TreeComponentService.updateTreeViewData(JSON.parse(JSON.stringify(treeValue)), JSON.parse(JSON.stringify(element)), responce.treeViewData);
402
+ responce.treeViewData = result.treeViewData;
403
+ }
404
+ }
405
+ break;
406
+ case "stepper":
407
+ if (list_of_fields && list_of_fields.length > 0) {
408
+ list_of_fields.forEach((step) => {
409
+ if (step.list_of_fields && step.list_of_fields.length > 0) {
410
+ step.list_of_fields.forEach((data) => {
411
+ let childFieldName = data.field_name;
412
+ switch (data.type) {
413
+ case "list_of_string":
414
+ case "grid_selection":
415
+ case 'grid_selection_vertical':
416
+ if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
417
+ responce.custmizedFormValue[childFieldName] = formValue[childFieldName];
418
+ }
419
+ responce.templateForm.controls[step.field_name].controls[childFieldName].setValue('');
420
+ break;
421
+ case "typeahead":
422
+ if (data.datatype == "list_of_object" || data.datatype == 'chips') {
423
+ if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
424
+ responce.custmizedFormValue[childFieldName] = formValue[childFieldName](responce.templateForm.controls[step.field_name]).controls[childFieldName].setValue('');
425
+ }
426
+ }
427
+ else {
428
+ if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
429
+ const value = formValue[childFieldName];
430
+ responce.templateForm.controls[step.field_name].controls[childFieldName].setValue(value);
431
+ }
432
+ }
433
+ break;
434
+ case "number":
435
+ let gvalue;
436
+ const value = formValue[childFieldName];
437
+ if (value != null && value != '') {
438
+ gvalue = value;
439
+ }
440
+ else {
441
+ gvalue = 0;
442
+ }
443
+ responce.templateForm.controls[step.field_name].controls[childFieldName].setValue(gvalue);
444
+ break;
445
+ case "list_of_checkbox":
446
+ responce.templateForm.controls[step.field_name].controls[childFieldName].patchValue([]);
447
+ break;
448
+ default:
449
+ if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
450
+ const value = formValue[childFieldName];
451
+ responce.templateForm.controls[step.field_name].controls[childFieldName].setValue(value);
452
+ }
453
+ break;
454
+ }
455
+ if (data.tree_view_object && data.tree_view_object.field_name != "") {
456
+ let editeTreeModifyData = JSON.parse(JSON.stringify(data.tree_view_object));
457
+ const treeObject = responce.selectedRow[editeTreeModifyData.field_name];
458
+ responce.templateForm.controls[step.field_name].controls[editeTreeModifyData.field_name].setValue(treeObject);
459
+ }
460
+ });
461
+ }
462
+ });
463
+ }
464
+ break;
465
+ case "number":
466
+ if (object != null && object != undefined) {
467
+ let value;
468
+ if (object != null && object != '') {
469
+ value = object;
470
+ responce.templateForm.controls[fieldName].setValue(value);
471
+ }
472
+ else if (object == 0) {
473
+ value = object;
474
+ responce.templateForm.controls[fieldName].setValue(value);
475
+ }
476
+ }
477
+ break;
478
+ case "gmap":
479
+ case "gmapview":
480
+ if (object != null && object != undefined) {
481
+ if (formValue['longitude']) {
482
+ responce.longitude = formValue['longitude'];
483
+ }
484
+ if (formValue['latitude']) {
485
+ responce.latitude = formValue['latitude'];
486
+ }
487
+ if (formValue['zoom']) {
488
+ responce.zoom = formValue['zoom'];
489
+ }
490
+ if (responce.longitude != 0 && responce.latitude != 0) {
491
+ responce.getAddress = true;
492
+ //this.getAddress(responce.latitude,responce.longitude)
493
+ }
494
+ responce.templateForm.controls[fieldName].setValue(object);
495
+ }
496
+ break;
497
+ case "daterange":
498
+ if (object != null && object != undefined) {
499
+ let list_of_dates = [
500
+ { field_name: 'start' },
501
+ { field_name: 'end' }
502
+ ];
503
+ if (list_of_dates.length > 0) {
504
+ list_of_dates.forEach((data) => {
505
+ let childFieldName = data.field_name;
506
+ responce.templateForm.controls[fieldName].controls[childFieldName].setValue(object[childFieldName]);
507
+ });
508
+ }
509
+ }
510
+ break;
511
+ case "date":
512
+ if (object != null && object != undefined) {
513
+ if (date_format && date_format != '' && typeof object === 'string') {
514
+ const date = object[fieldName];
515
+ const dateMonthYear = date.split('/');
516
+ const formatedDate = dateMonthYear[2] + "-" + dateMonthYear[1] + "-" + dateMonthYear[0];
517
+ const value = new Date(formatedDate);
518
+ responce.templateForm.controls[fieldName].setValue(value);
519
+ }
520
+ else {
521
+ const value = formValue[fieldName] == null ? null : formValue[fieldName];
522
+ responce.templateForm.controls[fieldName].setValue(value);
523
+ }
524
+ }
525
+ break;
526
+ case "tabular_data_selector":
527
+ if (object != undefined && object != null) {
528
+ responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
529
+ }
530
+ if (Array.isArray(responce.staticData[ddn_field]) && Array.isArray(responce.custmizedFormValue[fieldName])) {
531
+ responce.custmizedFormValue[fieldName].forEach((staData) => {
532
+ if (responce.staticData[ddn_field][staData._id]) {
533
+ responce.staticData[ddn_field][staData._id].selected = true;
534
+ }
535
+ });
536
+ }
537
+ break;
538
+ case "list_of_checkbox":
539
+ responce.templateForm.controls[fieldName].setValue([]);
540
+ break;
541
+ default:
542
+ if (object != null && object != undefined) {
543
+ const value = object == null ? null : object;
544
+ responce.templateForm.controls[fieldName].setValue(value);
545
+ }
546
+ break;
547
+ }
548
+ if (tree_view_object && tree_view_object.field_name != "") {
549
+ let editeTreeModifyData = JSON.parse(JSON.stringify(tree_view_object));
550
+ const object = responce.selectedRow[editeTreeModifyData.field_name];
551
+ if (object) {
552
+ responce.templateForm.controls[editeTreeModifyData.field_name].setValue(object);
553
+ }
554
+ }
555
+ }
556
+ setCheckboxFileListValue(checkBoxFieldListValue, templateForm, staticData, selectedRow, updateMode) {
557
+ let result = {
558
+ templateForm: templateForm
559
+ };
560
+ checkBoxFieldListValue.forEach((element) => {
561
+ let checkCreatControl;
562
+ if (element.parent) {
563
+ checkCreatControl = result.templateForm.controls[element.parent].controls[element.field_name];
564
+ }
565
+ else {
566
+ checkCreatControl = result.templateForm.controls[element.field_name];
567
+ }
568
+ if (staticData[element.ddn_field] && checkCreatControl.controls && checkCreatControl.controls.length == 0) {
569
+ let checkArray;
570
+ if (element.parent) {
571
+ checkArray = result.templateForm.controls[element.parent].controls[element.field_name];
572
+ }
573
+ else {
574
+ checkArray = result.templateForm.controls[element.field_name];
575
+ }
576
+ staticData[element.ddn_field].forEach((data, i) => {
577
+ if (updateMode) {
578
+ let arrayData;
579
+ if (element.parent) {
580
+ arrayData = selectedRow[element.parent][element.field_name];
581
+ }
582
+ else {
583
+ arrayData = selectedRow[element.field_name];
584
+ }
585
+ let selected = false;
586
+ if (arrayData != undefined && arrayData != null) {
587
+ for (let index = 0; index < arrayData.length; index++) {
588
+ if (this.commonFunctionService.checkObjecOrString(data) == this.commonFunctionService.checkObjecOrString(arrayData[index])) {
589
+ selected = true;
590
+ break;
591
+ }
592
+ }
593
+ }
594
+ if (selected) {
595
+ checkArray.push(new UntypedFormControl(true));
596
+ }
597
+ else {
598
+ checkArray.push(new UntypedFormControl(false));
599
+ }
600
+ }
601
+ else {
602
+ checkArray.push(new UntypedFormControl(false));
603
+ }
604
+ });
605
+ }
606
+ });
607
+ return result.templateForm;
608
+ }
609
+ updateCustomizedValue(custmizedFormValue, index, value) {
610
+ let response = {
611
+ custmizedFormValue: custmizedFormValue
612
+ };
613
+ if (index !== null && index >= 0) {
614
+ response.custmizedFormValue[index] = value;
615
+ }
616
+ else {
617
+ response.custmizedFormValue.push(value);
618
+ }
619
+ return response;
620
+ }
621
+ editListOfString(parentfield, field, index, custmizedFormValue, templateForm) {
622
+ let response = {
623
+ templateForm: templateForm
624
+ };
625
+ let type = field.type;
626
+ let fieldName = field.field_name;
627
+ switch (type) {
628
+ case 'list_of_string':
629
+ const custmizedFormValueClone = Object.assign([], custmizedFormValue);
630
+ if (parentfield) {
631
+ const custmizedKey = parentfield ? this.commonFunctionService.custmizedKey(parentfield) : null;
632
+ const selectedValue = custmizedFormValueClone[custmizedKey][fieldName][index];
633
+ response.templateForm.controls[parentfield.field_name].controls[fieldName].setValue(selectedValue);
634
+ }
635
+ else {
636
+ const selectedValue = custmizedFormValueClone[fieldName][index];
637
+ response.templateForm.controls[fieldName].setValue(selectedValue);
638
+ }
639
+ break;
640
+ default:
641
+ break;
642
+ }
643
+ return response;
644
+ }
645
+ }
646
+ FormControlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormControlService, deps: [{ token: i1.CommonFunctionService }, { token: i2.FileHandlerService }, { token: i3.GridCommonFunctionService }, { token: i4.TreeComponentService }], target: i0.ɵɵFactoryTarget.Injectable });
647
+ FormControlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormControlService, providedIn: 'root' });
648
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormControlService, decorators: [{
649
+ type: Injectable,
650
+ args: [{
651
+ providedIn: 'root'
652
+ }]
653
+ }], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.FileHandlerService }, { type: i3.GridCommonFunctionService }, { type: i4.TreeComponentService }]; } });
654
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9sLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2Zvcm0vZm9ybS1jb250cm9sL2Zvcm0tY29udHJvbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFvQixrQkFBa0IsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBU3hGLE1BQU0sT0FBTyxrQkFBa0I7SUFFN0IsWUFDVSxxQkFBMkMsRUFDM0Msa0JBQXNDLEVBQ3RDLHlCQUFtRCxFQUNuRCxvQkFBeUM7UUFIekMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFzQjtRQUMzQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMEI7UUFDbkQseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtJQUMvQyxDQUFDO0lBRUwsa0JBQWtCLENBQUMsWUFBNkIsRUFBQyxrQkFBc0IsRUFBQyxXQUFlLEVBQUMsS0FBUyxFQUFDLEtBQVMsRUFBQyx1QkFBMkIsRUFBQyxVQUFjLEVBQUMsaUJBQXFCO1FBQzFLLElBQUksUUFBUSxHQUFHO1lBQ2IsdUJBQXVCLEVBQUMsSUFBSTtZQUM1Qix5QkFBeUIsRUFBQyx1QkFBdUI7WUFDakQsb0JBQW9CLEVBQUMsa0JBQWtCO1lBQ3ZDLG1CQUFtQixFQUFDLGlCQUFpQjtZQUNyQyxjQUFjLEVBQUMsWUFBWTtTQUM1QixDQUFBO1FBQ0QsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsUUFBUSxDQUFDLHVCQUF1QixHQUFH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QUFDLENBQUMsSUFBSSxDQUFDO29CQUM5RixNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUQsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7aUJBQ3hIO3FCQUFNO29CQUNMLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoRSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7aUJBQ2xFO2dCQUVILE1BQU07WUFDTjtnQkFDRSxNQUFNO1NBQ1Q7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztnSEF6bUJVLGtCQUFrQjtvSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlSGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9maWxlSGFuZGxlci9maWxlLWhhbmRsZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9ncmlkL2dyaWQtY29tbW9uLWZ1bmN0aW9uL2dyaWQtY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmVlQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3RyZWUtY29tcG9uZW50L3RyZWUtY29tcG9uZW50LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUNvbnRyb2xTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbW1vbkZ1bmN0aW9uU2VydmljZTpDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpbGVIYW5kbGVyU2VydmljZTogRmlsZUhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBncmlkQ29tbW9uRnVuY3Rpb25TZXJ2aWNlOkdyaWRDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIFRyZWVDb21wb25lbnRTZXJ2aWNlOlRyZWVDb21wb25lbnRTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgZWRpdGVMaXN0RmllbGREYXRhKHRlbXBsYXRlRm9ybTpVbnR5cGVkRm9ybUdyb3VwLGN1c3RtaXplZEZvcm1WYWx1ZTphbnksdGFibGVGaWVsZHM6YW55LGZpZWxkOmFueSxpbmRleDphbnksbGlzdE9mRmllbGRzVXBkYXRlSW5kZXg6YW55LHN0YXRpY0RhdGE6YW55LGRhdGFMaXN0Rm9yVXBsb2FkOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2UgPSB7XHJcbiAgICAgIFwibGlzdE9mRmllbGRVcGRhdGVNb2RlXCI6dHJ1ZSxcclxuICAgICAgXCJsaXN0T2ZGaWVsZHNVcGRhdGVJbmRleFwiOmxpc3RPZkZpZWxkc1VwZGF0ZUluZGV4LFxyXG4gICAgICBcImN1c3RtaXplZEZvcm1WYWx1ZVwiOmN1c3RtaXplZEZvcm1WYWx1ZSxcclxuICAgICAgXCJkYXRhTGlzdEZvclVwbG9hZFwiOmRhdGFMaXN0Rm9yVXBsb2FkLFxyXG4gICAgICBcInRlbXBsYXRlRm9ybVwiOnRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgbGV0IHBhcmVudExpc3QgPSByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICBsZXQgb2JqZWN0ID0gcGFyZW50TGlzdFtpbmRleF07XHJcbiAgICByZXNwb25jZS5saXN0T2ZGaWVsZHNVcGRhdGVJbmRleCA9IGluZGV4O1xyXG4gICAgaWYodGFibGVGaWVsZHMgJiYgdGFibGVGaWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRhYmxlRmllbGRzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgXCJsaXN0X29mX2ZpZWxkc1wiOlxyXG4gICAgICAgICAgICBpZihlbGVtZW50LmZpZWxkX25hbWUgPT0gZmllbGQuZmllbGRfbmFtZSAmJiB0ZW1wbGF0ZUZvcm0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV0ucmVzZXQoKTtcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0bWlzZWRLZXkgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWlzZWRLZXldKSByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbY3VzdG1pc2VkS2V5XSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2N1c3RtaXNlZEtleV1bZGF0YS5maWVsZF9uYW1lXSA9IG9iamVjdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZGF0YXR5cGUgPT0gJ2xpc3Rfb2Zfb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0bWlzZWRLZXkgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2N1c3RtaXNlZEtleV0pIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWlzZWRLZXldID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWlzZWRLZXldW2RhdGEuZmllbGRfbmFtZV0gPSBvYmplY3RbZGF0YS5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrYm94TGlzdFZhbHVlOmFueSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdGljRGF0YSAmJiBzdGF0aWNEYXRhW2RhdGEuZGRuX2ZpZWxkXSAmJiBzdGF0aWNEYXRhW2RhdGEuZGRuX2ZpZWxkXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljRGF0YVtkYXRhLmRkbl9maWVsZF0uZm9yRWFjaCgodmFsdWU6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5RGF0YSA9IG9iamVjdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheURhdGEgIT0gdW5kZWZpbmVkICYmIGFycmF5RGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlEYXRhLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuY2hlY2tPYmplY09yU3RyaW5nKHZhbHVlKSA9PSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jaGVja09iamVjT3JTdHJpbmcoYXJyYXlEYXRhW2luZGV4XSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveExpc3RWYWx1ZS5wdXNoKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveExpc3RWYWx1ZS5wdXNoKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnRlbXBsYXRlRm9ybS5nZXQoZWxlbWVudC5maWVsZF9uYW1lKS5nZXQoZGF0YS5maWVsZF9uYW1lKS5zZXRWYWx1ZShjaGVja2JveExpc3RWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV0pLmNvbnRyb2xzW2RhdGEuZmllbGRfbmFtZV0uc2V0VmFsdWUoY2hlY2tib3hMaXN0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW5wdXRfd2l0aF91cGxvYWRmaWxlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXN0bWl6ZWRLZXkgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuZGF0YUxpc3RGb3JVcGxvYWRbY3VzdG1pemVkS2V5XSkgcmVzcG9uY2UuZGF0YUxpc3RGb3JVcGxvYWRbY3VzdG1pemVkS2V5XSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbmNlLmRhdGFMaXN0Rm9yVXBsb2FkW2N1c3RtaXplZEtleV1bZGF0YS5maWVsZF9uYW1lXSkgcmVzcG9uY2UuZGF0YUxpc3RGb3JVcGxvYWRbY3VzdG1pemVkS2V5XVtkYXRhLmZpZWxkX25hbWVdID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5kYXRhTGlzdEZvclVwbG9hZFtjdXN0bWl6ZWRLZXldW2RhdGEuZmllbGRfbmFtZV0gPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlVcGxvYWRGaWxlcyhKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc3BvbmNlLmRhdGFMaXN0Rm9yVXBsb2FkW2N1c3RtaXplZEtleV1bZGF0YS5maWVsZF9uYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlGaWxlU2V0VmFsdWUob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMudGVtcGxhdGVGb3JtLmdldChlbGVtZW50LmZpZWxkX25hbWUpLmdldChkYXRhLmZpZWxkX25hbWUpLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMudGVtcGxhdGVGb3JtLmdldChlbGVtZW50LmZpZWxkX25hbWUpLmdldChkYXRhLmZpZWxkX25hbWUpLnNldFZhbHVlKG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuICB1cGRhdGVEYXRhT25Gb3JtKHRlbXBsYXRlRm9ybTpVbnR5cGVkRm9ybUdyb3VwLHRhYmxlRmllbGRzOmFueSxmb3JtVmFsdWU6YW55LGZvcm1GaWVsZEJ1dHRvbnM6YW55LGN1c3RtaXplZEZvcm1WYWx1ZTphbnksbW9kaWZ5Q3VzdG1pemVkRm9ybVZhbHVlOmFueSxzZWxlY3RlZFJvdzphbnksZGF0YUxpc3RGb3JVcGxvYWQ6YW55LHRyZWVWaWV3RGF0YTphbnksc3RhdGljRGF0YTphbnksbG9uZ2l0dWRlOmFueSxsYXRpdHVkZTphbnksem9vbTphbnkpe1xyXG4gICAgbGV0IHJlc3BvbmNlID17XHJcbiAgICAgIHRlbXBsYXRlRm9ybTp0ZW1wbGF0ZUZvcm0sXHJcbiAgICAgIGN1c3RtaXplZEZvcm1WYWx1ZTpjdXN0bWl6ZWRGb3JtVmFsdWUsXHJcbiAgICAgIG1vZGlmeUN1c3RtaXplZEZvcm1WYWx1ZTptb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWUsXHJcbiAgICAgIHRhYmxlRmllbGRzOnRhYmxlRmllbGRzLFxyXG4gICAgICBkYXRhTGlzdEZvclVwbG9hZDpkYXRhTGlzdEZvclVwbG9hZCxcclxuICAgICAgc2VsZWN0ZWRSb3c6c2VsZWN0ZWRSb3csXHJcbiAgICAgIHRyZWVWaWV3RGF0YTp0cmVlVmlld0RhdGEsXHJcbiAgICAgIHN0YXRpY0RhdGE6c3RhdGljRGF0YSxcclxuICAgICAgbG9uZ2l0dWRlOmxvbmdpdHVkZSxcclxuICAgICAgbGF0aXR1ZGU6bGF0aXR1ZGUsXHJcbiAgICAgIHpvb206em9vbSxcclxuICAgICAgZ2V0QWRkcmVzczpmYWxzZVxyXG5cclxuICAgIH1cclxuICAgIHRhYmxlRmllbGRzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5maWVsZF9uYW1lICYmIGVsZW1lbnQuZmllbGRfbmFtZSAhPSAnJyl7XHJcbiAgICAgICAgbGV0IGZpZWxkTmFtZSA9IGVsZW1lbnQuZmllbGRfbmFtZTtcclxuICAgICAgICBsZXQgb2JqZWN0ID0gZm9ybVZhbHVlW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZShlbGVtZW50LGZvcm1WYWx1ZSxyZXNwb25jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmKGZvcm1GaWVsZEJ1dHRvbnMubGVuZ3RoID4gMCl7XHJcbiAgICAgIGZvcm1GaWVsZEJ1dHRvbnMuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBsZXQgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGxldCBvYmplY3QgPSBzZWxlY3RlZFJvd1tmaWVsZE5hbWVdO1xyXG4gICAgICAgIGlmKGZvcm1WYWx1ZVtmaWVsZE5hbWVdICE9IG51bGwgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgXCJkcm9wZG93blwiOlxyXG4gICAgICAgICAgICAgICAgbGV0IGRyb3Bkb3duVmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiBvYmplY3Q7XHJcbiAgICAgICAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXS5zZXRWYWx1ZShkcm9wZG93blZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIHVwZGF0ZUZvcm1WYWx1ZShlbGVtZW50OmFueSxmb3JtVmFsdWU6YW55LHJlc3BvbmNlOmFueSl7XHJcbiAgICBsZXQgdHlwZSA9IGVsZW1lbnQudHlwZTtcclxuICAgIGxldCBkYXRhdHlwZSA9IGVsZW1lbnQuZGF0YXR5cGU7XHJcbiAgICBsZXQgdHJlZV92aWV3X29iamVjdCA9IGVsZW1lbnQudHJlZV92aWV3X29iamVjdDtcclxuICAgIGxldCBkYXRlX2Zvcm1hdCA9IGVsZW1lbnQuZGF0ZV9mb3JtYXQ7XHJcbiAgICBsZXQgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgbGV0IGRkbl9maWVsZCA9IGVsZW1lbnQuZGRuX2ZpZWxkO1xyXG4gICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50O1xyXG4gICAgbGV0IGxpc3Rfb2ZfZmllbGRzID0gZWxlbWVudC5saXN0X29mX2ZpZWxkcztcclxuICAgIGxldCBvYmplY3QgPSBmb3JtVmFsdWVbZmllbGROYW1lXTtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlIFwiZ3JpZF9zZWxlY3Rpb25cIjpcclxuICAgICAgY2FzZSAnZ3JpZF9zZWxlY3Rpb25fdmVydGljYWwnOlxyXG4gICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgY2FzZSBcImRyYWdfZHJvcFwiOlxyXG4gICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShvYmplY3QpKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdCkpO1xyXG4gICAgICAgICAgICBpZih0eXBlLnN0YXJ0c1dpdGgoXCJncmlkX3NlbGVjdGlvblwiKSl7XHJcbiAgICAgICAgICAgICAgY29uc3QgbW9kaWZ5RGF0YSA9IHRoaXMuZ3JpZENvbW1vbkZ1bmN0aW9uU2VydmljZS5ncmlkRGF0YU1vZGlmeShyZXNwb25jZS5tb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWUscmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlLHJlc3BvbmNlLnRhYmxlRmllbGRzLGZpZWxkTmFtZSxcImdyaWRfc2VsZWN0aW9uXCIsZm9ybVZhbHVlKTtcclxuICAgICAgICAgICAgICByZXNwb25jZS5tb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWUgPSBtb2RpZnlEYXRhLm1vZGlmeURhdGE7XHJcbiAgICAgICAgICAgICAgaWYobW9kaWZ5RGF0YS5maWVsZF9pbmRleCAhPSAtMSl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG1vZGlmeURhdGEuZmllbGRfaW5kZXg7XHJcbiAgICAgICAgICAgICAgICByZXNwb25jZS50YWJsZUZpZWxkc1tpbmRleF0gPSBtb2RpZnlEYXRhLmZpZWxkc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSgnJylcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgIGNhc2UgXCJpbnB1dF93aXRoX3VwbG9hZGZpbGVcIjpcclxuICAgICAgY2FzZSBcImZpbGVfZm9yX3MzXCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICByZXNwb25jZS5kYXRhTGlzdEZvclVwbG9hZFtmaWVsZE5hbWVdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3QpKTtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UubW9kaWZ5RmlsZVNldFZhbHVlKG9iamVjdCk7XHJcbiAgICAgICAgICBpZih0eXBlID09ICdpbnB1dF93aXRoX3VwbG9hZGZpbGUnKXtcclxuICAgICAgICAgICAgbGV0IHRvb2x0aXBNc2cgPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5nZXRGaWxlVG9vbHRpcE1zZyhvYmplY3QpO1xyXG4gICAgICAgICAgICBlbGVtZW50Wyd0b29sdGlwTXNnJ10gPSB0b29sdGlwTXNnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImxpc3Rfb2ZfZmllbGRzXCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICBpZihBcnJheS5pc0FycmF5KG9iamVjdCkpe1xyXG4gICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSk7XHJcbiAgICAgICAgICAgIGxldCBtb2RpZnlPYmplY3QgPSB0aGlzLmdyaWRDb21tb25GdW5jdGlvblNlcnZpY2UubW9kaWZ5TGlzdG9mRmllbGRzRGF0YShlbGVtZW50LHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdLGVsZW1lbnQubGlzdF9vZl9maWVsZHMpO1xyXG4gICAgICAgICAgICByZXNwb25jZS5tb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IG1vZGlmeU9iamVjdFsnZGF0YSddO1xyXG4gICAgICAgICAgfWVsc2UgaWYodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIGRhdGF0eXBlID09ICdrZXlfdmFsdWUnKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0gPSBvYmplY3Q7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgaWYobGlzdF9vZl9maWVsZHMgJiYgbGlzdF9vZl9maWVsZHMgIT0gbnVsbCAmJiBsaXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICBsaXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSxqOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICdncmlkX3NlbGVjdGlvbl92ZXJ0aWNhbCc6XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkcmFnX2Ryb3BcIjpcclxuICAgICAgICAgICAgICAgICAgICBpZihvYmplY3QgJiYgb2JqZWN0W2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdKSByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8oPEZvcm1Hcm91cD50aGlzLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnBhdGNoVmFsdWUoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZGF0YXR5cGUgPT0gXCJsaXN0X29mX29iamVjdFwiIHx8IGRhdGF0eXBlID09ICdjaGlwcycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYob2JqZWN0ICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IG51bGwgJiYgb2JqZWN0W2RhdGEuZmllbGRfbmFtZV0gIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0pIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2RhdGEuZmllbGRfbmFtZV0uc2V0VmFsdWUoJycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5wYXRjaFZhbHVlKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKG9iamVjdCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0W2RhdGEuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8oPEZvcm1Hcm91cD50aGlzLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcImlucHV0X3dpdGhfdXBsb2FkZmlsZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQgJiYgb2JqZWN0W2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGN1c3RtaXNlZEtleSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmN1c3RtaXplZEtleShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmRhdGFMaXN0Rm9yVXBsb2FkW2N1c3RtaXNlZEtleV1bZGF0YS5maWVsZF9uYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UubW9kaWZ5RmlsZVNldFZhbHVlKG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sdGlwTXNnID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UuZ2V0RmlsZVRvb2x0aXBNc2cob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkc1tqXVsndG9vbHRpcE1zZyddID0gdG9vbHRpcE1zZztcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9iamVjdCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8oPEZvcm1Hcm91cD50aGlzLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgIGlmKGRhdGF0eXBlID09IFwibGlzdF9vZl9vYmplY3RcIiB8fCBkYXRhdHlwZSA9PSAnY2hpcHMnKXtcclxuICAgICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSk7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0O1xyXG4gICAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICBpZihsaXN0X29mX2ZpZWxkcyAmJiBsaXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGRhdGE6YW55LGo6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBDaGlsZEZpZWxkRGF0YSA9IG9iamVjdDtcclxuICAgICAgICAgICAgbGV0IGNoaWxkRmllbGROYW1lID0gZGF0YS5maWVsZF9uYW1lO1xyXG4gICAgICAgICAgICBpZihkYXRhICYmIGNoaWxkRmllbGROYW1lICYmIGNoaWxkRmllbGROYW1lICE9ICcnICYmIENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZ3JpZF9zZWxlY3Rpb25fdmVydGljYWwnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImRyYWdfZHJvcFwiOlxyXG4gICAgICAgICAgICAgICAgICBpZihDaGlsZEZpZWxkRGF0YSAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gdW5kZWZpbmVkICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSkgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV1bY2hpbGRGaWVsZE5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnRlbXBsYXRlRm9ybS5nZXQoZmllbGROYW1lKS5nZXQoY2hpbGRGaWVsZE5hbWUpLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoJycpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICBpZihkYXRhLmRhdGF0eXBlID09IFwibGlzdF9vZl9vYmplY3RcIiB8fCBkYXRhLmRhdGF0eXBlID09ICdjaGlwcycpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSBudWxsICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSB1bmRlZmluZWQgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0pIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXVtjaGlsZEZpZWxkTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoQ2hpbGRGaWVsZERhdGEgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgICAgICAgICAgaWYoQ2hpbGRGaWVsZERhdGEgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBndmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBndmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGd2YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKGd2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAvLyg8Rm9ybUdyb3VwPnRoaXMudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5wYXRjaFZhbHVlKGd2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhLmhhc093blByb3BlcnR5KGNoaWxkRmllbGROYW1lKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGd2YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUoZ3ZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2ZfY2hlY2tib3hcIjpcclxuICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0ucGF0Y2hWYWx1ZShbXSlcclxuICAgICAgICAgICAgICAgICAgaWYocGFyZW50KXtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5zZWxlY3RlZFJvd1twYXJlbnRdID0ge31cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5zZWxlY3RlZFJvd1twYXJlbnRdW2ZpZWxkTmFtZV0gPSBDaGlsZEZpZWxkRGF0YTtcclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2Uuc2VsZWN0ZWRSb3dbZmllbGROYW1lXSA9IENoaWxkRmllbGREYXRhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoW10pO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICAgIGlmKENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSBudWxsICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSB1bmRlZmluZWQgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmRhdGVfZm9ybWF0ICYmIGRhdGEuZGF0ZV9mb3JtYXQgIT1cIlwiICYmIHR5cGVvZiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gPT09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlTW9udGhZZWFyID0gZGF0ZS5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ZWREYXRlID0gZGF0ZU1vbnRoWWVhclsyXStcIi1cIitkYXRlTW9udGhZZWFyWzFdK1wiLVwiK2RhdGVNb250aFllYXJbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBEYXRlKGZvcm1hdGVkRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVZhbHVlW2ZpZWxkTmFtZV1bY2hpbGRGaWVsZE5hbWVdID09IG51bGwgPyBudWxsIDogZm9ybVZhbHVlW2ZpZWxkTmFtZV1bY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dF93aXRoX3VwbG9hZGZpbGVcIjpcclxuICAgICAgICAgICAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1c3RtaXNlZEtleSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmN1c3RtaXplZEtleShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5kYXRhTGlzdEZvclVwbG9hZFtjdXN0bWlzZWRLZXldW2RhdGEuZmllbGRfbmFtZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlGaWxlU2V0VmFsdWUob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b29sdGlwTXNnID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UuZ2V0RmlsZVRvb2x0aXBNc2cob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal1bJ3Rvb2x0aXBNc2cnXSA9IHRvb2x0aXBNc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgaWYoQ2hpbGRGaWVsZERhdGEgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidHJlZV92aWV3X3NlbGVjdGlvblwiOlxyXG4gICAgICAgIGlmKGZvcm1WYWx1ZVtmaWVsZE5hbWVdICE9IG51bGwgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIHJlc3BvbmNlLnRyZWVWaWV3RGF0YVtmaWVsZE5hbWVdID0gW107XHJcbiAgICAgICAgICBsZXQgdHJlZURyb3Bkb3duVmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiBvYmplY3Q7XHJcbiAgICAgICAgICBpZih0cmVlRHJvcGRvd25WYWx1ZSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UudHJlZVZpZXdEYXRhW2ZpZWxkTmFtZV0ucHVzaChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRyZWVEcm9wZG93blZhbHVlKSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUodHJlZURyb3Bkb3duVmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidHJlZV92aWV3XCI6XHJcbiAgICAgICAgaWYoZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbZmllbGROYW1lXSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgbGV0IHRyZWVWYWx1ZSA9IG9iamVjdCA9PSBudWxsID8gbnVsbCA6IG9iamVjdDtcclxuICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKHRyZWVWYWx1ZSk7XHJcbiAgICAgICAgICBpZih0cmVlVmFsdWUpe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5UcmVlQ29tcG9uZW50U2VydmljZS51cGRhdGVUcmVlVmlld0RhdGEoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmVlVmFsdWUpKSxKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpKSxyZXNwb25jZS50cmVlVmlld0RhdGEpO1xyXG4gICAgICAgICAgICByZXNwb25jZS50cmVlVmlld0RhdGEgPXJlc3VsdC50cmVlVmlld0RhdGE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwic3RlcHBlclwiOlxyXG4gICAgICAgIGlmKGxpc3Rfb2ZfZmllbGRzICYmIGxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgbGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoc3RlcDphbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoc3RlcC5saXN0X29mX2ZpZWxkcyAmJiBzdGVwLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIHN0ZXAubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZEZpZWxkTmFtZSA9IGRhdGEuZmllbGRfbmFtZTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZ3JpZF9zZWxlY3Rpb25cIjpcclxuICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JpZF9zZWxlY3Rpb25fdmVydGljYWwnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZGF0YXR5cGUgPT0gXCJsaXN0X29mX29iamVjdFwiIHx8IGRhdGEuZGF0YXR5cGUgPT0gJ2NoaXBzJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgZm9ybVZhbHVlW2NoaWxkRmllbGROYW1lXSAhPSB1bmRlZmluZWQgJiYgZm9ybVZhbHVlW2NoaWxkRmllbGROYW1lXSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW3N0ZXAuZmllbGRfbmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3ZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGd2YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGd2YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW3N0ZXAuZmllbGRfbmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZShndmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVZhbHVlW2NoaWxkRmllbGROYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZihkYXRhLnRyZWVfdmlld19vYmplY3QgJiYgZGF0YS50cmVlX3ZpZXdfb2JqZWN0LmZpZWxkX25hbWUgIT0gXCJcIil7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBlZGl0ZVRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZU9iamVjdCA9IHJlc3BvbmNlLnNlbGVjdGVkUm93W2VkaXRlVHJlZU1vZGlmeURhdGEuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbZWRpdGVUcmVlTW9kaWZ5RGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZSh0cmVlT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgbGV0IHZhbHVlO1xyXG4gICAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9ICcnKXtcclxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Q7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgfWVsc2UgaWYob2JqZWN0ID09IDApe1xyXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdDtcclxuICAgICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImdtYXBcIjpcclxuICAgICAgY2FzZSBcImdtYXB2aWV3XCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICBpZihmb3JtVmFsdWVbJ2xvbmdpdHVkZSddKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UubG9uZ2l0dWRlID0gZm9ybVZhbHVlWydsb25naXR1ZGUnXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGZvcm1WYWx1ZVsnbGF0aXR1ZGUnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLmxhdGl0dWRlID0gZm9ybVZhbHVlWydsYXRpdHVkZSddO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoZm9ybVZhbHVlWyd6b29tJ10pe1xyXG4gICAgICAgICAgICByZXNwb25jZS56b29tID0gZm9ybVZhbHVlWyd6b29tJ107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihyZXNwb25jZS5sb25naXR1ZGUgIT0gMCAmJiByZXNwb25jZS5sYXRpdHVkZSAhPSAwKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuZ2V0QWRkcmVzcyA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vdGhpcy5nZXRBZGRyZXNzKHJlc3BvbmNlLmxhdGl0dWRlLHJlc3BvbmNlLmxvbmdpdHVkZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKG9iamVjdClcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJkYXRlcmFuZ2VcIjpcclxuICAgICAgICBpZihvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIGxldCBsaXN0X29mX2RhdGVzID0gW1xyXG4gICAgICAgICAgICB7ZmllbGRfbmFtZSA6ICdzdGFydCd9LFxyXG4gICAgICAgICAgICB7ZmllbGRfbmFtZSA6ICdlbmQnfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgaWYgKGxpc3Rfb2ZfZGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsaXN0X29mX2RhdGVzLmZvckVhY2goKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgY2hpbGRGaWVsZE5hbWUgPSBkYXRhLmZpZWxkX25hbWU7XHJcbiAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUob2JqZWN0W2NoaWxkRmllbGROYW1lXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgICBpZihvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIGlmKGRhdGVfZm9ybWF0ICYmIGRhdGVfZm9ybWF0ICE9ICcnICYmIHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG9iamVjdFtmaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlTW9udGhZZWFyID0gZGF0ZS5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRlZERhdGUgPSBkYXRlTW9udGhZZWFyWzJdK1wiLVwiK2RhdGVNb250aFllYXJbMV0rXCItXCIrZGF0ZU1vbnRoWWVhclswXTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXRlZERhdGUpO1xyXG4gICAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1WYWx1ZVtmaWVsZE5hbWVdID09IG51bGwgPyBudWxsIDogZm9ybVZhbHVlW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJ0YWJ1bGFyX2RhdGFfc2VsZWN0b3JcIjpcclxuICAgICAgICBpZihvYmplY3QgIT0gdW5kZWZpbmVkICYmIG9iamVjdCAhPSBudWxsKXtcclxuICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3QpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25jZS5zdGF0aWNEYXRhW2Rkbl9maWVsZF0pICYmIEFycmF5LmlzQXJyYXkocmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0pKXtcclxuICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdLmZvckVhY2goKHN0YURhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlc3BvbmNlLnN0YXRpY0RhdGFbZGRuX2ZpZWxkXVtzdGFEYXRhLl9pZF0pe1xyXG4gICAgICAgICAgICAgIHJlc3BvbmNlLnN0YXRpY0RhdGFbZGRuX2ZpZWxkXVtzdGFEYXRhLl9pZF0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJsaXN0X29mX2NoZWNrYm94XCI6XHJcbiAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUoW10pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiBvYmplY3Q7XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHRyZWVfdmlld19vYmplY3QgJiYgdHJlZV92aWV3X29iamVjdC5maWVsZF9uYW1lICE9IFwiXCIpe1xyXG4gICAgICBsZXQgZWRpdGVUcmVlTW9kaWZ5RGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHJlZV92aWV3X29iamVjdCkpO1xyXG4gICAgICBjb25zdCBvYmplY3QgPSByZXNwb25jZS5zZWxlY3RlZFJvd1tlZGl0ZVRyZWVNb2RpZnlEYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICBpZihvYmplY3Qpe1xyXG4gICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlZGl0ZVRyZWVNb2RpZnlEYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKG9iamVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBzZXRDaGVja2JveEZpbGVMaXN0VmFsdWUoY2hlY2tCb3hGaWVsZExpc3RWYWx1ZTphbnksdGVtcGxhdGVGb3JtOlVudHlwZWRGb3JtR3JvdXAsc3RhdGljRGF0YTphbnksc2VsZWN0ZWRSb3c6YW55LHVwZGF0ZU1vZGU6Ym9vbGVhbikge1xyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgdGVtcGxhdGVGb3JtOnRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgY2hlY2tCb3hGaWVsZExpc3RWYWx1ZS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBsZXQgY2hlY2tDcmVhdENvbnRyb2w6IGFueTtcclxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50KSB7XHJcbiAgICAgICAgY2hlY2tDcmVhdENvbnRyb2wgPSAoPFVudHlwZWRGb3JtR3JvdXA+cmVzdWx0LnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LnBhcmVudF0pLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2hlY2tDcmVhdENvbnRyb2wgPSByZXN1bHQudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN0YXRpY0RhdGFbZWxlbWVudC5kZG5fZmllbGRdICYmIGNoZWNrQ3JlYXRDb250cm9sLmNvbnRyb2xzICYmIGNoZWNrQ3JlYXRDb250cm9sLmNvbnRyb2xzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgbGV0IGNoZWNrQXJyYXk6IFVudHlwZWRGb3JtQXJyYXk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50KSB7XHJcbiAgICAgICAgICBjaGVja0FycmF5ID0gKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3VsdC50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5wYXJlbnRdKS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdIGFzIFVudHlwZWRGb3JtQXJyYXk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNoZWNrQXJyYXkgPSByZXN1bHQudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV0gYXMgVW50eXBlZEZvcm1BcnJheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RhdGljRGF0YVtlbGVtZW50LmRkbl9maWVsZF0uZm9yRWFjaCgoZGF0YTphbnksIGk6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodXBkYXRlTW9kZSkge1xyXG4gICAgICAgICAgICBsZXQgYXJyYXlEYXRhO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICBhcnJheURhdGEgPSBzZWxlY3RlZFJvd1tlbGVtZW50LnBhcmVudF1bZWxlbWVudC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBhcnJheURhdGEgPSBzZWxlY3RlZFJvd1tlbGVtZW50LmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoYXJyYXlEYXRhICE9IHVuZGVmaW5lZCAmJiBhcnJheURhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheURhdGEubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuY2hlY2tPYmplY09yU3RyaW5nKGRhdGEpID09IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmNoZWNrT2JqZWNPclN0cmluZyhhcnJheURhdGFbaW5kZXhdKSkge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICBjaGVja0FycmF5LnB1c2gobmV3IFVudHlwZWRGb3JtQ29udHJvbCh0cnVlKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2hlY2tBcnJheS5wdXNoKG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2hlY2tBcnJheS5wdXNoKG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZmFsc2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzdWx0LnRlbXBsYXRlRm9ybTtcclxuICB9XHJcblxyXG5cclxuICB1cGRhdGVDdXN0b21pemVkVmFsdWUoY3VzdG1pemVkRm9ybVZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcclxuICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgY3VzdG1pemVkRm9ybVZhbHVlOiBjdXN0bWl6ZWRGb3JtVmFsdWVcclxuICAgIH1cclxuICAgIGlmIChpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA+PSAwKSB7XHJcbiAgICAgIHJlc3BvbnNlLmN1c3RtaXplZEZvcm1WYWx1ZVtpbmRleF0gPSB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3BvbnNlLmN1c3RtaXplZEZvcm1WYWx1ZS5wdXNoKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZVxyXG4gIH1cclxuXHJcbiAgZWRpdExpc3RPZlN0cmluZyhwYXJlbnRmaWVsZDogYW55LGZpZWxkOiBhbnksaW5kZXg6IG51bWJlcixjdXN0bWl6ZWRGb3JtVmFsdWU6IGFueSwgdGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwICkge1xyXG4gICAgbGV0IHJlc3BvbnNlID0ge1xyXG4gICAgICB0ZW1wbGF0ZUZvcm06IHRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgbGV0IHR5cGUgPSBmaWVsZC50eXBlO1xyXG4gICAgbGV0IGZpZWxkTmFtZSA9IGZpZWxkLmZpZWxkX25hbWVcclxuICAgIHN3aXRjaCh0eXBlKXtcclxuICAgICAgY2FzZSAnbGlzdF9vZl9zdHJpbmcnOlxyXG4gICAgICAgIGNvbnN0IGN1c3RtaXplZEZvcm1WYWx1ZUNsb25lID0gT2JqZWN0LmFzc2lnbihbXSxjdXN0bWl6ZWRGb3JtVmFsdWUpO1xyXG4gICAgICAgIGlmIChwYXJlbnRmaWVsZCkge1xyXG4gICAgICAgICAgY29uc3QgY3VzdG1pemVkS2V5ID0gcGFyZW50ZmllbGQgPyB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkocGFyZW50ZmllbGQpOiBudWxsO1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IGN1c3RtaXplZEZvcm1WYWx1ZUNsb25lW2N1c3RtaXplZEtleV1bZmllbGROYW1lXVtpbmRleF07XHJcbiAgICAgICAgICAoIDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbnNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1twYXJlbnRmaWVsZC5maWVsZF9uYW1lXSkuY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gY3VzdG1pemVkRm9ybVZhbHVlQ2xvbmVbZmllbGROYW1lXVtpbmRleF07XHJcbiAgICAgICAgICByZXNwb25zZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG59XHJcbiJdfQ==