sf-crud 12.3.3 → 13.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/fesm2022/sf-crud.mjs +3254 -0
  2. package/fesm2022/sf-crud.mjs.map +1 -0
  3. package/{sf-crud.d.ts → index.d.ts} +5 -5
  4. package/lib/components/control/control.component.d.ts +67 -67
  5. package/lib/components/file-upload/file-upload.component.d.ts +34 -34
  6. package/lib/components/form/form.component.d.ts +63 -63
  7. package/lib/components/registro/registro.component.d.ts +109 -109
  8. package/lib/components/step/step.component.d.ts +27 -27
  9. package/lib/components/tablero/tablero.component.d.ts +53 -52
  10. package/lib/directives/format-address.pipe.d.ts +7 -7
  11. package/lib/sf-crud.component.d.ts +8 -8
  12. package/lib/sf-crud.module.d.ts +94 -90
  13. package/lib/sf-crud.routing.module.d.ts +7 -7
  14. package/lib/sf-crud.service.d.ts +135 -135
  15. package/lib/shared/models/Conditions.model.d.ts +32 -32
  16. package/lib/shared/models/Empresa.model.d.ts +11 -11
  17. package/lib/shared/models/Reason.model.d.ts +5 -5
  18. package/lib/shared/models/crud-config.model.d.ts +109 -110
  19. package/lib/shared/models/shema.model.d.ts +37 -37
  20. package/lib/shared/services/general.service.d.ts +20 -20
  21. package/lib/shared/services/notification.service.d.ts +26 -27
  22. package/lib/shared/services/step.service.d.ts +27 -27
  23. package/package.json +20 -15
  24. package/public-api.d.ts +12 -12
  25. package/bundles/sf-crud.umd.js +0 -3795
  26. package/bundles/sf-crud.umd.js.map +0 -1
  27. package/esm2015/lib/components/control/control.component.js +0 -403
  28. package/esm2015/lib/components/file-upload/file-upload.component.js +0 -143
  29. package/esm2015/lib/components/form/form.component.js +0 -289
  30. package/esm2015/lib/components/registro/registro.component.js +0 -757
  31. package/esm2015/lib/components/step/step.component.js +0 -79
  32. package/esm2015/lib/components/tablero/tablero.component.js +0 -220
  33. package/esm2015/lib/directives/format-address.pipe.js +0 -22
  34. package/esm2015/lib/sf-crud.component.js +0 -26
  35. package/esm2015/lib/sf-crud.module.js +0 -359
  36. package/esm2015/lib/sf-crud.routing.module.js +0 -23
  37. package/esm2015/lib/sf-crud.service.js +0 -531
  38. package/esm2015/lib/shared/models/Conditions.model.js +0 -81
  39. package/esm2015/lib/shared/models/Empresa.model.js +0 -2
  40. package/esm2015/lib/shared/models/Reason.model.js +0 -7
  41. package/esm2015/lib/shared/models/crud-config.model.js +0 -76
  42. package/esm2015/lib/shared/models/shema.model.js +0 -11
  43. package/esm2015/lib/shared/services/general.service.js +0 -74
  44. package/esm2015/lib/shared/services/notification.service.js +0 -83
  45. package/esm2015/lib/shared/services/step.service.js +0 -63
  46. package/esm2015/public-api.js +0 -16
  47. package/esm2015/sf-crud.js +0 -5
  48. package/fesm2015/sf-crud.js +0 -3143
  49. package/fesm2015/sf-crud.js.map +0 -1
