@fovestta2/web-angular 1.0.1 → 1.0.3
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/esm2022/lib/add-update-form/add-update-form.component.mjs +1044 -0
- package/esm2022/lib/fv-controls.module.mjs +16 -4
- package/esm2022/lib/fv-dropdown/fv-dropdown.component.mjs +116 -17
- package/esm2022/lib/fv-entry-field/fv-entry-field.component.mjs +29 -3
- package/esm2022/lib/fv-esi-field/fv-esi-field.component.mjs +63 -0
- package/esm2022/lib/fv-iban-field/fv-iban-field.component.mjs +63 -0
- package/esm2022/lib/fv-ifsc-field/fv-ifsc-field.component.mjs +63 -0
- package/esm2022/lib/fv-micr-field/fv-micr-field.component.mjs +63 -0
- package/esm2022/lib/fv-name-code/fv-name-code.component.mjs +273 -0
- package/esm2022/lib/fv-pf-field/fv-pf-field.component.mjs +63 -0
- package/esm2022/lib/fv-phone-field/fv-phone-field.component.mjs +105 -0
- package/esm2022/lib/fv-radio-group/fv-radio-group.component.mjs +3 -3
- package/esm2022/lib/fv-uan-field/fv-uan-field.component.mjs +65 -0
- package/esm2022/lib/query-form/query-form.component.mjs +569 -0
- package/esm2022/public-api.mjs +15 -5
- package/fesm2022/fovestta2-web-angular.mjs +2492 -88
- package/fesm2022/fovestta2-web-angular.mjs.map +1 -1
- package/lib/add-update-form/add-update-form.component.d.ts +102 -0
- package/lib/fv-controls.module.d.ts +3 -1
- package/lib/fv-dropdown/fv-dropdown.component.d.ts +14 -2
- package/lib/fv-entry-field/fv-entry-field.component.d.ts +4 -1
- package/lib/fv-esi-field/fv-esi-field.component.d.ts +21 -0
- package/lib/fv-iban-field/fv-iban-field.component.d.ts +21 -0
- package/lib/fv-ifsc-field/fv-ifsc-field.component.d.ts +21 -0
- package/lib/fv-micr-field/fv-micr-field.component.d.ts +21 -0
- package/lib/fv-name-code/fv-name-code.component.d.ts +41 -0
- package/lib/fv-pf-field/fv-pf-field.component.d.ts +21 -0
- package/lib/fv-phone-field/fv-phone-field.component.d.ts +25 -0
- package/lib/fv-uan-field/fv-uan-field.component.d.ts +21 -0
- package/lib/query-form/query-form.component.d.ts +53 -0
- package/package.json +2 -2
- package/public-api.d.ts +14 -4
|
@@ -0,0 +1,1044 @@
|
|
|
1
|
+
// add-update-form.component.ts
|
|
2
|
+
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
5
|
+
import { distinctUntilChanged } from 'rxjs/operators';
|
|
6
|
+
// Import your library modules
|
|
7
|
+
import { FvEntryFieldComponent } from '../fv-entry-field/fv-entry-field.component';
|
|
8
|
+
import { FvNumberFieldComponent } from '../fv-number-field/fv-number-field.component';
|
|
9
|
+
import { FvDropdownComponent } from '../fv-dropdown/fv-dropdown.component';
|
|
10
|
+
import { FvRadioGroupComponent } from '../fv-radio-group/fv-radio-group.component';
|
|
11
|
+
import { FvCheckboxComponent } from '../fv-checkbox/fv-checkbox.component';
|
|
12
|
+
import { FvDateFieldComponent } from '../fv-date-field/fv-date-field.component';
|
|
13
|
+
import { FvMonthYearFieldComponent } from '../fv-month-year-field/fv-month-year-field.component';
|
|
14
|
+
import { FvFileSelectorComponent } from '../fv-file-selector/fv-file-selector.component';
|
|
15
|
+
import { FvImageSelectorComponent } from '../fv-image-selector/fv-image-selector.component';
|
|
16
|
+
import { FvRichTextEditorComponent } from '../fv-rich-text-editor/fv-rich-text-editor.component';
|
|
17
|
+
import { FvNameCodeComponent } from '../fv-name-code/fv-name-code.component';
|
|
18
|
+
import { FvPhoneFieldComponent } from '../fv-phone-field/fv-phone-field.component';
|
|
19
|
+
import { FvUanFieldComponent } from '../fv-uan-field/fv-uan-field.component';
|
|
20
|
+
import { FvPfFieldComponent } from '../fv-pf-field/fv-pf-field.component';
|
|
21
|
+
import { FvEsiFieldComponent } from '../fv-esi-field/fv-esi-field.component';
|
|
22
|
+
import { FvIfscFieldComponent } from '../fv-ifsc-field/fv-ifsc-field.component';
|
|
23
|
+
import { FvMicrFieldComponent } from '../fv-micr-field/fv-micr-field.component';
|
|
24
|
+
import { FvIbanFieldComponent } from '../fv-iban-field/fv-iban-field.component';
|
|
25
|
+
import * as i0 from "@angular/core";
|
|
26
|
+
import * as i1 from "@angular/forms";
|
|
27
|
+
import * as i2 from "@angular/common";
|
|
28
|
+
export class AddUpdateFormComponent {
|
|
29
|
+
fb;
|
|
30
|
+
hostRef;
|
|
31
|
+
config;
|
|
32
|
+
validationError = new EventEmitter();
|
|
33
|
+
form;
|
|
34
|
+
submitted = false;
|
|
35
|
+
filePreviews = new Map();
|
|
36
|
+
fileNames = new Map();
|
|
37
|
+
valueChangeSubscriptions = [];
|
|
38
|
+
passwordVisibility = new Map();
|
|
39
|
+
searchQueries = new Map();
|
|
40
|
+
constructor(fb, hostRef) {
|
|
41
|
+
this.fb = fb;
|
|
42
|
+
this.hostRef = hostRef;
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.initializeForm();
|
|
46
|
+
}
|
|
47
|
+
ngAfterViewInit() {
|
|
48
|
+
// Lifecycle hook - can be used for datepicker initialization if needed
|
|
49
|
+
}
|
|
50
|
+
getColumnWidth(column) {
|
|
51
|
+
const maxCols = this.config.maxColsPerRow || 5;
|
|
52
|
+
const colSpan = Math.min(column.colSpan || 1, maxCols);
|
|
53
|
+
return `calc(${(colSpan / maxCols) * 100}% - 16px)`;
|
|
54
|
+
}
|
|
55
|
+
getControl(name) {
|
|
56
|
+
return this.form.get(name);
|
|
57
|
+
}
|
|
58
|
+
// 2. HELPER: Convert your FieldValidation[] to the library's ValidationSchema
|
|
59
|
+
getSchema(column) {
|
|
60
|
+
const rules = [];
|
|
61
|
+
const errorPriority = [];
|
|
62
|
+
if (column.validations) {
|
|
63
|
+
column.validations.forEach((v) => {
|
|
64
|
+
switch (v.type) {
|
|
65
|
+
case 'required':
|
|
66
|
+
rules.push({
|
|
67
|
+
name: 'required',
|
|
68
|
+
params: { enabled: true },
|
|
69
|
+
errorKey: 'ERR_REQUIRED',
|
|
70
|
+
});
|
|
71
|
+
errorPriority.push('required');
|
|
72
|
+
break;
|
|
73
|
+
case 'email':
|
|
74
|
+
rules.push({
|
|
75
|
+
name: 'regex',
|
|
76
|
+
params: {
|
|
77
|
+
pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$',
|
|
78
|
+
},
|
|
79
|
+
errorKey: 'ERR_REGEX_MISMATCH',
|
|
80
|
+
});
|
|
81
|
+
errorPriority.push('regex');
|
|
82
|
+
break;
|
|
83
|
+
case 'minLength':
|
|
84
|
+
rules.push({
|
|
85
|
+
name: 'minLength',
|
|
86
|
+
params: { value: v.value },
|
|
87
|
+
errorKey: 'ERR_MIN_LENGTH',
|
|
88
|
+
});
|
|
89
|
+
errorPriority.push('minLength');
|
|
90
|
+
break;
|
|
91
|
+
case 'maxLength':
|
|
92
|
+
rules.push({
|
|
93
|
+
name: 'maxLength',
|
|
94
|
+
params: { value: v.value },
|
|
95
|
+
errorKey: 'ERR_MAX_LENGTH',
|
|
96
|
+
});
|
|
97
|
+
errorPriority.push('maxLength');
|
|
98
|
+
break;
|
|
99
|
+
case 'pattern':
|
|
100
|
+
rules.push({
|
|
101
|
+
name: 'regex',
|
|
102
|
+
params: { pattern: v.value },
|
|
103
|
+
errorKey: 'ERR_REGEX_MISMATCH',
|
|
104
|
+
});
|
|
105
|
+
errorPriority.push('regex');
|
|
106
|
+
break;
|
|
107
|
+
case 'min':
|
|
108
|
+
rules.push({
|
|
109
|
+
name: 'min',
|
|
110
|
+
params: { value: v.value },
|
|
111
|
+
errorKey: 'ERR_MIN_VALUE',
|
|
112
|
+
});
|
|
113
|
+
errorPriority.push('min');
|
|
114
|
+
break;
|
|
115
|
+
case 'max':
|
|
116
|
+
rules.push({
|
|
117
|
+
name: 'max',
|
|
118
|
+
params: { value: v.value },
|
|
119
|
+
errorKey: 'ERR_MAX_VALUE',
|
|
120
|
+
});
|
|
121
|
+
errorPriority.push('max');
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// Map 'name-code' to 'Dropdown' or similar for validation schema purposes if needed
|
|
127
|
+
let controlType = column.type;
|
|
128
|
+
if (column.type === 'name-code') {
|
|
129
|
+
controlType = 'select'; // Treat as select for schema lookup if library expects 'select' or 'Dropdown'
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
controlType: controlType,
|
|
133
|
+
errorPriority: errorPriority,
|
|
134
|
+
rules: rules,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
isImageField(column) {
|
|
138
|
+
return (column.type === 'file' &&
|
|
139
|
+
(column.accept?.startsWith('image') || column.filePreview === true));
|
|
140
|
+
}
|
|
141
|
+
initializeForm() {
|
|
142
|
+
this.submitted = false;
|
|
143
|
+
const formGroupConfig = {};
|
|
144
|
+
this.config.sections.forEach((section) => {
|
|
145
|
+
section.fields.forEach((column) => {
|
|
146
|
+
let initialValue = column.value || '';
|
|
147
|
+
// Format month-year fields to YYYY-MM format
|
|
148
|
+
if (column.type === 'month-year' && initialValue) {
|
|
149
|
+
initialValue = this.formatMonthYearValue(initialValue);
|
|
150
|
+
}
|
|
151
|
+
formGroupConfig[column.name] = [
|
|
152
|
+
{ value: initialValue, disabled: column.disabled || false },
|
|
153
|
+
null, // We'll set validators after form creation
|
|
154
|
+
];
|
|
155
|
+
// If it's a file field with an existing value, set the preview
|
|
156
|
+
if (column.type === 'file' && column.value) {
|
|
157
|
+
this.filePreviews.set(column.name, column.value);
|
|
158
|
+
// Extract filename from URL or base64
|
|
159
|
+
const fileName = this.extractFileName(column.value);
|
|
160
|
+
if (fileName) {
|
|
161
|
+
this.fileNames.set(column.name, fileName);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Initialize search display for name-code fields - No longer needed as FvNameCode handles display internally
|
|
165
|
+
/* if (column.type === 'name-code' && initialValue && column.options) {
|
|
166
|
+
// Logic moved to component
|
|
167
|
+
} */
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
this.form = this.fb.group(formGroupConfig);
|
|
171
|
+
this.config.sections.forEach((section) => {
|
|
172
|
+
section.fields.forEach((column) => {
|
|
173
|
+
const validators = this.buildValidators(column.validations, this.form);
|
|
174
|
+
if (validators.length > 0) {
|
|
175
|
+
this.form.get(column.name)?.setValidators(validators);
|
|
176
|
+
this.form.get(column.name)?.updateValueAndValidity();
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
// Subscribe to value changes for all fields to trigger onChange handlers
|
|
181
|
+
Object.keys(this.form.controls).forEach((key) => {
|
|
182
|
+
const control = this.form.get(key);
|
|
183
|
+
if (control) {
|
|
184
|
+
const subscription = control.valueChanges
|
|
185
|
+
.pipe(distinctUntilChanged())
|
|
186
|
+
.subscribe((value) => {
|
|
187
|
+
const column = this.getColumnByName(key);
|
|
188
|
+
if (column?.onChange) {
|
|
189
|
+
column.onChange(value, this.form);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
this.valueChangeSubscriptions.push(subscription);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
ngOnDestroy() {
|
|
197
|
+
// Clean up all subscriptions to prevent memory leaks
|
|
198
|
+
this.valueChangeSubscriptions.forEach((sub) => sub.unsubscribe());
|
|
199
|
+
this.valueChangeSubscriptions = [];
|
|
200
|
+
}
|
|
201
|
+
handleFieldChange(fieldName, eventValue) {
|
|
202
|
+
const column = this.getColumnByName(fieldName);
|
|
203
|
+
const formControl = this.form.get(fieldName);
|
|
204
|
+
// Format month-year fields (especially expiryDate) to YYYY-MM
|
|
205
|
+
if (column?.type === 'month-year' && eventValue) {
|
|
206
|
+
const formattedValue = this.formatMonthYearValue(eventValue);
|
|
207
|
+
if (formControl && formattedValue !== eventValue) {
|
|
208
|
+
formControl.setValue(formattedValue, { emitEvent: false });
|
|
209
|
+
eventValue = formattedValue;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (column?.onChange) {
|
|
213
|
+
// Use the event value directly (what the user just selected/typed)
|
|
214
|
+
// This ensures we have the correct value even if form control hasn't updated yet
|
|
215
|
+
const valueToPass = eventValue !== undefined ? eventValue : this.form.get(fieldName)?.value;
|
|
216
|
+
const onChangeFn = column.onChange; // Store the function reference
|
|
217
|
+
// Store the selected value - this is what the user chose
|
|
218
|
+
const selectedValue = valueToPass;
|
|
219
|
+
// Ensure the form control has the selected value before calling onChange
|
|
220
|
+
if (formControl && selectedValue !== undefined) {
|
|
221
|
+
if (formControl.value !== selectedValue) {
|
|
222
|
+
formControl.setValue(selectedValue, { emitEvent: false });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Call onChange with the selected value
|
|
226
|
+
if (onChangeFn) {
|
|
227
|
+
onChangeFn(selectedValue, this.form);
|
|
228
|
+
}
|
|
229
|
+
// Restore the value for the field that triggered the change if it was cleared by onChange
|
|
230
|
+
// This is critical: if onChange clears the field that was just changed, we restore it
|
|
231
|
+
// Only restore if we had a non-empty value (empty string, null, undefined are not restored)
|
|
232
|
+
if (formControl &&
|
|
233
|
+
selectedValue !== undefined &&
|
|
234
|
+
selectedValue !== null &&
|
|
235
|
+
selectedValue !== '') {
|
|
236
|
+
// Use setTimeout with 0 delay to run after any synchronous operations in onChange
|
|
237
|
+
setTimeout(() => {
|
|
238
|
+
// Check if the value was cleared or changed
|
|
239
|
+
const currentValue = formControl.value;
|
|
240
|
+
// If the value doesn't match what was selected, restore it
|
|
241
|
+
// This handles the case where onChange cleared the field unintentionally
|
|
242
|
+
if (currentValue !== selectedValue) {
|
|
243
|
+
formControl.setValue(selectedValue, { emitEvent: false });
|
|
244
|
+
}
|
|
245
|
+
}, 0);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
formatMonthYearValue(value) {
|
|
250
|
+
if (!value)
|
|
251
|
+
return value;
|
|
252
|
+
// Normalize to YYYY-MM
|
|
253
|
+
if (value.match(/^\d{2}-\d{4}$/)) {
|
|
254
|
+
const [month, year] = value.split('-');
|
|
255
|
+
return `${year}-${month}`;
|
|
256
|
+
}
|
|
257
|
+
// If already in YYYY-MM format, return as is
|
|
258
|
+
return value;
|
|
259
|
+
}
|
|
260
|
+
parseMonthYearValue(value) {
|
|
261
|
+
if (!value)
|
|
262
|
+
return value;
|
|
263
|
+
// Display and picker both use YYYY-MM; normalize MM-YYYY if present
|
|
264
|
+
if (value.match(/^\d{2}-\d{4}$/)) {
|
|
265
|
+
const [month, year] = value.split('-');
|
|
266
|
+
return `${year}-${month}`;
|
|
267
|
+
}
|
|
268
|
+
return value;
|
|
269
|
+
}
|
|
270
|
+
handleMonthYearChange(fieldName, value) {
|
|
271
|
+
// Format the input value to YYYY-MM format
|
|
272
|
+
let formattedValue = value;
|
|
273
|
+
// If it's in MM-YYYY format, convert to YYYY-MM
|
|
274
|
+
if (formattedValue.match(/^\d{2}-\d{4}$/)) {
|
|
275
|
+
const [month, year] = formattedValue.split('-');
|
|
276
|
+
formattedValue = `${year}-${month}`;
|
|
277
|
+
}
|
|
278
|
+
// If it's in YYYYMM format (no dash), convert to YYYY-MM
|
|
279
|
+
else if (formattedValue.match(/^\d{6}$/)) {
|
|
280
|
+
const year = formattedValue.substring(0, 4);
|
|
281
|
+
const month = formattedValue.substring(4, 6);
|
|
282
|
+
formattedValue = `${year}-${month}`;
|
|
283
|
+
}
|
|
284
|
+
// If it's already in YYYY-MM format, leave as is
|
|
285
|
+
else if (formattedValue.match(/^\d{4}-\d{2}$/)) {
|
|
286
|
+
// Already in correct format
|
|
287
|
+
}
|
|
288
|
+
// If user is typing, allow partial input
|
|
289
|
+
else if (formattedValue.match(/^\d{1,6}$/)) {
|
|
290
|
+
// Allow partial input while typing
|
|
291
|
+
}
|
|
292
|
+
const formControl = this.form.get(fieldName);
|
|
293
|
+
if (formControl && formattedValue !== value) {
|
|
294
|
+
formControl.setValue(formattedValue, { emitEvent: false });
|
|
295
|
+
}
|
|
296
|
+
this.handleFieldChange(fieldName, formattedValue);
|
|
297
|
+
}
|
|
298
|
+
handleMonthYearBlur(fieldName) {
|
|
299
|
+
const formControl = this.form.get(fieldName);
|
|
300
|
+
if (!formControl)
|
|
301
|
+
return;
|
|
302
|
+
const value = formControl.value || '';
|
|
303
|
+
// Ensure the value is in YYYY-MM format on blur
|
|
304
|
+
if (value && !value.match(/^\d{4}-\d{2}$/)) {
|
|
305
|
+
// Try to parse and format
|
|
306
|
+
const formatted = this.formatMonthYearValue(value);
|
|
307
|
+
if (formatted !== value) {
|
|
308
|
+
formControl.setValue(formatted, { emitEvent: false });
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
handleMonthYearPickerChange(fieldName, value) {
|
|
313
|
+
// Month picker outputs YYYY-MM; just normalize
|
|
314
|
+
const formattedValue = this.formatMonthYearValue(value);
|
|
315
|
+
const formControl = this.form.get(fieldName);
|
|
316
|
+
if (formControl) {
|
|
317
|
+
formControl.setValue(formattedValue, { emitEvent: false });
|
|
318
|
+
this.handleFieldChange(fieldName, formattedValue);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
getMonthYearPickerValue(fieldName) {
|
|
322
|
+
const formControl = this.form.get(fieldName);
|
|
323
|
+
if (!formControl)
|
|
324
|
+
return '';
|
|
325
|
+
const value = formControl.value || '';
|
|
326
|
+
// Display and picker both expect YYYY-MM
|
|
327
|
+
return this.parseMonthYearValue(value);
|
|
328
|
+
}
|
|
329
|
+
openMonthPicker(fieldName) {
|
|
330
|
+
const monthInput = document.getElementById(fieldName + '_picker');
|
|
331
|
+
if (monthInput && monthInput.type === 'month') {
|
|
332
|
+
// Update the picker value before opening
|
|
333
|
+
const currentValue = this.getMonthYearPickerValue(fieldName);
|
|
334
|
+
if (currentValue) {
|
|
335
|
+
monthInput.value = currentValue;
|
|
336
|
+
}
|
|
337
|
+
// Try modern showPicker API first, fallback to click
|
|
338
|
+
if (monthInput.showPicker) {
|
|
339
|
+
monthInput.showPicker();
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
monthInput.focus();
|
|
343
|
+
monthInput.click();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
getColumnByName(name) {
|
|
348
|
+
return this.config.sections
|
|
349
|
+
.flatMap((s) => s.fields)
|
|
350
|
+
.find((c) => c.name === name);
|
|
351
|
+
}
|
|
352
|
+
getFileFields(fields) {
|
|
353
|
+
return fields.filter((f) => f.type === 'file');
|
|
354
|
+
}
|
|
355
|
+
getNonFileFields(fields) {
|
|
356
|
+
return fields.filter((f) => f.type !== 'file');
|
|
357
|
+
}
|
|
358
|
+
togglePasswordVisibility(fieldName) {
|
|
359
|
+
const current = this.passwordVisibility.get(fieldName) || false;
|
|
360
|
+
this.passwordVisibility.set(fieldName, !current);
|
|
361
|
+
}
|
|
362
|
+
hasRequiredValidation(column) {
|
|
363
|
+
return column.validations?.some((v) => v.type === 'required') || false;
|
|
364
|
+
}
|
|
365
|
+
isPasswordVisible(fieldName) {
|
|
366
|
+
return this.passwordVisibility.get(fieldName) || false;
|
|
367
|
+
}
|
|
368
|
+
buildValidators(validations, formGroup) {
|
|
369
|
+
if (!validations)
|
|
370
|
+
return [];
|
|
371
|
+
const validators = [];
|
|
372
|
+
validations.forEach((validation) => {
|
|
373
|
+
switch (validation.type) {
|
|
374
|
+
case 'required':
|
|
375
|
+
validators.push(Validators.required);
|
|
376
|
+
break;
|
|
377
|
+
case 'email':
|
|
378
|
+
validators.push(Validators.email);
|
|
379
|
+
break;
|
|
380
|
+
case 'minLength':
|
|
381
|
+
validators.push(Validators.minLength(validation.value));
|
|
382
|
+
break;
|
|
383
|
+
case 'maxLength':
|
|
384
|
+
validators.push(Validators.maxLength(validation.value));
|
|
385
|
+
break;
|
|
386
|
+
case 'min':
|
|
387
|
+
validators.push(Validators.min(validation.value));
|
|
388
|
+
break;
|
|
389
|
+
case 'max':
|
|
390
|
+
validators.push(Validators.max(validation.value));
|
|
391
|
+
break;
|
|
392
|
+
case 'pattern':
|
|
393
|
+
validators.push(Validators.pattern(validation.value));
|
|
394
|
+
break;
|
|
395
|
+
case 'custom':
|
|
396
|
+
if (validation.validator) {
|
|
397
|
+
validators.push((control) => {
|
|
398
|
+
const isValid = validation.validator(control.value, formGroup);
|
|
399
|
+
return isValid ? null : { custom: true };
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
return validators;
|
|
406
|
+
}
|
|
407
|
+
triggerFileUpload(fieldName) {
|
|
408
|
+
document.getElementById('fileInput_' + fieldName)?.click();
|
|
409
|
+
}
|
|
410
|
+
openTimePicker(fieldName) {
|
|
411
|
+
const timeInput = document.getElementById(fieldName);
|
|
412
|
+
if (timeInput && timeInput.type === 'time') {
|
|
413
|
+
// Try modern showPicker API first, fallback to click
|
|
414
|
+
if (timeInput.showPicker) {
|
|
415
|
+
timeInput.showPicker();
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
timeInput.focus();
|
|
419
|
+
timeInput.click();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
onFileChange(event, fieldName) {
|
|
424
|
+
const file = event.target.files[0];
|
|
425
|
+
if (file) {
|
|
426
|
+
this.fileNames.set(fieldName, file.name);
|
|
427
|
+
const reader = new FileReader();
|
|
428
|
+
reader.readAsDataURL(file);
|
|
429
|
+
reader.onload = () => {
|
|
430
|
+
const base64String = reader.result;
|
|
431
|
+
this.filePreviews.set(fieldName, base64String);
|
|
432
|
+
this.form.get(fieldName)?.setValue(base64String);
|
|
433
|
+
// Trigger onChange handler for file fields
|
|
434
|
+
const column = this.getColumnByName(fieldName);
|
|
435
|
+
if (column?.onChange) {
|
|
436
|
+
column.onChange(base64String, this.form);
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
extractFileName(value) {
|
|
442
|
+
if (!value)
|
|
443
|
+
return '';
|
|
444
|
+
// If it's a URL, extract filename from URL
|
|
445
|
+
if (value.startsWith('http')) {
|
|
446
|
+
const parts = value.split('/');
|
|
447
|
+
return parts[parts.length - 1];
|
|
448
|
+
}
|
|
449
|
+
// If it's base64, return a generic name
|
|
450
|
+
if (value.startsWith(`data:image`)) {
|
|
451
|
+
return 'uploaded-image.jpg';
|
|
452
|
+
}
|
|
453
|
+
return 'existing-photo.jpg';
|
|
454
|
+
}
|
|
455
|
+
getFilePreview(fieldName) {
|
|
456
|
+
return this.filePreviews.get(fieldName) || null;
|
|
457
|
+
}
|
|
458
|
+
getFileName(fieldName) {
|
|
459
|
+
return this.fileNames.get(fieldName) || null;
|
|
460
|
+
}
|
|
461
|
+
mapSearchOptions(options) {
|
|
462
|
+
return options.map(opt => ({
|
|
463
|
+
code: opt.code || opt.value,
|
|
464
|
+
name: opt.name || opt.label || opt.value,
|
|
465
|
+
value: opt.value
|
|
466
|
+
}));
|
|
467
|
+
}
|
|
468
|
+
deleteFile(fieldName) {
|
|
469
|
+
this.filePreviews.delete(fieldName);
|
|
470
|
+
this.fileNames.delete(fieldName);
|
|
471
|
+
this.form.get(fieldName)?.setValue('');
|
|
472
|
+
// Trigger onChange handler when file is deleted
|
|
473
|
+
const column = this.getColumnByName(fieldName);
|
|
474
|
+
if (column?.onChange) {
|
|
475
|
+
column.onChange('', this.form);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
handleSubmit() {
|
|
479
|
+
this.submitted = true;
|
|
480
|
+
if (this.form.invalid) {
|
|
481
|
+
// Mark all fields as touched to show red borders
|
|
482
|
+
Object.keys(this.form.controls).forEach((key) => {
|
|
483
|
+
this.form.get(key)?.markAsTouched();
|
|
484
|
+
});
|
|
485
|
+
// Count only required fields that are invalid
|
|
486
|
+
const allColumns = this.config.sections.flatMap((s) => s.fields);
|
|
487
|
+
const invalidRequiredCount = Object.keys(this.form.controls).filter((key) => {
|
|
488
|
+
const control = this.form.get(key);
|
|
489
|
+
if (!control?.invalid)
|
|
490
|
+
return false;
|
|
491
|
+
// Check if this field has required validation
|
|
492
|
+
const column = allColumns.find((c) => c.name === key);
|
|
493
|
+
return (column?.validations?.some((v) => v.type === 'required') || false);
|
|
494
|
+
}).length;
|
|
495
|
+
// Only emit if there are required fields missing
|
|
496
|
+
if (invalidRequiredCount > 0) {
|
|
497
|
+
this.validationError.emit(`Please fill all required fields marked with *. ${invalidRequiredCount} field(s) need attention.`);
|
|
498
|
+
}
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const formData = this.form.getRawValue();
|
|
502
|
+
this.config.onSubmit(formData);
|
|
503
|
+
}
|
|
504
|
+
handleReset() {
|
|
505
|
+
this.submitted = false;
|
|
506
|
+
this.form.reset();
|
|
507
|
+
if (this.config.onReset) {
|
|
508
|
+
this.config.onReset();
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
isFieldInvalid(fieldName) {
|
|
512
|
+
const field = this.form.get(fieldName);
|
|
513
|
+
return !!(field && field.invalid && this.submitted);
|
|
514
|
+
}
|
|
515
|
+
getErrorMessage(fieldName) {
|
|
516
|
+
const field = this.form.get(fieldName);
|
|
517
|
+
if (!field?.errors)
|
|
518
|
+
return '';
|
|
519
|
+
// Check if there's a custom message from validations
|
|
520
|
+
const allColumns = this.config.sections.flatMap((s) => s.fields);
|
|
521
|
+
const column = allColumns.find((c) => c.name === fieldName);
|
|
522
|
+
// Check for custom validation error
|
|
523
|
+
if (field.errors['custom']) {
|
|
524
|
+
const customValidation = column?.validations?.find((v) => v.type === 'custom');
|
|
525
|
+
return customValidation?.message || 'Invalid field';
|
|
526
|
+
}
|
|
527
|
+
// Check if there's a custom message from validations
|
|
528
|
+
const errorKeys = Object.keys(field.errors);
|
|
529
|
+
for (const key of errorKeys) {
|
|
530
|
+
const validation = column?.validations?.find((v) => v.type === key);
|
|
531
|
+
if (validation?.message) {
|
|
532
|
+
return validation.message;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
// Default error messages
|
|
536
|
+
if (field.errors['required']) {
|
|
537
|
+
return `${column?.label} is required`;
|
|
538
|
+
}
|
|
539
|
+
if (field.errors['email'])
|
|
540
|
+
return 'Invalid email format';
|
|
541
|
+
if (field.errors['minlength'])
|
|
542
|
+
return `Minimum length is ${field.errors['minlength'].requiredLength}`;
|
|
543
|
+
if (field.errors['maxlength'])
|
|
544
|
+
return `Maximum length is ${field.errors['maxlength'].requiredLength}`;
|
|
545
|
+
if (field.errors['min'])
|
|
546
|
+
return `Minimum value is ${field.errors['min'].min}`;
|
|
547
|
+
if (field.errors['max'])
|
|
548
|
+
return `Maximum value is ${field.errors['max'].max}`;
|
|
549
|
+
if (field.errors['pattern'])
|
|
550
|
+
return 'Invalid format';
|
|
551
|
+
return 'Invalid field';
|
|
552
|
+
}
|
|
553
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddUpdateFormComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
554
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AddUpdateFormComponent, isStandalone: true, selector: "lib-add-update-form", inputs: { config: "config" }, outputs: { validationError: "validationError" }, ngImport: i0, template: `
|
|
555
|
+
<div class="form-container">
|
|
556
|
+
<div class="form-header" *ngIf="config.formTitle">
|
|
557
|
+
<h2>{{ config.formTitle }}</h2>
|
|
558
|
+
</div>
|
|
559
|
+
|
|
560
|
+
<form [formGroup]="form" (ngSubmit)="handleSubmit()" class="dynamic-form">
|
|
561
|
+
<div *ngFor="let section of config.sections" class="form-section">
|
|
562
|
+
<h3 class="section-title" *ngIf="section.title">
|
|
563
|
+
{{ section.title }}
|
|
564
|
+
</h3>
|
|
565
|
+
|
|
566
|
+
<div class="fields-row">
|
|
567
|
+
<ng-container *ngFor="let column of section.fields">
|
|
568
|
+
<div
|
|
569
|
+
class="form-field-wrapper"
|
|
570
|
+
[ngClass]="'field-' + column.type"
|
|
571
|
+
[ngStyle]="column.hidden ? { display: 'none' } : {}"
|
|
572
|
+
[style.grid-column]="'span ' + (column.colSpan || 1)"
|
|
573
|
+
>
|
|
574
|
+
<ng-container
|
|
575
|
+
*ngIf="
|
|
576
|
+
['text', 'email', 'password'].includes(column.type) &&
|
|
577
|
+
!column.hidden
|
|
578
|
+
"
|
|
579
|
+
>
|
|
580
|
+
<fv-entry-field
|
|
581
|
+
[label]="column.label"
|
|
582
|
+
[placeholder]="column.placeholder || ''"
|
|
583
|
+
[type]="
|
|
584
|
+
column.type === 'password'
|
|
585
|
+
? 'password'
|
|
586
|
+
: column.type === 'email'
|
|
587
|
+
? 'email'
|
|
588
|
+
: 'text'
|
|
589
|
+
"
|
|
590
|
+
[control]="getControl(column.name)"
|
|
591
|
+
[schema]="getSchema(column)"
|
|
592
|
+
[disabled]="column.disabled || false"
|
|
593
|
+
[readonly]="false"
|
|
594
|
+
[allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
|
|
595
|
+
[maxLength]="column.maxLength || null"
|
|
596
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
597
|
+
>
|
|
598
|
+
</fv-entry-field>
|
|
599
|
+
</ng-container>
|
|
600
|
+
|
|
601
|
+
<ng-container
|
|
602
|
+
*ngIf="column.type === 'number' && !column.hidden"
|
|
603
|
+
>
|
|
604
|
+
<fv-number-field
|
|
605
|
+
[label]="column.label"
|
|
606
|
+
[placeholder]="column.placeholder || ''"
|
|
607
|
+
[control]="getControl(column.name)"
|
|
608
|
+
[schema]="getSchema(column)"
|
|
609
|
+
[disabled]="column.disabled || false"
|
|
610
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
611
|
+
>
|
|
612
|
+
</fv-number-field>
|
|
613
|
+
</ng-container>
|
|
614
|
+
|
|
615
|
+
<ng-container
|
|
616
|
+
*ngIf="column.type === 'select' && !column.hidden"
|
|
617
|
+
>
|
|
618
|
+
<fv-dropdown
|
|
619
|
+
[label]="column.label"
|
|
620
|
+
[placeholder]="column.placeholder || 'Select option'"
|
|
621
|
+
[options]="column.options || []"
|
|
622
|
+
[control]="getControl(column.name)"
|
|
623
|
+
[schema]="getSchema(column)"
|
|
624
|
+
[disabled]="column.disabled || false"
|
|
625
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
626
|
+
>
|
|
627
|
+
</fv-dropdown>
|
|
628
|
+
</ng-container>
|
|
629
|
+
|
|
630
|
+
<ng-container
|
|
631
|
+
*ngIf="column.type === 'checkbox' && !column.hidden"
|
|
632
|
+
>
|
|
633
|
+
<fv-checkbox
|
|
634
|
+
[label]="column.label"
|
|
635
|
+
[control]="getControl(column.name)"
|
|
636
|
+
[disabled]="column.disabled || false"
|
|
637
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
638
|
+
>
|
|
639
|
+
</fv-checkbox>
|
|
640
|
+
</ng-container>
|
|
641
|
+
|
|
642
|
+
<ng-container *ngIf="column.type === 'radio' && !column.hidden">
|
|
643
|
+
<fv-radio-group
|
|
644
|
+
[label]="column.label"
|
|
645
|
+
[options]="column.options || []"
|
|
646
|
+
[control]="getControl(column.name)"
|
|
647
|
+
[disabled]="column.disabled || false"
|
|
648
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
649
|
+
>
|
|
650
|
+
</fv-radio-group>
|
|
651
|
+
</ng-container>
|
|
652
|
+
|
|
653
|
+
<ng-container *ngIf="column.type === 'date' && !column.hidden">
|
|
654
|
+
<fv-date-field
|
|
655
|
+
[label]="column.label"
|
|
656
|
+
[control]="getControl(column.name)"
|
|
657
|
+
[schema]="getSchema(column)"
|
|
658
|
+
[disabled]="column.disabled || false"
|
|
659
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
660
|
+
>
|
|
661
|
+
</fv-date-field>
|
|
662
|
+
</ng-container>
|
|
663
|
+
|
|
664
|
+
<ng-container
|
|
665
|
+
*ngIf="column.type === 'month-year' && !column.hidden"
|
|
666
|
+
>
|
|
667
|
+
<fv-month-year-field
|
|
668
|
+
[label]="column.label"
|
|
669
|
+
[control]="getControl(column.name)"
|
|
670
|
+
[schema]="getSchema(column)"
|
|
671
|
+
[disabled]="column.disabled || false"
|
|
672
|
+
(valueChange)="handleMonthYearChange(column.name, $event)"
|
|
673
|
+
>
|
|
674
|
+
</fv-month-year-field>
|
|
675
|
+
</ng-container>
|
|
676
|
+
|
|
677
|
+
<ng-container
|
|
678
|
+
*ngIf="column.type === 'textarea' && !column.hidden"
|
|
679
|
+
>
|
|
680
|
+
<fv-rich-text-editor
|
|
681
|
+
[label]="column.label"
|
|
682
|
+
[placeholder]="column.placeholder || ''"
|
|
683
|
+
[control]="getControl(column.name)"
|
|
684
|
+
[schema]="getSchema(column)"
|
|
685
|
+
[disabled]="column.disabled || false"
|
|
686
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
687
|
+
>
|
|
688
|
+
</fv-rich-text-editor>
|
|
689
|
+
</ng-container>
|
|
690
|
+
|
|
691
|
+
<ng-container *ngIf="column.type === 'file' && !column.hidden">
|
|
692
|
+
<ng-container *ngIf="isImageField(column); else standardFile">
|
|
693
|
+
<fv-image-selector
|
|
694
|
+
[label]="column.label"
|
|
695
|
+
[placeholder]="column.placeholder || 'Select image'"
|
|
696
|
+
[control]="getControl(column.name)"
|
|
697
|
+
[schema]="getSchema(column)"
|
|
698
|
+
[disabled]="column.disabled || false"
|
|
699
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
700
|
+
>
|
|
701
|
+
</fv-image-selector>
|
|
702
|
+
</ng-container>
|
|
703
|
+
|
|
704
|
+
<ng-template #standardFile>
|
|
705
|
+
<fv-file-selector
|
|
706
|
+
[label]="column.label"
|
|
707
|
+
[placeholder]="column.placeholder || 'Select file'"
|
|
708
|
+
[accept]="column.accept || '*/*'"
|
|
709
|
+
[control]="getControl(column.name)"
|
|
710
|
+
[schema]="getSchema(column)"
|
|
711
|
+
[disabled]="column.disabled || false"
|
|
712
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
713
|
+
>
|
|
714
|
+
</fv-file-selector>
|
|
715
|
+
</ng-template>
|
|
716
|
+
</ng-container>
|
|
717
|
+
|
|
718
|
+
<ng-container
|
|
719
|
+
*ngIf="column.type === 'name-code' && !column.hidden"
|
|
720
|
+
>
|
|
721
|
+
<fv-name-code
|
|
722
|
+
[label]="column.label"
|
|
723
|
+
[placeholder]="column.placeholder || 'Search by Code or Name'"
|
|
724
|
+
[options]="column.options ? mapSearchOptions(column.options) : []"
|
|
725
|
+
[control]="getControl(column.name)"
|
|
726
|
+
[schema]="getSchema(column)"
|
|
727
|
+
[disabled]="column.disabled || false"
|
|
728
|
+
>
|
|
729
|
+
</fv-name-code>
|
|
730
|
+
</ng-container>
|
|
731
|
+
|
|
732
|
+
<ng-container *ngIf="column.type === 'phone' && !column.hidden">
|
|
733
|
+
<fv-phone-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
|
|
734
|
+
</ng-container>
|
|
735
|
+
|
|
736
|
+
<ng-container *ngIf="column.type === 'uan' && !column.hidden">
|
|
737
|
+
<fv-uan-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
|
|
738
|
+
</ng-container>
|
|
739
|
+
|
|
740
|
+
<ng-container *ngIf="column.type === 'pf' && !column.hidden">
|
|
741
|
+
<fv-pf-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
|
|
742
|
+
</ng-container>
|
|
743
|
+
|
|
744
|
+
<ng-container *ngIf="column.type === 'esi' && !column.hidden">
|
|
745
|
+
<fv-esi-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
|
|
746
|
+
</ng-container>
|
|
747
|
+
|
|
748
|
+
<ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
|
|
749
|
+
<fv-ifsc-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
|
|
750
|
+
</ng-container>
|
|
751
|
+
|
|
752
|
+
<ng-container *ngIf="column.type === 'micr' && !column.hidden">
|
|
753
|
+
<fv-micr-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
|
|
754
|
+
</ng-container>
|
|
755
|
+
|
|
756
|
+
<ng-container *ngIf="column.type === 'iban' && !column.hidden">
|
|
757
|
+
<fv-iban-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
|
|
758
|
+
</ng-container>
|
|
759
|
+
</div>
|
|
760
|
+
</ng-container>
|
|
761
|
+
</div>
|
|
762
|
+
</div>
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
<div class="form-actions">
|
|
766
|
+
<button
|
|
767
|
+
type="submit"
|
|
768
|
+
class="btn btn-primary"
|
|
769
|
+
[disabled]="form.invalid && submitted"
|
|
770
|
+
>
|
|
771
|
+
{{ config.submitLabel || 'Save' }}
|
|
772
|
+
</button>
|
|
773
|
+
<button
|
|
774
|
+
type="button"
|
|
775
|
+
class="btn btn-outline"
|
|
776
|
+
(click)="config.onCancel()"
|
|
777
|
+
>
|
|
778
|
+
{{ config.cancelLabel || 'Cancel' }}
|
|
779
|
+
</button>
|
|
780
|
+
</div>
|
|
781
|
+
</form>
|
|
782
|
+
</div>
|
|
783
|
+
`, isInline: true, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins!important}.form-container{background:#f5f5f5;padding:10px;border-radius:8px;margin:0 auto;max-width:100%;overflow-x:hidden;box-sizing:border-box}.error-border{border-color:red!important}.hidden{display:none!important}.form-header{margin-bottom:10px}.form-header h2{margin:0;font-size:20px;font-weight:700;color:#303030}.dynamic-form{background:#fff;padding:10px;border-radius:6px;box-shadow:0 1px 3px #0000001a;max-width:100%;box-sizing:border-box}.form-section{margin-bottom:10px}.section-title{font-size:16px;font-weight:700;color:#303030;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.fields-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;width:100%;box-sizing:border-box}.form-field-wrapper{display:flex;position:relative;flex-direction:column;min-width:0;width:100%;box-sizing:border-box}.password-toggle-btn{position:absolute;right:10px;top:32px;background:none;border:none;cursor:pointer;padding:4px;color:#666}.password-toggle-btn:hover{color:#333}.password-toggle-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}@media (min-width: 1200px) and (max-width: 1400px){.fields-row{grid-template-columns:repeat(5,1fr)}.form-control{width:180px;max-width:180px}}@media (max-width: 1200px){.fields-row{grid-template-columns:repeat(3,1fr)}.form-control{width:100%;max-width:100%}}@media (max-width: 992px){.fields-row{grid-template-columns:repeat(2,1fr);gap:12px}}@media (max-width: 768px){.fields-row{grid-template-columns:repeat(2,1fr);gap:10px}}@media (max-width: 640px){.fields-row{grid-template-columns:1fr;gap:12px}.form-field-wrapper{width:100%}}label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px}.required{color:#e74c3c;margin-left:2px}.form-control{padding:5px 10px;width:100%;max-width:100%;border:1px solid #8CBBA8;border-radius:8px;background-color:#fff;font-size:14px;font-weight:400;font-family:inherit;color:#1f2b41;transition:border-color .2s,box-shadow .2s;box-sizing:border-box}.form-control:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.form-control:disabled{background-color:#ecf0f1;cursor:not-allowed}textarea.form-control{resize:vertical;min-height:100px}select.form-control{cursor:pointer;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;padding-right:40px}.checkbox-wrapper{display:flex;align-items:center;gap:8px}input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label{cursor:pointer;margin:0}.file-upload-container{display:flex;align-items:center;gap:20px;padding:20px;background:#fff;max-width:100%;box-sizing:border-box;flex-wrap:wrap}.material-icons{font-family:Material Icons!important;border-radius:4px;display:inline-block;width:40px;padding:8px;height:40px}.file-field-wrapper{width:100%;margin-top:16px;max-width:100%;box-sizing:border-box}.photo-preview-circle{width:100px;height:100px;border-radius:50%;overflow:hidden;border:2px solid #ddd;cursor:pointer;transition:border-color .2s}.photo-preview-circle:hover{border-color:#3498db}.preview-image,.default-photo{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-image img{width:100%;height:100%;object-fit:cover}.default-photo{background:#f0f0f0;color:#999;font-size:40px}.file-info{display:flex;flex-direction:column;gap:8px}.btn-delete{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:0}.upload-btn-group{display:flex;align-items:center;border:1px solid #d3d3d3;border-radius:8px;background:#fff;overflow:hidden;width:fit-content}.btn-upload{background:#fff;color:#222;border:none;padding:0 18px;font-size:16px;border-right:1px solid #e0e0e0;border-radius:8px 0 0 8px;outline:none;box-shadow:none;cursor:pointer;height:40px;transition:background .2s}.btn-upload-icon{background:#f5f5f5;border:none;border-radius:0 8px 8px 0;display:flex;align-items:center;justify-content:center;width:48px;height:40px;cursor:pointer;transition:background .2s}.btn-upload-icon i.material-icons{font-size:22px;color:#222}.btn-upload:hover,.btn-upload-icon:hover{background:#f0f0f0}.btn-delete{background:#fff;color:red}.btn-delete:hover{background:#f0f0f0}.file-name{font-size:12px;color:#666;margin:10px 8px 8px}.file-label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px;display:block}.radio-label{font-weight:600;margin-bottom:15px;color:#151d48;font-size:14px;display:block}.radio-group{display:flex;gap:20px;align-items:center}.radio-item{display:flex;align-items:center;gap:6px}input[type=radio]{width:18px;height:18px;cursor:pointer;accent-color:#3498db}.radio-option-label{cursor:pointer;margin:0;font-weight:400}.hint{font-size:12px;color:#7f8c8d;margin-top:4px}.error-message{color:#e74c3c;font-size:12px;margin-top:4px}.form-actions{display:flex;gap:8px;align-items:center;justify-content:space-between;gap:12px;padding-top:5px}.btn{padding:8px 20px;border:none;border-radius:7px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s}.btn-primary{background-color:#006aff;color:#fff}.btn-primary:hover:not(:disabled){background-color:#2980b9}.btn-primary:disabled{background-color:#bdc3c7;cursor:not-allowed}.btn-secondary{background-color:#95a5a6;color:#fff}.btn-secondary:hover{background-color:#7f8c8d}.btn-outline{background-color:#303030;color:#fff}.btn-outline:hover{background-color:#2b2b2b;color:#fff}.month-year-wrapper{position:relative;display:flex;align-items:center;width:100%}.month-year-wrapper .form-control{padding-right:45px}.month-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0;border:none;padding:0;margin:0}.month-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.month-picker-btn:hover:not(:disabled){color:#3498db}.month-picker-btn:disabled{cursor:not-allowed;opacity:.5}.month-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}.search-select-wrapper{position:relative;width:100%}.search-select-input{padding-right:10px}.search-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:auto;min-width:100%;max-width:calc(100vw - 16px);background:#fff;border:1px solid #d3d3d3;border-radius:8px;max-height:220px;overflow-y:auto;box-shadow:0 4px 10px #00000014;z-index:5;padding:6px 0;transform:translate(0);transition:transform .1s ease-out}.search-select-option{padding:8px 12px;cursor:pointer;display:flex;gap:8px;align-items:center;border-bottom:1px solid #f2f2f2}.search-select-option:last-child{border-bottom:none}.search-select-option:hover{background:#f5f9ff}.option-code{color:#0052cc;font-weight:700;min-width:90px}.option-name{color:#151d48;font-weight:500}.time-picker-wrapper{position:relative;display:flex;align-items:center;width:100%}.time-input{padding-right:45px;flex:1}.time-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.time-picker-btn:hover:not(:disabled){color:#3498db}.time-picker-btn:disabled{cursor:not-allowed;opacity:.5}.time-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}input[type=time]{cursor:pointer}input[type=time]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:0;position:absolute;right:0;width:100%;height:100%}.date-picker-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-form-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-text-field-wrapper{background-color:#fff}.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#3498db}.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:red!important}.date-picker-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.date-picker-field ::ng-deep .mat-mdc-form-field-input-control input{font-family:Poppins!important;font-size:14px;font-weight:400;color:#1f2b41}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FvEntryFieldComponent, selector: "fv-entry-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "type", "allowAlphabetsOnly", "maxLength"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNumberFieldComponent, selector: "fv-number-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "min", "max", "step"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvDropdownComponent, selector: "fv-dropdown", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvRadioGroupComponent, selector: "fv-radio-group", inputs: ["label", "control", "options", "disabled", "required", "name"], outputs: ["valueChange"] }, { kind: "component", type: FvCheckboxComponent, selector: "fv-checkbox", inputs: ["label", "control", "disabled", "required"], outputs: ["valueChange"] }, { kind: "component", type: FvDateFieldComponent, selector: "fv-date-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvMonthYearFieldComponent, selector: "fv-month-year-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvFileSelectorComponent, selector: "fv-file-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "accept", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvImageSelectorComponent, selector: "fv-image-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvRichTextEditorComponent, selector: "fv-rich-text-editor", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "minHeight", "showToolbar"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNameCodeComponent, selector: "fv-name-code", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["selectionChange"] }, { kind: "component", type: FvPhoneFieldComponent, selector: "fv-phone-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvUanFieldComponent, selector: "fv-uan-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvPfFieldComponent, selector: "fv-pf-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvEsiFieldComponent, selector: "fv-esi-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIfscFieldComponent, selector: "fv-ifsc-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvMicrFieldComponent, selector: "fv-micr-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIbanFieldComponent, selector: "fv-iban-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }] });
|
|
784
|
+
}
|
|
785
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddUpdateFormComponent, decorators: [{
|
|
786
|
+
type: Component,
|
|
787
|
+
args: [{ selector: 'lib-add-update-form', standalone: true, imports: [
|
|
788
|
+
CommonModule,
|
|
789
|
+
ReactiveFormsModule,
|
|
790
|
+
FvEntryFieldComponent,
|
|
791
|
+
FvNumberFieldComponent,
|
|
792
|
+
FvDropdownComponent,
|
|
793
|
+
FvRadioGroupComponent,
|
|
794
|
+
FvCheckboxComponent,
|
|
795
|
+
FvDateFieldComponent,
|
|
796
|
+
FvMonthYearFieldComponent,
|
|
797
|
+
FvFileSelectorComponent,
|
|
798
|
+
FvImageSelectorComponent,
|
|
799
|
+
FvRichTextEditorComponent,
|
|
800
|
+
FvRichTextEditorComponent,
|
|
801
|
+
FvNameCodeComponent,
|
|
802
|
+
FvPhoneFieldComponent,
|
|
803
|
+
FvUanFieldComponent,
|
|
804
|
+
FvPfFieldComponent,
|
|
805
|
+
FvEsiFieldComponent,
|
|
806
|
+
FvIfscFieldComponent,
|
|
807
|
+
FvMicrFieldComponent,
|
|
808
|
+
FvIbanFieldComponent,
|
|
809
|
+
], template: `
|
|
810
|
+
<div class="form-container">
|
|
811
|
+
<div class="form-header" *ngIf="config.formTitle">
|
|
812
|
+
<h2>{{ config.formTitle }}</h2>
|
|
813
|
+
</div>
|
|
814
|
+
|
|
815
|
+
<form [formGroup]="form" (ngSubmit)="handleSubmit()" class="dynamic-form">
|
|
816
|
+
<div *ngFor="let section of config.sections" class="form-section">
|
|
817
|
+
<h3 class="section-title" *ngIf="section.title">
|
|
818
|
+
{{ section.title }}
|
|
819
|
+
</h3>
|
|
820
|
+
|
|
821
|
+
<div class="fields-row">
|
|
822
|
+
<ng-container *ngFor="let column of section.fields">
|
|
823
|
+
<div
|
|
824
|
+
class="form-field-wrapper"
|
|
825
|
+
[ngClass]="'field-' + column.type"
|
|
826
|
+
[ngStyle]="column.hidden ? { display: 'none' } : {}"
|
|
827
|
+
[style.grid-column]="'span ' + (column.colSpan || 1)"
|
|
828
|
+
>
|
|
829
|
+
<ng-container
|
|
830
|
+
*ngIf="
|
|
831
|
+
['text', 'email', 'password'].includes(column.type) &&
|
|
832
|
+
!column.hidden
|
|
833
|
+
"
|
|
834
|
+
>
|
|
835
|
+
<fv-entry-field
|
|
836
|
+
[label]="column.label"
|
|
837
|
+
[placeholder]="column.placeholder || ''"
|
|
838
|
+
[type]="
|
|
839
|
+
column.type === 'password'
|
|
840
|
+
? 'password'
|
|
841
|
+
: column.type === 'email'
|
|
842
|
+
? 'email'
|
|
843
|
+
: 'text'
|
|
844
|
+
"
|
|
845
|
+
[control]="getControl(column.name)"
|
|
846
|
+
[schema]="getSchema(column)"
|
|
847
|
+
[disabled]="column.disabled || false"
|
|
848
|
+
[readonly]="false"
|
|
849
|
+
[allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
|
|
850
|
+
[maxLength]="column.maxLength || null"
|
|
851
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
852
|
+
>
|
|
853
|
+
</fv-entry-field>
|
|
854
|
+
</ng-container>
|
|
855
|
+
|
|
856
|
+
<ng-container
|
|
857
|
+
*ngIf="column.type === 'number' && !column.hidden"
|
|
858
|
+
>
|
|
859
|
+
<fv-number-field
|
|
860
|
+
[label]="column.label"
|
|
861
|
+
[placeholder]="column.placeholder || ''"
|
|
862
|
+
[control]="getControl(column.name)"
|
|
863
|
+
[schema]="getSchema(column)"
|
|
864
|
+
[disabled]="column.disabled || false"
|
|
865
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
866
|
+
>
|
|
867
|
+
</fv-number-field>
|
|
868
|
+
</ng-container>
|
|
869
|
+
|
|
870
|
+
<ng-container
|
|
871
|
+
*ngIf="column.type === 'select' && !column.hidden"
|
|
872
|
+
>
|
|
873
|
+
<fv-dropdown
|
|
874
|
+
[label]="column.label"
|
|
875
|
+
[placeholder]="column.placeholder || 'Select option'"
|
|
876
|
+
[options]="column.options || []"
|
|
877
|
+
[control]="getControl(column.name)"
|
|
878
|
+
[schema]="getSchema(column)"
|
|
879
|
+
[disabled]="column.disabled || false"
|
|
880
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
881
|
+
>
|
|
882
|
+
</fv-dropdown>
|
|
883
|
+
</ng-container>
|
|
884
|
+
|
|
885
|
+
<ng-container
|
|
886
|
+
*ngIf="column.type === 'checkbox' && !column.hidden"
|
|
887
|
+
>
|
|
888
|
+
<fv-checkbox
|
|
889
|
+
[label]="column.label"
|
|
890
|
+
[control]="getControl(column.name)"
|
|
891
|
+
[disabled]="column.disabled || false"
|
|
892
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
893
|
+
>
|
|
894
|
+
</fv-checkbox>
|
|
895
|
+
</ng-container>
|
|
896
|
+
|
|
897
|
+
<ng-container *ngIf="column.type === 'radio' && !column.hidden">
|
|
898
|
+
<fv-radio-group
|
|
899
|
+
[label]="column.label"
|
|
900
|
+
[options]="column.options || []"
|
|
901
|
+
[control]="getControl(column.name)"
|
|
902
|
+
[disabled]="column.disabled || false"
|
|
903
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
904
|
+
>
|
|
905
|
+
</fv-radio-group>
|
|
906
|
+
</ng-container>
|
|
907
|
+
|
|
908
|
+
<ng-container *ngIf="column.type === 'date' && !column.hidden">
|
|
909
|
+
<fv-date-field
|
|
910
|
+
[label]="column.label"
|
|
911
|
+
[control]="getControl(column.name)"
|
|
912
|
+
[schema]="getSchema(column)"
|
|
913
|
+
[disabled]="column.disabled || false"
|
|
914
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
915
|
+
>
|
|
916
|
+
</fv-date-field>
|
|
917
|
+
</ng-container>
|
|
918
|
+
|
|
919
|
+
<ng-container
|
|
920
|
+
*ngIf="column.type === 'month-year' && !column.hidden"
|
|
921
|
+
>
|
|
922
|
+
<fv-month-year-field
|
|
923
|
+
[label]="column.label"
|
|
924
|
+
[control]="getControl(column.name)"
|
|
925
|
+
[schema]="getSchema(column)"
|
|
926
|
+
[disabled]="column.disabled || false"
|
|
927
|
+
(valueChange)="handleMonthYearChange(column.name, $event)"
|
|
928
|
+
>
|
|
929
|
+
</fv-month-year-field>
|
|
930
|
+
</ng-container>
|
|
931
|
+
|
|
932
|
+
<ng-container
|
|
933
|
+
*ngIf="column.type === 'textarea' && !column.hidden"
|
|
934
|
+
>
|
|
935
|
+
<fv-rich-text-editor
|
|
936
|
+
[label]="column.label"
|
|
937
|
+
[placeholder]="column.placeholder || ''"
|
|
938
|
+
[control]="getControl(column.name)"
|
|
939
|
+
[schema]="getSchema(column)"
|
|
940
|
+
[disabled]="column.disabled || false"
|
|
941
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
942
|
+
>
|
|
943
|
+
</fv-rich-text-editor>
|
|
944
|
+
</ng-container>
|
|
945
|
+
|
|
946
|
+
<ng-container *ngIf="column.type === 'file' && !column.hidden">
|
|
947
|
+
<ng-container *ngIf="isImageField(column); else standardFile">
|
|
948
|
+
<fv-image-selector
|
|
949
|
+
[label]="column.label"
|
|
950
|
+
[placeholder]="column.placeholder || 'Select image'"
|
|
951
|
+
[control]="getControl(column.name)"
|
|
952
|
+
[schema]="getSchema(column)"
|
|
953
|
+
[disabled]="column.disabled || false"
|
|
954
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
955
|
+
>
|
|
956
|
+
</fv-image-selector>
|
|
957
|
+
</ng-container>
|
|
958
|
+
|
|
959
|
+
<ng-template #standardFile>
|
|
960
|
+
<fv-file-selector
|
|
961
|
+
[label]="column.label"
|
|
962
|
+
[placeholder]="column.placeholder || 'Select file'"
|
|
963
|
+
[accept]="column.accept || '*/*'"
|
|
964
|
+
[control]="getControl(column.name)"
|
|
965
|
+
[schema]="getSchema(column)"
|
|
966
|
+
[disabled]="column.disabled || false"
|
|
967
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
968
|
+
>
|
|
969
|
+
</fv-file-selector>
|
|
970
|
+
</ng-template>
|
|
971
|
+
</ng-container>
|
|
972
|
+
|
|
973
|
+
<ng-container
|
|
974
|
+
*ngIf="column.type === 'name-code' && !column.hidden"
|
|
975
|
+
>
|
|
976
|
+
<fv-name-code
|
|
977
|
+
[label]="column.label"
|
|
978
|
+
[placeholder]="column.placeholder || 'Search by Code or Name'"
|
|
979
|
+
[options]="column.options ? mapSearchOptions(column.options) : []"
|
|
980
|
+
[control]="getControl(column.name)"
|
|
981
|
+
[schema]="getSchema(column)"
|
|
982
|
+
[disabled]="column.disabled || false"
|
|
983
|
+
>
|
|
984
|
+
</fv-name-code>
|
|
985
|
+
</ng-container>
|
|
986
|
+
|
|
987
|
+
<ng-container *ngIf="column.type === 'phone' && !column.hidden">
|
|
988
|
+
<fv-phone-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
|
|
989
|
+
</ng-container>
|
|
990
|
+
|
|
991
|
+
<ng-container *ngIf="column.type === 'uan' && !column.hidden">
|
|
992
|
+
<fv-uan-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
|
|
993
|
+
</ng-container>
|
|
994
|
+
|
|
995
|
+
<ng-container *ngIf="column.type === 'pf' && !column.hidden">
|
|
996
|
+
<fv-pf-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
|
|
997
|
+
</ng-container>
|
|
998
|
+
|
|
999
|
+
<ng-container *ngIf="column.type === 'esi' && !column.hidden">
|
|
1000
|
+
<fv-esi-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
|
|
1001
|
+
</ng-container>
|
|
1002
|
+
|
|
1003
|
+
<ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
|
|
1004
|
+
<fv-ifsc-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
|
|
1005
|
+
</ng-container>
|
|
1006
|
+
|
|
1007
|
+
<ng-container *ngIf="column.type === 'micr' && !column.hidden">
|
|
1008
|
+
<fv-micr-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
|
|
1009
|
+
</ng-container>
|
|
1010
|
+
|
|
1011
|
+
<ng-container *ngIf="column.type === 'iban' && !column.hidden">
|
|
1012
|
+
<fv-iban-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
|
|
1013
|
+
</ng-container>
|
|
1014
|
+
</div>
|
|
1015
|
+
</ng-container>
|
|
1016
|
+
</div>
|
|
1017
|
+
</div>
|
|
1018
|
+
|
|
1019
|
+
|
|
1020
|
+
<div class="form-actions">
|
|
1021
|
+
<button
|
|
1022
|
+
type="submit"
|
|
1023
|
+
class="btn btn-primary"
|
|
1024
|
+
[disabled]="form.invalid && submitted"
|
|
1025
|
+
>
|
|
1026
|
+
{{ config.submitLabel || 'Save' }}
|
|
1027
|
+
</button>
|
|
1028
|
+
<button
|
|
1029
|
+
type="button"
|
|
1030
|
+
class="btn btn-outline"
|
|
1031
|
+
(click)="config.onCancel()"
|
|
1032
|
+
>
|
|
1033
|
+
{{ config.cancelLabel || 'Cancel' }}
|
|
1034
|
+
</button>
|
|
1035
|
+
</div>
|
|
1036
|
+
</form>
|
|
1037
|
+
</div>
|
|
1038
|
+
`, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins!important}.form-container{background:#f5f5f5;padding:10px;border-radius:8px;margin:0 auto;max-width:100%;overflow-x:hidden;box-sizing:border-box}.error-border{border-color:red!important}.hidden{display:none!important}.form-header{margin-bottom:10px}.form-header h2{margin:0;font-size:20px;font-weight:700;color:#303030}.dynamic-form{background:#fff;padding:10px;border-radius:6px;box-shadow:0 1px 3px #0000001a;max-width:100%;box-sizing:border-box}.form-section{margin-bottom:10px}.section-title{font-size:16px;font-weight:700;color:#303030;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.fields-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;width:100%;box-sizing:border-box}.form-field-wrapper{display:flex;position:relative;flex-direction:column;min-width:0;width:100%;box-sizing:border-box}.password-toggle-btn{position:absolute;right:10px;top:32px;background:none;border:none;cursor:pointer;padding:4px;color:#666}.password-toggle-btn:hover{color:#333}.password-toggle-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}@media (min-width: 1200px) and (max-width: 1400px){.fields-row{grid-template-columns:repeat(5,1fr)}.form-control{width:180px;max-width:180px}}@media (max-width: 1200px){.fields-row{grid-template-columns:repeat(3,1fr)}.form-control{width:100%;max-width:100%}}@media (max-width: 992px){.fields-row{grid-template-columns:repeat(2,1fr);gap:12px}}@media (max-width: 768px){.fields-row{grid-template-columns:repeat(2,1fr);gap:10px}}@media (max-width: 640px){.fields-row{grid-template-columns:1fr;gap:12px}.form-field-wrapper{width:100%}}label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px}.required{color:#e74c3c;margin-left:2px}.form-control{padding:5px 10px;width:100%;max-width:100%;border:1px solid #8CBBA8;border-radius:8px;background-color:#fff;font-size:14px;font-weight:400;font-family:inherit;color:#1f2b41;transition:border-color .2s,box-shadow .2s;box-sizing:border-box}.form-control:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.form-control:disabled{background-color:#ecf0f1;cursor:not-allowed}textarea.form-control{resize:vertical;min-height:100px}select.form-control{cursor:pointer;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;padding-right:40px}.checkbox-wrapper{display:flex;align-items:center;gap:8px}input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label{cursor:pointer;margin:0}.file-upload-container{display:flex;align-items:center;gap:20px;padding:20px;background:#fff;max-width:100%;box-sizing:border-box;flex-wrap:wrap}.material-icons{font-family:Material Icons!important;border-radius:4px;display:inline-block;width:40px;padding:8px;height:40px}.file-field-wrapper{width:100%;margin-top:16px;max-width:100%;box-sizing:border-box}.photo-preview-circle{width:100px;height:100px;border-radius:50%;overflow:hidden;border:2px solid #ddd;cursor:pointer;transition:border-color .2s}.photo-preview-circle:hover{border-color:#3498db}.preview-image,.default-photo{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-image img{width:100%;height:100%;object-fit:cover}.default-photo{background:#f0f0f0;color:#999;font-size:40px}.file-info{display:flex;flex-direction:column;gap:8px}.btn-delete{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:0}.upload-btn-group{display:flex;align-items:center;border:1px solid #d3d3d3;border-radius:8px;background:#fff;overflow:hidden;width:fit-content}.btn-upload{background:#fff;color:#222;border:none;padding:0 18px;font-size:16px;border-right:1px solid #e0e0e0;border-radius:8px 0 0 8px;outline:none;box-shadow:none;cursor:pointer;height:40px;transition:background .2s}.btn-upload-icon{background:#f5f5f5;border:none;border-radius:0 8px 8px 0;display:flex;align-items:center;justify-content:center;width:48px;height:40px;cursor:pointer;transition:background .2s}.btn-upload-icon i.material-icons{font-size:22px;color:#222}.btn-upload:hover,.btn-upload-icon:hover{background:#f0f0f0}.btn-delete{background:#fff;color:red}.btn-delete:hover{background:#f0f0f0}.file-name{font-size:12px;color:#666;margin:10px 8px 8px}.file-label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px;display:block}.radio-label{font-weight:600;margin-bottom:15px;color:#151d48;font-size:14px;display:block}.radio-group{display:flex;gap:20px;align-items:center}.radio-item{display:flex;align-items:center;gap:6px}input[type=radio]{width:18px;height:18px;cursor:pointer;accent-color:#3498db}.radio-option-label{cursor:pointer;margin:0;font-weight:400}.hint{font-size:12px;color:#7f8c8d;margin-top:4px}.error-message{color:#e74c3c;font-size:12px;margin-top:4px}.form-actions{display:flex;gap:8px;align-items:center;justify-content:space-between;gap:12px;padding-top:5px}.btn{padding:8px 20px;border:none;border-radius:7px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s}.btn-primary{background-color:#006aff;color:#fff}.btn-primary:hover:not(:disabled){background-color:#2980b9}.btn-primary:disabled{background-color:#bdc3c7;cursor:not-allowed}.btn-secondary{background-color:#95a5a6;color:#fff}.btn-secondary:hover{background-color:#7f8c8d}.btn-outline{background-color:#303030;color:#fff}.btn-outline:hover{background-color:#2b2b2b;color:#fff}.month-year-wrapper{position:relative;display:flex;align-items:center;width:100%}.month-year-wrapper .form-control{padding-right:45px}.month-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0;border:none;padding:0;margin:0}.month-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.month-picker-btn:hover:not(:disabled){color:#3498db}.month-picker-btn:disabled{cursor:not-allowed;opacity:.5}.month-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}.search-select-wrapper{position:relative;width:100%}.search-select-input{padding-right:10px}.search-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:auto;min-width:100%;max-width:calc(100vw - 16px);background:#fff;border:1px solid #d3d3d3;border-radius:8px;max-height:220px;overflow-y:auto;box-shadow:0 4px 10px #00000014;z-index:5;padding:6px 0;transform:translate(0);transition:transform .1s ease-out}.search-select-option{padding:8px 12px;cursor:pointer;display:flex;gap:8px;align-items:center;border-bottom:1px solid #f2f2f2}.search-select-option:last-child{border-bottom:none}.search-select-option:hover{background:#f5f9ff}.option-code{color:#0052cc;font-weight:700;min-width:90px}.option-name{color:#151d48;font-weight:500}.time-picker-wrapper{position:relative;display:flex;align-items:center;width:100%}.time-input{padding-right:45px;flex:1}.time-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.time-picker-btn:hover:not(:disabled){color:#3498db}.time-picker-btn:disabled{cursor:not-allowed;opacity:.5}.time-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}input[type=time]{cursor:pointer}input[type=time]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:0;position:absolute;right:0;width:100%;height:100%}.date-picker-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-form-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-text-field-wrapper{background-color:#fff}.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#3498db}.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:red!important}.date-picker-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.date-picker-field ::ng-deep .mat-mdc-form-field-input-control input{font-family:Poppins!important;font-size:14px;font-weight:400;color:#1f2b41}\n"] }]
|
|
1039
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ElementRef }], propDecorators: { config: [{
|
|
1040
|
+
type: Input
|
|
1041
|
+
}], validationError: [{
|
|
1042
|
+
type: Output
|
|
1043
|
+
}] } });
|
|
1044
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVwZGF0ZS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z2LWNvbnRyb2xzL3NyYy9saWIvYWRkLXVwZGF0ZS1mb3JtL2FkZC11cGRhdGUtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEVBLCtCQUErQjtBQUMvQixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELDhCQUE4QjtBQUM5QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUs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QUFNIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRmllbGRUeXBlID1cclxuICB8ICd0ZXh0J1xyXG4gIHwgJ2VtYWlsJ1xyXG4gIHwgJ251bWJlcidcclxuICB8ICdzZWxlY3QnXHJcbiAgfCAnbmFtZS1jb2RlJ1xyXG4gIHwgJ2NoZWNrYm94J1xyXG4gIHwgJ3RleHRhcmVhJ1xyXG4gIHwgJ2RhdGUnXHJcbiAgfCAncGFzc3dvcmQnXHJcbiAgfCAncmFkaW8nXHJcbiAgfCAnZmlsZSdcclxuICB8ICdtb250aC15ZWFyJ1xyXG4gIHwgJ3Bob25lJ1xyXG4gIHwgJ3VhbidcclxuICB8ICdwZidcclxuICB8ICdlc2knXHJcbiAgfCAnaWZzYydcclxuICB8ICdtaWNyJ1xyXG4gIHwgJ2liYW4nO1xyXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uVHlwZSA9XHJcbiAgfCAncmVxdWlyZWQnXHJcbiAgfCAnZW1haWwnXHJcbiAgfCAnbWluTGVuZ3RoJ1xyXG4gIHwgJ21heExlbmd0aCdcclxuICB8ICdwYXR0ZXJuJ1xyXG4gIHwgJ21pbidcclxuICB8ICdtYXgnXHJcbiAgfCAnY3VzdG9tJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRWYWxpZGF0aW9uIHtcclxuICB0eXBlOiBWYWxpZGF0aW9uVHlwZTtcclxuICB2YWx1ZT86IGFueTsgLy8gRm9yIG1pbkxlbmd0aCwgbWF4TGVuZ3RoLCBtaW4sIG1heCwgcGF0dGVyblxyXG4gIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIEN1c3RvbSBlcnJvciBtZXNzYWdlXHJcbiAgdmFsaWRhdG9yPzogKHZhbHVlOiBhbnksIGZvcm1Hcm91cD86IEZvcm1Hcm91cCkgPT4gYm9vbGVhbjsgLy8gRm9yIGN1c3RvbSB2YWxpZGF0aW9uXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbHVtbiB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdHlwZTogRmllbGRUeXBlO1xyXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICBvcHRpb25zPzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogYW55IH1bXTsgLy8gRm9yIHNlbGVjdCBmaWVsZHNcclxuICB2YWxpZGF0aW9ucz86IEZpZWxkVmFsaWRhdGlvbltdO1xyXG4gIHZhbHVlPzogYW55OyAvLyBEZWZhdWx0IHZhbHVlXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIGNsYXNzTmFtZT86IHN0cmluZztcclxuICBoaWRkZW4/OiBib29sZWFuO1xyXG4gIGhpbnQ/OiBzdHJpbmc7XHJcbiAgY29sU3Bhbj86IG51bWJlcjtcclxuICBvbkNoYW5nZT86ICh2YWx1ZTogYW55LCBmb3JtR3JvdXA6IEZvcm1Hcm91cCkgPT4gdm9pZDtcclxuICBhY2NlcHQ/OiBzdHJpbmc7IC8vIEZvciBmaWxlIGlucHV0IChlLmcuLCAnaW1hZ2UvKicpXHJcbiAgZmlsZVByZXZpZXc/OiBib29sZWFuOyAvLyBTaG93IGltYWdlIHByZXZpZXdgXHJcbiAgc2hvd1RpbWVQaWNrZXI/OiBib29sZWFuOyAvLyBTaG93IHRpbWUgcGlja2VyIGZvciB0ZXh0IGZpZWxkc1xyXG4gIGFsbG93QWxwaGFiZXRzT25seT86IGJvb2xlYW47XHJcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TZWN0aW9uIHtcclxuICB0aXRsZT86IHN0cmluZzsgLy8gU2VjdGlvbiBoZWFkaW5nIChlLmcuLCBcIlBFUlNPTkFMIElORk9STUFUSU9OXCIpXHJcbiAgZmllbGRzOiBGb3JtQ29sdW1uW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbmZpZyB7XHJcbiAgc2VjdGlvbnM6IEZvcm1TZWN0aW9uW107XHJcbiAgc3VibWl0TGFiZWw/OiBzdHJpbmc7XHJcbiAgcmVzZXRMYWJlbD86IHN0cmluZztcclxuICBvblN1Ym1pdDogKGRhdGE6IGFueSkgPT4gdm9pZDtcclxuICBvblJlc2V0PzogKCkgPT4gdm9pZDtcclxuICBvbkNhbmNlbDogKCkgPT4gdm9pZDtcclxuICBjYW5jZWxMYWJlbD86IHN0cmluZztcclxuICBmb3JtVGl0bGU/OiBzdHJpbmc7XHJcbiAgbWF4Q29sc1BlclJvdz86IG51bWJlcjtcclxufVxyXG5cclxuLy8gYWRkLXVwZGF0ZS1mb3JtLmNvbXBvbmVudC50c1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBFbGVtZW50UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG4vLyBJbXBvcnQgeW91ciBsaWJyYXJ5IG1vZHVsZXNcclxuaW1wb3J0IHsgRnZFbnRyeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZW50cnktZmllbGQvZnYtZW50cnktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOdW1iZXJGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW51bWJlci1maWVsZC9mdi1udW1iZXItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRyb3Bkb3duL2Z2LWRyb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2UmFkaW9Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXJhZGlvLWdyb3VwL2Z2LXJhZGlvLWdyb3VwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9mdi1jaGVja2JveC9mdi1jaGVja2JveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGdkRhdGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRhdGUtZmllbGQvZnYtZGF0ZS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGdk1vbnRoWWVhckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtbW9udGgteWVhci1maWVsZC9mdi1tb250aC15ZWFyLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2RmlsZVNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZmlsZS1zZWxlY3Rvci9mdi1maWxlLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2SW1hZ2VTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWltYWdlLXNlbGVjdG9yL2Z2LWltYWdlLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2UmljaFRleHRFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9mdi1yaWNoLXRleHQtZWRpdG9yL2Z2LXJpY2gtdGV4dC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOYW1lQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW5hbWUtY29kZS9mdi1uYW1lLWNvZGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQaG9uZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGhvbmUtZmllbGQvZnYtcGhvbmUtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZVYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXVhbi1maWVsZC9mdi11YW4tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGYtZmllbGQvZnYtcGYtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZFc2lGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWVzaS1maWVsZC9mdi1lc2ktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJZnNjRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pZnNjLWZpZWxkL2Z2LWlmc2MtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZNaWNyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1taWNyLWZpZWxkL2Z2LW1pY3ItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJYmFuRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pYmFuLWZpZWxkL2Z2LWliYW4tZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8vIEltcG9ydCBWYWxpZGF0aW9uIFR5cGVzXHJcbmltcG9ydCB7IFZhbGlkYXRpb25TY2hlbWEsIFZhbGlkYXRpb25SdWxlIH0gZnJvbSAnQGZvdmVzdHRhL3ZhbGlkYXRpb24tZW5naW5lJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLXVwZGF0ZS1mb3JtJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBGdkVudHJ5RmllbGRDb21wb25lbnQsXHJcbiAgICBGdk51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZEcm9wZG93bkNvbXBvbmVudCxcclxuICAgIEZ2UmFkaW9Hcm91cENvbXBvbmVudCxcclxuICAgIEZ2Q2hlY2tib3hDb21wb25lbnQsXHJcbiAgICBGdkRhdGVGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2TW9udGhZZWFyRmllbGRDb21wb25lbnQsXHJcbiAgICBGdkZpbGVTZWxlY3RvckNvbXBvbmVudCxcclxuICAgIEZ2SW1hZ2VTZWxlY3RvckNvbXBvbmVudCxcclxuICAgIEZ2UmljaFRleHRFZGl0b3JDb21wb25lbnQsXHJcbiAgICBGdlJpY2hUZXh0RWRpdG9yQ29tcG9uZW50LFxyXG4gICAgRnZOYW1lQ29kZUNvbXBvbmVudCxcclxuICAgIEZ2UGhvbmVGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2VWFuRmllbGRDb21wb25lbnQsXHJcbiAgICBGdlBmRmllbGRDb21wb25lbnQsXHJcbiAgICBGdkVzaUZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZJZnNjRmllbGRDb21wb25lbnQsXHJcbiAgICBGdk1pY3JGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2SWJhbkZpZWxkQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oZWFkZXJcIiAqbmdJZj1cImNvbmZpZy5mb3JtVGl0bGVcIj5cclxuICAgICAgICA8aDI+e3sgY29uZmlnLmZvcm1UaXRsZSB9fTwvaDI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cImhhbmRsZVN1Ym1pdCgpXCIgY2xhc3M9XCJkeW5hbWljLWZvcm1cIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGNvbmZpZy5zZWN0aW9uc1wiIGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCIgKm5nSWY9XCJzZWN0aW9uLnRpdGxlXCI+XHJcbiAgICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cclxuICAgICAgICAgIDwvaDM+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcy1yb3dcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHNlY3Rpb24uZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2ZpZWxkLScgKyBjb2x1bW4udHlwZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2x1bW4uaGlkZGVuID8geyBkaXNwbGF5OiAnbm9uZScgfSA6IHt9XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCInc3BhbiAnICsgKGNvbHVtbi5jb2xTcGFuIHx8IDEpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyd0ZXh0JywgJ2VtYWlsJywgJ3Bhc3N3b3JkJ10uaW5jbHVkZXMoY29sdW1uLnR5cGUpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5oaWRkZW5cclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWVudHJ5LWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2x1bW4udHlwZSA9PT0gJ2VtYWlsJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdlbWFpbCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dCdcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbGxvd0FscGhhYmV0c09ubHldPVwiY29sdW1uLmFsbG93QWxwaGFiZXRzT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCJjb2x1bW4ubWF4TGVuZ3RoIHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1lbnRyeS1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ251bWJlcicgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbnVtYmVyLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1udW1iZXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdzZWxlY3QnICYmICFjb2x1bW4uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IG9wdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zIHx8IFtdXCJcclxuICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZUZpZWxkQ2hhbmdlKGNvbHVtbi5uYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8L2Z2LWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnY2hlY2tib3gnICYmICFjb2x1bW4uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3JhZGlvJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcmFkaW8tZ3JvdXBcclxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4ub3B0aW9ucyB8fCBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1yYWRpby1ncm91cD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2RhdGUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1kYXRlLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1kYXRlLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbW9udGgteWVhcicgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbW9udGgteWVhci1maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlTW9udGhZZWFyQ2hhbmdlKGNvbHVtbi5uYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8L2Z2LW1vbnRoLXllYXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd0ZXh0YXJlYScgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcmljaC10ZXh0LWVkaXRvclxyXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4ucGxhY2Vob2xkZXIgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlRmllbGRDaGFuZ2UoY29sdW1uLm5hbWUsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDwvZnYtcmljaC10ZXh0LWVkaXRvcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sdW1uKTsgZWxzZSBzdGFuZGFyZEZpbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZnYtaW1hZ2Utc2VsZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGltYWdlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQsIGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZnYtaW1hZ2Utc2VsZWN0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdGFuZGFyZEZpbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZ2LWZpbGUtc2VsZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGZpbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRdPVwiY29sdW1uLmFjY2VwdCB8fCAnKi8qJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQsIGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZnYtZmlsZS1zZWxlY3Rvcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ25hbWUtY29kZScgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbmFtZS1jb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VhcmNoIGJ5IENvZGUgb3IgTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zID8gbWFwU2VhcmNoT3B0aW9ucyhjb2x1bW4ub3B0aW9ucykgOiBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDwvZnYtbmFtZS1jb2RlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAncGhvbmUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1waG9uZS1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvZnYtcGhvbmUtZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd1YW4nICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi11YW4tZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LXVhbi1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3BmJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcGYtZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LXBmLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnZXNpJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtZXNpLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9mdi1lc2ktZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdpZnNjJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtaWZzYy1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvZnYtaWZzYy1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ21pY3InICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1taWNyLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9mdi1taWNyLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnaWJhbicgJiYgIWNvbHVtbi5oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWliYW4tZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LWliYW4tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCAmJiBzdWJtaXR0ZWRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBjb25maWcuc3VibWl0TGFiZWwgfHwgJ1NhdmUnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpZy5vbkNhbmNlbCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgY29uZmlnLmNhbmNlbExhYmVsIHx8ICdDYW5jZWwnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9mb3JtPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IGBcclxuXHJcbiAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9UG9wcGluczp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDAmZGlzcGxheT1zd2FwJyk7XHJcbiAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vaWNvbj9mYW1pbHk9TWF0ZXJpYWwrSWNvbnMnKTtcclxuICAgICp7XHJcbiAgICAgIGZvbnQtZmFtaWx5OiBcIlBvcHBpbnNcIiAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgLmZvcm0tY29udGFpbmVyIHtcclxuICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcclxuICAgICAgcGFkZGluZzogMTBweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICBtYXJnaW46IDAgYXV0bztcclxuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB9XHJcblxyXG4gICAgLmVycm9yLWJvcmRlciB7XHJcbiAgICAgYm9yZGVyLWNvbG9yOiByZWQgIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuaGlkZGVue1xyXG4gICAgICBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1oZWFkZXIge1xyXG4gICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5mb3JtLWhlYWRlciBoMiB7XHJcbiAgICAgIG1hcmdpbjogMDtcclxuICAgICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgICBmb250LXdlaWdodDogNzAwO1xyXG4gICAgICBjb2xvcjogIzMwMzAzMDtcclxuICAgIH1cclxuXHJcbiAgICAuZHluYW1pYy1mb3JtIHtcclxuICAgICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgfVxyXG5cclxuICAgIC5mb3JtLXNlY3Rpb24ge1xyXG4gICAgICBtYXJnaW4tYm90dG9tOjEwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlY3Rpb24tdGl0bGUge1xyXG4gICAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XHJcbiAgICAgIGNvbG9yOiAjMzAzMDMwO1xyXG4gICAgICBtYXJnaW46IDAgMCAxNnB4IDA7XHJcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XHJcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcclxuICAgIH1cclxuXHJcbiAgICAuZmllbGRzLXJvdyB7XHJcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDUsMWZyKTtcclxuICAgICAgZ2FwOiAxNnB4O1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1maWVsZC13cmFwcGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgbWluLXdpZHRoOiAwO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIH1cclxuXHJcbiAgICAucGFzc3dvcmQtdG9nZ2xlLWJ0biB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHJpZ2h0OiAxMHB4O1xyXG4gIHRvcDogMzJweDtcclxuICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgcGFkZGluZzogNHB4O1xyXG4gIGNvbG9yOiAjNjY2O1xyXG59XHJcblxyXG4ucGFzc3dvcmQtdG9nZ2xlLWJ0bjpob3ZlciB7XHJcbiAgY29sb3I6ICMzMzM7XHJcbn1cclxuXHJcbi5wYXNzd29yZC10b2dnbGUtYnRuIC5tYXRlcmlhbC1pY29ucyB7XHJcbiAgZm9udC1zaXplOiAyMHB4O1xyXG4gIHdpZHRoOiBhdXRvO1xyXG4gIGhlaWdodDogYXV0bztcclxuICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgYW5kIChtYXgtd2lkdGg6IDE0MDBweCkge1xyXG4gICAgICAuZmllbGRzLXJvdyB7XHJcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNSwxZnIpO1xyXG4gICAgICB9XHJcbiAgICAgIC5mb3JtLWNvbnRyb2wge1xyXG4gICAgICAgIHdpZHRoOiAxODBweDtcclxuICAgICAgICBtYXgtd2lkdGg6IDE4MHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCkge1xyXG4gICAgICAuZmllbGRzLXJvdyB7XHJcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywxZnIpO1xyXG4gICAgICB9XHJcbiAgICAgIC5mb3JtLWNvbnRyb2wge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA5OTJweCkge1xyXG4gICAgICAuZmllbGRzLXJvdyB7XHJcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwxZnIpO1xyXG4gICAgICAgIGdhcDogMTJweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xyXG4gICAgICAuZmllbGRzLXJvdyB7XHJcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwxZnIpO1xyXG4gICAgICAgIGdhcDogMTBweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCkge1xyXG4gICAgICAuZmllbGRzLXJvdyB7XHJcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XHJcbiAgICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICB9XHJcbiAgICAgIC5mb3JtLWZpZWxkLXdyYXBwZXIge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGFiZWwge1xyXG4gICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcbiAgICAgIGNvbG9yOiAjMTUxRDQ4O1xyXG4gICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLnJlcXVpcmVkIHtcclxuICAgICAgY29sb3I6ICNlNzRjM2M7XHJcbiAgICAgIG1hcmdpbi1sZWZ0OiAycHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmZvcm0tY29udHJvbCB7XHJcbiAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjOENCQkE4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XHJcbiAgICAgIGNvbG9yOiAjMWYyYjQxO1xyXG4gICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycywgYm94LXNoYWRvdyAwLjJzO1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgfVxyXG5cclxuICAgIC5mb3JtLWNvbnRyb2w6Zm9jdXMge1xyXG4gICAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgICBib3JkZXItY29sb3I6ICMzNDk4ZGI7XHJcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDUyLCAxNTIsIDIxOSwgMC4xKTtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1jb250cm9sOmRpc2FibGVkIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjBmMTtcclxuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgIH1cclxuXHJcbiAgICB0ZXh0YXJlYS5mb3JtLWNvbnRyb2wge1xyXG4gICAgICByZXNpemU6IHZlcnRpY2FsO1xyXG4gICAgICBtaW4taGVpZ2h0OiAxMDBweDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3QuZm9ybS1jb250cm9sIHtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBhcHBlYXJhbmNlOiBub25lO1xyXG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyB2aWV3Qm94PScwIDAgMTIgMTInJTNFJTNDcGF0aCBmaWxsPSclMjMzMzMnIGQ9J002IDlMMSA0aDEweicvJTNFJTNDL3N2ZyUzRVwiKTtcclxuICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgOHB4IGNlbnRlcjtcclxuICAgICAgcGFkZGluZy1yaWdodDogNDBweDtcclxuICAgIH1cclxuXHJcbiAgICAuY2hlY2tib3gtd3JhcHBlciB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogOHB4O1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XHJcbiAgICAgIHdpZHRoOiAxOHB4O1xyXG4gICAgICBoZWlnaHQ6IDE4cHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIH1cclxuXHJcbiAgICAuY2hlY2tib3gtbGFiZWwge1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIG1hcmdpbjogMDtcclxuICAgIH1cclxuXHJcbiAgICAuZmlsZS11cGxvYWQtY29udGFpbmVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAyMHB4O1xyXG4gIHBhZGRpbmc6IDIwcHg7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgZmxleC13cmFwOiB3cmFwO1xyXG59XHJcblxyXG4ubWF0ZXJpYWwtaWNvbnMge1xyXG4gIGZvbnQtZmFtaWx5OiAnTWF0ZXJpYWwgSWNvbnMnICFpbXBvcnRhbnQ7XHJcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB3aWR0aDogNDBweDtcclxuICBwYWRkaW5nOiA4cHg7XHJcbiAgaGVpZ2h0OiA0MHB4O1xyXG59XHJcblxyXG4uZmlsZS1maWVsZC13cmFwcGVyIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXJnaW4tdG9wOiAxNnB4O1xyXG4gIG1heC13aWR0aDogMTAwJTtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG59XHJcblxyXG4ucGhvdG8tcHJldmlldy1jaXJjbGUge1xyXG4gIHdpZHRoOiAxMDBweDtcclxuICBoZWlnaHQ6IDEwMHB4O1xyXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICNkZGQ7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzO1xyXG59XHJcblxyXG4ucGhvdG8tcHJldmlldy1jaXJjbGU6aG92ZXIge1xyXG4gIGJvcmRlci1jb2xvcjogIzM0OThkYjtcclxufVxyXG5cclxuLnByZXZpZXctaW1hZ2UsIC5kZWZhdWx0LXBob3RvIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG59XHJcblxyXG4ucHJldmlldy1pbWFnZSBpbWcge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBvYmplY3QtZml0OiBjb3ZlcjtcclxufVxyXG5cclxuLmRlZmF1bHQtcGhvdG8ge1xyXG4gIGJhY2tncm91bmQ6ICNmMGYwZjA7XHJcbiAgY29sb3I6ICM5OTk7XHJcbiAgZm9udC1zaXplOiA0MHB4O1xyXG59XHJcblxyXG4uZmlsZS1pbmZvIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZ2FwOiA4cHg7XHJcbn1cclxuLmJ0bi1kZWxldGUge1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIGZvbnQtc2l6ZTogMTRweDtcclxuICBwYWRkaW5nOiAwcHg7XHJcbn1cclxuXHJcbi51cGxvYWQtYnRuLWdyb3VwIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgI2QzZDNkMztcclxuICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgYmFja2dyb3VuZDogI2ZmZjtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIHdpZHRoOiBmaXQtY29udGVudDtcclxufVxyXG5cclxuLmJ0bi11cGxvYWQge1xyXG4gIGJhY2tncm91bmQ6ICNmZmY7XHJcbiAgY29sb3I6ICMyMjI7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIHBhZGRpbmc6IDAgMThweDtcclxuICBmb250LXNpemU6IDE2cHg7XHJcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2UwZTBlMDtcclxuICBib3JkZXItcmFkaXVzOiA4cHggMCAwIDhweDtcclxuICBvdXRsaW5lOiBub25lO1xyXG4gIGJveC1zaGFkb3c6IG5vbmU7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIGhlaWdodDogNDBweDtcclxuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7XHJcbn1cclxuXHJcbi5idG4tdXBsb2FkLWljb24ge1xyXG4gIGJhY2tncm91bmQ6ICNmNWY1ZjU7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAgOHB4IDhweCAwO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICB3aWR0aDogNDhweDtcclxuICBoZWlnaHQ6IDQwcHg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycztcclxufVxyXG5cclxuLmJ0bi11cGxvYWQtaWNvbiBpLm1hdGVyaWFsLWljb25zIHtcclxuICBmb250LXNpemU6IDIycHg7XHJcbiAgY29sb3I6ICMyMjI7XHJcbn1cclxuXHJcbi5idG4tdXBsb2FkOmhvdmVyLCAuYnRuLXVwbG9hZC1pY29uOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kOiAjZjBmMGYwO1xyXG59XHJcblxyXG4uYnRuLWRlbGV0ZSB7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLmJ0bi1kZWxldGU6aG92ZXIge1xyXG4gIGJhY2tncm91bmQ6ICNmMGYwZjA7XHJcbn1cclxuXHJcbi5maWxlLW5hbWUge1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBjb2xvcjogIzY2NjtcclxuICBtYXJnaW46IDhweDtcclxuICBtYXJnaW4tdG9wOiAxMHB4O1xyXG59XHJcblxyXG4uZmlsZS1sYWJlbCB7XHJcbiAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogNnB4O1xyXG4gICAgY29sb3I6ICMxNTFkNDg7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbiAgICAucmFkaW8tbGFiZWwge1xyXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcclxuICBjb2xvcjogIzE1MUQ0ODtcclxuICBmb250LXNpemU6IDE0cHg7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi5yYWRpby1ncm91cCB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBnYXA6IDIwcHg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxufVxyXG5cclxuLnJhZGlvLWl0ZW0ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDZweDtcclxufVxyXG5cclxuaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcclxuICB3aWR0aDogMThweDtcclxuICBoZWlnaHQ6IDE4cHg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIGFjY2VudC1jb2xvcjogIzM0OThkYjtcclxufVxyXG5cclxuLnJhZGlvLW9wdGlvbi1sYWJlbCB7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIG1hcmdpbjogMDtcclxuICBmb250LXdlaWdodDogNDAwO1xyXG59XHJcblxyXG4gICAgLmhpbnQge1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGNvbG9yOiAjN2Y4YzhkO1xyXG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmVycm9yLW1lc3NhZ2Uge1xyXG4gICAgICBjb2xvcjogI2U3NGMzYztcclxuICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmZvcm0tYWN0aW9ucyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGdhcDogOHB4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgICAgIGdhcDogMTJweDtcclxuICAgICAgcGFkZGluZy10b3A6IDVweDtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuIHtcclxuICAgICAgcGFkZGluZzogOHB4IDIwcHg7XHJcbiAgICAgIGJvcmRlcjogbm9uZTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1wcmltYXJ5IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkFGRjtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tcHJpbWFyeTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyOTgwYjk7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1wcmltYXJ5OmRpc2FibGVkIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYzNjNztcclxuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXNlY29uZGFyeSB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTY7XHJcbiAgICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXNlY29uZGFyeTpob3ZlciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjhjOGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1vdXRsaW5lIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzMwMzAzMDtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tb3V0bGluZTpob3ZlciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyYjJiMmJmZjtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC15ZWFyLXdyYXBwZXIge1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC15ZWFyLXdyYXBwZXIgLmZvcm0tY29udHJvbCB7XHJcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDQ1cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXBpY2tlci1oaWRkZW4ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG4gICAgICB3aWR0aDogMDtcclxuICAgICAgaGVpZ2h0OiAwO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgIG1hcmdpbjogMDtcclxuICAgIH1cclxuXHJcbiAgICAubW9udGgtcGlja2VyLWJ0biB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgcmlnaHQ6IDVweDtcclxuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlcjogbm9uZTtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBjb2xvcjogIzY2NjtcclxuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycztcclxuICAgICAgei1pbmRleDogMTtcclxuICAgIH1cclxuXHJcbiAgICAubW9udGgtcGlja2VyLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XHJcbiAgICAgIGNvbG9yOiAjMzQ5OGRiO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC1waWNrZXItYnRuOmRpc2FibGVkIHtcclxuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgb3BhY2l0eTogMC41O1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC1waWNrZXItYnRuIC5tYXRlcmlhbC1pY29ucyB7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgICAgd2lkdGg6IGF1dG87XHJcbiAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgcGFkZGluZzogMDtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXNlbGVjdC13cmFwcGVyIHtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXNlbGVjdC1pbnB1dCB7XHJcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlYXJjaC1zZWxlY3QtZHJvcGRvd24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHRvcDogY2FsYygxMDAlICsgNHB4KTtcclxuICAgICAgbGVmdDogMDtcclxuICAgICAgcmlnaHQ6IGF1dG87XHJcbiAgICAgIG1pbi13aWR0aDogMTAwJTtcclxuICAgICAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMTZweCk7XHJcbiAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICAgIG1heC1oZWlnaHQ6IDIyMHB4O1xyXG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICBib3gtc2hhZG93OiAwIDRweCAxMHB4IHJnYmEoMCwwLDAsMC4wOCk7XHJcbiAgICAgIHotaW5kZXg6IDU7XHJcbiAgICAgIHBhZGRpbmc6IDZweCAwO1xyXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XHJcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjFzIGVhc2Utb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtc2VsZWN0LW9wdGlvbiB7XHJcbiAgICAgIHBhZGRpbmc6IDhweCAxMnB4O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGdhcDogOHB4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YyZjJmMjtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXNlbGVjdC1vcHRpb246bGFzdC1jaGlsZCB7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlYXJjaC1zZWxlY3Qtb3B0aW9uOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZDogI2Y1ZjlmZjtcclxuICAgIH1cclxuXHJcbiAgICAub3B0aW9uLWNvZGUge1xyXG4gICAgICBjb2xvcjogIzAwNTJjYztcclxuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcclxuICAgICAgbWluLXdpZHRoOiA5MHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tbmFtZSB7XHJcbiAgICAgIGNvbG9yOiAjMTUxZDQ4O1xyXG4gICAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgfVxyXG5cclxuICAgIC50aW1lLXBpY2tlci13cmFwcGVyIHtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAudGltZS1pbnB1dCB7XHJcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDQ1cHg7XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLnRpbWUtcGlja2VyLWJ0biB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgcmlnaHQ6IDVweDtcclxuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlcjogbm9uZTtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBjb2xvcjogIzY2NjtcclxuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycztcclxuICAgICAgei1pbmRleDogMTtcclxuICAgIH1cclxuXHJcbiAgICAudGltZS1waWNrZXItYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcclxuICAgICAgY29sb3I6ICMzNDk4ZGI7XHJcbiAgICB9XHJcblxyXG4gICAgLnRpbWUtcGlja2VyLWJ0bjpkaXNhYmxlZCB7XHJcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XHJcbiAgICAgIG9wYWNpdHk6IDAuNTtcclxuICAgIH1cclxuXHJcbiAgICAudGltZS1waWNrZXItYnRuIC5tYXRlcmlhbC1pY29ucyB7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgICAgd2lkdGg6IGF1dG87XHJcbiAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgcGFkZGluZzogMDtcclxuICAgIH1cclxuXHJcbiAgICBpbnB1dFt0eXBlPVwidGltZVwiXSB7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIH1cclxuXHJcbiAgICBpbnB1dFt0eXBlPVwidGltZVwiXTo6LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yIHtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBvcGFjaXR5OiAwO1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtZm9ybS1maWVsZCB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgIH1cclxuXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzhDQkJBODtcclxuICAgIH1cclxuXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzhDQkJBODtcclxuICAgIH1cclxuXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzM0OThkYjtcclxuICAgIH1cclxuXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQuZXJyb3ItYm9yZGVyIDo6bmctZGVlcCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkLmVycm9yLWJvcmRlciA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQuZXJyb3ItYm9yZGVyIDo6bmctZGVlcCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogcmVkICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbCBpbnB1dCB7XHJcbiAgICAgIGZvbnQtZmFtaWx5OiBcIlBvcHBpbnNcIiAhaW1wb3J0YW50O1xyXG4gICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICAgIGNvbG9yOiAjMWYyYjQxO1xyXG4gICAgfVxyXG4gIGAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRVcGRhdGVGb3JtQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQElucHV0KCkgY29uZmlnITogRm9ybUNvbmZpZztcclxuICBAT3V0cHV0KCkgdmFsaWRhdGlvbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgZm9ybSE6IEZvcm1Hcm91cDtcclxuICBzdWJtaXR0ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGZpbGVQcmV2aWV3czogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGZpbGVOYW1lczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIHZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIHBhc3N3b3JkVmlzaWJpbGl0eTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBzZWFyY2hRdWVyaWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBob3N0UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgLy8gTGlmZWN5Y2xlIGhvb2sgLSBjYW4gYmUgdXNlZCBmb3IgZGF0ZXBpY2tlciBpbml0aWFsaXphdGlvbiBpZiBuZWVkZWRcclxuICB9XHJcblxyXG4gIGdldENvbHVtbldpZHRoKGNvbHVtbjogRm9ybUNvbHVtbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtYXhDb2xzID0gdGhpcy5jb25maWcubWF4Q29sc1BlclJvdyB8fCA1O1xyXG4gICAgY29uc3QgY29sU3BhbiA9IE1hdGgubWluKGNvbHVtbi5jb2xTcGFuIHx8IDEsIG1heENvbHMpO1xyXG4gICAgcmV0dXJuIGBjYWxjKCR7KGNvbFNwYW4gLyBtYXhDb2xzKSAqIDEwMH0lIC0gMTZweClgO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udHJvbChuYW1lOiBzdHJpbmcpOiBGb3JtQ29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldChuYW1lKSBhcyBGb3JtQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vIDIuIEhFTFBFUjogQ29udmVydCB5b3VyIEZpZWxkVmFsaWRhdGlvbltdIHRvIHRoZSBsaWJyYXJ5J3MgVmFsaWRhdGlvblNjaGVtYVxyXG4gIGdldFNjaGVtYShjb2x1bW46IEZvcm1Db2x1bW4pOiBWYWxpZGF0aW9uU2NoZW1hIHtcclxuICAgIGNvbnN0IHJ1bGVzOiBWYWxpZGF0aW9uUnVsZVtdID0gW107XHJcbiAgICBjb25zdCBlcnJvclByaW9yaXR5OiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGlmIChjb2x1bW4udmFsaWRhdGlvbnMpIHtcclxuICAgICAgY29sdW1uLnZhbGlkYXRpb25zLmZvckVhY2goKHYpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKHYudHlwZSkge1xyXG4gICAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAncmVxdWlyZWQnLFxyXG4gICAgICAgICAgICAgIHBhcmFtczogeyBlbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3JLZXk6ICdFUlJfUkVRVUlSRUQnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdyZXF1aXJlZCcpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcclxuICAgICAgICAgICAgcnVsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZ2V4JyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgIHBhdHRlcm46ICdeW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSQnLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3JLZXk6ICdFUlJfUkVHRVhfTUlTTUFUQ0gnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdyZWdleCcpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ21pbkxlbmd0aCc6XHJcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdtaW5MZW5ndGgnLFxyXG4gICAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZTogdi52YWx1ZSB9LFxyXG4gICAgICAgICAgICAgIGVycm9yS2V5OiAnRVJSX01JTl9MRU5HVEgnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdtaW5MZW5ndGgnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdtYXhMZW5ndGgnOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbWF4TGVuZ3RoJyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWU6IHYudmFsdWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9NQVhfTEVOR1RIJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVycm9yUHJpb3JpdHkucHVzaCgnbWF4TGVuZ3RoJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAncGF0dGVybic6XHJcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdyZWdleCcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IHBhdHRlcm46IHYudmFsdWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9SRUdFWF9NSVNNQVRDSCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlcnJvclByaW9yaXR5LnB1c2goJ3JlZ2V4Jyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnbWluJzpcclxuICAgICAgICAgICAgcnVsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ21pbicsXHJcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlOiB2LnZhbHVlIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3JLZXk6ICdFUlJfTUlOX1ZBTFVFJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVycm9yUHJpb3JpdHkucHVzaCgnbWluJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnbWF4JzpcclxuICAgICAgICAgICAgcnVsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ21heCcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlOiB2LnZhbHVlIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3JLZXk6ICdFUlJfTUFYX1ZBTFVFJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVycm9yUHJpb3JpdHkucHVzaCgnbWF4Jyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWFwICduYW1lLWNvZGUnIHRvICdEcm9wZG93bicgb3Igc2ltaWxhciBmb3IgdmFsaWRhdGlvbiBzY2hlbWEgcHVycG9zZXMgaWYgbmVlZGVkXHJcbiAgICBsZXQgY29udHJvbFR5cGUgPSBjb2x1bW4udHlwZTtcclxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ25hbWUtY29kZScpIHtcclxuICAgICAgY29udHJvbFR5cGUgPSAnc2VsZWN0JzsgLy8gVHJlYXQgYXMgc2VsZWN0IGZvciBzY2hlbWEgbG9va3VwIGlmIGxpYnJhcnkgZXhwZWN0cyAnc2VsZWN0JyBvciAnRHJvcGRvd24nXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY29udHJvbFR5cGU6IGNvbnRyb2xUeXBlLFxyXG4gICAgICBlcnJvclByaW9yaXR5OiBlcnJvclByaW9yaXR5LFxyXG4gICAgICBydWxlczogcnVsZXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaXNJbWFnZUZpZWxkKGNvbHVtbjogRm9ybUNvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgY29sdW1uLnR5cGUgPT09ICdmaWxlJyAmJlxyXG4gICAgICAoY29sdW1uLmFjY2VwdD8uc3RhcnRzV2l0aCgnaW1hZ2UnKSB8fCBjb2x1bW4uZmlsZVByZXZpZXcgPT09IHRydWUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUZvcm0oKSB7XHJcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgZm9ybUdyb3VwQ29uZmlnOiBhbnkgPSB7fTtcclxuXHJcbiAgICB0aGlzLmNvbmZpZy5zZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XHJcbiAgICAgIHNlY3Rpb24uZmllbGRzLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGxldCBpbml0aWFsVmFsdWUgPSBjb2x1bW4udmFsdWUgfHwgJyc7XHJcblxyXG4gICAgICAgIC8vIEZvcm1hdCBtb250aC15ZWFyIGZpZWxkcyB0byBZWVlZLU1NIGZvcm1hdFxyXG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ21vbnRoLXllYXInICYmIGluaXRpYWxWYWx1ZSkge1xyXG4gICAgICAgICAgaW5pdGlhbFZhbHVlID0gdGhpcy5mb3JtYXRNb250aFllYXJWYWx1ZShpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9ybUdyb3VwQ29uZmlnW2NvbHVtbi5uYW1lXSA9IFtcclxuICAgICAgICAgIHsgdmFsdWU6IGluaXRpYWxWYWx1ZSwgZGlzYWJsZWQ6IGNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZSB9LFxyXG4gICAgICAgICAgbnVsbCwgLy8gV2UnbGwgc2V0IHZhbGlkYXRvcnMgYWZ0ZXIgZm9ybSBjcmVhdGlvblxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIC8vIElmIGl0J3MgYSBmaWxlIGZpZWxkIHdpdGggYW4gZXhpc3RpbmcgdmFsdWUsIHNldCB0aGUgcHJldmlld1xyXG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnICYmIGNvbHVtbi52YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5maWxlUHJldmlld3Muc2V0KGNvbHVtbi5uYW1lLCBjb2x1bW4udmFsdWUpO1xyXG4gICAgICAgICAgLy8gRXh0cmFjdCBmaWxlbmFtZSBmcm9tIFVSTCBvciBiYXNlNjRcclxuICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5leHRyYWN0RmlsZU5hbWUoY29sdW1uLnZhbHVlKTtcclxuICAgICAgICAgIGlmIChmaWxlTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVOYW1lcy5zZXQoY29sdW1uLm5hbWUsIGZpbGVOYW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWxpemUgc2VhcmNoIGRpc3BsYXkgZm9yIG5hbWUtY29kZSBmaWVsZHMgLSBObyBsb25nZXIgbmVlZGVkIGFzIEZ2TmFtZUNvZGUgaGFuZGxlcyBkaXNwbGF5IGludGVybmFsbHlcclxuICAgICAgICAvKiBpZiAoY29sdW1uLnR5cGUgPT09ICduYW1lLWNvZGUnICYmIGluaXRpYWxWYWx1ZSAmJiBjb2x1bW4ub3B0aW9ucykge1xyXG4gICAgICAgICAgICAgLy8gTG9naWMgbW92ZWQgdG8gY29tcG9uZW50XHJcbiAgICAgICAgfSAqL1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwQ29uZmlnKTtcclxuXHJcbiAgICB0aGlzLmNvbmZpZy5zZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XHJcbiAgICAgIHNlY3Rpb24uZmllbGRzLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLmJ1aWxkVmFsaWRhdG9ycyhjb2x1bW4udmFsaWRhdGlvbnMsIHRoaXMuZm9ybSk7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmdldChjb2x1bW4ubmFtZSk/LnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uZ2V0KGNvbHVtbi5uYW1lKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmUgdG8gdmFsdWUgY2hhbmdlcyBmb3IgYWxsIGZpZWxkcyB0byB0cmlnZ2VyIG9uQ2hhbmdlIGhhbmRsZXJzXHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xyXG4gICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbj8ub25DaGFuZ2UpIHtcclxuICAgICAgICAgICAgICBjb2x1bW4ub25DaGFuZ2UodmFsdWUsIHRoaXMuZm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIENsZWFuIHVwIGFsbCBzdWJzY3JpcHRpb25zIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb25zID0gW107XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWVsZENoYW5nZShmaWVsZE5hbWU6IHN0cmluZywgZXZlbnRWYWx1ZT86IGFueSkge1xyXG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUoZmllbGROYW1lKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xyXG5cclxuICAgIC8vIEZvcm1hdCBtb250aC15ZWFyIGZpZWxkcyAoZXNwZWNpYWxseSBleHBpcnlEYXRlKSB0byBZWVlZLU1NXHJcbiAgICBpZiAoY29sdW1uPy50eXBlID09PSAnbW9udGgteWVhcicgJiYgZXZlbnRWYWx1ZSkge1xyXG4gICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0TW9udGhZZWFyVmFsdWUoZXZlbnRWYWx1ZSk7XHJcbiAgICAgIGlmIChmb3JtQ29udHJvbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gZXZlbnRWYWx1ZSkge1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgZXZlbnRWYWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbHVtbj8ub25DaGFuZ2UpIHtcclxuICAgICAgLy8gVXNlIHRoZSBldmVudCB2YWx1ZSBkaXJlY3RseSAod2hhdCB0aGUgdXNlciBqdXN0IHNlbGVjdGVkL3R5cGVkKVxyXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgd2UgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBldmVuIGlmIGZvcm0gY29udHJvbCBoYXNuJ3QgdXBkYXRlZCB5ZXRcclxuICAgICAgY29uc3QgdmFsdWVUb1Bhc3MgPVxyXG4gICAgICAgIGV2ZW50VmFsdWUgIT09IHVuZGVmaW5lZCA/IGV2ZW50VmFsdWUgOiB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBvbkNoYW5nZUZuID0gY29sdW1uLm9uQ2hhbmdlOyAvLyBTdG9yZSB0aGUgZnVuY3Rpb24gcmVmZXJlbmNlXHJcblxyXG4gICAgICAvLyBTdG9yZSB0aGUgc2VsZWN0ZWQgdmFsdWUgLSB0aGlzIGlzIHdoYXQgdGhlIHVzZXIgY2hvc2VcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlVG9QYXNzO1xyXG5cclxuICAgICAgLy8gRW5zdXJlIHRoZSBmb3JtIGNvbnRyb2wgaGFzIHRoZSBzZWxlY3RlZCB2YWx1ZSBiZWZvcmUgY2FsbGluZyBvbkNoYW5nZVxyXG4gICAgICBpZiAoZm9ybUNvbnRyb2wgJiYgc2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKGZvcm1Db250cm9sLnZhbHVlICE9PSBzZWxlY3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDYWxsIG9uQ2hhbmdlIHdpdGggdGhlIHNlbGVjdGVkIHZhbHVlXHJcbiAgICAgIGlmIChvbkNoYW5nZUZuKSB7XHJcbiAgICAgICAgb25DaGFuZ2VGbihzZWxlY3RlZFZhbHVlLCB0aGlzLmZvcm0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSZXN0b3JlIHRoZSB2YWx1ZSBmb3IgdGhlIGZpZWxkIHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGFuZ2UgaWYgaXQgd2FzIGNsZWFyZWQgYnkgb25DaGFuZ2VcclxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbDogaWYgb25DaGFuZ2UgY2xlYXJzIHRoZSBmaWVsZCB0aGF0IHdhcyBqdXN0IGNoYW5nZWQsIHdlIHJlc3RvcmUgaXRcclxuICAgICAgLy8gT25seSByZXN0b3JlIGlmIHdlIGhhZCBhIG5vbi1lbXB0eSB2YWx1ZSAoZW1wdHkgc3RyaW5nLCBudWxsLCB1bmRlZmluZWQgYXJlIG5vdCByZXN0b3JlZClcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGZvcm1Db250cm9sICYmXHJcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJlxyXG4gICAgICAgIHNlbGVjdGVkVmFsdWUgIT09ICcnXHJcbiAgICAgICkge1xyXG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHdpdGggMCBkZWxheSB0byBydW4gYWZ0ZXIgYW55IHN5bmNocm9ub3VzIG9wZXJhdGlvbnMgaW4gb25DaGFuZ2VcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSB3YXMgY2xlYXJlZCBvciBjaGFuZ2VkXHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBmb3JtQ29udHJvbC52YWx1ZTtcclxuICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdGNoIHdoYXQgd2FzIHNlbGVjdGVkLCByZXN0b3JlIGl0XHJcbiAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25DaGFuZ2UgY2xlYXJlZCB0aGUgZmllbGQgdW5pbnRlbnRpb25hbGx5XHJcbiAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBzZWxlY3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHNlbGVjdGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0TW9udGhZZWFyVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdmFsdWU7XHJcbiAgICAvLyBOb3JtYWxpemUgdG8gWVlZWS1NTVxyXG4gICAgaWYgKHZhbHVlLm1hdGNoKC9eXFxkezJ9LVxcZHs0fSQvKSkge1xyXG4gICAgICBjb25zdCBbbW9udGgsIHllYXJdID0gdmFsdWUuc3BsaXQoJy0nKTtcclxuICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9YDtcclxuICAgIH1cclxuICAgIC8vIElmIGFscmVhZHkgaW4gWVlZWS1NTSBmb3JtYXQsIHJldHVybiBhcyBpc1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcGFyc2VNb250aFllYXJWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuICAgIC8vIERpc3BsYXkgYW5kIHBpY2tlciBib3RoIHVzZSBZWVlZLU1NOyBub3JtYWxpemUgTU0tWVlZWSBpZiBwcmVzZW50XHJcbiAgICBpZiAodmFsdWUubWF0Y2goL15cXGR7Mn0tXFxkezR9JC8pKSB7XHJcbiAgICAgIGNvbnN0IFttb250aCwgeWVhcl0gPSB2YWx1ZS5zcGxpdCgnLScpO1xyXG4gICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlTW9udGhZZWFyQ2hhbmdlKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAvLyBGb3JtYXQgdGhlIGlucHV0IHZhbHVlIHRvIFlZWVktTU0gZm9ybWF0XHJcbiAgICBsZXQgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAvLyBJZiBpdCdzIGluIE1NLVlZWVkgZm9ybWF0LCBjb252ZXJ0IHRvIFlZWVktTU1cclxuICAgIGlmIChmb3JtYXR0ZWRWYWx1ZS5tYXRjaCgvXlxcZHsyfS1cXGR7NH0kLykpIHtcclxuICAgICAgY29uc3QgW21vbnRoLCB5ZWFyXSA9IGZvcm1hdHRlZFZhbHVlLnNwbGl0KCctJyk7XHJcbiAgICAgIGZvcm1hdHRlZFZhbHVlID0gYCR7eWVhcn0tJHttb250aH1gO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgaXQncyBpbiBZWVlZTU0gZm9ybWF0IChubyBkYXNoKSwgY29udmVydCB0byBZWVlZLU1NXHJcbiAgICBlbHNlIGlmIChmb3JtYXR0ZWRWYWx1ZS5tYXRjaCgvXlxcZHs2fSQvKSkge1xyXG4gICAgICBjb25zdCB5ZWFyID0gZm9ybWF0dGVkVmFsdWUuc3Vic3RyaW5nKDAsIDQpO1xyXG4gICAgICBjb25zdCBtb250aCA9IGZvcm1hdHRlZFZhbHVlLnN1YnN0cmluZyg0LCA2KTtcclxuICAgICAgZm9ybWF0dGVkVmFsdWUgPSBgJHt5ZWFyfS0ke21vbnRofWA7XHJcbiAgICB9XHJcbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgaW4gWVlZWS1NTSBmb3JtYXQsIGxlYXZlIGFzIGlzXHJcbiAgICBlbHNlIGlmIChmb3JtYXR0ZWRWYWx1ZS5tYXRjaCgvXlxcZHs0fS1cXGR7Mn0kLykpIHtcclxuICAgICAgLy8gQWxyZWFkeSBpbiBjb3JyZWN0IGZvcm1hdFxyXG4gICAgfVxyXG4gICAgLy8gSWYgdXNlciBpcyB0eXBpbmcsIGFsbG93IHBhcnRpYWwgaW5wdXRcclxuICAgIGVsc2UgaWYgKGZvcm1hdHRlZFZhbHVlLm1hdGNoKC9eXFxkezEsNn0kLykpIHtcclxuICAgICAgLy8gQWxsb3cgcGFydGlhbCBpbnB1dCB3aGlsZSB0eXBpbmdcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcclxuICAgIGlmIChmb3JtQ29udHJvbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcclxuICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhhbmRsZUZpZWxkQ2hhbmdlKGZpZWxkTmFtZSwgZm9ybWF0dGVkVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlTW9udGhZZWFyQmx1cihmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICBpZiAoIWZvcm1Db250cm9sKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBmb3JtQ29udHJvbC52YWx1ZSB8fCAnJztcclxuICAgIC8vIEVuc3VyZSB0aGUgdmFsdWUgaXMgaW4gWVlZWS1NTSBmb3JtYXQgb24gYmx1clxyXG4gICAgaWYgKHZhbHVlICYmICF2YWx1ZS5tYXRjaCgvXlxcZHs0fS1cXGR7Mn0kLykpIHtcclxuICAgICAgLy8gVHJ5IHRvIHBhcnNlIGFuZCBmb3JtYXRcclxuICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRNb250aFllYXJWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgIGlmIChmb3JtYXR0ZWQgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUoZm9ybWF0dGVkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZU1vbnRoWWVhclBpY2tlckNoYW5nZShmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG4gICAgLy8gTW9udGggcGlja2VyIG91dHB1dHMgWVlZWS1NTTsganVzdCBub3JtYWxpemVcclxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRNb250aFllYXJWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcclxuICAgIGlmIChmb3JtQ29udHJvbCkge1xyXG4gICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB0aGlzLmhhbmRsZUZpZWxkQ2hhbmdlKGZpZWxkTmFtZSwgZm9ybWF0dGVkVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TW9udGhZZWFyUGlja2VyVmFsdWUoZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICBpZiAoIWZvcm1Db250cm9sKSByZXR1cm4gJyc7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGZvcm1Db250cm9sLnZhbHVlIHx8ICcnO1xyXG4gICAgLy8gRGlzcGxheSBhbmQgcGlja2VyIGJvdGggZXhwZWN0IFlZWVktTU1cclxuICAgIHJldHVybiB0aGlzLnBhcnNlTW9udGhZZWFyVmFsdWUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb3Blbk1vbnRoUGlja2VyKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtb250aElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcbiAgICAgIGZpZWxkTmFtZSArICdfcGlja2VyJ1xyXG4gICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKG1vbnRoSW5wdXQgJiYgbW9udGhJbnB1dC50eXBlID09PSAnbW9udGgnKSB7XHJcbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGlja2VyIHZhbHVlIGJlZm9yZSBvcGVuaW5nXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZ2V0TW9udGhZZWFyUGlja2VyVmFsdWUoZmllbGROYW1lKTtcclxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgIG1vbnRoSW5wdXQudmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gVHJ5IG1vZGVybiBzaG93UGlja2VyIEFQSSBmaXJzdCwgZmFsbGJhY2sgdG8gY2xpY2tcclxuICAgICAgaWYgKG1vbnRoSW5wdXQuc2hvd1BpY2tlcikge1xyXG4gICAgICAgIG1vbnRoSW5wdXQuc2hvd1BpY2tlcigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vbnRoSW5wdXQuZm9jdXMoKTtcclxuICAgICAgICBtb250aElucHV0LmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbHVtbkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBGb3JtQ29sdW1uIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zZWN0aW9uc1xyXG4gICAgICAuZmxhdE1hcCgocykgPT4gcy5maWVsZHMpXHJcbiAgICAgIC5maW5kKChjKSA9PiBjLm5hbWUgPT09IG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZUZpZWxkcyhmaWVsZHM6IEZvcm1Db2x1bW5bXSk6IEZvcm1Db2x1bW5bXSB7XHJcbiAgICByZXR1cm4gZmllbGRzLmZpbHRlcigoZikgPT4gZi50eXBlID09PSAnZmlsZScpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Tm9uRmlsZUZpZWxkcyhmaWVsZHM6IEZvcm1Db2x1bW5bXSk6IEZvcm1Db2x1bW5bXSB7XHJcbiAgICByZXR1cm4gZmllbGRzLmZpbHRlcigoZikgPT4gZi50eXBlICE9PSAnZmlsZScpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5wYXNzd29yZFZpc2liaWxpdHkuZ2V0KGZpZWxkTmFtZSkgfHwgZmFsc2U7XHJcbiAgICB0aGlzLnBhc3N3b3JkVmlzaWJpbGl0eS5zZXQoZmllbGROYW1lLCAhY3VycmVudCk7XHJcbiAgfVxyXG4gIGhhc1JlcXVpcmVkVmFsaWRhdGlvbihjb2x1bW46IEZvcm1Db2x1bW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBjb2x1bW4udmFsaWRhdGlvbnM/LnNvbWUoKHYpID0+IHYudHlwZSA9PT0gJ3JlcXVpcmVkJykgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc1Bhc3N3b3JkVmlzaWJsZShmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFzc3dvcmRWaXNpYmlsaXR5LmdldChmaWVsZE5hbWUpIHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRWYWxpZGF0b3JzKFxyXG4gICAgdmFsaWRhdGlvbnM/OiBGaWVsZFZhbGlkYXRpb25bXSxcclxuICAgIGZvcm1Hcm91cD86IEZvcm1Hcm91cFxyXG4gICk6IGFueVtdIHtcclxuICAgIGlmICghdmFsaWRhdGlvbnMpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnlbXSA9IFtdO1xyXG4gICAgdmFsaWRhdGlvbnMuZm9yRWFjaCgodmFsaWRhdGlvbikgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHZhbGlkYXRpb24udHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2VtYWlsJzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ21pbkxlbmd0aCc6XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodmFsaWRhdGlvbi52YWx1ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbWF4TGVuZ3RoJzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh2YWxpZGF0aW9uLnZhbHVlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdtaW4nOlxyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKHZhbGlkYXRpb24udmFsdWUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ21heCc6XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXgodmFsaWRhdGlvbi52YWx1ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncGF0dGVybic6XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKHZhbGlkYXRpb24udmFsdWUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2N1c3RvbSc6XHJcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi52YWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdGlvbi52YWxpZGF0b3IhKGNvbnRyb2wudmFsdWUsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQgPyBudWxsIDogeyBjdXN0b206IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmFsaWRhdG9ycztcclxuICB9XHJcblxyXG4gIHRyaWdnZXJGaWxlVXBsb2FkKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZUlucHV0XycgKyBmaWVsZE5hbWUpPy5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgb3BlblRpbWVQaWNrZXIoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHRpbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpZWxkTmFtZSkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmICh0aW1lSW5wdXQgJiYgdGltZUlucHV0LnR5cGUgPT09ICd0aW1lJykge1xyXG4gICAgICAvLyBUcnkgbW9kZXJuIHNob3dQaWNrZXIgQVBJIGZpcnN0LCBmYWxsYmFjayB0byBjbGlja1xyXG4gICAgICBpZiAodGltZUlucHV0LnNob3dQaWNrZXIpIHtcclxuICAgICAgICB0aW1lSW5wdXQuc2hvd1BpY2tlcigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgIHRpbWVJbnB1dC5jbGljaygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IGFueSwgZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgICBpZiAoZmlsZSkge1xyXG4gICAgICB0aGlzLmZpbGVOYW1lcy5zZXQoZmllbGROYW1lLCBmaWxlLm5hbWUpO1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBiYXNlNjRTdHJpbmcgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLmZpbGVQcmV2aWV3cy5zZXQoZmllbGROYW1lLCBiYXNlNjRTdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKT8uc2V0VmFsdWUoYmFzZTY0U3RyaW5nKTtcclxuXHJcbiAgICAgICAgLy8gVHJpZ2dlciBvbkNoYW5nZSBoYW5kbGVyIGZvciBmaWxlIGZpZWxkc1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkTmFtZSk7XHJcbiAgICAgICAgaWYgKGNvbHVtbj8ub25DaGFuZ2UpIHtcclxuICAgICAgICAgIGNvbHVtbi5vbkNoYW5nZShiYXNlNjRTdHJpbmcsIHRoaXMuZm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXh0cmFjdEZpbGVOYW1lKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xyXG5cclxuICAgIC8vIElmIGl0J3MgYSBVUkwsIGV4dHJhY3QgZmlsZW5hbWUgZnJvbSBVUkxcclxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcclxuICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCgnLycpO1xyXG4gICAgICByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgaXQncyBiYXNlNjQsIHJldHVybiBhIGdlbmVyaWMgbmFtZVxyXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoYGRhdGE6aW1hZ2VgKSkge1xyXG4gICAgICByZXR1cm4gJ3VwbG9hZGVkLWltYWdlLmpwZyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICdleGlzdGluZy1waG90by5qcGcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZVByZXZpZXcoZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmZpbGVQcmV2aWV3cy5nZXQoZmllbGROYW1lKSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZU5hbWUoZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmZpbGVOYW1lcy5nZXQoZmllbGROYW1lKSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgbWFwU2VhcmNoT3B0aW9ucyhvcHRpb25zOiBhbnlbXSk6IGFueVtdIHtcclxuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHQgPT4gKHtcclxuICAgICAgY29kZTogb3B0LmNvZGUgfHwgb3B0LnZhbHVlLFxyXG4gICAgICBuYW1lOiBvcHQubmFtZSB8fCBvcHQubGFiZWwgfHwgb3B0LnZhbHVlLFxyXG4gICAgICB2YWx1ZTogb3B0LnZhbHVlXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZGVsZXRlRmlsZShmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWxlUHJldmlld3MuZGVsZXRlKGZpZWxkTmFtZSk7XHJcbiAgICB0aGlzLmZpbGVOYW1lcy5kZWxldGUoZmllbGROYW1lKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKT8uc2V0VmFsdWUoJycpO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgb25DaGFuZ2UgaGFuZGxlciB3aGVuIGZpbGUgaXMgZGVsZXRlZFxyXG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUoZmllbGROYW1lKTtcclxuICAgIGlmIChjb2x1bW4/Lm9uQ2hhbmdlKSB7XHJcbiAgICAgIGNvbHVtbi5vbkNoYW5nZSgnJywgdGhpcy5mb3JtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVN1Ym1pdCgpIHtcclxuICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xyXG4gICAgICAvLyBNYXJrIGFsbCBmaWVsZHMgYXMgdG91Y2hlZCB0byBzaG93IHJlZCBib3JkZXJzXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldChrZXkpPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gQ291bnQgb25seSByZXF1aXJlZCBmaWVsZHMgdGhhdCBhcmUgaW52YWxpZFxyXG4gICAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5jb25maWcuc2VjdGlvbnMuZmxhdE1hcCgocykgPT4gcy5maWVsZHMpO1xyXG4gICAgICBjb25zdCBpbnZhbGlkUmVxdWlyZWRDb3VudCA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZmlsdGVyKFxyXG4gICAgICAgIChrZXkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XHJcbiAgICAgICAgICBpZiAoIWNvbnRyb2w/LmludmFsaWQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGZpZWxkIGhhcyByZXF1aXJlZCB2YWxpZGF0aW9uXHJcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0ga2V5KTtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGNvbHVtbj8udmFsaWRhdGlvbnM/LnNvbWUoKHYpID0+IHYudHlwZSA9PT0gJ3JlcXVpcmVkJykgfHwgZmFsc2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICApLmxlbmd0aDtcclxuXHJcbiAgICAgIC8vIE9ubHkgZW1pdCBpZiB0aGVyZSBhcmUgcmVxdWlyZWQgZmllbGRzIG1pc3NpbmdcclxuICAgICAgaWYgKGludmFsaWRSZXF1aXJlZENvdW50ID4gMCkge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLmVtaXQoXHJcbiAgICAgICAgICBgUGxlYXNlIGZpbGwgYWxsIHJlcXVpcmVkIGZpZWxkcyBtYXJrZWQgd2l0aCAqLiAke2ludmFsaWRSZXF1aXJlZENvdW50fSBmaWVsZChzKSBuZWVkIGF0dGVudGlvbi5gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgIHRoaXMuY29uZmlnLm9uU3VibWl0KGZvcm1EYXRhKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVJlc2V0KCkge1xyXG4gICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLm9uUmVzZXQpIHtcclxuICAgICAgdGhpcy5jb25maWcub25SZXNldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNGaWVsZEludmFsaWQoZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xyXG4gICAgcmV0dXJuICEhKGZpZWxkICYmIGZpZWxkLmludmFsaWQgJiYgdGhpcy5zdWJtaXR0ZWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JNZXNzYWdlKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xyXG4gICAgaWYgKCFmaWVsZD8uZXJyb3JzKSByZXR1cm4gJyc7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGN1c3RvbSBtZXNzYWdlIGZyb20gdmFsaWRhdGlvbnNcclxuICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLmNvbmZpZy5zZWN0aW9ucy5mbGF0TWFwKChzKSA9PiBzLmZpZWxkcyk7XHJcbiAgICBjb25zdCBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gZmllbGROYW1lKTtcclxuICAgIC8vIENoZWNrIGZvciBjdXN0b20gdmFsaWRhdGlvbiBlcnJvclxyXG4gICAgaWYgKGZpZWxkLmVycm9yc1snY3VzdG9tJ10pIHtcclxuICAgICAgY29uc3QgY3VzdG9tVmFsaWRhdGlvbiA9IGNvbHVtbj8udmFsaWRhdGlvbnM/LmZpbmQoXHJcbiAgICAgICAgKHYpID0+IHYudHlwZSA9PT0gJ2N1c3RvbSdcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGN1c3RvbVZhbGlkYXRpb24/Lm1lc3NhZ2UgfHwgJ0ludmFsaWQgZmllbGQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBjdXN0b20gbWVzc2FnZSBmcm9tIHZhbGlkYXRpb25zXHJcbiAgICBjb25zdCBlcnJvcktleXMgPSBPYmplY3Qua2V5cyhmaWVsZC5lcnJvcnMpO1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgZXJyb3JLZXlzKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBjb2x1bW4/LnZhbGlkYXRpb25zPy5maW5kKCh2KSA9PiB2LnR5cGUgPT09IGtleSk7XHJcbiAgICAgIGlmICh2YWxpZGF0aW9uPy5tZXNzYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb24ubWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gRGVmYXVsdCBlcnJvciBtZXNzYWdlc1xyXG4gICAgaWYgKGZpZWxkLmVycm9yc1sncmVxdWlyZWQnXSkge1xyXG4gICAgICByZXR1cm4gYCR7Y29sdW1uPy5sYWJlbH0gaXMgcmVxdWlyZWRgO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpZWxkLmVycm9yc1snZW1haWwnXSkgcmV0dXJuICdJbnZhbGlkIGVtYWlsIGZvcm1hdCc7XHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydtaW5sZW5ndGgnXSlcclxuICAgICAgcmV0dXJuIGBNaW5pbXVtIGxlbmd0aCBpcyAke2ZpZWxkLmVycm9yc1snbWlubGVuZ3RoJ10ucmVxdWlyZWRMZW5ndGh9YDtcclxuICAgIGlmIChmaWVsZC5lcnJvcnNbJ21heGxlbmd0aCddKVxyXG4gICAgICByZXR1cm4gYE1heGltdW0gbGVuZ3RoIGlzICR7ZmllbGQuZXJyb3JzWydtYXhsZW5ndGgnXS5yZXF1aXJlZExlbmd0aH1gO1xyXG4gICAgaWYgKGZpZWxkLmVycm9yc1snbWluJ10pXHJcbiAgICAgIHJldHVybiBgTWluaW11bSB2YWx1ZSBpcyAke2ZpZWxkLmVycm9yc1snbWluJ10ubWlufWA7XHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydtYXgnXSlcclxuICAgICAgcmV0dXJuIGBNYXhpbXVtIHZhbHVlIGlzICR7ZmllbGQuZXJyb3JzWydtYXgnXS5tYXh9YDtcclxuICAgIGlmIChmaWVsZC5lcnJvcnNbJ3BhdHRlcm4nXSkgcmV0dXJuICdJbnZhbGlkIGZvcm1hdCc7XHJcbiAgICByZXR1cm4gJ0ludmFsaWQgZmllbGQnO1xyXG4gIH1cclxufVxyXG4iXX0=
|