@senior-gestao-empresarial/angular-components 8.1.0 → 8.1.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.
- package/esm2022/lookups/lib/entities/erpx-cpl-itr-dere/competencia-lookup.mjs +10 -12
- package/esm2022/lookups/lib/erp-lookups.mjs +130 -7
- package/fesm2022/senior-gestao-empresarial-angular-components-lookups.mjs +138 -17
- package/fesm2022/senior-gestao-empresarial-angular-components-lookups.mjs.map +1 -1
- package/lookups/lib/erp-lookups.d.ts +35 -0
- package/package.json +1 -1
|
@@ -5,18 +5,13 @@ import { getOptionsFromEnum } from '../../enum-options.util';
|
|
|
5
5
|
import { ErpLookups } from '../../erp-lookups';
|
|
6
6
|
import { ErpLookupsService } from '../../erp-lookups.service';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
|
+
/**
|
|
9
|
+
* A competência é sempre consultada no escopo de uma empresa — via
|
|
10
|
+
* `entityDependency` de `e070empDere` — então código e nome fantasia da
|
|
11
|
+
* empresa ficam fora do lookup: seriam a mesma informação repetida em toda
|
|
12
|
+
* linha da grid e em todo item do autocomplete.
|
|
13
|
+
*/
|
|
8
14
|
const lookupFields = [
|
|
9
|
-
{
|
|
10
|
-
name: 'e070empDere.e070emp.codEmp',
|
|
11
|
-
type: 'integer',
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
name: 'e070empDere.e070emp.sigEmp',
|
|
15
|
-
type: 'string',
|
|
16
|
-
},
|
|
17
|
-
];
|
|
18
|
-
const searchFields = ({ translateService, }) => [
|
|
19
|
-
...lookupFields,
|
|
20
15
|
{
|
|
21
16
|
name: 'competencia',
|
|
22
17
|
type: 'date',
|
|
@@ -27,6 +22,9 @@ const searchFields = ({ translateService, }) => [
|
|
|
27
22
|
// de mês/ano é definido aqui e não em `dateFormat`.
|
|
28
23
|
calendarLocaleOptions: { dateFormat: 'mm/yy' },
|
|
29
24
|
},
|
|
25
|
+
];
|
|
26
|
+
const searchFields = ({ translateService, }) => [
|
|
27
|
+
...lookupFields,
|
|
30
28
|
{
|
|
31
29
|
name: 'situacao',
|
|
32
30
|
type: 'enum',
|
|
@@ -48,4 +46,4 @@ export class CompetenciaLookup extends ErpLookups {
|
|
|
48
46
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CompetenciaLookup, decorators: [{
|
|
49
47
|
type: Injectable
|
|
50
48
|
}], ctorParameters: () => [] });
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGV0ZW5jaWEtbG9va3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc25yLWVycHgtYW5ndWxhci1jb21wb25lbnRzL2xvb2t1cHMvc3JjL2xpYi9lbnRpdGllcy9lcnB4LWNwbC1pdHItZGVyZS9jb21wZXRlbmNpYS1sb29rdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDL0csT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUc5RDs7Ozs7R0FLRztBQUNILE1BQU0sWUFBWSxHQUFrQjtJQUNoQztRQUNJLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLE9BQU87UUFDYixTQUFTLEVBQUUsSUFBSTtRQUNmLHlFQUF5RTtRQUN6RSw2RUFBNkU7UUFDN0Usb0RBQW9EO1FBQ3BELHFCQUFxQixFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRTtLQUNqRDtDQUNKLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLEVBQ2xCLGdCQUFnQixHQUduQixFQUFpQixFQUFFLENBQUM7SUFDakIsR0FBRyxZQUFZO0lBQ2Y7UUFDSSxJQUFJLEVBQUUsVUFBVTtRQUNoQixJQUFJLEVBQUUsTUFBTTtRQUNaLFNBQVMsRUFBRSxJQUFJO1FBQ2YsT0FBTyxFQUFFLGtCQUFrQixDQUN2QixnQkFBZ0IsRUFDaEIsOENBQThDLEVBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FDekM7S0FDSjtDQUNKLENBQUM7QUFHRixNQUFNLE9BQU8saUJBQWtCLFNBQVEsVUFBVTtJQUk3QztRQUNJLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbEQsS0FBSyxDQUNELGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQ2xDLFlBQVksQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFDbEMsY0FBYyxFQUNkLE1BQU0sQ0FDVCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7K0dBcEJRLGlCQUFpQjttSEFBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHsgRW51bVNpdHVhY2FvQ29tcGV0ZW5jaWEgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2VycHgtY3BsLWl0ci1kZXJlLWJhY2tlbmQvZW51bS1zaXR1YWNhby1jb21wZXRlbmNpYSc7XG5pbXBvcnQgeyBnZXRPcHRpb25zRnJvbUVudW0gfSBmcm9tICcuLi8uLi9lbnVtLW9wdGlvbnMudXRpbCc7XG5pbXBvcnQgeyBFcnBMb29rdXBzIH0gZnJvbSAnLi4vLi4vZXJwLWxvb2t1cHMnO1xuaW1wb3J0IHsgRXJwTG9va3Vwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9lcnAtbG9va3Vwcy5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNUeXBlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9keW5hbWljLWZvcm0nO1xuXG4vKipcbiAqIEEgY29tcGV0w6puY2lhIMOpIHNlbXByZSBjb25zdWx0YWRhIG5vIGVzY29wbyBkZSB1bWEgZW1wcmVzYSDigJQgdmlhXG4gKiBgZW50aXR5RGVwZW5kZW5jeWAgZGUgYGUwNzBlbXBEZXJlYCDigJQgZW50w6NvIGPDs2RpZ28gZSBub21lIGZhbnRhc2lhIGRhXG4gKiBlbXByZXNhIGZpY2FtIGZvcmEgZG8gbG9va3VwOiBzZXJpYW0gYSBtZXNtYSBpbmZvcm1hw6fDo28gcmVwZXRpZGEgZW0gdG9kYVxuICogbGluaGEgZGEgZ3JpZCBlIGVtIHRvZG8gaXRlbSBkbyBhdXRvY29tcGxldGUuXG4gKi9cbmNvbnN0IGxvb2t1cEZpZWxkczogRHluYW1pY1R5cGVbXSA9IFtcbiAgICB7XG4gICAgICAgIG5hbWU6ICdjb21wZXRlbmNpYScsXG4gICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgdmlldzogJ21vbnRoJyxcbiAgICAgICAgc2hvd0NsZWFyOiB0cnVlLFxuICAgICAgICAvLyBBIGdyaWQgZGEgbW9kYWwgZGUgbGlzdGFnZW0gZm9ybWF0YSBjb2x1bmFzIGRlIGRhdGEgYXBlbmFzIGEgcGFydGlyIGRlXG4gICAgICAgIC8vIGBjYWxlbmRhckxvY2FsZU9wdGlvbnMuZGF0ZUZvcm1hdGAgKHBhZHLDo28gYGRkL21tL3l5YCksIHBvciBpc3NvIG8gZm9ybWF0b1xuICAgICAgICAvLyBkZSBtw6pzL2FubyDDqSBkZWZpbmlkbyBhcXVpIGUgbsOjbyBlbSBgZGF0ZUZvcm1hdGAuXG4gICAgICAgIGNhbGVuZGFyTG9jYWxlT3B0aW9uczogeyBkYXRlRm9ybWF0OiAnbW0veXknIH0sXG4gICAgfSxcbl07XG5cbmNvbnN0IHNlYXJjaEZpZWxkcyA9ICh7XG4gICAgdHJhbnNsYXRlU2VydmljZSxcbn06IHtcbiAgICB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlO1xufSk6IER5bmFtaWNUeXBlW10gPT4gW1xuICAgIC4uLmxvb2t1cEZpZWxkcyxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdzaXR1YWNhbycsXG4gICAgICAgIHR5cGU6ICdlbnVtJyxcbiAgICAgICAgc2hvd0NsZWFyOiB0cnVlLFxuICAgICAgICBvcHRpb25zOiBnZXRPcHRpb25zRnJvbUVudW0oXG4gICAgICAgICAgICB0cmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgJ2VycHhfY3BsX2l0ci5kZXJlLmVudW1fc2l0dWFjYW9fY29tcGV0ZW5jaWFfJyxcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoRW51bVNpdHVhY2FvQ29tcGV0ZW5jaWEpXG4gICAgICAgICksXG4gICAgfSxcbl07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21wZXRlbmNpYUxvb2t1cCBleHRlbmRzIEVycExvb2t1cHMge1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBsb29rdXBTZXJ2aWNlOiBFcnBMb29rdXBzU2VydmljZTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgbG9va3VwU2VydmljZSA9IGluamVjdChFcnBMb29rdXBzU2VydmljZSk7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBsb29rdXBTZXJ2aWNlLFxuICAgICAgICAgICAgdHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICdjb21wZXRlbmNpYScsXG4gICAgICAgICAgICBsb29rdXBGaWVsZHMsXG4gICAgICAgICAgICBzZWFyY2hGaWVsZHMoeyB0cmFuc2xhdGVTZXJ2aWNlIH0pLFxuICAgICAgICAgICAgc2VhcmNoRmllbGRzKHsgdHJhbnNsYXRlU2VydmljZSB9KSxcbiAgICAgICAgICAgICdlcnB4X2NwbF9pdHInLFxuICAgICAgICAgICAgJ2RlcmUnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9va3VwU2VydmljZSA9IGxvb2t1cFNlcnZpY2U7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZSA9IHRyYW5zbGF0ZVNlcnZpY2U7XG4gICAgfVxufVxuIl19
|
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import moment from 'moment';
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
3
|
import { map, takeUntil } from 'rxjs/operators';
|
|
4
|
+
/** Formato de data esperado pela consulta */
|
|
5
|
+
const QUERY_DATE_FORMAT = 'YYYY-MM-DD';
|
|
6
|
+
/**
|
|
7
|
+
* Equivalente em moment de cada token do dialeto legado (PrimeNG) usado por
|
|
8
|
+
* `calendarLocaleOptions.dateFormat` — é o mesmo dialeto que
|
|
9
|
+
* `convertToMomentDateFormat` (`@seniorsistemas/angular-components/table`)
|
|
10
|
+
* converte para formatar colunas de data na grid a partir dessa propriedade.
|
|
11
|
+
*/
|
|
12
|
+
const LEGACY_CALENDAR_DATE_TOKENS = {
|
|
13
|
+
dd: 'DD',
|
|
14
|
+
d: 'D',
|
|
15
|
+
mm: 'MM',
|
|
16
|
+
m: 'M',
|
|
17
|
+
yy: 'YYYY',
|
|
18
|
+
y: 'YY',
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Equivalente em moment de cada token do dialeto nativo do `s-datepicker`,
|
|
22
|
+
* usado pela propriedade `dateFormat` (a que o `CalendarFieldComponent`
|
|
23
|
+
* repassa direto ao `s-datepicker`). Aqui `yy` é ano com 2 dígitos — ao
|
|
24
|
+
* contrário do dialeto do PrimeNG, onde `yy` tem 4 dígitos.
|
|
25
|
+
*/
|
|
26
|
+
const DATEPICKER_DATE_TOKENS = {
|
|
27
|
+
yyyy: 'YYYY',
|
|
28
|
+
yy: 'YY',
|
|
29
|
+
MM: 'MM',
|
|
30
|
+
mm: 'MM',
|
|
31
|
+
dd: 'DD',
|
|
32
|
+
d: 'D',
|
|
33
|
+
};
|
|
4
34
|
/** Filter System Query Option - Operators supported in the expression language */
|
|
5
35
|
export var EnumLogicalOperator;
|
|
6
36
|
(function (EnumLogicalOperator) {
|
|
@@ -167,6 +197,9 @@ export class ErpLookups {
|
|
|
167
197
|
}
|
|
168
198
|
return `(${field.name} eq '${sanitizedValue}')`;
|
|
169
199
|
}
|
|
200
|
+
if (field.type === 'date') {
|
|
201
|
+
return this.mountDateFilter(field, value);
|
|
202
|
+
}
|
|
170
203
|
return `(${field.name} eq '${value}')`;
|
|
171
204
|
})
|
|
172
205
|
.filter((filter) => !!filter)
|
|
@@ -174,25 +207,39 @@ export class ErpLookups {
|
|
|
174
207
|
}
|
|
175
208
|
else {
|
|
176
209
|
filterQuery = lookupFields
|
|
177
|
-
.filter((field) => field.type === 'string')
|
|
178
210
|
.map((field) => {
|
|
179
|
-
|
|
211
|
+
if (field.type === 'string') {
|
|
212
|
+
return `(containing(lower(${field.name}), lower('${value.replace(/\\/g, '').replace(/'/g, "\\'")}')))`;
|
|
213
|
+
}
|
|
214
|
+
if (field.type === 'date') {
|
|
215
|
+
return this.mountDateFilter(field, value);
|
|
216
|
+
}
|
|
217
|
+
return null;
|
|
180
218
|
})
|
|
219
|
+
.filter((filter) => !!filter)
|
|
181
220
|
.join(' or ');
|
|
182
221
|
}
|
|
183
222
|
const defaultFilterQuery = this.mountDefaultFilter(defaultFilter);
|
|
223
|
+
/**
|
|
224
|
+
* Sem nenhum campo consultável para o texto digitado o filtro do texto
|
|
225
|
+
* é omitido: um grupo vazio (`()`) é rejeitado pelo backend com 500.
|
|
226
|
+
*/
|
|
184
227
|
if (defaultFilterQuery) {
|
|
185
|
-
filterQuery =
|
|
228
|
+
filterQuery = filterQuery
|
|
229
|
+
? `((${defaultFilterQuery}) and (${filterQuery}))`
|
|
230
|
+
: `(${defaultFilterQuery})`;
|
|
186
231
|
}
|
|
187
232
|
else {
|
|
188
|
-
filterQuery = '(' + filterQuery + ')';
|
|
233
|
+
filterQuery = filterQuery ? '(' + filterQuery + ')' : '';
|
|
189
234
|
}
|
|
190
235
|
const dynamicFilterQuery = this.mountDynamicFilter(dynamicFilter);
|
|
191
236
|
if (dynamicFilterQuery) {
|
|
192
|
-
filterQuery =
|
|
237
|
+
filterQuery = filterQuery
|
|
238
|
+
? `((${dynamicFilterQuery}) and (${filterQuery}))`
|
|
239
|
+
: `(${dynamicFilterQuery})`;
|
|
193
240
|
}
|
|
194
241
|
else {
|
|
195
|
-
filterQuery = '(' + filterQuery + ')';
|
|
242
|
+
filterQuery = filterQuery ? '(' + filterQuery + ')' : '';
|
|
196
243
|
}
|
|
197
244
|
return filterQuery;
|
|
198
245
|
}
|
|
@@ -438,6 +485,82 @@ export class ErpLookups {
|
|
|
438
485
|
})
|
|
439
486
|
.join(' - ');
|
|
440
487
|
}
|
|
488
|
+
/**
|
|
489
|
+
* Filtro de um campo de data a partir do texto digitado no autocomplete.
|
|
490
|
+
*
|
|
491
|
+
* Campo de data não aceita `containing`, então o texto só vira filtro
|
|
492
|
+
* quando é uma data válida no formato do próprio campo: `view: 'month'`
|
|
493
|
+
* lê mês/ano e consulta o mês inteiro; nos demais casos lê a data
|
|
494
|
+
* completa e consulta o dia. Texto que não é data devolve `null` e o
|
|
495
|
+
* campo fica de fora do filtro.
|
|
496
|
+
*/
|
|
497
|
+
mountDateFilter(field, value) {
|
|
498
|
+
const isMonthView = field.view === 'month';
|
|
499
|
+
const parsedValue = moment(value, this.dateFilterFormats(field, isMonthView), true);
|
|
500
|
+
if (!parsedValue.isValid()) {
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
if (isMonthView) {
|
|
504
|
+
const firstDay = parsedValue
|
|
505
|
+
.clone()
|
|
506
|
+
.startOf('month')
|
|
507
|
+
.format(QUERY_DATE_FORMAT);
|
|
508
|
+
const lastDay = parsedValue
|
|
509
|
+
.clone()
|
|
510
|
+
.endOf('month')
|
|
511
|
+
.format(QUERY_DATE_FORMAT);
|
|
512
|
+
return `(${field.name} ge '${firstDay}' and ${field.name} le '${lastDay}')`;
|
|
513
|
+
}
|
|
514
|
+
return `(${field.name} eq '${parsedValue.format(QUERY_DATE_FORMAT)}')`;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Formatos em que o texto digitado em um campo de data é interpretado.
|
|
518
|
+
*
|
|
519
|
+
* A ordem dos componentes e o separador vêm do locale do usuário — o
|
|
520
|
+
* `LocaleService` da plataforma aplica esse locale no moment, então
|
|
521
|
+
* `pt-BR` lê `dd/mm/aaaa` e `en-US` lê `mm/dd/aaaa`. Quando o campo
|
|
522
|
+
* define o próprio formato de exibição, ele tem prioridade: é o formato
|
|
523
|
+
* que o usuário vê no input — `dateFormat` no dialeto nativo do
|
|
524
|
+
* `s-datepicker`, ou `calendarLocaleOptions.dateFormat` (deprecated) no
|
|
525
|
+
* dialeto legado do PrimeNG. Cada formato também é aceito sem o zero à
|
|
526
|
+
* esquerda.
|
|
527
|
+
*/
|
|
528
|
+
dateFilterFormats(field, isMonthView) {
|
|
529
|
+
const { dateFormat, calendarLocaleOptions } = field;
|
|
530
|
+
const fieldFormat = dateFormat
|
|
531
|
+
? this.fromDatepickerDateFormat(dateFormat)
|
|
532
|
+
: this.fromLegacyCalendarDateFormat(calendarLocaleOptions?.dateFormat);
|
|
533
|
+
const localeFormat = moment.localeData().longDateFormat('L');
|
|
534
|
+
const format = fieldFormat ??
|
|
535
|
+
(isMonthView ? this.withoutDayToken(localeFormat) : localeFormat);
|
|
536
|
+
const shortFormat = format.replace(/D+/g, 'D').replace(/M+/g, 'M');
|
|
537
|
+
return format === shortFormat ? [format] : [format, shortFormat];
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Converte o `dateFormat` nativo do `s-datepicker` (ex.: `dd/MM/yyyy`)
|
|
541
|
+
* para o equivalente em moment.
|
|
542
|
+
*/
|
|
543
|
+
fromDatepickerDateFormat(format) {
|
|
544
|
+
return format.replace(/yyyy|yy|MM|mm|dd|d/g, (token) => DATEPICKER_DATE_TOKENS[token]);
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Converte o `calendarLocaleOptions.dateFormat` legado (dialeto PrimeNG,
|
|
548
|
+
* ex.: `dd/mm/yy`) para o equivalente em moment.
|
|
549
|
+
*/
|
|
550
|
+
fromLegacyCalendarDateFormat(format) {
|
|
551
|
+
if (!format) {
|
|
552
|
+
return undefined;
|
|
553
|
+
}
|
|
554
|
+
return format.replace(/dd|d|mm|m|yy|y/g, (token) => LEGACY_CALENDAR_DATE_TOKENS[token]);
|
|
555
|
+
}
|
|
556
|
+
/** Remove o componente de dia de um formato de data */
|
|
557
|
+
withoutDayToken(format) {
|
|
558
|
+
const separator = format.replace(/[A-Za-z]/g, '')[0] ?? '/';
|
|
559
|
+
return format
|
|
560
|
+
.split(/[^A-Za-z]/)
|
|
561
|
+
.filter((token) => !/^D+$/.test(token))
|
|
562
|
+
.join(separator);
|
|
563
|
+
}
|
|
441
564
|
mountCustomFilter({ erpLookupsSearchField, filterData, }) {
|
|
442
565
|
const { erpLookupsFormField, name } = erpLookupsSearchField;
|
|
443
566
|
return `(${(erpLookupsFormField?.customFilters ?? [])
|
|
@@ -489,4 +612,4 @@ export class ErpLookups {
|
|
|
489
612
|
}
|
|
490
613
|
}
|
|
491
614
|
}
|
|
492
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLWxvb2t1cHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zbnItZXJweC1hbmd1bGFyLWNvbXBvbmVudHMvbG9va3Vwcy9zcmMvbGliL2VycC1sb29rdXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQVE1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFpQ2hELGtGQUFrRjtBQUNsRixNQUFNLENBQU4sSUFBWSxtQkF5Qlg7QUF6QkQsV0FBWSxtQkFBbUI7SUFDM0IsK0RBQStEO0lBQy9ELGdDQUFTLENBQUE7SUFDVCxrRUFBa0U7SUFDbEUsZ0NBQVMsQ0FBQTtJQUNULHVEQUF1RDtJQUN2RCxnQ0FBUyxDQUFBO0lBQ1QsZ0VBQWdFO0lBQ2hFLGdDQUFTLENBQUE7SUFDVCxtREFBbUQ7SUFDbkQsZ0NBQVMsQ0FBQTtJQUNULDZEQUE2RDtJQUM3RCxnQ0FBUyxDQUFBO0lBQ1Qsd0VBQXdFO0lBQ3hFLGtDQUFXLENBQUE7SUFDWCxxRUFBcUU7SUFDckUsZ0NBQVMsQ0FBQTtJQUNULCtFQUErRTtJQUMvRSxrQ0FBVyxDQUFBO0lBQ1gsbURBQW1EO0lBQ25ELGdDQUFTLENBQUE7SUFDVCxtRUFBbUU7SUFDbkUsdUNBQWdCLENBQUE7SUFDaEIsOEZBQThGO0lBQzlGLDhDQUF1QixDQUFBO0FBQzNCLENBQUMsRUF6QlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQXlCOUI7QUF1REQsTUFBTSxPQUFPLG1CQUFtQjtJQU81QixZQUNXLG1CQUVOLEVBQ0QsY0FBdUMsRUFBRTtRQUhsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBRXpCO1FBR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztD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QUFFLENBQUM7Z0JBQ3pDLE1BQU0sVUFBVSxHQUFHLE9BQWtDLENBQUM7Z0JBQ3RELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVM7b0JBQ2hDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO29CQUNqQixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDLEVBQUUsR0FBYyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FDbEIsR0FBNEIsRUFDNUIsSUFBWSxFQUNaLEtBQWM7UUFFZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBZ0IsRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUN6RCxJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxVQUFVLEdBQUcsT0FBa0MsQ0FBQztnQkFDdEQsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztvQkFDaEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7b0JBQ2pCLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEIsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUMsRUFBRSxHQUFjLENBQUMsQ0FBQztRQUNuQixJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDakQsTUFBa0MsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekQsQ0FBQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljVHlwZSxcbiAgICBMb29rdXBGaWVsZENvbmZpZyxcbn0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9keW5hbWljLWZvcm0nO1xuaW1wb3J0IHsgU29ydE1ldGEgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVycExvb2t1cHNTZXJ2aWNlIH0gZnJvbSAnLi9lcnAtbG9va3Vwcy5zZXJ2aWNlJztcblxuLyoqIEVudGlkYWRlcyBkZSBxdWUgZGVwZW5kZSAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlEZXBlbmRlbmN5IHtcbiAgICAvKiogTm9tZSBkYSBlbnRpZGFkZSBxdWUgZGVwZW5kZSAocGFpKSAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKiogQ2FtcG8gZGEgZW50aWRhZGUgcGFpIHF1ZSBzZXLDoSBjb21wYXJhZG8gKi9cbiAgICBmaWVsZD86IHN0cmluZztcbiAgICAvKiogVmFsb3IgZGEgZW50aWRhZGUgcGFpICovXG4gICAgdmFsdWU6ICgpID0+IHVua25vd247XG59XG5cbi8qKiBGaWx0cm8gcGFkcsOjbyBhcGxpY2FkbyBlbSB0b2RhcyByZXF1aXNpw6fDtWVzIGRhIGVudGlkYWRlLiBQb3IgcGFkcsOjbyBmaWx0cmEgcmVnaXN0cm9zIG7Do28gZXhjbHVpZG9zICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRGaWx0ZXIge1xuICAgIC8qKiBDYW1wbyBxdWUgc2Vyw6EgZmlsdHJhZG8gKi9cbiAgICBmaWVsZDogc3RyaW5nIHwgRGVmYXVsdEZpbHRlcjtcbiAgICAvKiogQ29tcGFyYcOnw6NvIHF1ZSBzZXLDoSBhcGxpY2FkYSBuYSBjb25zdWx0YSAqL1xuICAgIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yO1xuICAgIC8qKiBWYWxvcmVzIHF1ZSBzZXLDo28gYnVzY2Fkb3MgKi9cbiAgICB2YWx1ZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogRmlsdHJvIGRpbmFtaWNvIHBhcmEgY29uc3VsdGFzIG1haXMgY29tcGxleGFzICovXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNGaWx0ZXIge1xuICAgIC8qKiBDYW1wbyBxdWUgc2Vyw6EgZmlsdHJhZG8gKi9cbiAgICBmaWVsZDogKCkgPT4gc3RyaW5nO1xuICAgIC8qKiBDb21wYXJhw6fDo28gcXVlIHNlcsOhIGFwbGljYWRhIG5hIGNvbnN1bHRhICovXG4gICAgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3I7XG4gICAgLyoqIFZhbG9yZXMgcXVlIHNlcsOjbyBidXNjYWRvcyAqL1xuICAgIHZhbHVlOiAoKSA9PiB1bmtub3duO1xufVxuXG4vKiogRmlsdGVyIFN5c3RlbSBRdWVyeSBPcHRpb24gLSBPcGVyYXRvcnMgc3VwcG9ydGVkIGluIHRoZSBleHByZXNzaW9uIGxhbmd1YWdlICovXG5leHBvcnQgZW51bSBFbnVtTG9naWNhbE9wZXJhdG9yIHtcbiAgICAvKiogRXF1YWwgKEV4OiAvU3VwcGxpZXJzPyRmaWx0ZXI9QWRkcmVzcy9DaXR5IGVxICdSZWRtb25kJykgKi9cbiAgICBFcSA9ICdlcScsXG4gICAgLyoqIE5vdCBlcXVhbCAoRXg6IC9TdXBwbGllcnM/JGZpbHRlcj1BZGRyZXNzL0NpdHkgbmUgJ0xvbmRvbicpICovXG4gICAgTmUgPSAnbmUnLFxuICAgIC8qKiBHcmVhdGVyIHRoYW4gKEV4OiAvUHJvZHVjdHM/JGZpbHRlcj1QcmljZSBndCAyMCkgKi9cbiAgICBHdCA9ICdndCcsXG4gICAgLyoqIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPVByaWNlIGdlIDEwKSAqL1xuICAgIEdlID0gJ2dlJyxcbiAgICAvKiogTGVzcyB0aGFuIChFeDogL1Byb2R1Y3RzPyRmaWx0ZXI9UHJpY2UgbHQgMjApKi9cbiAgICBMdCA9ICdsdCcsXG4gICAgLyoqIExlc3MgdGhhbiBvciBlcXVhbCAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPVByaWNlIGxlIDEwMCkqL1xuICAgIExlID0gJ2xlJyxcbiAgICAvKiogTG9naWNhbCBhbmRcdCAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPVByaWNlIGxlIDIwMCBhbmQgUHJpY2UgZ3QgMy41KSovXG4gICAgQW5kID0gJ2FuZCcsXG4gICAgLyoqIExvZ2ljYWwgb3IgKEV4OiAvUHJvZHVjdHM/JGZpbHRlcj1QcmljZSBsZSAzLjUgb3IgUHJpY2UgZ3QgMjAwKSovXG4gICAgT3IgPSAnb3InLFxuICAgIC8qKiBMb2dpY2FsIG5lZ2F0aW9uIChFeDogL1Byb2R1Y3RzPyRmaWx0ZXI9bm90IGVuZHN3aXRoKERlc2NyaXB0aW9uLCdtaWxrJykpKi9cbiAgICBOb3QgPSAnbm90JyxcbiAgICAvKiogTG9naWNhbCBpcyAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPWlkIGlzIG51bGwgKi9cbiAgICBJcyA9ICdpcycsXG4gICAgLyoqIE5lZ2F0aW9uIG9mIGxvZ2ljYWwgaXMgKEV4OiAvUHJvZHVjdHM/JGZpbHRlcj1pZCBpcyBub3QgbnVsbCAqL1xuICAgIElzTm90ID0gJ2lzIG5vdCcsXG4gICAgLyoqIENvbnRhaW5zIHN0cmluZyB2YWx1ZSAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPWNvbnRhaW5pbmcobG93ZXIobmFtZSksIGxvd2VyKCdteSBuYW1lJykpKSAqL1xuICAgIENvbnRhaW5zID0gJ2NvbnRhaW5pbmcnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRPcHRpb25zIHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG9yZGVyOiBudW1iZXI7XG59XG5cbi8qKiBQYXLDom1ldHJvcyBwYXJhIGN1c3RvbWl6YcOnw7VlcyBkbyBsb29rdXAgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwT3B0aW9ucyB7XG4gICAgLyoqIE5vbWUgZGEgZW50aWRhZGUgKi9cbiAgICBlbnRpdHk/OiBzdHJpbmc7XG4gICAgLyoqIE5vbWUgZG8gZm9ybUdyb3VwICovXG4gICAgZm9ybUdyb3VwPzogc3RyaW5nO1xuICAgIC8qKiBGaWx0cm8gcGFkcsOjbyAqL1xuICAgIGRlZmF1bHRGaWx0ZXI/OiBEZWZhdWx0RmlsdGVyW107XG4gICAgLyoqIEZpbHRybyBkaW7Dom1pY28gKi9cbiAgICBkeW5hbWljRmlsdGVyPzogRHluYW1pY0ZpbHRlcltdO1xuICAgIC8qKiBDYW1wb3MgZG8gbG9va3VwIChhdXRvY29tcGxldGUpICovXG4gICAgbG9va3VwRmllbGRzPzogKER5bmFtaWNUeXBlIHwgRXJwTG9va3Vwc0Zvcm1GaWVsZClbXTtcbiAgICAvKiogQ2FtcG9zIHF1ZSBzZXLDo28gc29saWNpdGFkb3MgbmEgY29uc3VsdGEgKi9cbiAgICBxdWVyeUZpZWxkcz86IHN0cmluZ1tdO1xuICAgIC8qKiBDYW1wb3MgZXhpYmlkb3Mgbm8gZmlsdHJvIGRhIG1vZGFsIGRlIGxpc3RhZ2VtICovXG4gICAgc2VhcmNoRmllbGRzPzogKER5bmFtaWNUeXBlIHwgRXJwTG9va3Vwc0Zvcm1GaWVsZClbXTtcbiAgICAvKiogQ2FtcG9zIGV4aWJpZG9zIG5hIGdyaWQgZGEgbW9kYWwgZGUgbGlzdGFnZW0gKi9cbiAgICAvKiogRGVmaW5lIHNlIG8gbG9va3VwIHBlcm1pdGlyw6EgbXVsdGkgc2VsZcOnw6NvICovXG4gICAgc2VhcmNoR3JpZEZpZWxkcz86IChEeW5hbWljVHlwZSB8IEVycExvb2t1cHNGb3JtRmllbGQpW107XG4gICAgbXVsdGlwbGU/OiBib29sZWFuO1xuICAgIC8qKiBFbnRpZGFkZXMgZGUgcXVlIGRlcGVuZGUgKi9cbiAgICBlbnRpdHlEZXBlbmRlbmN5PzogRW50aXR5RGVwZW5kZW5jeVtdO1xuICAgIC8qKiBQcmVmaXhvIHV0aWxpemFkbyBwYXJhIG1vbnRhciBvcyBsYWJlbHMgKHBvciBwYWRyw6NvIHV0aWxpemEgZG9tw61uaW8gZSBzZXJ2acOnbykgKi9cbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgLyoqIFN1Zml4byB1dGlsaXphZG8gcGFyYSBtb250YXIgb3MgbGFiZWxzIChwb3IgcGFkcsOjbyDDqSB2YXppbykgKi9cbiAgICBzdWZmaXg/OiBzdHJpbmc7XG4gICAgLyoqIERvbcOtbmlvICovXG4gICAgZG9tYWluPzogc3RyaW5nO1xuICAgIC8qKiBTZXJ2acOnbyAqL1xuICAgIHNlcnZpY2U/OiBzdHJpbmc7XG4gICAgLyoqIERhdGEga2V5ICovXG4gICAgZGF0YUtleT86IHN0cmluZztcbiAgICAvKiogQ2FtcG9zIHBhcmEgb3JkZW5hw6fDo28gZG8gbG9va3VwIChhdXRvY29tcGxldGUpKi9cbiAgICBsb29rdXBTb3J0PzogU29ydE9wdGlvbnNbXTtcbiAgICAvKiogQ2FtcG9zIHBhcmEgYSBvcmRlbmHDp8OjbyBhbyBhYnJpciBhIG1vZGFsIGRlIGxpc3RhZ2VtICovXG4gICAgc2VhcmNoU29ydD86IFNvcnRPcHRpb25zW107XG59XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUZpbHRlckZ1bmN0aW9uPFQgPSB1bmtub3duPiA9IChvcHRpb25zOiB7XG4gICAgdmFsdWU6IFQ7XG4gICAgZmlsdGVyRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59KSA9PiBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUZpbHRlcjxUID0gdW5rbm93bj4gPSB7XG4gICAgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3I7XG4gICAgdmFsdWU6IHN0cmluZyB8IEN1c3RvbUZpbHRlckZ1bmN0aW9uPFQ+O1xufTtcblxuZXhwb3J0IGNsYXNzIEVycExvb2t1cHNGb3JtRmllbGQ8VCA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgbmFtZSE6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZSE6IHN0cmluZztcbiAgICBwdWJsaWMgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgIHB1YmxpYyBtdWx0aXBsZT86IGJvb2xlYW47XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVycExvb2t1cHNGb3JtRmllbGQ/OiB7XG4gICAgICAgICAgICBjdXN0b21GaWx0ZXJzPzogQ3VzdG9tRmlsdGVyPFQ+W107XG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmllbGRDb25maWcpO1xuICAgIH1cbn1cblxuLy8gVE9ETzogc3RyaWN0LXJldmlldzogQEluamVjdGFibGUgcmVtb3ZpZG8g4oCUIGVzdGEgY2xhc3NlIG7Do28gcG9kZSBzZXIgaW5qZXRhZGEgdmlhIERJIGRvIEFuZ3VsYXIuXG4vLyBPcyBwYXLDom1ldHJvcyBkbyBjb25zdHJ1Y3RvciBuw6NvIHPDo28gdGlwb3MgaW5qZXTDoXZlaXMgKHByaW1pdGl2b3Mgb3Ugc2VtID9wcm92KS4gSW5zdGFuY2lhciBjb20gYG5ld2AuXG4vKipcbiAqIEVycCBMb29rdXBzXG4gKiBAY2xhc3MgRXJwTG9va3Vwc1xuICovXG5leHBvcnQgY2xhc3MgRXJwTG9va3VwcyB7XG4gICAgcHVibGljIGxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwdWJsaWMgbG9va3VwU2VhcmNoT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmlhw6fDo28gZGUgdW0gbG9va3VwLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgTm9tZSBkYSBlbnRpZGFkZS5cbiAgICAgKiBAcGFyYW0gbG9va3VwRmllbGRzIENhbXBvcyBleGliaWRvcyBubyBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHNlYXJjaEZpZWxkcyBDYW1wb3MgZXhpYmlkb3Mgbm8gZmlsdHJvIGRlbnRybyBkYSBtb2RhbC5cbiAgICAgKiBAcGFyYW0gc2VhcmNoR3JpZEZpZWxkcyBDYW1wb3MgZXhpYmlkb3MgbmEgdGFiZWxhIGRlbnRybyBkYSBtb2RhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBsb29rdXBTZXJ2aWNlOiBFcnBMb29rdXBzU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGVudGl0eTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgbG9va3VwRmllbGRzOiBEeW5hbWljVHlwZVtdLFxuICAgICAgICBwdWJsaWMgc2VhcmNoRmllbGRzOiAoRHluYW1pY1R5cGUgfCBFcnBMb29rdXBzRm9ybUZpZWxkKVtdLFxuICAgICAgICBwdWJsaWMgc2VhcmNoR3JpZEZpZWxkczogRHluYW1pY1R5cGVbXSxcbiAgICAgICAgcHJvdGVjdGVkIGRvbWFpbjogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgc2VydmljZTogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5sb29rdXBGaWVsZHMgPSBsb29rdXBGaWVsZHMgPz8gW107XG4gICAgICAgIHRoaXMuc2VhcmNoRmllbGRzID0gc2VhcmNoRmllbGRzID8/IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaEdyaWRGaWVsZHMgPSBzZWFyY2hHcmlkRmllbGRzID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1NuYWtlQ2FzZSh2YWx1ZTogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPzpefFxcLj8pKFtBLVpdKS9nLCBmdW5jdGlvbiAoX3gsIHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ18nICsgeS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXy8sICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnRGb3JtRmllbGQoXG4gICAgICAgIGZpZWxkczogKER5bmFtaWNUeXBlIHwgRXJwTG9va3Vwc0Zvcm1GaWVsZClbXSxcbiAgICAgICAgcHJlZml4OiBzdHJpbmdcbiAgICApOiBEeW5hbWljVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgdHJhbnNsYXRpb25LZXkgPSBgJHtwcmVmaXh9Lmxvb2t1cF8ke3RoaXMudG9TbmFrZUNhc2UodGhpcy5lbnRpdHkpfV8ke3RoaXMudG9TbmFrZUNhc2UoZmllbGQubmFtZSl9YDtcblxuICAgICAgICAgICAgbGV0IGxhYmVsID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0cmFuc2xhdGlvbktleSk7XG5cbiAgICAgICAgICAgIGlmIChsYWJlbCA9PT0gdHJhbnNsYXRpb25LZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBNYW50ZXIgY29tcGF0aWJpbGlkYWRlIGNvbSBvcyBsb29rdXBzIGF0dWFpcyBhdMOpIHRvZG9zIGFqdXN0YXJlbVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkLm5hbWUuc3BsaXQoJy4nKS5qb2luKCdfJyk7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25LZXkgPSBgJHtwcmVmaXh9Lmxvb2t1cF8ke3RoaXMudG9TbmFrZUNhc2UodGhpcy5lbnRpdHkpfV8ke3RoaXMudG9TbmFrZUNhc2UoZmllbGROYW1lKX1gO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0cmFuc2xhdGlvbktleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB9IGFzIER5bmFtaWNUeXBlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnREZWZhdWx0RmlsdGVyKFxuICAgICAgICBkZWZhdWx0RmlsdGVyOiBEZWZhdWx0RmlsdGVyW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdleGNsdWlkbycsXG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbJ2ZhbHNlJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXJcbiAgICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICcoJyArXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIub3BlcmF0b3IgPT09IEVudW1Mb2dpY2FsT3BlcmF0b3IuQ29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7ZmlsdGVyLmZpZWxkfSksIGxvd2VyKCcke3ZhbHVlfScpKWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVyLm9wZXJhdG9yID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bUxvZ2ljYWxPcGVyYXRvci5Jc05vdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm9wZXJhdG9yID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1Mb2dpY2FsT3BlcmF0b3IuSXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZmlsdGVyLmZpZWxkfSAke2ZpbHRlci5vcGVyYXRvcn0gbnVsbGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtmaWx0ZXIuZmllbGR9ICR7ZmlsdGVyLm9wZXJhdG9yfSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignIG9yICcpICtcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignIGFuZCAnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnREeW5hbWljRmlsdGVyKFxuICAgICAgICBkeW5hbWljRmlsdGVyPzogRHluYW1pY0ZpbHRlcltdXG4gICAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCFkeW5hbWljRmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkeW5hbWljRmlsdGVyXG4gICAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gZmlsdGVyLnZhbHVlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWx0ZXIuZmllbGQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVyYXRvciA9IGZpbHRlci5vcGVyYXRvcjtcblxuICAgICAgICAgICAgICAgIGlmICghKHZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgICAgICAgICAodmFsdWVzIGFzIHVua25vd25bXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBFbnVtTG9naWNhbE9wZXJhdG9yLkNvbnRhaW5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgY29udGFpbmluZyhsb3dlcigke2ZpZWxkfSksIGxvd2VyKCcke1N0cmluZyh2YWx1ZSl9JykpYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVyYXRvciA9PT0gRW51bUxvZ2ljYWxPcGVyYXRvci5Jc05vdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPT09IEVudW1Mb2dpY2FsT3BlcmF0b3IuSXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZmllbGR9ICR7b3BlcmF0b3J9IG51bGxgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtmaWVsZH0gJHtvcGVyYXRvcn0gJyR7U3RyaW5nKHZhbHVlKX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignIG9yICcpICtcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignIGFuZCAnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnRGaWx0ZXJRdWVyeShcbiAgICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgbG9va3VwRmllbGRzOiBEeW5hbWljVHlwZVtdLFxuICAgICAgICBkZWZhdWx0RmlsdGVyPzogRGVmYXVsdEZpbHRlcltdLFxuICAgICAgICBkeW5hbWljRmlsdGVyPzogRHluYW1pY0ZpbHRlcltdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGZpbHRlclF1ZXJ5OiBzdHJpbmc7XG5cbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5ID0gbG9va3VwRmllbGRzXG4gICAgICAgICAgICAgICAgLm1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYChjb250YWluaW5nKGxvd2VyKCR7ZmllbGQubmFtZX0pLCBsb3dlcignJHt2YWx1ZX0nKSkpYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZFZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoJHtmaWVsZC5uYW1lfSBlcSAnJHtzYW5pdGl6ZWRWYWx1ZX0nKWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoJHtmaWVsZC5uYW1lfSBlcSAnJHt2YWx1ZX0nKWA7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+ICEhZmlsdGVyKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgb3IgJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeSA9IGxvb2t1cEZpZWxkc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiBmaWVsZC50eXBlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYChjb250YWluaW5nKGxvd2VyKCR7ZmllbGQubmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC9cXFxcL2csICcnKS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpKWA7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignIG9yICcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlclF1ZXJ5ID0gdGhpcy5tb3VudERlZmF1bHRGaWx0ZXIoZGVmYXVsdEZpbHRlcik7XG5cbiAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXJRdWVyeSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkgPSBgKCgke2RlZmF1bHRGaWx0ZXJRdWVyeX0pIGFuZCAoJHtmaWx0ZXJRdWVyeX0pKWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeSA9ICcoJyArIGZpbHRlclF1ZXJ5ICsgJyknO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHluYW1pY0ZpbHRlclF1ZXJ5ID0gdGhpcy5tb3VudER5bmFtaWNGaWx0ZXIoZHluYW1pY0ZpbHRlcik7XG5cbiAgICAgICAgaWYgKGR5bmFtaWNGaWx0ZXJRdWVyeSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkgPSBgKCgke2R5bmFtaWNGaWx0ZXJRdWVyeX0pIGFuZCAoJHtmaWx0ZXJRdWVyeX0pKWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeSA9ICcoJyArIGZpbHRlclF1ZXJ5ICsgJyknO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlclF1ZXJ5O1xuICAgIH1cbiAgICBwdWJsaWMgbW91bnRFbnVtRmlsdGVyKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgbXVsdGlwbGU/OiBib29sZWFuXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG11bHRpcGxlXG4gICAgICAgICAgICA/IGAoJHsodmFsdWUgYXMgc3RyaW5nW10pLm1hcCgoc2VsZWN0ZWQ6IHN0cmluZykgPT4gYCR7bmFtZX0gZXEgJyR7c2VsZWN0ZWR9J2ApLmpvaW4oJyBvciAnKX0pYFxuICAgICAgICAgICAgOiBgKCR7bmFtZX0gZXEgJyR7dmFsdWV9JylgO1xuICAgIH1cbiAgICAvKiogTcOpdG9kbyByZXNwb25zw6F2ZWwgcG9yIG1vbnRhciBhcyBvcMOnw7VlcyBwYWRyw7VlcyBwYXJhIG8gbG9va3VwIGRvIER5bmFtaWMgRm9ybSAqL1xuICAgIHB1YmxpYyBtb3VudE9wdGlvbnMob3B0aW9ucz86IExvb2t1cE9wdGlvbnMpOiBMb29rdXBGaWVsZENvbmZpZyB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IG9wdGlvbnM/LnByZWZpeFxuICAgICAgICAgICAgPyBvcHRpb25zLnByZWZpeFxuICAgICAgICAgICAgOiBvcHRpb25zPy5kb21haW4gJiYgb3B0aW9ucz8uc2VydmljZVxuICAgICAgICAgICAgICA/IGAke29wdGlvbnMuZG9tYWlufS4ke29wdGlvbnMuc2VydmljZX1gXG4gICAgICAgICAgICAgIDogYCR7dGhpcy5kb21haW59LiR7dGhpcy5zZXJ2aWNlfWA7XG5cbiAgICAgICAgY29uc3Qgc3VmZml4ID0gb3B0aW9ucz8uc3VmZml4ID8gYF8ke29wdGlvbnMuc3VmZml4fWAgOiAnJztcblxuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGxvb2t1cEZpZWxkczogb3B0aW9ucz8ubG9va3VwRmllbGRzXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLmxvb2t1cEZpZWxkc1xuICAgICAgICAgICAgICAgIDogdGhpcy5sb29rdXBGaWVsZHMsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnM/LmZvcm1Hcm91cCA/PyB0aGlzLmVudGl0eSxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgIGAke3ByZWZpeH0ubG9va3VwXyR7dGhpcy50b1NuYWtlQ2FzZShvcHRpb25zPy5lbnRpdHkpIHx8IHRoaXMudG9TbmFrZUNhc2UodGhpcy5lbnRpdHkpfSR7c3VmZml4fWBcbiAgICAgICAgICAgICkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgc2VhcmNoVGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgYCR7cHJlZml4fS5sb29rdXBfJHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1NuYWtlQ2FzZShvcHRpb25zPy5lbnRpdHkpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9TbmFrZUNhc2UodGhpcy5lbnRpdHkpXG4gICAgICAgICAgICAgICAgfV9zZWFyY2hfdGl0bGVgXG4gICAgICAgICAgICApIGFzIHN0cmluZyxcbiAgICAgICAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgICAgICAgbXVsdGlwbGU6IG9wdGlvbnM/Lm11bHRpcGxlICE9PSBmYWxzZSxcbiAgICAgICAgICAgIGRhdGFLZXk6IG9wdGlvbnM/LmRhdGFLZXkgPz8gJ2lkJyxcbiAgICAgICAgICAgIGxvb2t1cERpc3BsYXlGaWVsZDogJ2xhYmVsJyxcbiAgICAgICAgICAgIHNlYXJjaEVtcHR5VGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7cHJlZml4fS5ub3RoaW5nX2ZvdW5kYCksXG4gICAgICAgICAgICBmaWx0ZXJMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtwcmVmaXh9LmZpbHRlcmApLFxuICAgICAgICAgICAgY2xlYXJMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtwcmVmaXh9LmNsZWFyYCksXG4gICAgICAgICAgICBjYW5jZWxMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtwcmVmaXh9LmNhbmNlbGApLFxuICAgICAgICAgICAgc2VsZWN0TGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7cHJlZml4fS5zZWxlY3RgKSxcbiAgICAgICAgICAgIHNlYXJjaEZpZWxkczogdGhpcy5tb3VudEZvcm1GaWVsZChcbiAgICAgICAgICAgICAgICBvcHRpb25zPy5zZWFyY2hGaWVsZHMgPz8gdGhpcy5zZWFyY2hGaWVsZHMsXG4gICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc2VhcmNoR3JpZEZpZWxkczogdGhpcy5tb3VudEZvcm1GaWVsZChcbiAgICAgICAgICAgICAgICBvcHRpb25zPy5zZWFyY2hHcmlkRmllbGRzID8/IHRoaXMuc2VhcmNoR3JpZEZpZWxkcyxcbiAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdWdnZXN0aW9uc09ic2VydmFibGU6XG4gICAgICAgICAgICAgICAgdGhpcy5sb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUuYXNPYnNlcnZhYmxlKCksXG4gICAgICAgICAgICBzZWFyY2hPYnNlcnZhYmxlOiB0aGlzLmxvb2t1cFNlYXJjaE9ic2VydmFibGUuYXNPYnNlcnZhYmxlKCksXG4gICAgICAgICAgICBvbkxvb2t1cFJlcXVlc3Q6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMub25Mb29rdXBSZXF1ZXN0KHZhbHVlLCBwcmVmaXgsIG9wdGlvbnMpLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIG9uU2VhcmNoUmVxdWVzdDogKGV2ZW50OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdChldmVudCwgcHJlZml4LCBvcHRpb25zKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UHJvcChcbiAgICAgICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICBwcmVmaXg6IHN0cmluZ1xuICAgICk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgICAgICAgLnNwbGl0KCcuJylcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHByb3A6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID09PSB1bmRlZmluZWQgfHwgcmVzdWx0W3Byb3BdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7cHJlZml4fS5lbXB0eV9sYWJlbGApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChyZXN1bHRbcHJvcF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICAgICAgICAgIG9ialxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzVmFsdWUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnRFbnRpdHlGaWx0ZXIoZW50aXR5OiBFbnRpdHlEZXBlbmRlbmN5LCB2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGVudGl0eS5maWVsZFxuICAgICAgICAgICAgPyBgKCR7ZW50aXR5Lm5hbWV9LiR7ZW50aXR5LmZpZWxkfSBlcSAnJHt2YWx1ZVtlbnRpdHkuZmllbGRdfScpYFxuICAgICAgICAgICAgOiBgKCR7ZW50aXR5Lm5hbWV9IGVxICcke3ZhbHVlW2VudGl0eS5uYW1lXX0nKWA7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTG9va3VwUmVxdWVzdChcbiAgICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHJlZml4OiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBMb29rdXBPcHRpb25zXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxvb2t1cEZpZWxkcyA9IG9wdGlvbnM/Lmxvb2t1cEZpZWxkcyA/PyB0aGlzLmxvb2t1cEZpZWxkcztcbiAgICAgICAgY29uc3QgbG9va3VwRGlzcGxheUZpZWxkcyA9IGxvb2t1cEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5uYW1lKTtcblxuICAgICAgICBsZXQgZmlsdGVyUXVlcnkgPSB0aGlzLm1vdW50RmlsdGVyUXVlcnkoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGxvb2t1cEZpZWxkcyBhcyBEeW5hbWljVHlwZVtdLFxuICAgICAgICAgICAgb3B0aW9ucz8uZGVmYXVsdEZpbHRlcixcbiAgICAgICAgICAgIG9wdGlvbnM/LmR5bmFtaWNGaWx0ZXJcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZGlzcGxheUZpZWxkcyA9IGxvb2t1cERpc3BsYXlGaWVsZHMuY29uY2F0KFxuICAgICAgICAgICAgKG9wdGlvbnM/LnNlYXJjaEdyaWRGaWVsZHMgPz8gdGhpcy5zZWFyY2hHcmlkRmllbGRzKS5tYXAoXG4gICAgICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnF1ZXJ5RmllbGRzKSB7XG4gICAgICAgICAgICBkaXNwbGF5RmllbGRzID0gZGlzcGxheUZpZWxkcy5jb25jYXQob3B0aW9ucy5xdWVyeUZpZWxkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwbGF5RmllbGRzID0gZGlzcGxheUZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAodiwgaSkgPT4gZGlzcGxheUZpZWxkcy5pbmRleE9mKHYpID09PSBpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmVudGl0eURlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eUZpbHRlciA9IG9wdGlvbnMuZW50aXR5RGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgIC5tYXAoKGVudGl0eSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGVudGl0eS52YWx1ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNWYWx1ZShuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoJHtuZXdWYWx1ZS5tYXAoKHZhbDogYW55KSA9PiB0aGlzLm1vdW50RW50aXR5RmlsdGVyKGVudGl0eSwgdmFsKSkuam9pbignIG9yICcpfSlgO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoJHt0aGlzLm1vdW50RW50aXR5RmlsdGVyKGVudGl0eSwgbmV3VmFsdWUpfSlgO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiAhIWZpbHRlcilcbiAgICAgICAgICAgICAgICAuam9pbignIGFuZCAnKTtcblxuICAgICAgICAgICAgaWYgKGVudGl0eUZpbHRlcikge1xuICAgICAgICAgICAgICAgIGZpbHRlclF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgID8gKGZpbHRlclF1ZXJ5ICs9IGAgYW5kICgke2VudGl0eUZpbHRlcn0pYClcbiAgICAgICAgICAgICAgICAgICAgOiAoZmlsdGVyUXVlcnkgPSBlbnRpdHlGaWx0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb29rdXBTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNvcnQ6IG9wdGlvbnM/Lmxvb2t1cFNvcnQsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGRzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9ucz8uZW50aXR5ID8/IHRoaXMuZW50aXR5LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LmRvbWFpbiA/PyB0aGlzLmRvbWFpbixcbiAgICAgICAgICAgICAgICBvcHRpb25zPy5zZXJ2aWNlID8/IHRoaXMuc2VydmljZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5nZXRJdGVtTGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9va3VwU3VnZ2VzdGlvbnNPYnNlcnZhYmxlLm5leHQoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWFyY2hSZXF1ZXN0KFxuICAgICAgICBldmVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIHByZWZpeDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zOiBMb29rdXBPcHRpb25zID0ge31cbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBmaXJzdCwgcm93cywgbXVsdGlTb3J0TWV0YSwgZmlsdGVyRGF0YSB9ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSAoZmlyc3QgYXMgbnVtYmVyKSAvIChyb3dzIGFzIG51bWJlcik7XG4gICAgICAgIGNvbnN0IHNvcnQgPVxuICAgICAgICAgICAgKG11bHRpU29ydE1ldGEgYXMgU29ydE1ldGFbXSB8IHVuZGVmaW5lZCkgPz8gb3B0aW9ucy5zZWFyY2hTb3J0O1xuICAgICAgICBjb25zdCBsb29rdXBGaWVsZHMgPSBvcHRpb25zLmxvb2t1cEZpZWxkcyA/PyB0aGlzLmxvb2t1cEZpZWxkcztcbiAgICAgICAgY29uc3QgbG9va3VwRGlzcGxheUZpZWxkcyA9IGxvb2t1cEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5uYW1lKTtcblxuICAgICAgICBsZXQgZmlsdGVyUXVlcnkgPSAob3B0aW9ucy5zZWFyY2hGaWVsZHMgPz8gdGhpcy5zZWFyY2hGaWVsZHMpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh7IG5hbWUgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVdICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIChmaWx0ZXJEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtuYW1lXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAoZmlsdGVyRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV0gIT09ICcnXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChmb3JtRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIG11bHRpcGxlLCBlcnBMb29rdXBzRm9ybUZpZWxkIH0gPVxuICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQgYXMgRXJwTG9va3Vwc0Zvcm1GaWVsZDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKGZpbHRlckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVycExvb2t1cHNGb3JtRmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubW91bnRDdXN0b21GaWx0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJwTG9va3Vwc1NlYXJjaEZpZWxkOiBmb3JtRmllbGQgYXMgRXJwTG9va3Vwc0Zvcm1GaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckRhdGE6IGZpbHRlckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSBhcyBzdHJpbmcpLmZvcm1hdCgnWVlZWS1NTS1ERCcpfSdgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUgYXMgc3RyaW5nKS5mb3JtYXQoJ0hIOm1tOnNzJyl9J2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZGF0ZVRpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUgYXMgc3RyaW5nKS5mb3JtYXQoKX0nYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VudEVudW1GaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoY29udGFpbmluZyhsb3dlcigke25hbWV9KSwgbG93ZXIoJyR7dmFsdWV9JykpKWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnbG9va3VwJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCgke25hbWV9IGVxICckeyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ2lkJ119JylgO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignIGFuZCAnKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZW50aXR5RGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5RmlsdGVyID0gb3B0aW9ucy5lbnRpdHlEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgLm1hcCgoZW50aXR5OiBFbnRpdHlEZXBlbmRlbmN5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50aXR5LnZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgKCR7dmFsdWUubWFwKCh2YWw6IGFueSkgPT4gdGhpcy5tb3VudEVudGl0eUZpbHRlcihlbnRpdHksIHZhbCkpLmpvaW4oJyBvciAnKX0pYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCgke3RoaXMubW91bnRFbnRpdHlGaWx0ZXIoZW50aXR5LCB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPil9KWA7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+ICEhZmlsdGVyKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgYW5kICcpO1xuICAgICAgICAgICAgaWYgKGVudGl0eUZpbHRlcikge1xuICAgICAgICAgICAgICAgIGZpbHRlclF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgID8gKGZpbHRlclF1ZXJ5ICs9IGAgYW5kICgke2VudGl0eUZpbHRlcn0pYClcbiAgICAgICAgICAgICAgICAgICAgOiAoZmlsdGVyUXVlcnkgPSBlbnRpdHlGaWx0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXJRdWVyeSA9IHRoaXMubW91bnREZWZhdWx0RmlsdGVyKFxuICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0RmlsdGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXJRdWVyeSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnlcbiAgICAgICAgICAgICAgICA/IChmaWx0ZXJRdWVyeSArPSBgIGFuZCAoJHtkZWZhdWx0RmlsdGVyUXVlcnl9KWApXG4gICAgICAgICAgICAgICAgOiAoZmlsdGVyUXVlcnkgPSBgKCR7ZGVmYXVsdEZpbHRlclF1ZXJ5fSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXJRdWVyeSA9IHRoaXMubW91bnREeW5hbWljRmlsdGVyKFxuICAgICAgICAgICAgb3B0aW9ucy5keW5hbWljRmlsdGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGR5bmFtaWNGaWx0ZXJRdWVyeSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnlcbiAgICAgICAgICAgICAgICA/IChmaWx0ZXJRdWVyeSArPSBgIGFuZCAoJHtkeW5hbWljRmlsdGVyUXVlcnl9KWApXG4gICAgICAgICAgICAgICAgOiAoZmlsdGVyUXVlcnkgPSBgKCR7ZHluYW1pY0ZpbHRlclF1ZXJ5fSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkaXNwbGF5RmllbGRzID0gbG9va3VwRGlzcGxheUZpZWxkcy5jb25jYXQoXG4gICAgICAgICAgICAob3B0aW9ucy5zZWFyY2hHcmlkRmllbGRzID8/IHRoaXMuc2VhcmNoR3JpZEZpZWxkcylcbiAgICAgICAgICAgICAgICAuY29uY2F0KG9wdGlvbnMuc2VhcmNoR3JpZEZpZWxkcyA/PyBbXSlcbiAgICAgICAgICAgICAgICAubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkgPz8gW11cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5xdWVyeUZpZWxkcykge1xuICAgICAgICAgICAgZGlzcGxheUZpZWxkcyA9IGRpc3BsYXlGaWVsZHMuY29uY2F0KG9wdGlvbnMucXVlcnlGaWVsZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGxheUZpZWxkcyA9IGRpc3BsYXlGaWVsZHMuZmlsdGVyKFxuICAgICAgICAgICAgKHYsIGkpID0+IGRpc3BsYXlGaWVsZHMuaW5kZXhPZih2KSA9PT0gaVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMubG9va3VwU2VydmljZVxuICAgICAgICAgICAgLmxpc3QoXG4gICAgICAgICAgICAgICAgeyBwYWdlLCBzb3J0LCBmaWx0ZXJRdWVyeSwgZGlzcGxheUZpZWxkcyB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZW50aXR5ID8/IHRoaXMuZW50aXR5LFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZG9tYWluID8/IHRoaXMuZG9tYWluLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VydmljZSA/PyB0aGlzLnNlcnZpY2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChsaXN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JpYXIgdW0gbWFwYSBkZSBjYW1wb3MgY29tIG1heExlbmd0aCBkZWZpbmlkb1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNXaXRoTWF4TGVuZ3RoID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5zZWFyY2hGaWVsZHMgPz8gdGhpcy5zZWFyY2hGaWVsZHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKG9wdGlvbnMuc2VhcmNoR3JpZEZpZWxkcyA/PyB0aGlzLnNlYXJjaEdyaWRGaWVsZHMpLFxuICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhMZW5ndGggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXhMZW5ndGgnIGluIGZpZWxkID8gZmllbGQubWF4TGVuZ3RoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC50eXBlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50eXBlID09PSAndGV4dEFyZWEnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzV2l0aE1heExlbmd0aC5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCBhcyBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGE6IGxpc3QuY29udGVudHMubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRJdGVtID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBsaWNhciBtYXhMZW5ndGggbm9zIGNhbXBvcyBxdWUgcG9zc3VlbSBhIGNvbmZpZ3VyYcOnw6NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzV2l0aE1heExlbmd0aC5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4TGVuZ3RoLCBmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLmdldE5lc3RlZFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlLmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXROZXN0ZWRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wcm9jZXNzZWRJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5nZXRJdGVtTGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUmVjb3JkczogbGlzdC50b3RhbEVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb29rdXBTZWFyY2hPYnNlcnZhYmxlLm5leHQoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbUxhYmVsKFxuICAgICAgICBpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcHJlZml4OiBzdHJpbmcsXG4gICAgICAgIGxvb2t1cERpc3BsYXlGaWVsZHM6IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxvb2t1cERpc3BsYXlGaWVsZHNcbiAgICAgICAgICAgIC5tYXAoKGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkLCBwcmVmaXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBpdGVtW2ZpZWxkXSA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3ByZWZpeH0uZW1wdHlfbGFiZWxgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJyAtICcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW91bnRDdXN0b21GaWx0ZXIoe1xuICAgICAgICBlcnBMb29rdXBzU2VhcmNoRmllbGQsXG4gICAgICAgIGZpbHRlckRhdGEsXG4gICAgfToge1xuICAgICAgICBlcnBMb29rdXBzU2VhcmNoRmllbGQ6IEVycExvb2t1cHNGb3JtRmllbGQ7XG4gICAgICAgIGZpbHRlckRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH0pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IGVycExvb2t1cHNGb3JtRmllbGQsIG5hbWUgfSA9IGVycExvb2t1cHNTZWFyY2hGaWVsZDtcblxuICAgICAgICByZXR1cm4gYCgkeyhlcnBMb29rdXBzRm9ybUZpZWxkPy5jdXN0b21GaWx0ZXJzID8/IFtdKVxuICAgICAgICAgICAgLm1hcCgoeyBvcGVyYXRvciwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJEYXRhW25hbWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWU7XG5cbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0b3IgPT09IEVudW1Mb2dpY2FsT3BlcmF0b3IuQ29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoY29udGFpbmluZyhsb3dlcigke25hbWV9KSwgbG93ZXIoJyR7dmFsdWV9JykpKWA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAob3BlcmF0b3IgPT09IEVudW1Mb2dpY2FsT3BlcmF0b3IuSXNOb3QgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSBFbnVtTG9naWNhbE9wZXJhdG9yLklzKSAmJlxuICAgICAgICAgICAgICAgICAgICAhdmFsdWVcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoJHtuYW1lfSAke29wZXJhdG9yfSBudWxsKWA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAoJHtuYW1lfSAke29wZXJhdG9yfSAnJHt2YWx1ZX0nKWA7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJyBhbmQgJyl9KWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROZXN0ZWRWYWx1ZShcbiAgICAgICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcGF0aDogc3RyaW5nXG4gICAgKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50OiB1bmtub3duLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE9iaiA9IGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmpba2V5XSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gY3VycmVudE9ialtrZXldXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgb2JqIGFzIHVua25vd24pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TmVzdGVkVmFsdWUoXG4gICAgICAgIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgICAgdmFsdWU6IHVua25vd25cbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGtleXMucmVkdWNlKChjdXJyZW50OiB1bmtub3duLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE9iaiA9IGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmpba2V5XSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gY3VycmVudE9ialtrZXldXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgb2JqIGFzIHVua25vd24pO1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmIGxhc3RLZXkpIHtcbiAgICAgICAgICAgICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2xhc3RLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
615
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLWxvb2t1cHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zbnItZXJweC1hbmd1bGFyLWNvbXBvbmVudHMvbG9va3Vwcy9zcmMvbGliL2VycC1sb29rdXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQVM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHaEQsNkNBQTZDO0FBQzdDLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDO0FBRXZDOzs7OztHQUtHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBMkI7SUFDeEQsRUFBRSxFQUFFLElBQUk7SUFDUixDQUFDLEVBQUUsR0FBRztJQUNOLEVBQUUsRUFBRSxJQUFJO0lBQ1IsQ0FBQyxFQUFFLEdBQUc7SUFDTixFQUFFLEVBQUUsTUFBTTtJQUNWLENBQUMsRUFBRSxJQUFJO0NBQ1YsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBMkI7SUFDbkQsSUFBSSxFQUFFLE1BQU07SUFDWixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLENBQUMsRUFBRSxHQUFHO0NBQ1QsQ0FBQztBQWdDRixrRkFBa0Y7QUFDbEYsTUFBTSxDQUFOLElBQVksbUJBeUJYO0FBekJELFdBQVksbUJBQW1CO0lBQzNCLCtEQUErRDtJQUMvRCxnQ0FBUyxDQUFBO0lBQ1Qsa0VBQWtFO0lBQ2xFLGdDQUFTLENBQUE7SUFDVCx1REFBdUQ7SUFDdkQsZ0NBQVMsQ0FBQTtJQUNULGdFQUFnRTtJQUNoRSxnQ0FBUyxDQUFBO0lBQ1QsbURBQW1EO0lBQ25ELGdDQUFTLENBQUE7SUFDVCw2REFBNkQ7SUFDN0QsZ0NBQVMsQ0FBQTtJQUNULHdFQUF3RTtJQUN4RSxrQ0FBVyxDQUFBO0lBQ1gscUVBQXFFO0lBQ3JFLGdDQUFTLENBQUE7SUFDVCwrRUFBK0U7SUFDL0Usa0NBQVcsQ0FBQTtJQUNYLG1EQUFtRDtJQUNuRCxnQ0FBUyxDQUFBO0lBQ1QsbUVBQW1FO0lBQ25FLHVDQUFnQixDQUFBO0lBQ2hCLDhGQUE4RjtJQUM5Riw4Q0FBdUIsQ0FBQTtBQUMzQixDQUFDLEVBekJXLG1CQUFtQixLQUFuQixtQkFBbUIsUUF5QjlCO0FBdURELE1BQU0sT0FBTyxtQkFBbUI7SUFPNUIsWUFDVyxtQkFFTixFQUNELGNBQXVDLEVBQUU7UUFIbEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUV6QjtRQUdELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDSjtBQUVELG1HQUFtRztBQUNuRyx5R0FBeUc7QUFDekc7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFNbkI7Ozs7OztPQU1HO0lBQ0gsWUFDYyxhQUFnQyxFQUNoQyxTQUEyQixFQUMzQixNQUFjLEVBQ2QsWUFBMkIsRUFDOUIsWUFBbUQsRUFDbkQsZ0JBQStCLEVBQzVCLE1BQWMsRUFDZCxPQUFlO1FBUGYsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBdUM7UUFDbkQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFlO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBcEJ0QixnQ0FBMkIsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ2pELDJCQUFzQixHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFbEMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBbUJqRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFnQixFQUFFO1FBQ2pDLE9BQU8sS0FBSzthQUNQLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQyxDQUFDLENBQUM7YUFDRCxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFTSxjQUFjLENBQ2pCLE1BQTZDLEVBQzdDLE1BQWM7UUFFZCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixJQUFJLGNBQWMsR0FBRyxHQUFHLE1BQU0sV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBRXpHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRW5ELElBQUksS0FBSyxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUMzQixtRUFBbUU7Z0JBQ25FLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEQsY0FBYyxHQUFHLEdBQUcsTUFBTSxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDcEcsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxPQUFPO2dCQUNILEdBQUcsS0FBSztnQkFDUixLQUFLO2FBQ08sQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxrQkFBa0IsQ0FDckIsZ0JBQWlDO1FBQzdCO1lBQ0ksS0FBSyxFQUFFLFVBQVU7WUFDakIsUUFBUSxFQUFFLG1CQUFtQixDQUFDLEVBQUU7WUFDaEMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQ3BCO0tBQ0o7UUFFRCxPQUFPLGFBQWE7YUFDZixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNaLE9BQU8sQ0FDSCxHQUFHO2dCQUNILE1BQU0sQ0FBQyxNQUFNO3FCQUNSLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNYLElBQ0ksTUFBTSxDQUFDLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLEVBQ2xELENBQUM7d0JBQ0MsT0FBTyxvQkFBb0IsTUFBTSxDQUFDLEtBQUssYUFBYSxLQUFLLEtBQUssQ0FBQztvQkFDbkUsQ0FBQztvQkFFRCxJQUNJLENBQUMsTUFBTSxDQUFDLFFBQVE7d0JBQ1osbUJBQW1CLENBQUMsS0FBSzt3QkFDekIsTUFBTSxDQUFDLFFBQVE7NEJBQ1gsbUJBQW1CLENBQUMsRUFBRSxDQUFDO3dCQUMvQixDQUFDLEtBQUssRUFDUixDQUFDO3dCQUNDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLE9BQU8sQ0FBQztvQkFDckQsQ0FBQztvQkFDRCxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssR0FBRyxDQUFDO2dCQUMzRCxDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDakIsR0FBRyxDQUNOLENBQUM7UUFDTixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVNLGtCQUFrQixDQUNyQixhQUErQjtRQUUvQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakIsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sYUFBYTthQUNmLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ1osSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBRWpDLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QixDQUFDO1lBRUQsT0FBTyxDQUNILEdBQUc7Z0JBQ0YsTUFBb0I7cUJBQ2hCLEdBQUcsQ0FBQyxDQUFDLEtBQWMsRUFBRSxFQUFFO29CQUNwQixJQUFJLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDNUMsT0FBTyxvQkFBb0IsS0FBSyxhQUFhLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUNwRSxDQUFDO29CQUVELElBQ0ksQ0FBQyxRQUFRLEtBQUssbUJBQW1CLENBQUMsS0FBSzt3QkFDbkMsUUFBUSxLQUFLLG1CQUFtQixDQUFDLEVBQUUsQ0FBQzt3QkFDeEMsQ0FBQyxLQUFLLEVBQ1IsQ0FBQzt3QkFDQyxPQUFPLEdBQUcsS0FBSyxJQUFJLFFBQVEsT0FBTyxDQUFDO29CQUN2QyxDQUFDO29CQUVELE9BQU8sR0FBRyxLQUFLLElBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUNyRCxDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDakIsR0FBRyxDQUNOLENBQUM7UUFDTixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVNLGdCQUFnQixDQUNuQixLQUFhLEVBQ2IsWUFBMkIsRUFDM0IsYUFBK0IsRUFDL0IsYUFBK0I7UUFFL0IsSUFBSSxXQUFtQixDQUFDO1FBRXhCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xDLFdBQVcsR0FBRyxZQUFZO2lCQUNyQixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDWCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzFCLE9BQU8scUJBQXFCLEtBQUssQ0FBQyxJQUFJLGFBQWEsS0FBSyxNQUFNLENBQUM7Z0JBQ25FLENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUMzQixNQUFNLGNBQWMsR0FBRyxLQUFLO3lCQUN2QixRQUFRLEVBQUU7eUJBQ1YsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUNsQixPQUFPLElBQUksQ0FBQztvQkFDaEIsQ0FBQztvQkFDRCxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksUUFBUSxjQUFjLElBQUksQ0FBQztnQkFDcEQsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7Z0JBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUM7WUFDM0MsQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztpQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ0osV0FBVyxHQUFHLFlBQVk7aUJBQ3JCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNYLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDMUIsT0FBTyxxQkFBcUIsS0FBSyxDQUFDLElBQUksYUFBYSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzNHLENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO2dCQUVELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7aUJBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbEU7OztXQUdHO1FBQ0gsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLFdBQVcsR0FBRyxXQUFXO2dCQUNyQixDQUFDLENBQUMsS0FBSyxrQkFBa0IsVUFBVSxXQUFXLElBQUk7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLGtCQUFrQixHQUFHLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDSixXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVsRSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDckIsV0FBVyxHQUFHLFdBQVc7Z0JBQ3JCLENBQUMsQ0FBQyxLQUFLLGtCQUFrQixVQUFVLFdBQVcsSUFBSTtnQkFDbEQsQ0FBQyxDQUFDLElBQUksa0JBQWtCLEdBQUcsQ0FBQztRQUNwQyxDQUFDO2FBQU0sQ0FBQztZQUNKLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxlQUFlLENBQ2xCLElBQVksRUFDWixLQUF3QixFQUN4QixRQUFrQjtRQUVsQixPQUFPLFFBQVE7WUFDWCxDQUFDLENBQUMsSUFBSyxLQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxRQUFRLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQy9GLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBQ0Qsb0ZBQW9GO0lBQzdFLFlBQVksQ0FBQyxPQUF1QjtRQUN2QyxNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTTtZQUMxQixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDaEIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLE9BQU87Z0JBQ25DLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDeEMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFekMsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUUzRCxPQUFPLEdBQUc7WUFDTixHQUFHLE9BQU87WUFDVixZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVk7Z0JBQy9CLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWTtnQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZO1NBQzFCLENBQUM7UUFFRixPQUFPO1lBQ0gsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU07WUFDdkMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUN6QixHQUFHLE1BQU0sV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FDMUY7WUFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQy9CLEdBQUcsTUFBTSxXQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztnQkFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNoQyxlQUFlLENBQ1I7WUFDWCxJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxLQUFLLEtBQUs7WUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSTtZQUNqQyxrQkFBa0IsRUFBRSxPQUFPO1lBQzNCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztZQUNuRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLFNBQVMsQ0FBQztZQUN2RCxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLFFBQVEsQ0FBQztZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLFNBQVMsQ0FBQztZQUN2RCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLFNBQVMsQ0FBQztZQUN2RCxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDN0IsT0FBTyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUMxQyxNQUFNLENBQ1Q7WUFDRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUNqQyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUNsRCxNQUFNLENBQ1Q7WUFDRCxxQkFBcUIsRUFDakIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksRUFBRTtZQUNuRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFO1lBQzVELGVBQWUsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFDaEQsOERBQThEO1lBQzlELGVBQWUsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQzVCLGlFQUFpRTtZQUNqRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO1NBQ25ELENBQUM7SUFDTixDQUFDO0lBRU0sT0FBTyxDQUNWLEdBQTRCLEVBQzVCLElBQVksRUFDWixNQUFjO1FBRWQsT0FBTyxJQUFJO2FBQ04sS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNWLE1BQU0sQ0FDSCxDQUFDLE1BQStCLEVBQUUsSUFBWSxFQUFFLEVBQUUsQ0FDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUMvQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLGNBQWMsQ0FBQztZQUNqRCxDQUFDLENBQUUsTUFBTSxDQUFDLElBQUksQ0FBNkIsRUFDbkQsR0FBRyxDQUNOLENBQUM7SUFDVixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWM7UUFDMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbkIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQXdCLEVBQUUsS0FBVTtRQUN6RCxPQUFPLE1BQU0sQ0FBQyxLQUFLO1lBQ2YsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDaEUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDeEQsQ0FBQztJQUVNLGVBQWUsQ0FDbEIsS0FBYSxFQUNiLE1BQWMsRUFDZCxPQUF1QjtRQUV2QixNQUFNLFlBQVksR0FBRyxPQUFPLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNuQyxLQUFLLEVBQ0wsWUFBNkIsRUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFDdEIsT0FBTyxFQUFFLGFBQWEsQ0FDekIsQ0FBQztRQUVGLElBQUksYUFBYSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FDMUMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUNwRCxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FDckIsQ0FDSixDQUFDO1FBRUYsSUFBSSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDdkIsYUFBYSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FDaEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDM0MsQ0FBQztRQUVGLElBQUksT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDNUIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGdCQUFnQjtpQkFDeEMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ1osTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUVoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMzQixPQUFPO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzFCLE9BQU8sSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQy9GLENBQUM7Z0JBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUMzRCxDQUFDLENBQUM7aUJBQ0QsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2lCQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbkIsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDZixXQUFXO29CQUNQLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxTQUFTLFlBQVksR0FBRyxDQUFDO29CQUMzQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYTthQUNiLElBQUksQ0FDRDtZQUNJLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVTtZQUN6QixXQUFXO1lBQ1gsYUFBYTtTQUNoQixFQUNELE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFDOUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUM5QixPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQ25DO2FBQ0EsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsSUFBSSxDQUNELEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUIsR0FBRyxJQUFJO1lBQ1AsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQ3BCLElBQUksRUFDSixNQUFNLEVBQ04sbUJBQW1CLENBQ3RCO1NBQ0osQ0FBQyxDQUFDLENBQ04sQ0FDSjthQUNBLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU0sZUFBZSxDQUNsQixLQUE4QixFQUM5QixNQUFjLEVBQ2QsVUFBeUIsRUFBRTtRQUUzQixNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3pELE1BQU0sSUFBSSxHQUFJLEtBQWdCLEdBQUksSUFBZSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUNMLGFBQXdDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNwRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDL0QsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDeEQsTUFBTSxDQUNILENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQ1IsVUFBc0MsQ0FBQyxJQUFJLENBQUM7WUFDekMsU0FBUztZQUNaLFVBQXNDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUNyRCxVQUFzQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FDM0Q7YUFDQSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNmLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxHQUMvQyxTQUFnQyxDQUFDO1lBRXJDLE1BQU0sS0FBSyxHQUFJLFVBQXNDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFNUQsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztvQkFDMUIscUJBQXFCLEVBQUUsU0FBZ0M7b0JBQ3ZELFVBQVUsRUFBRSxVQUFxQztpQkFDcEQsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sR0FBRyxJQUFJLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUNELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixPQUFPLEdBQUcsSUFBSSxRQUFRLE1BQU0sQ0FBQyxLQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sR0FBRyxJQUFJLFFBQVEsTUFBTSxDQUFDLEtBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxHQUFHLElBQUksUUFBUSxNQUFNLENBQUMsS0FBZSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FDdkIsSUFBSSxFQUNKLEtBQTBCLEVBQzFCLFFBQVEsQ0FDWCxDQUFDO1lBQ04sQ0FBQztZQUNELElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwQixPQUFPLHFCQUFxQixJQUFJLGFBQWEsS0FBSyxNQUFNLENBQUM7WUFDN0QsQ0FBQztZQUNELElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwQixPQUFPLElBQUksSUFBSSxRQUFTLEtBQWlDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN4RSxDQUFDO1lBRUQsT0FBTyxHQUFHLElBQUksUUFBUSxLQUFLLEdBQUcsQ0FBQztRQUNuQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkIsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZ0JBQWdCO2lCQUN4QyxHQUFHLENBQUMsQ0FBQyxNQUF3QixFQUFFLEVBQUU7Z0JBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTztnQkFDWCxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN2QixPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUM1RixDQUFDO2dCQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQWdDLENBQUMsR0FBRyxDQUFDO1lBQ25GLENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7aUJBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLFdBQVc7b0JBQ1AsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLFNBQVMsWUFBWSxHQUFHLENBQUM7b0JBQzNDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUM5QyxPQUFPLENBQUMsYUFBYSxDQUN4QixDQUFDO1FBRUYsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLFdBQVc7Z0JBQ1AsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLFNBQVMsa0JBQWtCLEdBQUcsQ0FBQztnQkFDakQsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDOUMsT0FBTyxDQUFDLGFBQWEsQ0FDeEIsQ0FBQztRQUVGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUNyQixXQUFXO2dCQUNQLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxTQUFTLGtCQUFrQixHQUFHLENBQUM7Z0JBQ2pELENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsSUFBSSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUMxQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7YUFDOUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7YUFDdEMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUNyQyxDQUFDO1FBRUYsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsYUFBYSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FDaEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDM0MsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhO2FBQ2IsSUFBSSxDQUNELEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEVBQzFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFDN0IsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUM3QixPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQ2xDO2FBQ0EsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsSUFBSSxDQUNELEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ2QsaURBQWlEO1lBQ2pELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFFdEQ7Z0JBQ0ksR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDOUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7YUFDekQsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDaEIsTUFBTSxTQUFTLEdBQ1gsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUN2RCxJQUNJLFNBQVM7b0JBQ1QsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7d0JBQ3BCLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLEVBQ2hDLENBQUM7b0JBQ0MsbUJBQW1CLENBQUMsR0FBRyxDQUNuQixLQUFLLENBQUMsSUFBSSxFQUNWLFNBQW1CLENBQ3RCLENBQUM7Z0JBQ04sQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDSCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQkFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FDdkIsQ0FBQztvQkFFRiwwREFBMEQ7b0JBQzFELG1CQUFtQixDQUFDLE9BQU8sQ0FDdkIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUU7d0JBQ3JCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQ2xDLGFBQWEsRUFDYixTQUFTLENBQ1osQ0FBQzt3QkFDRixJQUNJLFVBQVU7NEJBQ1YsT0FBTyxVQUFVLEtBQUssUUFBUTs0QkFDOUIsVUFBVSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQy9CLENBQUM7NEJBQ0MsSUFBSSxDQUFDLGNBQWMsQ0FDZixhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztnQ0FDOUIsS0FBSyxDQUNaLENBQUM7d0JBQ04sQ0FBQztvQkFDTCxDQUFDLENBQ0osQ0FBQztvQkFFRixPQUFPO3dCQUNILEdBQUcsYUFBYTt3QkFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQ3BCLGFBQWEsRUFDYixNQUFNLEVBQ04sbUJBQW1CLENBQ3RCO3FCQUNKLENBQUM7Z0JBQ04sQ0FBQyxDQUFDO2dCQUNGLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYTthQUNuQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQ0w7YUFDQSxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLFlBQVksQ0FDZixJQUE2QixFQUM3QixNQUFjLEVBQ2QsbUJBQTZCO1FBRTdCLE9BQU8sbUJBQW1CO2FBQ3JCLEdBQUcsQ0FBQyxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQ25CLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELE9BQU8sQ0FDSCxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxjQUFjLENBQUMsQ0FDbEQsQ0FBQztRQUNOLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxlQUFlLENBQUMsS0FBa0IsRUFBRSxLQUFhO1FBQ3JELE1BQU0sV0FBVyxHQUFJLEtBQTZCLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztRQUVwRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQ3RCLEtBQUssRUFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUMxQyxJQUFJLENBQ1AsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNkLE1BQU0sUUFBUSxHQUFHLFdBQVc7aUJBQ3ZCLEtBQUssRUFBRTtpQkFDUCxPQUFPLENBQUMsT0FBTyxDQUFDO2lCQUNoQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUUvQixNQUFNLE9BQU8sR0FBRyxXQUFXO2lCQUN0QixLQUFLLEVBQUU7aUJBQ1AsS0FBSyxDQUFDLE9BQU8sQ0FBQztpQkFDZCxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUUvQixPQUFPLElBQUksS0FBSyxDQUFDLElBQUksUUFBUSxRQUFRLFNBQVMsS0FBSyxDQUFDLElBQUksUUFBUSxPQUFPLElBQUksQ0FBQztRQUNoRixDQUFDO1FBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsV0FBVyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssaUJBQWlCLENBQ3JCLEtBQWtCLEVBQ2xCLFdBQW9CO1FBRXBCLE1BQU0sRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsR0FDdkMsS0FBNEIsQ0FBQztRQUVqQyxNQUFNLFdBQVcsR0FBRyxVQUFVO1lBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQzdCLHFCQUFxQixFQUFFLFVBQVUsQ0FDcEMsQ0FBQztRQUVSLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0QsTUFBTSxNQUFNLEdBQ1IsV0FBVztZQUNYLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV0RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5FLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHdCQUF3QixDQUFDLE1BQWM7UUFDM0MsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUNqQixxQkFBcUIsRUFDckIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUMzQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNLLDRCQUE0QixDQUFDLE1BQWU7UUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FDakIsaUJBQWlCLEVBQ2pCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FDaEQsQ0FBQztJQUNOLENBQUM7SUFFRCx1REFBdUQ7SUFDL0MsZUFBZSxDQUFDLE1BQWM7UUFDbEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1FBRTVELE9BQU8sTUFBTTthQUNSLEtBQUssQ0FBQyxXQUFXLENBQUM7YUFDbEIsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxFQUN0QixxQkFBcUIsRUFDckIsVUFBVSxHQUliO1FBQ0csTUFBTSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxHQUFHLHFCQUFxQixDQUFDO1FBRTVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7YUFDaEQsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUN6QixLQUFLO2dCQUNELE9BQU8sS0FBSyxLQUFLLFVBQVU7b0JBQ3ZCLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQ0YsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUM7d0JBQ3ZCLFVBQVU7cUJBQ2IsQ0FBQztvQkFDSixDQUFDLENBQUMsS0FBSyxDQUFDO1lBRWhCLElBQUksUUFBUSxLQUFLLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLHFCQUFxQixJQUFJLGFBQWEsS0FBSyxNQUFNLENBQUM7WUFDN0QsQ0FBQztZQUVELElBQ0ksQ0FBQyxRQUFRLEtBQUssbUJBQW1CLENBQUMsS0FBSztnQkFDbkMsUUFBUSxLQUFLLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztnQkFDeEMsQ0FBQyxLQUFLLEVBQ1IsQ0FBQztnQkFDQyxPQUFPLElBQUksSUFBSSxJQUFJLFFBQVEsUUFBUSxDQUFDO1lBQ3hDLENBQUM7WUFFRCxPQUFPLElBQUksSUFBSSxJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksQ0FBQztRQUM5QyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRU8sY0FBYyxDQUNsQixHQUE0QixFQUM1QixJQUFZO1FBRVosT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQWdCLEVBQUUsR0FBVyxFQUFFLEVBQUU7WUFDNUQsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sVUFBVSxHQUFHLE9BQWtDLENBQUM7Z0JBQ3RELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVM7b0JBQ2hDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO29CQUNqQixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDLEVBQUUsR0FBYyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FDbEIsR0FBNEIsRUFDNUIsSUFBWSxFQUNaLEtBQWM7UUFFZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBZ0IsRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUN6RCxJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxVQUFVLEdBQUcsT0FBa0MsQ0FBQztnQkFDdEQsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztvQkFDaEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7b0JBQ2pCLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEIsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUMsRUFBRSxHQUFjLENBQUMsQ0FBQztRQUNuQixJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDakQsTUFBa0MsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekQsQ0FBQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDYWxlbmRhckZpZWxkQ29uZmlnLFxuICAgIER5bmFtaWNUeXBlLFxuICAgIExvb2t1cEZpZWxkQ29uZmlnLFxufSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2R5bmFtaWMtZm9ybSc7XG5pbXBvcnQgeyBTb3J0TWV0YSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXJwTG9va3Vwc1NlcnZpY2UgfSBmcm9tICcuL2VycC1sb29rdXBzLnNlcnZpY2UnO1xuXG4vKiogRm9ybWF0byBkZSBkYXRhIGVzcGVyYWRvIHBlbGEgY29uc3VsdGEgKi9cbmNvbnN0IFFVRVJZX0RBVEVfRk9STUFUID0gJ1lZWVktTU0tREQnO1xuXG4vKipcbiAqIEVxdWl2YWxlbnRlIGVtIG1vbWVudCBkZSBjYWRhIHRva2VuIGRvIGRpYWxldG8gbGVnYWRvIChQcmltZU5HKSB1c2FkbyBwb3JcbiAqIGBjYWxlbmRhckxvY2FsZU9wdGlvbnMuZGF0ZUZvcm1hdGAg4oCUIMOpIG8gbWVzbW8gZGlhbGV0byBxdWVcbiAqIGBjb252ZXJ0VG9Nb21lbnREYXRlRm9ybWF0YCAoYEBzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdGFibGVgKVxuICogY29udmVydGUgcGFyYSBmb3JtYXRhciBjb2x1bmFzIGRlIGRhdGEgbmEgZ3JpZCBhIHBhcnRpciBkZXNzYSBwcm9wcmllZGFkZS5cbiAqL1xuY29uc3QgTEVHQUNZX0NBTEVOREFSX0RBVEVfVE9LRU5TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGRkOiAnREQnLFxuICAgIGQ6ICdEJyxcbiAgICBtbTogJ01NJyxcbiAgICBtOiAnTScsXG4gICAgeXk6ICdZWVlZJyxcbiAgICB5OiAnWVknLFxufTtcblxuLyoqXG4gKiBFcXVpdmFsZW50ZSBlbSBtb21lbnQgZGUgY2FkYSB0b2tlbiBkbyBkaWFsZXRvIG5hdGl2byBkbyBgcy1kYXRlcGlja2VyYCxcbiAqIHVzYWRvIHBlbGEgcHJvcHJpZWRhZGUgYGRhdGVGb3JtYXRgIChhIHF1ZSBvIGBDYWxlbmRhckZpZWxkQ29tcG9uZW50YFxuICogcmVwYXNzYSBkaXJldG8gYW8gYHMtZGF0ZXBpY2tlcmApLiBBcXVpIGB5eWAgw6kgYW5vIGNvbSAyIGTDrWdpdG9zIOKAlCBhb1xuICogY29udHLDoXJpbyBkbyBkaWFsZXRvIGRvIFByaW1lTkcsIG9uZGUgYHl5YCB0ZW0gNCBkw61naXRvcy5cbiAqL1xuY29uc3QgREFURVBJQ0tFUl9EQVRFX1RPS0VOUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICB5eXl5OiAnWVlZWScsXG4gICAgeXk6ICdZWScsXG4gICAgTU06ICdNTScsXG4gICAgbW06ICdNTScsXG4gICAgZGQ6ICdERCcsXG4gICAgZDogJ0QnLFxufTtcblxuLyoqIEVudGlkYWRlcyBkZSBxdWUgZGVwZW5kZSAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlEZXBlbmRlbmN5IHtcbiAgICAvKiogTm9tZSBkYSBlbnRpZGFkZSBxdWUgZGVwZW5kZSAocGFpKSAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKiogQ2FtcG8gZGEgZW50aWRhZGUgcGFpIHF1ZSBzZXLDoSBjb21wYXJhZG8gKi9cbiAgICBmaWVsZD86IHN0cmluZztcbiAgICAvKiogVmFsb3IgZGEgZW50aWRhZGUgcGFpICovXG4gICAgdmFsdWU6ICgpID0+IHVua25vd247XG59XG5cbi8qKiBGaWx0cm8gcGFkcsOjbyBhcGxpY2FkbyBlbSB0b2RhcyByZXF1aXNpw6fDtWVzIGRhIGVudGlkYWRlLiBQb3IgcGFkcsOjbyBmaWx0cmEgcmVnaXN0cm9zIG7Do28gZXhjbHVpZG9zICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRGaWx0ZXIge1xuICAgIC8qKiBDYW1wbyBxdWUgc2Vyw6EgZmlsdHJhZG8gKi9cbiAgICBmaWVsZDogc3RyaW5nIHwgRGVmYXVsdEZpbHRlcjtcbiAgICAvKiogQ29tcGFyYcOnw6NvIHF1ZSBzZXLDoSBhcGxpY2FkYSBuYSBjb25zdWx0YSAqL1xuICAgIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yO1xuICAgIC8qKiBWYWxvcmVzIHF1ZSBzZXLDo28gYnVzY2Fkb3MgKi9cbiAgICB2YWx1ZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogRmlsdHJvIGRpbmFtaWNvIHBhcmEgY29uc3VsdGFzIG1haXMgY29tcGxleGFzICovXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNGaWx0ZXIge1xuICAgIC8qKiBDYW1wbyBxdWUgc2Vyw6EgZmlsdHJhZG8gKi9cbiAgICBmaWVsZDogKCkgPT4gc3RyaW5nO1xuICAgIC8qKiBDb21wYXJhw6fDo28gcXVlIHNlcsOhIGFwbGljYWRhIG5hIGNvbnN1bHRhICovXG4gICAgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3I7XG4gICAgLyoqIFZhbG9yZXMgcXVlIHNlcsOjbyBidXNjYWRvcyAqL1xuICAgIHZhbHVlOiAoKSA9PiB1bmtub3duO1xufVxuXG4vKiogRmlsdGVyIFN5c3RlbSBRdWVyeSBPcHRpb24gLSBPcGVyYXRvcnMgc3VwcG9ydGVkIGluIHRoZSBleHByZXNzaW9uIGxhbmd1YWdlICovXG5leHBvcnQgZW51bSBFbnVtTG9naWNhbE9wZXJhdG9yIHtcbiAgICAvKiogRXF1YWwgKEV4OiAvU3VwcGxpZXJzPyRmaWx0ZXI9QWRkcmVzcy9DaXR5IGVxICdSZWRtb25kJykgKi9cbiAgICBFcSA9ICdlcScsXG4gICAgLyoqIE5vdCBlcXVhbCAoRXg6IC9TdXBwbGllcnM/JGZpbHRlcj1BZGRyZXNzL0NpdHkgbmUgJ0xvbmRvbicpICovXG4gICAgTmUgPSAnbmUnLFxuICAgIC8qKiBHcmVhdGVyIHRoYW4gKEV4OiAvUHJvZHVjdHM/JGZpbHRlcj1QcmljZSBndCAyMCkgKi9cbiAgICBHdCA9ICdndCcsXG4gICAgLyoqIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPVByaWNlIGdlIDEwKSAqL1xuICAgIEdlID0gJ2dlJyxcbiAgICAvKiogTGVzcyB0aGFuIChFeDogL1Byb2R1Y3RzPyRmaWx0ZXI9UHJpY2UgbHQgMjApKi9cbiAgICBMdCA9ICdsdCcsXG4gICAgLyoqIExlc3MgdGhhbiBvciBlcXVhbCAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPVByaWNlIGxlIDEwMCkqL1xuICAgIExlID0gJ2xlJyxcbiAgICAvKiogTG9naWNhbCBhbmRcdCAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPVByaWNlIGxlIDIwMCBhbmQgUHJpY2UgZ3QgMy41KSovXG4gICAgQW5kID0gJ2FuZCcsXG4gICAgLyoqIExvZ2ljYWwgb3IgKEV4OiAvUHJvZHVjdHM/JGZpbHRlcj1QcmljZSBsZSAzLjUgb3IgUHJpY2UgZ3QgMjAwKSovXG4gICAgT3IgPSAnb3InLFxuICAgIC8qKiBMb2dpY2FsIG5lZ2F0aW9uIChFeDogL1Byb2R1Y3RzPyRmaWx0ZXI9bm90IGVuZHN3aXRoKERlc2NyaXB0aW9uLCdtaWxrJykpKi9cbiAgICBOb3QgPSAnbm90JyxcbiAgICAvKiogTG9naWNhbCBpcyAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPWlkIGlzIG51bGwgKi9cbiAgICBJcyA9ICdpcycsXG4gICAgLyoqIE5lZ2F0aW9uIG9mIGxvZ2ljYWwgaXMgKEV4OiAvUHJvZHVjdHM/JGZpbHRlcj1pZCBpcyBub3QgbnVsbCAqL1xuICAgIElzTm90ID0gJ2lzIG5vdCcsXG4gICAgLyoqIENvbnRhaW5zIHN0cmluZyB2YWx1ZSAoRXg6IC9Qcm9kdWN0cz8kZmlsdGVyPWNvbnRhaW5pbmcobG93ZXIobmFtZSksIGxvd2VyKCdteSBuYW1lJykpKSAqL1xuICAgIENvbnRhaW5zID0gJ2NvbnRhaW5pbmcnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRPcHRpb25zIHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG9yZGVyOiBudW1iZXI7XG59XG5cbi8qKiBQYXLDom1ldHJvcyBwYXJhIGN1c3RvbWl6YcOnw7VlcyBkbyBsb29rdXAgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwT3B0aW9ucyB7XG4gICAgLyoqIE5vbWUgZGEgZW50aWRhZGUgKi9cbiAgICBlbnRpdHk/OiBzdHJpbmc7XG4gICAgLyoqIE5vbWUgZG8gZm9ybUdyb3VwICovXG4gICAgZm9ybUdyb3VwPzogc3RyaW5nO1xuICAgIC8qKiBGaWx0cm8gcGFkcsOjbyAqL1xuICAgIGRlZmF1bHRGaWx0ZXI/OiBEZWZhdWx0RmlsdGVyW107XG4gICAgLyoqIEZpbHRybyBkaW7Dom1pY28gKi9cbiAgICBkeW5hbWljRmlsdGVyPzogRHluYW1pY0ZpbHRlcltdO1xuICAgIC8qKiBDYW1wb3MgZG8gbG9va3VwIChhdXRvY29tcGxldGUpICovXG4gICAgbG9va3VwRmllbGRzPzogKER5bmFtaWNUeXBlIHwgRXJwTG9va3Vwc0Zvcm1GaWVsZClbXTtcbiAgICAvKiogQ2FtcG9zIHF1ZSBzZXLDo28gc29saWNpdGFkb3MgbmEgY29uc3VsdGEgKi9cbiAgICBxdWVyeUZpZWxkcz86IHN0cmluZ1tdO1xuICAgIC8qKiBDYW1wb3MgZXhpYmlkb3Mgbm8gZmlsdHJvIGRhIG1vZGFsIGRlIGxpc3RhZ2VtICovXG4gICAgc2VhcmNoRmllbGRzPzogKER5bmFtaWNUeXBlIHwgRXJwTG9va3Vwc0Zvcm1GaWVsZClbXTtcbiAgICAvKiogQ2FtcG9zIGV4aWJpZG9zIG5hIGdyaWQgZGEgbW9kYWwgZGUgbGlzdGFnZW0gKi9cbiAgICAvKiogRGVmaW5lIHNlIG8gbG9va3VwIHBlcm1pdGlyw6EgbXVsdGkgc2VsZcOnw6NvICovXG4gICAgc2VhcmNoR3JpZEZpZWxkcz86IChEeW5hbWljVHlwZSB8IEVycExvb2t1cHNGb3JtRmllbGQpW107XG4gICAgbXVsdGlwbGU/OiBib29sZWFuO1xuICAgIC8qKiBFbnRpZGFkZXMgZGUgcXVlIGRlcGVuZGUgKi9cbiAgICBlbnRpdHlEZXBlbmRlbmN5PzogRW50aXR5RGVwZW5kZW5jeVtdO1xuICAgIC8qKiBQcmVmaXhvIHV0aWxpemFkbyBwYXJhIG1vbnRhciBvcyBsYWJlbHMgKHBvciBwYWRyw6NvIHV0aWxpemEgZG9tw61uaW8gZSBzZXJ2acOnbykgKi9cbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgLyoqIFN1Zml4byB1dGlsaXphZG8gcGFyYSBtb250YXIgb3MgbGFiZWxzIChwb3IgcGFkcsOjbyDDqSB2YXppbykgKi9cbiAgICBzdWZmaXg/OiBzdHJpbmc7XG4gICAgLyoqIERvbcOtbmlvICovXG4gICAgZG9tYWluPzogc3RyaW5nO1xuICAgIC8qKiBTZXJ2acOnbyAqL1xuICAgIHNlcnZpY2U/OiBzdHJpbmc7XG4gICAgLyoqIERhdGEga2V5ICovXG4gICAgZGF0YUtleT86IHN0cmluZztcbiAgICAvKiogQ2FtcG9zIHBhcmEgb3JkZW5hw6fDo28gZG8gbG9va3VwIChhdXRvY29tcGxldGUpKi9cbiAgICBsb29rdXBTb3J0PzogU29ydE9wdGlvbnNbXTtcbiAgICAvKiogQ2FtcG9zIHBhcmEgYSBvcmRlbmHDp8OjbyBhbyBhYnJpciBhIG1vZGFsIGRlIGxpc3RhZ2VtICovXG4gICAgc2VhcmNoU29ydD86IFNvcnRPcHRpb25zW107XG59XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUZpbHRlckZ1bmN0aW9uPFQgPSB1bmtub3duPiA9IChvcHRpb25zOiB7XG4gICAgdmFsdWU6IFQ7XG4gICAgZmlsdGVyRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59KSA9PiBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUZpbHRlcjxUID0gdW5rbm93bj4gPSB7XG4gICAgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3I7XG4gICAgdmFsdWU6IHN0cmluZyB8IEN1c3RvbUZpbHRlckZ1bmN0aW9uPFQ+O1xufTtcblxuZXhwb3J0IGNsYXNzIEVycExvb2t1cHNGb3JtRmllbGQ8VCA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgbmFtZSE6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZSE6IHN0cmluZztcbiAgICBwdWJsaWMgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgIHB1YmxpYyBtdWx0aXBsZT86IGJvb2xlYW47XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVycExvb2t1cHNGb3JtRmllbGQ/OiB7XG4gICAgICAgICAgICBjdXN0b21GaWx0ZXJzPzogQ3VzdG9tRmlsdGVyPFQ+W107XG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmllbGRDb25maWcpO1xuICAgIH1cbn1cblxuLy8gVE9ETzogc3RyaWN0LXJldmlldzogQEluamVjdGFibGUgcmVtb3ZpZG8g4oCUIGVzdGEgY2xhc3NlIG7Do28gcG9kZSBzZXIgaW5qZXRhZGEgdmlhIERJIGRvIEFuZ3VsYXIuXG4vLyBPcyBwYXLDom1ldHJvcyBkbyBjb25zdHJ1Y3RvciBuw6NvIHPDo28gdGlwb3MgaW5qZXTDoXZlaXMgKHByaW1pdGl2b3Mgb3Ugc2VtID9wcm92KS4gSW5zdGFuY2lhciBjb20gYG5ld2AuXG4vKipcbiAqIEVycCBMb29rdXBzXG4gKiBAY2xhc3MgRXJwTG9va3Vwc1xuICovXG5leHBvcnQgY2xhc3MgRXJwTG9va3VwcyB7XG4gICAgcHVibGljIGxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwdWJsaWMgbG9va3VwU2VhcmNoT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmlhw6fDo28gZGUgdW0gbG9va3VwLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgTm9tZSBkYSBlbnRpZGFkZS5cbiAgICAgKiBAcGFyYW0gbG9va3VwRmllbGRzIENhbXBvcyBleGliaWRvcyBubyBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHNlYXJjaEZpZWxkcyBDYW1wb3MgZXhpYmlkb3Mgbm8gZmlsdHJvIGRlbnRybyBkYSBtb2RhbC5cbiAgICAgKiBAcGFyYW0gc2VhcmNoR3JpZEZpZWxkcyBDYW1wb3MgZXhpYmlkb3MgbmEgdGFiZWxhIGRlbnRybyBkYSBtb2RhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBsb29rdXBTZXJ2aWNlOiBFcnBMb29rdXBzU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGVudGl0eTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgbG9va3VwRmllbGRzOiBEeW5hbWljVHlwZVtdLFxuICAgICAgICBwdWJsaWMgc2VhcmNoRmllbGRzOiAoRHluYW1pY1R5cGUgfCBFcnBMb29rdXBzRm9ybUZpZWxkKVtdLFxuICAgICAgICBwdWJsaWMgc2VhcmNoR3JpZEZpZWxkczogRHluYW1pY1R5cGVbXSxcbiAgICAgICAgcHJvdGVjdGVkIGRvbWFpbjogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgc2VydmljZTogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5sb29rdXBGaWVsZHMgPSBsb29rdXBGaWVsZHMgPz8gW107XG4gICAgICAgIHRoaXMuc2VhcmNoRmllbGRzID0gc2VhcmNoRmllbGRzID8/IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaEdyaWRGaWVsZHMgPSBzZWFyY2hHcmlkRmllbGRzID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1NuYWtlQ2FzZSh2YWx1ZTogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPzpefFxcLj8pKFtBLVpdKS9nLCBmdW5jdGlvbiAoX3gsIHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ18nICsgeS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXy8sICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnRGb3JtRmllbGQoXG4gICAgICAgIGZpZWxkczogKER5bmFtaWNUeXBlIHwgRXJwTG9va3Vwc0Zvcm1GaWVsZClbXSxcbiAgICAgICAgcHJlZml4OiBzdHJpbmdcbiAgICApOiBEeW5hbWljVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgdHJhbnNsYXRpb25LZXkgPSBgJHtwcmVmaXh9Lmxvb2t1cF8ke3RoaXMudG9TbmFrZUNhc2UodGhpcy5lbnRpdHkpfV8ke3RoaXMudG9TbmFrZUNhc2UoZmllbGQubmFtZSl9YDtcblxuICAgICAgICAgICAgbGV0IGxhYmVsID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0cmFuc2xhdGlvbktleSk7XG5cbiAgICAgICAgICAgIGlmIChsYWJlbCA9PT0gdHJhbnNsYXRpb25LZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBNYW50ZXIgY29tcGF0aWJpbGlkYWRlIGNvbSBvcyBsb29rdXBzIGF0dWFpcyBhdMOpIHRvZG9zIGFqdXN0YXJlbVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkLm5hbWUuc3BsaXQoJy4nKS5qb2luKCdfJyk7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25LZXkgPSBgJHtwcmVmaXh9Lmxvb2t1cF8ke3RoaXMudG9TbmFrZUNhc2UodGhpcy5lbnRpdHkpfV8ke3RoaXMudG9TbmFrZUNhc2UoZmllbGROYW1lKX1gO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0cmFuc2xhdGlvbktleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB9IGFzIER5bmFtaWNUeXBlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnREZWZhdWx0RmlsdGVyKFxuICAgICAgICBkZWZhdWx0RmlsdGVyOiBEZWZhdWx0RmlsdGVyW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdleGNsdWlkbycsXG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbJ2ZhbHNlJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXJcbiAgICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICcoJyArXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIub3BlcmF0b3IgPT09IEVudW1Mb2dpY2FsT3BlcmF0b3IuQ29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7ZmlsdGVyLmZpZWxkfSksIGxvd2VyKCcke3ZhbHVlfScpKWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVyLm9wZXJhdG9yID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bUxvZ2ljYWxPcGVyYXRvci5Jc05vdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm9wZXJhdG9yID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1Mb2dpY2FsT3BlcmF0b3IuSXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZmlsdGVyLmZpZWxkfSAke2ZpbHRlci5vcGVyYXRvcn0gbnVsbGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtmaWx0ZXIuZmllbGR9ICR7ZmlsdGVyLm9wZXJhdG9yfSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignIG9yICcpICtcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignIGFuZCAnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnREeW5hbWljRmlsdGVyKFxuICAgICAgICBkeW5hbWljRmlsdGVyPzogRHluYW1pY0ZpbHRlcltdXG4gICAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCFkeW5hbWljRmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkeW5hbWljRmlsdGVyXG4gICAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gZmlsdGVyLnZhbHVlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWx0ZXIuZmllbGQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVyYXRvciA9IGZpbHRlci5vcGVyYXRvcjtcblxuICAgICAgICAgICAgICAgIGlmICghKHZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgICAgICAgICAodmFsdWVzIGFzIHVua25vd25bXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBFbnVtTG9naWNhbE9wZXJhdG9yLkNvbnRhaW5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgY29udGFpbmluZyhsb3dlcigke2ZpZWxkfSksIGxvd2VyKCcke1N0cmluZyh2YWx1ZSl9JykpYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVyYXRvciA9PT0gRW51bUxvZ2ljYWxPcGVyYXRvci5Jc05vdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPT09IEVudW1Mb2dpY2FsT3BlcmF0b3IuSXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZmllbGR9ICR7b3BlcmF0b3J9IG51bGxgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtmaWVsZH0gJHtvcGVyYXRvcn0gJyR7U3RyaW5nKHZhbHVlKX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignIG9yICcpICtcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignIGFuZCAnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW91bnRGaWx0ZXJRdWVyeShcbiAgICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgbG9va3VwRmllbGRzOiBEeW5hbWljVHlwZVtdLFxuICAgICAgICBkZWZhdWx0RmlsdGVyPzogRGVmYXVsdEZpbHRlcltdLFxuICAgICAgICBkeW5hbWljRmlsdGVyPzogRHluYW1pY0ZpbHRlcltdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGZpbHRlclF1ZXJ5OiBzdHJpbmc7XG5cbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5ID0gbG9va3VwRmllbGRzXG4gICAgICAgICAgICAgICAgLm1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYChjb250YWluaW5nKGxvd2VyKCR7ZmllbGQubmFtZX0pLCBsb3dlcignJHt2YWx1ZX0nKSkpYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZFZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoJHtmaWVsZC5uYW1lfSBlcSAnJHtzYW5pdGl6ZWRWYWx1ZX0nKWA7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VudERhdGVGaWx0ZXIoZmllbGQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgKCR7ZmllbGQubmFtZX0gZXEgJyR7dmFsdWV9JylgO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiAhIWZpbHRlcilcbiAgICAgICAgICAgICAgICAuam9pbignIG9yICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkgPSBsb29rdXBGaWVsZHNcbiAgICAgICAgICAgICAgICAubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgKGNvbnRhaW5pbmcobG93ZXIoJHtmaWVsZC5uYW1lfSksIGxvd2VyKCcke3ZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJycpLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKX0nKSkpYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1vdW50RGF0ZUZpbHRlcihmaWVsZCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+ICEhZmlsdGVyKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgb3IgJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyUXVlcnkgPSB0aGlzLm1vdW50RGVmYXVsdEZpbHRlcihkZWZhdWx0RmlsdGVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2VtIG5lbmh1bSBjYW1wbyBjb25zdWx0w6F2ZWwgcGFyYSBvIHRleHRvIGRpZ2l0YWRvIG8gZmlsdHJvIGRvIHRleHRvXG4gICAgICAgICAqIMOpIG9taXRpZG86IHVtIGdydXBvIHZhemlvIChgKClgKSDDqSByZWplaXRhZG8gcGVsbyBiYWNrZW5kIGNvbSA1MDAuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZGVmYXVsdEZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeSA9IGZpbHRlclF1ZXJ5XG4gICAgICAgICAgICAgICAgPyBgKCgke2RlZmF1bHRGaWx0ZXJRdWVyeX0pIGFuZCAoJHtmaWx0ZXJRdWVyeX0pKWBcbiAgICAgICAgICAgICAgICA6IGAoJHtkZWZhdWx0RmlsdGVyUXVlcnl9KWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeSA9IGZpbHRlclF1ZXJ5ID8gJygnICsgZmlsdGVyUXVlcnkgKyAnKScgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXJRdWVyeSA9IHRoaXMubW91bnREeW5hbWljRmlsdGVyKGR5bmFtaWNGaWx0ZXIpO1xuXG4gICAgICAgIGlmIChkeW5hbWljRmlsdGVyUXVlcnkpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5ID0gZmlsdGVyUXVlcnlcbiAgICAgICAgICAgICAgICA/IGAoKCR7ZHluYW1pY0ZpbHRlclF1ZXJ5fSkgYW5kICgke2ZpbHRlclF1ZXJ5fSkpYFxuICAgICAgICAgICAgICAgIDogYCgke2R5bmFtaWNGaWx0ZXJRdWVyeX0pYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5ID0gZmlsdGVyUXVlcnkgPyAnKCcgKyBmaWx0ZXJRdWVyeSArICcpJyA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlclF1ZXJ5O1xuICAgIH1cblxuICAgIHB1YmxpYyBtb3VudEVudW1GaWx0ZXIoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBtdWx0aXBsZT86IGJvb2xlYW5cbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbXVsdGlwbGVcbiAgICAgICAgICAgID8gYCgkeyh2YWx1ZSBhcyBzdHJpbmdbXSkubWFwKChzZWxlY3RlZDogc3RyaW5nKSA9PiBgJHtuYW1lfSBlcSAnJHtzZWxlY3RlZH0nYCkuam9pbignIG9yICcpfSlgXG4gICAgICAgICAgICA6IGAoJHtuYW1lfSBlcSAnJHt2YWx1ZX0nKWA7XG4gICAgfVxuICAgIC8qKiBNw6l0b2RvIHJlc3BvbnPDoXZlbCBwb3IgbW9udGFyIGFzIG9ww6fDtWVzIHBhZHLDtWVzIHBhcmEgbyBsb29rdXAgZG8gRHluYW1pYyBGb3JtICovXG4gICAgcHVibGljIG1vdW50T3B0aW9ucyhvcHRpb25zPzogTG9va3VwT3B0aW9ucyk6IExvb2t1cEZpZWxkQ29uZmlnIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gb3B0aW9ucz8ucHJlZml4XG4gICAgICAgICAgICA/IG9wdGlvbnMucHJlZml4XG4gICAgICAgICAgICA6IG9wdGlvbnM/LmRvbWFpbiAmJiBvcHRpb25zPy5zZXJ2aWNlXG4gICAgICAgICAgICAgID8gYCR7b3B0aW9ucy5kb21haW59LiR7b3B0aW9ucy5zZXJ2aWNlfWBcbiAgICAgICAgICAgICAgOiBgJHt0aGlzLmRvbWFpbn0uJHt0aGlzLnNlcnZpY2V9YDtcblxuICAgICAgICBjb25zdCBzdWZmaXggPSBvcHRpb25zPy5zdWZmaXggPyBgXyR7b3B0aW9ucy5zdWZmaXh9YCA6ICcnO1xuXG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbG9va3VwRmllbGRzOiBvcHRpb25zPy5sb29rdXBGaWVsZHNcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMubG9va3VwRmllbGRzXG4gICAgICAgICAgICAgICAgOiB0aGlzLmxvb2t1cEZpZWxkcyxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogb3B0aW9ucz8uZm9ybUdyb3VwID8/IHRoaXMuZW50aXR5LFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgYCR7cHJlZml4fS5sb29rdXBfJHt0aGlzLnRvU25ha2VDYXNlKG9wdGlvbnM/LmVudGl0eSkgfHwgdGhpcy50b1NuYWtlQ2FzZSh0aGlzLmVudGl0eSl9JHtzdWZmaXh9YFxuICAgICAgICAgICAgKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzZWFyY2hUaXRsZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICBgJHtwcmVmaXh9Lmxvb2t1cF8ke1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU25ha2VDYXNlKG9wdGlvbnM/LmVudGl0eSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1NuYWtlQ2FzZSh0aGlzLmVudGl0eSlcbiAgICAgICAgICAgICAgICB9X3NlYXJjaF90aXRsZWBcbiAgICAgICAgICAgICkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICAgICAgICBtdWx0aXBsZTogb3B0aW9ucz8ubXVsdGlwbGUgIT09IGZhbHNlLFxuICAgICAgICAgICAgZGF0YUtleTogb3B0aW9ucz8uZGF0YUtleSA/PyAnaWQnLFxuICAgICAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkOiAnbGFiZWwnLFxuICAgICAgICAgICAgc2VhcmNoRW1wdHlUaXRsZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtwcmVmaXh9Lm5vdGhpbmdfZm91bmRgKSxcbiAgICAgICAgICAgIGZpbHRlckxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3ByZWZpeH0uZmlsdGVyYCksXG4gICAgICAgICAgICBjbGVhckxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3ByZWZpeH0uY2xlYXJgKSxcbiAgICAgICAgICAgIGNhbmNlbExhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3ByZWZpeH0uY2FuY2VsYCksXG4gICAgICAgICAgICBzZWxlY3RMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtwcmVmaXh9LnNlbGVjdGApLFxuICAgICAgICAgICAgc2VhcmNoRmllbGRzOiB0aGlzLm1vdW50Rm9ybUZpZWxkKFxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnNlYXJjaEZpZWxkcyA/PyB0aGlzLnNlYXJjaEZpZWxkcyxcbiAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzZWFyY2hHcmlkRmllbGRzOiB0aGlzLm1vdW50Rm9ybUZpZWxkKFxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnNlYXJjaEdyaWRGaWVsZHMgPz8gdGhpcy5zZWFyY2hHcmlkRmllbGRzLFxuICAgICAgICAgICAgICAgIHByZWZpeFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zT2JzZXJ2YWJsZTpcbiAgICAgICAgICAgICAgICB0aGlzLmxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZS5hc09ic2VydmFibGUoKSxcbiAgICAgICAgICAgIHNlYXJjaE9ic2VydmFibGU6IHRoaXMubG9va3VwU2VhcmNoT2JzZXJ2YWJsZS5hc09ic2VydmFibGUoKSxcbiAgICAgICAgICAgIG9uTG9va3VwUmVxdWVzdDogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5vbkxvb2t1cFJlcXVlc3QodmFsdWUsIHByZWZpeCwgb3B0aW9ucyksXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgb25TZWFyY2hSZXF1ZXN0OiAoZXZlbnQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuICAgICAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0KGV2ZW50LCBwcmVmaXgsIG9wdGlvbnMpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQcm9wKFxuICAgICAgICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgIHByZWZpeDogc3RyaW5nXG4gICAgKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiBwYXRoXG4gICAgICAgICAgICAuc3BsaXQoJy4nKVxuICAgICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgICAgICAocmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcHJvcDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPT09IHVuZGVmaW5lZCB8fCByZXN1bHRbcHJvcF0gPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtwcmVmaXh9LmVtcHR5X2xhYmVsYClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKHJlc3VsdFtwcm9wXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgICAgICAgICAgICAgb2JqXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNWYWx1ZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBtb3VudEVudGl0eUZpbHRlcihlbnRpdHk6IEVudGl0eURlcGVuZGVuY3ksIHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZW50aXR5LmZpZWxkXG4gICAgICAgICAgICA/IGAoJHtlbnRpdHkubmFtZX0uJHtlbnRpdHkuZmllbGR9IGVxICcke3ZhbHVlW2VudGl0eS5maWVsZF19JylgXG4gICAgICAgICAgICA6IGAoJHtlbnRpdHkubmFtZX0gZXEgJyR7dmFsdWVbZW50aXR5Lm5hbWVdfScpYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Mb29rdXBSZXF1ZXN0KFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBwcmVmaXg6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IExvb2t1cE9wdGlvbnNcbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbG9va3VwRmllbGRzID0gb3B0aW9ucz8ubG9va3VwRmllbGRzID8/IHRoaXMubG9va3VwRmllbGRzO1xuICAgICAgICBjb25zdCBsb29rdXBEaXNwbGF5RmllbGRzID0gbG9va3VwRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLm5hbWUpO1xuXG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IHRoaXMubW91bnRGaWx0ZXJRdWVyeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbG9va3VwRmllbGRzIGFzIER5bmFtaWNUeXBlW10sXG4gICAgICAgICAgICBvcHRpb25zPy5kZWZhdWx0RmlsdGVyLFxuICAgICAgICAgICAgb3B0aW9ucz8uZHluYW1pY0ZpbHRlclxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBkaXNwbGF5RmllbGRzID0gbG9va3VwRGlzcGxheUZpZWxkcy5jb25jYXQoXG4gICAgICAgICAgICAob3B0aW9ucz8uc2VhcmNoR3JpZEZpZWxkcyA/PyB0aGlzLnNlYXJjaEdyaWRGaWVsZHMpLm1hcChcbiAgICAgICAgICAgICAgICAoeyBuYW1lIH0pID0+IG5hbWVcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAob3B0aW9ucz8ucXVlcnlGaWVsZHMpIHtcbiAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMgPSBkaXNwbGF5RmllbGRzLmNvbmNhdChvcHRpb25zLnF1ZXJ5RmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BsYXlGaWVsZHMgPSBkaXNwbGF5RmllbGRzLmZpbHRlcihcbiAgICAgICAgICAgICh2LCBpKSA9PiBkaXNwbGF5RmllbGRzLmluZGV4T2YodikgPT09IGlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAob3B0aW9ucz8uZW50aXR5RGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5RmlsdGVyID0gb3B0aW9ucy5lbnRpdHlEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgLm1hcCgoZW50aXR5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZW50aXR5LnZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCgke25ld1ZhbHVlLm1hcCgodmFsOiBhbnkpID0+IHRoaXMubW91bnRFbnRpdHlGaWx0ZXIoZW50aXR5LCB2YWwpKS5qb2luKCcgb3IgJyl9KWA7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCgke3RoaXMubW91bnRFbnRpdHlGaWx0ZXIoZW50aXR5LCBuZXdWYWx1ZSl9KWA7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+ICEhZmlsdGVyKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgYW5kICcpO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5RmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyUXVlcnlcbiAgICAgICAgICAgICAgICAgICAgPyAoZmlsdGVyUXVlcnkgKz0gYCBhbmQgKCR7ZW50aXR5RmlsdGVyfSlgKVxuICAgICAgICAgICAgICAgICAgICA6IChmaWx0ZXJRdWVyeSA9IGVudGl0eUZpbHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvb2t1cFNlcnZpY2VcbiAgICAgICAgICAgIC5saXN0KFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydDogb3B0aW9ucz8ubG9va3VwU29ydCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zPy5lbnRpdHkgPz8gdGhpcy5lbnRpdHksXG4gICAgICAgICAgICAgICAgb3B0aW9ucz8uZG9tYWluID8/IHRoaXMuZG9tYWluLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnNlcnZpY2UgPz8gdGhpcy5zZXJ2aWNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICBsaXN0LmNvbnRlbnRzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmdldEl0ZW1MYWJlbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNlYXJjaFJlcXVlc3QoXG4gICAgICAgIGV2ZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcHJlZml4OiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM6IExvb2t1cE9wdGlvbnMgPSB7fVxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IChmaXJzdCBhcyBudW1iZXIpIC8gKHJvd3MgYXMgbnVtYmVyKTtcbiAgICAgICAgY29uc3Qgc29ydCA9XG4gICAgICAgICAgICAobXVsdGlTb3J0TWV0YSBhcyBTb3J0TWV0YVtdIHwgdW5kZWZpbmVkKSA/PyBvcHRpb25zLnNlYXJjaFNvcnQ7XG4gICAgICAgIGNvbnN0IGxvb2t1cEZpZWxkcyA9IG9wdGlvbnMubG9va3VwRmllbGRzID8/IHRoaXMubG9va3VwRmllbGRzO1xuICAgICAgICBjb25zdCBsb29rdXBEaXNwbGF5RmllbGRzID0gbG9va3VwRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLm5hbWUpO1xuXG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IChvcHRpb25zLnNlYXJjaEZpZWxkcyA/PyB0aGlzLnNlYXJjaEZpZWxkcylcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHsgbmFtZSB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAoZmlsdGVyRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV0gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVdICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChmaWx0ZXJEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtuYW1lXSAhPT0gJydcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGZvcm1GaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgbXVsdGlwbGUsIGVycExvb2t1cHNGb3JtRmllbGQgfSA9XG4gICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZCBhcyBFcnBMb29rdXBzRm9ybUZpZWxkO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoZmlsdGVyRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJwTG9va3Vwc0Zvcm1GaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VudEN1c3RvbUZpbHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnBMb29rdXBzU2VhcmNoRmllbGQ6IGZvcm1GaWVsZCBhcyBFcnBMb29rdXBzRm9ybUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGF0YTogZmlsdGVyRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWV9IGVxICR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlIGFzIHN0cmluZykuZm9ybWF0KCdZWVlZLU1NLUREJyl9J2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSBhcyBzdHJpbmcpLmZvcm1hdCgnSEg6bW06c3MnKX0nYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdkYXRlVGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSBhcyBzdHJpbmcpLmZvcm1hdCgpfSdgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1vdW50RW51bUZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYChjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZX0nKSkpYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgKCR7bmFtZX0gZXEgJyR7KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsnaWQnXX0nKWA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcgYW5kICcpO1xuICAgICAgICBpZiAob3B0aW9ucy5lbnRpdHlEZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHlGaWx0ZXIgPSBvcHRpb25zLmVudGl0eURlcGVuZGVuY3lcbiAgICAgICAgICAgICAgICAubWFwKChlbnRpdHk6IEVudGl0eURlcGVuZGVuY3kpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbnRpdHkudmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAoJHt2YWx1ZS5tYXAoKHZhbDogYW55KSA9PiB0aGlzLm1vdW50RW50aXR5RmlsdGVyKGVudGl0eSwgdmFsKSkuam9pbignIG9yICcpfSlgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgKCR7dGhpcy5tb3VudEVudGl0eUZpbHRlcihlbnRpdHksIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KX0pYDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gISFmaWx0ZXIpXG4gICAgICAgICAgICAgICAgLmpvaW4oJyBhbmQgJyk7XG4gICAgICAgICAgICBpZiAoZW50aXR5RmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyUXVlcnlcbiAgICAgICAgICAgICAgICAgICAgPyAoZmlsdGVyUXVlcnkgKz0gYCBhbmQgKCR7ZW50aXR5RmlsdGVyfSlgKVxuICAgICAgICAgICAgICAgICAgICA6IChmaWx0ZXJRdWVyeSA9IGVudGl0eUZpbHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlclF1ZXJ5ID0gdGhpcy5tb3VudERlZmF1bHRGaWx0ZXIoXG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRGaWx0ZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGVmYXVsdEZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeVxuICAgICAgICAgICAgICAgID8gKGZpbHRlclF1ZXJ5ICs9IGAgYW5kICgke2RlZmF1bHRGaWx0ZXJRdWVyeX0pYClcbiAgICAgICAgICAgICAgICA6IChmaWx0ZXJRdWVyeSA9IGAoJHtkZWZhdWx0RmlsdGVyUXVlcnl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHluYW1pY0ZpbHRlclF1ZXJ5ID0gdGhpcy5tb3VudER5bmFtaWNGaWx0ZXIoXG4gICAgICAgICAgICBvcHRpb25zLmR5bmFtaWNGaWx0ZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZHluYW1pY0ZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeVxuICAgICAgICAgICAgICAgID8gKGZpbHRlclF1ZXJ5ICs9IGAgYW5kICgke2R5bmFtaWNGaWx0ZXJRdWVyeX0pYClcbiAgICAgICAgICAgICAgICA6IChmaWx0ZXJRdWVyeSA9IGAoJHtkeW5hbWljRmlsdGVyUXVlcnl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRpc3BsYXlGaWVsZHMgPSBsb29rdXBEaXNwbGF5RmllbGRzLmNvbmNhdChcbiAgICAgICAgICAgIChvcHRpb25zLnNlYXJjaEdyaWRGaWVsZHMgPz8gdGhpcy5zZWFyY2hHcmlkRmllbGRzKVxuICAgICAgICAgICAgICAgIC5jb25jYXQob3B0aW9ucy5zZWFyY2hHcmlkRmllbGRzID8/IFtdKVxuICAgICAgICAgICAgICAgIC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSA/PyBbXVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnF1ZXJ5RmllbGRzKSB7XG4gICAgICAgICAgICBkaXNwbGF5RmllbGRzID0gZGlzcGxheUZpZWxkcy5jb25jYXQob3B0aW9ucy5xdWVyeUZpZWxkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwbGF5RmllbGRzID0gZGlzcGxheUZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAodiwgaSkgPT4gZGlzcGxheUZpZWxkcy5pbmRleE9mKHYpID09PSBpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sb29rdXBTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdChcbiAgICAgICAgICAgICAgICB7IHBhZ2UsIHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5lbnRpdHkgPz8gdGhpcy5lbnRpdHksXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kb21haW4gPz8gdGhpcy5kb21haW4sXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXJ2aWNlID8/IHRoaXMuc2VydmljZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmlhciB1bSBtYXBhIGRlIGNhbXBvcyBjb20gbWF4TGVuZ3RoIGRlZmluaWRvXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkc1dpdGhNYXhMZW5ndGggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLnNlYXJjaEZpZWxkcyA/PyB0aGlzLnNlYXJjaEZpZWxkcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5zZWFyY2hHcmlkRmllbGRzID8/IHRoaXMuc2VhcmNoR3JpZEZpZWxkcyksXG4gICAgICAgICAgICAgICAgICAgIF0uZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heExlbmd0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heExlbmd0aCcgaW4gZmllbGQgPyBmaWVsZC5tYXhMZW5ndGggOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICd0ZXh0QXJlYScpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNXaXRoTWF4TGVuZ3RoLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoIGFzIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YTogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZEl0ZW0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcGxpY2FyIG1heExlbmd0aCBub3MgY2FtcG9zIHF1ZSBwb3NzdWVtIGEgY29uZmlndXJhw6fDo29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNXaXRoTWF4TGVuZ3RoLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhMZW5ndGgsIGZpZWxkTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE5lc3RlZFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUuc3Vic3RyaW5nKDAsIG1heExlbmd0aCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnByb2Nlc3NlZEl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmdldEl0ZW1MYWJlbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZWNvcmRzOiBsaXN0LnRvdGFsRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvb2t1cFNlYXJjaE9ic2VydmFibGUubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtTGFiZWwoXG4gICAgICAgIGl0ZW06IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBwcmVmaXg6IHN0cmluZyxcbiAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkczogc3RyaW5nW11cbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgLm1hcCgoZmllbGQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCcuJykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQsIHByZWZpeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1bZmllbGRdID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7cHJlZml4fS5lbXB0eV9sYWJlbGApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignIC0gJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdHJvIGRlIHVtIGNhbXBvIGRlIGRhdGEgYSBwYXJ0aXIgZG8gdGV4dG8gZGlnaXRhZG8gbm8gYXV0b2NvbXBsZXRlLlxuICAgICAqXG4gICAgICogQ2FtcG8gZGUgZGF0YSBuw6NvIGFjZWl0YSBgY29udGFpbmluZ2AsIGVudMOjbyBvIHRleHRvIHPDsyB2aXJhIGZpbHRyb1xuICAgICAqIHF1YW5kbyDDqSB1bWEgZGF0YSB2w6FsaWRhIG5vIGZvcm1hdG8gZG8gcHLDs3ByaW8gY2FtcG86IGB2aWV3OiAnbW9udGgnYFxuICAgICAqIGzDqiBtw6pzL2FubyBlIGNvbnN1bHRhIG8gbcOqcyBpbnRlaXJvOyBub3MgZGVtYWlzIGNhc29zIGzDqiBhIGRhdGFcbiAgICAgKiBjb21wbGV0YSBlIGNvbnN1bHRhIG8gZGlhLiBUZXh0byBxdWUgbsOjbyDDqSBkYXRhIGRldm9sdmUgYG51bGxgIGUgb1xuICAgICAqIGNhbXBvIGZpY2EgZGUgZm9yYSBkbyBmaWx0cm8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBtb3VudERhdGVGaWx0ZXIoZmllbGQ6IER5bmFtaWNUeXBlLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGlzTW9udGhWaWV3ID0gKGZpZWxkIGFzIENhbGVuZGFyRmllbGRDb25maWcpLnZpZXcgPT09ICdtb250aCc7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBtb21lbnQoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHRoaXMuZGF0ZUZpbHRlckZvcm1hdHMoZmllbGQsIGlzTW9udGhWaWV3KSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXBhcnNlZFZhbHVlLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb250aFZpZXcpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gcGFyc2VkVmFsdWVcbiAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgIC5zdGFydE9mKCdtb250aCcpXG4gICAgICAgICAgICAgICAgLmZvcm1hdChRVUVSWV9EQVRFX0ZPUk1BVCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3REYXkgPSBwYXJzZWRWYWx1ZVxuICAgICAgICAgICAgICAgIC5jbG9uZSgpXG4gICAgICAgICAgICAgICAgLmVuZE9mKCdtb250aCcpXG4gICAgICAgICAgICAgICAgLmZvcm1hdChRVUVSWV9EQVRFX0ZPUk1BVCk7XG5cbiAgICAgICAgICAgIHJldHVybiBgKCR7ZmllbGQubmFtZX0gZ2UgJyR7Zmlyc3REYXl9JyBhbmQgJHtmaWVsZC5uYW1lfSBsZSAnJHtsYXN0RGF5fScpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgKCR7ZmllbGQubmFtZX0gZXEgJyR7cGFyc2VkVmFsdWUuZm9ybWF0KFFVRVJZX0RBVEVfRk9STUFUKX0nKWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0b3MgZW0gcXVlIG8gdGV4dG8gZGlnaXRhZG8gZW0gdW0gY2FtcG8gZGUgZGF0YSDDqSBpbnRlcnByZXRhZG8uXG4gICAgICpcbiAgICAgKiBBIG9yZGVtIGRvcyBjb21wb25lbnRlcyBlIG8gc2VwYXJhZG9yIHbDqm0gZG8gbG9jYWxlIGRvIHVzdcOhcmlvIOKAlCBvXG4gICAgICogYExvY2FsZVNlcnZpY2VgIGRhIHBsYXRhZm9ybWEgYXBsaWNhIGVzc2UgbG9jYWxlIG5vIG1vbWVudCwgZW50w6NvXG4gICAgICogYHB0LUJSYCBsw6ogYGRkL21tL2FhYWFgIGUgYGVuLVVTYCBsw6ogYG1tL2RkL2FhYWFgLiBRdWFuZG8gbyBjYW1wb1xuICAgICAqIGRlZmluZSBvIHByw7NwcmlvIGZvcm1hdG8gZGUgZXhpYmnDp8OjbywgZWxlIHRlbSBwcmlvcmlkYWRlOiDDqSBvIGZvcm1hdG9cbiAgICAgKiBxdWUgbyB1c3XDoXJpbyB2w6ogbm8gaW5wdXQg4oCUIGBkYXRlRm9ybWF0YCBubyBkaWFsZXRvIG5hdGl2byBkb1xuICAgICAqIGBzLWRhdGVwaWNrZXJgLCBvdSBgY2FsZW5kYXJMb2NhbGVPcHRpb25zLmRhdGVGb3JtYXRgIChkZXByZWNhdGVkKSBub1xuICAgICAqIGRpYWxldG8gbGVnYWRvIGRvIFByaW1lTkcuIENhZGEgZm9ybWF0byB0YW1iw6ltIMOpIGFjZWl0byBzZW0gbyB6ZXJvIMOgXG4gICAgICogZXNxdWVyZGEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBkYXRlRmlsdGVyRm9ybWF0cyhcbiAgICAgICAgZmllbGQ6IER5bmFtaWNUeXBlLFxuICAgICAgICBpc01vbnRoVmlldzogYm9vbGVhblxuICAgICk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgeyBkYXRlRm9ybWF0LCBjYWxlbmRhckxvY2FsZU9wdGlvbnMgfSA9XG4gICAgICAgICAgICBmaWVsZCBhcyBDYWxlbmRhckZpZWxkQ29uZmlnO1xuXG4gICAgICAgIGNvbnN0IGZpZWxkRm9ybWF0ID0gZGF0ZUZvcm1hdFxuICAgICAgICAgICAgPyB0aGlzLmZyb21EYXRlcGlja2VyRGF0ZUZvcm1hdChkYXRlRm9ybWF0KVxuICAgICAgICAgICAgOiB0aGlzLmZyb21MZWdhY3lDYWxlbmRhckRhdGVGb3JtYXQoXG4gICAgICAgICAgICAgICAgICBjYWxlbmRhckxvY2FsZU9wdGlvbnM/LmRhdGVGb3JtYXRcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBsb2NhbGVGb3JtYXQgPSBtb21lbnQubG9jYWxlRGF0YSgpLmxvbmdEYXRlRm9ybWF0KCdMJyk7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0ID1cbiAgICAgICAgICAgIGZpZWxkRm9ybWF0ID8/XG4gICAgICAgICAgICAoaXNNb250aFZpZXcgPyB0aGlzLndpdGhvdXREYXlUb2tlbihsb2NhbGVGb3JtYXQpIDogbG9jYWxlRm9ybWF0KTtcblxuICAgICAgICBjb25zdCBzaG9ydEZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9EKy9nLCAnRCcpLnJlcGxhY2UoL00rL2csICdNJyk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdCA9PT0gc2hvcnRGb3JtYXQgPyBbZm9ybWF0XSA6IFtmb3JtYXQsIHNob3J0Rm9ybWF0XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0ZSBvIGBkYXRlRm9ybWF0YCBuYXRpdm8gZG8gYHMtZGF0ZXBpY2tlcmAgKGV4LjogYGRkL01NL3l5eXlgKVxuICAgICAqIHBhcmEgbyBlcXVpdmFsZW50ZSBlbSBtb21lbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmcm9tRGF0ZXBpY2tlckRhdGVGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoXG4gICAgICAgICAgICAveXl5eXx5eXxNTXxtbXxkZHxkL2csXG4gICAgICAgICAgICAodG9rZW4pID0+IERBVEVQSUNLRVJfREFURV9UT0tFTlNbdG9rZW5dXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydGUgbyBgY2FsZW5kYXJMb2NhbGVPcHRpb25zLmRhdGVGb3JtYXRgIGxlZ2FkbyAoZGlhbGV0byBQcmltZU5HLFxuICAgICAqIGV4LjogYGRkL21tL3l5YCkgcGFyYSBvIGVxdWl2YWxlbnRlIGVtIG1vbWVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZyb21MZWdhY3lDYWxlbmRhckRhdGVGb3JtYXQoZm9ybWF0Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoXG4gICAgICAgICAgICAvZGR8ZHxtbXxtfHl5fHkvZyxcbiAgICAgICAgICAgICh0b2tlbikgPT4gTEVHQUNZX0NBTEVOREFSX0RBVEVfVE9LRU5TW3Rva2VuXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBSZW1vdmUgbyBjb21wb25lbnRlIGRlIGRpYSBkZSB1bSBmb3JtYXRvIGRlIGRhdGEgKi9cbiAgICBwcml2YXRlIHdpdGhvdXREYXlUb2tlbihmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IGZvcm1hdC5yZXBsYWNlKC9bQS1aYS16XS9nLCAnJylbMF0gPz8gJy8nO1xuXG4gICAgICAgIHJldHVybiBmb3JtYXRcbiAgICAgICAgICAgIC5zcGxpdCgvW15BLVphLXpdLylcbiAgICAgICAgICAgIC5maWx0ZXIoKHRva2VuKSA9PiAhL15EKyQvLnRlc3QodG9rZW4pKVxuICAgICAgICAgICAgLmpvaW4oc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdW50Q3VzdG9tRmlsdGVyKHtcbiAgICAgICAgZXJwTG9va3Vwc1NlYXJjaEZpZWxkLFxuICAgICAgICBmaWx0ZXJEYXRhLFxuICAgIH06IHtcbiAgICAgICAgZXJwTG9va3Vwc1NlYXJjaEZpZWxkOiBFcnBMb29rdXBzRm9ybUZpZWxkO1xuICAgICAgICBmaWx0ZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyBlcnBMb29rdXBzRm9ybUZpZWxkLCBuYW1lIH0gPSBlcnBMb29rdXBzU2VhcmNoRmllbGQ7XG5cbiAgICAgICAgcmV0dXJuIGAoJHsoZXJwTG9va3Vwc0Zvcm1GaWVsZD8uY3VzdG9tRmlsdGVycyA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAoKHsgb3BlcmF0b3IsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyRGF0YVtuYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBFbnVtTG9naWNhbE9wZXJhdG9yLkNvbnRhaW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgKGNvbnRhaW5pbmcobG93ZXIoJHtuYW1lfSksIGxvd2VyKCcke3ZhbHVlfScpKSlgO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yID09PSBFbnVtTG9naWNhbE9wZXJhdG9yLklzTm90IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gRW51bUxvZ2ljYWxPcGVyYXRvci5JcykgJiZcbiAgICAgICAgICAgICAgICAgICAgIXZhbHVlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgKCR7bmFtZX0gJHtvcGVyYXRvcn0gbnVsbClgO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBgKCR7bmFtZX0gJHtvcGVyYXRvcn0gJyR7dmFsdWV9JylgO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcgYW5kICcpfSlgO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmVzdGVkVmFsdWUoXG4gICAgICAgIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIHBhdGg6IHN0cmluZ1xuICAgICk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgoY3VycmVudDogdW5rbm93biwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPYmogPSBjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50T2JqW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnRPYmpba2V5XVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sIG9iaiBhcyB1bmtub3duKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE5lc3RlZFZhbHVlKFxuICAgICAgICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiB1bmtub3duXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBrZXlzLnJlZHVjZSgoY3VycmVudDogdW5rbm93biwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPYmogPSBjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50T2JqW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnRPYmpba2V5XVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sIG9iaiBhcyB1bmtub3duKTtcbiAgICAgICAgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JyAmJiBsYXN0S2V5KSB7XG4gICAgICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtsYXN0S2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|