@rangertechnologies/ngnxt 2.1.253 → 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 +258 -433
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/datatable/datatable.component.d.ts +0 -1
- package/lib/components/pick-location/pick-location.component.d.ts +0 -1
- package/lib/model/bookletWrapper.d.ts +0 -1
- package/lib/pages/booklet/booklet.component.d.ts +0 -2
- package/lib/pages/builder/element/element.component.d.ts +0 -3
- package/lib/pages/builder/properties/properties.component.d.ts +6 -2
- package/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.d.ts +0 -3
- package/lib/pages/questionbook/questionbook.component.d.ts +0 -1
- package/lib/pages/questionnaire/questionnaire.component.d.ts +0 -1
- package/lib/pipe/custom-translate.pipe.d.ts +1 -1
- package/lib/pipe/svg/svg.pipe.d.ts +10 -0
- package/lib/services/form-builder/form-builder.service.d.ts +1 -0
- package/lib/services/translation/translation.service.d.ts +1 -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 -156
- package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1757
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
- package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -105
- 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 -9
- 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 -658
- package/esm2022/lib/pages/builder/element/element.component.mjs +0 -508
- 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 -1089
- package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
- package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -681
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1118
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -801
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2219
- package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
- package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -36
- 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/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 -500
- package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -398
- 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 -351
- 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.253.tgz +0 -0
|
@@ -1,500 +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
|
-
if (element?.['options'] !== undefined && element?.['options'] !== null && Array.isArray(element['options'])) {
|
|
48
|
-
element['options'].forEach(opt => {
|
|
49
|
-
if (opt.id !== undefined && opt.id !== null) {
|
|
50
|
-
opt.id = opt.uniqueIdentifier;
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
book.bookQuestionsMap[this.unique_id].subQuestions = tempbook;
|
|
56
|
-
this.book = book;
|
|
57
|
-
this.book.bookQuestionsMap[this.unique_id]?.subQuestions?.forEach(element => {
|
|
58
|
-
if (this.book.sqOptions?.[element.id]) {
|
|
59
|
-
element.options = this.book.sqOptions[element.id].options;
|
|
60
|
-
}
|
|
61
|
-
this.addElement(element);
|
|
62
|
-
});
|
|
63
|
-
let translationMap = { en: {} };
|
|
64
|
-
const keysToTranslate = ['questionText', 'helpText', 'question', 'label'];
|
|
65
|
-
this.book.bookQuestionsMap[this.unique_id]?.subQuestions?.forEach(element => {
|
|
66
|
-
translationMap.en[element.id] = {};
|
|
67
|
-
keysToTranslate.forEach(key => {
|
|
68
|
-
if (element[key] !== undefined && element[key] !== null && typeof element[key] === 'string') {
|
|
69
|
-
translationMap.en[element.id][key] = element[key];
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
if (element?.['options'] !== undefined && element?.['options'] !== null && Array.isArray(element['options'])) {
|
|
73
|
-
element['options'].forEach(opt => {
|
|
74
|
-
if (opt.value !== undefined && opt.value !== null && typeof opt.value === 'string') {
|
|
75
|
-
translationMap.en[opt.id] = translationMap.en[opt.id] ?? {};
|
|
76
|
-
translationMap.en[opt.id]['value'] = opt.value;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
if (element.type === 'Table' && element?.fieldsMeta) {
|
|
81
|
-
if (!Array.isArray(element?.fieldsMeta) && typeof element?.fieldsMeta === 'string') {
|
|
82
|
-
element.fieldsMeta = JSON.parse(element?.fieldsMeta);
|
|
83
|
-
}
|
|
84
|
-
element?.fieldsMeta?.forEach(field => {
|
|
85
|
-
translationMap.en[field.uniqueIdentifier] = {};
|
|
86
|
-
keysToTranslate.forEach(key => {
|
|
87
|
-
if (field[key] !== undefined && field[key] !== null && typeof field[key] === 'string') {
|
|
88
|
-
if (key !== 'question')
|
|
89
|
-
translationMap.en[field.uniqueIdentifier][key] = field[key];
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
if (field?.question?.['options'] !== undefined && field?.question?.['options'] !== null && Array.isArray(field?.question?.['options'])) {
|
|
93
|
-
field.question['options'].forEach(opt => {
|
|
94
|
-
if (opt.value !== undefined && opt.value !== null && typeof opt.value === 'string') {
|
|
95
|
-
translationMap.en[opt.id] = translationMap.en[opt.id] ?? {};
|
|
96
|
-
translationMap.en[opt.id]['value'] = opt.value;
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
this.book?.questionbook?.action?.forEach((act) => {
|
|
104
|
-
if (!translationMap.en[act.id])
|
|
105
|
-
translationMap.en[act.id] = {};
|
|
106
|
-
translationMap.en[act.id]['name'] = act.name;
|
|
107
|
-
});
|
|
108
|
-
this.book['translationMap'] = translationMap;
|
|
109
|
-
}
|
|
110
|
-
//SKS28MAR25 Function to fetch refqb data
|
|
111
|
-
getRefQbData(refqbid) {
|
|
112
|
-
return this.http.get(`https://dev-api.valarhr.com/nxt?name=${refqbid}`);
|
|
113
|
-
}
|
|
114
|
-
//AP-17APR25 Function to generate unique id
|
|
115
|
-
addElementWithId() {
|
|
116
|
-
const prefix = 'ngnxt';
|
|
117
|
-
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
118
|
-
let core = '';
|
|
119
|
-
for (let i = 0; i < 14; i++) {
|
|
120
|
-
core += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
121
|
-
}
|
|
122
|
-
return prefix + core;
|
|
123
|
-
}
|
|
124
|
-
// AP 23MAY25 Updates the questionbook action buttons: adds or removes based on action type
|
|
125
|
-
updateQuestionBookActionButtons(button, action) {
|
|
126
|
-
if (!this.book.questionbook) {
|
|
127
|
-
this.book.questionbook = {};
|
|
128
|
-
}
|
|
129
|
-
if (action === 'add') {
|
|
130
|
-
this.book.questionbook.action.push(button);
|
|
131
|
-
}
|
|
132
|
-
else if (action === 'remove') {
|
|
133
|
-
this.book.questionbook.action = this.book.questionbook.action.filter((item) => item.id !== button.id);
|
|
134
|
-
}
|
|
135
|
-
this.actionSubject.next(this.book);
|
|
136
|
-
}
|
|
137
|
-
newBook() {
|
|
138
|
-
this.unique_id = this.addElementWithId();
|
|
139
|
-
this.book = {
|
|
140
|
-
'bookQuestionsMap': {
|
|
141
|
-
[this.unique_id]: {
|
|
142
|
-
'subQuestions': [],
|
|
143
|
-
'type': 'Book'
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
'questionbook': {
|
|
147
|
-
"action": [
|
|
148
|
-
{
|
|
149
|
-
"name": "Cancel",
|
|
150
|
-
"eventtoemit": "close",
|
|
151
|
-
"alt": "",
|
|
152
|
-
"positionPercent": 3,
|
|
153
|
-
"width": 100,
|
|
154
|
-
"textColor": "#ffffff",
|
|
155
|
-
"borderRadius": 6,
|
|
156
|
-
'id': 1,
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
"name": "Save",
|
|
160
|
-
"eventtoemit": "submit",
|
|
161
|
-
"alt": "",
|
|
162
|
-
"endpoint": "",
|
|
163
|
-
"method": "POST",
|
|
164
|
-
"positionPercent": 14,
|
|
165
|
-
"width": 100,
|
|
166
|
-
"textColor": "#ffffff",
|
|
167
|
-
"borderRadius": 6,
|
|
168
|
-
'id': 1,
|
|
169
|
-
}
|
|
170
|
-
]
|
|
171
|
-
},
|
|
172
|
-
'records': [{
|
|
173
|
-
'id': this.unique_id,
|
|
174
|
-
'title': 'Untitled',
|
|
175
|
-
'subQuestions': [{}]
|
|
176
|
-
}]
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
// AP 26FEB25 - clear the form elements
|
|
180
|
-
clearElements() {
|
|
181
|
-
this.formElements = [];
|
|
182
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
183
|
-
}
|
|
184
|
-
// Get the element component reference
|
|
185
|
-
getElementComponent() {
|
|
186
|
-
return this.elementComponent;
|
|
187
|
-
}
|
|
188
|
-
setElementComponent(component) {
|
|
189
|
-
this.elementComponent = component;
|
|
190
|
-
}
|
|
191
|
-
// Add a new element to the form
|
|
192
|
-
addElement(element) {
|
|
193
|
-
if (!element.options) {
|
|
194
|
-
element.options = []; // options is initialized
|
|
195
|
-
}
|
|
196
|
-
element['questionBookId'] = this.unique_id;
|
|
197
|
-
this.formElements.push(element);
|
|
198
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
199
|
-
if (this.book?.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]]?.subQuestions)
|
|
200
|
-
this.book.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]].subQuestions = this.formElements;
|
|
201
|
-
}
|
|
202
|
-
// SKS13MAR25 add table element
|
|
203
|
-
addTableElement(element, ind) {
|
|
204
|
-
//SKS13MAR25 Ensure currentElement exists
|
|
205
|
-
if (!this.currentElement)
|
|
206
|
-
return;
|
|
207
|
-
// Clone elements array
|
|
208
|
-
const elements = [...this.getElements()];
|
|
209
|
-
// SKS13MAR25 Find the element and update its columns
|
|
210
|
-
const index = elements.findIndex(el => el.id === this.currentElement.id);
|
|
211
|
-
let tempFieldsMeta = {
|
|
212
|
-
label: element.label,
|
|
213
|
-
apiName: element.fieldName,
|
|
214
|
-
isdeleted: false,
|
|
215
|
-
orderbyflag: false,
|
|
216
|
-
filterflag: false,
|
|
217
|
-
outputFlag: true,
|
|
218
|
-
ischild: false,
|
|
219
|
-
resultantflag: false,
|
|
220
|
-
searchflag: false,
|
|
221
|
-
fldType: element.type,
|
|
222
|
-
readOnly: false,
|
|
223
|
-
uniqueIdentifier: element.id,
|
|
224
|
-
question: {
|
|
225
|
-
style: {
|
|
226
|
-
labelClass: null,
|
|
227
|
-
labelStyle: null,
|
|
228
|
-
labelValueStyle: null,
|
|
229
|
-
inputClass: null,
|
|
230
|
-
inputStyle: null,
|
|
231
|
-
showLabel: true,
|
|
232
|
-
bookStyle: null,
|
|
233
|
-
direction: "ltr",
|
|
234
|
-
questionStyle: null,
|
|
235
|
-
},
|
|
236
|
-
subText: {
|
|
237
|
-
endpoint: null,
|
|
238
|
-
variable: null,
|
|
239
|
-
field: null,
|
|
240
|
-
defaultField: null,
|
|
241
|
-
sourceQuestionId: null,
|
|
242
|
-
valueField: null,
|
|
243
|
-
labelField: null,
|
|
244
|
-
isDependentField: false,
|
|
245
|
-
dependentValue: null,
|
|
246
|
-
queryField: null,
|
|
247
|
-
queryValue: null,
|
|
248
|
-
queryValueReference: null,
|
|
249
|
-
uniqueKey: null,
|
|
250
|
-
},
|
|
251
|
-
options: element.type === "Dropdown" || element.type === "Radio" || element.type === "Checkbox"
|
|
252
|
-
? []
|
|
253
|
-
: null,
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
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];
|
|
257
|
-
if (index !== -1) {
|
|
258
|
-
elements[index] = { ...elements[index], fieldsMeta: fieldsMeta };
|
|
259
|
-
}
|
|
260
|
-
// Emit the updated form elements
|
|
261
|
-
// this.formElementsSubject.next(elements);
|
|
262
|
-
this.formElements = elements;
|
|
263
|
-
this.formElementsSubject.next([...elements]);
|
|
264
|
-
this.selectedElementSubject.next(ind);
|
|
265
|
-
// Log for debugging
|
|
266
|
-
}
|
|
267
|
-
updateElement(index, updates) {
|
|
268
|
-
const elements = [...this.getElements()];
|
|
269
|
-
if (elements[index]) {
|
|
270
|
-
elements[index] = {
|
|
271
|
-
...elements[index],
|
|
272
|
-
...updates,
|
|
273
|
-
options: updates.options || elements[index].options || [],
|
|
274
|
-
};
|
|
275
|
-
this.formElementsSubject.next(elements);
|
|
276
|
-
}
|
|
277
|
-
if (index >= 0 && index < this.formElements.length) {
|
|
278
|
-
const updatedElement = {
|
|
279
|
-
...this.formElements[index],
|
|
280
|
-
...updates
|
|
281
|
-
};
|
|
282
|
-
if (updates.required !== undefined) {
|
|
283
|
-
if (updatedElement.questionText) {
|
|
284
|
-
const questionText = updatedElement.questionText.replace(/\s*\*+$/, '');
|
|
285
|
-
updatedElement.questionText = updates.required ? `${questionText} *` : questionText;
|
|
286
|
-
}
|
|
287
|
-
if (elements[index]) {
|
|
288
|
-
elements[index] = { ...elements[index], ...updates };
|
|
289
|
-
this.formElements = elements;
|
|
290
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
// Handle special cases
|
|
294
|
-
if (updates.required === true && updatedElement.questionText && !updatedElement.questionText.endsWith('*')) {
|
|
295
|
-
updatedElement.questionText = `${updatedElement.questionText} *`;
|
|
296
|
-
}
|
|
297
|
-
else if (updates.required === false && updatedElement.questionText && updatedElement.questionText.endsWith('*')) {
|
|
298
|
-
updatedElement.questionText = updatedElement.questionText.slice(0, -2);
|
|
299
|
-
}
|
|
300
|
-
this.formElements[index] = updatedElement;
|
|
301
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
302
|
-
// localStorage.setItem('formElements', JSON.stringify(this.formElements));
|
|
303
|
-
}
|
|
304
|
-
if (this.book?.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]]?.subQuestions)
|
|
305
|
-
this.book.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]].subQuestions = this.formElements;
|
|
306
|
-
}
|
|
307
|
-
updateTitle(event) {
|
|
308
|
-
//AP-10MAR25 Updates the title of the first record in the book
|
|
309
|
-
this.book.records[0].title = event;
|
|
310
|
-
}
|
|
311
|
-
setSelectedElement(index) {
|
|
312
|
-
this.selectedElementSubject.next(index);
|
|
313
|
-
this.currentElement = this.formElements[index];
|
|
314
|
-
this.selectTableColumn = null;
|
|
315
|
-
}
|
|
316
|
-
// SKS19MAR25 set the selected table column
|
|
317
|
-
setSelectedTableElement(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
|
-
}
|
|
322
|
-
const foundItem = this.currentElement?.type === 'Table' ? this.currentElement['fieldsMeta'].find(item => item['uniqueIdentifier'] === event?.uniqueIdentifier) : undefined;
|
|
323
|
-
this.selectTableColumn = foundItem?.uniqueIdentifier;
|
|
324
|
-
this.selectedElementSubject.next(index);
|
|
325
|
-
}
|
|
326
|
-
removeSelectedTableElement(index, event) {
|
|
327
|
-
this.currentElement = this.formElements[index];
|
|
328
|
-
if (this.currentElement?.type === 'Table') {
|
|
329
|
-
this.currentElement['fieldsMeta'] = typeof this.currentElement?.fieldsMeta === 'object' ? this.currentElement?.fieldsMeta : JSON.parse(this.currentElement.fieldsMeta);
|
|
330
|
-
// Find the index of the item
|
|
331
|
-
const itemIndex = this.currentElement['fieldsMeta'].findIndex(item => item['uniqueIdentifier'] === event?.uniqueIdentifier);
|
|
332
|
-
// Remove the item if found
|
|
333
|
-
if (itemIndex !== -1) {
|
|
334
|
-
this.currentElement['fieldsMeta'].splice(itemIndex, 1);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
this.selectTableColumn = null;
|
|
338
|
-
this.elementUpdate(index, this.currentElement);
|
|
339
|
-
}
|
|
340
|
-
// SKS19MAR25 get the selected table column
|
|
341
|
-
getSelectTableColumn() {
|
|
342
|
-
return this.selectTableColumn;
|
|
343
|
-
}
|
|
344
|
-
selectHeading(event) {
|
|
345
|
-
//AP-10MAR25 Emits the selected heading event
|
|
346
|
-
this.selectHeaderSubject.next(event);
|
|
347
|
-
}
|
|
348
|
-
getElements() {
|
|
349
|
-
return this.formElements.map(element => ({
|
|
350
|
-
...element,
|
|
351
|
-
options: element.options || [],
|
|
352
|
-
}));
|
|
353
|
-
}
|
|
354
|
-
sortElementsByOrder() {
|
|
355
|
-
//AP-10MAR25 Sort elements by current order
|
|
356
|
-
this.formElements.sort((a, b) => a.questionNumber - b.questionNumber);
|
|
357
|
-
this.formElements.forEach((element, index) => {
|
|
358
|
-
element.questionNumber = index + 1;
|
|
359
|
-
});
|
|
360
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
361
|
-
}
|
|
362
|
-
//AP-10MAR25 Returns the current book data
|
|
363
|
-
getBook() {
|
|
364
|
-
return this.book;
|
|
365
|
-
}
|
|
366
|
-
updateBook(book) {
|
|
367
|
-
this.book = book;
|
|
368
|
-
const updatedSubQuestions = book.bookQuestionsMap[this.unique_id]?.subQuestions ?? [];
|
|
369
|
-
// Update options from sqOptions if they exist
|
|
370
|
-
updatedSubQuestions.forEach(element => {
|
|
371
|
-
if (book.sqOptions?.[element.id]) {
|
|
372
|
-
element.options = book.sqOptions[element.id].options;
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
|
-
this.formElements = updatedSubQuestions;
|
|
376
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
377
|
-
}
|
|
378
|
-
// In FormBuilderService
|
|
379
|
-
downloadElement() {
|
|
380
|
-
let translationMap = this.book.translationMap;
|
|
381
|
-
const keysToTranslate = ['questionText', 'helpText', 'question', 'label'];
|
|
382
|
-
let downloadFormElements = this.formElements;
|
|
383
|
-
downloadFormElements?.forEach(element => {
|
|
384
|
-
keysToTranslate.forEach(key => {
|
|
385
|
-
element[key] = translationMap.en[element.id][key] ? translationMap.en[element.id][key] : null;
|
|
386
|
-
});
|
|
387
|
-
if (element?.['options'] !== undefined && element?.['options'] !== null && Array.isArray(element['options'])) {
|
|
388
|
-
element['options'].forEach(opt => {
|
|
389
|
-
opt.value = translationMap.en[opt.id]['value'];
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
if (element.type === 'Table' && element?.fieldsMeta) {
|
|
393
|
-
if (!Array.isArray(element?.fieldsMeta) && typeof element?.fieldsMeta === 'string') {
|
|
394
|
-
element.fieldsMeta = JSON.parse(element?.fieldsMeta);
|
|
395
|
-
}
|
|
396
|
-
element?.fieldsMeta?.forEach(field => {
|
|
397
|
-
keysToTranslate.forEach(key => {
|
|
398
|
-
if (key !== 'question')
|
|
399
|
-
field[key] = translationMap.en[field.uniqueIdentifier][key];
|
|
400
|
-
});
|
|
401
|
-
if (field?.question?.['options'] !== undefined && field?.question?.['options'] !== null && Array.isArray(field?.question?.['options'])) {
|
|
402
|
-
field.question['options'].forEach(opt => {
|
|
403
|
-
opt.value = translationMap.en[opt.id]['value'];
|
|
404
|
-
});
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
});
|
|
409
|
-
let downloadBook = this.book;
|
|
410
|
-
downloadBook?.questionbook?.action?.forEach((act) => {
|
|
411
|
-
act.name = translationMap.en[act.id]['name'];
|
|
412
|
-
});
|
|
413
|
-
// SKS28MAR25 remove qbReferenceQuestions for download time and subtext to convert too string
|
|
414
|
-
downloadFormElements.forEach(element => {
|
|
415
|
-
if (element.type === 'book') {
|
|
416
|
-
delete element.qbReferenceQuestions;
|
|
417
|
-
}
|
|
418
|
-
if (element.subText) {
|
|
419
|
-
element.subText = typeof element?.subText === 'object' ? element?.subText : JSON.parse(element['subText']);
|
|
420
|
-
const stringArrayFields = ['field', 'queryParameter', 'sourceQuestionId', 'queryField', 'queryValue'];
|
|
421
|
-
if (element.subText) {
|
|
422
|
-
stringArrayFields.forEach(key => {
|
|
423
|
-
const value = element.subText[key];
|
|
424
|
-
if (typeof value === 'string') {
|
|
425
|
-
element.subText[key] = value.split(',').map(item => item.trim());
|
|
426
|
-
}
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
if (element.type === 'Table') {
|
|
430
|
-
element.fieldsMeta.forEach(field => {
|
|
431
|
-
if (field?.question?.subText) {
|
|
432
|
-
stringArrayFields.forEach(key => {
|
|
433
|
-
const value = field.question.subText[key];
|
|
434
|
-
if (typeof value === 'string') {
|
|
435
|
-
field.question.subText[key] = value.split(',').map(item => item.trim());
|
|
436
|
-
}
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
if (element.subText) {
|
|
443
|
-
element.subText = typeof element?.subText !== 'object' ? element?.subText : JSON.stringify(element['subText']);
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
downloadBook.bookQuestionsMap[Object.keys(this.book.bookQuestionsMap)[0]].subQuestions = downloadFormElements;
|
|
447
|
-
console.log('book', downloadBook);
|
|
448
|
-
let tempElement = {};
|
|
449
|
-
downloadFormElements.forEach((element) => {
|
|
450
|
-
if (element.type === 'Dropdown' || element.type === 'Radio' || element.type === 'Checkbox') {
|
|
451
|
-
//AP 25FEB25 - Store the entire question with its options under its ID
|
|
452
|
-
tempElement[element.id] = {
|
|
453
|
-
...element,
|
|
454
|
-
options: element.options || []
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
});
|
|
458
|
-
downloadBook.sqOptions = tempElement;
|
|
459
|
-
return downloadBook;
|
|
460
|
-
}
|
|
461
|
-
// AP-06MAR25 - Element new order update
|
|
462
|
-
updateElementsOrder(updatedElements) {
|
|
463
|
-
this.formElements = [...updatedElements];
|
|
464
|
-
this.formElementsSubject.next(this.formElements);
|
|
465
|
-
}
|
|
466
|
-
// Remove an element by ID
|
|
467
|
-
// Save elements to localStorage and update the subject
|
|
468
|
-
removeElementComponent(id) {
|
|
469
|
-
this.tempElem = [];
|
|
470
|
-
this.selectedElementSubject.next(null);
|
|
471
|
-
this.currentElement = {};
|
|
472
|
-
this.formElements.forEach((element) => {
|
|
473
|
-
if (element.id !== id) {
|
|
474
|
-
this.tempElem.push(element);
|
|
475
|
-
}
|
|
476
|
-
});
|
|
477
|
-
this.formElements = this.tempElem;
|
|
478
|
-
// localStorage.setItem('formElements', JSON.stringify(this.formElements));
|
|
479
|
-
this.formElementsSubject.next([...this.formElements]);
|
|
480
|
-
}
|
|
481
|
-
// SKS19MAR25 update the element
|
|
482
|
-
elementUpdate(index, element) {
|
|
483
|
-
const elements = [...this.getElements()];
|
|
484
|
-
if (elements[index]) {
|
|
485
|
-
elements[index] = element;
|
|
486
|
-
this.formElements = elements;
|
|
487
|
-
this.formElementsSubject.next([...elements]);
|
|
488
|
-
this.selectedElementSubject.next(index);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
492
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, providedIn: 'root' });
|
|
493
|
-
}
|
|
494
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, decorators: [{
|
|
495
|
-
type: Injectable,
|
|
496
|
-
args: [{
|
|
497
|
-
providedIn: 'root',
|
|
498
|
-
}]
|
|
499
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
500
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvc2VydmljZXMvZm9ybS1idWlsZGVyL2Zvcm0tYnVpbGRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7QUFDYixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7OztBQTJEbkQsTUFBTSxPQUFPLGtCQUFrQjtJQW1CVDtJQWxCWixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsRUFBRSxDQUFDLENBQUM7SUFDN0Qsc0JBQXNCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztJQUNyRCxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQU0sSUFBSSxDQUFDLENBQUM7SUFDL0MsZ0JBQWdCLEdBQTRCLElBQUksQ0FBQztJQUN6RCxJQUFJLENBQU07SUFDVixTQUFTLENBQU07SUFDZixRQUFRLENBQVE7SUFFaEIsYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4RCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9ELGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25ELGNBQWMsQ0FBTTtJQUNwQixpQkFBaUIsQ0FBTTtJQUN2Qix5RUFBeUU7SUFFekUsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNsQyx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9ELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFTO1FBQ3JCLDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDbEUsNkNBQTZDO1FBQzdDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUM5QyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNYLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLDBDQUEwQztnQkFDeEYsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUNELElBQUcsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUM7Z0JBQzVHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQy9CLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDNUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUE7b0JBQy9CLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUE7UUFDN0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFFaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUM1RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksY0FBYyxHQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sZUFBZSxHQUFHLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxRSxjQUFjLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDNUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzVGLGNBQWMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBRyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLElBQUksT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztnQkFDNUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDL0IsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ25GLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDNUQsY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFDRCxJQUFHLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQztnQkFDbEQsSUFBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxJQUFJLE9BQU8sT0FBTyxFQUFFLFVBQVUsS0FBSyxRQUFRLEVBQUMsQ0FBQztvQkFDakYsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFDdEQsQ0FBQztnQkFDRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDbkMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQy9DLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzVCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDOzRCQUN0RixJQUFHLEdBQUcsS0FBSyxVQUFVO2dDQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNyRixDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQzt3QkFDdEksS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7NEJBQ3RDLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dDQUNuRixjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0NBQzVELGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7NEJBQ2pELENBQUM7d0JBQ0gsQ0FBQyxDQUFDLENBQUE7b0JBQ0osQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNwRCxJQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFDLEVBQUUsQ0FBQTtZQUMzRCxjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLGNBQWMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLFlBQVksQ0FBQyxPQUFlO1FBQzFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU0sd0NBQXdDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVBLDJDQUEyQztJQUMzQyxnQkFBZ0I7UUFDZixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsZ0VBQWdFLENBQUM7UUFDL0UsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUNELDJGQUEyRjtJQUMzRiwrQkFBK0IsQ0FBQyxNQUFXLEVBQUMsTUFBYztRQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUcsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsQ0FBQzthQUFLLElBQUcsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHO1lBQ1Ysa0JBQWtCLEVBQUU7Z0JBQ2xCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNoQixjQUFjLEVBQUUsRUFBRTtvQkFDbEIsTUFBTSxFQUFFLE1BQU07aUJBQ2Y7YUFDRjtZQUNELGNBQWMsRUFBRTtnQkFDZCxRQUFRLEVBQUU7b0JBQ1I7d0JBQ0UsTUFBTSxFQUFFLFFBQVE7d0JBQ2hCLGFBQWEsRUFBRSxPQUFPO3dCQUN0QixLQUFLLEVBQUUsRUFBRTt3QkFDVCxpQkFBaUIsRUFBRSxDQUFDO3dCQUNwQixPQUFPLEVBQUUsR0FBRzt3QkFDWixXQUFXLEVBQUUsU0FBUzt3QkFDdEIsY0FBYyxFQUFFLENBQUM7d0JBQ2pCLElBQUksRUFBRSxDQUFDO3FCQUVSO29CQUNEO3dCQUNFLE1BQU0sRUFBRSxNQUFNO3dCQUNkLGFBQWEsRUFBRSxRQUFRO3dCQUN2QixLQUFLLEVBQUUsRUFBRTt3QkFDVCxVQUFVLEVBQUUsRUFBRTt3QkFDZCxRQUFRLEVBQUUsTUFBTTt3QkFDaEIsaUJBQWlCLEVBQUUsRUFBRTt3QkFDckIsT0FBTyxFQUFFLEdBQUc7d0JBQ1osV0FBVyxFQUFFLFNBQVM7d0JBQ3RCLGNBQWMsRUFBRSxDQUFDO3dCQUNqQixJQUFJLEVBQUUsQ0FBQztxQkFDUjtpQkFDRjthQUNGO1lBQ0QsU0FBUyxFQUFFLENBQUM7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUNwQixPQUFPLEVBQUUsVUFBVTtvQkFDbkIsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDO2lCQUNyQixDQUFDO1NBQ0gsQ0FBQTtJQUNILENBQUM7SUFDRCx3Q0FBd0M7SUFDeEMsYUFBYTtRQUNYLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxzQ0FBc0M7SUFDdEMsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxTQUEyQjtRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsVUFBVSxDQUFDLE9BQW9CO1FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7UUFDakQsQ0FBQztRQUNELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBRyxJQUFJLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUNuTSxDQUFDO0lBQ0QsK0JBQStCO0lBQy9CLGVBQWUsQ0FBQyxPQUFZLEVBQUUsR0FBUTtRQUNwQyx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUNqQyx1QkFBdUI7UUFDdkIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLHFEQUFxRDtRQUNyRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXpFLElBQUksY0FBYyxHQUFHO1lBQ25CLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDMUIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsV0FBVyxFQUFFLEtBQUs7WUFDbEIsVUFBVSxFQUFFLEtBQUs7WUFDakIsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxhQUFhLEVBQUUsS0FBSztZQUNwQixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDckIsUUFBUSxFQUFFLEtBQUs7WUFDZixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUM1QixRQUFRLEVBQUM7Z0JBQ1AsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxJQUFJO29CQUNoQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLElBQUk7b0JBQ3JCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFLElBQUk7b0JBQ2YsU0FBUyxFQUFFLElBQUk7b0JBQ2YsU0FBUyxFQUFFLEtBQUs7b0JBQ2hCLGFBQWEsRUFBRSxJQUFJO2lCQUNwQjtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsUUFBUSxFQUFFLElBQUk7b0JBQ2QsUUFBUSxFQUFFLElBQUk7b0JBQ2QsS0FBSyxFQUFFLElBQUk7b0JBQ1gsWUFBWSxFQUFFLElBQUk7b0JBQ2xCLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZ0JBQWdCLEVBQUUsS0FBSztvQkFDdkIsY0FBYyxFQUFFLElBQUk7b0JBQ3BCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsbUJBQW1CLEVBQUUsSUFBSTtvQkFDekIsU0FBUyxFQUFFLElBQUk7aUJBQ2hCO2dCQUNELE9BQU8sRUFDUCxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVU7b0JBQ2hGLENBQUMsQ0FBQyxFQUFFO29CQUNKLENBQUMsQ0FBQyxJQUFJO2FBQ2I7U0FDRixDQUFDO1FBQ0YsSUFBSSxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUV6UixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsb0JBQW9CO0lBQ3RCLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYSxFQUFFLE9BQTZCO1FBQ3hELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDaEIsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNsQixHQUFHLE9BQU87Z0JBQ1YsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFO2FBQzFELENBQUM7WUFDRixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkQsTUFBTSxjQUFjLEdBQUc7Z0JBQ3JCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQzNCLEdBQUcsT0FBTzthQUNYLENBQUM7WUFDRixJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ25DLElBQUksY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNoQyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3hFLGNBQWMsQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUN0RixDQUFDO2dCQUNELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3BCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7b0JBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO29CQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztZQUNILENBQUM7WUFFRCx1QkFBdUI7WUFDdkIsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxjQUFjLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0csY0FBYyxDQUFDLFlBQVksR0FBRyxHQUFHLGNBQWMsQ0FBQyxZQUFZLElBQUksQ0FBQztZQUNuRSxDQUFDO2lCQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksY0FBYyxDQUFDLFlBQVksSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsSCxjQUFjLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUMxQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0RCwyRUFBMkU7UUFDN0UsQ0FBQztRQUNELElBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7SUFDbk0sQ0FBQztJQUNELFdBQVcsQ0FBQyxLQUFVO1FBQ3BCLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7SUFDL0IsQ0FBQztJQUNELDJDQUEyQztJQUMzQyx1QkFBdUIsQ0FBQyxLQUFVLEVBQUUsS0FBVTtRQUM1QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDOUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pLLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUMzSyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxFQUFFLGdCQUFnQixDQUFBO1FBQ3BELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELDBCQUEwQixDQUFDLEtBQWEsRUFBRSxLQUFVO1FBQ2xELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkssNkJBQTZCO1lBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDNUgsMkJBQTJCO1lBQzNCLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ2hELENBQUM7SUFDRCwyQ0FBMkM7SUFDM0Msb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFDRCxhQUFhLENBQUMsS0FBVTtRQUN0QiwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBR0QsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUU7U0FDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsbUJBQW1CO1FBQ2pCLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzNDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCw0Q0FBNEM7SUFDNUMsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsVUFBVSxDQUFDLElBQVM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUM7UUFFdEYsOENBQThDO1FBQzlDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNwQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQztRQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLGVBQWU7UUFDYixJQUFJLGNBQWMsR0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQTtRQUNsRCxNQUFNLGVBQWUsR0FBRyxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtRQUM1QyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdEMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2xHLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBRyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLElBQUksT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztnQkFDNUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDL0IsR0FBRyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBRTtnQkFDbEQsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1lBQ0QsSUFBRyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxPQUFPLEVBQUUsVUFBVSxFQUFDLENBQUM7Z0JBQ2xELElBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxPQUFPLE9BQU8sRUFBRSxVQUFVLEtBQUssUUFBUSxFQUFDLENBQUM7b0JBQ2pGLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUE7Z0JBQ3RELENBQUM7Z0JBQ0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ25DLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzVCLElBQUcsR0FBRyxLQUFLLFVBQVU7NEJBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JGLENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQzt3QkFDdEksS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7NEJBQ3RDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2pELENBQUMsQ0FBQyxDQUFBO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBQzVCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3ZELEdBQUcsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUE7UUFDRiw2RkFBNkY7UUFDN0Ysb0JBQW9CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDdEMsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBQyxDQUFDO2dCQUNuQixPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sT0FBTyxFQUFFLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNHLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUVyRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDcEIsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUM5QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDOzRCQUM5QixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ25FLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFHLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFDLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUNqQyxJQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUM7NEJBQzNCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQ0FDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQzFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7b0NBQzlCLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0NBQzFFLENBQUM7NEJBQ0gsQ0FBQyxDQUFDLENBQUM7d0JBQ0wsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBQyxDQUFDO2dCQUNuQixPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sT0FBTyxFQUFFLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakgsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDO1FBQzlHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xDLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQztRQUUxQixvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN2QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzNGLHNFQUFzRTtnQkFDdEUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRztvQkFDeEIsR0FBRyxPQUFPO29CQUNWLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUU7aUJBQy9CLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUNyQyxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBQ0Qsd0NBQXdDO0lBQ3hDLG1CQUFtQixDQUFDLGVBQThCO1FBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCwwQkFBMEI7SUFDMUIsdURBQXVEO0lBQ3ZELHNCQUFzQixDQUFDLEVBQU87UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQTtRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO1lBQ3pDLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsZ0NBQWdDO0lBQ2hDLGFBQWEsQ0FBQyxLQUFVLEVBQUUsT0FBWTtRQUNwQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwQixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFBO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQzt3R0EzZlUsa0JBQWtCOzRHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFQIDIySkFOMjVcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhZ2VzL2J1aWxkZXIvZWxlbWVudC9lbGVtZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbnRlcmZhY2UgRm9ybUVsZW1lbnQge1xuICBhY3Rpb246IGFueTtcbiAgaWQ6IGFueTtcbiAgdHlwZTogc3RyaW5nO1xuICBuYW1lOiBhbnk7XG4gIHF1ZXN0aW9uVGV4dD86IHN0cmluZztcbiAgcXVlc3Rpb24/OiBzdHJpbmc7XG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIGlzUmVhZE9ubHk/OiBib29sZWFuO1xuICBpc0hpZGRlbj86IGJvb2xlYW47XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcmVmZXJlbmNlRmllbGQ/OiBhbnk7XG4gIGFkZGl0aW9uYWxSaWNoQ29udGVudD86IGFueTtcbiAgZ3JvdXBOYW1lPzogYW55O1xuICBpc0RhdGVCYWNrd2FyZD86IGJvb2xlYW47XG4gIHRpdGxlPzogYW55O1xuICBzdWJUaXRsZT86IGFueTtcbiAgc2l6ZT86IG51bWJlcjtcbiAgaXNEYXRlRm9yd2FyZD86IGJvb2xlYW47XG4gIGlzT3B0aW9uYWw/OiBib29sZWFuO1xuICBpc1RpdGxlPzogYm9vbGVhbjtcbiAgbmV4dFF1ZXN0aW9uPzogYW55O1xuICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM/OiBhbnk7XG4gIHF1ZXN0aW9uTnVtYmVyPzogbnVtYmVyO1xuICBvcmRlcjogbnVtYmVyO1xuICBxdWVzdGlvbkJvb2tJZD86IGFueTtcbiAgZmllbGRzTWV0YT86IGFueTtcbiAgdHJhY2tpbmdJZD86IGFueTtcbiAgcmVjb3JkSWQ/OiBhbnk7XG4gIHFiUmVmZXJlbmNlPzogYW55O1xuICBxYlJlZmVyZW5jZVF1ZXN0aW9ucz86IGFueTtcbiAgcHJpbWFyeUtleTogYm9vbGVhbixcbiAgc3R5bGU6IHtcbiAgICBsYWJlbENsYXNzOiBhbnksXG4gICAgbGFiZWxTdHlsZTogYW55LFxuICAgIGxhYmVsVmFsdWVTdHlsZTogYW55LFxuICAgIGlucHV0Q2xhc3M6IGFueSxcbiAgICBpbnB1dFN0eWxlOiBhbnksXG4gICAgc2hvd0xhYmVsOiBib29sZWFuLFxuICAgIGJvb2tTdHlsZTogYW55LFxuICAgIGRpcmVjdGlvbjogYW55LFxuICAgIHF1ZXN0aW9uU3R5bGU6IGFueSxcbiAgfSxcbiAgICAvLyBBUCAyNUZFQjI1IC0gb3B0aW9ucyBhcnJheVxuICBvcHRpb25zPzogQXJyYXk8e1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgdW5pcXVlSWRlbnRpZmllcjogYW55O1xuICAgIGlkOiBhbnk7XG4gIH0+O1xuICBzdWJUZXh0OiBhbnlcbn1cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQnVpbGRlclNlcnZpY2Uge1xuICBwcml2YXRlIGZvcm1FbGVtZW50czogRm9ybUVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIGZvcm1FbGVtZW50c1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvcm1FbGVtZW50W10+KFtdKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZEVsZW1lbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcbiAgcHJpdmF0ZSBzZWxlY3RIZWFkZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwcml2YXRlIGFjdGlvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gIHByaXZhdGUgZWxlbWVudENvbXBvbmVudDogRWxlbWVudENvbXBvbmVudCB8IG51bGwgPSBudWxsO1xuICBib29rOiBhbnk7XG4gIHVuaXF1ZV9pZDogYW55O1xuICB0ZW1wRWxlbTogYW55W107XG5cbiAgZm9ybUVsZW1lbnRzJCA9IHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgc2VsZWN0ZWRFbGVtZW50JCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgc2VsZWN0SGVhZGVyU3ViamVjdCQgPSB0aGlzLnNlbGVjdEhlYWRlclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGFjdGlvblN1YmplY3QkID0gdGhpcy5hY3Rpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBjdXJyZW50RWxlbWVudDogYW55O1xuICBzZWxlY3RUYWJsZUNvbHVtbjogYW55O1xuICAvLyBib29rOiB7IGJvb2tRdWVzdGlvbnNNYXA6IHsgdW5pcXVlX2lkOiB7IHN1YlF1ZXN0aW9uczogYW55W107IH07IH07IH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XG4gICAgLy8gTG9hZCBzYXZlZCBlbGVtZW50cyBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gW107XG4gICAgY29uc3Qgc2F2ZWRGb3JtRWxlbWVudHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUVsZW1lbnRzJyk7XG4gICAgaWYgKHNhdmVkRm9ybUVsZW1lbnRzKSB7XG4gICAgICB0aGlzLmZvcm1FbGVtZW50cyA9IEpTT04ucGFyc2Uoc2F2ZWRGb3JtRWxlbWVudHMpO1xuICAgICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gICAgfVxuICB9XG4gXG4gIGludGlhbGl6ZUJvb2soYm9vazogYW55KSB7XG4gICAgLy8gQVAgMTNNQVIyNSAtIEdldCB0aGUgdW5pcXVlIGlkIGluIHRoZSBib29rUXVlc3Rpb25zTWFwIFxuICAgIHRoaXMudW5pcXVlX2lkID0gT2JqZWN0LmtleXMoYm9vay5ib29rUXVlc3Rpb25zTWFwKVswXTtcbiAgICBsZXQgdGVtcGJvb2sgPSBib29rLmJvb2tRdWVzdGlvbnNNYXBbdGhpcy51bmlxdWVfaWRdLnN1YlF1ZXN0aW9ucztcbiAgICAvLyBTS1MyOE1BUjI1IHVwZGF0ZSBuZXN0ZWQgYm9vayBRdWVzdGlvbnNNYXBcbiAgICB0ZW1wYm9vay5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImJvb2tcIiAmJiBlbGVtZW50LnFiUmVmZXJlbmNlKSB7XG4gICAgICAgIHRoaXMuZ2V0UmVmUWJEYXRhKGVsZW1lbnQucWJSZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRbJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10gPSByZXNwb25zZTsgLy8gQXNzaWduIHJlc3BvbnNlIHRvIHFiUmVmZXJlbmNlUXVlc3Rpb25zXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBUEkgRXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZihlbGVtZW50Py5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQ/Llsnb3B0aW9ucyddICE9PSBudWxsICYmICBBcnJheS5pc0FycmF5KGVsZW1lbnRbJ29wdGlvbnMnXSkpe1xuICAgICAgICBlbGVtZW50WydvcHRpb25zJ10uZm9yRWFjaChvcHQgPT4ge1xuICAgICAgICAgIGlmIChvcHQuaWQgIT09IHVuZGVmaW5lZCAmJiBvcHQuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG9wdC5pZCA9IG9wdC51bmlxdWVJZGVudGlmaWVyXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIGJvb2suYm9va1F1ZXN0aW9uc01hcFt0aGlzLnVuaXF1ZV9pZF0uc3ViUXVlc3Rpb25zID0gdGVtcGJvb2tcbiAgICB0aGlzLmJvb2sgPSBib29rXG5cbiAgICB0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcFt0aGlzLnVuaXF1ZV9pZF0/LnN1YlF1ZXN0aW9ucz8uZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmJvb2suc3FPcHRpb25zPy5bZWxlbWVudC5pZF0pIHtcbiAgICAgICAgZWxlbWVudC5vcHRpb25zID0gdGhpcy5ib29rLnNxT3B0aW9uc1tlbGVtZW50LmlkXS5vcHRpb25zO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuICAgIGxldCB0cmFuc2xhdGlvbk1hcDogYW55ID0geyBlbjoge30gfTtcbiAgICBjb25zdCBrZXlzVG9UcmFuc2xhdGUgPSBbJ3F1ZXN0aW9uVGV4dCcsICdoZWxwVGV4dCcsICdxdWVzdGlvbicsICdsYWJlbCddO1xuICAgIHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwW3RoaXMudW5pcXVlX2lkXT8uc3ViUXVlc3Rpb25zPy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgdHJhbnNsYXRpb25NYXAuZW5bZWxlbWVudC5pZF0gPSB7fTsgXG4gICAgICBrZXlzVG9UcmFuc2xhdGUuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudFtrZXldICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudFtrZXldICE9PSBudWxsICYmIHR5cGVvZiBlbGVtZW50W2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdHJhbnNsYXRpb25NYXAuZW5bZWxlbWVudC5pZF1ba2V5XSA9IGVsZW1lbnRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZihlbGVtZW50Py5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQ/Llsnb3B0aW9ucyddICE9PSBudWxsICYmICBBcnJheS5pc0FycmF5KGVsZW1lbnRbJ29wdGlvbnMnXSkpe1xuICAgICAgICBlbGVtZW50WydvcHRpb25zJ10uZm9yRWFjaChvcHQgPT4ge1xuICAgICAgICAgIGlmIChvcHQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvcHQudmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIG9wdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uTWFwLmVuW29wdC5pZF0gPSB0cmFuc2xhdGlvbk1hcC5lbltvcHQuaWRdID8/IHt9O1xuICAgICAgICAgICAgdHJhbnNsYXRpb25NYXAuZW5bb3B0LmlkXVsndmFsdWUnXSA9IG9wdC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZihlbGVtZW50LnR5cGUgPT09ICdUYWJsZScgJiYgZWxlbWVudD8uZmllbGRzTWV0YSl7XG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQ/LmZpZWxkc01ldGEpICYmIHR5cGVvZiBlbGVtZW50Py5maWVsZHNNZXRhID09PSAnc3RyaW5nJyl7XG4gICAgICAgICAgZWxlbWVudC5maWVsZHNNZXRhID0gSlNPTi5wYXJzZShlbGVtZW50Py5maWVsZHNNZXRhKVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQ/LmZpZWxkc01ldGE/LmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgIHRyYW5zbGF0aW9uTWFwLmVuW2ZpZWxkLnVuaXF1ZUlkZW50aWZpZXJdID0ge307IFxuICAgICAgICAgIGtleXNUb1RyYW5zbGF0ZS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGRba2V5XSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkW2tleV0gIT09IG51bGwgJiYgdHlwZW9mIGZpZWxkW2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGlmKGtleSAhPT0gJ3F1ZXN0aW9uJykgdHJhbnNsYXRpb25NYXAuZW5bZmllbGQudW5pcXVlSWRlbnRpZmllcl1ba2V5XSA9IGZpZWxkW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkPy5xdWVzdGlvbj8uWydvcHRpb25zJ10gIT09IG51bGwgJiYgIEFycmF5LmlzQXJyYXkoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSkpe1xuICAgICAgICAgICAgZmllbGQucXVlc3Rpb25bJ29wdGlvbnMnXS5mb3JFYWNoKG9wdCA9PiB7XG4gICAgICAgICAgICAgIGlmIChvcHQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvcHQudmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIG9wdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk1hcC5lbltvcHQuaWRdID0gdHJhbnNsYXRpb25NYXAuZW5bb3B0LmlkXSA/PyB7fTtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk1hcC5lbltvcHQuaWRdWyd2YWx1ZSddID0gb3B0LnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ib29rPy5xdWVzdGlvbmJvb2s/LmFjdGlvbj8uZm9yRWFjaCgoYWN0OiBhbnkpID0+e1xuICAgICAgaWYoIXRyYW5zbGF0aW9uTWFwLmVuW2FjdC5pZF0pIHRyYW5zbGF0aW9uTWFwLmVuW2FjdC5pZF09e31cbiAgICAgIHRyYW5zbGF0aW9uTWFwLmVuW2FjdC5pZF1bJ25hbWUnXSA9IGFjdC5uYW1lO1xuICAgIH0pXG4gICAgdGhpcy5ib29rWyd0cmFuc2xhdGlvbk1hcCddID0gdHJhbnNsYXRpb25NYXBcbiAgfVxuXG4gIC8vU0tTMjhNQVIyNSBGdW5jdGlvbiB0byBmZXRjaCByZWZxYiBkYXRhXG4gIGdldFJlZlFiRGF0YShyZWZxYmlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYGh0dHBzOi8vZGV2LWFwaS52YWxhcmhyLmNvbS9ueHQ/bmFtZT0ke3JlZnFiaWR9YCk7XG4gIH1cblxuICAgLy9BUC0xN0FQUjI1IEZ1bmN0aW9uIHRvIGdlbmVyYXRlIHVuaXF1ZSBpZFxuICAgYWRkRWxlbWVudFdpdGhJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9ICduZ254dCc7IFxuICAgIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgICBsZXQgY29yZSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ7IGkrKykge1xuICAgICAgY29yZSArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXggKyBjb3JlOyBcbiAgfVxuICAvLyBBUCAyM01BWTI1IFVwZGF0ZXMgdGhlIHF1ZXN0aW9uYm9vayBhY3Rpb24gYnV0dG9uczogYWRkcyBvciByZW1vdmVzIGJhc2VkIG9uIGFjdGlvbiB0eXBlXG4gIHVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnV0dG9uOiBhbnksYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYm9vay5xdWVzdGlvbmJvb2spIHtcbiAgICAgIHRoaXMuYm9vay5xdWVzdGlvbmJvb2sgPSB7fTtcbiAgICB9XG4gICAgaWYoYWN0aW9uID09PSAnYWRkJykge1xuICAgICAgdGhpcy5ib29rLnF1ZXN0aW9uYm9vay5hY3Rpb24ucHVzaChidXR0b24pO1xuICAgIH1lbHNlIGlmKGFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgIHRoaXMuYm9vay5xdWVzdGlvbmJvb2suYWN0aW9uID0gdGhpcy5ib29rLnF1ZXN0aW9uYm9vay5hY3Rpb24uZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgIT09IGJ1dHRvbi5pZCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aW9uU3ViamVjdC5uZXh0KHRoaXMuYm9vayk7XG4gIH1cbiAgXG4gIG5ld0Jvb2soKSB7XG4gICAgdGhpcy51bmlxdWVfaWQgPSB0aGlzLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgICB0aGlzLmJvb2sgPSB7XG4gICAgICAnYm9va1F1ZXN0aW9uc01hcCc6IHtcbiAgICAgICAgW3RoaXMudW5pcXVlX2lkXToge1xuICAgICAgICAgICdzdWJRdWVzdGlvbnMnOiBbXSxcbiAgICAgICAgICAndHlwZSc6ICdCb29rJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJ3F1ZXN0aW9uYm9vayc6IHtcbiAgICAgICAgXCJhY3Rpb25cIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhbmNlbFwiLFxuICAgICAgICAgICAgXCJldmVudHRvZW1pdFwiOiBcImNsb3NlXCIsXG4gICAgICAgICAgICBcImFsdFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJwb3NpdGlvblBlcmNlbnRcIjogMyxcbiAgICAgICAgICAgIFwid2lkdGhcIjogMTAwLFxuICAgICAgICAgICAgXCJ0ZXh0Q29sb3JcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgICAgICBcImJvcmRlclJhZGl1c1wiOiA2LFxuICAgICAgICAgICAgJ2lkJzogMSxcblxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiU2F2ZVwiLFxuICAgICAgICAgICAgXCJldmVudHRvZW1pdFwiOiBcInN1Ym1pdFwiLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnRcIjogXCJcIixcbiAgICAgICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICAgICAgXCJwb3NpdGlvblBlcmNlbnRcIjogMTQsICBcbiAgICAgICAgICAgIFwid2lkdGhcIjogMTAwLFxuICAgICAgICAgICAgXCJ0ZXh0Q29sb3JcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgICAgICBcImJvcmRlclJhZGl1c1wiOiA2LFxuICAgICAgICAgICAgJ2lkJzogMSxcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAncmVjb3Jkcyc6IFt7XG4gICAgICAgICdpZCc6IHRoaXMudW5pcXVlX2lkLFxuICAgICAgICAndGl0bGUnOiAnVW50aXRsZWQnLFxuICAgICAgICAnc3ViUXVlc3Rpb25zJzogW3t9XVxuICAgICAgfV1cbiAgICB9XG4gIH1cbiAgLy8gQVAgMjZGRUIyNSAtIGNsZWFyIHRoZSBmb3JtIGVsZW1lbnRzIFxuICBjbGVhckVsZW1lbnRzKCkge1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gW107XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gIH1cbiAgLy8gR2V0IHRoZSBlbGVtZW50IGNvbXBvbmVudCByZWZlcmVuY2VcbiAgZ2V0RWxlbWVudENvbXBvbmVudCgpOiBFbGVtZW50Q29tcG9uZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENvbXBvbmVudDtcbiAgfVxuXG4gIHNldEVsZW1lbnRDb21wb25lbnQoY29tcG9uZW50OiBFbGVtZW50Q29tcG9uZW50KSB7XG4gICAgdGhpcy5lbGVtZW50Q29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9XG5cbiAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGZvcm1cbiAgYWRkRWxlbWVudChlbGVtZW50OiBGb3JtRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICBlbGVtZW50Lm9wdGlvbnMgPSBbXTsgLy8gb3B0aW9ucyBpcyBpbml0aWFsaXplZFxuICAgIH1cbiAgICBlbGVtZW50WydxdWVzdGlvbkJvb2tJZCddID0gdGhpcy51bmlxdWVfaWQ7XG4gICAgdGhpcy5mb3JtRWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB0aGlzLmZvcm1FbGVtZW50c1N1YmplY3QubmV4dChbLi4udGhpcy5mb3JtRWxlbWVudHNdKTtcbiAgICBpZih0aGlzLmJvb2s/LmJvb2tRdWVzdGlvbnNNYXBbT2JqZWN0LmtleXModGhpcy5ib29rLmJvb2tRdWVzdGlvbnNNYXApWzBdXT8uc3ViUXVlc3Rpb25zKSB0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcFtPYmplY3Qua2V5cyh0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcClbMF1dLnN1YlF1ZXN0aW9ucyA9IHRoaXMuZm9ybUVsZW1lbnRzXG4gIH1cbiAgLy8gU0tTMTNNQVIyNSBhZGQgdGFibGUgZWxlbWVudFxuICBhZGRUYWJsZUVsZW1lbnQoZWxlbWVudDogYW55LCBpbmQgOmFueSkge1xuICAgIC8vU0tTMTNNQVIyNSBFbnN1cmUgY3VycmVudEVsZW1lbnQgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRFbGVtZW50KSByZXR1cm47XG4gICAgLy8gQ2xvbmUgZWxlbWVudHMgYXJyYXlcbiAgICBjb25zdCBlbGVtZW50cyA9IFsuLi50aGlzLmdldEVsZW1lbnRzKCldO1xuXG4gICAgLy8gU0tTMTNNQVIyNSBGaW5kIHRoZSBlbGVtZW50IGFuZCB1cGRhdGUgaXRzIGNvbHVtbnNcbiAgICBjb25zdCBpbmRleCA9IGVsZW1lbnRzLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gdGhpcy5jdXJyZW50RWxlbWVudC5pZCk7XG5cbiAgICBsZXQgdGVtcEZpZWxkc01ldGEgPSB7XG4gICAgICBsYWJlbDogZWxlbWVudC5sYWJlbCxcbiAgICAgIGFwaU5hbWU6IGVsZW1lbnQuZmllbGROYW1lLFxuICAgICAgaXNkZWxldGVkOiBmYWxzZSxcbiAgICAgIG9yZGVyYnlmbGFnOiBmYWxzZSxcbiAgICAgIGZpbHRlcmZsYWc6IGZhbHNlLFxuICAgICAgb3V0cHV0RmxhZzogdHJ1ZSxcbiAgICAgIGlzY2hpbGQ6IGZhbHNlLFxuICAgICAgcmVzdWx0YW50ZmxhZzogZmFsc2UsXG4gICAgICBzZWFyY2hmbGFnOiBmYWxzZSxcbiAgICAgIGZsZFR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVuaXF1ZUlkZW50aWZpZXI6IGVsZW1lbnQuaWQsXG4gICAgICBxdWVzdGlvbjp7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgbGFiZWxDbGFzczogbnVsbCxcbiAgICAgICAgICBsYWJlbFN0eWxlOiBudWxsLFxuICAgICAgICAgIGxhYmVsVmFsdWVTdHlsZTogbnVsbCxcbiAgICAgICAgICBpbnB1dENsYXNzOiBudWxsLFxuICAgICAgICAgIGlucHV0U3R5bGU6IG51bGwsXG4gICAgICAgICAgc2hvd0xhYmVsOiB0cnVlLFxuICAgICAgICAgIGJvb2tTdHlsZTogbnVsbCxcbiAgICAgICAgICBkaXJlY3Rpb246IFwibHRyXCIsXG4gICAgICAgICAgcXVlc3Rpb25TdHlsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgc3ViVGV4dDoge1xuICAgICAgICAgIGVuZHBvaW50OiBudWxsLFxuICAgICAgICAgIHZhcmlhYmxlOiBudWxsLFxuICAgICAgICAgIGZpZWxkOiBudWxsLFxuICAgICAgICAgIGRlZmF1bHRGaWVsZDogbnVsbCxcbiAgICAgICAgICBzb3VyY2VRdWVzdGlvbklkOiBudWxsLFxuICAgICAgICAgIHZhbHVlRmllbGQ6IG51bGwsXG4gICAgICAgICAgbGFiZWxGaWVsZDogbnVsbCxcbiAgICAgICAgICBpc0RlcGVuZGVudEZpZWxkOiBmYWxzZSxcbiAgICAgICAgICBkZXBlbmRlbnRWYWx1ZTogbnVsbCxcbiAgICAgICAgICBxdWVyeUZpZWxkOiBudWxsLFxuICAgICAgICAgIHF1ZXJ5VmFsdWU6IG51bGwsXG4gICAgICAgICAgcXVlcnlWYWx1ZVJlZmVyZW5jZTogbnVsbCxcbiAgICAgICAgICB1bmlxdWVLZXk6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnM6XG4gICAgICAgIGVsZW1lbnQudHlwZSA9PT0gXCJEcm9wZG93blwiIHx8IGVsZW1lbnQudHlwZSA9PT0gXCJSYWRpb1wiIHx8IGVsZW1lbnQudHlwZSA9PT0gXCJDaGVja2JveFwiXG4gICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgfVxuICAgIH07ICAgIFxuICAgIGxldCBmaWVsZHNNZXRhID0gWy4uLihBcnJheS5pc0FycmF5KHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhKSA/IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhIDogKHR5cGVvZiB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF0uZmllbGRzTWV0YSA9PT0gJ3N0cmluZycgPyAoSlNPTi5wYXJzZSh0aGlzLmZvcm1FbGVtZW50c1tpbmRleF0uZmllbGRzTWV0YSkpIDogW3RoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhXSkpLCB0ZW1wRmllbGRzTWV0YV07XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBlbGVtZW50c1tpbmRleF0gPSB7IC4uLmVsZW1lbnRzW2luZGV4XSwgZmllbGRzTWV0YTogZmllbGRzTWV0YSB9O1xuICAgIH1cblxuICAgIC8vIEVtaXQgdGhlIHVwZGF0ZWQgZm9ybSBlbGVtZW50c1xuICAgIC8vIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KGVsZW1lbnRzKTtcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi5lbGVtZW50c10pO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KGluZCk7XG4gICAgLy8gTG9nIGZvciBkZWJ1Z2dpbmdcbiAgfVxuXG4gIHVwZGF0ZUVsZW1lbnQoaW5kZXg6IG51bWJlciwgdXBkYXRlczogUGFydGlhbDxGb3JtRWxlbWVudD4pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IFsuLi50aGlzLmdldEVsZW1lbnRzKCldO1xuICAgIGlmIChlbGVtZW50c1tpbmRleF0pIHtcbiAgICAgIGVsZW1lbnRzW2luZGV4XSA9IHtcbiAgICAgICAgLi4uZWxlbWVudHNbaW5kZXhdLFxuICAgICAgICAuLi51cGRhdGVzLFxuICAgICAgICBvcHRpb25zOiB1cGRhdGVzLm9wdGlvbnMgfHwgZWxlbWVudHNbaW5kZXhdLm9wdGlvbnMgfHwgW10sXG4gICAgICB9O1xuICAgICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoZWxlbWVudHMpO1xuICAgIH1cblxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5mb3JtRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IHtcbiAgICAgICAgLi4udGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLFxuICAgICAgICAuLi51cGRhdGVzXG4gICAgICB9O1xuICAgICAgaWYgKHVwZGF0ZXMucmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0KSB7XG4gICAgICAgICAgY29uc3QgcXVlc3Rpb25UZXh0ID0gdXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0LnJlcGxhY2UoL1xccypcXCorJC8sICcnKTtcbiAgICAgICAgICB1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQgPSB1cGRhdGVzLnJlcXVpcmVkID8gYCR7cXVlc3Rpb25UZXh0fSAqYCA6IHF1ZXN0aW9uVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHNbaW5kZXhdKSB7XG4gICAgICAgICAgZWxlbWVudHNbaW5kZXhdID0geyAuLi5lbGVtZW50c1tpbmRleF0sIC4uLnVwZGF0ZXMgfTtcbiAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgICAgICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLmZvcm1FbGVtZW50c10pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzXG4gICAgICBpZiAodXBkYXRlcy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJiB1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQgJiYgIXVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dC5lbmRzV2l0aCgnKicpKSB7XG4gICAgICAgIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCA9IGAke3VwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dH0gKmA7XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZXMucmVxdWlyZWQgPT09IGZhbHNlICYmIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCAmJiB1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQuZW5kc1dpdGgoJyonKSkge1xuICAgICAgICB1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQgPSB1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQuc2xpY2UoMCwgLTIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLmZvcm1FbGVtZW50c10pO1xuICAgICAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Zvcm1FbGVtZW50cycsIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybUVsZW1lbnRzKSk7XG4gICAgfVxuICAgIGlmKHRoaXMuYm9vaz8uYm9va1F1ZXN0aW9uc01hcFtPYmplY3Qua2V5cyh0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcClbMF1dPy5zdWJRdWVzdGlvbnMpIHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwW09iamVjdC5rZXlzKHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwKVswXV0uc3ViUXVlc3Rpb25zID0gdGhpcy5mb3JtRWxlbWVudHNcbiAgfVxuICB1cGRhdGVUaXRsZShldmVudDogYW55KSB7XG4gICAgLy9BUC0xME1BUjI1IFVwZGF0ZXMgdGhlIHRpdGxlIG9mIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGJvb2sgIFxuICAgIHRoaXMuYm9vay5yZWNvcmRzWzBdLnRpdGxlID0gZXZlbnQ7XG4gIH1cbiAgc2V0U2VsZWN0ZWRFbGVtZW50KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFN1YmplY3QubmV4dChpbmRleCk7XG4gICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XVxuICAgIHRoaXMuc2VsZWN0VGFibGVDb2x1bW4gPSBudWxsXG4gIH1cbiAgLy8gU0tTMTlNQVIyNSBzZXQgdGhlIHNlbGVjdGVkIHRhYmxlIGNvbHVtblxuICBzZXRTZWxlY3RlZFRhYmxlRWxlbWVudChpbmRleDogYW55LCBldmVudDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XVxuICAgIGlmICh0aGlzLmN1cnJlbnRFbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFbGVtZW50WydmaWVsZHNNZXRhJ10gPSB0eXBlb2YgdGhpcy5jdXJyZW50RWxlbWVudD8uZmllbGRzTWV0YSA9PT0gJ29iamVjdCcgPyB0aGlzLmN1cnJlbnRFbGVtZW50Py5maWVsZHNNZXRhIDogSlNPTi5wYXJzZSh0aGlzLmN1cnJlbnRFbGVtZW50LmZpZWxkc01ldGEpO1xuICAgIH1cbiAgICBjb25zdCBmb3VuZEl0ZW0gPSB0aGlzLmN1cnJlbnRFbGVtZW50Py50eXBlID09PSAnVGFibGUnID8gdGhpcy5jdXJyZW50RWxlbWVudFsnZmllbGRzTWV0YSddLmZpbmQoaXRlbSA9PiBpdGVtWyd1bmlxdWVJZGVudGlmaWVyJ10gPT09IGV2ZW50Py51bmlxdWVJZGVudGlmaWVyKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdFRhYmxlQ29sdW1uID0gZm91bmRJdGVtPy51bmlxdWVJZGVudGlmaWVyXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRTdWJqZWN0Lm5leHQoaW5kZXgpO1xuICB9XG4gIHJlbW92ZVNlbGVjdGVkVGFibGVFbGVtZW50KGluZGV4OiBudW1iZXIsIGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScpIHtcbiAgICAgIHRoaXMuY3VycmVudEVsZW1lbnRbJ2ZpZWxkc01ldGEnXSA9IHR5cGVvZiB0aGlzLmN1cnJlbnRFbGVtZW50Py5maWVsZHNNZXRhID09PSAnb2JqZWN0JyA/IHRoaXMuY3VycmVudEVsZW1lbnQ/LmZpZWxkc01ldGEgOiBKU09OLnBhcnNlKHRoaXMuY3VycmVudEVsZW1lbnQuZmllbGRzTWV0YSk7XG4gICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgaXRlbVxuICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5jdXJyZW50RWxlbWVudFsnZmllbGRzTWV0YSddLmZpbmRJbmRleChpdGVtID0+IGl0ZW1bJ3VuaXF1ZUlkZW50aWZpZXInXSA9PT0gZXZlbnQ/LnVuaXF1ZUlkZW50aWZpZXIpO1xuICAgICAgLy8gUmVtb3ZlIHRoZSBpdGVtIGlmIGZvdW5kXG4gICAgICBpZiAoaXRlbUluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRFbGVtZW50WydmaWVsZHNNZXRhJ10uc3BsaWNlKGl0ZW1JbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0VGFibGVDb2x1bW4gPSBudWxsXG4gICAgdGhpcy5lbGVtZW50VXBkYXRlKGluZGV4LCB0aGlzLmN1cnJlbnRFbGVtZW50KVxuICB9XG4gIC8vIFNLUzE5TUFSMjUgZ2V0IHRoZSBzZWxlY3RlZCB0YWJsZSBjb2x1bW5cbiAgZ2V0U2VsZWN0VGFibGVDb2x1bW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0VGFibGVDb2x1bW47XG4gIH1cbiAgc2VsZWN0SGVhZGluZyhldmVudDogYW55KSB7XG4gICAgLy9BUC0xME1BUjI1IEVtaXRzIHRoZSBzZWxlY3RlZCBoZWFkaW5nIGV2ZW50ICBcbiAgICB0aGlzLnNlbGVjdEhlYWRlclN1YmplY3QubmV4dChldmVudCk7XG4gIH1cblxuXG4gIGdldEVsZW1lbnRzKCk6IEZvcm1FbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1FbGVtZW50cy5tYXAoZWxlbWVudCA9PiAoe1xuICAgICAgLi4uZWxlbWVudCxcbiAgICAgIG9wdGlvbnM6IGVsZW1lbnQub3B0aW9ucyB8fCBbXSxcbiAgICB9KSk7XG4gIH1cbiAgc29ydEVsZW1lbnRzQnlPcmRlcigpOiB2b2lkIHtcbiAgICAvL0FQLTEwTUFSMjUgU29ydCBlbGVtZW50cyBieSBjdXJyZW50IG9yZGVyXG4gICAgdGhpcy5mb3JtRWxlbWVudHMuc29ydCgoYSwgYikgPT4gYS5xdWVzdGlvbk51bWJlciAtIGIucXVlc3Rpb25OdW1iZXIpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBlbGVtZW50LnF1ZXN0aW9uTnVtYmVyID0gaW5kZXggKyAxO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLmZvcm1FbGVtZW50c10pO1xuICB9XG4gIC8vQVAtMTBNQVIyNSBSZXR1cm5zIHRoZSBjdXJyZW50IGJvb2sgZGF0YSAgXG4gIGdldEJvb2soKSB7XG4gICAgcmV0dXJuIHRoaXMuYm9vaztcbiAgfVxuICB1cGRhdGVCb29rKGJvb2s6IGFueSkge1xuICAgIHRoaXMuYm9vayA9IGJvb2s7XG4gIFxuICAgIGNvbnN0IHVwZGF0ZWRTdWJRdWVzdGlvbnMgPSBib29rLmJvb2tRdWVzdGlvbnNNYXBbdGhpcy51bmlxdWVfaWRdPy5zdWJRdWVzdGlvbnMgPz8gW107XG4gIFxuICAgIC8vIFVwZGF0ZSBvcHRpb25zIGZyb20gc3FPcHRpb25zIGlmIHRoZXkgZXhpc3RcbiAgICB1cGRhdGVkU3ViUXVlc3Rpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoYm9vay5zcU9wdGlvbnM/LltlbGVtZW50LmlkXSkge1xuICAgICAgICBlbGVtZW50Lm9wdGlvbnMgPSBib29rLnNxT3B0aW9uc1tlbGVtZW50LmlkXS5vcHRpb25zO1xuICAgICAgfVxuICAgIH0pO1xuICBcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHVwZGF0ZWRTdWJRdWVzdGlvbnM7XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gIH1cbiAgXG4gIC8vIEluIEZvcm1CdWlsZGVyU2VydmljZVxuICBkb3dubG9hZEVsZW1lbnQoKSB7XG4gICAgbGV0IHRyYW5zbGF0aW9uTWFwOiBhbnkgPSB0aGlzLmJvb2sudHJhbnNsYXRpb25NYXBcbiAgICBjb25zdCBrZXlzVG9UcmFuc2xhdGUgPSBbJ3F1ZXN0aW9uVGV4dCcsICdoZWxwVGV4dCcsICdxdWVzdGlvbicsICdsYWJlbCddO1xuICAgIGxldCBkb3dubG9hZEZvcm1FbGVtZW50cyA9IHRoaXMuZm9ybUVsZW1lbnRzXG4gICAgZG93bmxvYWRGb3JtRWxlbWVudHM/LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBrZXlzVG9UcmFuc2xhdGUuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGVsZW1lbnRba2V5XSA9IHRyYW5zbGF0aW9uTWFwLmVuW2VsZW1lbnQuaWRdW2tleV0gPyB0cmFuc2xhdGlvbk1hcC5lbltlbGVtZW50LmlkXVtrZXldIDogbnVsbDtcbiAgICAgIH0pO1xuICAgICAgaWYoZWxlbWVudD8uWydvcHRpb25zJ10gIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50Py5bJ29wdGlvbnMnXSAhPT0gbnVsbCAmJiAgQXJyYXkuaXNBcnJheShlbGVtZW50WydvcHRpb25zJ10pKXtcbiAgICAgICAgZWxlbWVudFsnb3B0aW9ucyddLmZvckVhY2gob3B0ID0+IHtcbiAgICAgICAgICBvcHQudmFsdWUgPSB0cmFuc2xhdGlvbk1hcC5lbltvcHQuaWRdWyd2YWx1ZSddIDtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyAmJiBlbGVtZW50Py5maWVsZHNNZXRhKXtcbiAgICAgICAgaWYoIUFycmF5LmlzQXJyYXkoZWxlbWVudD8uZmllbGRzTWV0YSkgJiYgdHlwZW9mIGVsZW1lbnQ/LmZpZWxkc01ldGEgPT09ICdzdHJpbmcnKXtcbiAgICAgICAgICBlbGVtZW50LmZpZWxkc01ldGEgPSBKU09OLnBhcnNlKGVsZW1lbnQ/LmZpZWxkc01ldGEpXG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudD8uZmllbGRzTWV0YT8uZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAga2V5c1RvVHJhbnNsYXRlLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmKGtleSAhPT0gJ3F1ZXN0aW9uJykgZmllbGRba2V5XSA9IHRyYW5zbGF0aW9uTWFwLmVuW2ZpZWxkLnVuaXF1ZUlkZW50aWZpZXJdW2tleV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkPy5xdWVzdGlvbj8uWydvcHRpb25zJ10gIT09IG51bGwgJiYgIEFycmF5LmlzQXJyYXkoZmllbGQ/LnF1ZXN0aW9uPy5bJ29wdGlvbnMnXSkpe1xuICAgICAgICAgICAgZmllbGQucXVlc3Rpb25bJ29wdGlvbnMnXS5mb3JFYWNoKG9wdCA9PiB7XG4gICAgICAgICAgICAgIG9wdC52YWx1ZSA9IHRyYW5zbGF0aW9uTWFwLmVuW29wdC5pZF1bJ3ZhbHVlJ107XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGV0IGRvd25sb2FkQm9vayA9IHRoaXMuYm9va1xuICAgIGRvd25sb2FkQm9vaz8ucXVlc3Rpb25ib29rPy5hY3Rpb24/LmZvckVhY2goKGFjdDogYW55KSA9PntcbiAgICAgIGFjdC5uYW1lID0gdHJhbnNsYXRpb25NYXAuZW5bYWN0LmlkXVsnbmFtZSddO1xuICAgIH0pXG4gICAgLy8gU0tTMjhNQVIyNSByZW1vdmUgcWJSZWZlcmVuY2VRdWVzdGlvbnMgZm9yIGRvd25sb2FkIHRpbWUgYW5kIHN1YnRleHQgdG8gY29udmVydCB0b28gc3RyaW5nXG4gICAgZG93bmxvYWRGb3JtRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdib29rJykge1xuICAgICAgICBkZWxldGUgZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucztcbiAgICAgIH1cbiAgICAgIGlmKCBlbGVtZW50LnN1YlRleHQpe1xuICAgICAgICBlbGVtZW50LnN1YlRleHQgPSB0eXBlb2YgZWxlbWVudD8uc3ViVGV4dCA9PT0gJ29iamVjdCcgPyBlbGVtZW50Py5zdWJUZXh0IDogSlNPTi5wYXJzZShlbGVtZW50WydzdWJUZXh0J10pO1xuICAgICAgICBjb25zdCBzdHJpbmdBcnJheUZpZWxkcyA9IFsnZmllbGQnLCdxdWVyeVBhcmFtZXRlcicsICdzb3VyY2VRdWVzdGlvbklkJywgJ3F1ZXJ5RmllbGQnLCAncXVlcnlWYWx1ZSddO1xuXG4gICAgICAgIGlmIChlbGVtZW50LnN1YlRleHQpIHtcbiAgICAgICAgICBzdHJpbmdBcnJheUZpZWxkcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuc3ViVGV4dFtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zdWJUZXh0W2tleV0gPSB2YWx1ZS5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSAgICAgIFxuICAgICAgICBpZihlbGVtZW50LnR5cGUgPT09ICdUYWJsZScpe1xuICAgICAgICAgIGVsZW1lbnQuZmllbGRzTWV0YS5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmKGZpZWxkPy5xdWVzdGlvbj8uc3ViVGV4dCl7XG4gICAgICAgICAgICAgIHN0cmluZ0FycmF5RmllbGRzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgZmllbGQucXVlc3Rpb24uc3ViVGV4dFtrZXldID0gdmFsdWUuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoIGVsZW1lbnQuc3ViVGV4dCl7XG4gICAgICAgIGVsZW1lbnQuc3ViVGV4dCA9IHR5cGVvZiBlbGVtZW50Py5zdWJUZXh0ICE9PSAnb2JqZWN0JyA/IGVsZW1lbnQ/LnN1YlRleHQgOiBKU09OLnN0cmluZ2lmeShlbGVtZW50WydzdWJUZXh0J10pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGRvd25sb2FkQm9vay5ib29rUXVlc3Rpb25zTWFwW09iamVjdC5rZXlzKHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwKVswXV0uc3ViUXVlc3Rpb25zID0gZG93bmxvYWRGb3JtRWxlbWVudHM7XG4gICAgY29uc29sZS5sb2coJ2Jvb2snLCBkb3dubG9hZEJvb2spO1xuICAgIGxldCB0ZW1wRWxlbWVudDogYW55ID0ge307XG5cbiAgICBkb3dubG9hZEZvcm1FbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnRHJvcGRvd24nIHx8IGVsZW1lbnQudHlwZSA9PT0gJ1JhZGlvJyB8fCBlbGVtZW50LnR5cGUgPT09ICdDaGVja2JveCcpIHtcbiAgICAgICAgLy9BUCAyNUZFQjI1IC0gU3RvcmUgdGhlIGVudGlyZSBxdWVzdGlvbiB3aXRoIGl0cyBvcHRpb25zIHVuZGVyIGl0cyBJRFxuICAgICAgICB0ZW1wRWxlbWVudFtlbGVtZW50LmlkXSA9IHtcbiAgICAgICAgICAuLi5lbGVtZW50LFxuICAgICAgICAgIG9wdGlvbnM6IGVsZW1lbnQub3B0aW9ucyB8fCBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZG93bmxvYWRCb29rLnNxT3B0aW9ucyA9IHRlbXBFbGVtZW50O1xuICAgIHJldHVybiBkb3dubG9hZEJvb2s7XG4gIH1cbiAgLy8gQVAtMDZNQVIyNSAtIEVsZW1lbnQgbmV3IG9yZGVyIHVwZGF0ZVxuICB1cGRhdGVFbGVtZW50c09yZGVyKHVwZGF0ZWRFbGVtZW50czogRm9ybUVsZW1lbnRbXSk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gWy4uLnVwZGF0ZWRFbGVtZW50c107XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQodGhpcy5mb3JtRWxlbWVudHMpO1xuICB9XG4gIC8vIFJlbW92ZSBhbiBlbGVtZW50IGJ5IElEXG4gIC8vIFNhdmUgZWxlbWVudHMgdG8gbG9jYWxTdG9yYWdlIGFuZCB1cGRhdGUgdGhlIHN1YmplY3RcbiAgcmVtb3ZlRWxlbWVudENvbXBvbmVudChpZDogYW55KSB7XG4gICAgdGhpcy50ZW1wRWxlbSA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSB7fVxuICAgIHRoaXMuZm9ybUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuaWQgIT09IGlkKSB7XG4gICAgICAgIHRoaXMudGVtcEVsZW0ucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMudGVtcEVsZW07XG4gICAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Zvcm1FbGVtZW50cycsIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybUVsZW1lbnRzKSk7XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuZm9ybUVsZW1lbnRzXSk7XG4gIH1cbiAgLy8gU0tTMTlNQVIyNSB1cGRhdGUgdGhlIGVsZW1lbnRcbiAgZWxlbWVudFVwZGF0ZShpbmRleDogYW55LCBlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IFsuLi50aGlzLmdldEVsZW1lbnRzKCldO1xuICAgIGlmIChlbGVtZW50c1tpbmRleF0pIHtcbiAgICAgIGVsZW1lbnRzW2luZGV4XSA9IGVsZW1lbnRcbiAgICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICB0aGlzLmZvcm1FbGVtZW50c1N1YmplY3QubmV4dChbLi4uZWxlbWVudHNdKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KGluZGV4KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|