@@ -1,403 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewChildren } from '@angular/core';
2
- import { Shema } from '../../shared/models/shema.model';
3
- import { RequestChecking } from '../../shared/models/crud-config.model';
4
- import { Tooltip } from 'primeng/tooltip';
5
- import * as moment from 'moment';
6
- import * as jsonpath from 'jsonpath';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../shared/services/general.service";
9
- import * as i2 from "../../sf-crud.service";
10
- import * as i3 from "../../shared/services/notification.service";
11
- import * as i4 from "primeng/inputmask";
12
- import * as i5 from "primeng/dropdown";
13
- import * as i6 from "primeng/autocomplete";
14
- import * as i7 from "../file-upload/file-upload.component";
15
- import * as i8 from "primeng/calendar";
16
- import * as i9 from "primeng/inputnumber";
17
- import * as i10 from "primeng/multiselect";
18
- import * as i11 from "primeng/inputswitch";
19
- import * as i12 from "@angular/common";
20
- import * as i13 from "primeng/tooltip";
21
- import * as i14 from "@angular/forms";
22
- import * as i15 from "primeng/inputtext";
23
- import * as i16 from "primeng/inputtextarea";
24
- import * as i17 from "primeng/button";
25
- import * as i18 from "../../directives/format-address.pipe";
26
- export class ControlComponent {
27
- constructor(generalService, crudService, cdr, notificationService) {
28
- this.generalService = generalService;
29
- this.crudService = crudService;
30
- this.cdr = cdr;
31
- this.notificationService = notificationService;
32
- this.showTempValue = false;
33
- this.control = new Shema();
34
- this.label = '';
35
- this.setValue = new EventEmitter();
36
- this.sendObject = new EventEmitter();
37
- this.addressClicked = new EventEmitter();
38
- this.isLoading = false;
39
- this.dataFromService = [];
40
- this.uploadedFiles = [];
41
- this.displayAdd = false;
42
- this.clicked = false;
43
- this.maskDate = "99/99/9999";
44
- this.uploadingFiles = false;
45
- }
46
- ngOnChanges(changes) {
47
- }
48
- ngOnInit() {
49
- var _a, _b;
50
- this.loadDefaultValues();
51
- if ((_b = (_a = this.control) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.depends) {
52
- this.crudService.changeData$.subscribe(res => {
53
- var _a, _b;
54
- if (res) {
55
- let registro = this.crudService.getRegistro(this.crudService.index);
56
- let keyFound = (_a = registro.keys) === null || _a === void 0 ? void 0 : _a.find(k => k.scope === res.scope
57
- && this.control.config.depends.includes(k.key) &&
58
- (res.index === k.indexData || res.index === k.indexAnswer));
59
- if (keyFound === null || keyFound === void 0 ? void 0 : keyFound.overrideControl) {
60
- let override = keyFound.overrideControl;
61
- let completed = this.crudService.isConditionsCompleted((_b = override.conditions) !== null && _b !== void 0 ? _b : [], registro.conditions || [], this.crudService.getData(this.crudService.index));
62
- jsonpath.value(this.control, override.property, completed ? override.value : override.elseValue);
63
- this.value = this.getNewValue(override, completed);
64
- this.tempValue = null;
65
- this.sendValue();
66
- if (this.control.subtype == 'dropdown' || this.control.subtype == 'multiselect')
67
- this.loadDataFromService();
68
- //this.cdr.detectChanges()
69
- }
70
- else if (keyFound) {
71
- this.value = null;
72
- this.sendValue();
73
- this.loadDefaultValues();
74
- //this.cdr.detectChanges()
75
- }
76
- }
77
- });
78
- }
79
- }
80
- getNewValue(override, completed) {
81
- const newValue = completed ? override.newPropertyValue : override.elseNewPropertyValue;
82
- if (newValue && typeof (newValue) == "string") {
83
- if (!newValue.startsWith('$') && !newValue.startsWith('@')) {
84
- return newValue;
85
- }
86
- }
87
- return null;
88
- }
89
- loadDefaultValues() {
90
- var _a, _b, _c, _d, _e;
91
- if (((_a = this.control) === null || _a === void 0 ? void 0 : _a.config) && this.control.subtype == 'dropdown' || this.control.subtype == 'multiselect')
92
- this.loadDataFromService();
93
- if (((_b = this.control) === null || _b === void 0 ? void 0 : _b.subtype) == 'autocomplete')
94
- this.extracValueFromControlBusqueda();
95
- if (this.value && this.control.type == 'date')
96
- this.instanceDate();
97
- if (((_c = this.control) === null || _c === void 0 ? void 0 : _c.subtype) == "file") {
98
- this.loadFiles();
99
- }
100
- if (((_d = this.control) === null || _d === void 0 ? void 0 : _d.type) == 'string')
101
- this.lenghtWord = this.value ? this.value.length : 0;
102
- if (((_e = this.control) === null || _e === void 0 ? void 0 : _e.subtype) == 'switch')
103
- this.instanceBoolField();
104
- }
105
- instanceBoolField() {
106
- this.tempValue = this.value;
107
- if (this.value == true && this.control.trueValue !== undefined) {
108
- this.value = this.control.trueValue;
109
- this.sendValue();
110
- }
111
- else if (this.value == false && this.control.falseValue !== undefined) {
112
- this.value = this.control.falseValue;
113
- this.sendValue();
114
- }
115
- }
116
- onChangeSwitch() {
117
- this.value = this.tempValue;
118
- this.sendValue();
119
- }
120
- loadFiles() {
121
- this.isLoading = true;
122
- this.uploadedFiles = [];
123
- if (!this.value) {
124
- this.isLoading = false;
125
- this.cdr.detectChanges();
126
- }
127
- else if (this.control.config.namePattern && this.control.type == "string") {
128
- let urls = this.control.config.separator ? this.value.split(",") : [this.value];
129
- urls.forEach(url => this.uploadedFiles.push({ url: url, name: this.getNameFile(this.control.config.namePattern, url) }));
130
- this.isLoading = false;
131
- this.cdr.detectChanges();
132
- }
133
- else if (this.control.config.namePattern && this.control.type == "array") {
134
- this.value.forEach((url) => this.uploadedFiles.push({ url: url, name: this.getNameFile(this.control.config.namePattern, url) }));
135
- this.isLoading = false;
136
- this.cdr.detectChanges();
137
- }
138
- }
139
- onDeleteFile(index) {
140
- var _a, _b;
141
- if ((!((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.limit) || ((_b = this.control.config) === null || _b === void 0 ? void 0 : _b.limit) == 1) && this.control.type == "string")
142
- this.value = null;
143
- else if (this.control.type == "array")
144
- this.value.splice(index, 1);
145
- }
146
- getNameFile(namePattern, url) {
147
- const regexObj = new RegExp(namePattern);
148
- const match = regexObj.exec(url);
149
- if (!match)
150
- throw new Error("El pattern no coincide con la url. " + url);
151
- return match[0];
152
- }
153
- sendValue() {
154
- var _a;
155
- if (this.control.type == "string" && this.value == "" && ((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.allowEmpty) == false)
156
- this.value = null;
157
- this.setValue.emit(this.value);
158
- }
159
- sendNumberValue($event) {
160
- this.value = $event.value;
161
- this.sendValue();
162
- }
163
- onInputEmail(force) {
164
- const aux = Math.abs(this.lenghtWord - this.value.length);
165
- this.lenghtWord = this.value.length;
166
- if (aux > 1 || force) {
167
- const regex = new RegExp(/([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/igm);
168
- if (regex.test(this.value))
169
- this.sendValue();
170
- else {
171
- this.value = null;
172
- this.sendValue();
173
- this.notificationService.addNotification({ severity: 'warn', detail: 'El correo no es válido' }, this.primeChecking());
174
- }
175
- }
176
- }
177
- sendValueFromObject(event) {
178
- switch (typeof (this.control.config.optionValue)) {
179
- case 'object':
180
- this.control.config.optionValue.forEach((op) => op['value'] = event[op.key]);
181
- this.setValue.emit(this.control.config.optionValue);
182
- break;
183
- default:
184
- this.setValue.emit(event[this.control.config.optionValue]);
185
- break;
186
- }
187
- }
188
- loadDataFromService() {
189
- var _a;
190
- this.isLoading = true;
191
- this.dataFromService = [];
192
- const op = this.control.config;
193
- const url = this.crudService.getURL(op, undefined, undefined);
194
- if ((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.customOptions) {
195
- this.dataFromService = this.control.config.customOptions;
196
- }
197
- else {
198
- this.generalService.genericRequest(this.control.config.method, url)
199
- .then((res) => {
200
- this.dataFromService = res.data;
201
- }).finally(() => {
202
- this.isLoading = false;
203
- this.cdr.detectChanges();
204
- });
205
- }
206
- }
207
- loadDataFromControlBusquedaService(event) {
208
- this.isLoading = true;
209
- const op = this.control.config;
210
- let url = this.crudService.getURL(op);
211
- url = url.replace('@query', (event === null || event === void 0 ? void 0 : event.query) || '');
212
- this.generalService.genericRequest(this.control.config.method, url)
213
- .then((res) => {
214
- var _a;
215
- this.dataFromService = res.data;
216
- if (((_a = this.dataFromService) === null || _a === void 0 ? void 0 : _a.length) == 0 && this.control.allowCustomOption) {
217
- //agregar un campo que el usuario haya digitado
218
- let newItem = {};
219
- newItem[this.control.field] = this.tempValue;
220
- newItem[this.control.config.optionValue] = this.tempValue;
221
- this.dataFromService.push(newItem);
222
- }
223
- }).finally(() => {
224
- this.isLoading = false;
225
- this.cdr.detectChanges();
226
- });
227
- }
228
- extracValueFromControlBusqueda() {
229
- const op = this.control.config;
230
- let url = this.crudService.getURL(op);
231
- url = url.replace('@query', this.value);
232
- this.generalService.genericRequest(this.control.config.method, url)
233
- .then((res) => {
234
- var _a;
235
- if (((_a = res.data) === null || _a === void 0 ? void 0 : _a.length) == 1 && res.data[0][this.control.field]) {
236
- this.tempValue = res.data[0];
237
- this.value = res.data[0][this.control.field];
238
- }
239
- else
240
- this.setDefaultValue();
241
- }).finally(() => {
242
- this.cdr.detectChanges();
243
- }).catch(() => {
244
- this.setDefaultValue();
245
- });
246
- }
247
- onUpload(event) {
248
- this.uploadingFiles = true;
249
- const formData = new FormData();
250
- const path = this.control.config.path || 'Imagenes/CRUD/temp';
251
- formData.append('Ruta', `/${path}`);
252
- for (let i = 0; i < event.length; i++)
253
- formData.append(`uploadFile_${i}`, event[i]);
254
- const op = this.control.config;
255
- const url = this.crudService.getURL(op);
256
- this.generalService.genericRequest(this.control.config.method, url, formData)
257
- .then(() => {
258
- var _a;
259
- let separator = ((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.separator) || ",";
260
- //se asume que viene namePattern
261
- if (this.control.type == "string")
262
- this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`).join(separator);
263
- else if (this.control.type == "array")
264
- this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`);
265
- // SI NO TRAE namePattern, debe retornar un objeto con el nombre y href
266
- //else if (this.control.config.namePattern && this.control.type == "array") this.value = event.map(x => x.name)
267
- //else if (!this.control.config.namePattern && this.control.type == "array") this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`)
268
- this.sendValue();
269
- let msg = !this.control.config.limit || this.control.config.limit == 1 ? "Archivo cargado correctamente!" : "Archivos cargados correctamente!";
270
- this.notificationService.addNotification({ severity: 'info', detail: msg }, this.primeChecking());
271
- })
272
- .catch(() => this.notificationService.addNotification({ severity: 'error', detail: `Error al cargar el archivo!` }, this.primeChecking()))
273
- .finally(() => this.uploadingFiles = false);
274
- }
275
- refresData() {
276
- var _a, _b;
277
- if ((_b = (_a = this.control) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.endpointtemp)
278
- this.loadDataFromService();
279
- }
280
- setDefaultValue() {
281
- this.tempValue = {};
282
- if (!this.control.config.optionLabel)
283
- console.error("No esta bien configurado el control ", this.control);
284
- else
285
- this.tempValue[this.control.config.optionLabel] = this.value ? this.value : "";
286
- }
287
- searchValue(value) {
288
- const op = this.control.config;
289
- let url = this.crudService.getURL(op, undefined, undefined);
290
- url = url.replace('@id', value);
291
- this.generalService.genericRequest(this.control.config.method, url)
292
- .then((res) => {
293
- var _a;
294
- if (((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.length) > 0) {
295
- this.sendObject.emit({ data: res.data[0], optionValue: this.control.config.optionValue });
296
- }
297
- else {
298
- this.notificationService.addNotification({ severity: 'warn', detail: `Valor no encontrado.` }, this.primeChecking());
299
- this.sendObject.emit({ data: null, optionValue: this.control.config.optionValue });
300
- }
301
- })
302
- .catch(err => {
303
- this.notificationService.addNotification({ severity: 'error', detail: `Error al consumir el servicio.` }, this.primeChecking());
304
- });
305
- }
306
- primeChecking() {
307
- return new RequestChecking(undefined, undefined, false, undefined, undefined, false, undefined);
308
- }
309
- instanceDate() {
310
- const format = this.control.formatMoment;
311
- if (this.value) {
312
- if (typeof (this.value) == "string" && this.value.includes("T"))
313
- this.value = new Date(this.value);
314
- else if (typeof (this.value) == "string")
315
- this.value = moment(this.value, format).toDate();
316
- this.tempValue = moment(this.value).format("DD/MM/YYYY");
317
- }
318
- else {
319
- this.tempValue = null;
320
- this.value = null;
321
- }
322
- }
323
- /**
324
- * Cast tempValue to date
325
- */
326
- onChangeSDate($event) {
327
- console.log($event);
328
- console.log(this.tempValue);
329
- console.log(this.value);
330
- const aux = moment(this.tempValue, "DD/MM/YYYY");
331
- if (this.tempValue == this.maskDate.replaceAll("9", "_")) {
332
- this.value = null;
333
- this.sendValue();
334
- }
335
- else if (aux.isValid()) {
336
- this.value = aux.toDate();
337
- this.sendValue();
338
- }
339
- else {
340
- this.tempValue = null;
341
- this.notificationService.addNotification({ severity: 'warn', detail: 'La fecha no es válida' }, this.primeChecking());
342
- }
343
- this.cdr.detectChanges();
344
- }
345
- onChangeDate() {
346
- this.tempValue = moment(this.value).format("DD/MM/YYYY");
347
- this.sendValue();
348
- }
349
- onTouchDescription() {
350
- var _a;
351
- try {
352
- (_a = this.tooltips.get(0)) === null || _a === void 0 ? void 0 : _a.activate();
353
- }
354
- catch (ex) { }
355
- }
356
- onUnTouchDescription() {
357
- var _a;
358
- try {
359
- (_a = this.tooltips.get(0)) === null || _a === void 0 ? void 0 : _a.deactivate();
360
- }
361
- catch (ex) { }
362
- }
363
- doFocusOut() {
364
- if (document.activeElement) {
365
- document.activeElement.blur();
366
- }
367
- this.cdr.detectChanges();
368
- }
369
- onClickedAddres() {
370
- this.addressClicked.emit();
371
- }
372
- }
373
- ControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, deps: [{ token: i1.GeneralService }, { token: i2.SfCrudService }, { token: i0.ChangeDetectorRef }, { token: i3.NotificationService }], target: i0.ɵɵFactoryTarget.Component });
374
- ControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ControlComponent, selector: "sf-control", inputs: { showTempValue: "showTempValue", control: "control", label: "label", value: "value", appendTo: "appendTo" }, outputs: { setValue: "setValue", sendObject: "sendObject", addressClicked: "addressClicked" }, viewQueries: [{ propertyName: "tooltips", predicate: Tooltip, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"showTempValue\"><p *ngIf=\"tempValue\">{{tempValue[control.field]}}</p></ng-container>\r\n\r\n<div *ngIf=\"!showTempValue\" [ngSwitch]=\"control.type\" #cc class=\"control-container\">\r\n <div class=\"label-container\">\r\n <label [for]=\"label\">{{label}}</label>\r\n <i #tooltip *ngIf=\"control.tooltip\" class=\"pi pi-question-circle\"\r\n [tooltipPosition]=\"control.tooltipPosition || 'top'\" [pTooltip]=\"control.tooltip\"\r\n (touchstart)=\"onTouchDescription()\" (touchend)=\"onUnTouchDescription()\"></i>\r\n </div>\r\n\r\n <ng-container *ngSwitchCase=\"'string'\" >\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'input'\">\r\n <input pInputText [name]=\"label\" type=\"text\" [(ngModel)]=\"value\" (input)=\"sendValue()\"\r\n [disabled]=\"control.disabled || false\" [autocomplete]=\"control.autocomplete || 'off'\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [rows]=\"control.config?.rows ? control.config.rows : 4\" [(ngModel)]=\"value\"\r\n (input)=\"sendValue()\" pInputTextarea [disabled]=\"control.config?.disabled || false\"\r\n [autoResize]=\"control.config?.autoresize || false\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'password'\">\r\n <input pInputText type=\"password\" [(ngModel)]=\"value\" (input)=\"sendValue()\"\r\n [disabled]=\"control.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" placeholder=\"email@example.com\"\r\n [disabled]=\"control.disabled || false\" autocomplete=\"email\" (input)=\"onInputEmail(false)\"\r\n (focusout)=\"onInputEmail(true)\" (keyup.enter)=\"doFocusOut()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone'\">\r\n <p-inputMask mask=\"(999) 999-9999\" [(ngModel)]=\"value\" placeholder=\"(999) 999-9999\"\r\n [disabled]=\"control.disabled || false\" autocomplete=\"tel-national\"\r\n [unmask]=\"control.unmask || false\" (onComplete)=\"sendValue()\"></p-inputMask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <input pInputText type=\"text\" [value]=\"value | formatAddress: control.separador\" autocomplete=\"off\" [disabled]=\"clicked\" (keydown)=\"onClickedAddres()\" (focus)=\"onClickedAddres()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'enum'\">\r\n <p-dropdown [options]=\"control.enum\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config.optionLabel\" [showClear]=\"control.config.showClear\"\r\n [optionValue]=\"control.field || control.config.optionValue\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown:replace'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\"\r\n (onChange)=\"sendValueFromObject($event)\" [optionLabel]=\"control.config.optionLabel\"\r\n appendTo=\"body\" placeholder=\"Seleccione una opci\u00F3n\"\r\n [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <p-autoComplete [showEmptyMessage]=\"true\" [suggestions]=\"dataFromService\" appendTo=\"body\"\r\n (completeMethod)=\"loadDataFromControlBusquedaService($event)\" [field]=\"control.field\"\r\n [minLength]=\"1\" (onSelect)=\"sendValueFromObject($event)\" [(ngModel)]=\"tempValue\"\r\n [disabled]=\"control.disabled || false\"></p-autoComplete>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'input:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"text\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n (keyup.enter)=\"doFocusOut()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <sf-file-upload *ngIf=\"!isLoading\" [accept]=\"control.config?.accept || 'image/*,application/pdf'\"\r\n [loading]=\"uploadingFiles\" [files]=\"uploadedFiles\" [configName]=\"control.config?.configName\"\r\n [limit]=\"control.config?.limit || 1\" (onUpload)=\"onUpload($event)\"\r\n (onDeleteFile)=\"onDeleteFile($event)\"></sf-file-upload>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-inputgroup\">\r\n <p-inputMask [(ngModel)]=\"tempValue\" [mask]=\"maskDate\" [placeholder]=\"control.placeholder\"\r\n (onBlur)=\"onChangeSDate($event)\" [disabled]=\"control.disabled || false\"></p-inputMask>\r\n <p-calendar [(ngModel)]=\"value\" class=\"only-icon\" [monthNavigator]=\"true\" [yearNavigator]=\"true\" yearRange=\"1900:2035\"\r\n [dateFormat]=\"control.format || 'yy-mm-dd'\" appendTo=\"body\" [disabled]=\"control.disabled || false\"\r\n [showOnFocus]=\"!control.hide\" [placeholder]=\"control.placeholder || 'aaaa-mm-dd'\"\r\n [touchUI]=\"control.touchUI || false\" [showIcon]=\"control.showIcon || false\" (onSelect)=\"onChangeDate()\"\r\n (onBlur)=\"onChangeDate()\"></p-calendar>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numeric'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <p-inputNumber [ngModel]=\"value\" (ngModelChange)=\"value = $event; sendValue()\" mode=\"decimal\" [minFractionDigits]=\"control.minFractionDigits || 0\"\r\n [min]=\"control.min || null\" [max]=\"control.max || null\" (onInput)=\"sendNumberValue($event)\"\r\n [prefix]=\"control.currency || '$ '\" [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <p-inputNumber [ngModel]=\"value\" mode=\"decimal\" (ngModelChange)=\"value = $event; sendValue()\" [min]=\"control.min || null\"\r\n [max]=\"control.max || null\" [minFractionDigits]=\"control.minFractionDigits || 0\"\r\n [locale]=\"control.locale || undefined\" [useGrouping]=\"control.useGrouping || false\"\r\n [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percentage'\">\r\n <p-inputNumber [ngModel]=\"value\" suffix=\" %\" (ngModelChange)=\"value = $event; sendValue()\" (onInput)=\"sendValue()\" [min]=\"control.min || null\"\r\n [max]=\"control.max || null\" [minFractionDigits]=\"control.minFractionDigits || 2\"\r\n [locale]=\"control.locale || undefined\" [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"number\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n (keyup.enter)=\"doFocusOut()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'array'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <sf-file-upload *ngIf=\"!isLoading\" [loading]=\"uploadingFiles\" [files]=\"uploadedFiles\"\r\n [configName]=\"control.config?.configName\" [limit]=\"control.config?.limit || 1\"\r\n [accept]=\"control.config?.accept || 'image/*,application/pdf'\" (onUpload)=\"onUpload($event)\"\r\n (onDeleteFile)=\"onDeleteFile($event)\"></sf-file-upload>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'multiselect'\">\r\n <p-multiSelect [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config?.optionLabel\" [optionValue]=\"control.config?.optionValue\"\r\n [placeholder]=\"control.config?.placeholder\"\r\n [display]=\"control.config?.display || 'chip'\"></p-multiSelect>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"tempValue\" (onChange)=\"onChangeSwitch()\" [id]=\"label\"\r\n [trueValue]=\"control?.trueValue !== undefined ? control?.trueValue: null\"\r\n [falseValue]=\"control?.falseValue !== undefined ? control?.falseValue: null\"></p-inputSwitch>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n", styles: ["::ng-deep .label-container{& label{margin-right:10px;color:#55585b;font-size:17px}& i{font-size:1.1rem}}::ng-deep .p-tooltip{max-width:15rem;font-size:.85rem;text-align:center}.control-container ::ng-deep .p-button:hover{background:var(--secondary-color)!important;border-color:var(--secondary-color)!important;filter:brightness(85%)}.control-container ::ng-deep .p-component,.control-container ::ng-deep .p-component *{border-radius:6px}.control-container ::ng-deep .p-inputtext{font-size:17px;border:1px solid #d1d5db;border-radius:6px}.control-container ::ng-deep .p-inputtext:focus,.control-container ::ng-deep .p-inputtext:active,.control-container ::ng-deep .p-inputwrapper:focus,.control-container ::ng-deep .p-inputwrapper:active{border-color:var(--button-color)}.control-container ::ng-deep .p-inputtext:enabled:focus{border-color:var(--secondary-color)!important;box-shadow:inset 0 0 0 1px #fff}.control-container ::ng-deep input.p-inputtext::placeholder{color:#6b7280;font-family:sans-serif;font-size:18px}.control-container ::ng-deep .p-dropdown{background:#ffffff;border:1px solid #d1d5db;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:6px}.control-container ::ng-deep .p-dropdown:not(.p-disabled):hover{border-color:var(--secondary-color)!important}.control-container ::ng-deep .p-dropdown:not(.p-disabled).p-focus{border-color:var(--secondary-color)!important;box-shadow:inset 0 0 0 1px #fff}.control-container ::ng-deep .p-dropdown .p-inputtext{border:none}.control-container ::ng-deep .p-dropdown .p-dropdown-label.p-placeholder{font-family:sans-serif;color:#6b7280}.control-container ::ng-deep .p-button.p-button-danger,.control-container ::ng-deep .p-buttonset.p-button-danger>.p-button,.control-container ::ng-deep .p-splitbutton.p-button-danger>.p-button{border-color:var(--secondary-color)!important;background:var(--secondary-color)!important}.control-container ::ng-deep .p-inputgroup button:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px}.control-container ::ng-deep .p-inputgroup input:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.control-container ::ng-deep .p-inputgroup input:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.control-container ::ng-deep .p-datepicker-touch-ui .p-datepicker-title{padding:3px}.control-container ::ng-deep .p-datepicker-month,.control-container ::ng-deep .p-datepicker-month:focus,.control-container ::ng-deep .p-datepicker-year:focus,.control-container ::ng-deep .p-datepicker-year{border:none}.p-inputgroup{& p-calendar{display:contents;& input{display:none}& .p-button-icon-only{border-top-left-radius:0;border-bottom-left-radius:0}}& p-inputMask{display:contents;& ::ng-deep input{border-top-right-radius:0;border-bottom-right-radius:0}}}@media (max-width <=768px){:host{font-size:14px}}\n"], components: [{ type: i4.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown"] }, { type: i5.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide"] }, { type: i6.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "virtualScroll", "itemSize", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "field", "scrollHeight", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide"] }, { type: i7.FileUploadComponent, selector: "sf-file-upload", inputs: ["limit", "files", "loading", "configName", "accept"], outputs: ["onUpload", "onDeleteFile"] }, { type: i8.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "numberOfMonths", "view", "touchUI", "timeSeparator", "focusTrap", "firstDayOfWeek", "showTransitionOptions", "hideTransitionOptions", "tabindex", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i9.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "step", "inputStyle", "inputStyleClass", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i11.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "ariaLabelledBy"], outputs: ["onChange"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i12.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i15.InputText, selector: "[pInputText]" }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { type: i17.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i14.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "formatAddress": i18.FormatAddressPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
375
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, decorators: [{
376
- type: Component,
377
- args: [{
378
- selector: 'sf-control',
379
- templateUrl: './control.component.html',
380
- styleUrls: ['./control.component.css'],
381
- changeDetection: ChangeDetectionStrategy.OnPush
382
- }]
383
- }], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.SfCrudService }, { type: i0.ChangeDetectorRef }, { type: i3.NotificationService }]; }, propDecorators: { showTempValue: [{
384
- type: Input
385
- }], control: [{
386
- type: Input
387
- }], label: [{
388
- type: Input
389
- }], value: [{
390
- type: Input
391
- }], appendTo: [{
392
- type: Input
393
- }], setValue: [{
394
- type: Output
395
- }], sendObject: [{
396
- type: Output
397
- }], addressClicked: [{
398
- type: Output
399
- }], tooltips: [{
400
- type: ViewChildren,
401
- args: [Tooltip]
402
- }] } });
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZi1jcnVkL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sL2NvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC9jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQXFCLFlBQVksRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFFOUssT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sRUFBNkIsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFbkcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBR2pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFyQyxNQUFNLE9BQU8sZ0JBQWdCO0lBd0IzQixZQUNVLGNBQThCLEVBQzlCLFdBQTBCLEVBQzFCLEdBQXNCLEVBQ3RCLG1CQUF3QztRQUh4QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFDMUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTFCekMsa0JBQWEsR0FBVyxLQUFLLENBQUM7UUFDOUIsWUFBTyxHQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFDN0IsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUdsQixhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7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Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNnQixRQUFRO3NCQUE5QixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2hlbWEgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL3NoZW1hLm1vZGVsJztcclxuaW1wb3J0IHsgT3BlcmF0aW9uLCBPdmVycmlkZUNvbmZpZywgUmVxdWVzdENoZWNraW5nIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9jcnVkLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFNmQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZi1jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IEFyY2hpdm8gfSBmcm9tICcuLi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMganNvbnBhdGggZnJvbSAnanNvbnBhdGgnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZi1jb250cm9sJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29udHJvbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29udHJvbC5jb21wb25lbnQuY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbnRyb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dUZW1wVmFsdWU6Qm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNvbnRyb2w6IFNoZW1hID0gbmV3IFNoZW1hKCk7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHZhbHVlOiBhbnk7XHJcbiAgQElucHV0KCkgYXBwZW5kVG86IGFueTtcclxuICBAT3V0cHV0KCkgc2V0VmFsdWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHNlbmRPYmplY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGFkZHJlc3NDbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBWaWV3Q2hpbGRyZW4oVG9vbHRpcCkgdG9vbHRpcHMhOiBRdWVyeUxpc3QgPFRvb2x0aXA+O1xyXG5cclxuICBwcml2YXRlIGxlbmdodFdvcmQhOiBudW1iZXI7XHJcbiAgcHVibGljIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkYXRhRnJvbVNlcnZpY2U6IGFueVtdID0gW107XHJcbiAgcHVibGljIHVwbG9hZGVkRmlsZXM6IEFyY2hpdm9bXSA9IFtdO1xyXG4gIHB1YmxpYyBkaXNwbGF5QWRkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHRlbXBWYWx1ZTogYW55O1xyXG4gIHB1YmxpYyBjbGlja2VkID0gZmFsc2U7XHJcbiAgcHVibGljIG1hc2tEYXRlID0gXCI5OS85OS85OTk5XCJcclxuXHJcbiAgcHVibGljIHVwbG9hZGluZ0ZpbGVzID0gZmFsc2U7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZ2VuZXJhbFNlcnZpY2U6IEdlbmVyYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjcnVkU2VydmljZTogU2ZDcnVkU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubG9hZERlZmF1bHRWYWx1ZXMoKVxyXG4gICAgaWYgKHRoaXMuY29udHJvbD8uY29uZmlnPy5kZXBlbmRzKXtcclxuICAgICAgdGhpcy5jcnVkU2VydmljZS5jaGFuZ2VEYXRhJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICBpZiAocmVzKXtcclxuICAgICAgICAgIGxldCByZWdpc3RybyA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8odGhpcy5jcnVkU2VydmljZS5pbmRleClcclxuICAgICAgICAgIGxldCBrZXlGb3VuZCA9IHJlZ2lzdHJvLmtleXM/LmZpbmQoayA9PiBrLnNjb3BlID09PSByZXMuc2NvcGVcclxuICAgICAgICAgICYmICAodGhpcy5jb250cm9sLmNvbmZpZy5kZXBlbmRzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhrLmtleSkgJiZcclxuICAgICAgICAgIChyZXMuaW5kZXggPT09IGsuaW5kZXhEYXRhIHx8IHJlcy5pbmRleCA9PT0gay5pbmRleEFuc3dlcikpXHJcbiAgICAgICAgICBpZiAoa2V5Rm91bmQ/Lm92ZXJyaWRlQ29udHJvbCl7XHJcbiAgICAgICAgICAgIGxldCBvdmVycmlkZSA9IGtleUZvdW5kLm92ZXJyaWRlQ29udHJvbFxyXG4gICAgICAgICAgICBsZXQgY29tcGxldGVkID0gdGhpcy5jcnVkU2VydmljZS5pc0NvbmRpdGlvbnNDb21wbGV0ZWQob3ZlcnJpZGUuY29uZGl0aW9ucyA/PyBbXSwgcmVnaXN0cm8uY29uZGl0aW9ucyB8fCBbXSwgdGhpcy5jcnVkU2VydmljZS5nZXREYXRhKHRoaXMuY3J1ZFNlcnZpY2UuaW5kZXgpKVxyXG4gICAgICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmNvbnRyb2wsIG92ZXJyaWRlLnByb3BlcnR5LCBjb21wbGV0ZWQgPyBvdmVycmlkZS52YWx1ZSA6IG92ZXJyaWRlLmVsc2VWYWx1ZSlcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0TmV3VmFsdWUob3ZlcnJpZGUsIGNvbXBsZXRlZCk7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcFZhbHVlID0gbnVsbFxyXG4gICAgICAgICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuc3VidHlwZSA9PSAnZHJvcGRvd24nIHx8IHRoaXMuY29udHJvbC5zdWJ0eXBlID09ICdtdWx0aXNlbGVjdCcpIHRoaXMubG9hZERhdGFGcm9tU2VydmljZSgpXHJcbiAgICAgICAgICAgIC8vdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChrZXlGb3VuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbFxyXG4gICAgICAgICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICAgICAgICAgIHRoaXMubG9hZERlZmF1bHRWYWx1ZXMoKVxyXG4gICAgICAgICAgICAvL3RoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5ld1ZhbHVlKG92ZXJyaWRlOiBPdmVycmlkZUNvbmZpZywgY29tcGxldGVkOiBib29sZWFuKTogYW55IHtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gY29tcGxldGVkID8gb3ZlcnJpZGUubmV3UHJvcGVydHlWYWx1ZTogb3ZlcnJpZGUuZWxzZU5ld1Byb3BlcnR5VmFsdWU7XHJcbiAgICBpZiAobmV3VmFsdWUgJiYgdHlwZW9mKG5ld1ZhbHVlKSA9PSBcInN0cmluZ1wiKXtcclxuICAgICAgaWYgKCFuZXdWYWx1ZS5zdGFydHNXaXRoKCckJykgJiYgIW5ld1ZhbHVlLnN0YXJ0c1dpdGgoJ0AnKSl7XHJcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGxvYWREZWZhdWx0VmFsdWVzKCl7XHJcbiAgICBpZiAodGhpcy5jb250cm9sPy5jb25maWcgJiYgdGhpcy5jb250cm9sLnN1YnR5cGUgPT0gJ2Ryb3Bkb3duJyB8fCB0aGlzLmNvbnRyb2wuc3VidHlwZSA9PSAnbXVsdGlzZWxlY3QnKSB0aGlzLmxvYWREYXRhRnJvbVNlcnZpY2UoKTtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LnN1YnR5cGUgPT0gJ2F1dG9jb21wbGV0ZScpIHRoaXMuZXh0cmFjVmFsdWVGcm9tQ29udHJvbEJ1c3F1ZWRhKCk7XHJcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSAnZGF0ZScpIHRoaXMuaW5zdGFuY2VEYXRlKCk7XHJcbiAgICBpZiAodGhpcy5jb250cm9sPy5zdWJ0eXBlID09IFwiZmlsZVwiKSB7XHJcbiAgICAgIHRoaXMubG9hZEZpbGVzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb250cm9sPy50eXBlID09ICdzdHJpbmcnKSB0aGlzLmxlbmdodFdvcmQgPSB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5sZW5ndGggOiAwXHJcbiAgICBpZiAodGhpcy5jb250cm9sPy5zdWJ0eXBlID09ICdzd2l0Y2gnKSB0aGlzLmluc3RhbmNlQm9vbEZpZWxkKClcclxuICB9XHJcbiAgaW5zdGFuY2VCb29sRmllbGQoKSB7XHJcbiAgICB0aGlzLnRlbXBWYWx1ZSA9IHRoaXMudmFsdWVcclxuICAgIGlmICh0aGlzLnZhbHVlID09IHRydWUgJiYgdGhpcy5jb250cm9sLnRydWVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnRyb2wudHJ1ZVZhbHVlXHJcbiAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMudmFsdWUgPT0gZmFsc2UgJiYgdGhpcy5jb250cm9sLmZhbHNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5jb250cm9sLmZhbHNlVmFsdWVcclxuICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VTd2l0Y2goKXtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLnRlbXBWYWx1ZVxyXG4gICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gIH1cclxuXHJcbiAgbG9hZEZpbGVzKCl7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFtdXHJcbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuY29udHJvbC5jb25maWcubmFtZVBhdHRlcm4gJiYgdGhpcy5jb250cm9sLnR5cGUgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBsZXQgdXJsczogc3RyaW5nW10gPSB0aGlzLmNvbnRyb2wuY29uZmlnLnNlcGFyYXRvciA/IHRoaXMudmFsdWUuc3BsaXQoXCIsXCIpIDogW3RoaXMudmFsdWVdXHJcbiAgICAgIHVybHMuZm9yRWFjaCh1cmwgPT4gdGhpcy51cGxvYWRlZEZpbGVzLnB1c2goe3VybDp1cmwsICBuYW1lOnRoaXMuZ2V0TmFtZUZpbGUodGhpcy5jb250cm9sLmNvbmZpZy5uYW1lUGF0dGVybiwgdXJsKX0pKVxyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5jb250cm9sLmNvbmZpZy5uYW1lUGF0dGVybiAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSBcImFycmF5XCIpIHtcclxuICAgICAgdGhpcy52YWx1ZS5mb3JFYWNoKCh1cmw6c3RyaW5nKSA9PiB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaCh7dXJsOnVybCwgIG5hbWU6dGhpcy5nZXROYW1lRmlsZSh0aGlzLmNvbnRyb2wuY29uZmlnLm5hbWVQYXR0ZXJuLCB1cmwpfSkpXHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRlbGV0ZUZpbGUoaW5kZXg6IG51bWJlcil7XHJcbiAgICBpZiAoKCF0aGlzLmNvbnRyb2wuY29uZmlnPy5saW1pdCB8fCB0aGlzLmNvbnRyb2wuY29uZmlnPy5saW1pdCA9PSAxKSAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSBcInN0cmluZ1wiKSB0aGlzLnZhbHVlID0gbnVsbFxyXG4gICAgZWxzZSBpZiAodGhpcy5jb250cm9sLnR5cGUgPT0gXCJhcnJheVwiKSB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSlcclxuICB9XHJcblxyXG4gIGdldE5hbWVGaWxlKG5hbWVQYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlZ2V4T2JqID0gbmV3IFJlZ0V4cChuYW1lUGF0dGVybik7XHJcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4T2JqLmV4ZWModXJsKTtcclxuICAgIGlmICghbWF0Y2gpIHRocm93IG5ldyBFcnJvcihcIkVsIHBhdHRlcm4gbm8gY29pbmNpZGUgY29uIGxhIHVybC4gXCIgKyB1cmwpO1xyXG4gICAgcmV0dXJuIG1hdGNoWzBdO1xyXG4gIH1cclxuXHJcbiAgc2VuZFZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuY29udHJvbC50eXBlID09IFwic3RyaW5nXCIgJiYgdGhpcy52YWx1ZSA9PSBcIlwiICYmIHRoaXMuY29udHJvbC5jb25maWc/LmFsbG93RW1wdHkgPT0gZmFsc2UpIHRoaXMudmFsdWUgPSBudWxsXHJcbiAgICB0aGlzLnNldFZhbHVlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBzZW5kTnVtYmVyVmFsdWUoJGV2ZW50OiBhbnkpe1xyXG4gICAgdGhpcy52YWx1ZSA9ICRldmVudC52YWx1ZVxyXG4gICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gIH1cclxuXHJcbiAgb25JbnB1dEVtYWlsKGZvcmNlOmJvb2xlYW4pe1xyXG4gICAgY29uc3QgYXV4ID0gTWF0aC5hYnModGhpcy5sZW5naHRXb3JkIC0gdGhpcy52YWx1ZS5sZW5ndGgpXHJcbiAgICB0aGlzLmxlbmdodFdvcmQgPSB0aGlzLnZhbHVlLmxlbmd0aFxyXG4gICAgaWYgKGF1eCA+IDEgfHwgZm9yY2Upe1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4OiBSZWdFeHAgPSBuZXcgUmVnRXhwKC8oW1xcd1xcLlxcLV9dKyk/XFx3K0BbXFx3LV9dKyhcXC5cXHcrKXsxLH0vaWdtKTtcclxuICAgICAgICBpZiAocmVnZXgudGVzdCh0aGlzLnZhbHVlKSkgdGhpcy5zZW5kVmFsdWUoKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogJ0VsIGNvcnJlbyBubyBlcyB2w6FsaWRvJyB9LCB0aGlzLnByaW1lQ2hlY2tpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VuZFZhbHVlRnJvbU9iamVjdChldmVudDogYW55KSB7XHJcbiAgICBzd2l0Y2ggKHR5cGVvZiAodGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZSkpIHtcclxuICAgICAgY2FzZSAnb2JqZWN0JzpcclxuICAgICAgICB0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlLmZvckVhY2goKG9wOiBhbnkpID0+IG9wWyd2YWx1ZSddID0gZXZlbnRbb3Aua2V5XSlcclxuICAgICAgICB0aGlzLnNldFZhbHVlLmVtaXQodGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZS5lbWl0KGV2ZW50W3RoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWVdKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWREYXRhRnJvbVNlcnZpY2UoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IFtdO1xyXG4gICAgY29uc3Qgb3A6IE9wZXJhdGlvbiA9IHRoaXMuY29udHJvbC5jb25maWdcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wLCB1bmRlZmluZWQsIHVuZGVmaW5lZClcclxuICAgIGlmICh0aGlzLmNvbnRyb2wuY29uZmlnPy5jdXN0b21PcHRpb25zKXtcclxuICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UgPSB0aGlzLmNvbnRyb2wuY29uZmlnLmN1c3RvbU9wdGlvbnNcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB1cmwpXHJcbiAgICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IHJlcy5kYXRhO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkRGF0YUZyb21Db250cm9sQnVzcXVlZGFTZXJ2aWNlKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IG9wOiBPcGVyYXRpb24gPSB0aGlzLmNvbnRyb2wuY29uZmlnXHJcbiAgICBsZXQgdXJsID0gdGhpcy5jcnVkU2VydmljZS5nZXRVUkwob3ApXHJcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgnQHF1ZXJ5JywgZXZlbnQ/LnF1ZXJ5IHx8ICcnKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IHJlcy5kYXRhO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFGcm9tU2VydmljZT8ubGVuZ3RoID09IDAgJiYgdGhpcy5jb250cm9sLmFsbG93Q3VzdG9tT3B0aW9uKSB7XHJcbiAgICAgICAgICAvL2FncmVnYXIgdW4gY2FtcG8gcXVlIGVsIHVzdWFyaW8gaGF5YSBkaWdpdGFkb1xyXG4gICAgICAgICAgbGV0IG5ld0l0ZW06IGFueSA9IHt9XHJcbiAgICAgICAgICBuZXdJdGVtW3RoaXMuY29udHJvbC5maWVsZF0gPSB0aGlzLnRlbXBWYWx1ZVxyXG4gICAgICAgICAgbmV3SXRlbVt0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlXSA9IHRoaXMudGVtcFZhbHVlXHJcbiAgICAgICAgICB0aGlzLmRhdGFGcm9tU2VydmljZS5wdXNoKG5ld0l0ZW0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZXh0cmFjVmFsdWVGcm9tQ29udHJvbEJ1c3F1ZWRhKCl7XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgbGV0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wKVxyXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoJ0BxdWVyeScsIHRoaXMudmFsdWUpXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB1cmwpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YT8ubGVuZ3RoID09IDEgJiYgcmVzLmRhdGFbMF1bdGhpcy5jb250cm9sLmZpZWxkXSl7XHJcbiAgICAgICAgICB0aGlzLnRlbXBWYWx1ZSA9IHJlcy5kYXRhWzBdXHJcbiAgICAgICAgICB0aGlzLnZhbHVlID0gcmVzLmRhdGFbMF1bdGhpcy5jb250cm9sLmZpZWxkXVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHRoaXMuc2V0RGVmYXVsdFZhbHVlKClcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgb25VcGxvYWQoZXZlbnQ6IEZpbGVbXSkge1xyXG4gICAgdGhpcy51cGxvYWRpbmdGaWxlcyA9IHRydWVcclxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5jb250cm9sLmNvbmZpZy5wYXRoIHx8ICdJbWFnZW5lcy9DUlVEL3RlbXAnO1xyXG4gICAgZm9ybURhdGEuYXBwZW5kKCdSdXRhJywgYC8ke3BhdGh9YCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudC5sZW5ndGg7IGkrKykgZm9ybURhdGEuYXBwZW5kKGB1cGxvYWRGaWxlXyR7aX1gLCBldmVudFtpXSk7XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5jcnVkU2VydmljZS5nZXRVUkwob3ApXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB1cmwsIGZvcm1EYXRhKVxyXG4gICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICBsZXQgc2VwYXJhdG9yID0gdGhpcy5jb250cm9sLmNvbmZpZz8uc2VwYXJhdG9yIHx8IFwiLFwiXHJcbiAgICAgIC8vc2UgYXN1bWUgcXVlIHZpZW5lIG5hbWVQYXR0ZXJuXHJcbiAgICAgIGlmICh0aGlzLmNvbnRyb2wudHlwZSA9PSBcInN0cmluZ1wiKSB0aGlzLnZhbHVlID0gZXZlbnQubWFwKGYgPT4gYCR7dGhpcy5nZW5lcmFsU2VydmljZS5qc29uQ29uZmlnLlNlcnZlcn0ke3BhdGh9LyR7Zi5uYW1lfWApLmpvaW4oc2VwYXJhdG9yKVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wudHlwZSA9PSBcImFycmF5XCIpIHRoaXMudmFsdWUgPSBldmVudC5tYXAoZiA9PiBgJHt0aGlzLmdlbmVyYWxTZXJ2aWNlLmpzb25Db25maWcuU2VydmVyfSR7cGF0aH0vJHtmLm5hbWV9YClcclxuICAgICAgLy8gU0kgTk8gVFJBRSBuYW1lUGF0dGVybiwgZGViZSByZXRvcm5hciB1biBvYmpldG8gY29uIGVsIG5vbWJyZSB5IGhyZWZcclxuICAgICAgLy9lbHNlIGlmICh0aGlzLmNvbnRyb2wuY29uZmlnLm5hbWVQYXR0ZXJuICYmIHRoaXMuY29udHJvbC50eXBlID09IFwiYXJyYXlcIikgdGhpcy52YWx1ZSA9IGV2ZW50Lm1hcCh4ID0+IHgubmFtZSlcclxuICAgICAgLy9lbHNlIGlmICghdGhpcy5jb250cm9sLmNvbmZpZy5uYW1lUGF0dGVybiAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSBcImFycmF5XCIpIHRoaXMudmFsdWUgPSBldmVudC5tYXAoZiA9PiBgJHt0aGlzLmdlbmVyYWxTZXJ2aWNlLmpzb25Db25maWcuU2VydmVyfSR7cGF0aH0vJHtmLm5hbWV9YClcclxuICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgICBsZXQgbXNnID0gIXRoaXMuY29udHJvbC5jb25maWcubGltaXQgfHwgdGhpcy5jb250cm9sLmNvbmZpZy5saW1pdCA9PSAxID8gXCJBcmNoaXZvIGNhcmdhZG8gY29ycmVjdGFtZW50ZSFcIjogXCJBcmNoaXZvcyBjYXJnYWRvcyBjb3JyZWN0YW1lbnRlIVwiXHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGROb3RpZmljYXRpb24oeyBzZXZlcml0eTogJ2luZm8nLCBkZXRhaWw6IG1zZyB9LCB0aGlzLnByaW1lQ2hlY2tpbmcoKSlcclxuICAgIH0pXHJcbiAgICAuY2F0Y2goKCkgPT4gdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7IHNldmVyaXR5OiAnZXJyb3InLCBkZXRhaWw6IGBFcnJvciBhbCBjYXJnYXIgZWwgYXJjaGl2byFgIH0sIHRoaXMucHJpbWVDaGVja2luZygpKSlcclxuICAgIC5maW5hbGx5KCgpID0+IHRoaXMudXBsb2FkaW5nRmlsZXMgPSBmYWxzZSlcclxuXHJcbiAgfVxyXG5cclxuICByZWZyZXNEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuY29udHJvbD8uY29uZmlnPy5lbmRwb2ludHRlbXApIHRoaXMubG9hZERhdGFGcm9tU2VydmljZSgpO1xyXG4gIH1cclxuICBzZXREZWZhdWx0VmFsdWUoKXtcclxuICAgIHRoaXMudGVtcFZhbHVlID0ge31cclxuICAgIGlmICghdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25MYWJlbCkgY29uc29sZS5lcnJvcihcIk5vIGVzdGEgYmllbiBjb25maWd1cmFkbyBlbCBjb250cm9sIFwiLCB0aGlzLmNvbnRyb2wpXHJcbiAgICBlbHNlIHRoaXMudGVtcFZhbHVlW3RoaXMuY29udHJvbC5jb25maWcub3B0aW9uTGFiZWxdID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWU6IFwiXCJcclxuXHJcbiAgfVxyXG5cclxuICBzZWFyY2hWYWx1ZSh2YWx1ZTogc3RyaW5nKXtcclxuICAgIGNvbnN0IG9wOiBPcGVyYXRpb24gPSB0aGlzLmNvbnRyb2wuY29uZmlnXHJcbiAgICBsZXQgdXJsID0gdGhpcy5jcnVkU2VydmljZS5nZXRVUkwob3AsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKVxyXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoJ0BpZCcsIHZhbHVlKVxyXG5cclxuXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB1cmwpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGhpcy5zZW5kT2JqZWN0LmVtaXQoeyBkYXRhOiByZXMuZGF0YVswXSwgb3B0aW9uVmFsdWU6IHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUgfSApXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKHtzZXZlcml0eTogJ3dhcm4nLCBkZXRhaWw6YFZhbG9yIG5vIGVuY29udHJhZG8uYH0sIHRoaXMucHJpbWVDaGVja2luZygpKVxyXG4gICAgICAgICAgdGhpcy5zZW5kT2JqZWN0LmVtaXQoeyBkYXRhOiBudWxsLCBvcHRpb25WYWx1ZTogdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZSB9IClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnI9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7c2V2ZXJpdHk6ICdlcnJvcicsIGRldGFpbDpgRXJyb3IgYWwgY29uc3VtaXIgZWwgc2VydmljaW8uYH0sdGhpcy5wcmltZUNoZWNraW5nKCkpXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcmltZUNoZWNraW5nKCl7XHJcbiAgICByZXR1cm4gbmV3IFJlcXVlc3RDaGVja2luZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkKVxyXG4gIH1cclxuXHJcbiAgaW5zdGFuY2VEYXRlKCl7XHJcbiAgICBjb25zdCBmb3JtYXQgPSAodGhpcy5jb250cm9sIGFzIGFueSkuZm9ybWF0TW9tZW50XHJcblxyXG4gICAgaWYgKHRoaXMudmFsdWUpe1xyXG4gICAgICBpZiAodHlwZW9mKHRoaXMudmFsdWUpID09IFwic3RyaW5nXCIgJiYgKHRoaXMudmFsdWUgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIlRcIikpIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKVxyXG4gICAgICBlbHNlIGlmICh0eXBlb2YodGhpcy52YWx1ZSkgPT0gXCJzdHJpbmdcIikgdGhpcy52YWx1ZSA9IG1vbWVudCh0aGlzLnZhbHVlLCBmb3JtYXQpLnRvRGF0ZSgpO1xyXG4gICAgICB0aGlzLnRlbXBWYWx1ZSA9IG1vbWVudCh0aGlzLnZhbHVlKS5mb3JtYXQoXCJERC9NTS9ZWVlZXCIpXHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMudGVtcFZhbHVlID0gbnVsbFxyXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENhc3QgdGVtcFZhbHVlIHRvIGRhdGVcclxuICAgKi9cclxuICBvbkNoYW5nZVNEYXRlKCRldmVudDogYW55KXtcclxuICAgIGNvbnNvbGUubG9nKCRldmVudClcclxuICAgIGNvbnNvbGUubG9nKHRoaXMudGVtcFZhbHVlKVxyXG4gICAgY29uc29sZS5sb2codGhpcy52YWx1ZSlcclxuICAgIGNvbnN0IGF1eCA9IG1vbWVudCh0aGlzLnRlbXBWYWx1ZSwgXCJERC9NTS9ZWVlZXCIpXHJcbiAgICBpZiAodGhpcy50ZW1wVmFsdWUgPT0gdGhpcy5tYXNrRGF0ZS5yZXBsYWNlQWxsKFwiOVwiLCBcIl9cIikpe1xyXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxyXG4gICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhdXguaXNWYWxpZCgpKXtcclxuICAgICAgdGhpcy52YWx1ZSA9IGF1eC50b0RhdGUoKTtcclxuICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudGVtcFZhbHVlID0gbnVsbDtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogJ0xhIGZlY2hhIG5vIGVzIHbDoWxpZGEnIH0sIHRoaXMucHJpbWVDaGVja2luZygpKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuXHJcbiAgb25DaGFuZ2VEYXRlKCl7XHJcbiAgICB0aGlzLnRlbXBWYWx1ZSA9IG1vbWVudCh0aGlzLnZhbHVlKS5mb3JtYXQoXCJERC9NTS9ZWVlZXCIpXHJcbiAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgfVxyXG5cclxuICAgIG9uVG91Y2hEZXNjcmlwdGlvbigpIHtcclxuICAgICAgdHJ5e1xyXG4gICAgICAgIHRoaXMudG9vbHRpcHMuZ2V0KDApPy5hY3RpdmF0ZSgpXHJcbiAgICAgIH1jYXRjaChleCl7fVxyXG5cclxuICB9XHJcblxyXG4gIG9uVW5Ub3VjaERlc2NyaXB0aW9uKCkge1xyXG4gICAgICB0cnl7XHJcbiAgICAgICAgdGhpcy50b29sdGlwcy5nZXQoMCk/LmRlYWN0aXZhdGUoKVxyXG4gICAgICB9Y2F0Y2goZXgpe31cclxufVxyXG5cclxuICBkb0ZvY3VzT3V0KCl7XHJcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xyXG4gICAgICAgIChkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tlZEFkZHJlcygpe1xyXG4gICAgdGhpcy5hZGRyZXNzQ2xpY2tlZC5lbWl0KClcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUZW1wVmFsdWVcIj48cCAqbmdJZj1cInRlbXBWYWx1ZVwiPnt7dGVtcFZhbHVlW2NvbnRyb2wuZmllbGRdfX08L3A+PC9uZy1jb250YWluZXI+XHJcblxyXG48ZGl2ICpuZ0lmPVwiIXNob3dUZW1wVmFsdWVcIiBbbmdTd2l0Y2hdPVwiY29udHJvbC50eXBlXCIgI2NjIGNsYXNzPVwiY29udHJvbC1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cclxuICAgICAgICA8bGFiZWwgW2Zvcl09XCJsYWJlbFwiPnt7bGFiZWx9fTwvbGFiZWw+XHJcbiAgICAgICAgPGkgI3Rvb2x0aXAgKm5nSWY9XCJjb250cm9sLnRvb2x0aXBcIiBjbGFzcz1cInBpIHBpLXF1ZXN0aW9uLWNpcmNsZVwiXHJcbiAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiY29udHJvbC50b29sdGlwUG9zaXRpb24gfHwgJ3RvcCdcIiBbcFRvb2x0aXBdPVwiY29udHJvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgKHRvdWNoc3RhcnQpPVwib25Ub3VjaERlc2NyaXB0aW9uKClcIiAodG91Y2hlbmQpPVwib25VblRvdWNoRGVzY3JpcHRpb24oKVwiPjwvaT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdHJpbmcnXCIgPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbbmFtZV09XCJsYWJlbFwiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChpbnB1dCk9XCJzZW5kVmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIiBbYXV0b2NvbXBsZXRlXT1cImNvbnRyb2wuYXV0b2NvbXBsZXRlIHx8ICdvZmYnXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dGFyZWEnXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgW3Jvd3NdPVwiY29udHJvbC5jb25maWc/LnJvd3MgPyBjb250cm9sLmNvbmZpZy5yb3dzIDogNFwiIFsobmdNb2RlbCldPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJzZW5kVmFsdWUoKVwiIHBJbnB1dFRleHRhcmVhIFtkaXNhYmxlZF09XCJjb250cm9sLmNvbmZpZz8uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdXRvUmVzaXplXT1cImNvbnRyb2wuY29uZmlnPy5hdXRvcmVzaXplIHx8IGZhbHNlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGFzc3dvcmQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwicGFzc3dvcmRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGlucHV0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VtYWlsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgcGxhY2Vob2xkZXI9XCJlbWFpbEBleGFtcGxlLmNvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIiBhdXRvY29tcGxldGU9XCJlbWFpbFwiIChpbnB1dCk9XCJvbklucHV0RW1haWwoZmFsc2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25JbnB1dEVtYWlsKHRydWUpXCIgKGtleXVwLmVudGVyKT1cImRvRm9jdXNPdXQoKVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Bob25lJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtaW5wdXRNYXNrIG1hc2s9XCIoOTk5KSA5OTktOTk5OVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBwbGFjZWhvbGRlcj1cIig5OTkpIDk5OS05OTk5XCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiIGF1dG9jb21wbGV0ZT1cInRlbC1uYXRpb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3VubWFza109XCJjb250cm9sLnVubWFzayB8fCBmYWxzZVwiIChvbkNvbXBsZXRlKT1cInNlbmRWYWx1ZSgpXCI+PC9wLWlucHV0TWFzaz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhZGRyZXNzJ1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInZhbHVlIHwgZm9ybWF0QWRkcmVzczogY29udHJvbC5zZXBhcmFkb3JcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbZGlzYWJsZWRdPVwiY2xpY2tlZFwiIChrZXlkb3duKT1cIm9uQ2xpY2tlZEFkZHJlcygpXCIgKGZvY3VzKT1cIm9uQ2xpY2tlZEFkZHJlcygpXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZW51bSdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImNvbnRyb2wuZW51bVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNjaW9uZSB1bmEgb3BjacOzblwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW2xhenldPVwiaXNMb2FkaW5nXCIgW29wdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChvbkNoYW5nZSk9XCJzZW5kVmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImNvbnRyb2wuY29uZmlnLm9wdGlvbkxhYmVsXCIgW3Nob3dDbGVhcl09XCJjb250cm9sLmNvbmZpZy5zaG93Q2xlYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJjb250cm9sLmZpZWxkIHx8IGNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIiBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkcm9wZG93bjpyZXBsYWNlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW2xhenldPVwiaXNMb2FkaW5nXCIgW29wdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCJcclxuICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwic2VuZFZhbHVlRnJvbU9iamVjdCgkZXZlbnQpXCIgW29wdGlvbkxhYmVsXT1cImNvbnRyb2wuY29uZmlnLm9wdGlvbkxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIiBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2F1dG9jb21wbGV0ZSdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWF1dG9Db21wbGV0ZSBbc2hvd0VtcHR5TWVzc2FnZV09XCJ0cnVlXCIgW3N1Z2dlc3Rpb25zXT1cImRhdGFGcm9tU2VydmljZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXRlTWV0aG9kKT1cImxvYWREYXRhRnJvbUNvbnRyb2xCdXNxdWVkYVNlcnZpY2UoJGV2ZW50KVwiIFtmaWVsZF09XCJjb250cm9sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWluTGVuZ3RoXT1cIjFcIiAob25TZWxlY3QpPVwic2VuZFZhbHVlRnJvbU9iamVjdCgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJ0ZW1wVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWF1dG9Db21wbGV0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dDpzZWFyY2gnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1pbnB1dGdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImRvRm9jdXNPdXQoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaFZhbHVlKHZhbHVlKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZSdcIj5cclxuICAgICAgICAgICAgICAgIDxzZi1maWxlLXVwbG9hZCAqbmdJZj1cIiFpc0xvYWRpbmdcIiBbYWNjZXB0XT1cImNvbnRyb2wuY29uZmlnPy5hY2NlcHQgfHwgJ2ltYWdlLyosYXBwbGljYXRpb24vcGRmJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwidXBsb2FkaW5nRmlsZXNcIiBbZmlsZXNdPVwidXBsb2FkZWRGaWxlc1wiIFtjb25maWdOYW1lXT1cImNvbnRyb2wuY29uZmlnPy5jb25maWdOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbGltaXRdPVwiY29udHJvbC5jb25maWc/LmxpbWl0IHx8IDFcIiAob25VcGxvYWQpPVwib25VcGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uRGVsZXRlRmlsZSk9XCJvbkRlbGV0ZUZpbGUoJGV2ZW50KVwiPjwvc2YtZmlsZS11cGxvYWQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NhbGVuZGFyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaW5wdXRncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE1hc2sgWyhuZ01vZGVsKV09XCJ0ZW1wVmFsdWVcIiBbbWFza109XCJtYXNrRGF0ZVwiIFtwbGFjZWhvbGRlcl09XCJjb250cm9sLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25DaGFuZ2VTRGF0ZSgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtaW5wdXRNYXNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgY2xhc3M9XCJvbmx5LWljb25cIiBbbW9udGhOYXZpZ2F0b3JdPVwidHJ1ZVwiIFt5ZWFyTmF2aWdhdG9yXT1cInRydWVcIiB5ZWFyUmFuZ2U9XCIxOTAwOjIwMzVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY29udHJvbC5mb3JtYXQgfHwgJ3l5LW1tLWRkJ1wiIGFwcGVuZFRvPVwiYm9keVwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93T25Gb2N1c109XCIhY29udHJvbC5oaWRlXCIgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2wucGxhY2Vob2xkZXIgfHwgJ2FhYWEtbW0tZGQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3VjaFVJXT1cImNvbnRyb2wudG91Y2hVSSB8fCBmYWxzZVwiIFtzaG93SWNvbl09XCJjb250cm9sLnNob3dJY29uIHx8IGZhbHNlXCIgKG9uU2VsZWN0KT1cIm9uQ2hhbmdlRGF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25DaGFuZ2VEYXRlKClcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1lcmljJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbbmdNb2RlbF09XCJ2YWx1ZVwiICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZSA9ICRldmVudDsgc2VuZFZhbHVlKClcIiBtb2RlPVwiZGVjaW1hbFwiIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb250cm9sLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5dPVwiY29udHJvbC5taW4gfHwgbnVsbFwiIFttYXhdPVwiY29udHJvbC5tYXggfHwgbnVsbFwiIChvbklucHV0KT1cInNlbmROdW1iZXJWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbcHJlZml4XT1cImNvbnRyb2wuY3VycmVuY3kgfHwgJyQgJ1wiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbbmdNb2RlbF09XCJ2YWx1ZVwiIG1vZGU9XCJkZWNpbWFsXCIgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWUgPSAkZXZlbnQ7IHNlbmRWYWx1ZSgpXCIgW21pbl09XCJjb250cm9sLm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2wubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbnRyb2wubG9jYWxlIHx8IHVuZGVmaW5lZFwiIFt1c2VHcm91cGluZ109XCJjb250cm9sLnVzZUdyb3VwaW5nIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwZXJjZW50YWdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgW25nTW9kZWxdPVwidmFsdWVcIiBzdWZmaXg9XCIgJVwiIChuZ01vZGVsQ2hhbmdlKT1cInZhbHVlID0gJGV2ZW50OyBzZW5kVmFsdWUoKVwiIChvbklucHV0KT1cInNlbmRWYWx1ZSgpXCIgW21pbl09XCJjb250cm9sLm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2wubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAyXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbnRyb2wubG9jYWxlIHx8IHVuZGVmaW5lZFwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWw6c2VhcmNoJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaW5wdXRncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImRvRm9jdXNPdXQoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaFZhbHVlKHZhbHVlKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXJyYXknXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaWxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNmLWZpbGUtdXBsb2FkICpuZ0lmPVwiIWlzTG9hZGluZ1wiIFtsb2FkaW5nXT1cInVwbG9hZGluZ0ZpbGVzXCIgW2ZpbGVzXT1cInVwbG9hZGVkRmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdOYW1lXT1cImNvbnRyb2wuY29uZmlnPy5jb25maWdOYW1lXCIgW2xpbWl0XT1cImNvbnRyb2wuY29uZmlnPy5saW1pdCB8fCAxXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImNvbnRyb2wuY29uZmlnPy5hY2NlcHQgfHwgJ2ltYWdlLyosYXBwbGljYXRpb24vcGRmJ1wiIChvblVwbG9hZCk9XCJvblVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25EZWxldGVGaWxlKT1cIm9uRGVsZXRlRmlsZSgkZXZlbnQpXCI+PC9zZi1maWxlLXVwbG9hZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXNlbGVjdCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cImRhdGFGcm9tU2VydmljZVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb250cm9sLmNvbmZpZz8ub3B0aW9uTGFiZWxcIiBbb3B0aW9uVmFsdWVdPVwiY29udHJvbC5jb25maWc/Lm9wdGlvblZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29udHJvbC5jb25maWc/LnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheV09XCJjb250cm9sLmNvbmZpZz8uZGlzcGxheSB8fCAnY2hpcCdcIj48L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N3aXRjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoICBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZVN3aXRjaCgpXCIgW2lkXT1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgIFt0cnVlVmFsdWVdPVwiY29udHJvbD8udHJ1ZVZhbHVlICE9PSB1bmRlZmluZWQgPyBjb250cm9sPy50cnVlVmFsdWU6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgW2ZhbHNlVmFsdWVdPVwiY29udHJvbD8uZmFsc2VWYWx1ZSAhPT0gdW5kZWZpbmVkID8gY29udHJvbD8uZmFsc2VWYWx1ZTogbnVsbFwiPjwvcC1pbnB1dFN3aXRjaD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbiJdfQ==