@rangertechnologies/ngnxt 2.1.254 → 2.1.255-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rangertechnologies-ngnxt.mjs +135 -166
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/pick-location/pick-location.component.d.ts +0 -1
- package/package.json +4 -6
- package/rangertechnologies-ngnxt-2.1.255-beta.tgz +0 -0
- package/esm2022/environments/version.mjs +0 -15
- package/esm2022/lib/components/button/nxt-button.component.mjs +0 -154
- package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -360
- package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -263
- package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -53
- package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -158
- package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1744
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
- package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -106
- package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
- package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
- package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
- package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
- package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
- package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
- package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
- package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
- package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
- package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
- package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -392
- package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2972
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -105
- package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -220
- package/esm2022/lib/components/search-box/search-box.component.mjs +0 -470
- package/esm2022/lib/country.json +0 -43237
- package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
- package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
- package/esm2022/lib/model/bookletWrapper.mjs +0 -7
- package/esm2022/lib/model/changeWrapper.mjs +0 -10
- package/esm2022/lib/model/errorWrapper.mjs +0 -6
- package/esm2022/lib/nxt-app.component.mjs +0 -22
- package/esm2022/lib/nxt-app.module.mjs +0 -115
- package/esm2022/lib/nxt-app.service.mjs +0 -14
- package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -616
- package/esm2022/lib/pages/builder/element/element.component.mjs +0 -483
- package/esm2022/lib/pages/builder/form/form.component.mjs +0 -48
- package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -97
- package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1121
- package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
- package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -639
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1114
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -784
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2206
- package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
- package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -37
- package/esm2022/lib/pipe/get-value.pipe.mjs +0 -54
- package/esm2022/lib/pipe/question-by-row.pipe.mjs +0 -51
- package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -40
- package/esm2022/lib/pipe/svg/svg.pipe.mjs +0 -26
- package/esm2022/lib/sample.mjs +0 -3715
- package/esm2022/lib/services/change/change.service.mjs +0 -46
- package/esm2022/lib/services/country/country.service.mjs +0 -135
- package/esm2022/lib/services/data/data.service.mjs +0 -100
- package/esm2022/lib/services/form-builder/form-builder.service.mjs +0 -474
- package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -395
- package/esm2022/lib/services/salesforce/salesforce.service.mjs +0 -41
- package/esm2022/lib/services/shared/shared.service.mjs +0 -100
- package/esm2022/lib/services/storage/storage.service.mjs +0 -59
- package/esm2022/lib/services/template/template.service.mjs +0 -335
- package/esm2022/lib/services/translation/translation.service.mjs +0 -121
- package/esm2022/lib/wrapper.mjs +0 -175
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
- package/rangertechnologies-ngnxt-2.1.254.tgz +0 -0
|
@@ -1,474 +0,0 @@
|
|
|
1
|
-
// AP 22JAN25
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject } from 'rxjs';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/common/http";
|
|
6
|
-
export class FormBuilderService {
|
|
7
|
-
http;
|
|
8
|
-
formElements = [];
|
|
9
|
-
formElementsSubject = new BehaviorSubject([]);
|
|
10
|
-
selectedElementSubject = new BehaviorSubject(-1);
|
|
11
|
-
selectHeaderSubject = new BehaviorSubject(null);
|
|
12
|
-
actionSubject = new BehaviorSubject(null);
|
|
13
|
-
elementComponent = null;
|
|
14
|
-
book;
|
|
15
|
-
unique_id;
|
|
16
|
-
tempElem;
|
|
17
|
-
formElements$ = this.formElementsSubject.asObservable();
|
|
18
|
-
selectedElement$ = this.selectedElementSubject.asObservable();
|
|
19
|
-
selectHeaderSubject$ = this.selectHeaderSubject.asObservable();
|
|
20
|
-
actionSubject$ = this.actionSubject.asObservable();
|
|
21
|
-
currentElement;
|
|
22
|
-
selectTableColumn;
|
|
23
|
-
// book: { bookQuestionsMap: { unique_id: { subQuestions: any[]; }; }; };
|
|
24
|
-
constructor(http) {
|
|
25
|
-
this.http = http;
|
|
26
|
-
// Load saved elements from localStorage
|
|
27
|
-
this.formElements = [];
|
|
28
|
-
const savedFormElements = localStorage.getItem('formElements');
|
|
29
|
-
if (savedFormElements) {
|
|
30
|
-
this.formElements = JSON.parse(savedFormElements);
|
|
31
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
intializeBook(book) {
|
|
35
|
-
// AP 13MAR25 - Get the unique id in the bookQuestionsMap
|
|
36
|
-
this.unique_id = Object.keys(book.bookQuestionsMap)[0];
|
|
37
|
-
let tempbook = book.bookQuestionsMap[this.unique_id].subQuestions;
|
|
38
|
-
// SKS28MAR25 update nested book QuestionsMap
|
|
39
|
-
tempbook.forEach((element) => {
|
|
40
|
-
if (element.type === "book" && element.qbReference) {
|
|
41
|
-
this.getRefQbData(element.qbReference).subscribe((response) => {
|
|
42
|
-
element['qbReferenceQuestions'] = response; // Assign response to qbReferenceQuestions
|
|
43
|
-
}, (error) => {
|
|
44
|
-
console.error("API Error:", error);
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
book.bookQuestionsMap[this.unique_id].subQuestions = tempbook;
|
|
49
|
-
this.book = book;
|
|
50
|
-
this.book.bookQuestionsMap[this.unique_id]?.subQuestions?.forEach(element => {
|
|
51
|
-
this.addElement(element);
|
|
52
|
-
});
|
|
53
|
-
let translationMap = { en: {} };
|
|
54
|
-
const keysToTranslate = ['questionText', 'helpText', 'question', 'label'];
|
|
55
|
-
this.book.bookQuestionsMap[this.unique_id]?.subQuestions?.forEach(element => {
|
|
56
|
-
translationMap.en[element.id] = {};
|
|
57
|
-
keysToTranslate.forEach(key => {
|
|
58
|
-
if (element[key] !== undefined && element[key] !== null && typeof element[key] === 'string') {
|
|
59
|
-
translationMap.en[element.id][key] = element[key];
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
if (element?.['options'] !== undefined && element?.['options'] !== null && Array.isArray(element['options'])) {
|
|
63
|
-
element['options'].forEach(opt => {
|
|
64
|
-
if (opt.label !== undefined && opt.label !== null && typeof opt.label === 'string') {
|
|
65
|
-
translationMap.en[opt.id] = translationMap.en[opt.id] ?? {};
|
|
66
|
-
translationMap.en[opt.id]['label'] = opt.label;
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
if (element.type === 'Table' && element?.fieldsMeta) {
|
|
71
|
-
if (!Array.isArray(element?.fieldsMeta) && typeof element?.fieldsMeta === 'string') {
|
|
72
|
-
element.fieldsMeta = JSON.parse(element?.fieldsMeta);
|
|
73
|
-
}
|
|
74
|
-
element?.fieldsMeta?.forEach(field => {
|
|
75
|
-
translationMap.en[field.uniqueIdentifier] = {};
|
|
76
|
-
keysToTranslate.forEach(key => {
|
|
77
|
-
if (field[key] !== undefined && field[key] !== null && typeof field[key] === 'string') {
|
|
78
|
-
if (key !== 'question')
|
|
79
|
-
translationMap.en[field.uniqueIdentifier][key] = field[key];
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
if (field?.question?.['options'] !== undefined && field?.question?.['options'] !== null && Array.isArray(field?.question?.['options'])) {
|
|
83
|
-
field.question['options'].forEach(opt => {
|
|
84
|
-
if (opt.label !== undefined && opt.label !== null && typeof opt.label === 'string') {
|
|
85
|
-
translationMap.en[opt.id] = translationMap.en[opt.id] ?? {};
|
|
86
|
-
translationMap.en[opt.id]['label'] = opt.label;
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
this.book?.questionbook?.action?.forEach((act) => {
|
|
94
|
-
if (!translationMap.en[act.id])
|
|
95
|
-
translationMap.en[act.id] = {};
|
|
96
|
-
translationMap.en[act.id]['name'] = act.name;
|
|
97
|
-
});
|
|
98
|
-
this.book['translationMap'] = translationMap;
|
|
99
|
-
}
|
|
100
|
-
//SKS28MAR25 Function to fetch refqb data
|
|
101
|
-
getRefQbData(refqbid) {
|
|
102
|
-
return this.http.get(`https://dev-api.valarhr.com/nxt?name=${refqbid}`);
|
|
103
|
-
}
|
|
104
|
-
//AP-17APR25 Function to generate unique id
|
|
105
|
-
addElementWithId() {
|
|
106
|
-
const prefix = 'ngnxt';
|
|
107
|
-
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
108
|
-
let core = '';
|
|
109
|
-
for (let i = 0; i < 14; i++) {
|
|
110
|
-
core += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
111
|
-
}
|
|
112
|
-
return prefix + core;
|
|
113
|
-
}
|
|
114
|
-
// AP 23MAY25 Updates the questionbook action buttons: adds or removes based on action type
|
|
115
|
-
updateQuestionBookActionButtons(button, action) {
|
|
116
|
-
if (!this.book.questionbook) {
|
|
117
|
-
this.book.questionbook = {};
|
|
118
|
-
}
|
|
119
|
-
if (action === 'add') {
|
|
120
|
-
this.book.questionbook.action.push(button);
|
|
121
|
-
}
|
|
122
|
-
else if (action === 'remove') {
|
|
123
|
-
this.book.questionbook.action = this.book.questionbook.action.filter((item) => item.id !== button.id);
|
|
124
|
-
}
|
|
125
|
-
this.actionSubject.next(this.book);
|
|
126
|
-
}
|
|
127
|
-
newBook() {
|
|
128
|
-
this.unique_id = this.addElementWithId();
|
|
129
|
-
this.book = {
|
|
130
|
-
'translationMap': { 'en': {} },
|
|
131
|
-
'bookQuestionsMap': {
|
|
132
|
-
[this.unique_id]: {
|
|
133
|
-
'subQuestions': [],
|
|
134
|
-
'type': 'Book'
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
'questionbook': {
|
|
138
|
-
"action": [
|
|
139
|
-
{
|
|
140
|
-
"name": "Cancel",
|
|
141
|
-
"eventtoemit": "close",
|
|
142
|
-
"alt": "",
|
|
143
|
-
"positionPercent": 3,
|
|
144
|
-
"width": 100,
|
|
145
|
-
"textColor": "#ffffff",
|
|
146
|
-
"borderRadius": 6,
|
|
147
|
-
'id': 1,
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
"name": "Save",
|
|
151
|
-
"eventtoemit": "submit",
|
|
152
|
-
"alt": "",
|
|
153
|
-
"endpoint": "",
|
|
154
|
-
"method": "POST",
|
|
155
|
-
"positionPercent": 14,
|
|
156
|
-
"width": 100,
|
|
157
|
-
"textColor": "#ffffff",
|
|
158
|
-
"borderRadius": 6,
|
|
159
|
-
'id': 1,
|
|
160
|
-
}
|
|
161
|
-
]
|
|
162
|
-
},
|
|
163
|
-
'records': [{
|
|
164
|
-
'id': this.unique_id,
|
|
165
|
-
'title': 'Untitled',
|
|
166
|
-
'subQuestions': [{}]
|
|
167
|
-
}]
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
// AP 26FEB25 - clear the form elements
|
|
171
|
-
clearElements() {
|
|
172
|
-
this.formElements = [];
|
|
173
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
174
|
-
}
|
|
175
|
-
// Get the element component reference
|
|
176
|
-
getElementComponent() {
|
|
177
|
-
return this.elementComponent;
|
|
178
|
-
}
|
|
179
|
-
setElementComponent(component) {
|
|
180
|
-
this.elementComponent = component;
|
|
181
|
-
}
|
|
182
|
-
// Add a new element to the form
|
|
183
|
-
addElement(element) {
|
|
184
|
-
if (!element.options) {
|
|
185
|
-
element.options = []; // options is initialized
|
|
186
|
-
}
|
|
187
|
-
element['questionBookId'] = this.unique_id;
|
|
188
|
-
this.formElements.push(element);
|
|
189
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
190
|
-
if (this.book?.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]]?.subQuestions)
|
|
191
|
-
this.book.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]].subQuestions = this.formElements;
|
|
192
|
-
}
|
|
193
|
-
// SKS13MAR25 add table element
|
|
194
|
-
addTableElement(element, ind) {
|
|
195
|
-
//SKS13MAR25 Ensure currentElement exists
|
|
196
|
-
if (!this.currentElement)
|
|
197
|
-
return;
|
|
198
|
-
// Clone elements array
|
|
199
|
-
const elements = [...this.getElements()];
|
|
200
|
-
// SKS13MAR25 Find the element and update its columns
|
|
201
|
-
const index = elements.findIndex(el => el.id === this.currentElement.id);
|
|
202
|
-
let tempFieldsMeta = {
|
|
203
|
-
label: element.label,
|
|
204
|
-
apiName: element.fieldName,
|
|
205
|
-
isdeleted: false,
|
|
206
|
-
orderbyflag: false,
|
|
207
|
-
filterflag: false,
|
|
208
|
-
outputFlag: true,
|
|
209
|
-
ischild: false,
|
|
210
|
-
resultantflag: false,
|
|
211
|
-
searchflag: false,
|
|
212
|
-
fldType: element.type,
|
|
213
|
-
readOnly: false,
|
|
214
|
-
uniqueIdentifier: element.id,
|
|
215
|
-
question: {
|
|
216
|
-
style: {
|
|
217
|
-
labelClass: null,
|
|
218
|
-
labelStyle: null,
|
|
219
|
-
labelValueStyle: null,
|
|
220
|
-
inputClass: null,
|
|
221
|
-
inputStyle: null,
|
|
222
|
-
showLabel: true,
|
|
223
|
-
bookStyle: null,
|
|
224
|
-
direction: "ltr",
|
|
225
|
-
questionStyle: null,
|
|
226
|
-
},
|
|
227
|
-
subText: {
|
|
228
|
-
endpoint: null,
|
|
229
|
-
variable: null,
|
|
230
|
-
field: null,
|
|
231
|
-
defaultField: null,
|
|
232
|
-
sourceQuestionId: null,
|
|
233
|
-
valueField: null,
|
|
234
|
-
labelField: null,
|
|
235
|
-
isDependentField: false,
|
|
236
|
-
dependentValue: null,
|
|
237
|
-
queryField: null,
|
|
238
|
-
queryValue: null,
|
|
239
|
-
queryValueReference: null,
|
|
240
|
-
uniqueKey: null,
|
|
241
|
-
},
|
|
242
|
-
options: element.type === "Dropdown" || element.type === "Radio" || element.type === "Checkbox"
|
|
243
|
-
? []
|
|
244
|
-
: null,
|
|
245
|
-
}
|
|
246
|
-
};
|
|
247
|
-
let fieldsMeta = [...(Array.isArray(this.formElements[index].fieldsMeta) ? this.formElements[index].fieldsMeta : (typeof this.formElements[index].fieldsMeta === 'string' ? (JSON.parse(this.formElements[index].fieldsMeta)) : [this.formElements[index].fieldsMeta])), tempFieldsMeta];
|
|
248
|
-
if (index !== -1) {
|
|
249
|
-
elements[index] = { ...elements[index], fieldsMeta: fieldsMeta };
|
|
250
|
-
}
|
|
251
|
-
// Emit the updated form elements
|
|
252
|
-
// this.formElementsSubject.next(elements);
|
|
253
|
-
this.formElements = elements;
|
|
254
|
-
this.formElementsSubject.next([...elements]);
|
|
255
|
-
this.selectedElementSubject.next(ind);
|
|
256
|
-
// Log for debugging
|
|
257
|
-
}
|
|
258
|
-
updateElement(index, updates) {
|
|
259
|
-
const elements = [...this.getElements()];
|
|
260
|
-
if (elements[index]) {
|
|
261
|
-
elements[index] = {
|
|
262
|
-
...elements[index],
|
|
263
|
-
...updates,
|
|
264
|
-
options: updates.options || elements[index].options || [],
|
|
265
|
-
};
|
|
266
|
-
this.formElementsSubject.next(elements);
|
|
267
|
-
}
|
|
268
|
-
if (index >= 0 && index < this.formElements.length) {
|
|
269
|
-
const updatedElement = {
|
|
270
|
-
...this.formElements[index],
|
|
271
|
-
...updates
|
|
272
|
-
};
|
|
273
|
-
if (updates.required !== undefined) {
|
|
274
|
-
if (updatedElement.questionText) {
|
|
275
|
-
const questionText = updatedElement.questionText.replace(/\s*\*+$/, '');
|
|
276
|
-
updatedElement.questionText = updates.required ? `${questionText} *` : questionText;
|
|
277
|
-
}
|
|
278
|
-
if (elements[index]) {
|
|
279
|
-
elements[index] = { ...elements[index], ...updates };
|
|
280
|
-
this.formElements = elements;
|
|
281
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
// Handle special cases
|
|
285
|
-
if (updates.required === true && updatedElement.questionText && !updatedElement.questionText.endsWith('*')) {
|
|
286
|
-
updatedElement.questionText = `${updatedElement.questionText} *`;
|
|
287
|
-
}
|
|
288
|
-
else if (updates.required === false && updatedElement.questionText && updatedElement.questionText.endsWith('*')) {
|
|
289
|
-
updatedElement.questionText = updatedElement.questionText.slice(0, -2);
|
|
290
|
-
}
|
|
291
|
-
this.formElements[index] = updatedElement;
|
|
292
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
293
|
-
// localStorage.setItem('formElements', JSON.stringify(this.formElements));
|
|
294
|
-
}
|
|
295
|
-
if (this.book?.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]]?.subQuestions)
|
|
296
|
-
this.book.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]].subQuestions = this.formElements;
|
|
297
|
-
}
|
|
298
|
-
updateTitle(event) {
|
|
299
|
-
//AP-10MAR25 Updates the title of the first record in the book
|
|
300
|
-
this.book.records[0].title = event;
|
|
301
|
-
}
|
|
302
|
-
setSelectedElement(index) {
|
|
303
|
-
this.selectedElementSubject.next(index);
|
|
304
|
-
this.currentElement = this.formElements[index];
|
|
305
|
-
this.selectTableColumn = null;
|
|
306
|
-
}
|
|
307
|
-
// SKS19MAR25 set the selected table column
|
|
308
|
-
setSelectedTableElement(index, event) {
|
|
309
|
-
this.currentElement = this.formElements[index];
|
|
310
|
-
if (this.currentElement?.type === 'Table') {
|
|
311
|
-
this.currentElement['fieldsMeta'] = typeof this.currentElement?.fieldsMeta === 'object' ? this.currentElement?.fieldsMeta : JSON.parse(this.currentElement.fieldsMeta);
|
|
312
|
-
}
|
|
313
|
-
const foundItem = this.currentElement?.type === 'Table' ? this.currentElement['fieldsMeta'].find(item => item['uniqueIdentifier'] === event?.uniqueIdentifier) : undefined;
|
|
314
|
-
this.selectTableColumn = foundItem?.uniqueIdentifier;
|
|
315
|
-
this.selectedElementSubject.next(index);
|
|
316
|
-
}
|
|
317
|
-
removeSelectedTableElement(index, event) {
|
|
318
|
-
this.currentElement = this.formElements[index];
|
|
319
|
-
if (this.currentElement?.type === 'Table') {
|
|
320
|
-
this.currentElement['fieldsMeta'] = typeof this.currentElement?.fieldsMeta === 'object' ? this.currentElement?.fieldsMeta : JSON.parse(this.currentElement.fieldsMeta);
|
|
321
|
-
// Find the index of the item
|
|
322
|
-
const itemIndex = this.currentElement['fieldsMeta'].findIndex(item => item['uniqueIdentifier'] === event?.uniqueIdentifier);
|
|
323
|
-
// Remove the item if found
|
|
324
|
-
if (itemIndex !== -1) {
|
|
325
|
-
this.currentElement['fieldsMeta'].splice(itemIndex, 1);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
this.selectTableColumn = null;
|
|
329
|
-
this.elementUpdate(index, this.currentElement);
|
|
330
|
-
}
|
|
331
|
-
// SKS19MAR25 get the selected table column
|
|
332
|
-
getSelectTableColumn() {
|
|
333
|
-
return this.selectTableColumn;
|
|
334
|
-
}
|
|
335
|
-
selectHeading(event) {
|
|
336
|
-
//AP-10MAR25 Emits the selected heading event
|
|
337
|
-
this.selectHeaderSubject.next(event);
|
|
338
|
-
}
|
|
339
|
-
getElements() {
|
|
340
|
-
return this.formElements.map(element => ({
|
|
341
|
-
...element,
|
|
342
|
-
options: element.options || [],
|
|
343
|
-
}));
|
|
344
|
-
}
|
|
345
|
-
sortElementsByOrder() {
|
|
346
|
-
//AP-10MAR25 Sort elements by current order
|
|
347
|
-
this.formElements.sort((a, b) => a.questionNumber - b.questionNumber);
|
|
348
|
-
this.formElements.forEach((element, index) => {
|
|
349
|
-
element.questionNumber = index + 1;
|
|
350
|
-
});
|
|
351
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
352
|
-
}
|
|
353
|
-
//AP-10MAR25 Returns the current book data
|
|
354
|
-
getBook() {
|
|
355
|
-
return this.book;
|
|
356
|
-
}
|
|
357
|
-
updateBook(book) {
|
|
358
|
-
this.book = book;
|
|
359
|
-
const updatedSubQuestions = book.bookQuestionsMap[this.unique_id]?.subQuestions ?? [];
|
|
360
|
-
this.formElements = updatedSubQuestions;
|
|
361
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
362
|
-
}
|
|
363
|
-
// In FormBuilderService
|
|
364
|
-
downloadElement() {
|
|
365
|
-
let translationMap = this.book.translationMap;
|
|
366
|
-
const keysToTranslate = ['questionText', 'helpText', 'question', 'label'];
|
|
367
|
-
let downloadFormElements = this.formElements;
|
|
368
|
-
downloadFormElements?.forEach(element => {
|
|
369
|
-
keysToTranslate.forEach(key => {
|
|
370
|
-
element[key] = translationMap.en[element.id]?.[key] ? translationMap.en[element.id][key] : null;
|
|
371
|
-
});
|
|
372
|
-
if (element?.['options'] !== undefined && element?.['options'] !== null && Array.isArray(element['options'])) {
|
|
373
|
-
element['options'].forEach((opt) => {
|
|
374
|
-
opt.label = translationMap.en[opt.id]?.['label'];
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
if (element.type === 'Table' && element?.fieldsMeta) {
|
|
378
|
-
if (!Array.isArray(element?.fieldsMeta) && typeof element?.fieldsMeta === 'string') {
|
|
379
|
-
element.fieldsMeta = JSON.parse(element?.fieldsMeta);
|
|
380
|
-
}
|
|
381
|
-
element?.fieldsMeta?.forEach(field => {
|
|
382
|
-
keysToTranslate.forEach(key => {
|
|
383
|
-
if (key !== 'question')
|
|
384
|
-
field[key] = translationMap.en[field.uniqueIdentifier]?.[key];
|
|
385
|
-
});
|
|
386
|
-
if (field?.question?.['options'] !== undefined && field?.question?.['options'] !== null && Array.isArray(field?.question?.['options'])) {
|
|
387
|
-
field.question['options'].forEach(opt => {
|
|
388
|
-
opt.label = translationMap.en[opt.id]?.['label'];
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
});
|
|
394
|
-
let downloadBook = this.book;
|
|
395
|
-
downloadBook?.questionbook?.action?.forEach((act) => {
|
|
396
|
-
act.name = translationMap.en[act.id]?.['name'];
|
|
397
|
-
});
|
|
398
|
-
// SKS28MAR25 remove qbReferenceQuestions for download time and subtext to convert too string
|
|
399
|
-
downloadFormElements.forEach(element => {
|
|
400
|
-
if (element.type === 'book') {
|
|
401
|
-
delete element.qbReferenceQuestions;
|
|
402
|
-
}
|
|
403
|
-
if (element.subText) {
|
|
404
|
-
element.subText = typeof element?.subText === 'object' ? element?.subText : JSON.parse(element['subText']);
|
|
405
|
-
const stringArrayFields = ['field', 'queryParameter', 'sourceQuestionId', 'queryField', 'queryValue'];
|
|
406
|
-
if (element.subText) {
|
|
407
|
-
stringArrayFields.forEach(key => {
|
|
408
|
-
const value = element.subText[key];
|
|
409
|
-
if (typeof value === 'string') {
|
|
410
|
-
element.subText[key] = value.split(',').map(item => item.trim());
|
|
411
|
-
}
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
|
-
if (element.type === 'Table') {
|
|
415
|
-
element.fieldsMeta.forEach(field => {
|
|
416
|
-
if (field?.question?.subText) {
|
|
417
|
-
stringArrayFields.forEach(key => {
|
|
418
|
-
const value = field.question.subText[key];
|
|
419
|
-
if (typeof value === 'string') {
|
|
420
|
-
field.question.subText[key] = value.split(',').map(item => item.trim());
|
|
421
|
-
}
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
if (element.subText) {
|
|
428
|
-
element.subText = typeof element?.subText !== 'object' ? element?.subText : JSON.stringify(element['subText']);
|
|
429
|
-
}
|
|
430
|
-
});
|
|
431
|
-
downloadBook.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]].subQuestions = downloadFormElements;
|
|
432
|
-
console.log('book', downloadBook);
|
|
433
|
-
return downloadBook;
|
|
434
|
-
}
|
|
435
|
-
// AP-06MAR25 - Element new order update
|
|
436
|
-
updateElementsOrder(updatedElements) {
|
|
437
|
-
this.formElements = [...updatedElements];
|
|
438
|
-
this.formElementsSubject.next(this.formElements);
|
|
439
|
-
}
|
|
440
|
-
// Remove an element by ID
|
|
441
|
-
// Save elements to localStorage and update the subject
|
|
442
|
-
removeElementComponent(id) {
|
|
443
|
-
this.tempElem = [];
|
|
444
|
-
this.selectedElementSubject.next(null);
|
|
445
|
-
this.currentElement = {};
|
|
446
|
-
this.formElements.forEach((element) => {
|
|
447
|
-
if (element.id !== id) {
|
|
448
|
-
this.tempElem.push(element);
|
|
449
|
-
}
|
|
450
|
-
});
|
|
451
|
-
this.formElements = this.tempElem;
|
|
452
|
-
// localStorage.setItem('formElements', JSON.stringify(this.formElements));
|
|
453
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
454
|
-
}
|
|
455
|
-
// SKS19MAR25 update the element
|
|
456
|
-
elementUpdate(index, element) {
|
|
457
|
-
const elements = [...this.getElements()];
|
|
458
|
-
if (elements[index]) {
|
|
459
|
-
elements[index] = element;
|
|
460
|
-
this.formElements = elements;
|
|
461
|
-
this.formElementsSubject.next([...elements]);
|
|
462
|
-
this.selectedElementSubject.next(index);
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
466
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, providedIn: 'root' });
|
|
467
|
-
}
|
|
468
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, decorators: [{
|
|
469
|
-
type: Injectable,
|
|
470
|
-
args: [{
|
|
471
|
-
providedIn: 'root',
|
|
472
|
-
}]
|
|
473
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvc2VydmljZXMvZm9ybS1idWlsZGVyL2Zvcm0tYnVpbGRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7QUFDYixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7OztBQTREbkQsTUFBTSxPQUFPLGtCQUFrQjtJQW1CVDtJQWxCWixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsRUFBRSxDQUFDLENBQUM7SUFDN0Qsc0JBQXNCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztJQUNyRCxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQU0sSUFBSSxDQUFDLENBQUM7SUFDL0MsZ0JBQWdCLEdBQTRCLElBQUksQ0FBQztJQUN6RCxJQUFJLENBQU07SUFDVixTQUFTLENBQU07SUFDZixRQUFRLENBQVE7SUFFaEIsYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4RCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9ELGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25ELGNBQWMsQ0FBTTtJQUNwQixpQkFBaUIsQ0FBTTtJQUN2Qix5RUFBeUU7SUFFekUsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxH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S0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFBO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQzt3R0E1ZFUsa0JBQWtCOzRHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFQIDIySkFOMjVcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhZ2VzL2J1aWxkZXIvZWxlbWVudC9lbGVtZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbnRlcmZhY2UgRm9ybUVsZW1lbnQge1xuICBhY3Rpb246IGFueTtcbiAgaWQ6IGFueTtcbiAgdHlwZTogc3RyaW5nO1xuICBuYW1lOiBhbnk7XG4gIHF1ZXN0aW9uVGV4dD86IHN0cmluZztcbiAgcXVlc3Rpb24/OiBzdHJpbmc7XG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIGlzUmVhZE9ubHk/OiBib29sZWFuO1xuICBpc0hpZGRlbj86IGJvb2xlYW47XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcmVmZXJlbmNlRmllbGQ/OiBhbnk7XG4gIGFkZGl0aW9uYWxSaWNoQ29udGVudD86IGFueTtcbiAgZ3JvdXBOYW1lPzogYW55O1xuICBpc0RhdGVCYWNrd2FyZD86IGJvb2xlYW47XG4gIHRpdGxlPzogYW55O1xuICBzdWJUaXRsZT86IGFueTtcbiAgc2l6ZT86IG51bWJlcjtcbiAgaXNEYXRlRm9yd2FyZD86IGJvb2xlYW47XG4gIGlzT3B0aW9uYWw/OiBib29sZWFuO1xuICBpc1RpdGxlPzogYm9vbGVhbjtcbiAgbmV4dFF1ZXN0aW9uPzogYW55O1xuICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM/OiBhbnk7XG4gIHF1ZXN0aW9uTnVtYmVyPzogbnVtYmVyO1xuICBvcmRlcjogbnVtYmVyO1xuICBxdWVzdGlvbkJvb2tJZD86IGFueTtcbiAgZmllbGRzTWV0YT86IGFueTtcbiAgdHJhY2tpbmdJZD86IGFueTtcbiAgcmVjb3JkSWQ/OiBhbnk7XG4gIHFiUmVmZXJlbmNlPzogYW55O1xuICBxYlJlZmVyZW5jZVF1ZXN0aW9ucz86IGFueTtcbiAgcHJpbWFyeUtleTogYm9vbGVhbixcbiAgc3R5bGU6IHtcbiAgICBsYWJlbENsYXNzOiBhbnksXG4gICAgbGFiZWxTdHlsZTogYW55LFxuICAgIGxhYmVsVmFsdWVTdHlsZTogYW55LFxuICAgIGlucHV0Q2xhc3M6IGFueSxcbiAgICBpbnB1dFN0eWxlOiBhbnksXG4gICAgc2hvd0xhYmVsOiBib29sZWFuLFxuICAgIGJvb2tTdHlsZTogYW55LFxuICAgIGRpcmVjdGlvbjogYW55LFxuICAgIHF1ZXN0aW9uU3R5bGU6IGFueSxcbiAgfSxcbiAgICAvLyBBUCAyNUZFQjI1IC0gb3B0aW9ucyBhcnJheVxuICBvcHRpb25zPzogQXJyYXk8e1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgbGFiZWw6ICBzdHJpbmc7XG4gICAgdW5pcXVlSWRlbnRpZmllcjogYW55O1xuICAgIGlkOiBhbnk7XG4gIH0+O1xuICBzdWJUZXh0OiBhbnlcbn1cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQnVpbGRlclNlcnZpY2Uge1xuICBwcml2YXRlIGZvcm1FbGVtZW50czogRm9ybUVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIGZvcm1FbGVtZW50c1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvcm1FbGVtZW50W10+KFtdKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZEVsZW1lbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcbiAgcHJpdmF0ZSBzZWxlY3RIZWFkZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwcml2YXRlIGFjdGlvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gIHByaXZhdGUgZWxlbWVudENvbXBvbmVudDogRWxlbWVudENvbXBvbmVudCB8IG51bGwgPSBudWxsO1xuICBib29rOiBhbnk7XG4gIHVuaXF1ZV9pZDogYW55O1xuICB0ZW1wRWxlbTogYW55W107XG5cbiAgZm9ybUVsZW1lbnRzJCA9IHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgc2VsZWN0ZWRFbGVtZW50JCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgc2VsZWN0SGVhZGVyU3ViamVjdCQgPSB0aGlzLnNlbGVjdEhlYWRlclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGFjdGlvblN1YmplY3QkID0gdGhpcy5hY3Rpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBjdXJyZW50RWxlbWVudDogYW55O1xuICBzZWxlY3RUYWJsZUNvbHVtbjogYW55O1xuICAvLyBib29rOiB7IGJvb2tRdWVzdGlvbnNNYXA6IHsgdW5pcXVlX2lkOiB7IHN1YlF1ZXN0aW9uczogYW55W107IH07IH07IH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XG4gICAgLy8gTG9hZCBzYXZlZCBlbGVtZW50cyBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gW107XG4gICAgY29uc3Qgc2F2ZWRGb3JtRWxlbWVudHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUVsZW1lbnRzJyk7XG4gICAgaWYgKHNhdmVkRm9ybUVsZW1lbnRzKSB7XG4gICAgICB0aGlzLmZvcm1FbGVtZW50cyA9IEpTT04ucGFyc2Uoc2F2ZWRGb3JtRWxlbWVudHMpO1xuICAgICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gICAgfVxuICB9XG4gXG4gIGludGlhbGl6ZUJvb2soYm9vazogYW55KSB7XG4gICAgLy8gQVAgMTNNQVIyNSAtIEdldCB0aGUgdW5pcXVlIGlkIGluIHRoZSBib29rUXVlc3Rpb25zTWFwIFxuICAgIHRoaXMudW5pcXVlX2lkID0gT2JqZWN0LmtleXMoYm9vay5ib29rUXVlc3Rpb25zTWFwKVswXTtcbiAgICBsZXQgdGVtcGJvb2sgPSBib29rLmJvb2tRdWVzdGlvbnNNYXBbdGhpcy51bmlxdWVfaWRdLnN1YlF1ZXN0aW9ucztcbiAgICAvLyBTS1MyOE1BUjI1IHVwZGF0ZSBuZXN0ZWQgYm9vayBRdWVzdGlvbnNNYXBcbiAgICB0ZW1wYm9vay5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImJvb2tcIiAmJiBlbGVtZW50LnFiUmVmZXJlbmNlKSB7XG4gICAgICAgIHRoaXMuZ2V0UmVmUWJEYXRhKGVsZW1lbnQucWJSZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRbJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10gPSByZXNwb25zZTsgLy8gQXNzaWduIHJlc3BvbnNlIHRvIHFiUmVmZXJlbmNlUXVlc3Rpb25zXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBUEkgRXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYm9vay5ib29rUXVlc3Rpb25zTWFwW3RoaXMudW5pcXVlX2lkXS5zdWJRdWVzdGlvbnMgPSB0ZW1wYm9va1xuICAgIHRoaXMuYm9vayA9IGJvb2tcblxuICAgIHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwW3RoaXMudW5pcXVlX2lkXT8uc3ViUXVlc3Rpb25zPy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgdGhpcy5hZGRFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuICAgIGxldCB0cmFuc2xhdGlvbk1hcDogYW55ID0geyBlbjoge30gfTtcbiAgICBjb25zdCBrZXlzVG9UcmFuc2xhdGUgPSBbJ3F1ZXN0aW9uVGV4dCcsICdoZWxwVGV4dCcsICdxdWVzdGlvbicsICdsYWJlbCddO1xuICAgIHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwW3RoaXMudW5pcXVlX2lkXT8uc3ViUXVlc3Rpb25zPy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgdHJhbnNsYXRpb25NYXAuZW5bZWxlbWVudC5pZF0gPSB7fTsgXG4gICAgICBrZXlzVG9UcmFuc2xhdGUuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudFtrZXldICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudFtrZXldICE9PSBudWxsICYmIHR5cGVvZiBlbGVtZW50W2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdHJhbnNsYXRpb25NYXAuZW5bZWxlbWVudC5pZF1ba2V5XSA9IGVsZW1lbnRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZihlbGVtZW50Py5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQ/Llsnb3B0aW9ucyddICE9PSBudWxsICYmICBBcnJheS5pc0FycmF5KGVsZW1lbnRbJ29wdGlvbnMnXSkpe1xuICAgICAgICBlbGVtZW50WydvcHRpb25zJ10uZm9yRWFjaChvcHQgPT4ge1xuICAgICAgICAgIGlmIChvcHQubGFiZWwgIT09IHVuZGVmaW5lZCAmJiBvcHQubGFiZWwgIT09IG51bGwgJiYgdHlwZW9mIG9wdC5sYWJlbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uTWFwLmVuW29wdC5pZF0gPSB0cmFuc2xhdGlvbk1hcC5lbltvcHQuaWRdID8/IHt9O1xuICAgICAgICAgICAgdHJhbnNsYXRpb25NYXAuZW5bb3B0LmlkXVsnbGFiZWwnXSA9IG9wdC5sYWJlbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZihlbGVtZW50LnR5cGUgPT09ICdUYWJsZScgJiYgZWxlbWVudD8uZmllbGRzTWV0YSl7XG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQ/LmZpZWxkc01ldGEpICYmIHR5cGVvZiBlbGVtZW50Py5maWVsZHNNZXRhID09PSAnc3RyaW5nJyl7XG4gICAgICAgICAgZWxlbWVudC5maWVsZHNNZXRhID0gSlNPTi5wYXJzZShlbGVtZW50Py5maWVsZHNNZXRhKVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQ/LmZpZWxkc01ldGE/LmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgIHRyYW5zbGF0aW9uTWFwLmVuW2ZpZWxkLnVuaXF1ZUlkZW50aWZpZXJdID0ge307IFxuICAgICAgICAgIGtleXNUb1RyYW5zbGF0ZS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGRba2V5XSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkW2tleV0gIT09IG51bGwgJiYgdHlwZW9mIGZpZWxkW2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGlmKGtleSAhPT0gJ3F1ZXN0aW9uJykgdHJhbnNsYXRpb25NYXAuZW5bZmllbGQudW5pcXVlSWRlbnRpZmllcl1ba2V5XSA9IGZpZWxkW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkPy5xdWVzdGlvbj8uWydvcHRpb25zJ10gIT09IG51bGwgJiYgIEFycmF5LmlzQXJyYXkoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSkpe1xuICAgICAgICAgICAgZmllbGQucXVlc3Rpb25bJ29wdGlvbnMnXS5mb3JFYWNoKG9wdCA9PiB7XG4gICAgICAgICAgICAgIGlmIChvcHQubGFiZWwgIT09IHVuZGVmaW5lZCAmJiBvcHQubGFiZWwgIT09IG51bGwgJiYgdHlwZW9mIG9wdC5sYWJlbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk1hcC5lbltvcHQuaWRdID0gdHJhbnNsYXRpb25NYXAuZW5bb3B0LmlkXSA/PyB7fTtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk1hcC5lbltvcHQuaWRdWydsYWJlbCddID0gb3B0LmxhYmVsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ib29rPy5xdWVzdGlvbmJvb2s/LmFjdGlvbj8uZm9yRWFjaCgoYWN0OiBhbnkpID0+e1xuICAgICAgaWYoIXRyYW5zbGF0aW9uTWFwLmVuW2FjdC5pZF0pIHRyYW5zbGF0aW9uTWFwLmVuW2FjdC5pZF09e31cbiAgICAgIHRyYW5zbGF0aW9uTWFwLmVuW2FjdC5pZF1bJ25hbWUnXSA9IGFjdC5uYW1lO1xuICAgIH0pXG4gICAgdGhpcy5ib29rWyd0cmFuc2xhdGlvbk1hcCddID0gdHJhbnNsYXRpb25NYXBcbiAgfVxuXG4gIC8vU0tTMjhNQVIyNSBGdW5jdGlvbiB0byBmZXRjaCByZWZxYiBkYXRhXG4gIGdldFJlZlFiRGF0YShyZWZxYmlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYGh0dHBzOi8vZGV2LWFwaS52YWxhcmhyLmNvbS9ueHQ/bmFtZT0ke3JlZnFiaWR9YCk7XG4gIH1cblxuICAgLy9BUC0xN0FQUjI1IEZ1bmN0aW9uIHRvIGdlbmVyYXRlIHVuaXF1ZSBpZFxuICAgYWRkRWxlbWVudFdpdGhJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9ICduZ254dCc7IFxuICAgIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgICBsZXQgY29yZSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ7IGkrKykge1xuICAgICAgY29yZSArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXggKyBjb3JlOyBcbiAgfVxuICAvLyBBUCAyM01BWTI1IFVwZGF0ZXMgdGhlIHF1ZXN0aW9uYm9vayBhY3Rpb24gYnV0dG9uczogYWRkcyBvciByZW1vdmVzIGJhc2VkIG9uIGFjdGlvbiB0eXBlXG4gIHVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnV0dG9uOiBhbnksYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYm9vay5xdWVzdGlvbmJvb2spIHtcbiAgICAgIHRoaXMuYm9vay5xdWVzdGlvbmJvb2sgPSB7fTtcbiAgICB9XG4gICAgaWYoYWN0aW9uID09PSAnYWRkJykge1xuICAgICAgdGhpcy5ib29rLnF1ZXN0aW9uYm9vay5hY3Rpb24ucHVzaChidXR0b24pO1xuICAgIH1lbHNlIGlmKGFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgIHRoaXMuYm9vay5xdWVzdGlvbmJvb2suYWN0aW9uID0gdGhpcy5ib29rLnF1ZXN0aW9uYm9vay5hY3Rpb24uZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgIT09IGJ1dHRvbi5pZCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aW9uU3ViamVjdC5uZXh0KHRoaXMuYm9vayk7XG4gIH1cbiAgXG4gIG5ld0Jvb2soKSB7XG4gICAgdGhpcy51bmlxdWVfaWQgPSB0aGlzLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgICB0aGlzLmJvb2sgPSB7XG4gICAgICAndHJhbnNsYXRpb25NYXAnOnsnZW4nOnt9fSxcbiAgICAgICdib29rUXVlc3Rpb25zTWFwJzoge1xuICAgICAgICBbdGhpcy51bmlxdWVfaWRdOiB7XG4gICAgICAgICAgJ3N1YlF1ZXN0aW9ucyc6IFtdLFxuICAgICAgICAgICd0eXBlJzogJ0Jvb2snXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAncXVlc3Rpb25ib29rJzoge1xuICAgICAgICBcImFjdGlvblwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ2FuY2VsXCIsXG4gICAgICAgICAgICBcImV2ZW50dG9lbWl0XCI6IFwiY2xvc2VcIixcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiXCIsXG4gICAgICAgICAgICBcInBvc2l0aW9uUGVyY2VudFwiOiAzLFxuICAgICAgICAgICAgXCJ3aWR0aFwiOiAxMDAsXG4gICAgICAgICAgICBcInRleHRDb2xvclwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgICAgIFwiYm9yZGVyUmFkaXVzXCI6IDYsXG4gICAgICAgICAgICAnaWQnOiAxLFxuXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJTYXZlXCIsXG4gICAgICAgICAgICBcImV2ZW50dG9lbWl0XCI6IFwic3VibWl0XCIsXG4gICAgICAgICAgICBcImFsdFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICBcInBvc2l0aW9uUGVyY2VudFwiOiAxNCwgIFxuICAgICAgICAgICAgXCJ3aWR0aFwiOiAxMDAsXG4gICAgICAgICAgICBcInRleHRDb2xvclwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgICAgIFwiYm9yZGVyUmFkaXVzXCI6IDYsXG4gICAgICAgICAgICAnaWQnOiAxLFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgICdyZWNvcmRzJzogW3tcbiAgICAgICAgJ2lkJzogdGhpcy51bmlxdWVfaWQsXG4gICAgICAgICd0aXRsZSc6ICdVbnRpdGxlZCcsXG4gICAgICAgICdzdWJRdWVzdGlvbnMnOiBbe31dXG4gICAgICB9XVxuICAgIH1cbiAgfVxuICAvLyBBUCAyNkZFQjI1IC0gY2xlYXIgdGhlIGZvcm0gZWxlbWVudHMgXG4gIGNsZWFyRWxlbWVudHMoKSB7XG4gICAgdGhpcy5mb3JtRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLmZvcm1FbGVtZW50c1N1YmplY3QubmV4dChbLi4udGhpcy5mb3JtRWxlbWVudHNdKTtcbiAgfVxuICAvLyBHZXQgdGhlIGVsZW1lbnQgY29tcG9uZW50IHJlZmVyZW5jZVxuICBnZXRFbGVtZW50Q29tcG9uZW50KCk6IEVsZW1lbnRDb21wb25lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q29tcG9uZW50O1xuICB9XG5cbiAgc2V0RWxlbWVudENvbXBvbmVudChjb21wb25lbnQ6IEVsZW1lbnRDb21wb25lbnQpIHtcbiAgICB0aGlzLmVsZW1lbnRDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gIH1cblxuICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgZm9ybVxuICBhZGRFbGVtZW50KGVsZW1lbnQ6IEZvcm1FbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50Lm9wdGlvbnMpIHtcbiAgICAgIGVsZW1lbnQub3B0aW9ucyA9IFtdOyAvLyBvcHRpb25zIGlzIGluaXRpYWxpemVkXG4gICAgfVxuICAgIGVsZW1lbnRbJ3F1ZXN0aW9uQm9va0lkJ10gPSB0aGlzLnVuaXF1ZV9pZDtcbiAgICB0aGlzLmZvcm1FbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLmZvcm1FbGVtZW50c10pO1xuICAgIGlmKHRoaXMuYm9vaz8uYm9va1F1ZXN0aW9uc01hcFtPYmplY3Qua2V5cyh0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcClbMF1dPy5zdWJRdWVzdGlvbnMpIHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwW09iamVjdC5rZXlzKHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwKVswXV0uc3ViUXVlc3Rpb25zID0gdGhpcy5mb3JtRWxlbWVudHNcbiAgfVxuICAvLyBTS1MxM01BUjI1IGFkZCB0YWJsZSBlbGVtZW50XG4gIGFkZFRhYmxlRWxlbWVudChlbGVtZW50OiBhbnksIGluZCA6YW55KSB7XG4gICAgLy9TS1MxM01BUjI1IEVuc3VyZSBjdXJyZW50RWxlbWVudCBleGlzdHNcbiAgICBpZiAoIXRoaXMuY3VycmVudEVsZW1lbnQpIHJldHVybjtcbiAgICAvLyBDbG9uZSBlbGVtZW50cyBhcnJheVxuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLnRoaXMuZ2V0RWxlbWVudHMoKV07XG5cbiAgICAvLyBTS1MxM01BUjI1IEZpbmQgdGhlIGVsZW1lbnQgYW5kIHVwZGF0ZSBpdHMgY29sdW1uc1xuICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudHMuZmluZEluZGV4KGVsID0+IGVsLmlkID09PSB0aGlzLmN1cnJlbnRFbGVtZW50LmlkKTtcblxuICAgIGxldCB0ZW1wRmllbGRzTWV0YSA9IHtcbiAgICAgIGxhYmVsOiBlbGVtZW50LmxhYmVsLFxuICAgICAgYXBpTmFtZTogZWxlbWVudC5maWVsZE5hbWUsXG4gICAgICBpc2RlbGV0ZWQ6IGZhbHNlLFxuICAgICAgb3JkZXJieWZsYWc6IGZhbHNlLFxuICAgICAgZmlsdGVyZmxhZzogZmFsc2UsXG4gICAgICBvdXRwdXRGbGFnOiB0cnVlLFxuICAgICAgaXNjaGlsZDogZmFsc2UsXG4gICAgICByZXN1bHRhbnRmbGFnOiBmYWxzZSxcbiAgICAgIHNlYXJjaGZsYWc6IGZhbHNlLFxuICAgICAgZmxkVHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgdW5pcXVlSWRlbnRpZmllcjogZWxlbWVudC5pZCxcbiAgICAgIHF1ZXN0aW9uOntcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBsYWJlbENsYXNzOiBudWxsLFxuICAgICAgICAgIGxhYmVsU3R5bGU6IG51bGwsXG4gICAgICAgICAgbGFiZWxWYWx1ZVN0eWxlOiBudWxsLFxuICAgICAgICAgIGlucHV0Q2xhc3M6IG51bGwsXG4gICAgICAgICAgaW5wdXRTdHlsZTogbnVsbCxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgICAgYm9va1N0eWxlOiBudWxsLFxuICAgICAgICAgIGRpcmVjdGlvbjogXCJsdHJcIixcbiAgICAgICAgICBxdWVzdGlvblN0eWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICBzdWJUZXh0OiB7XG4gICAgICAgICAgZW5kcG9pbnQ6IG51bGwsXG4gICAgICAgICAgdmFyaWFibGU6IG51bGwsXG4gICAgICAgICAgZmllbGQ6IG51bGwsXG4gICAgICAgICAgZGVmYXVsdEZpZWxkOiBudWxsLFxuICAgICAgICAgIHNvdXJjZVF1ZXN0aW9uSWQ6IG51bGwsXG4gICAgICAgICAgdmFsdWVGaWVsZDogbnVsbCxcbiAgICAgICAgICBsYWJlbEZpZWxkOiBudWxsLFxuICAgICAgICAgIGlzRGVwZW5kZW50RmllbGQ6IGZhbHNlLFxuICAgICAgICAgIGRlcGVuZGVudFZhbHVlOiBudWxsLFxuICAgICAgICAgIHF1ZXJ5RmllbGQ6IG51bGwsXG4gICAgICAgICAgcXVlcnlWYWx1ZTogbnVsbCxcbiAgICAgICAgICBxdWVyeVZhbHVlUmVmZXJlbmNlOiBudWxsLFxuICAgICAgICAgIHVuaXF1ZUtleTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uczpcbiAgICAgICAgZWxlbWVudC50eXBlID09PSBcIkRyb3Bkb3duXCIgfHwgZWxlbWVudC50eXBlID09PSBcIlJhZGlvXCIgfHwgZWxlbWVudC50eXBlID09PSBcIkNoZWNrYm94XCJcbiAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICB9XG4gICAgfTsgICAgXG4gICAgbGV0IGZpZWxkc01ldGEgPSBbLi4uKEFycmF5LmlzQXJyYXkodGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLmZpZWxkc01ldGEpID8gdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLmZpZWxkc01ldGEgOiAodHlwZW9mIHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhID09PSAnc3RyaW5nJyA/IChKU09OLnBhcnNlKHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhKSkgOiBbdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLmZpZWxkc01ldGFdKSksIHRlbXBGaWVsZHNNZXRhXTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGVsZW1lbnRzW2luZGV4XSA9IHsgLi4uZWxlbWVudHNbaW5kZXhdLCBmaWVsZHNNZXRhOiBmaWVsZHNNZXRhIH07XG4gICAgfVxuXG4gICAgLy8gRW1pdCB0aGUgdXBkYXRlZCBmb3JtIGVsZW1lbnRzXG4gICAgLy8gdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoZWxlbWVudHMpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLmVsZW1lbnRzXSk7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRTdWJqZWN0Lm5leHQoaW5kKTtcbiAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudChpbmRleDogbnVtYmVyLCB1cGRhdGVzOiBQYXJ0aWFsPEZvcm1FbGVtZW50Pikge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLnRoaXMuZ2V0RWxlbWVudHMoKV07XG4gICAgaWYgKGVsZW1lbnRzW2luZGV4XSkge1xuICAgICAgZWxlbWVudHNbaW5kZXhdID0ge1xuICAgICAgICAuLi5lbGVtZW50c1tpbmRleF0sXG4gICAgICAgIC4uLnVwZGF0ZXMsXG4gICAgICAgIG9wdGlvbnM6IHVwZGF0ZXMub3B0aW9ucyB8fCBlbGVtZW50c1tpbmRleF0ub3B0aW9ucyB8fCBbXSxcbiAgICAgIH07XG4gICAgICB0aGlzLmZvcm1FbGVtZW50c1N1YmplY3QubmV4dChlbGVtZW50cyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmZvcm1FbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0ge1xuICAgICAgICAuLi50aGlzLmZvcm1FbGVtZW50c1tpbmRleF0sXG4gICAgICAgIC4uLnVwZGF0ZXNcbiAgICAgIH07XG4gICAgICBpZiAodXBkYXRlcy5yZXF1aXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQpIHtcbiAgICAgICAgICBjb25zdCBxdWVzdGlvblRleHQgPSB1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQucmVwbGFjZSgvXFxzKlxcKiskLywgJycpO1xuICAgICAgICAgIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCA9IHVwZGF0ZXMucmVxdWlyZWQgPyBgJHtxdWVzdGlvblRleHR9ICpgIDogcXVlc3Rpb25UZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50c1tpbmRleF0pIHtcbiAgICAgICAgICBlbGVtZW50c1tpbmRleF0gPSB7IC4uLmVsZW1lbnRzW2luZGV4XSwgLi4udXBkYXRlcyB9O1xuICAgICAgICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICAgICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXNcbiAgICAgIGlmICh1cGRhdGVzLnJlcXVpcmVkID09PSB0cnVlICYmIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCAmJiAhdXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0LmVuZHNXaXRoKCcqJykpIHtcbiAgICAgICAgdXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0ID0gYCR7dXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0fSAqYDtcbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlcy5yZXF1aXJlZCA9PT0gZmFsc2UgJiYgdXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0ICYmIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dC5lbmRzV2l0aCgnKicpKSB7XG4gICAgICAgIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCA9IHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dC5zbGljZSgwLCAtMik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XSA9IHVwZGF0ZWRFbGVtZW50O1xuICAgICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gICAgICAvLyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUVsZW1lbnRzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5mb3JtRWxlbWVudHMpKTtcbiAgICB9XG4gICAgaWYodGhpcy5ib29rPy5ib29rUXVlc3Rpb25zTWFwW09iamVjdC5rZXlzKHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwKVswXV0/LnN1YlF1ZXN0aW9ucykgdGhpcy5ib29rLmJvb2tRdWVzdGlvbnNNYXBbT2JqZWN0LmtleXModGhpcy5ib29rLmJvb2tRdWVzdGlvbnNNYXApWzBdXS5zdWJRdWVzdGlvbnMgPSB0aGlzLmZvcm1FbGVtZW50c1xuICB9XG4gIHVwZGF0ZVRpdGxlKGV2ZW50OiBhbnkpIHtcbiAgICAvL0FQLTEwTUFSMjUgVXBkYXRlcyB0aGUgdGl0bGUgb2YgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgYm9vayAgXG4gICAgdGhpcy5ib29rLnJlY29yZHNbMF0udGl0bGUgPSBldmVudDtcbiAgfVxuICBzZXRTZWxlY3RlZEVsZW1lbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KGluZGV4KTtcbiAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdXG4gICAgdGhpcy5zZWxlY3RUYWJsZUNvbHVtbiA9IG51bGxcbiAgfVxuICAvLyBTS1MxOU1BUjI1IHNldCB0aGUgc2VsZWN0ZWQgdGFibGUgY29sdW1uXG4gIHNldFNlbGVjdGVkVGFibGVFbGVtZW50KGluZGV4OiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdXG4gICAgaWYgKHRoaXMuY3VycmVudEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScpIHtcbiAgICAgIHRoaXMuY3VycmVudEVsZW1lbnRbJ2ZpZWxkc01ldGEnXSA9IHR5cGVvZiB0aGlzLmN1cnJlbnRFbGVtZW50Py5maWVsZHNNZXRhID09PSAnb2JqZWN0JyA/IHRoaXMuY3VycmVudEVsZW1lbnQ/LmZpZWxkc01ldGEgOiBKU09OLnBhcnNlKHRoaXMuY3VycmVudEVsZW1lbnQuZmllbGRzTWV0YSk7XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kSXRlbSA9IHRoaXMuY3VycmVudEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgPyB0aGlzLmN1cnJlbnRFbGVtZW50WydmaWVsZHNNZXRhJ10uZmluZChpdGVtID0+IGl0ZW1bJ3VuaXF1ZUlkZW50aWZpZXInXSA9PT0gZXZlbnQ/LnVuaXF1ZUlkZW50aWZpZXIpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0VGFibGVDb2x1bW4gPSBmb3VuZEl0ZW0/LnVuaXF1ZUlkZW50aWZpZXJcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFN1YmplY3QubmV4dChpbmRleCk7XG4gIH1cbiAgcmVtb3ZlU2VsZWN0ZWRUYWJsZUVsZW1lbnQoaW5kZXg6IG51bWJlciwgZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJykge1xuICAgICAgdGhpcy5jdXJyZW50RWxlbWVudFsnZmllbGRzTWV0YSddID0gdHlwZW9mIHRoaXMuY3VycmVudEVsZW1lbnQ/LmZpZWxkc01ldGEgPT09ICdvYmplY3QnID8gdGhpcy5jdXJyZW50RWxlbWVudD8uZmllbGRzTWV0YSA6IEpTT04ucGFyc2UodGhpcy5jdXJyZW50RWxlbWVudC5maWVsZHNNZXRhKTtcbiAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBpdGVtXG4gICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmN1cnJlbnRFbGVtZW50WydmaWVsZHNNZXRhJ10uZmluZEluZGV4KGl0ZW0gPT4gaXRlbVsndW5pcXVlSWRlbnRpZmllciddID09PSBldmVudD8udW5pcXVlSWRlbnRpZmllcik7XG4gICAgICAvLyBSZW1vdmUgdGhlIGl0ZW0gaWYgZm91bmRcbiAgICAgIGlmIChpdGVtSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEVsZW1lbnRbJ2ZpZWxkc01ldGEnXS5zcGxpY2UoaXRlbUluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RUYWJsZUNvbHVtbiA9IG51bGxcbiAgICB0aGlzLmVsZW1lbnRVcGRhdGUoaW5kZXgsIHRoaXMuY3VycmVudEVsZW1lbnQpXG4gIH1cbiAgLy8gU0tTMTlNQVIyNSBnZXQgdGhlIHNlbGVjdGVkIHRhYmxlIGNvbHVtblxuICBnZXRTZWxlY3RUYWJsZUNvbHVtbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RUYWJsZUNvbHVtbjtcbiAgfVxuICBzZWxlY3RIZWFkaW5nKGV2ZW50OiBhbnkpIHtcbiAgICAvL0FQLTEwTUFSMjUgRW1pdHMgdGhlIHNlbGVjdGVkIGhlYWRpbmcgZXZlbnQgIFxuICAgIHRoaXMuc2VsZWN0SGVhZGVyU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgfVxuXG5cbiAgZ2V0RWxlbWVudHMoKTogRm9ybUVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUVsZW1lbnRzLm1hcChlbGVtZW50ID0+ICh7XG4gICAgICAuLi5lbGVtZW50LFxuICAgICAgb3B0aW9uczogZWxlbWVudC5vcHRpb25zIHx8IFtdLFxuICAgIH0pKTtcbiAgfVxuICBzb3J0RWxlbWVudHNCeU9yZGVyKCk6IHZvaWQge1xuICAgIC8vQVAtMTBNQVIyNSBTb3J0IGVsZW1lbnRzIGJ5IGN1cnJlbnQgb3JkZXJcbiAgICB0aGlzLmZvcm1FbGVtZW50cy5zb3J0KChhLCBiKSA9PiBhLnF1ZXN0aW9uTnVtYmVyIC0gYi5xdWVzdGlvbk51bWJlcik7XG4gICAgdGhpcy5mb3JtRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGVsZW1lbnQucXVlc3Rpb25OdW1iZXIgPSBpbmRleCArIDE7XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gIH1cbiAgLy9BUC0xME1BUjI1IFJldHVybnMgdGhlIGN1cnJlbnQgYm9vayBkYXRhICBcbiAgZ2V0Qm9vaygpIHtcbiAgICByZXR1cm4gdGhpcy5ib29rO1xuICB9XG4gIHVwZGF0ZUJvb2soYm9vazogYW55KSB7XG4gICAgdGhpcy5ib29rID0gYm9vaztcbiAgICBjb25zdCB1cGRhdGVkU3ViUXVlc3Rpb25zID0gYm9vay5ib29rUXVlc3Rpb25zTWFwW3RoaXMudW5pcXVlX2lkXT8uc3ViUXVlc3Rpb25zID8/IFtdO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gdXBkYXRlZFN1YlF1ZXN0aW9ucztcbiAgICB0aGlzLmZvcm1FbGVtZW50c1N1YmplY3QubmV4dChbLi4udGhpcy5mb3JtRWxlbWVudHNdKTtcbiAgfVxuICBcbiAgLy8gSW4gRm9ybUJ1aWxkZXJTZXJ2aWNlXG4gIGRvd25sb2FkRWxlbWVudCgpIHtcbiAgICBsZXQgdHJhbnNsYXRpb25NYXA6IGFueSA9IHRoaXMuYm9vay50cmFuc2xhdGlvbk1hcFxuICAgIGNvbnN0IGtleXNUb1RyYW5zbGF0ZSA9IFsncXVlc3Rpb25UZXh0JywgJ2hlbHBUZXh0JywgJ3F1ZXN0aW9uJywgJ2xhYmVsJ107XG4gICAgbGV0IGRvd25sb2FkRm9ybUVsZW1lbnRzID0gdGhpcy5mb3JtRWxlbWVudHNcbiAgICBkb3dubG9hZEZvcm1FbGVtZW50cz8uZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGtleXNUb1RyYW5zbGF0ZS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgZWxlbWVudFtrZXldID0gdHJhbnNsYXRpb25NYXAuZW5bZWxlbWVudC5pZF0/LltrZXldID8gdHJhbnNsYXRpb25NYXAuZW5bZWxlbWVudC5pZF1ba2V5XSA6IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmKGVsZW1lbnQ/Llsnb3B0aW9ucyddICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudD8uWydvcHRpb25zJ10gIT09IG51bGwgJiYgIEFycmF5LmlzQXJyYXkoZWxlbWVudFsnb3B0aW9ucyddKSl7XG4gICAgICAgIGVsZW1lbnRbJ29wdGlvbnMnXS5mb3JFYWNoKChvcHQ6IGFueSkgPT4ge1xuICAgICAgICAgIG9wdC5sYWJlbCA9IHRyYW5zbGF0aW9uTWFwLmVuW29wdC5pZF0/LlsnbGFiZWwnXSA7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZihlbGVtZW50LnR5cGUgPT09ICdUYWJsZScgJiYgZWxlbWVudD8uZmllbGRzTWV0YSl7XG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQ/LmZpZWxkc01ldGEpICYmIHR5cGVvZiBlbGVtZW50Py5maWVsZHNNZXRhID09PSAnc3RyaW5nJyl7XG4gICAgICAgICAgZWxlbWVudC5maWVsZHNNZXRhID0gSlNPTi5wYXJzZShlbGVtZW50Py5maWVsZHNNZXRhKVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQ/LmZpZWxkc01ldGE/LmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgIGtleXNUb1RyYW5zbGF0ZS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZihrZXkgIT09ICdxdWVzdGlvbicpIGZpZWxkW2tleV0gPSB0cmFuc2xhdGlvbk1hcC5lbltmaWVsZC51bmlxdWVJZGVudGlmaWVyXT8uW2tleV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkPy5xdWVzdGlvbj8uWydvcHRpb25zJ10gIT09IG51bGwgJiYgIEFycmF5LmlzQXJyYXkoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSkpe1xuICAgICAgICAgICAgZmllbGQucXVlc3Rpb25bJ29wdGlvbnMnXS5mb3JFYWNoKG9wdCA9PiB7XG4gICAgICAgICAgICAgIG9wdC5sYWJlbCA9IHRyYW5zbGF0aW9uTWFwLmVuW29wdC5pZF0/LlsnbGFiZWwnXTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgZG93bmxvYWRCb29rID0gdGhpcy5ib29rXG4gICAgZG93bmxvYWRCb29rPy5xdWVzdGlvbmJvb2s/LmFjdGlvbj8uZm9yRWFjaCgoYWN0OiBhbnkpID0+e1xuICAgICAgYWN0Lm5hbWUgPSB0cmFuc2xhdGlvbk1hcC5lblthY3QuaWRdPy5bJ25hbWUnXTtcbiAgICB9KVxuICAgIC8vIFNLUzI4TUFSMjUgcmVtb3ZlIHFiUmVmZXJlbmNlUXVlc3Rpb25zIGZvciBkb3dubG9hZCB0aW1lIGFuZCBzdWJ0ZXh0IHRvIGNvbnZlcnQgdG9vIHN0cmluZ1xuICAgIGRvd25sb2FkRm9ybUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnYm9vaycpIHtcbiAgICAgICAgZGVsZXRlIGVsZW1lbnQucWJSZWZlcmVuY2VRdWVzdGlvbnM7XG4gICAgICB9XG4gICAgICBpZiggZWxlbWVudC5zdWJUZXh0KXtcbiAgICAgICAgZWxlbWVudC5zdWJUZXh0ID0gdHlwZW9mIGVsZW1lbnQ/LnN1YlRleHQgPT09ICdvYmplY3QnID8gZWxlbWVudD8uc3ViVGV4dCA6IEpTT04ucGFyc2UoZWxlbWVudFsnc3ViVGV4dCddKTtcbiAgICAgICAgY29uc3Qgc3RyaW5nQXJyYXlGaWVsZHMgPSBbJ2ZpZWxkJywncXVlcnlQYXJhbWV0ZXInLCAnc291cmNlUXVlc3Rpb25JZCcsICdxdWVyeUZpZWxkJywgJ3F1ZXJ5VmFsdWUnXTtcblxuICAgICAgICBpZiAoZWxlbWVudC5zdWJUZXh0KSB7XG4gICAgICAgICAgc3RyaW5nQXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LnN1YlRleHRba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3ViVGV4dFtrZXldID0gdmFsdWUuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gICAgICBcbiAgICAgICAgaWYoZWxlbWVudC50eXBlID09PSAnVGFibGUnKXtcbiAgICAgICAgICBlbGVtZW50LmZpZWxkc01ldGEuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBpZihmaWVsZD8ucXVlc3Rpb24/LnN1YlRleHQpe1xuICAgICAgICAgICAgICBzdHJpbmdBcnJheUZpZWxkcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5xdWVzdGlvbi5zdWJUZXh0W2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XSA9IHZhbHVlLnNwbGl0KCcsJykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKCBlbGVtZW50LnN1YlRleHQpe1xuICAgICAgICBlbGVtZW50LnN1YlRleHQgPSB0eXBlb2YgZWxlbWVudD8uc3ViVGV4dCAhPT0gJ29iamVjdCcgPyBlbGVtZW50Py5zdWJUZXh0IDogSlNPTi5zdHJpbmdpZnkoZWxlbWVudFsnc3ViVGV4dCddKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBkb3dubG9hZEJvb2suYm9va1F1ZXN0aW9uc01hcFtPYmplY3Qua2V5cyh0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcClbMF1dLnN1YlF1ZXN0aW9ucyA9IGRvd25sb2FkRm9ybUVsZW1lbnRzO1xuICAgIGNvbnNvbGUubG9nKCdib29rJywgZG93bmxvYWRCb29rKTtcbiAgICByZXR1cm4gZG93bmxvYWRCb29rO1xuICB9XG4gIC8vIEFQLTA2TUFSMjUgLSBFbGVtZW50IG5ldyBvcmRlciB1cGRhdGVcbiAgdXBkYXRlRWxlbWVudHNPcmRlcih1cGRhdGVkRWxlbWVudHM6IEZvcm1FbGVtZW50W10pOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IFsuLi51cGRhdGVkRWxlbWVudHNdO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KHRoaXMuZm9ybUVsZW1lbnRzKTtcbiAgfVxuICAvLyBSZW1vdmUgYW4gZWxlbWVudCBieSBJRFxuICAvLyBTYXZlIGVsZW1lbnRzIHRvIGxvY2FsU3RvcmFnZSBhbmQgdXBkYXRlIHRoZSBzdWJqZWN0XG4gIHJlbW92ZUVsZW1lbnRDb21wb25lbnQoaWQ6IGFueSkge1xuICAgIHRoaXMudGVtcEVsZW0gPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0ge31cbiAgICB0aGlzLmZvcm1FbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmlkICE9PSBpZCkge1xuICAgICAgICB0aGlzLnRlbXBFbGVtLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtRWxlbWVudHMgPSB0aGlzLnRlbXBFbGVtO1xuICAgIC8vIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmb3JtRWxlbWVudHMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLmZvcm1FbGVtZW50cykpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLmZvcm1FbGVtZW50c10pO1xuICB9XG4gIC8vIFNLUzE5TUFSMjUgdXBkYXRlIHRoZSBlbGVtZW50XG4gIGVsZW1lbnRVcGRhdGUoaW5kZXg6IGFueSwgZWxlbWVudDogYW55KSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4udGhpcy5nZXRFbGVtZW50cygpXTtcbiAgICBpZiAoZWxlbWVudHNbaW5kZXhdKSB7XG4gICAgICBlbGVtZW50c1tpbmRleF0gPSBlbGVtZW50XG4gICAgICB0aGlzLmZvcm1FbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLmVsZW1lbnRzXSk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFN1YmplY3QubmV4dChpbmRleCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|