form-aurora-stefanini 0.1.3 → 0.1.6
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/bundles/form-aurora-stefanini.umd.js +1225 -0
- package/bundles/form-aurora-stefanini.umd.js.map +1 -0
- package/bundles/form-aurora-stefanini.umd.min.js +16 -0
- package/bundles/form-aurora-stefanini.umd.min.js.map +1 -0
- package/esm2015/form-aurora-stefanini.js +5 -0
- package/esm2015/lib/Components/from-aurora/form-aurora.component.js +707 -0
- package/esm2015/lib/Models/company-parameters.js +7 -0
- package/esm2015/lib/Models/company.js +1 -0
- package/esm2015/lib/Models/fill.js +3 -0
- package/esm2015/lib/Models/state.js +1 -0
- package/esm2015/lib/Models/step.js +1 -0
- package/esm2015/lib/Models/stepMethod.js +3 -0
- package/esm2015/lib/form-aurora.module.js +22 -0
- package/esm2015/lib/services/TemplateService.js +85 -0
- package/esm2015/lib/services/data.service.js +82 -0
- package/esm2015/lib/utils/regex.js +52 -0
- package/esm2015/public-api.js +10 -0
- package/esm5/form-aurora-stefanini.js +5 -0
- package/esm5/lib/Components/from-aurora/form-aurora.component.js +751 -0
- package/esm5/lib/Models/company-parameters.js +19 -0
- package/esm5/lib/Models/company.js +1 -0
- package/esm5/lib/Models/fill.js +7 -0
- package/esm5/lib/Models/state.js +1 -0
- package/esm5/lib/Models/step.js +1 -0
- package/esm5/lib/Models/stepMethod.js +7 -0
- package/esm5/lib/form-aurora.module.js +25 -0
- package/esm5/lib/services/TemplateService.js +97 -0
- package/esm5/lib/services/data.service.js +85 -0
- package/esm5/lib/utils/regex.js +52 -0
- package/esm5/public-api.js +10 -0
- package/fesm2015/form-aurora-stefanini.js +939 -0
- package/fesm2015/form-aurora-stefanini.js.map +1 -0
- package/fesm5/form-aurora-stefanini.js +1004 -0
- package/fesm5/form-aurora-stefanini.js.map +1 -0
- package/form-aurora-stefanini.d.ts +4 -0
- package/form-aurora-stefanini.metadata.json +1 -0
- package/lib/Components/from-aurora/form-aurora.component.d.ts +118 -0
- package/lib/Models/company-parameters.d.ts +14 -0
- package/lib/Models/company.d.ts +22 -0
- package/lib/Models/fill.d.ts +6 -0
- package/lib/Models/state.d.ts +5 -0
- package/lib/Models/step.d.ts +14 -0
- package/lib/Models/stepMethod.d.ts +8 -0
- package/lib/form-aurora.module.d.ts +2 -0
- package/lib/services/TemplateService.d.ts +8 -0
- package/lib/services/data.service.d.ts +35 -0
- package/lib/utils/regex.d.ts +51 -0
- package/package.json +28 -17
- package/{src/public-api.ts → public-api.d.ts} +1 -4
- package/karma.conf.js +0 -32
- package/ng-package.json +0 -7
- package/src/lib/Components/from-aurora/form-aurora.component.css +0 -117
- package/src/lib/Components/from-aurora/form-aurora.component.html +0 -343
- package/src/lib/Components/from-aurora/form-aurora.component.spec.ts +0 -25
- package/src/lib/Components/from-aurora/form-aurora.component.ts +0 -725
- package/src/lib/Models/company-parameters.ts +0 -16
- package/src/lib/Models/company.ts +0 -25
- package/src/lib/Models/fill.ts +0 -6
- package/src/lib/Models/state.ts +0 -5
- package/src/lib/Models/step.ts +0 -15
- package/src/lib/Models/stepMethod.ts +0 -9
- package/src/lib/form-aurora.module.ts +0 -18
- package/src/lib/services/TemplateService.ts +0 -84
- package/src/lib/services/data.service.ts +0 -83
- package/src/lib/utils/regex.ts +0 -51
- package/src/test.ts +0 -21
- package/tsconfig.lib.json +0 -26
- package/tsconfig.spec.json +0 -17
- package/tslint.json +0 -17
@@ -0,0 +1,707 @@
|
|
1
|
+
import * as tslib_1 from "tslib";
|
2
|
+
import { Component, Injectable, Input, ViewChild, Output, EventEmitter } from '@angular/core';
|
3
|
+
import { FormGroup, FormControl, Validators } from '@angular/forms';
|
4
|
+
import { HttpClient } from '@angular/common/http';
|
5
|
+
// import moment from 'moment';
|
6
|
+
import { NgbDateAdapter, NgbDateParserFormatter, NgbDatepickerI18n } from '@ng-bootstrap/ng-bootstrap';
|
7
|
+
import * as moment_ from 'moment';
|
8
|
+
import { regexType } from '../../utils/regex';
|
9
|
+
import { CommonDataService } from '../../services/data.service';
|
10
|
+
const moment = moment_;
|
11
|
+
// import { regexType } from "@app/_shared/_util/regex";
|
12
|
+
// import { ExternalService } from '@app/_shared/_services/external.service';
|
13
|
+
// import { AuroraService } from '@app/_shared/_services/aurora.service';
|
14
|
+
/**
|
15
|
+
* This Service handles how the date is represented in scripts i.e. ngModel.
|
16
|
+
*/
|
17
|
+
let CustomAdapter = class CustomAdapter extends NgbDateAdapter {
|
18
|
+
// import { regexType } from "@app/_shared/_util/regex";
|
19
|
+
// import { ExternalService } from '@app/_shared/_services/external.service';
|
20
|
+
// import { AuroraService } from '@app/_shared/_services/aurora.service';
|
21
|
+
/**
|
22
|
+
* This Service handles how the date is represented in scripts i.e. ngModel.
|
23
|
+
*/
|
24
|
+
constructor() {
|
25
|
+
super(...arguments);
|
26
|
+
this.DELIMITER = '/';
|
27
|
+
}
|
28
|
+
fromModel(value) {
|
29
|
+
if (value) {
|
30
|
+
const date = value.split(this.DELIMITER);
|
31
|
+
return {
|
32
|
+
day: parseInt(date[0], 10),
|
33
|
+
month: parseInt(date[1], 10),
|
34
|
+
year: parseInt(date[2], 10)
|
35
|
+
};
|
36
|
+
}
|
37
|
+
return null;
|
38
|
+
}
|
39
|
+
toModel(date) {
|
40
|
+
//return date ? date.day + this.DELIMITER + date.month + this.DELIMITER + date.year : null;
|
41
|
+
return date ? (date.day < 10 ? 0 + date.day : date.day) + this.DELIMITER + (date.month < 10 ? 0 + date.month : date.month) + this.DELIMITER + date.year : '';
|
42
|
+
}
|
43
|
+
};
|
44
|
+
CustomAdapter = tslib_1.__decorate([
|
45
|
+
Injectable()
|
46
|
+
], CustomAdapter);
|
47
|
+
export { CustomAdapter };
|
48
|
+
/**
|
49
|
+
* This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
|
50
|
+
*/
|
51
|
+
let CustomDateParserFormatter = class CustomDateParserFormatter extends NgbDateParserFormatter {
|
52
|
+
/**
|
53
|
+
* This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
|
54
|
+
*/
|
55
|
+
constructor() {
|
56
|
+
super(...arguments);
|
57
|
+
this.DELIMITER = '/';
|
58
|
+
}
|
59
|
+
parse(value) {
|
60
|
+
if (value) {
|
61
|
+
const date = value.split(this.DELIMITER);
|
62
|
+
return {
|
63
|
+
day: parseInt(date[0], 10),
|
64
|
+
month: parseInt(date[1], 10),
|
65
|
+
year: parseInt(date[2], 10)
|
66
|
+
};
|
67
|
+
}
|
68
|
+
return null;
|
69
|
+
}
|
70
|
+
format(date) {
|
71
|
+
return date ? (date.day < 10 ? '0' + date.day : date.day) + this.DELIMITER + (date.month < 10 ? '0' + date.month : date.month) + this.DELIMITER + date.year : '';
|
72
|
+
}
|
73
|
+
};
|
74
|
+
CustomDateParserFormatter = tslib_1.__decorate([
|
75
|
+
Injectable()
|
76
|
+
], CustomDateParserFormatter);
|
77
|
+
export { CustomDateParserFormatter };
|
78
|
+
const I18N_VALUES = {
|
79
|
+
'es': {
|
80
|
+
weekdays: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],
|
81
|
+
months: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
|
82
|
+
weekLabel: 'sem'
|
83
|
+
}
|
84
|
+
// other languages you would support
|
85
|
+
};
|
86
|
+
let I18n = class I18n {
|
87
|
+
constructor() {
|
88
|
+
this.language = 'es';
|
89
|
+
}
|
90
|
+
};
|
91
|
+
I18n = tslib_1.__decorate([
|
92
|
+
Injectable()
|
93
|
+
], I18n);
|
94
|
+
export { I18n };
|
95
|
+
// Define custom service providing the months and weekdays translations
|
96
|
+
let CustomDatepickerI18n = class CustomDatepickerI18n extends NgbDatepickerI18n {
|
97
|
+
constructor(_i18n) {
|
98
|
+
super();
|
99
|
+
this._i18n = _i18n;
|
100
|
+
}
|
101
|
+
getWeekdayLabel(weekday) {
|
102
|
+
return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
|
103
|
+
}
|
104
|
+
getWeekLabel() {
|
105
|
+
return I18N_VALUES[this._i18n.language].weekLabel;
|
106
|
+
}
|
107
|
+
getMonthShortName(month) {
|
108
|
+
return I18N_VALUES[this._i18n.language].months[month - 1];
|
109
|
+
}
|
110
|
+
getMonthFullName(month) {
|
111
|
+
return this.getMonthShortName(month);
|
112
|
+
}
|
113
|
+
getDayAriaLabel(date) {
|
114
|
+
return `${date.day}-${date.month}-${date.year}`;
|
115
|
+
}
|
116
|
+
getWeekdayShortName(weekday) {
|
117
|
+
return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
|
118
|
+
}
|
119
|
+
;
|
120
|
+
};
|
121
|
+
CustomDatepickerI18n.ctorParameters = () => [
|
122
|
+
{ type: I18n }
|
123
|
+
];
|
124
|
+
CustomDatepickerI18n = tslib_1.__decorate([
|
125
|
+
Injectable()
|
126
|
+
], CustomDatepickerI18n);
|
127
|
+
export { CustomDatepickerI18n };
|
128
|
+
let FormAuroraComponent = class FormAuroraComponent {
|
129
|
+
constructor(data, http) {
|
130
|
+
this.data = data;
|
131
|
+
this.http = http;
|
132
|
+
this.response = new EventEmitter();
|
133
|
+
this.summit = new EventEmitter();
|
134
|
+
this.viewAuthData = new EventEmitter();
|
135
|
+
this.tipodocNumDoc = false;
|
136
|
+
this.onSubmitEvent = false;
|
137
|
+
this.countSubmit = 0;
|
138
|
+
this.watchValid = false;
|
139
|
+
this.watchRequired = false;
|
140
|
+
this.captchaValid = false;
|
141
|
+
this.displayMonths = 2;
|
142
|
+
this.navigation = 'select';
|
143
|
+
this.showWeekNumbers = false;
|
144
|
+
this.outsideDays = 'visible';
|
145
|
+
this.respServiceSegmentation = null;
|
146
|
+
this.base64CheckAuthData = undefined;
|
147
|
+
//emailPattern = "^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$";
|
148
|
+
this.today = moment(new Date());
|
149
|
+
this.maxYear = this.today.year();
|
150
|
+
this.minYear = this.today.year() - 82;
|
151
|
+
this.minDate = this.minYear.toString() + '-' + this.today.month().toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.minYear, month: this.today.month(), day: this.today.date()};
|
152
|
+
this.maxDate = this.maxYear.toString() + '-' + (this.today.month() + 1).toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.maxYear, month: this.today.month() + 1, day: this.today.date()};
|
153
|
+
//Revisar variables
|
154
|
+
this.recharge = false;
|
155
|
+
this.indicativo = "57";
|
156
|
+
this.defaultDocType = "Cédula de ciudadanía";
|
157
|
+
this.patternNotValidDcto = false;
|
158
|
+
this.patternNotValidCel = false;
|
159
|
+
this.range = new FormGroup({
|
160
|
+
start: new FormControl(),
|
161
|
+
end: new FormControl(),
|
162
|
+
});
|
163
|
+
}
|
164
|
+
ngOnInit() {
|
165
|
+
this.minDate = new Date(this.minDate).toISOString().split('T')[0];
|
166
|
+
setTimeout(() => {
|
167
|
+
this.startComponent();
|
168
|
+
}, 2000);
|
169
|
+
}
|
170
|
+
startComponent() {
|
171
|
+
//ordena los campos
|
172
|
+
if (this.dataForm != null && this.dataForm.formQuestions != undefined) {
|
173
|
+
//Same row fields
|
174
|
+
this.tipodocNumDoc = (this.dataForm.formQuestions.some(question => question.question.value === "tipoDoc") && this.dataForm.formQuestions.some(question => question.question.value === "numeroDoc")) ? true : false;
|
175
|
+
this.dataForm.formQuestions = this.dataForm.formQuestions.sort(function (a, b) {
|
176
|
+
return a.order - b.order;
|
177
|
+
});
|
178
|
+
let existcaptcha = this.dataForm.formQuestions.filter((item) => item.question.questionType.id == 6);
|
179
|
+
if (existcaptcha.length == 0) {
|
180
|
+
this.captchaValid = true;
|
181
|
+
}
|
182
|
+
for (const item of this.dataForm.formQuestions) {
|
183
|
+
if (item.question.maxlength == null || item.question.maxlength == undefined || item.question.maxlength == 0) {
|
184
|
+
item.question.maxlength = 524288; //defaultvalue
|
185
|
+
}
|
186
|
+
if (item.question.minLength == null || item.question.minLength == undefined) {
|
187
|
+
item.question.minLength = 0;
|
188
|
+
}
|
189
|
+
this.dataReloadForm.forEach(element => {
|
190
|
+
this.filldata = element;
|
191
|
+
if ((item.question.questionType.id === 2 || item.question.questionType.id === 1 ||
|
192
|
+
item.question.questionType.id === 3) && (this.filldata.data !== null &&
|
193
|
+
this.filldata.data !== undefined) && item.question.id === this.filldata.id) {
|
194
|
+
item.question.registred = this.filldata.data;
|
195
|
+
}
|
196
|
+
});
|
197
|
+
if (item.question.registred == null || item.question.minLength == undefined) {
|
198
|
+
item.question.registred = '';
|
199
|
+
}
|
200
|
+
}
|
201
|
+
}
|
202
|
+
}
|
203
|
+
resolvedCaptcha(captchaResponse) {
|
204
|
+
this.captchaValid = true;
|
205
|
+
if (!this.formDynamic.form.value.captcha) {
|
206
|
+
this.formDynamic.controls.captcha.setValue(captchaResponse);
|
207
|
+
this.formDynamic.form.value.captcha = captchaResponse;
|
208
|
+
document.getElementById("btnIng").style.opacity = !this.formDynamic.valid ? "0.65" : "1";
|
209
|
+
}
|
210
|
+
}
|
211
|
+
//Forms
|
212
|
+
//Metodo para evitar el render de los items del for
|
213
|
+
trackByIndex(index, obj) {
|
214
|
+
return index;
|
215
|
+
}
|
216
|
+
onChangeValidPatter(event, question) {
|
217
|
+
if (question.pattern != undefined) {
|
218
|
+
let valid = true;
|
219
|
+
let keyvalid = [8, 32, 37, 38, 39, 40, 46, 9];
|
220
|
+
//diferente de Backpsace
|
221
|
+
//se deja catch por error no controlable en otro tiempo de ejecucion
|
222
|
+
try {
|
223
|
+
if (!keyvalid.includes(event.keyCode)) {
|
224
|
+
const regex = new RegExp(question.pattern);
|
225
|
+
valid = regex.test(event.key);
|
226
|
+
}
|
227
|
+
}
|
228
|
+
catch (error) { }
|
229
|
+
return valid;
|
230
|
+
}
|
231
|
+
if (question.questionType !== undefined) {
|
232
|
+
if (question.questionType.description === 'Number') {
|
233
|
+
if (question.value === 'numeroDoc') {
|
234
|
+
this.validateNumeroDocumento(this.formDynamic.controls["numeroDoc"].value.toString());
|
235
|
+
}
|
236
|
+
else if (question.value === 'celular') {
|
237
|
+
this.validateCelular(this.formDynamic.controls["celular"].value.toString());
|
238
|
+
}
|
239
|
+
}
|
240
|
+
}
|
241
|
+
document.getElementById("char" + question.value).setAttribute("hidden", "true");
|
242
|
+
//if temporal mientras se migran todos los tipos de campos al foreach
|
243
|
+
if (question.questionType.id != 11 && question.questionType.id != 7) {
|
244
|
+
if (this.validMinLength(this.formDynamic, question)) {
|
245
|
+
document.getElementById(question.value).style.borderColor = "#FF0000";
|
246
|
+
document.getElementById("ml" + question.value).removeAttribute("hidden");
|
247
|
+
}
|
248
|
+
else {
|
249
|
+
document.getElementById(question.value).style.borderColor = "#E4E4E4";
|
250
|
+
document.getElementById("ml" + question.value).setAttribute("hidden", "true");
|
251
|
+
}
|
252
|
+
if (this.validMaxLength(this.formDynamic, question)) {
|
253
|
+
document.getElementById(question.value).style.borderColor = "#FF0000";
|
254
|
+
document.getElementById("mxl" + question.value).removeAttribute("hidden");
|
255
|
+
}
|
256
|
+
else {
|
257
|
+
document.getElementById(question.value).style.borderColor = "#E4E4E4";
|
258
|
+
document.getElementById("mxl" + question.value).setAttribute("hidden", "true");
|
259
|
+
}
|
260
|
+
}
|
261
|
+
this.dataForm.formQuestions.forEach(formQuestion => {
|
262
|
+
switch (formQuestion.question.questionType.id) {
|
263
|
+
//se valida campo de tipo calendario
|
264
|
+
case 7:
|
265
|
+
if (question.questionType.id == 7)
|
266
|
+
this.calendarRulesValidate(formQuestion);
|
267
|
+
break;
|
268
|
+
//se valida campo de tipo email
|
269
|
+
case 11:
|
270
|
+
if (question.questionType.id == 11)
|
271
|
+
this.emailRulesValidate(formQuestion);
|
272
|
+
break;
|
273
|
+
}
|
274
|
+
});
|
275
|
+
document.getElementById("btnIng").style.opacity = !this.formDynamic.valid ? "0.65" : "1";
|
276
|
+
}
|
277
|
+
validOnlyText(event) {
|
278
|
+
let regex = /^[a-zA-Z\u00C0-\u017F]+$/g;
|
279
|
+
if (event.charCode == 32) {
|
280
|
+
return true;
|
281
|
+
}
|
282
|
+
let valid = regex.test(event.key);
|
283
|
+
return valid;
|
284
|
+
}
|
285
|
+
validDate(event) {
|
286
|
+
/*let pattern = /(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20)[0-9]{2}/;
|
287
|
+
const regex = new RegExp(pattern);
|
288
|
+
valid = regex.test(event.key);
|
289
|
+
*/
|
290
|
+
const matches = String(event.key).match(regexType.date.exp);
|
291
|
+
let valid = true;
|
292
|
+
if (matches === null)
|
293
|
+
valid = false;
|
294
|
+
// alert(valid);
|
295
|
+
return valid;
|
296
|
+
}
|
297
|
+
onChangeValidDate(event) {
|
298
|
+
//let pattern = /(?:0[1-9]|1[0-2])\/(?:0[1-9]|[12][0-9]|3[01])\/(?:19|20)[0-9]{2}/;
|
299
|
+
let dateN = /[0-9]|\//;
|
300
|
+
let valid = true;
|
301
|
+
const regex = new RegExp(dateN);
|
302
|
+
valid = regex.test(event.key);
|
303
|
+
return valid;
|
304
|
+
}
|
305
|
+
rediretoutside(event, question) {
|
306
|
+
//se deja catch por error no controlable en otro tiempo de ejecucion
|
307
|
+
try {
|
308
|
+
event.preventDefault();
|
309
|
+
window.open(question.value, "_blank");
|
310
|
+
}
|
311
|
+
catch (error) { }
|
312
|
+
}
|
313
|
+
/**
|
314
|
+
* Dispatch submit event for validations exists
|
315
|
+
* @param change
|
316
|
+
*/
|
317
|
+
ngOnChanges(change) {
|
318
|
+
this.countSubmit++;
|
319
|
+
}
|
320
|
+
//onSubmit(form: NgForm) {
|
321
|
+
onSubmit() {
|
322
|
+
let form = this.formDynamic;
|
323
|
+
this.watchValid = true;
|
324
|
+
this.watchRequired = true;
|
325
|
+
if (form.valid) {
|
326
|
+
if (!this.validRulesFields(form.controls["numeroDoc"].value.toString(), form.controls["celular"].value.toString(), form.controls["email"].value))
|
327
|
+
return false;
|
328
|
+
}
|
329
|
+
if (this.validMinlenghtAllQuestions(form.value) && this.validMaxLengthAllQuestions(form.value) && form.valid) {
|
330
|
+
if (this.dataForm.urlSend != "" && this.captchaValid) {
|
331
|
+
this.http.post(this.dataForm.urlSend, form.value).subscribe((resp) => this.response.emit(resp));
|
332
|
+
}
|
333
|
+
else if (form.valid && this.captchaValid) {
|
334
|
+
this.summit.emit(form.value);
|
335
|
+
}
|
336
|
+
}
|
337
|
+
}
|
338
|
+
findParamBoolean(params, idParam) {
|
339
|
+
let showDescriptionParam = params.find((x) => x.id == idParam);
|
340
|
+
return showDescriptionParam != null && showDescriptionParam.value == "true";
|
341
|
+
}
|
342
|
+
validRulesFields(numeroDoc, numeroCel, email) {
|
343
|
+
// Validaciones para celular en caso de indicativo en Colombia
|
344
|
+
let cel = document.getElementById("charcelular");
|
345
|
+
let doc = document.getElementById("charnumeroDoc");
|
346
|
+
let valOk = true;
|
347
|
+
if (this.indicativo == "+57" || this.indicativo == "57") {
|
348
|
+
let stringOrdenado = this.orderString(numeroDoc);
|
349
|
+
if (this.nameCompany.toUpperCase() !== 'CLARO') { //claro acepta nro consecutivos
|
350
|
+
if (numeroDoc == stringOrdenado) {
|
351
|
+
doc.style.borderColor = "#FF0000";
|
352
|
+
doc.removeAttribute("hidden");
|
353
|
+
doc.textContent = "El numero documento No debe contener caracteres consecutivos";
|
354
|
+
valOk = false;
|
355
|
+
//this.msgErrorCampo = "El numero documento No debe contener caracteres consecutivos";
|
356
|
+
//return false;
|
357
|
+
}
|
358
|
+
}
|
359
|
+
if (numeroCel.substring(0, 1) != "3") {
|
360
|
+
cel.style.borderColor = "#FF0000";
|
361
|
+
cel.removeAttribute("hidden");
|
362
|
+
cel.textContent = "El primer carácter del celular debe ser 3";
|
363
|
+
valOk = false;
|
364
|
+
//this.msgErrorCampo = "El primer carácter del celular debe ser 3";
|
365
|
+
//return false;
|
366
|
+
}
|
367
|
+
/*
|
368
|
+
if (parseInt(numeroCel.substring(0, 3)) > 350) {
|
369
|
+
cel.style.borderColor = "#FF0000";
|
370
|
+
cel.removeAttribute("hidden");
|
371
|
+
cel.textContent = "El prefijo del celular no debe ser mayor a 350";
|
372
|
+
valOk = false;
|
373
|
+
//this.msgErrorCampo = "El prefijo del celular no debe ser mayor a 350";
|
374
|
+
//return false;
|
375
|
+
}
|
376
|
+
*/
|
377
|
+
//En caso de que el número se repita, ejemplo 33333333
|
378
|
+
let listnumber = numeroDoc.substring(0, 1);
|
379
|
+
for (let index = 1; index < numeroDoc.length; index++) {
|
380
|
+
listnumber = listnumber + numeroDoc.substring(0, 1);
|
381
|
+
}
|
382
|
+
if (numeroDoc == listnumber) {
|
383
|
+
doc.style.borderColor = "#FF0000";
|
384
|
+
doc.removeAttribute("hidden");
|
385
|
+
doc.textContent = "Caracteres numéricos no se pueden repetirse de manera continua ";
|
386
|
+
valOk = false;
|
387
|
+
//this.msgErrorCampo = "Caracteres numéricos no se pueden repetirse de manera continua ";
|
388
|
+
//return false;
|
389
|
+
}
|
390
|
+
if (!this.validateNumeroDocumento(numeroDoc)) {
|
391
|
+
return false;
|
392
|
+
}
|
393
|
+
if (!this.validateCelular(numeroCel)) {
|
394
|
+
return false;
|
395
|
+
}
|
396
|
+
// En caso de que el número se repita, ejemplo 33333333
|
397
|
+
let arrayPhoneRepeat = Array.from(String(numeroCel), Number);
|
398
|
+
let arrayPhoneOutRepeat = [...new Set(arrayPhoneRepeat)];
|
399
|
+
if (arrayPhoneOutRepeat.length == 1) {
|
400
|
+
cel.style.borderColor = "#FF0000";
|
401
|
+
cel.removeAttribute("hidden");
|
402
|
+
cel.textContent = "El número que ingresa no es valido";
|
403
|
+
valOk = false;
|
404
|
+
//this.msgErrorCampo = "El número que ingresa no es valido";
|
405
|
+
//return false;
|
406
|
+
}
|
407
|
+
}
|
408
|
+
else if (this.indicativo == "+593" || this.indicativo == "593") {
|
409
|
+
if (numeroCel.substring(0, 1) != "9") {
|
410
|
+
cel.style.borderColor = "#FF0000";
|
411
|
+
cel.removeAttribute("hidden");
|
412
|
+
cel.textContent = "El primer carácter del celular debe ser 9";
|
413
|
+
valOk = false;
|
414
|
+
//this.msgErrorCampo = "El primer carácter del celular debe ser 9";
|
415
|
+
//return false;
|
416
|
+
}
|
417
|
+
}
|
418
|
+
//se validan los campos por tipo de campo y no por value
|
419
|
+
this.dataForm.formQuestions.forEach(formQuestion => {
|
420
|
+
switch (formQuestion.question.questionType.id) {
|
421
|
+
//se valida campo de tipo email
|
422
|
+
case 11:
|
423
|
+
valOk = this.emailRulesValidate(formQuestion);
|
424
|
+
break;
|
425
|
+
}
|
426
|
+
});
|
427
|
+
return valOk;
|
428
|
+
}
|
429
|
+
orderString(value) {
|
430
|
+
let arrayNumber = [];
|
431
|
+
for (let index = 0; index < value.length; index++) {
|
432
|
+
arrayNumber.push(parseInt(value.substring(index, index + 1)));
|
433
|
+
}
|
434
|
+
//ordena el array
|
435
|
+
arrayNumber.sort(function (a, b) {
|
436
|
+
return a - b;
|
437
|
+
});
|
438
|
+
let numberOrder = "";
|
439
|
+
numberOrder = arrayNumber[0];
|
440
|
+
for (let index = 1; index < arrayNumber.length; index++) {
|
441
|
+
numberOrder = numberOrder + (arrayNumber[0] + index).toString();
|
442
|
+
}
|
443
|
+
return numberOrder;
|
444
|
+
}
|
445
|
+
validMinlenghtAllQuestions(form) {
|
446
|
+
for (const item of this.dataForm.formQuestions) {
|
447
|
+
if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
|
448
|
+
let minLength = parseInt(item.question.minLength);
|
449
|
+
let formValueLength = parseInt(form[item.question.value].toString().length);
|
450
|
+
if (minLength > 0 && formValueLength != minLength && formValueLength < minLength)
|
451
|
+
return false;
|
452
|
+
}
|
453
|
+
}
|
454
|
+
return true;
|
455
|
+
}
|
456
|
+
validMaxLengthAllQuestions(form) {
|
457
|
+
for (const item of this.dataForm.formQuestions) {
|
458
|
+
if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
|
459
|
+
let maxLength = parseInt(item.question.maxLength);
|
460
|
+
let formValueLength = parseInt(form[item.question.value].toString().length);
|
461
|
+
if (maxLength > 0 && formValueLength != maxLength && formValueLength > maxLength)
|
462
|
+
return false;
|
463
|
+
}
|
464
|
+
}
|
465
|
+
return true;
|
466
|
+
}
|
467
|
+
validRequired(form, question) {
|
468
|
+
//se deja catch por error no controlable en otro tiempo de ejecucion
|
469
|
+
try {
|
470
|
+
if (question != undefined && question.value != undefined) {
|
471
|
+
if (form.controls[question.value] != undefined &&
|
472
|
+
form.controls[question.value].errors != null &&
|
473
|
+
form.controls[question.value].errors.required) {
|
474
|
+
return true;
|
475
|
+
}
|
476
|
+
}
|
477
|
+
}
|
478
|
+
catch (error) { }
|
479
|
+
return false;
|
480
|
+
}
|
481
|
+
validMinLength(form, question) {
|
482
|
+
//se deja catch por error no controlable en otro tiempo de ejecucion
|
483
|
+
try {
|
484
|
+
if (question != undefined && question.value != undefined) {
|
485
|
+
if (question.minLength > form.controls[question.value].value.toLocaleString().length && question.minLength > 0) {
|
486
|
+
return true;
|
487
|
+
}
|
488
|
+
}
|
489
|
+
}
|
490
|
+
catch (error) { }
|
491
|
+
return false;
|
492
|
+
}
|
493
|
+
validMaxLength(form, question) {
|
494
|
+
//se deja catch por error no controlable en otro tiempo de ejecucion
|
495
|
+
try {
|
496
|
+
if (question != undefined && question.value != undefined) {
|
497
|
+
if (question.maxLength > 0) {
|
498
|
+
if (question.maxLength + 1 <= form.controls[question.value].value.toString().replace(/\./g, '').length) {
|
499
|
+
if (!this.formDynamic.controls[question.value].hasError('errorMaxLength')) {
|
500
|
+
this.formDynamic.controls[question.value].setErrors({ 'errorMaxLength': true });
|
501
|
+
}
|
502
|
+
return true;
|
503
|
+
}
|
504
|
+
}
|
505
|
+
}
|
506
|
+
}
|
507
|
+
catch (error) { }
|
508
|
+
return false;
|
509
|
+
}
|
510
|
+
tycSelection(event) {
|
511
|
+
this.viewAuthData.emit(event);
|
512
|
+
}
|
513
|
+
openLabelUrl(event, question) {
|
514
|
+
event.preventDefault();
|
515
|
+
let tyc = document.getElementById("check" + question.id);
|
516
|
+
tyc.style.color = "#A3AD32";
|
517
|
+
window.open(question.urllabel, "_blank");
|
518
|
+
}
|
519
|
+
cancellKeypress() {
|
520
|
+
return false;
|
521
|
+
}
|
522
|
+
emailRulesValidate(formQuestion) {
|
523
|
+
let valOk = true;
|
524
|
+
try {
|
525
|
+
let hasError = false;
|
526
|
+
document.getElementById(formQuestion.question.id).setAttribute("hidden", "true");
|
527
|
+
let eml = document.getElementById(formQuestion.question.id);
|
528
|
+
let email = formQuestion.question.registred;
|
529
|
+
if (!hasError) {
|
530
|
+
if (formQuestion.question.required && (email == "" || email == undefined || email == null)) {
|
531
|
+
eml.style.borderColor = "#FF0000";
|
532
|
+
eml.textContent = "El correco eléctronico es requerido";
|
533
|
+
eml.removeAttribute("hidden");
|
534
|
+
valOk = false;
|
535
|
+
hasError = true;
|
536
|
+
}
|
537
|
+
}
|
538
|
+
if (!hasError) {
|
539
|
+
if (this.validMinLength(undefined, formQuestion.question)) {
|
540
|
+
eml.style.borderColor = "#FF0000";
|
541
|
+
eml.textContent = "Debe ser mínimo de " + formQuestion.question.minLength + " caracteres";
|
542
|
+
document.getElementById(formQuestion.question.id).removeAttribute("hidden");
|
543
|
+
valOk = false;
|
544
|
+
hasError = true;
|
545
|
+
}
|
546
|
+
}
|
547
|
+
if (!hasError) {
|
548
|
+
if (this.validMaxLength(undefined, formQuestion.question)) {
|
549
|
+
eml.style.borderColor = "#FF0000";
|
550
|
+
eml.textContent = "Debe ser maximo de " + formQuestion.question.maxLength + " caracteres";
|
551
|
+
document.getElementById(formQuestion.question.id).removeAttribute("hidden");
|
552
|
+
valOk = false;
|
553
|
+
hasError = true;
|
554
|
+
}
|
555
|
+
}
|
556
|
+
if (!hasError) {
|
557
|
+
const matches = String(email).match(regexType.email.exp);
|
558
|
+
if (matches == null) {
|
559
|
+
eml.style.borderColor = "#FF0000";
|
560
|
+
eml.textContent = "Tu email es invalido";
|
561
|
+
eml.removeAttribute("hidden");
|
562
|
+
valOk = false;
|
563
|
+
hasError = true;
|
564
|
+
}
|
565
|
+
}
|
566
|
+
}
|
567
|
+
catch (error) {
|
568
|
+
}
|
569
|
+
return valOk;
|
570
|
+
}
|
571
|
+
calendarRulesValidate(formQuestion) {
|
572
|
+
let hasError = false;
|
573
|
+
try {
|
574
|
+
document.getElementById(formQuestion.question.id).setAttribute("hidden", "true");
|
575
|
+
let ecalendar = document.getElementById(formQuestion.question.id);
|
576
|
+
//se valida que no sea null si es requerido
|
577
|
+
let date = formQuestion.question.registred;
|
578
|
+
if (formQuestion.question.required && (date == "" || date == undefined || date == null)) {
|
579
|
+
ecalendar.style.borderColor = "#FF0000";
|
580
|
+
ecalendar.textContent = "La fecha es requerida";
|
581
|
+
ecalendar.removeAttribute("hidden");
|
582
|
+
}
|
583
|
+
}
|
584
|
+
catch (error) {
|
585
|
+
}
|
586
|
+
}
|
587
|
+
validateNotSpace(event) {
|
588
|
+
if (event.charCode == 32) {
|
589
|
+
return false;
|
590
|
+
}
|
591
|
+
else {
|
592
|
+
return true;
|
593
|
+
}
|
594
|
+
}
|
595
|
+
validateNumeroDocumento(numeroDoc) {
|
596
|
+
if (!numeroDoc.match("^[0-9]*$")) {
|
597
|
+
this.formDynamic.controls["numeroDoc"].setValidators([Validators.pattern('^[0-9]*$')]);
|
598
|
+
this.formDynamic.controls["numeroDoc"].markAsDirty();
|
599
|
+
this.formDynamic.controls["numeroDoc"].updateValueAndValidity();
|
600
|
+
this.formDynamic.controls["numeroDoc"].markAsTouched();
|
601
|
+
this.patternNotValidDcto = true;
|
602
|
+
return false;
|
603
|
+
}
|
604
|
+
this.patternNotValidDcto = false;
|
605
|
+
return true;
|
606
|
+
}
|
607
|
+
validateCelular(numeroCel) {
|
608
|
+
if (!numeroCel.match("^[0-9]*$")) {
|
609
|
+
this.formDynamic.controls["celular"].setValidators([Validators.pattern('^[0-9]*$')]);
|
610
|
+
this.formDynamic.controls["celular"].markAsDirty();
|
611
|
+
this.formDynamic.controls["celular"].updateValueAndValidity();
|
612
|
+
this.formDynamic.controls["celular"].markAsTouched();
|
613
|
+
this.patternNotValidCel = true;
|
614
|
+
return false;
|
615
|
+
}
|
616
|
+
this.patternNotValidCel = false;
|
617
|
+
return true;
|
618
|
+
}
|
619
|
+
onkeypress(event) {
|
620
|
+
return (event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57;
|
621
|
+
}
|
622
|
+
onChangeStep(step, nextStep, value) {
|
623
|
+
if (nextStep && nextStep.stepOrder != 1) {
|
624
|
+
this.resetField(step);
|
625
|
+
nextStep.viewData = [];
|
626
|
+
nextStep.viewData = nextStep.stepData.filter(x => x.relationalIds.includes(Number(value)));
|
627
|
+
}
|
628
|
+
}
|
629
|
+
resetField(stepIn) {
|
630
|
+
this.steps.forEach(step => {
|
631
|
+
if (step.stepOrder > stepIn.stepOrder) {
|
632
|
+
step.viewData = undefined;
|
633
|
+
step.value = undefined;
|
634
|
+
}
|
635
|
+
});
|
636
|
+
}
|
637
|
+
};
|
638
|
+
FormAuroraComponent.ctorParameters = () => [
|
639
|
+
{ type: CommonDataService },
|
640
|
+
{ type: HttpClient }
|
641
|
+
];
|
642
|
+
tslib_1.__decorate([
|
643
|
+
Input()
|
644
|
+
], FormAuroraComponent.prototype, "dataClassCss", void 0);
|
645
|
+
tslib_1.__decorate([
|
646
|
+
Input()
|
647
|
+
], FormAuroraComponent.prototype, "dataForm", void 0);
|
648
|
+
tslib_1.__decorate([
|
649
|
+
Input()
|
650
|
+
], FormAuroraComponent.prototype, "clickSubmit", void 0);
|
651
|
+
tslib_1.__decorate([
|
652
|
+
Input()
|
653
|
+
], FormAuroraComponent.prototype, "dataReloadForm", void 0);
|
654
|
+
tslib_1.__decorate([
|
655
|
+
Input()
|
656
|
+
], FormAuroraComponent.prototype, "welcomeTitle", void 0);
|
657
|
+
tslib_1.__decorate([
|
658
|
+
Input()
|
659
|
+
], FormAuroraComponent.prototype, "welcomeDescription", void 0);
|
660
|
+
tslib_1.__decorate([
|
661
|
+
Input()
|
662
|
+
], FormAuroraComponent.prototype, "urlPdf", void 0);
|
663
|
+
tslib_1.__decorate([
|
664
|
+
Input()
|
665
|
+
], FormAuroraComponent.prototype, "nameCompany", void 0);
|
666
|
+
tslib_1.__decorate([
|
667
|
+
Input()
|
668
|
+
], FormAuroraComponent.prototype, "schedule", void 0);
|
669
|
+
tslib_1.__decorate([
|
670
|
+
Input()
|
671
|
+
], FormAuroraComponent.prototype, "isSimpleFlow", void 0);
|
672
|
+
tslib_1.__decorate([
|
673
|
+
Input()
|
674
|
+
], FormAuroraComponent.prototype, "company", void 0);
|
675
|
+
tslib_1.__decorate([
|
676
|
+
Input()
|
677
|
+
], FormAuroraComponent.prototype, "steps", void 0);
|
678
|
+
tslib_1.__decorate([
|
679
|
+
ViewChild('formDynamic', { static: true })
|
680
|
+
], FormAuroraComponent.prototype, "formDynamic", void 0);
|
681
|
+
tslib_1.__decorate([
|
682
|
+
Output()
|
683
|
+
], FormAuroraComponent.prototype, "response", void 0);
|
684
|
+
tslib_1.__decorate([
|
685
|
+
Output()
|
686
|
+
], FormAuroraComponent.prototype, "summit", void 0);
|
687
|
+
tslib_1.__decorate([
|
688
|
+
Output()
|
689
|
+
], FormAuroraComponent.prototype, "viewAuthData", void 0);
|
690
|
+
tslib_1.__decorate([
|
691
|
+
ViewChild("modalTurns", { static: false })
|
692
|
+
], FormAuroraComponent.prototype, "myModal", void 0);
|
693
|
+
FormAuroraComponent = tslib_1.__decorate([
|
694
|
+
Component({
|
695
|
+
selector: 'lib-FormAurora',
|
696
|
+
template: "<div class=\"card\">\r\n <span class=\"text-center mt-2 d-none d-sm-block\" *ngIf=\"!isSimpleFlow\">\r\n <img style=\"width: 115px; height:96px;\" [class]=\"dataClassCss.logo\" id=\"logo\">\r\n </span>\r\n <div class=\"text-center mt-2 d-none d-sm-block\" *ngIf=\"isSimpleFlow\" style=\"margin-top: 4%!important;\">\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <ng-container *ngIf=\"schedule\">\r\n <h4 class=\"card-title text-center mb-0\" [class]=\"dataClassCss.bienvenida2\" style=\"color: #EE7E0E;\">\r\n Horarios de atenci\u00F3n\r\n </h4>\r\n <small class=\"text-center d-block\">{{schedule}}</small>\r\n </ng-container>\r\n <form #formDynamic=\"ngForm\">\r\n <div *ngFor=\"let control of dataForm?.formQuestions; let index = index; trackBy: trackByIndex\">\r\n <div\r\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2)) || (index < dataForm.formQuestions.length && dataForm.formQuestions[index].question.questionType.id == 3 && dataForm.formQuestions[index + 1].question.questionType.id == 2); else switchTemp\">\r\n <div class=\"row\"\r\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2))\">\r\n <div class=\"col-lg-6 col-xs-12\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index - 1].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left;\">\r\n <span class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index -\r\n 1].question.label}}</span>\r\n </label>\r\n <div class=\"selectContainer\">\r\n <select [name]=\"dataForm.formQuestions[index - 1].question.value\"\r\n [required]=\"dataForm.formQuestions[index - 1].question.required\"\r\n [class]=\"dataClassCss.formcontrol\"\r\n id=\"{{dataForm.formQuestions[index - 1].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index - 1].question.registred\">\r\n <option value=\"\" selected disabled hidden>Selecciona</option>\r\n <ng-container\r\n *ngFor=\"let item of dataForm.formQuestions[index - 1].question.questionAnswers\">\r\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\r\n {{ item.answer.field }}\r\n </option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n <div style=\"margin-left: 15px;\"\r\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\r\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index-1].question.value\"\r\n hidden></span>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-xs-12\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\"\r\n class=\"col-sm-12 p-sm-0 px-sm-1\" style=\"display: block; text-align: left;\">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" pattern=\"\\d*\" inputmode=\"numeric\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (keyup)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n onkeypress=\"onkeypress($event)\"\r\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\r\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\r\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n [class]=\"dataClassCss.formcontrol\" />\r\n\r\n </div>\r\n\r\n <div style=\"margin-left: 15px;\"\r\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\r\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\r\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\r\n Este campo es obligatorio</span>\r\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser m\u00EDnimo de\r\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser maximo de\r\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\r\n hidden></span>\r\n <span *ngIf=\"patternNotValidDcto === true\" class=\"error\">Formato no valido</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #switchTemp>\r\n <div [ngSwitch]=\"dataForm.formQuestions[index].question.questionType.id\">\r\n <div *ngSwitchCase=\"1\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; \">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n style=\"margin-top: -1rem !important;\" />\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"2\">\r\n\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left;\">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" pattern=\"\\d*\" inputmode=\"numeric\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n onkeypress=\"onkeypress($event)\"\r\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\r\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\r\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n [class]=\"dataClassCss.formcontrol\" />\r\n <span *ngIf=\"patternNotValidCel === true\" class=\"error\">Formato no valido</span>\r\n </div>\r\n \r\n </div>\r\n <div *ngSwitchCase=\"3\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left;\">\r\n <span\r\n class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <select [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [class]=\"dataClassCss.formcontrol\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index].question.registred\">\r\n <option value=\"\" selected disabled hidden>Selecciona</option>\r\n <ng-container\r\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\">\r\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\r\n {{ item.answer.field }}\r\n </option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"4\">\r\n <select class=\"{{ dataClassCss.formcontrol }} select-checkbox\"\r\n style=\"overflow: hidden; border-style: hidden;\"\r\n [style.height.px]=\"dataForm.formQuestions[index].question.questionAnswers.length * 24\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\" ngModel multiple>\r\n <option \r\n (mousemove)=\"$event.preventDefault()\"\r\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\"\r\n [value]=\"item.answer.value\">\r\n {{ item.answer.field }}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngSwitchCase=\"5\">\r\n <a (click)=\"rediretoutside($event,dataForm.formQuestions[index].question)\" href=\"\">\r\n <span>{{ dataForm.formQuestions[index].question.label }}</span>\r\n </a>\r\n </div>\r\n <div *ngSwitchCase=\"6\">\r\n <div [class]=\"dataClassCss.cl12\" [id]=\"'reCaptcha'\">\r\n <div class=\"cnt-captcha\">\r\n <re-captcha (resolved)=\"resolvedCaptcha($event)\"\r\n siteKey=\"6LfQisEZAAAAAARuuKFEAgS-x4qJse5uBA_QCA7v\"></re-captcha>\r\n <input hidden type=\"text\" [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\r\n </div>\r\n <span class=\"error\" *ngIf=\"watchValid && !captchaValid\" style=\"margin-top: 0;\">\r\n Debe resolver la captcha para continuar\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"7\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; margin-bottom: 0 ;\">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input placeholder=\"dd/mm/aaaa\" style=\"margin-top: -0.4rem !important;\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [name]=\"dataForm.formQuestions[index].question.value\" type=\"date\" min=\"{{minDate}}\"\r\n max=\"{{maxDate}}\" [maxlength]=\"10\" (paste)=\"false\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.txtCalendar\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n (keydown)=\"cancellKeypress()\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\">\r\n\r\n <button class=\"btn\" id=\"{{dataForm.formQuestions[index].question.value}}\" type=\"button\"\r\n style=\"width: 46px;\r\n top: 12px;\r\n color: white;\r\n right: 15px;\r\n position: absolute;\r\n background: #D25D42;\r\n pointer-events: none;\">\r\n <i class=\"fa fa-calendar\"></i>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"8\">\r\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\r\n <input style=\"width: 4% !important; height: auto !important; display: inline !important;\" type=\"checkbox\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n [class]=\"dataClassCss.formcontrol\">\r\n <!-- (change)=\"checkTermsAndConditions(dataForm.formQuestions[index].question.registred)\" -->\r\n \r\n <!-- <a href=\"{{urlPdf}}\" target=\"_blank\" style=\"text-decoration: underline;\"\r\n id=\"txtPoliticas\" (click)=\"tycSelection()\">\r\n {{dataForm.formQuestions[index].question.label}}\r\n </a> -->\r\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\r\n id=\"txtPoliticas\" (click)=\"tycSelection($event)\">\r\n {{dataForm.formQuestions[index].question.label}}\r\n </a>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"9\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; \">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (keypress)=\"validOnlyText($event)\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n style=\"margin-top: -1rem !important;\" />\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"10\">\r\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\r\n <input style=\"width: 4% !important; height: auto !important; display: inline !important;\"\r\n type=\"checkbox\" [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\r\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\r\n id=\"check{{dataForm.formQuestions[index].question.id}}\"\r\n (click)=\"openLabelUrl($event,dataForm.formQuestions[index].question)\">\r\n {{dataForm.formQuestions[index].question.label}}\r\n </a>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"11\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; \">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (keypress)=\"validateNotSpace($event)\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n style=\"margin-top: -1rem !important;\" />\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>Tipo de control no detectado</div>\r\n <div style=\"margin-left: 15px;\"\r\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\r\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\r\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\r\n Este campo es obligatorio</span>\r\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser m\u00EDnimo de\r\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser maximo de\r\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\r\n hidden></span>\r\n <span class=\"error\" [id]=\"dataForm.formQuestions[index].question.id\" hidden></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <section *ngIf=\"isSimpleFlow\">\r\n <div *ngFor=\"let step of steps let index = index; trackBy: trackByIndex\">\r\n <div [class]=\"dataClassCss.cl12\" *ngIf=\"step.viewData\">\r\n <label for=\"{{step.id}}\" class=\"col-sm-12\" style=\"display: block; text-align: left;\">\r\n <span class=\"h6 small bg-white text-muted\">{{step.step}}</span>\r\n </label>\r\n <select [name]=\"step.step\" [required]=\"true\" [class]=\"dataClassCss.formcontrol\" id=\"{{step.step}}\"\r\n style=\"margin-top: -1rem !important;\" [(ngModel)]=\"step.value\"\r\n (ngModelChange)=\"onChangeStep(step,steps[index+1],$event)\">\r\n <option value=\"\" selected disabled hidden>Selecciona</option>\r\n <ng-container *ngFor=\"let subitem of step.viewData\">\r\n <option [value]=\"subitem.id\">\r\n {{ subitem.description }}\r\n </option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n </section>\r\n <div class=\"mt-3 text-center\">\r\n <button type=\"button\" [class]=\"dataClassCss.btn\" (click)=\"onSubmit()\" [disabled]=\"!formDynamic.valid\"\r\n id=\"btnIng\">Ingresar</button>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n",
|
697
|
+
providers: [
|
698
|
+
{ provide: NgbDateAdapter, useClass: CustomAdapter },
|
699
|
+
{ provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter },
|
700
|
+
{ provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n },
|
701
|
+
I18n
|
702
|
+
],
|
703
|
+
styles: ["form{font-size:12px;overflow-y:scroll;overflow-x:hidden}form input,form select{border:1px solid #e4e4e4;height:40px;margin-bottom:5px}.selectContainer select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.selectContainer::after{content:\"\\025be\";display:table-cell;text-align:center;padding-top:7px;width:30px;height:30px;position:absolute;top:14px;right:20px;pointer-events:none}form .error{color:red;font-size:12px;text-align:left;margin:-15px 0 15px;padding:0;width:90%}.error:after{content:\" \";display:block}.card{width:90%;margin:2% auto;border-radius:12px}@media (max-width:412px){.card{width:100%}.cnt-captcha{transform:scale(.77)}}@media (max-width:575.98px){.card{width:100%}.cnt-captcha{transform:scale(.77)}}@media (max-width:880.98px){.cnt-captcha{transform:scale(.82)}}input[type=date]::-webkit-calendar-picker-indicator{background:0 0;bottom:0;color:transparent;cursor:pointer;height:auto;left:0;position:absolute;right:0;top:0;width:auto}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f5f5f5}::-webkit-scrollbar-thumb{background:#e0e0e0}::-webkit-scrollbar-thumb:hover{background:#bdbdbd}"]
|
704
|
+
})
|
705
|
+
], FormAuroraComponent);
|
706
|
+
export { FormAuroraComponent };
|
707
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hdXJvcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZm9ybS1hdXJvcmEtc3RlZmFuaW5pLyIsInNvdXJjZXMiOlsibGliL0NvbXBvbmVudHMvZnJvbS1hdXJvcmEvZm9ybS1hdXJvcmEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQWdCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFDLGNBQWMsRUFBRSxzQkFBc0IsRUFBaUIsaUJBQWlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwSCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUVsQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFNaEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLHdEQUF3RDtBQUN4RCw2RUFBNkU7QUFDN0UseUVBQXlFO0FBRXpFOztHQUVHO0FBRUgsSUFBYSxhQUFhLEdBQTFCLE1BQWEsYUFBYyxTQUFRLGNBQXNCO0lBUnpELHdEQUF3RDtJQUN4RCw2RUFBNkU7SUFDN0UseUVBQXlFO0lBRXpFOztPQUVHO0lBQ0g7O1FBR1csY0FBUyxHQUFHLEdBQUcsQ0FBQztJQWtCM0IsQ0FBQztJQWhCQyxTQUFTLENBQUMsS0FBb0I7UUFDNUIsSUFBSSxLQUFLLEVBQUU7WUFDVCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENB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QUM7WUFDbEQsRUFBQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLHlCQUF5QixFQUFDO1lBQ3RFLEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBQztZQUM1RCxJQUFJO1NBQ0w7O0tBQ0YsQ0FBQztHQUNXLG1CQUFtQixDQXFrQi9CO1NBcmtCWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbmplY3RhYmxlLFxyXG4gIElucHV0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgT25Jbml0LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlclxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Zvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIE5nRm9ybSwgRm9ybSwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge0h0dHBDbGllbnR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbi8vIGltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHtOZ2JEYXRlQWRhcHRlciwgTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgTmdiRGF0ZVN0cnVjdCwgTmdiRGF0ZXBpY2tlckkxOG59IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBGaWxsIH0gZnJvbSAnLi4vLi4vTW9kZWxzL2ZpbGwnO1xyXG5pbXBvcnQgeyByZWdleFR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9yZWdleCc7XHJcbmltcG9ydCB7IENvbXBhbnkgfSBmcm9tICcuLi8uLi9Nb2RlbHMvY29tcGFueSc7XHJcbmltcG9ydCB7IFN0ZXAgfSBmcm9tICcuLi8uLi9Nb2RlbHMvc3RlcCc7XHJcbmltcG9ydCB7IENvbW1vbkRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcclxuXHJcblxyXG5cclxuXHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG4vLyBpbXBvcnQgeyByZWdleFR5cGUgfSBmcm9tIFwiQGFwcC9fc2hhcmVkL191dGlsL3JlZ2V4XCI7XHJcbi8vIGltcG9ydCB7IEV4dGVybmFsU2VydmljZSB9IGZyb20gJ0BhcHAvX3NoYXJlZC9fc2VydmljZXMvZXh0ZXJuYWwuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IEF1cm9yYVNlcnZpY2UgfSBmcm9tICdAYXBwL19zaGFyZWQvX3NlcnZpY2VzL2F1cm9yYS5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIFNlcnZpY2UgaGFuZGxlcyBob3cgdGhlIGRhdGUgaXMgcmVwcmVzZW50ZWQgaW4gc2NyaXB0cyBpLmUuIG5nTW9kZWwuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21BZGFwdGVyIGV4dGVuZHMgTmdiRGF0ZUFkYXB0ZXI8c3RyaW5nPiB7XHJcblxyXG4gIHJlYWRvbmx5IERFTElNSVRFUiA9ICcvJztcclxuXHJcbiAgZnJvbU1vZGVsKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogTmdiRGF0ZVN0cnVjdCB8IG51bGwge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdCh0aGlzLkRFTElNSVRFUik7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF5OiBwYXJzZUludChkYXRlWzBdLCAxMCksXHJcbiAgICAgICAgbW9udGg6IHBhcnNlSW50KGRhdGVbMV0sIDEwKSxcclxuICAgICAgICB5ZWFyOiBwYXJzZUludChkYXRlWzJdLCAxMClcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9Nb2RlbChkYXRlOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgLy9yZXR1cm4gZGF0ZSA/IGRhdGUuZGF5ICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLm1vbnRoICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLnllYXIgOiBudWxsO1xyXG4gICAgcmV0dXJuIGRhdGUgPyAoZGF0ZS5kYXkgPCAxMCA/IDAgKyBkYXRlLmRheSA6IGRhdGUuZGF5KSArIHRoaXMuREVMSU1JVEVSICsgKGRhdGUubW9udGggPCAxMCA/IDAgKyBkYXRlLm1vbnRoIDogZGF0ZS5tb250aCkgKyB0aGlzLkRFTElNSVRFUiArIGRhdGUueWVhciA6ICcnO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgU2VydmljZSBoYW5kbGVzIGhvdyB0aGUgZGF0ZSBpcyByZW5kZXJlZCBhbmQgcGFyc2VkIGZyb20ga2V5Ym9hcmQgaS5lLiBpbiB0aGUgYm91bmQgaW5wdXQgZmllbGQuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21EYXRlUGFyc2VyRm9ybWF0dGVyIGV4dGVuZHMgTmdiRGF0ZVBhcnNlckZvcm1hdHRlciB7XHJcblxyXG4gIHJlYWRvbmx5IERFTElNSVRFUiA9ICcvJztcclxuXHJcbiAgcGFyc2UodmFsdWU6IHN0cmluZyk6IE5nYkRhdGVTdHJ1Y3QgfCBudWxsIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQodGhpcy5ERUxJTUlURVIpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRheTogcGFyc2VJbnQoZGF0ZVswXSwgMTApLFxyXG4gICAgICAgIG1vbnRoOiBwYXJzZUludChkYXRlWzFdLCAxMCksXHJcbiAgICAgICAgeWVhcjogcGFyc2VJbnQoZGF0ZVsyXSwgMTApXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGZvcm1hdChkYXRlOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZGF0ZSA/IChkYXRlLmRheSA8IDEwID8gJzAnICsgZGF0ZS5kYXkgOiBkYXRlLmRheSkgKyB0aGlzLkRFTElNSVRFUiArIChkYXRlLm1vbnRoIDwgMTAgPyAnMCcgKyBkYXRlLm1vbnRoIDogZGF0ZS5tb250aCkgKyB0aGlzLkRFTElNSVRFUiArIGRhdGUueWVhciA6ICcnO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgSTE4Tl9WQUxVRVMgPSB7XHJcbiAgJ2VzJzoge1xyXG4gICAgd2Vla2RheXM6IFsnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU2EnLCAnRG8nXSxcclxuICAgIG1vbnRoczogWydFbmUnLCAnRmViJywgJ01hcicsICdBYnInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQWdvJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RpYyddLFxyXG4gICAgd2Vla0xhYmVsOiAnc2VtJ1xyXG4gIH1cclxuICAvLyBvdGhlciBsYW5ndWFnZXMgeW91IHdvdWxkIHN1cHBvcnRcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEkxOG4ge1xyXG4gIGxhbmd1YWdlID0gJ2VzJztcclxufVxyXG5cclxuLy8gRGVmaW5lIGN1c3RvbSBzZXJ2aWNlIHByb3ZpZGluZyB0aGUgbW9udGhzIGFuZCB3ZWVrZGF5cyB0cmFuc2xhdGlvbnNcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tRGF0ZXBpY2tlckkxOG4gZXh0ZW5kcyBOZ2JEYXRlcGlja2VySTE4biB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaTE4bjogSTE4bikge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldFdlZWtkYXlMYWJlbCh3ZWVrZGF5OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLndlZWtkYXlzW3dlZWtkYXkgLSAxXTtcclxuICB9XHJcblxyXG4gIGdldFdlZWtMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLndlZWtMYWJlbDtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoU2hvcnROYW1lKG1vbnRoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLm1vbnRoc1ttb250aCAtIDFdO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9udGhGdWxsTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldE1vbnRoU2hvcnROYW1lKG1vbnRoKTtcclxuICB9XHJcblxyXG4gIGdldERheUFyaWFMYWJlbChkYXRlOiBOZ2JEYXRlU3RydWN0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtkYXRlLmRheX0tJHtkYXRlLm1vbnRofS0ke2RhdGUueWVhcn1gO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2Vla2RheVNob3J0TmFtZSh3ZWVrZGF5OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLndlZWtkYXlzW3dlZWtkYXkgLSAxXTtcclxuICB9O1xyXG59XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItRm9ybUF1cm9yYScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tYXVyb3JhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWF1cm9yYS5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7cHJvdmlkZTogTmdiRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBDdXN0b21BZGFwdGVyfSxcclxuICAgIHtwcm92aWRlOiBOZ2JEYXRlUGFyc2VyRm9ybWF0dGVyLCB1c2VDbGFzczogQ3VzdG9tRGF0ZVBhcnNlckZvcm1hdHRlcn0sXHJcbiAgICB7cHJvdmlkZTogTmdiRGF0ZXBpY2tlckkxOG4sIHVzZUNsYXNzOiBDdXN0b21EYXRlcGlja2VySTE4bn0sXHJcbiAgICBJMThuXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUF1cm9yYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgXHJcbiAgQElucHV0KCkgZGF0YUNsYXNzQ3NzOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YUZvcm06IGFueTtcclxuICBASW5wdXQoKSBjbGlja1N1Ym1pdDogYW55O1xyXG4gIEBJbnB1dCgpIGRhdGFSZWxvYWRGb3JtOiBhbnk7XHJcbiAgQElucHV0KCkgd2VsY29tZVRpdGxlOiBhbnk7XHJcbiAgQElucHV0KCkgd2VsY29tZURlc2NyaXB0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgdXJsUGRmOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbmFtZUNvbXBhbnk6IHN0cmluZztcclxuICBASW5wdXQoKSBzY2hlZHVsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlzU2ltcGxlRmxvdzogYm9vbGVhbjsgIFxyXG4gIEBJbnB1dCgpIGNvbXBhbnk6IENvbXBhbnk7ICBcclxuICBASW5wdXQoKSBzdGVwczogU3RlcFtdOyAgICBcclxuICBAVmlld0NoaWxkKCdmb3JtRHluYW1pYycsIHsgc3RhdGljOiB0cnVlIH0pIGZvcm1EeW5hbWljOiBOZ0Zvcm07XHJcbiAgQE91dHB1dCgpIHJlc3BvbnNlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHN1bW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB2aWV3QXV0aERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgdGlwb2RvY051bURvYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9uU3VibWl0RXZlbnQ6IGFueSA9IGZhbHNlO1xyXG4gIGNvdW50U3VibWl0ID0gMDtcclxuICB3YXRjaFZhbGlkID0gZmFsc2U7XHJcbiAgd2F0Y2hSZXF1aXJlZCA9IGZhbHNlO1xyXG4gIGNhcHRjaGFWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRpc3BsYXlNb250aHMgPSAyO1xyXG4gIG5hdmlnYXRpb24gPSAnc2VsZWN0JztcclxuICBzaG93V2Vla051bWJlcnMgPSBmYWxzZTtcclxuICBvdXRzaWRlRGF5cyA9ICd2aXNpYmxlJztcclxuICByZXNwU2VydmljZVNlZ21lbnRhdGlvbjogYW55ID0gbnVsbDtcclxuICBiYXNlNjRDaGVja0F1dGhEYXRhIDogYW55ID0gdW5kZWZpbmVkO1xyXG5cclxuXHJcblxyXG5cclxuICAvL2VtYWlsUGF0dGVybiA9IFwiXlthLXowLTkuXyUrLV0rQFthLXowLTkuLV0rXFwuW2Etel17Miw0fSRcIjtcclxuXHJcbiAgdG9kYXkgPSBtb21lbnQobmV3IERhdGUoKSk7XHJcbiAgbWF4WWVhciA9IHRoaXMudG9kYXkueWVhcigpO1xyXG4gIG1pblllYXIgPSB0aGlzLnRvZGF5LnllYXIoKSAtIDgyO1xyXG4gIG1pbkRhdGUgPSB0aGlzLm1pblllYXIudG9TdHJpbmcoKSArICctJyArIHRoaXMudG9kYXkubW9udGgoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnLScgKyB0aGlzLnRvZGF5LmRhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7Ly8ge3llYXI6IHRoaXMubWluWWVhciwgbW9udGg6IHRoaXMudG9kYXkubW9udGgoKSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcbiAgbWF4RGF0ZSA9IHRoaXMubWF4WWVhci50b1N0cmluZygpICsgJy0nICsgKHRoaXMudG9kYXkubW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICctJyArIHRoaXMudG9kYXkuZGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTsvLyB7eWVhcjogdGhpcy5tYXhZZWFyLCBtb250aDogdGhpcy50b2RheS5tb250aCgpICsgMSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcblxyXG4gIC8vUmV2aXNhciB2YXJpYWJsZXNcclxuICByZWNoYXJnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluZGljYXRpdm86IHN0cmluZyA9IFwiNTdcIjtcclxuICBAVmlld0NoaWxkKFwibW9kYWxUdXJuc1wiLCB7IHN0YXRpYzogZmFsc2UgfSkgbXlNb2RhbDogRWxlbWVudFJlZjtcclxuICBmaWxsZGF0YTogRmlsbDtcclxuICBkZWZhdWx0RG9jVHlwZTogc3RyaW5nID0gXCJDw6lkdWxhIGRlIGNpdWRhZGFuw61hXCI7XHJcblxyXG4gIHBhdHRlcm5Ob3RWYWxpZERjdG86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwYXR0ZXJuTm90VmFsaWRDZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhOiBDb21tb25EYXRhU2VydmljZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1pbkRhdGUgPSBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhcnRDb21wb25lbnQoKTtcclxuICAgIH0sIDIwMDApO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXJ0Q29tcG9uZW50KCkge1xyXG4gICAgLy9vcmRlbmEgbG9zIGNhbXBvc1xyXG4gICAgaWYgKHRoaXMuZGF0YUZvcm0gIT0gbnVsbCAmJiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vU2FtZSByb3cgZmllbGRzXHJcbiAgICAgIHRoaXMudGlwb2RvY051bURvYyA9ICh0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29tZShxdWVzdGlvbiA9PiBxdWVzdGlvbi5xdWVzdGlvbi52YWx1ZSA9PT0gXCJ0aXBvRG9jXCIpICYmIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucy5zb21lKHF1ZXN0aW9uID0+IHF1ZXN0aW9uLnF1ZXN0aW9uLnZhbHVlID09PSBcIm51bWVyb0RvY1wiKSkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMgPSB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBleGlzdGNhcHRjaGEgPSB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCA9PSA2KTtcclxuXHJcbiAgICAgIGlmIChleGlzdGNhcHRjaGEubGVuZ3RoID09IDApIHtcclxuICAgICAgICB0aGlzLmNhcHRjaGFWYWxpZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMpIHtcclxuICAgICAgICBpZiAoaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPT0gbnVsbCB8fCBpdGVtLnF1ZXN0aW9uLm1heGxlbmd0aCA9PSB1bmRlZmluZWQgfHwgaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPSA1MjQyODg7IC8vZGVmYXVsdHZhbHVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXRlbS5xdWVzdGlvbi5taW5MZW5ndGggPT0gbnVsbCB8fCBpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YVJlbG9hZEZvcm0uZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgIHRoaXMuZmlsbGRhdGEgPSBlbGVtZW50O1xyXG5cclxuICAgICAgICAgIGlmICgoaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDIgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDEgfHxcclxuICAgICAgICAgICAgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDMpICYmICh0aGlzLmZpbGxkYXRhLmRhdGEgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICB0aGlzLmZpbGxkYXRhLmRhdGEgIT09IHVuZGVmaW5lZCkgJiYgaXRlbS5xdWVzdGlvbi5pZCA9PT0gdGhpcy5maWxsZGF0YS5pZCkge1xyXG4gICAgICAgICAgICBpdGVtLnF1ZXN0aW9uLnJlZ2lzdHJlZCA9IHRoaXMuZmlsbGRhdGEuZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucmVnaXN0cmVkID09IG51bGwgfHwgaXRlbS5xdWVzdGlvbi5taW5MZW5ndGggPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBpdGVtLnF1ZXN0aW9uLnJlZ2lzdHJlZCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmFuZ2UgPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2woKSxcclxuICAgIGVuZDogbmV3IEZvcm1Db250cm9sKCksXHJcbiAgfSk7XHJcblxyXG4gIHJlc29sdmVkQ2FwdGNoYShjYXB0Y2hhUmVzcG9uc2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5jYXB0Y2hhVmFsaWQgPSB0cnVlXHJcbiAgICBpZiAoIXRoaXMuZm9ybUR5bmFtaWMuZm9ybS52YWx1ZS5jYXB0Y2hhKSB7XHJcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHMuY2FwdGNoYS5zZXRWYWx1ZShjYXB0Y2hhUmVzcG9uc2UpXHJcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuZm9ybS52YWx1ZS5jYXB0Y2hhID0gY2FwdGNoYVJlc3BvbnNlXHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnRuSW5nXCIpLnN0eWxlLm9wYWNpdHkgPSAhdGhpcy5mb3JtRHluYW1pYy52YWxpZCA/IFwiMC42NVwiIDogXCIxXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0Zvcm1zXHJcbiAgLy9NZXRvZG8gcGFyYSBldml0YXIgZWwgcmVuZGVyIGRlIGxvcyBpdGVtcyBkZWwgZm9yXHJcbiAgcHVibGljIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyLCBvYmo6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVZhbGlkUGF0dGVyKGV2ZW50LCBxdWVzdGlvbikge1xyXG4gICAgaWYgKHF1ZXN0aW9uLnBhdHRlcm4gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICAgIGxldCBrZXl2YWxpZCA9IFs4LCAzMiwgMzcsIDM4LCAzOSwgNDAsIDQ2LCA5XTtcclxuICAgICAgLy9kaWZlcmVudGUgZGUgQmFja3BzYWNlXHJcbiAgICAgIC8vc2UgZGVqYSBjYXRjaCBwb3IgZXJyb3Igbm8gY29udHJvbGFibGUgZW4gb3RybyB0aWVtcG8gZGUgZWplY3VjaW9uXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKCFrZXl2YWxpZC5pbmNsdWRlcyhldmVudC5rZXlDb2RlKSkge1xyXG4gICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHF1ZXN0aW9uLnBhdHRlcm4pO1xyXG4gICAgICAgICAgdmFsaWQgPSByZWdleC50ZXN0KGV2ZW50LmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikgeyB9XHJcblxyXG4gICAgICByZXR1cm4gdmFsaWQ7XHJcbiAgICB9XHJcbiAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5kZXNjcmlwdGlvbiA9PT0gJ051bWJlcicpIHtcclxuICAgICAgICBpZiAocXVlc3Rpb24udmFsdWUgPT09ICdudW1lcm9Eb2MnKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlTnVtZXJvRG9jdW1lbnRvKHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbXCJudW1lcm9Eb2NcIl0udmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfWVsc2UgaWYgKHF1ZXN0aW9uLnZhbHVlID09PSAnY2VsdWxhcicpe1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUNlbHVsYXIodGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0udmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGFyXCIgKyBxdWVzdGlvbi52YWx1ZSkuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcclxuXHJcbiAgICAvL2lmIHRlbXBvcmFsIG1pZW50cmFzIHNlIG1pZ3JhbiB0b2RvcyBsb3MgdGlwb3MgZGUgY2FtcG9zIGFsIGZvcmVhY2hcclxuICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgIT0gMTEgJiYgcXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkICE9IDcpIHtcclxuICAgICAgaWYgKHRoaXMudmFsaWRNaW5MZW5ndGgodGhpcy5mb3JtRHluYW1pYywgcXVlc3Rpb24pKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocXVlc3Rpb24udmFsdWUpLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtbFwiICsgcXVlc3Rpb24udmFsdWUpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChxdWVzdGlvbi52YWx1ZSkuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNFNEU0RTRcIjtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1sXCIgKyBxdWVzdGlvbi52YWx1ZSkuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy52YWxpZE1heExlbmd0aCh0aGlzLmZvcm1EeW5hbWljLCBxdWVzdGlvbikpIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChxdWVzdGlvbi52YWx1ZSkuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm14bFwiICsgcXVlc3Rpb24udmFsdWUpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChxdWVzdGlvbi52YWx1ZSkuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNFNEU0RTRcIjtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm14bFwiICsgcXVlc3Rpb24udmFsdWUpLnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCBcInRydWVcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLmZvckVhY2goZm9ybVF1ZXN0aW9uID0+IHtcclxuICAgICAgc3dpdGNoIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkKSB7XHJcbiAgICAgICAgLy9zZSB2YWxpZGEgIGNhbXBvIGRlIHRpcG8gY2FsZW5kYXJpb1xyXG4gICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gNylcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vc2UgdmFsaWRhICBjYW1wbyBkZSB0aXBvIGVtYWlsXHJcbiAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMTEpXHJcbiAgICAgICAgICAgIHRoaXMuZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJidG5JbmdcIikuc3R5bGUub3BhY2l0eSA9ICF0aGlzLmZvcm1EeW5hbWljLnZhbGlkID8gXCIwLjY1XCIgOiBcIjFcIjtcclxuICB9XHJcblxyXG4gIHZhbGlkT25seVRleHQoZXZlbnQpIHtcclxuICAgIGxldCByZWdleCA9IC9eW2EtekEtWlxcdTAwQzAtXFx1MDE3Rl0rJC9nO1xyXG4gICAgaWYgKGV2ZW50LmNoYXJDb2RlID09IDMyKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xyXG5cclxuICAgIHJldHVybiB2YWxpZDtcclxuICB9XHJcblxyXG4gIHZhbGlkRGF0ZShldmVudCkge1xyXG4gICAgLypsZXQgcGF0dGVybiA9IC8oPzowWzEtOV18WzEyXVswLTldfDNbMDFdKVxcLyg/OjBbMS05XXwxWzAtMl0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xyXG4gICAgdmFsaWQgPSByZWdleC50ZXN0KGV2ZW50LmtleSk7XHJcbiAgICAqL1xyXG4gICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhldmVudC5rZXkpLm1hdGNoKHJlZ2V4VHlwZS5kYXRlLmV4cCk7XHJcbiAgICBsZXQgdmFsaWQgPSB0cnVlXHJcbiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbClcclxuICAgICAgdmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBhbGVydCh2YWxpZCk7XHJcblxyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG5cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlVmFsaWREYXRlKGV2ZW50KSB7XHJcblxyXG4gICAgLy9sZXQgcGF0dGVybiA9IC8oPzowWzEtOV18MVswLTJdKVxcLyg/OjBbMS05XXxbMTJdWzAtOV18M1swMV0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgbGV0IGRhdGVOID0gL1swLTldfFxcLy9cclxuICAgIGxldCB2YWxpZCA9IHRydWVcclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChkYXRlTik7XHJcbiAgICB2YWxpZCA9IHJlZ2V4LnRlc3QoZXZlbnQua2V5KTtcclxuICAgIHJldHVybiB2YWxpZDtcclxuXHJcbiAgfVxyXG5cclxuICByZWRpcmV0b3V0c2lkZShldmVudCwgcXVlc3Rpb24pIHtcclxuICAgIC8vc2UgZGVqYSBjYXRjaCBwb3IgZXJyb3Igbm8gY29udHJvbGFibGUgZW4gb3RybyB0aWVtcG8gZGUgZWplY3VjaW9uXHJcbiAgICB0cnkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB3aW5kb3cub3BlbihxdWVzdGlvbi52YWx1ZSwgXCJfYmxhbmtcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikgeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXRjaCBzdWJtaXQgZXZlbnQgZm9yIHZhbGlkYXRpb25zIGV4aXN0c1xyXG4gICAqIEBwYXJhbSBjaGFuZ2UgXHJcbiAgICovXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICB0aGlzLmNvdW50U3VibWl0KytcclxuICB9XHJcbiAgLy9vblN1Ym1pdChmb3JtOiBOZ0Zvcm0pIHtcclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGxldCBmb3JtID0gdGhpcy5mb3JtRHluYW1pYztcclxuICAgIHRoaXMud2F0Y2hWYWxpZCA9IHRydWU7XHJcbiAgICB0aGlzLndhdGNoUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChmb3JtLnZhbGlkKSB7XHJcbiAgICAgIGlmICghdGhpcy52YWxpZFJ1bGVzRmllbGRzKGZvcm0uY29udHJvbHNbXCJudW1lcm9Eb2NcIl0udmFsdWUudG9TdHJpbmcoKSwgZm9ybS5jb250cm9sc1tcImNlbHVsYXJcIl0udmFsdWUudG9TdHJpbmcoKSwgZm9ybS5jb250cm9sc1tcImVtYWlsXCJdLnZhbHVlKSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudmFsaWRNaW5sZW5naHRBbGxRdWVzdGlvbnMoZm9ybS52YWx1ZSkgJiYgdGhpcy52YWxpZE1heExlbmd0aEFsbFF1ZXN0aW9ucyhmb3JtLnZhbHVlKSAmJiBmb3JtLnZhbGlkKSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtLnVybFNlbmQgIT0gXCJcIiAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PGFueT4odGhpcy5kYXRhRm9ybS51cmxTZW5kLCBmb3JtLnZhbHVlKS5zdWJzY3JpYmUoKHJlc3ApID0+IHRoaXMucmVzcG9uc2UuZW1pdChyZXNwKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZm9ybS52YWxpZCAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuc3VtbWl0LmVtaXQoZm9ybS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZFBhcmFtQm9vbGVhbihwYXJhbXM6IGFueSwgaWRQYXJhbTogbnVtYmVyKSB7XHJcbiAgICBsZXQgc2hvd0Rlc2NyaXB0aW9uUGFyYW0gPSBwYXJhbXMuZmluZCgoeCkgPT4geC5pZCA9PSBpZFBhcmFtKTtcclxuICAgIHJldHVybiBzaG93RGVzY3JpcHRpb25QYXJhbSAhPSBudWxsICYmIHNob3dEZXNjcmlwdGlvblBhcmFtLnZhbHVlID09IFwidHJ1ZVwiO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRSdWxlc0ZpZWxkcyhudW1lcm9Eb2M6IFN0cmluZywgbnVtZXJvQ2VsOiBTdHJpbmcsIGVtYWlsOiBTdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIFZhbGlkYWNpb25lcyBwYXJhIGNlbHVsYXIgZW4gY2FzbyBkZSBpbmRpY2F0aXZvIGVuIENvbG9tYmlhXHJcbiAgICBsZXQgY2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGFyY2VsdWxhclwiKTtcclxuICAgIGxldCBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoYXJudW1lcm9Eb2NcIik7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaW5kaWNhdGl2byA9PSBcIis1N1wiIHx8IHRoaXMuaW5kaWNhdGl2byA9PSBcIjU3XCIpIHtcclxuICAgICAgbGV0IHN0cmluZ09yZGVuYWRvID0gdGhpcy5vcmRlclN0cmluZyhudW1lcm9Eb2MpO1xyXG4gICAgICBpZiAodGhpcy5uYW1lQ29tcGFueS50b1VwcGVyQ2FzZSgpICE9PSAnQ0xBUk8nKSB7Ly9jbGFybyBhY2VwdGEgbnJvIGNvbnNlY3V0aXZvc1xyXG4gICAgICAgIGlmIChudW1lcm9Eb2MgPT0gc3RyaW5nT3JkZW5hZG8pIHtcclxuICAgICAgICAgIGRvYy5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgICAgZG9jLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICAgIGRvYy50ZXh0Q29udGVudCA9IFwiRWwgbnVtZXJvIGRvY3VtZW50byBObyBkZWJlIGNvbnRlbmVyIGNhcmFjdGVyZXMgY29uc2VjdXRpdm9zXCI7XHJcbiAgICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBudW1lcm8gZG9jdW1lbnRvIE5vIGRlYmUgY29udGVuZXIgY2FyYWN0ZXJlcyBjb25zZWN1dGl2b3NcIjtcclxuICAgICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAobnVtZXJvQ2VsLnN1YnN0cmluZygwLCAxKSAhPSBcIjNcIikge1xyXG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgIGNlbC5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XHJcbiAgICAgICAgY2VsLnRleHRDb250ZW50ID0gXCJFbCBwcmltZXIgY2Fyw6FjdGVyIGRlbCBjZWx1bGFyIGRlYmUgc2VyIDNcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciAzXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLypcclxuICAgICAgaWYgKHBhcnNlSW50KG51bWVyb0NlbC5zdWJzdHJpbmcoMCwgMykpID4gMzUwKSB7XHJcbiAgICAgICAgY2VsLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgY2VsLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSBcIkVsIHByZWZpam8gZGVsIGNlbHVsYXIgbm8gZGViZSBzZXIgbWF5b3IgYSAzNTBcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBwcmVmaWpvIGRlbCBjZWx1bGFyIG5vIGRlYmUgc2VyIG1heW9yIGEgMzUwXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgKi9cclxuICAgICAgLy9FbiBjYXNvIGRlIHF1ZSBlbCBuw7ptZXJvIHNlIHJlcGl0YSwgZWplbXBsbyAzMzMzMzMzM1xyXG4gICAgICBsZXQgbGlzdG51bWJlciA9IG51bWVyb0RvYy5zdWJzdHJpbmcoMCwgMSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBudW1lcm9Eb2MubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgbGlzdG51bWJlciA9IGxpc3RudW1iZXIgKyBudW1lcm9Eb2Muc3Vic3RyaW5nKDAsIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobnVtZXJvRG9jID09IGxpc3RudW1iZXIpIHtcclxuICAgICAgICBkb2Muc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcclxuICAgICAgICBkb2MucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgIGRvYy50ZXh0Q29udGVudCA9IFwiQ2FyYWN0ZXJlcyBudW3DqXJpY29zIG5vIHNlIHB1ZWRlbiByZXBldGlyc2UgZGUgbWFuZXJhIGNvbnRpbnVhIFwiO1xyXG4gICAgICAgIHZhbE9rID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJDYXJhY3RlcmVzIG51bcOpcmljb3Mgbm8gc2UgcHVlZGVuIHJlcGV0aXJzZSBkZSBtYW5lcmEgY29udGludWEgXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlTnVtZXJvRG9jdW1lbnRvKG51bWVyb0RvYykpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlQ2VsdWxhcihudW1lcm9DZWwpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gRW4gY2FzbyBkZSBxdWUgZWwgbsO6bWVybyBzZSByZXBpdGEsIGVqZW1wbG8gMzMzMzMzMzNcclxuICAgICAgbGV0IGFycmF5UGhvbmVSZXBlYXQgPSBBcnJheS5mcm9tKFN0cmluZyhudW1lcm9DZWwpLCBOdW1iZXIpO1xyXG4gICAgICBsZXQgYXJyYXlQaG9uZU91dFJlcGVhdCA9IFsuLi5uZXcgU2V0KGFycmF5UGhvbmVSZXBlYXQpXTtcclxuICAgICAgaWYgKGFycmF5UGhvbmVPdXRSZXBlYXQubGVuZ3RoID09IDEpIHtcclxuICAgICAgICBjZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcclxuICAgICAgICBjZWwucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgIGNlbC50ZXh0Q29udGVudCA9IFwiRWwgbsO6bWVybyBxdWUgaW5ncmVzYSBubyBlcyB2YWxpZG9cIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBuw7ptZXJvIHF1ZSBpbmdyZXNhIG5vIGVzIHZhbGlkb1wiO1xyXG4gICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5kaWNhdGl2byA9PSBcIis1OTNcIiB8fCB0aGlzLmluZGljYXRpdm8gPT0gXCI1OTNcIikge1xyXG4gICAgICBpZiAobnVtZXJvQ2VsLnN1YnN0cmluZygwLCAxKSAhPSBcIjlcIikge1xyXG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgIGNlbC5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XHJcbiAgICAgICAgY2VsLnRleHRDb250ZW50ID0gXCJFbCBwcmltZXIgY2Fyw6FjdGVyIGRlbCBjZWx1bGFyIGRlYmUgc2VyIDlcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBwcmltZXIgY2Fyw6FjdGVyIGRlbCBjZWx1bGFyIGRlYmUgc2VyIDlcIjtcclxuICAgICAgICAvL3JldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9zZSB2YWxpZGFuIGxvcyBjYW1wb3MgcG9yIHRpcG8gZGUgY2FtcG8geSBubyBwb3IgdmFsdWVcclxuICAgIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucy5mb3JFYWNoKGZvcm1RdWVzdGlvbiA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCkge1xyXG4gICAgICAgIC8vc2UgdmFsaWRhICBjYW1wbyBkZSB0aXBvIGVtYWlsXHJcbiAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgIHZhbE9rID0gdGhpcy5lbWFpbFJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdmFsT2s7XHJcbiAgfVxyXG5cclxuICBvcmRlclN0cmluZyh2YWx1ZTogU3RyaW5nKSB7XHJcbiAgICBsZXQgYXJyYXlOdW1iZXIgPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgYXJyYXlOdW1iZXIucHVzaChwYXJzZUludCh2YWx1ZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpKTtcclxuICAgIH1cclxuICAgIC8vb3JkZW5hIGVsIGFycmF5XHJcbiAgICBhcnJheU51bWJlci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgIHJldHVybiBhIC0gYjtcclxuICAgIH0pO1xyXG4gICAgbGV0IG51bWJlck9yZGVyID0gXCJcIjtcclxuICAgIG51bWJlck9yZGVyID0gYXJyYXlOdW1iZXJbMF07XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgYXJyYXlOdW1iZXIubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIG51bWJlck9yZGVyID0gbnVtYmVyT3JkZXIgKyAoYXJyYXlOdW1iZXJbMF0gKyBpbmRleCkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudW1iZXJPcmRlcjtcclxuICB9XHJcblxyXG4gIHZhbGlkTWlubGVuZ2h0QWxsUXVlc3Rpb25zKGZvcm06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucykge1xyXG4gICAgICBpZiAoaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMSB8fCBpdGVtLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCA9PSAyKSB7XHJcbiAgICAgICAgbGV0IG1pbkxlbmd0aCA9IHBhcnNlSW50KGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoKTtcclxuICAgICAgICBsZXQgZm9ybVZhbHVlTGVuZ3RoID0gcGFyc2VJbnQoZm9ybVtpdGVtLnF1ZXN0aW9uLnZhbHVlXS50b1N0cmluZygpLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKG1pbkxlbmd0aCA+IDAgJiYgZm9ybVZhbHVlTGVuZ3RoICE9IG1pbkxlbmd0aCAmJiBmb3JtVmFsdWVMZW5ndGggPCBtaW5MZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZE1heExlbmd0aEFsbFF1ZXN0aW9ucyhmb3JtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMpIHtcclxuICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDEgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMikge1xyXG4gICAgICAgIGxldCBtYXhMZW5ndGggPSBwYXJzZUludChpdGVtLnF1ZXN0aW9uLm1heExlbmd0aCk7XHJcbiAgICAgICAgbGV0IGZvcm1WYWx1ZUxlbmd0aCA9IHBhcnNlSW50KGZvcm1baXRlbS5xdWVzdGlvbi52YWx1ZV0udG9TdHJpbmcoKS5sZW5ndGgpO1xyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPiAwICYmIGZvcm1WYWx1ZUxlbmd0aCAhPSBtYXhMZW5ndGggJiYgZm9ybVZhbHVlTGVuZ3RoID4gbWF4TGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRSZXF1aXJlZChmb3JtOiBOZ0Zvcm0sIHF1ZXN0aW9uKTogQm9vbGVhbiB7XHJcbiAgICAvL3NlIGRlamEgY2F0Y2ggcG9yIGVycm9yIG5vIGNvbnRyb2xhYmxlIGVuIG90cm8gdGllbXBvIGRlIGVqZWN1Y2lvblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHF1ZXN0aW9uICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXSAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgIGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLmVycm9ycyAhPSBudWxsICYmXHJcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5lcnJvcnMucmVxdWlyZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNaW5MZW5ndGgoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm1pbkxlbmd0aCA+IGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnZhbHVlLnRvTG9jYWxlU3RyaW5nKCkubGVuZ3RoICYmIHF1ZXN0aW9uLm1pbkxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNYXhMZW5ndGgoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm1heExlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5tYXhMZW5ndGggKyAxIDw9IGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwuL2csICcnKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5oYXNFcnJvcignZXJyb3JNYXhMZW5ndGgnKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnNldEVycm9ycyh7ICdlcnJvck1heExlbmd0aCc6IHRydWUgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHR5Y1NlbGVjdGlvbihldmVudCkge1xyXG4gICAgIHRoaXMudmlld0F1dGhEYXRhLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb3BlbkxhYmVsVXJsKGV2ZW50LCBxdWVzdGlvbikge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgbGV0IHR5YyA9IDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hlY2tcIiArIHF1ZXN0aW9uLmlkKTtcclxuICAgIHR5Yy5zdHlsZS5jb2xvciA9IFwiI0EzQUQzMlwiO1xyXG4gICAgd2luZG93Lm9wZW4ocXVlc3Rpb24udXJsbGFiZWwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsbEtleXByZXNzKCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBlbWFpbFJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKSB7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgbGV0IGVtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCk7XHJcbiAgICAgIGxldCBlbWFpbCA9IGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5yZWdpc3RyZWQ7XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnJlcXVpcmVkICYmIChlbWFpbCA9PSBcIlwiIHx8IGVtYWlsID09IHVuZGVmaW5lZCB8fCBlbWFpbCA9PSBudWxsKSkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgICBlbWwudGV4dENvbnRlbnQgPSBcIkVsIGNvcnJlY28gZWzDqWN0cm9uaWNvIGVzIHJlcXVlcmlkb1wiO1xyXG4gICAgICAgICAgZW1sLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAodGhpcy52YWxpZE1pbkxlbmd0aCh1bmRlZmluZWQsIGZvcm1RdWVzdGlvbi5xdWVzdGlvbikpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgICAgZW1sLnRleHRDb250ZW50ID0gXCJEZWJlIHNlciBtw61uaW1vIGRlIFwiICsgZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLm1pbkxlbmd0aCArIFwiIGNhcmFjdGVyZXNcIjtcclxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFoYXNFcnJvcikge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbGlkTWF4TGVuZ3RoKHVuZGVmaW5lZCwgZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uKSkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgICBlbWwudGV4dENvbnRlbnQgPSBcIkRlYmUgc2VyIG1heGltbyBkZSBcIiArIGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5tYXhMZW5ndGggKyBcIiBjYXJhY3RlcmVzXCI7XHJcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtUXVlc3Rpb24ucXVlc3Rpb24uaWQpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhlbWFpbCkubWF0Y2gocmVnZXhUeXBlLmVtYWlsLmV4cCk7XHJcbiAgICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgICBlbWwudGV4dENvbnRlbnQgPSBcIlR1IGVtYWlsIGVzIGludmFsaWRvXCI7XHJcbiAgICAgICAgICBlbWwucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxPaztcclxuICB9XHJcblxyXG4gIGNhbGVuZGFyUnVsZXNWYWxpZGF0ZShmb3JtUXVlc3Rpb24pIHtcclxuICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKS5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICBsZXQgZWNhbGVuZGFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKTtcclxuICAgICAgLy9zZSB2YWxpZGEgcXVlIG5vIHNlYSBudWxsIHNpIGVzIHJlcXVlcmlkb1xyXG4gICAgICBsZXQgZGF0ZSA9IGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5yZWdpc3RyZWQ7XHJcbiAgICAgIGlmIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVxdWlyZWQgJiYgKGRhdGUgPT0gXCJcIiB8fCBkYXRlID09IHVuZGVmaW5lZCB8fCBkYXRlID09IG51bGwpKSB7XHJcbiAgICAgICAgZWNhbGVuZGFyLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgZWNhbGVuZGFyLnRleHRDb250ZW50ID0gXCJMYSBmZWNoYSBlcyByZXF1ZXJpZGFcIjtcclxuICAgICAgICBlY2FsZW5kYXIucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlTm90U3BhY2UoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5jaGFyQ29kZSA9PSAzMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgdmFsaWRhdGVOdW1lcm9Eb2N1bWVudG8obnVtZXJvRG9jOiBTdHJpbmcpIHtcclxuICAgIGlmICghbnVtZXJvRG9jLm1hdGNoKFwiXlswLTldKiRcIikpIHtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcIm51bWVyb0RvY1wiXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSokJyldKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcIm51bWVyb0RvY1wiXS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wibnVtZXJvRG9jXCJdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcIm51bWVyb0RvY1wiXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMucGF0dGVybk5vdFZhbGlkRGN0byA9IHRydWU7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMucGF0dGVybk5vdFZhbGlkRGN0byA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHZhbGlkYXRlQ2VsdWxhcihudW1lcm9DZWw6IFN0cmluZykge1xyXG4gICAgaWYgKCFudW1lcm9DZWwubWF0Y2goXCJeWzAtOV0qJFwiKSkge1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wiY2VsdWxhclwiXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSokJyldKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wiY2VsdWxhclwiXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMucGF0dGVybk5vdFZhbGlkQ2VsID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYXR0ZXJuTm90VmFsaWRDZWwgPSBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gXHJcblxyXG4gIG9ua2V5cHJlc3MoZXZlbnQpXHJcbiAge1xyXG4gICAgcmV0dXJuIChldmVudC5jaGFyQ29kZSA9PSAwKSA/IG51bGwgOiBldmVudC5jaGFyQ29kZSA+PSA0OCAmJiBldmVudC5jaGFyQ29kZSA8PSA1N1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VTdGVwKHN0ZXA6IFN0ZXAsIG5leHRTdGVwOiBTdGVwLCB2YWx1ZSkge1xyXG4gICAgaWYgKG5leHRTdGVwICYmIG5leHRTdGVwLnN0ZXBPcmRlciAhPSAxKSB7XHJcbiAgICAgIHRoaXMucmVzZXRGaWVsZChzdGVwKTtcclxuICAgICAgbmV4dFN0ZXAudmlld0RhdGEgPSBbXTtcclxuICAgICAgbmV4dFN0ZXAudmlld0RhdGEgPSBuZXh0U3RlcC5zdGVwRGF0YS5maWx0ZXIoeCA9PiB4LnJlbGF0aW9uYWxJZHMuaW5jbHVkZXMoTnVtYmVyKHZhbHVlKSkpO1xyXG4gICAgICBcclxuICAgIH1cclxuICB9ICBcclxuICByZXNldEZpZWxkKHN0ZXBJbiA6IFN0ZXApIHtcclxuICAgIHRoaXMuc3RlcHMuZm9yRWFjaChzdGVwID0+IHtcclxuICAgICAgaWYgKHN0ZXAuc3RlcE9yZGVyID4gc3RlcEluLnN0ZXBPcmRlcikge1xyXG4gICAgICAgIHN0ZXAudmlld0RhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgc3RlcC52YWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|